Warning: session_start(): open(/var/lib/php/sessions/sess_rbbtoitr5ajnq01m99n0n2n4r0, 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 Giraffe > DynDiscordHopper {
switchable S myName = "Giraffe";
switchable S sliceID = "wgeuwbcepeoxfwma"; // "Height bot" slice - https://agi.blue/?slice=cxbfnllthxfsuwxw
WaitForAnswerState state;
class WaitForAnswerState {
long waitingSince = now(), waitUntil = nowPlusSeconds(60.0);
long channelID;
S user;
void check {
if (now() >= waitUntil) try {
postInChannel(channelID, "Hey " + user + ", can't you answer?");
} finally {
setField(state := null);
}
}
void processInput(long userID, S input) {
if (discord_parseUserMention(user) != userID) ret;
if (processStatement(userID, preferredChannelID, input))
setField(state := null);
}
}
bool processStatement(long userID, long channelID, S input) {
S parsedHeight = ai_parsePersonHeightStatement(input);
if (parsedHeight == null) false;
postInChannel(channelID, "Aha! " + discordAt(userID) + " is " + parsedHeight + " tall");
agiBlue_postInSlice(sliceID,
"Discord user " + discordAt(userID), "'s height is", parsedHeight);
true;
}
void askUserTheQuestion(long userID, long channelID) {
S knownHeight = agiBlue_lookupInSlice(sliceID,
"Discord user " + discordAt(userID), "'s height is");
if (nempty(knownHeight))
ret with postInChannel(channelID, "I know that your height is " + knownHeight + ", " + discordAt(userID));
postInChannel(channelID,
discordAt(userID) + ", " + questionToAsk());
if (state == null)
setField(state := setAll(new WaitForAnswerState, +channelID, user := discordAt(userID)));
}
start {
agiBlue_useProductiveVersion();
dm_vmBus_onMessage_q('discordGuildJoin, voidfunc(Map map) {
ret unless map.get('module) == module();
print("Got join");
askUserTheQuestion(getLong userID(map), preferredChannelID);
});
dm_vmBus_onMessage_q('discordGuildLeave, voidfunc(Map map) {
ret unless map.get('module) == module();
if (eq(discordAt(getLong userID(map)), getString user(state)))
state = null;
});
doEvery(1.0, r { if (state != null) state.check(); });
}
@Override S answer(S input, Map map) {
ret mapEachLine_tlft_nempties(input, s -> {
new Matches m;
// preprocess
if (discordBotID != 0)
s = replace(s, discordAt(discordBotID), " " + myName + " ");
s = dropPunctuation3(s);
s = trim(simpleSpaces_noTok(s));
print("simplified >> " + quote(s));
if "what's your name" ret myName;
if (state != null)
state.processInput(getLong userID(map), input);
S questionToAsk = questionToAsk();
if (eqic_underCollapse(s, "hey " + myName))
{
print("asking user");
askUserTheQuestion(getLong userID(map), getLong channelID(map));
}
if (cic_underCollapse(s, myName) && cicOneOf_underCollapse(s, "database", "slice", "agi.blue"))
ret "My database is here: " + agiBlue_linkToSlice(sliceID);
if (swic_trim(s, myName + " example for: ", m))
ret findExample(m.rest());
if (cic(s, myName) && processStatement(getLong userID(map), getLong channelID(map), s)) null;
if (swic_trim(s, myName + " ", m)) {
S question = m.rest();
S answerPattern = randomAnswerPattern(m.rest());
if (nempty(answerPattern))
ret fillPattern(answerPattern);
}
// react to user input matching an answer pattern
/*for (S pattern : allAnswerPatterns(questionToAsk)) {
S regexp = ellipsisToGroupedDotPlusRegexp(angleBracketVarsToEllipsis(pattern));
print("Have regexp: " + regexp);
LS groups = regexpFirstGroupsIC(regexp, s);
if (nempty(groups))
ret "Aha! " + first(groups) + " " + discordAt(getLong userID(map));
}*/
null;
});
}
S questionToAsk() {
ret agiBlue_randomLookupInSlice(sliceID, "question to ask", "is");
}
// assume s is sanitized
S findExample(S s) {
ret agiBlue_randomALookupInSlice(sliceID, "is a", s);
}
S randomAnswerPattern(S question) {
ret agiBlue_randomLookupInSlice(sliceID, question, "answer pattern");
}
LS allAnswerPatterns(S question) {
ret agiBlue_multiLookupInSlice(sliceID, question, "answer pattern");
}
S fillPattern(S pattern) {
LS tok = javaTokWithAngleBrackets(pattern);
for (int idx : indicesOfAngleBracketVars(tok)) {
S value = findExample(deAngleBracket(tok.get(idx)));
if (nempty(value))
tok.set(idx, value);
}
ret join(tok);
}
}