!7 concept Msg { long msgID, channelID, userID; long date, edited; // epochSeconds S text; } standardBot1 EAMBot { init { dbIndexing(Msg, 'msgID); } allServers { enhanceFrame { internalFrameMenuItem(f, "Show word list", rThread { S list = makeWordsList(); showText_fast_noWrap("Word list (" + countLines(list) + ")", list); }); } S makeWordsList() { new Map map; // word -> date for ping (Msg msg : sortedByField date(list(Msg))) { Long date = msg.date; for ping (S word : words2_notNextToNumbers_plusApostrophe(msg.text)) map.put(word, date); } ret lines(keysSortedByValuesDesc(map)); } } sync S processSimplifiedLine(S s, O... _) { try answer super.processSimplifiedLine(s, _); if ((s = dropMyPrefixOrNull(s)) == null) null; optPar MessageChannel channel; if "upload word list" { S list = makeWordsList(); editMechList("NGB Word List", list); ret "OK. " + nWords(countLines(list)); } if "retrieve history" { setAll(new Scan, +channel, incremental := true).run(); ret "Retrieving..."; } if "retrieve full channel" { setAll(new Scan, +channel, incremental := false).run(); ret "Retrieving..."; } if "retrieve all channels" { for ping (TextChannel c : getGuild().getTextChannels()) { setAll(new Scan, channel := c, incremental := true).run(); } } if "db size" ret nMessages(countConcepts(Msg)); if "random message" { Msg msg = random(list(Msg)); ret msg == null ? "No messages" : "[" + msg.msgID + "] " + msg.text; } null; } class Scan { MessageChannel channel; MessageHistory history; int scanned; bool incremental; run { if (history == null) history = channel.getHistory(); history.retrievePast(100).queue(msgs -> { temp enter(); print("Got msgs: " + l(msgs)); if (empty(msgs)) ret with postInChannel(channel, "Done scanning " + discordChannelRef(channel.getIdLong()) + " (" + nMessages(scanned) + ")"); scanned += l(msgs); if (storeMsgs(msgs) && incremental) ret with postInChannel(channel, "Stopping incremental scan of " + discordChannelRef(channel.getIdLong()) + " after " + nMessages(scanned)); run(); }, onQueueError); } } bool storeMsgs(L l) { bool anySeen; for (Message msg : l) { Msg m, bool isNew = unpair uniq2(Msg, msgID := msg.getIdLong()); if (isNew) set anySeen; cset(m, channelID := msg.getTextChannel().getIdLong(), userID := msg.getAuthor().getIdLong(), date := msg.getCreationTime().toEpochSecond(), edited := msg.isEdited() ? msg.getEditedTime().toEpochSecond() : 0, text := msg.getContentRaw()); } ret anySeen; } }