asclass DynTalkBot2 extends DynServerAwareDiscordBot {
switchable S myName = "Anonymous bot";
transient bool useAGIBlueForDropPunctuation = true;
transient bool preprocessAtSelfToMyName = true;
transient bool dropPunctuation = true;
L authorizedUsers = ll(547706854680297473); // stefan
start {
makeByServer = () -> new ByServer2(DynTalkBot2.this);
dm_vmBus_onMessage_q('discordGuildJoin, voidfunc(Map map) {
ret unless map.get('module) == module();
print("Got join");
getByServer(getLong guildID(map), true)
.onUserJoin(getLong userID(map), map);
});
}
sclass ByServer2 extends DynServerAwareDiscordBot.ByServer {
*() {}
*(DynTalkBot2 module) { super(module); }
DynTalkBot2 m() { ret module/DynTalkBot2; }
delegate myName to m().
delegate preprocessAtSelfToMyName to m().
delegate dropPunctuation to m().
delegate authorizedUsers to m().
delegate useAGIBlueForDropPunctuation to m().
delegate atSelf to m().
delegate discordBotID to m().
delegate change to m().
// overridable
void onUserJoin(long userID, O... _) {}
@Override S answer(S input, Map map) {
try answer super.answer(input, map); // server-aware stuff
ret processLine(input, map);
}
S processLine(S s, O... _) {
s = preprocess(s, _);
ret processSimplifiedLine(s, _);
}
S preprocess(S s, O... _) {
if (preprocessAtSelfToMyName && discordBotID != 0)
s = replace(s, atSelf(), " " + myName + " ");
if (dropPunctuation)
s = dropPunctuation3_withAGIBlue(useAGIBlueForDropPunctuation, s);
s = trim(simpleSpaces_noTok(s));
print("simplified >> " + quote(s));
ret s;
}
S myPrefix() {
ret preprocessAtSelfToMyName ? myName + " " :
(dropPunctuation ? replace(atSelf(), "@", "") /* @ is killed by preprocessing */ : atSelf()) + " ";
}
// extend me
S processSimplifiedLine(S input, O... _) {
new Matches m;
input = dropPrefixOrNull(myPrefix(), input);
if (input == null) null;
if (eqicOneOf(input, "support channel", "support server", "support"))
ret "Get support for me here: " + nextGenBotsDiscordInvite();
if (eqicOneOf(input, "source", "sources", "source code"))
ret snippetLink(programID());
if (swic_trim(input, "add master ", m)) {
try answer checkAuth(_);
add(authorizedUsers, parseFirstLong(m.rest()));
change();
ret "Okidoki. Have " + n2(l(authorizedUsers), "master");
}
if (eqic(input, "masters"))
ret empty(authorizedUsers) ? "I have no masters." : "My masters are: " + joinWithComma(map discordAtPlusID(authorizedUsers));
if (swic_trim(input, "delete master ", m)) {
try answer checkAuth(_);
remove(authorizedUsers, parseFirstLong(m.rest()));
change();
ret "Okidoki. Have " + n2(l(authorizedUsers), "master");
}
null;
}
bool authed(O... _) {
ret contains(authorizedUsers, optPar userID(_));
}
S checkAuth(O... _) {
long userID = longPar userID(_);
bool result = authed(_);
print("Auth-checking user ID: " + userID + " => " + result);
if (!result) ret "You are not authorized";
null;
}
}
}