!7 cmodule NLRulesBot extends DynTalkBot2<.ByServer> { start { makeByServer = () -> new ByServer; useAGIBlueForDropPunctuation = false; preprocessAtSelfToMyName = false; dropPunctuation = false; } sclass Rule { GlobalID globalID = aGlobalIDObj(); S text; *() {} *(S *text) {} } S renderRule(Rule r) { ret r == null ? null : "Rule " + r.globalID + ": " + r.text; } class ByServer extends DynTalkBot2.ByServer { new L rules; new Set priorityChannels; // where we always respond bool enableMagicQuotes = true; synchronized S processSimplifiedLine(S s, O... _) { try answer super.processSimplifiedLine(s, _); print("s=" + s); new Matches m; S s2 = dropMyPrefixOrNull(s); if (s2 != null) s = s2; else if (!contains(priorityChannels, optPar channelID(_))) null; optPar Message msg; print("msg=" + msg); Message.Attachment attachment = msg == null ? null : first(msg.getAttachments()); if (attachment != null) { long id = idForByServer(this); File file = prepareCacheProgramFile(id + "/" + attachment.getFileName()); print("Downloading attachment: " + file); if (!attachment.download(file)) ret "Couldn't download attachment"; LS lines = tlft(loadTextFile(file)); print("First line: " + first(lines)); if (!swic(first(lines), "rule ")) print("Ignoring attachment"); else { new LPairS toImport; // (globalID, text) for (S line : lines) { LS l = regexpICFullMatch_groups("Rule ([a-z]+):(.*)$", line); if (nempty(l)) toImport.add(listToPair(l)); } ret "Found " + nRules(toImport) + " in attachment"; //Rule r = firstWhere(rules, globalID := GlobalID($1)); } } if "on * say *|on keyword * say *|on *, image-google X|on *, google X" { Rule r = firstWhereIC(rules, text := s); if (r != null) ret "Rule exists: " + r.globalID; rules.add(r = new Rule(s)); change(); ret "Rule added with ID " + r.globalID; } if "rules" ret lines(map(r -> renderRule(r), rules)); if "delete rule *|delete rule with id *" { try answer checkAuth(_); Rule r = firstWhere(rules, globalID := GlobalID($1)); if (r == null) ret "Rule " + $1 + " not found"; rules.remove(r); change(); ret "Rule deleted, " + nRule(rules) + " remain"; } if "priority channel on" { try answer checkAuth(_); priorityChannels.add(longOptPar channelID(_)); change(); ret "OK"; } if "priority channel off" { try answer checkAuth(_); priorityChannels.remove(optPar channelID(_)); change(); ret "OK"; } if "disable magic quotes" { try answer checkAuth(_); enableMagicQuotes = false; change(); ret "OK"; } if (eqic(s, "help")) ret ltrim([[ I execute simple English rules. Stuff to say. @me `on "hello bot" say "who are you"` @me `on keyword "time" say "it is always time for a tea"` @me `on "what is X" google X` @me `on "show me X" image-google X` @me `rules` - list rules @me `delete rule abcdefghijkl` - delete rule with ID @me `priority channel on` - respond to every msg @me `priority channel off` - respond to msgs with my name only @me `masters` / `add master ` / `delete master ` @me `help` / `support` / `source code` @me `download` - download my brain for this guild [Bot made by https://BotCompany.de] ]]).replace("@me", atSelf()); // find rule to execute for (Rule r : rules) pcall { // IMPORTANT: patterns are duplicated above if (match("on * say *", r.text, m)) { S in = $1, out = $2; if (match(in, s)) ret out; } if (match("on keyword * say *", r.text, m)) { S in = $1, out = $2; if (find3(in, s)) ret out; } if (match("on *, image-google X", r.text, m)) if (flexMatchIC(replaceWord($1, "X", "*"), s, m)) { bool nsfw = discord_isNSFWChannel_gen(optPar channel(_)); print(+nsfw); BufferedImage img = nsfw ? quickVisualize_nsfw($1) : quickVisualize($1); if (img == null) ret "No image found, sorry!"; postImage(paramsToMap(_), uploadToImageServer(img, $1)); } if (match("on *, google X", r.text, m)) if (flexMatchIC(replaceWord($1, "X", "*"), s, m)) { bool nsfw = discord_isNSFWChannel_gen(optPar channel(_)); print(+nsfw); ret discord_google($1, results := 1, safeSearch := !nsfw); } } if "download" { optPar Guild guild; optPar MessageChannel channel; ret serveGuildBackup(channel, guild, structure_nullingInstancesOfClass(_getClass(module()), ByServer.this)); } if (enableMagicQuotes) try answer answer_magicQuoteInput(s); null; } } }