!7 cmodule Giraffe > DynDiscordHopper { switchable S myName = "Giraffe"; switchable S sliceID = "wgeuwbcepeoxfwma"; // "Height bot" slice - https://agi.blue/?slice=cxbfnllthxfsuwxw transient PKIKeyPair keys; start { keys = keyPairForProgram(); dm_vmBus_onMessage_q('discordGuildJoin, voidfunc(Map map) { ret unless map.get('module) == module(); postInChannel(preferredChannelID, questionToAsk()); }); } @Override S answer(S input, Map map) { ret mapEachLine_tlft_nempties(input, s -> { new Matches m; // preprocess if (discordBotID != 0) s = replacePrefix("<@" + discordBotID + ">", myName + " ", s); s = simpleSpaces_noTok(s); if "what's your name" ret myName; if (eqic(s, "hey " + myName)) ret or2(questionToAsk(), "I don't know what to ask"); if (swic_trim(s, myName + " example for: ", m)) ret findExample(m.rest()); if (swic_trim(s, myName + " ", m)) { S question = m.rest(); S answerPattern = randomAnswerPattern(m.rest()); if (nempty(answerPattern)) ret fillPattern(answerPattern); } null; }); } S questionToAsk() { ret (S) random(jsonDecodeList(agiBlue_query([[ question to ask / is / $x return $x ]], slice := sliceID))); } // assume s is sanitized S findExample(S s) { ret (S) random(jsonDecodeList(agiBlue_query([[ $x / is a / *** return $x ]].replace("***", s), slice := sliceID))); } S randomAnswerPattern(S question) { ret (S) random(jsonDecodeList(agiBlue_query([[ *** / answer pattern / $x return $x ]].replace("***", s), slice := sliceID))); } 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); } }