// requires Msg concept class DiscordScanner { MessageChannel channel; MessageHistory history; int scanned; bool incremental, postResult = true; Runnable whenDone; run { if (history == null) history = channel.getHistory(); history.retrievePast(100).queue(msgs -> { temp enter(); print("Got msgs: " + l(msgs)); if (empty(msgs)) { if (postResult) postInChannel(channel, "Done scanning " + discordChannelRef(channel.getIdLong()) + " (" + nMessages(scanned) + ")"); callF(whenDone); ret; } scanned += l(msgs); if (storeMsgs(msgs) && incremental) { if (postResult) postInChannel(channel, "Stopping incremental scan of " + discordChannelRef(channel.getIdLong()) + " after " + nMessages(scanned)); callF(whenDone); ret; } run(); }, onQueueError); } static 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; } }