Warning: session_start(): open(/var/lib/php/sessions/sess_kaa9h61gncfrq2tbp9fus0ut2s, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!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) {
File file = getCacheProgramFile(attachment.getFileName());
print("Downloading attachment: " + file);
attachment.download(file);
LS lines = tlft(loadTextFile(file));
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;
}
}
}