ifndef DifferentJDA
lib 1400315 // JDA 4.0 with opus

//static LS _stickyLibs_discordBot = ll(#1400315); // can cause loader constraint violations
endifndef

import net.dv8tion.jda.api.*;
import net.dv8tion.jda.api.entities.*;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.hooks.*;
import net.dv8tion.jda.api.events.message.*;
import net.dv8tion.jda.api.events.message.react.*;

static JDA discordBot40(VF1<MessageReceivedEvent> onMessage) {
  ret discordBot40(new ListenerAdapter {
    @Override
    public void onMessageReceived(MessageReceivedEvent e) {
      if (e.getAuthor().isBot()) ret with print("  Msg from bot, skipping");
      pcallF(onMessage, e);
    }
  });
}

static JDA discordBot40(ListenerAdapter listener, O... _) ctex {
  print("Making JDABuilder");
  JDABuilder builder = new(AccountType.BOT);
  print("Have JDABuilder");
  S token = stringPar token(_);
  if (empty(token)) {
    File tokenFile = javaxSecretDir("discord-bot-token");
    token = assertNempty("Need: " + tokenFile, trim(loadTextFile(tokenFile)));
  }
  builder.setToken(token);
  builder.addEventListeners(listener);
  print("Building JDA with token " + shorten(10, token));
  JDA jda = builder.build();
  print("Got JDA: " + jda);
  //jda.awaitSatus(JDA.Status.CONNECTED);
  jda.awaitReady();
  print("Started Discord bot (token: " + shorten(token, 7) + ")");
  ret jda;
}