Warning: session_start(): open(/var/lib/php/sessions/sess_1sbbadi2a05non3kgs0ifqpqku, 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
set flag DynModule.
cmodule DiscordBot > DynPrintLogAndEnabled {
transient JDA bot;
transient new Set msgsReactedTo;
transient double deleteDelay = 60.0;
start {
logModuleOutput();
// TODO: log JDA output
bot = discordBot(new ListenerAdapter {
public void onMessageReceived(MessageReceivedEvent e) pcall {
ret if !enabled || !licensed();
bool bot = e.getAuthor().isBot();
Message msg = e.getMessage();
print("Channel type: " + e.getChannelType());
bool isPrivate = e.getChannelType() == ChannelType.PRIVATE;
print("Msg from " + e.getAuthor().getName() + ": " + e.getMessage().getContentDisplay());
S content = trim(msg.getContentRaw());
if (empty(content)) ret;
O user = userConcept(e.getAuthor());
S crud = dm_gazelle_linesCRUD();
O channel = dm_call(crud, 'uniqChannel, msg.getChannel().getIdLong());
dm_call(crud, 'cset, channel, litobjectarray(name := msg.getChannel().getName()));
O lineConcept = dm_call(crud, 'uniqConcept, litObjectArrayAsObject(msgID := e.getMessage().getIdLong()));
dm_call(crud, 'cset, lineConcept, litobjectarray(
text := content,
+bot, +isPrivate,
author := user, +channel));
ret if bot;
GazelleEvalContext ctx = dm_gazelle_stdEvalContext(dm_gazelle_allRulesWithComment("discord"));
GazelleTree tree = new(ctx, content);
L l = dm_gazelle_getChildren(tree);
if (empty(l)) ret;
for (GazelleTree t : takeFirst(10, l))
postInChannelWithDelete(e.getChannel(), t.line);
}
public void onMessageReactionAdd(MessageReactionAddEvent e) pcall {
ret if !enabled || !licensed();
MessageReaction r = e.getReaction();
bool bot = e.getUser().isBot();
long msgID = r.getMessageIdLong();
add(msgsReactedTo, msgID);
print("User " + e.getUser() + (bot ? " (bot)" : "") + " reacted to message " + msgID + " with " + r.getReactionEmote());
if (bot) ret;
S crud = dm_gazelle_linesCRUD();
O lineConcept = dm_call(crud, 'uniqConcept, litObjectArrayAsObject(+msgID));
L reactions = cast get(lineConcept, 'reactions);
print("lineConcept=" + lineConcept);
print("reactions=" + reactions);
O reaction = dm_call(crud, 'nuReaction, litObjectArrayAsObject(
user := userConcept(e.getUser()),
emoji := r.getReactionEmote().getName(),
created := now()));
print("reaction=" + reaction);
dm_call(crud, 'cset, lineConcept, litobjectarray(
reactions := listPlus(reactions, reaction)));
}
});
dm_registerAs('discordBot);
print("Started bot");
}
void cleanMeUp {
if (bot != null) pcall {
print("Shutting down bot");
bot.shutdown();
print("Bot shut down");
}
bot = null;
}
O userConcept(User user) {
S crud = dm_gazelle_linesCRUD();
O userConcept = dm_call(crud, 'uniqUser, user.getIdLong());
dm_call(crud, 'cset, userConcept, litobjectarray(name := user.getName()));
ret userConcept;
}
// API
void postInChannel(long channelID, S msg) {
bot.getTextChannelById(channelID).sendMessage(msg).queue();
}
void postInChannel(S channel, S msg) {
long id = dm_discord_channelID(channel);
if (id == 0) fail("Channel not found: " + channel);
postInChannel(id, msg);
}
void postInChannelWithDelete(MessageChannel channel, S msg) {
channel.sendMessage(msg).queue(msg2 -> {
final long msgId = msg2.getIdLong();
print("I sent msg: " + msgId);
doLater(deleteDelay, r {
ret if contains(msgsReactedTo, msgId);
print("Deleting msg " + msgId);
msg2.delete().queue();
});
});
}
}