Warning: session_start(): open(/var/lib/php/sessions/sess_7ccgq8pj8jjjacv3ulmgvoc7as, 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
import net.dv8tion.jda.core.events.guild.member.*;
switchable S discordToken;
S discordBotName;
transient JDA discord;
transient Color discordImageEmbedMysteriousLineColor = colorFromHex("36393f");
void startDiscord {
if (!discordEnabled()) ret with print("Not enabled");
vm_cleanPrints(); // avoid Swing Unicode problem
logModuleOutput(); // good idea for chat bots
// TODO: log JDA output going to System.out/err
discord = discordBot(new ListenerAdapter {
@Override
public void onMessageUpdate(MessageUpdateEvent e) pcall {
temp enter();
ret if !discordEnabled() || !licensed();
long msgID = e.getMessage().getIdLong();
S content = e.getMessage().getContentRaw();
O lineConcept = dm_discord_lineForMsgID_unimported(msgID);
S rendered = msgID + ": " + content;
if (lineConcept == null)
ret with print("Weird: Message edited, but not found: " + rendered);
call(lineConcept, '_setField, editedText := content);
print("Message edited: " + rendered);
}
@Override
public void onMessageReceived(MessageReceivedEvent e) pcall {
temp enter();
ret if !discordEnabled() || !licensed();
bool bot = e.getAuthor().isBot();
if (bot) ret;
long msgID = e.getMessage().getIdLong();
long userID = e.getAuthor().getIdLong();
long guildID = toLong(call(e.getGuild(), 'getIdLong);
Member member = e.getMember();
S userName = member == null ? null : member.getNickname(); // the changeable nick name - null sometimes?
if (userName == null && member != null) userName = member.getEffectiveName();
if (userName == null) userName = e.getAuthor().getName();
final Message msg = e.getMessage();
MessageChannel channel = e.getChannel();
long channelID = channel.getIdLong();
print("Channel type: " + e.getChannelType());
bool isPrivate = e.getChannelType() == ChannelType.PRIVATE;
S content = trim(msg.getContentRaw());
print("Msg from " + userName + ": " + content);
if (empty(content)) ret;
vmBus_send('incomingDiscordMessage,
litmapparams(fromBot := bot, module := dm_me(), +msgID, +userID, +userName, event := e, +guildID,
+content, +isPrivate, +channelID, +channel));
}
@Override
public void onMessageReactionAdd(MessageReactionAddEvent e) pcall {
temp enter();
ret if !discordEnabled() || !licensed();
MessageReaction r = e.getReaction();
bool bot = e.getUser().isBot();
long msgID = r.getMessageIdLong();
S emoji = r.getReactionEmote().getName();
vmBus_send('incomingDiscordReaction, litmapparams(
fromBot := bot, module := dm_me(), +msgID, +emoji
));
}
@Override
public void onGuildMemberJoin(GuildMemberJoinEvent event) pcall {
temp enter();
print("Got guild join");
ret if !discordEnabled() || !licensed();
vmBus_send('discordGuildJoin, litmapparams(
module := dm_me()
));
}
@Override
public void onGuildMemberLeave(GuildMemberLeaveEvent e) pcall {
temp enter();
print("Got guild leave");
ret if !discordEnabled() || !licensed();
vmBus_send('discordGuildLeave, litmapparams(
module := dm_me(), event := e
));
}
}, token := discordToken);
dm_registerAs('liveDiscordModule);
dm_vmBus_answerToMessage activeDiscordTokens(func -> LS { ll(discordToken) });
setField(discordBotName := jda_selfUserName(discord));
print("Bot name: " + discordBotName);
}
void cleanMeUp {
if (discord != null) pcall {
print("Shutting down discord");
discord.shutdown();
print("Bot shut down");
}
discord = 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
MessageChannel getChannel(long channelID) {
ret discord.getTextChannelById(channelID);
}
void postInChannel(long channelID, S msg) {
if (channelID == 0) ret;
postInChannel(getChannel(channelID), msg);
}
void postInChannel(MessageChannel channel, S msg) {
S postID = cast dm_call(gazelle_postedLinesCRUD(), 'postingLine, channel.getId(), msg);
channel.sendMessage(msg).queue(m -> {
dm_call(gazelle_postedLinesCRUD(), 'donePosting, postID, "discord msg " + m.getId());
});
}
void postInChannel(S channel, S msg) {
long id = dm_discord_channelID(channel);
if (id == 0) fail("Channel not found: " + channel);
postInChannel(id, msg);
}
void postInChannel(MessageChannel channel, S msg, IVF1 onPost) {
S postID = cast dm_call(gazelle_postedLinesCRUD(), 'postingLine, channel.getId(), msg);
channel.sendMessage(msg).queue(msg2 -> {
dm_pcall(gazelle_postedLinesCRUD(), 'donePosting, postID, "discord msg " + msg2.getId());
pcallF(onPost, msg2);
final long msgId = msg2.getIdLong();
print("I sent msg: " + msgId);
}, error -> _handleException(error));
}
void postImage(MessageChannel channel, S url, S description) {
channel.sendMessage(
new EmbedBuilder()
.setImage(absoluteURL(url))
//.setTitle(unnull(title))
.setDescription(unnull(description))
.setColor(discordImageEmbedMysteriousLineColor)
.build()).queue(); // TODO: posted lines
}
void editMessage(long channelID, long msgID, S text) {
getChannel(channelID).editMessageById(str(msgID), text).queue();
}
void sendPM(long userID, S text) {
discord.getUserById(userID).openPrivateChannel().queue(channel -> {
channel.sendMessage(text).queue();
});
}
void reply(Map msgMap, S text) {
if (empty(text = trim(text))) ret;
postInChannel((MessageChannel) msgMap.get('channel), text);
}
void iAmTyping(Map msgMap) pcall {
((MessageChannel) msgMap.get('channel)).sendTyping().queue();
}