diff --git a/pom.xml b/pom.xml index d056808..4ef9c4e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 loper InnaIrcBot - 0.3-SNAPSHOT + 0.4-SNAPSHOT jar InnaIrcBot @@ -24,6 +24,12 @@ 2.8.5 compile + + org.mongodb + mongodb-driver-sync + 3.9.1 + compile + diff --git a/src/main/java/InnaIrcBot/BotStart.java b/src/main/java/InnaIrcBot/BotStart.java index 26ebf64..8f9bcb7 100644 --- a/src/main/java/InnaIrcBot/BotStart.java +++ b/src/main/java/InnaIrcBot/BotStart.java @@ -11,6 +11,7 @@ public class BotStart { //TODO: flood control //TODO: setDaemon(true) //TODO: multiple connections to one server not allowed + // TODO switch to zero-worker in case of inconsistent state of Worker public static void main(String[] args){ if (args.length != 0) { diff --git a/src/main/java/InnaIrcBot/Commanders/PrivateMsgCommander.java b/src/main/java/InnaIrcBot/Commanders/PrivateMsgCommander.java index fa650e6..137f643 100644 --- a/src/main/java/InnaIrcBot/Commanders/PrivateMsgCommander.java +++ b/src/main/java/InnaIrcBot/Commanders/PrivateMsgCommander.java @@ -290,7 +290,7 @@ public class PrivateMsgCommander { // T } } private void kickban(String chanel, String user, String reason){ - cmode(chanel, "+b", simplifyNick(user)+"*!*@*"); + ban(chanel, user); kick(chanel, user, reason); } private void voice(String chanel, String user){ diff --git a/src/main/java/InnaIrcBot/GlobalData.java b/src/main/java/InnaIrcBot/GlobalData.java index 4de2d8a..55f9691 100644 --- a/src/main/java/InnaIrcBot/GlobalData.java +++ b/src/main/java/InnaIrcBot/GlobalData.java @@ -1,7 +1,7 @@ package InnaIrcBot; public class GlobalData { - private static final String version = "InnaIrcBot v0.3 \"Карелия\""; + private static final String version = "InnaIrcBot v0.4 \"Карские Ворота\""; public static synchronized String getAppVersion(){ return version; } diff --git a/src/main/java/InnaIrcBot/LogDriver/BotDriver.java b/src/main/java/InnaIrcBot/LogDriver/BotDriver.java index faedb96..cc272a1 100644 --- a/src/main/java/InnaIrcBot/LogDriver/BotDriver.java +++ b/src/main/java/InnaIrcBot/LogDriver/BotDriver.java @@ -27,6 +27,8 @@ public class BotDriver { return new BotFilesWorker(serverName, serverDriver.get(serverName)[1], chanelName); case "SQLite": return new BotSQLiteWorker(serverName, serverDriver.get(serverName)[1], chanelName); + case "MongoDB": + return new BotMongoWorker(serverName, serverDriver.get(serverName)[1], chanelName); case "Zero": return new BotZeroWorker(); default: diff --git a/src/main/java/InnaIrcBot/LogDriver/BotMongoWorker.java b/src/main/java/InnaIrcBot/LogDriver/BotMongoWorker.java new file mode 100644 index 0000000..f456f94 --- /dev/null +++ b/src/main/java/InnaIrcBot/LogDriver/BotMongoWorker.java @@ -0,0 +1,147 @@ +package InnaIrcBot.LogDriver; + + +import com.mongodb.ConnectionString; +import com.mongodb.MongoClientSettings; +import com.mongodb.MongoTimeoutException; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import com.mongodb.event.*; +import org.bson.Document; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +/** For each IRC server we create one DB that stored in the hashmap ('static', since we may have few configuration that have to work at once) + * For each channel we store collection that have name of the ircServer + chanelName. + * If user decides to use one MongoDB for various servers, he may use even one DB (declared in configuration file) and store collections in there. + * **/ +public class BotMongoWorker implements Worker { + + private static Map serversMap = Collections.synchronizedMap(new HashMap()); + + private String ircServer; + private MongoCollection collection; + private boolean consistent = true; // TODO: clarify possible issues??? + + public BotMongoWorker(String ircServer, String[] driverParameters, String channel){ + if (channel.equals("system")) // Set ircServer variable only if it's 'system' log thread. + this.ircServer = ircServer; + else + this.ircServer = null; + + if (!serversMap.containsKey(ircServer)){ + + MongoClientSettings MCS = MongoClientSettings.builder().addCommandListener(new CommandListener() { + @Override + public void commandStarted(CommandStartedEvent commandStartedEvent) { + System.out.println("commandStarted"); + } + + @Override + public void commandSucceeded(CommandSucceededEvent commandSucceededEvent) { + System.out.println("commandSucceeded"); + } + + @Override + public void commandFailed(CommandFailedEvent commandFailedEvent) { + System.out.println("commandFailed"); + } + }) + .applyConnectionString(new ConnectionString("mongodb://asasa:27017")) + .applyToServerSettings(builder -> builder.addServerListener(new ServerListener() { + @Override + public void serverOpening(ServerOpeningEvent serverOpeningEvent) { + System.out.println("Server Listener: 1 SRV ID: "+serverOpeningEvent.getServerId()); + } + + @Override + public void serverClosed(ServerClosedEvent serverClosedEvent) { + System.out.println("Server Listener: Server has been closed"); + } + + @Override + public void serverDescriptionChanged(ServerDescriptionChangedEvent serverDescriptionChangedEvent) { + System.out.println("Server Listener: Desc Changed: "+serverDescriptionChangedEvent.getNewDescription().getException()); + close(); + } + })) + .build(); + + MongoClient mongoClient = MongoClients.create(MCS); + //MongoClient mongoClient = MongoClients.create("mongodb://asasa:27017"); // TODO: replace with driverParameters[0] - address + serversMap.put(ircServer, mongoClient); + } + + MongoDatabase mongoDB = serversMap.get(ircServer).getDatabase("irc"); // TODO: replace with driverParameters[1] - DB NAME + collection = mongoDB.getCollection(ircServer + channel); + + Document ping = new Document("ping", "1"); + try { + collection.insertOne(ping); + }catch (MongoTimeoutException e) { + System.out.println("Timeout exception"); + consistent = false; + } catch (IllegalStateException ise){ + System.out.println("Illegal state exception: MongoDB server already closed."); + consistent = false; + } + + } + + @Override + public void logAdd(String event, String initiatorArg, String messageArg) { + Document document = new Document("date", getDate()) + .append("event", event) + .append("initiator", initiatorArg); + switch (event) { + case "NICK": + case "JOIN": + document.append("message1", messageArg); + //preparedStatement.setString(5, null); + break; + case "PART": + case "QUIT": + case "TOPIC": + document.append("message1", messageArg.replaceAll("^.+?:", "")); + //preparedStatement.setString(5, null); + break; + case "MODE": + document.append("message1", messageArg.replaceAll("(^(.+?\\s){1})|(\\s.+$)","")); + document.append("message2", messageArg.replaceAll("^(.+?\\s){2}", "")); + break; + case "KICK": + document.append("message1", messageArg.replaceAll("^.+?:", "")); + document.append("message2", messageArg.replaceAll("(^.+?\\s)|(\\s.+$)", "")); + break; + case "PRIVMSG": + document.append("message1", messageArg.replaceAll("^:", "")); + //preparedStatement.setString(5,null); + break; + default: + document.append("message1", messageArg); + //preparedStatement.setString(5,null); + break; + } + collection.insertOne(document); + } + + private long getDate(){ return System.currentTimeMillis() / 1000L; } // UNIX time + + @Override + public boolean isConsistent() { return consistent; } + + @Override + public void close() { + // If ircServer != null then it's system thread and when it's interrupted we have to close connection to DB for used server + // And remove it from HashMap + if (this.ircServer != null && serversMap.containsKey(ircServer)) { + serversMap.get(ircServer).close(); + serversMap.remove(ircServer); + System.out.println("BotMongoWorker->close(): " + ircServer); + } + + } +} diff --git a/src/main/java/InnaIrcBot/LogDriver/BotSQLiteWorker.java b/src/main/java/InnaIrcBot/LogDriver/BotSQLiteWorker.java index a47a955..199e851 100644 --- a/src/main/java/InnaIrcBot/LogDriver/BotSQLiteWorker.java +++ b/src/main/java/InnaIrcBot/LogDriver/BotSQLiteWorker.java @@ -168,15 +168,15 @@ public class BotSQLiteWorker implements Worker { preparedStatement.setString(5, messageArg.replaceAll("^(.+?\\s){2}", "")); break; case "KICK": - preparedStatement.setString(4,messageArg.replaceAll("^.+?:", "")); - preparedStatement.setString(5,messageArg.replaceAll("(^.+?\\s)|(\\s.+$)", "")); + preparedStatement.setString(4, messageArg.replaceAll("^.+?:", "")); + preparedStatement.setString(5, messageArg.replaceAll("(^.+?\\s)|(\\s.+$)", "")); break; case "PRIVMSG": - preparedStatement.setString(4,messageArg.replaceAll("^:", "")); + preparedStatement.setString(4, messageArg.replaceAll("^:", "")); preparedStatement.setString(5,null); break; default: - preparedStatement.setString(4,messageArg); + preparedStatement.setString(4, messageArg); preparedStatement.setString(5,null); break; } diff --git a/src/main/java/InnaIrcBot/ProvidersConsumers/SystemConsumer.java b/src/main/java/InnaIrcBot/ProvidersConsumers/SystemConsumer.java index e452f9b..8609a2d 100644 --- a/src/main/java/InnaIrcBot/ProvidersConsumers/SystemConsumer.java +++ b/src/main/java/InnaIrcBot/ProvidersConsumers/SystemConsumer.java @@ -65,7 +65,7 @@ public class SystemConsumer implements Runnable{ private void setMainRoutine(){ String data; - String dataStrings[]; + String[] dataStrings; try { while ((data = reader.readLine()) != null) { dataStrings = data.split(" ",3); diff --git a/src/main/java/Temporary/DriverTest.java b/src/main/java/Temporary/DriverTest.java index 14b484d..9783ea4 100644 --- a/src/main/java/Temporary/DriverTest.java +++ b/src/main/java/Temporary/DriverTest.java @@ -6,34 +6,46 @@ import InnaIrcBot.LogDriver.Worker; public class DriverTest { public static void main(String[] args){ - if (BotDriver.setLogDriver("irc.tomsk.net", "SQLiteDriver", new String[]{"/tmp/"})) + if (BotDriver.setLogDriver("irc.tomsk.net", "MongoDB", new String[]{"/tmp/"})) System.out.println("Successful driver initiation"); else { System.out.println("Failed driver initiation"); return; } - Worker fw1 = BotDriver.getWorker("irc.tomsk.net","#lpr"); - Worker fw2 = BotDriver.getWorker("irc.tomsk.net","#main"); - Worker fw3 = BotDriver.getWorker("irc.tomsk.net","##loper"); + Worker fw1 = BotDriver.getWorker("irc.tomsk.net","system"); + //Worker fw2 = BotDriver.getWorker("irc.tomsk.net","#main"); + //Worker fw3 = BotDriver.getWorker("irc.tomsk.net","#lpr"); - if ((fw1 !=null) && (fw2 !=null) && (fw3 !=null)){ + //if ((fw1 !=null) && (fw2 !=null) && (fw3 !=null)){ System.out.println("LogFile1: "+fw1.isConsistent()); - System.out.println("LogFile2: "+fw2.isConsistent()); - System.out.println("LogFile3: "+fw3.isConsistent()); - + //System.out.println("LogFile2: "+fw2.isConsistent()); + //System.out.println("LogFile3: "+fw3.isConsistent()); +/* fw1.logAdd("JOIN", "de_su!loper@desktop.lan", "message1"); + fw1.logAdd("PRIVMSG", "de_su!loper@desktop.lan", ": some text here"); + fw1.logAdd("PRIVMSG", "de_su!loper@desktop.lan", ": more random tests"); + fw1.logAdd("NICK", "de_su!loper@desktop.lan", "developer_su"); + fw1.logAdd("MODE", "de_su!loper@desktop.lan", "+b username"); fw1.logAdd("PART", "de_su!loper@desktop.lan", "#chan1"); fw2.logAdd("JOIN", "de_su!loper@desktop.lan", "message2"); + fw2.logAdd("PRIVMSG", "de_su!loper@desktop.lan", ": some text here"); + fw2.logAdd("PRIVMSG", "de_su!loper@desktop.lan", ": more random tests"); + fw2.logAdd("NICK", "de_su!loper@desktop.lan", "developer_su"); + fw2.logAdd("MODE", "de_su!loper@desktop.lan", "+b username"); fw2.logAdd("PART", "de_su!loper@desktop.lan", "#chan2"); fw3.logAdd("JOIN", "de_su!loper@desktop.lan", "message3"); + fw3.logAdd("PRIVMSG", "de_su!loper@desktop.lan", ": some text here"); + fw3.logAdd("PRIVMSG", "de_su!loper@desktop.lan", ": more random tests"); + fw3.logAdd("NICK", "de_su!loper@desktop.lan", "developer_su"); + fw3.logAdd("MODE", "de_su!loper@desktop.lan", "+b username"); fw3.logAdd("PART", "de_su!loper@desktop.lan", "#chan3"); - +*/ fw1.close(); - fw2.close(); - fw3.close(); - } + //fw2.close(); + //fw3.close(); + //} } } diff --git a/src/main/java/Temporary/ReconnectControlTest.java b/src/main/java/Temporary/ReconnectControlTest.java index 9330684..ab2ff90 100644 --- a/src/main/java/Temporary/ReconnectControlTest.java +++ b/src/main/java/Temporary/ReconnectControlTest.java @@ -3,7 +3,7 @@ package Temporary; import InnaIrcBot.ReconnectControl; public class ReconnectControlTest { - public static void main(String args[]){ + public static void main(String[] args){ ReconnectControl.register("testing"); ReconnectControl.register("testing1"); ReconnectControl.update("testing1", false);