commit 5124a36c7addc73129944c78ea728fa3dd389af0 Author: Mysaa Date: Sun May 23 01:26:20 2021 +0200 Premier commit - Juliabot d'avant diff --git a/pif/images.png b/pif/images.png new file mode 100644 index 0000000..06bb343 Binary files /dev/null and b/pif/images.png differ diff --git a/src/com/bernard/discord/DiscordBot.java b/src/com/bernard/discord/DiscordBot.java new file mode 100644 index 0000000..591156f --- /dev/null +++ b/src/com/bernard/discord/DiscordBot.java @@ -0,0 +1,306 @@ +package com.bernard.discord; + +import java.util.*; + +import com.bernard.discord.api.Command; +import com.bernard.discord.api.DUtils; +import com.bernard.discord.struct.CommandMap; + +import net.dv8tion.jda.core.*; +import net.dv8tion.jda.core.entities.*; + +public class DiscordBot { + + // private static DiscordBot julia; + + private JDA jda; + private CommandMap commandMap; + private Scanner sc; + public boolean running; + public short countDown; + private com.bernard.discord.struct.EventListener listener; + private String[] changelog = { + // "Patch 20180309 :", + // "L'arr�t automatique ne se d�clenche plus apr�s un + // StatusChangeEvent.", + // "Le message d'arr�t automatique ne s'envoie plus qu'une fois dans + // chaque channel.", + // "Une certaine commande changelog aurai �t� ajout�, est-ce la + // v�rit� ?" + + // "Patch 20180330 :", "Le jeu de JuL'IA change selon si elle est en + // mode fant�me ou non.", + // "La commande julia a �t� am�lior�, mais des r�glages sur les + // proba sont encore � faire", + // "Les logs enl�vent enfin les tags utilisateurs et salons, au + // revoir les notifs doublons !!!"}; + + "Patch 20180403 :", "Nouvelle commande modif, qui permet de ... modifier", + "Les possibilit�s offertes par les commandes dlc et sayc sont maintenant prises en charge par dl et say", + "Les commandes sont indiqu�es et de nombreux autres events ont un nom plus court dans les logs"}; + + public static void main(String[] args) { + new DiscordBot("!!", ""); + // new DiscordBot("::", + // "NDM5ODU2MjY3ODc2NjMwNTQ4.DcZQDg.2gV5E-JUMeWYhpVBTLuhtfEJNEo"); + } + + public DiscordBot(String tag, String token) { + try { + jda = new JDABuilder(AccountType.BOT)/* + * .setStatus(OnlineStatus. + * INVISIBLE) + */.setToken(token).buildBlocking(); + + Thread.sleep(2000); + } catch(Exception e) { + e.printStackTrace(); + } + + // jda.getPresence().setGame(Game.playing("r�unir toutes les donn�es, + // les donn�es")); + DUtils.init(jda, tag); + + // jda.getPresence().setGame(Game.playing("trier les events")); + listener = new com.bernard.discord.struct.EventListener(this); + + // jda.getPresence().setGame(Game.playing("trier les commandes")); + commandMap = new CommandMap(this, tag, listener); + + DUtils.loadMaps(commandMap, listener); + // String time = DUtils.getTime(); + // String mess = "----- " + time + " Connexion -----"; + // DUtils.logS.sendMessage(mess).complete(); + // DUtils.logE.sendMessage(mess).complete(); + // DUtils.logV.sendMessage(mess).complete(); + + sc = new Scanner(System.in); + running = true; + countDown = 0; + + jda.addEventListener(listener); + // jda.getPresence().setGame(Game.listening("TOUT depuis " + time)); + + run(); + } + + public void run() { + System.out.println("[" + DUtils.getTime() + "] [Info] [ZLO]: Scanner ready!\n"); + while(running) + if(sc.hasNextLine()) + commandMap.commandConsole(sc.nextLine()); + } + + private final String URG = ""; + + @Command(name = "stop", group = "Contr�le", grp = "ctr", description = "Met fin � l'ex�cution du bot", admin = true) + public void stop() { + running = false; + stop(URG); + } + + public void stop(String message) { + // String time = DUtils.getTime(); + // boolean urg = message == URG; + + // if(urg) + // jda.getPresence().setGame(Game.listening("RIEN depuis " + time)); + + // String tmessage = "----- " + time + " Arr�t " + (urg ? "manuel" : + // ("automatique --- " + message)) + " -----"; + // DUtils.logS.sendMessage(tmessage).complete(); + // DUtils.logE.sendMessage(tmessage).complete(); + // DUtils.logV.sendMessage(tmessage).complete(); + + jda.shutdownNow(); + System.exit(0); + } + + // @Command(name = "changelog", group = "Contr�le", grp = "ctr", description + // = "Donne des informations utiles sur la version de l'instance lanc�e.", + // admin = true) + // public void changelog(TextChannel channel) throws InterruptedException { + // sendWithDelay(channel, changelog); + // } + + public static void sendWithDelay(MessageChannel channel, String... messages) { + try { + for(String message : messages) { + channel.sendTyping().complete(); + Thread.sleep(message.length() * 75); + channel.sendMessage(message).complete(); + } + } catch(InterruptedException e) { + e.printStackTrace(); + } + } + + /** + * Kick Members 1 2 Add Reactions 6 64 View Audit Logs 7 128 Read Text + * Channels & See Voice Channels 10 1024 Read Messages 10 1024 Send Messages + * 11 2048 Send TTS Messages 12 4096 Manage Messages 13 8192 Embed Links 14 + * 16384 Attach Files 15 32768 Read History 16 65536 Mention Everyone 17 + * 131072 Use External Emojis 18 262144 Connect 20 1048576 Speak 21 2097152 + * Mute Members 22 4194304 Deafen Members 23 8388608 Move Members 24 + * 16777216 Use Voice Activity 25 33554432 Change Nickname 26 67108864 + * Manage Roles 28 268435456 Manage Permissions 28 268435456 Manage Webhooks + * 29 536870912 Manage Emojis 30 1073741824 + */ + // @Command(name = "tts", group = "Contr�le", grp = "ctr", description = + // "Oula... faut pas que tu lise �a hein, c'est dangereux hein. ET + // TECHNIQUEMENT IMPOSSIBLE. Mais �a c'est pas important.", admin = true) + // public void test(User user, Member member, MessageChannel channel, Guild + // guild, String[] args) throws InterruptedException { + //// if(member.getUser().getIdLong() != 232545563407548416L) + //// return; + // + // + // + // MessageBuilder mb = new MessageBuilder(); + // mb.setTTS(true); + // for(String arg : args) + // mb.append(arg).append(" "); + // Message m = mb.build(); + //// guild.getController().setNickname(guild.getSelfMember(), + // "MEE6").complete(); + //// guild.getTextChannelById(222947179017404416L).sendMessage(m).complete().delete().complete(); + // guild.getController().setNickname(guild.getSelfMember(), + // "JuL'IA").complete(); + // } + + // @Command(name = "pool", group = "Contr�le", grp = "ctr", description = + // "Oula... faut pas que tu lise �a hein, c'est dangereux hein. ET + // TECHNIQUEMENT IMPOSSIBLE. Mais �a c'est pas important.", admin = false) + // public void pool(Member member, MessageChannel channel, Guild guild, + // String[] args) throws InterruptedException { + // if(member.getUser().getIdLong() != 232545563407548416L) { + // String message = "Zone dangeureuse, travaux en cours."; + // channel.sendTyping().complete(); + // channel.sendMessage(message).completeAfter(message.length() * 75, + // TimeUnit.MILLISECONDS).delete().completeAfter(message.length() * 225, + // TimeUnit.MILLISECONDS); + // return; + // } + // + // StringBuilder s = new StringBuilder(); + // for(AuditLogEntry entry : guild.getAuditLogs()) + // s.append(entry.getUser().getName()).append(" "); + // channel.sendMessage(s.toString()).complete(); + // + // } + + // boolean top = false; + // + // @Command(name = "loop", group = "Contr�le", grp = "ctr", description = + // "Oula... faut pas que tu lise �a hein, c'est dangereux hein. ET + // TECHNIQUEMENT IMPOSSIBLE. Mais �a c'est pas important.", admin = false) + // public void loop(Member member, MessageChannel channel, Guild guild, + // String[] args) throws InterruptedException { + // if(member.getUser().getIdLong() != 232545563407548416L) { + // String message = "Zone dangeureuse, travaux en cours."; + // channel.sendTyping().complete(); + // channel.sendMessage(message).completeAfter(message.length() * 75, + // TimeUnit.MILLISECONDS).delete().completeAfter(message.length() * 225, + // TimeUnit.MILLISECONDS); + // return; + // } + // top = true; + // + // + // Member m = guild.getMemberById(187677269626585089L); + // + // VoiceChannel v1 = guild.getVoiceChannelById(356199104357072907L); + // VoiceChannel v2 = guild.getVoiceChannelById(358622259918798859L); + // while(top) { + // Thread.sleep(250); + // guild.getController().moveVoiceMember(m, v1).queue(); + // Thread.sleep(250); + // guild.getController().moveVoiceMember(m, v2).complete(); + // } + // + // } + // + // @Command(name = "truth", group = "Contr�le", grp = "ctr", description = + // "Oula... faut pas que tu lise �a hein, c'est dangereux hein. ET + // TECHNIQUEMENT IMPOSSIBLE. Mais �a c'est pas important.", admin = false) + // public void truth(Member member, MessageChannel channel, Guild guild, + // String[] args) throws InterruptedException { + // top = false; + // } + // + // @Command(name = "zulu", group = "Contr�le", grp = "ctr", description = + // "Oula... faut pas que tu lise �a hein, c'est dangereux hein. ET + // TECHNIQUEMENT IMPOSSIBLE. Mais �a c'est pas important.", admin = false) + // public void zulu(Member member, MessageChannel channel, Guild guild, + // String[] args) throws InterruptedException { + // if(member.getUser().getIdLong() != 232545563407548416L) + // return; + // for(Category ca : guild.getCategories()) { + // System.out.println(ca.getName()); + // for(Channel c : ca.getChannels()) { + // System.out.println("\t" + c.getName()); + // for(Member m : c.getMembers()) { + // System.out.println("\t\t" + m.getEffectiveName()); + // } + // } + // } + // } + // + // public void test1(User user, MessageChannel channel, Guild guild, + // String[] args) throws InterruptedException { + // if(user.getIdLong() != 232545563407548416L) { + // String message = "Zone dangeureuse, travaux en cours."; + // channel.sendTyping().complete(); + // channel.sendMessage(message).completeAfter(message.length() * 75, + // TimeUnit.MILLISECONDS).delete().completeAfter(message.length() * 225, + // TimeUnit.MILLISECONDS); + // return; + // } + // List rh = channel.getHistoryBefore(args[0], + // Integer.parseInt(args[1])).complete().getRetrievedHistory(); + // StringBuilder sb = new StringBuilder("```\n"); + // + // for(Message m : rh) + // m.delete().complete(); + // // try { + // // for(int i = 0; i < rh.size(); i++) { + // // System.out.println(i); + // // String m = rh.get(i).getId()+" : + // // "+rh.get(i).getContent().replaceAll("```", "'''").replaceAll("\n", " + // // \\\\n ")+"\n"; + // // if(sb.length()+m.length() > 1997) { + // // channel.sendMessage(sb.append("```").toString()).complete(); + // // sb.setLength(0); + // // sb.append("```\n"); + // // } sb.append(m); + // // }channel.sendMessage(sb.append("```").toString()).complete(); + // // } catch (IllegalArgumentException e) { + // // System.out.println(sb.toString()); + // // } + // } + + @Command(name = "dllasts", group = "Contr�le", grp = "ctr", description = "", admin = true) + public void dllast(MessageChannel channel, User user, String[] args) { + if(user.getIdLong() != 232545563407548416L) + return; + + List l = channel.getIterableHistory().complete(); + + int first = 0; + for(int i = 0; i < l.size(); i++) + if(l.get(i).getId().equals(args[0])) { + first = i; + break; + } + for(int i = first; i < l.size() && i < first + Integer.parseInt(args[1]); i++) { + try { + Message m = l.get(i); + m.delete().complete(); + Thread.sleep(400); + } catch(Exception e) { + e.printStackTrace(); + } + } + } + +} diff --git a/src/com/bernard/discord/addons/Basics.java b/src/com/bernard/discord/addons/Basics.java new file mode 100644 index 0000000..c7bcf5c --- /dev/null +++ b/src/com/bernard/discord/addons/Basics.java @@ -0,0 +1,168 @@ +package com.bernard.discord.addons; + +import java.util.List; + +import com.bernard.discord.api.Command; +import com.bernard.discord.api.DUtils; + +import net.dv8tion.jda.client.managers.EmoteManager; +import net.dv8tion.jda.core.entities.*; +import net.dv8tion.jda.core.requests.Route.Emotes; + +public class Basics { + + // ----- POUVOIR ----- \\ + +// @Command(name = "modif", group = "Contrôle", grp = "ctr", description = "Modifie un message", admin = true) +// public void modif(String[] args, TextChannel thisChannel) { +// boolean cVersion = false; +// TextChannel channel = null; +// +// try { +// channel = DUtils.server.getTextChannelById(args[0]); +// channel.toString(); +// } catch(Exception e) { +// if(channel == null) { +// channel = thisChannel; +// cVersion = true; +// } +// } +// +// StringBuilder sb = new StringBuilder(); +// for(int i = cVersion ? 1 : 2; i < args.length; i++) +// sb.append(args[i] + " "); +// String message = sb.toString(); +// +// channel.getMessageById(args[cVersion ? 0 : 1]).complete().editMessage(message).complete(); +// } +// +// @Command(name = "say", group = "Contrôle", grp = "ctr", description = "Envoie un message", admin = true) +// public void say(String[] args, TextChannel thisChannel) { +// boolean cVersion = false; +// TextChannel channel = null; +// try { +// channel = DUtils.server.getTextChannelById(args[0]); +// channel.toString(); +// } catch(Exception e) { +// if(channel == null) { +// channel = thisChannel; +// cVersion = true; +// } +// } +// +// StringBuilder sb = new StringBuilder(); +// for(int i = cVersion ? 0 : 1; i < args.length; i++) +// sb.append(args[i] + " "); +// String message = sb.toString(); +// +// DiscordBot.sendWithDelay(channel, message); +// } +// +// @Command(name = "dl", group = "Contrôle", grp = "ctr", description = "Efface un message", admin = true) +// public void dl(String[] args, TextChannel thisChannel) { +// boolean cVersion = false; +// TextChannel channel = null; +// try { +// channel = DUtils.server.getTextChannelById(args[0]); +// channel.toString(); +// } catch(Exception e) { +// if(channel == null) { +// channel = thisChannel; +// cVersion = true; +// } +// } +// +// channel.getMessageById(args[cVersion ? 0 : 1]).complete().delete().complete(); +// } + + @Command(name = "rea", group = "Contrôle", grp = "ctr", description = "Ajoute une réaction", admin = true) + public void rea(String[] args, Guild guild, MessageChannel thischan, Message message) { +// List emotes = guild.getEmotes(); +// +// for(Emote emote : emotes) +// System.out.println(emote.getId()+" : "+emote.getName()); + + boolean cVersion = false; + MessageChannel channel = null; + try { + channel = DUtils.server.getTextChannelById(args[0]); + channel.toString(); + } catch(Exception e) { + if(channel == null) { + channel = thischan; + cVersion = true; + } + } +// for(char c : message.getContent().toCharArray()) +// System.out.println(c + " : " + (int)c); + +// int[] wow = new int[]{55358,56614,55357,56489,55356,57185,55356,57246,55357,56446,55357,56875,55357,56495,55357,56396,55357,56697,55356,57241,11093,55357,56601,55357,56604,55357,56865}; +// StringBuilder sb = new StringBuilder(); +// for(int i = 0; i < wow.length/2; i++) +// sb.append((char)wow[2*i]).append("+").append((char)wow[2*i+1]).append("=").append((char)wow[2*i]).append((char)wow[2*i+1]).append("\n"); +// channel.sendMessage(sb.toString()).complete(); + +// channel.getMessageById(args[cVersion ? 0 : 1]).complete().addReaction(guild.getEmotesByName(args[cVersion ? 1 : 2], true).get(0)).complete(); +// channel.getMessageById(args[cVersion ? 0 : 1]).complete().addReaction(message.getEmotes().get(0)).complete(); + } + + @Command(name = "inttochar", group = "", grp = "", description = "", admin = true) + public void inttochar(String[] args, Guild guild, MessageChannel chan, Message message) { + + String[] ints = message.getContent().split("!!inttochar ")[1].split(", "); + StringBuilder sb = new StringBuilder(); + inttocharParser(sb, ints[0]); + for(int i = 1; i < ints.length; i++){ + sb.append(", "); + inttocharParser(sb, ints[i]); + } + chan.sendMessage(sb.toString()).complete(); + } + + private void inttocharParser(StringBuilder sb, String s) { + sb.append(s).append(" = "); + if(s.contains("..")) { + int from = Integer.parseInt(s.split("\\.\\.")[0]); + int to = Integer.parseInt(s.split("\\.\\.")[1]); + int step = from < to ? 1 : -1; + sb.append("{").append((char)from); + for(int j = from+step; j < to; j+=step) + sb.append(", ").append((char)j); + sb.append("}"); + }else + + sb.append((char)Integer.parseInt(s)); + } + + // ----- ETAT ----- \\ + +// @Command(name = "show", group = "Contrôle", grp = "ctr", description = "Inverse le status en ligne du bot", admin = true) +// public void show(JDA jda) { +// Presence wow = jda.getPresence(); +// if(wow.getStatus() == OnlineStatus.INVISIBLE) +// wow.setStatus(OnlineStatus.ONLINE); +// else +// wow.setStatus(OnlineStatus.INVISIBLE); +// } +// +// @Command(name = "game", group = "Contrôle", grp = "ctr", description = "Change le jeu courant", admin = true) +// public void game(JDA jda, String[] args) { +// StringBuilder sb = new StringBuilder(); +// for(String arg : args) +// sb.append(arg).append(" "); +// jda.getPresence().setGame(Game.playing(sb.toString())); +// } +// +// @Command(name = "julia", group = "Contrôle", grp = "ctr", description = "Répond à l'appel", admin = true) +// public void julia(MessageChannel channel, User user) { +// String[] julias = new String[]{"Présent !", "Présente !", "Présentbleu !", "Présentavion !", "Présent(e) !", "Présent(bleu) !", +// "Présent(avion) !", "Présent(e)(bleu) !", "Présent(e)(avion) !", "Présent(bleu)(avion) !", "Présent(e)(bleu)(avion) !", +// "Oui, c'est moi", user.getName(), "ailuJ", "42 ... oups", "C'est à moi que tu parle ?!", "Entrez c'est ouvert", "Derrière toi !!!", +// "J'ai tujorous pas cropmis a qoui ca sret l'otrahhgrope ...", "Laissez moi préparer la domination du monde en paix s'il vous plaît !", +// "Je SuIS Un RObot BZzzBzZZZbZZbZZ", "Juliaaaa dadedidadeda dedadedi dadeda", "Tutturu", "Tadaaaaaaa !"}; +// String[] out = new String[]{julias[(int)Math.floor(Math.random() * julias.length)]}; +// +// DiscordBot.sendWithDelay(channel, out); +// } + +} \ No newline at end of file diff --git a/src/com/bernard/discord/addons/Lists.java b/src/com/bernard/discord/addons/Lists.java new file mode 100644 index 0000000..b7290fb --- /dev/null +++ b/src/com/bernard/discord/addons/Lists.java @@ -0,0 +1,126 @@ +package com.bernard.discord.addons; + +public class Lists { + +// @Command(name = "roleColor", group = "Liste", grp = "lst", description = "Composante de la couleur d'un role, a partir d'une mention de ce role, ou d'un membre ayant ce role comme principal", admin = true) +// public void roleColor(Guild guild, MessageChannel channel, Message message) { +// List roles = message.getMentionedRoles(); +// if(roles.size() == 0) { +// List users = message.getMentionedUsers(); +// if(users.size() == 0) +// return; +// roles = guild.getMember(users.get(0)).getRoles(); +// if(roles.size() == 0) +// System.out.println("AAAAAAA"); +// } +// Role role = roles.get(0); +// Color color = role.getColor(); +// +// float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), (float[])null); +// +// EmbedBuilder builder = new EmbedBuilder(); +// builder.setTitle("Color of " + role.getName()); +// builder.setColor(color); +// +// builder.addField("", "", false); +// builder.addField(":closed_book:Red", "" + color.getRed(), true); +// builder.addField(":green_book:Green", "" + color.getGreen(), true); +// builder.addField(":blue_book:Blue", "" + color.getBlue(), true); +// +// builder.addField("", "", false); +// builder.addField(":rainbow:Hue", "" + hsb[0] * 360, true); +// builder.addField(":performing_arts:Saturation", "" + hsb[1], true); +// builder.addField(":flashlight:Brightness", "" + hsb[2], true); +// +// channel.sendMessage(builder.build()).complete(); +// } +// +// @Command(name = "users", group = "Liste", grp = "lst", description = "Liste les membres suivant leur id", admin = true) +// public void users(Guild guild, MessageChannel channel) { +// EmbedBuilder builder = new EmbedBuilder(); +// List ms = guild.getMembers(), members = new ArrayList(ms); +// +// members.sort(new MemberByIDComparator()); +// builder.setTitle("Liste des membres du serveur"); +// +// StringBuilder sb = new StringBuilder(); +// for(int i = 0; i < members.size(); i++) +// sb.append(members.get(i).getUser().getId() + " \"" + members.get(i).getEffectiveName() + "\"\n"); +// +// builder.addField("", sb.toString(), true); +// builder.setColor(DUtils.color); +// +// channel.sendMessage(builder.build()).complete(); +// } +// +// @Command(name = "rolesID", group = "Liste", grp = "lst", description = "Liste les rôles suivant leur ID", admin = true) +// public void rolesID(Guild guild, MessageChannel channel) { +// EmbedBuilder builder = new EmbedBuilder(); +// List ms = guild.getRoles(), roles = new ArrayList(ms); +// +// roles.sort(new RolesByIDComparator()); +// builder.setTitle("Liste des rôles du serveur"); +// +// StringBuilder sb = new StringBuilder(); +// for(int i = 0; i < roles.size(); i++) { +// String roleName = roles.get(i).getName(); +// sb.append(roles.get(i).getIdLong() + " \"" + (roleName.startsWith("@") ? "everyone" : roleName) + "\"\n"); +// } +// +// builder.addField("", sb.toString(), true); +// builder.setColor(DUtils.color); +// +// channel.sendMessage(builder.build()).complete(); +// } +// +// @Command(name = "rolesRank", group = "Liste", grp = "lst", description = "Liste les rôles suivant leur rang", admin = true) +// public void rolesRank(Guild guild, MessageChannel channel) { +// EmbedBuilder builder = new EmbedBuilder(); +// List ms = guild.getRoles(), roles = new ArrayList(ms); +// +// roles.sort(new RolesByRankComparator()); +// builder.setTitle("Liste des rôles du serveur"); +// +// StringBuilder sb = new StringBuilder(); +// for(int i = 0; i < roles.size(); i++) { +// String roleName = roles.get(i).getName(); +// sb.append(roles.get(i).getPosition() + " \"" + (roleName.startsWith("@") ? "everyone" : roleName) + "\"\n"); +// } +// +// builder.addField("", sb.toString(), true); +// builder.setColor(DUtils.color); +// +// channel.sendMessage(builder.build()).complete(); +// } +// +// public class MemberByIDComparator implements Comparator { +// +// public int compare(Member o1, Member o2) { +// if(o1.getUser().getIdLong() > o2.getUser().getIdLong()) +// return 1; +// return -1; +// } +// +// } +// +// public class RolesByIDComparator implements Comparator { +// +// public int compare(Role o1, Role o2) { +// if(o1.getIdLong() > o2.getIdLong()) +// return 1; +// return -1; +// } +// +// } +// +// public class RolesByRankComparator implements Comparator { +// +// public int compare(Role o1, Role o2) { +// if(o1.getPosition() > o2.getPosition()) +// return 1; +// return -1; +// } +// +// } +// +} \ No newline at end of file diff --git a/src/com/bernard/discord/addons/Logs.java b/src/com/bernard/discord/addons/Logs.java new file mode 100644 index 0000000..b189e72 --- /dev/null +++ b/src/com/bernard/discord/addons/Logs.java @@ -0,0 +1,170 @@ +package com.bernard.discord.addons; + +import com.bernard.discord.api.DUtils; + +public class Logs { + +// public long previousEventID; +// +// @Discord(description = "Détecte un message serveur pour le mettre dans les logs") +// public void guildReceived(GuildMessageReceivedEvent event) { +// String eventName; +// if(EventListener.commandIDs.contains(event.getMessage().getIdLong())) { +// eventName = "CommandReceived"; +// int index = EventListener.commandIDs.indexOf(event.getMessageIdLong()); +// EventListener.commandIDs.remove(index); +// } else +// eventName = "MessageReceived"; +// +// StringBuilder s = new StringBuilder(); +// load(s, DUtils.getTime()); +// load(s, event.getResponseNumber()); +// load(s, eventName); +// load(s, "user", event.getAuthor().getName()); +// load(s, "chan", event.getChannel().getName()); +// load(s, "mess", event.getMessage().getContent()); +// sendE(s); +// } +// +// @Discord(description = "Détecte la modification d'un message serveur pour le mettre dans les logs") +// public void guildUpdate(GuildMessageUpdateEvent event) { +// StringBuilder s = new StringBuilder(); +// load(s, DUtils.getTime()); +// load(s, event.getResponseNumber()); +// load(s, "MessageUpdate"); +// load(s, "user", event.getAuthor().getName()); +// load(s, "chan", event.getChannel().getName()); +// load(s, "mess", event.getMessage().getContent()); +// sendE(s); +// } +// +// @Discord(description = "Détecte la supression d'un message serveur pour le mettre dans les logs") +// public void guildDelete(GuildMessageDeleteEvent event) { +// +// if(EventListener.deleteIDs.contains(event.getMessageIdLong())) { +// int index = EventListener.deleteIDs.indexOf(event.getMessageIdLong()); +// EventListener.deleteIDs.remove(index); +// return; +// } +// +// StringBuilder s = new StringBuilder(); +// load(s, DUtils.getTime()); +// load(s, event.getResponseNumber()); +// load(s, "MessageDelete"); +// load(s, "chan", event.getChannel().getName()); +// sendE(s); +// } +// +// @Discord(description = "Détecte une arrivée dans un salon vocal pour le mettre dans les logs") +// public void voiceJoin(GuildVoiceJoinEvent event) { +// StringBuilder s = new StringBuilder(); +// load(s, DUtils.getTime()); +// load(s, event.getResponseNumber()); +// load(s, "GuildVoiceJoin"); +// load(s, "user", event.getMember().getUser().getName()); +// load(s, "chan", event.getChannelJoined().getName()); +// sendV(s); +// } +// +// @Discord(description = "Détecte un changement de salon vocal pour le mettre dans les logs") +// public void voiceMove(GuildVoiceMoveEvent event) { +// StringBuilder s = new StringBuilder(); +// load(s, DUtils.getTime()); +// load(s, event.getResponseNumber()); +// load(s, "VocalMove"); +// load(s, "user", event.getMember().getUser().getName()); +// load(s, "left", event.getChannelLeft().getName()); +// load(s, "join", event.getChannelJoined().getName()); +// sendV(s); +// } +// +// @Discord(description = "Détecte un départ de salon vocal pour le mettre dans les logs") +// public void voiceLeave(GuildVoiceLeaveEvent event) { +// StringBuilder s = new StringBuilder(); +// load(s, DUtils.getTime()); +// load(s, event.getResponseNumber()); +// load(s, "VocalLeave"); +// load(s, "user", event.getMember().getUser().getName()); +// load(s, "chan", event.getChannelLeft().getName()); +// sendV(s); +// } +// +// @Discord(description = "Détecte un changement de status pour le mettre dans les logs") +// public void statusUpdate(UserOnlineStatusUpdateEvent event) { +// StringBuilder s = new StringBuilder(); +// load(s, DUtils.getTime()); +// load(s, event.getResponseNumber()); +// load(s, "StatusUpdate"); +// load(s, "user", event.getUser().getName()); +// load(s, "old", event.getPreviousOnlineStatus()); +// load(s, "new", event.getGuild().getMember(event.getUser()).getOnlineStatus()); +// sendS(s); +// } +// +// @Discord(description = "Détecte un changement de jeu pour le mettre dans les logs") +// public void gameUpdate(UserGameUpdateEvent event) { +// StringBuilder s = new StringBuilder(); +// load(s, DUtils.getTime()); +// load(s, event.getResponseNumber()); +// load(s, "GameUpdate"); +// load(s, "user", event.getUser().getName()); +// +// Game old = event.getPreviousGame(); +// if(old != null) +// load(s, "old", old.getName()); +// +// Game nev = event.getGuild().getMember(event.getUser()).getGame(); +// if(nev != null) +// load(s, "new", nev.getName()); +// +// sendS(s); +// } + + private void load(StringBuilder s, Object value) { + if(s.length() != 0) + separ(s); + if(value != null) + s.append(value); + else + s.append("null"); + } + + private void load(StringBuilder s, String name, Object value) { + if(s.length() != 0) + separ(s); + s.append(name).append("="); + if(value != null) + s.append(value); + else + s.append("null"); + } + + private void separ(StringBuilder s) { + s.append(", "); + } + + private void sendE(StringBuilder s) { + if(s.length() > 1950) { + int length = s.length(); + s.setLength(1950); + s.append("...\""); + load(s, "length", length); + } + DUtils.logE.sendMessage(s.toString()).queue(); + System.out.println(s.toString()); + s.setLength(0); + } + + private void sendV(StringBuilder s) { + DUtils.logV.sendMessage(s.toString()).queue(); + System.out.println(s.toString()); + s.setLength(0); + } + + private void sendS(StringBuilder s) { + DUtils.logS.sendMessage(s.toString()).queue(); + System.out.println(s.toString()); + s.setLength(0); + } + +} \ No newline at end of file diff --git a/src/com/bernard/discord/addons/MegaNumber.java b/src/com/bernard/discord/addons/MegaNumber.java new file mode 100644 index 0000000..df92185 --- /dev/null +++ b/src/com/bernard/discord/addons/MegaNumber.java @@ -0,0 +1,157 @@ +package com.bernard.discord.addons; + +import java.util.ArrayList; +import java.util.Stack; + +import com.bernard.discord.api.Command; +import com.bernard.meganumber.arithmetic.MegaN; +import com.bernard.meganumber.arithmetic.RadixConversion; + +import net.dv8tion.jda.core.entities.MessageChannel; + +public class MegaNumber { + + private static RadixConversion converter = new RadixConversion(); + + @Command(name = "calct", group = "MegaNumber", grp = "mn", description = "Comprends un calcul et en fournit le résultat. Elements actuellement compris :\n" + + "\t- Sommes et produits explicites\n" + "\t- Entiers naturels en développement décimal propre\n" + + "\t- Système de parenthésages corrects", admin = false) + public void calct(MessageChannel channel, String[] args) { + try { + String su = args[0]; + for(int i = 1; i < args.length; i++) + su += " " + args[i]; + String s = su.replaceAll("\\(", " ( "); + s = s.replaceAll("\\)", " ) "); + s = s.replaceAll("\\*", " * "); + s = s.replaceAll("\\+", " + "); + s = s.replaceAll("\\^", " ^ "); + String ss = ""; + while(!ss.equals(s)) { + ss = s; + s = s.replaceAll(" ", " "); + } + String[] tokens = s.split(" "); + ArrayList liste = new ArrayList(); + for(int i = 0; i < tokens.length; i++) + liste.add(tokens[i]); + + Stack operator = new Stack(); + Stack out = new Stack(); + boolean prio = false; + + for(int i = 0; i < liste.size(); i++) { + + String token = liste.get(i); + + if(!operator.isEmpty()) { + if("+".equals(token) && "*".equals(operator.peek()) || "*".equals(token) && "^".equals(operator.peek()) || "+".equals(token) + && "^".equals(operator.peek())) { + out.push(operator.pop()); + operator.push(token); + prio = true; + } + } + + if(!prio) + try { + MegaN n = new MegaN(token); + out.push(n); + } catch(NumberFormatException nfe) { + if(")".equals(token)) { + while(!"(".equals(operator.peek())) + out.push(operator.pop()); + + operator.pop(); + } else + operator.push(token); + } + prio = false; + } + + while(operator.isEmpty() == false) + if(")".equals(operator.peek()) || "(".equals(operator.peek())) + operator.pop(); + else + out.push(operator.pop()); + + Stack out2 = new Stack(); + while(out.size() > 0) + out2.push(out.pop()); + + Stack out3 = new Stack(); + while(out2.size() > 0) + if(out2.peek() instanceof MegaN) + out3.push((MegaN)out2.pop()); + else { + String ope = "" + out2.pop(); + if(ope.equals("+")) { + MegaN n2 = out3.pop(); + MegaN n1 = out3.pop(); + MegaN n3 = MegaN.add(n1, n2); + // System.out.println(n1+" + "+n2+" = "+n3); + out3.push(n3); + } else if(ope.equals("*")) { + MegaN n2 = out3.pop(); + MegaN n1 = out3.pop(); + MegaN n3 = MegaN.mul(n1, n2); + // System.out.println(n1+" * "+n2+" = "+n3); + out3.push(n3); + } else if(ope.equals("^")) { + MegaN n2 = out3.pop(); + MegaN n1 = out3.pop(); + MegaN n3 = MegaN.pow(n1, n2); + // System.out.println(n1+" ^ "+n2+" = "+n3); + out3.push(n3); + } + } + channel.sendMessage(su.replaceAll("\\*", "\\\\*") + " = " + out3.peek().toString()).complete(); + } catch(Exception e) { + System.err.println("calc"); + e.printStackTrace(); + } + } + +// @Command(name = "add", group = "MegaNumber", grp = "mn", description = "Additionne les entiers en arguments", admin = false) +// public void add(String[] args, MessageChannel channel) { +// MegaN[] ns = new MegaN[args.length]; +// ns[0] = new MegaN(args[0]); +// StringBuilder sb = new StringBuilder(args[0]); +// for(int i = 1; i < args.length; i++) { +// sb.append(" + ").append(args[i]); +// ns[i] = new MegaN(args[i]); +// } +// channel.sendMessage(sb.append(" = ").append(MegaN.add(ns)).toString()).complete(); +// } +// +// @Command(name = "mul", group = "MegaNumber", grp = "mn", description = "Multiplie les entiers en arguments", admin = false) +// public void mul(String[] args, MessageChannel channel) { +// MegaN[] ns = new MegaN[args.length]; +// ns[0] = new MegaN(args[0]); +// StringBuilder sb = new StringBuilder(args[0]); +// for(int i = 1; i < args.length; i++) { +// sb.append(" * ").append(args[i]); +// ns[i] = new MegaN(args[i]); +// } +// channel.sendMessage(sb.append(" # ").append(MegaN.mul(ns)).toString()).complete(); +// } + + @Command(name = "pow", group = "MegaNumber", grp = "mn", description = "Renvoie le résultat du deuxième entier mis en exposant du premier", admin = false) + public void pow(String[] args, MessageChannel channel) { + channel.sendMessage(new StringBuilder(args[0]).append(" ^ ").append(args[1]).append(" = ").append(MegaN.pow(new MegaN(args[0]), new MegaN( + args[1]))).toString()).complete(); + } + +// @Command(name = "10to2", group = "MegaNumber", grp = "mn", description = "Convertit l'argument décimal en binaire", admin = false) +// public void dTOb(String[] args, MessageChannel channel) { +// String binaire = converter.decimalToBinary(args[0]); +// channel.sendMessage("0d" + args[0] + " -> 0b" + binaire).complete(); +// } +// +// @Command(name = "2to10", group = "MegaNumber", grp = "mn", description = "Convertit l'argument binaire en décimal", admin = false) +// public void bTOd(String[] args, MessageChannel channel) { +// String decimal = converter.binaryToDecimal(args[0]); +// channel.sendMessage("0b" + args[0] + " -> 0d" + decimal).complete(); +// } + +} \ No newline at end of file diff --git a/src/com/bernard/discord/addons/Rigolos.java b/src/com/bernard/discord/addons/Rigolos.java new file mode 100644 index 0000000..0baee58 --- /dev/null +++ b/src/com/bernard/discord/addons/Rigolos.java @@ -0,0 +1,48 @@ +package com.bernard.discord.addons; + +import com.bernard.discord.DiscordBot; +import com.bernard.discord.api.DUtils; +import com.bernard.discord.api.Discord; + +import net.dv8tion.jda.core.OnlineStatus; +import net.dv8tion.jda.core.entities.*; +import net.dv8tion.jda.core.events.message.MessageReceivedEvent; +import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; +import net.dv8tion.jda.core.events.user.UserOnlineStatusUpdateEvent; + +public class Rigolos { + + @Discord(description = "Réagi à l'apparition d'un Samy") + public void pouet(UserOnlineStatusUpdateEvent event) { + if(event.getUser().getIdLong() == 229320114321752075L) { // Samy + Guild guild = event.getGuild(); + Member m = guild.getMemberById(232545563407548416L); // Moua + User u = m.getUser(); + PrivateChannel pc = u.openPrivateChannel().complete(); + String psn = event.getPreviousOnlineStatus().name(); + String asn = guild.getMember(event.getUser()).getOnlineStatus().name(); + pc.sendMessage(psn + " -> " + asn).complete(); + } + } + + @Discord(description = "Répond \"pouet\" à tout les messages de Christine") + public void pouet(GuildMessageReceivedEvent event) { + if(event.getAuthor().getIdLong() == 321977394565087235L) // Christine + DiscordBot.sendWithDelay(event.getChannel(), "pouet"); + } + + @Discord(description = "Envoie \"*Dieu arrive*\" quand Yukimyo se connecte") + public void dieu(UserOnlineStatusUpdateEvent event) { + if(event.getUser().getIdLong() == 187677269626585089L) // Arthur + if(event.getPreviousOnlineStatus() == OnlineStatus.OFFLINE) + DiscordBot.sendWithDelay(DUtils.ppublique, "*Dieu arrive*"); + } + + @Discord(description = "Réagi à l'apparition d'un \"wow\"") + public void wow(MessageReceivedEvent event) { + if(event.getAuthor().getIdLong() != 359788121795198977L) // JuLIA + if(event.getMessage().getContent().contains("wow")) + event.getChannel().sendMessage("wow").complete(); + } + +} \ No newline at end of file diff --git a/src/com/bernard/discord/addons/Votes.java b/src/com/bernard/discord/addons/Votes.java new file mode 100644 index 0000000..c1ae61f --- /dev/null +++ b/src/com/bernard/discord/addons/Votes.java @@ -0,0 +1,111 @@ +package com.bernard.discord.addons; + +import java.util.*; + +import com.bernard.discord.api.Command; +import com.bernard.discord.api.Discord; + +import net.dv8tion.jda.core.EmbedBuilder; +import net.dv8tion.jda.core.entities.*; +import net.dv8tion.jda.core.events.message.react.MessageReactionAddEvent; + +public class Votes { + + @Discord(description = "") + public void addReac(MessageReactionAddEvent e, MessageChannel chan) { + System.out.println(e.getReaction().toString()); + Vote v = Vote.getByQuestionID(e.getMessageIdLong()); + if(v == null) + return; + + MessageReaction r = e.getReaction(); + System.out.println(e.getReactionEmote().getName()); + // long emoteID = + + // if(!v.emoteIDs.contains(emoteID)) + // return; + + // v.userEmoteIDs.put(e.getUser().getIdLong(), emoteID); + + r.removeReaction(e.getUser()).complete(); + + v.refreshResult(); + } + + @Command(name = "newPoll", group = "", grp = "", description = "", admin = true) + public void newPoll(MessageChannel chan, Message m, Guild g) { +// Message r = chan.sendMessage(" - ").complete(); + + String[] args = m.getContent().split("!!newPoll")[1].split(","); + String[] emotes = new String[args.length/2]; + int emoteCount = 0; + String[] descrs = new String[args.length/2]; + int descrCount = 0; + + + for(String arg : args) { + arg = arg.trim(); + if(arg.contains("\"")) { + System.out.println("oui"+arg.replace("\"", "")); + emotes[emoteCount++] = arg.replace("\"", ""); + } else { + System.out.println("non"+arg); + descrs[descrCount++] = arg; + } + } + + EmbedBuilder e = new EmbedBuilder(); + for(int i = 0; i < emotes.length; i++) { + System.out.println("\""+descrs[i] + "\" et \""+emotes[i]+"\""); + e.addField(descrs[i], emotes[i], true); + } + Message q = chan.sendMessage(e.build()).complete(); + for(int i = 0; i < emotes.length; i++) { + q.rea + q.addReaction(emotes[i]).complete(); + } + +// MessageReaction.ReactionEmote emote = reaction.getReactionEmote(); +// +// return emote.isEmote() +// ? emote.getName() + ":" + emote.getId() +// : MiscUtil.encodeUTF8(emote.getName()); + +// new Vote(q.getIdLong(), r, emoteIDs); + } + + public static class Vote { + static ArrayList votes = new ArrayList(); + Map userEmoteIDs = new HashMap(); + List emoteIDs; + long questionID; + Message result; + + public Vote(long questionID_, Message result_, List emoteIDs_) { + votes.add(this); + emoteIDs = emoteIDs_; + questionID = questionID_; + result = result_; + } + + public void refreshResult() { + EmbedBuilder e = new EmbedBuilder(); + for(long emoteID : emoteIDs) { + int count = 0; + for(long userEmoteID : userEmoteIDs.values()) + if(userEmoteID == emoteID) + count++; + e.addField("" + 471290594732408832L, "" + count, false); + } + result.editMessage(e.build()); + } + + public static Vote getByQuestionID(long questionID) { + for(Vote v : votes) + if(v.questionID == questionID) + return v; + return null; + } + } + +} \ No newline at end of file diff --git a/src/com/bernard/discord/addons/Wow.java b/src/com/bernard/discord/addons/Wow.java new file mode 100644 index 0000000..6a6bfaa --- /dev/null +++ b/src/com/bernard/discord/addons/Wow.java @@ -0,0 +1,29 @@ +package com.bernard.discord.addons; + +import com.bernard.discord.api.Command; + +import net.dv8tion.jda.core.Permission; +import net.dv8tion.jda.core.entities.*; + +public class Wow { + +// @Command(name = "chan", group = "", grp = "", description = "", admin = true) +// public void chan(MessageChannel chan) { +// OffsetDateTime wow = chan.getCreationTime(); +// chan.sendMessage(wow.getYear()+"/"+wow.getMonthValue()+"/"+wow.getDayOfMonth()).complete().delete().queueAfter(15, TimeUnit.SECONDS); +// } +// + + @Command(name = "admin", group = "", grp = "", description = "", admin = true) + public void admin(Member m, Guild g) { + Role r = g.getRolesByName("Dieu discret", false).get(0); + if(!m.getRoles().contains(r)) + return; + + if(r.hasPermission(Permission.ADMINISTRATOR)) + r.getManager().revokePermissions(Permission.ADMINISTRATOR); + else + r.getManager().givePermissions(Permission.ADMINISTRATOR); + } + +} \ No newline at end of file diff --git a/src/com/bernard/discord/api/Command.java b/src/com/bernard/discord/api/Command.java new file mode 100644 index 0000000..6c2e591 --- /dev/null +++ b/src/com/bernard/discord/api/Command.java @@ -0,0 +1,16 @@ +package com.bernard.discord.api; + +import java.lang.annotation.*; + +@Target(value = ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Command { + + public String name(); + public String[] aliases() default {}; + public String description(); + public String grp(); + public String group(); + public boolean admin();//TODO a remplacer par les permissions + +} \ No newline at end of file diff --git a/src/com/bernard/discord/api/DUtils.java b/src/com/bernard/discord/api/DUtils.java new file mode 100644 index 0000000..405e29f --- /dev/null +++ b/src/com/bernard/discord/api/DUtils.java @@ -0,0 +1,86 @@ +package com.bernard.discord.api; + +import java.awt.Color; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.*; + +import org.reflections.Reflections; +import org.reflections.scanners.MethodAnnotationsScanner; + +import com.bernard.discord.struct.CommandMap; + +import net.dv8tion.jda.core.JDA; +import net.dv8tion.jda.core.entities.*; + +public class DUtils { + + public static CommandMap commands; + public static com.bernard.discord.struct.EventListener events; + public static Color color = new Color(113, 82, 182);; + public static String tag; + public static JDA jda; + public static Guild server; + public static TextChannel logS; + public static TextChannel logE; + public static TextChannel logV; + public static TextChannel test; + public static TextChannel juliadmin; + public static TextChannel ppublique; + public static Role matrixWriter; + public static Reflections reflections; + + public static void init(JDA jdap, String tagp) { + tag = tagp; + jda = jdap; + server = jda.getGuildById(222947179017404416L); + logS = server.getTextChannelById(361480293682774047L); + logE = server.getTextChannelById(281843607168745473L); + logV = server.getTextChannelById(361505020815867904L); + test = server.getTextChannelById(278296310891937792L); + juliadmin = server.getTextChannelById(395637091364634625L); + matrixWriter = server.getRoleById(402574932132757534L); + ppublique = server.getTextChannelById(222947179017404416L); + reflections = new Reflections(".*", new MethodAnnotationsScanner()); + } + + public static void loadMaps(CommandMap commandsp, com.bernard.discord.struct.EventListener eventsp) { + commands = commandsp; + events = eventsp; + } + + public static String getTime() { + Locale locale = new Locale("FR", "fr"); + Calendar calendar = Calendar.getInstance(locale); + Date date = calendar.getTime(); + DateFormat fFormat = new SimpleDateFormat("HH:mm:ss"); + DateFormat dFormat = new SimpleDateFormat("E"); + + String fDate = "", fHeur = ""; + fHeur = fFormat.format(date); + fDate = dayFromFR(dFormat.format(date)) + " "; + return fDate + fHeur; + } + + private static String dayFromFR(String fr) { + switch(fr) { + case "lun.": + return "Mon"; + case "mar.": + return "Tue"; + case "mer.": + return "Wed"; + case "jeu.": + return "Thu"; + case "ven.": + return "Fri"; + case "sam.": + return "Sat"; + case "dim.": + return "Sun"; + default: + return fr; + } + } + +} \ No newline at end of file diff --git a/src/com/bernard/discord/api/Discord.java b/src/com/bernard/discord/api/Discord.java new file mode 100644 index 0000000..d67d2e3 --- /dev/null +++ b/src/com/bernard/discord/api/Discord.java @@ -0,0 +1,11 @@ +package com.bernard.discord.api; + +import java.lang.annotation.*; + +@Target(value = ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Discord { + + public String description(); + +} \ No newline at end of file diff --git a/src/com/bernard/discord/struct/CommandMap.java b/src/com/bernard/discord/struct/CommandMap.java new file mode 100644 index 0000000..3d71a2a --- /dev/null +++ b/src/com/bernard/discord/struct/CommandMap.java @@ -0,0 +1,243 @@ +package com.bernard.discord.struct; + +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.*; +import java.util.Map.Entry; + +import org.reflections.Reflections; + +import com.bernard.discord.DiscordBot; +import com.bernard.discord.api.Command; +import com.bernard.discord.api.DUtils; + +import net.dv8tion.jda.core.JDA; +import net.dv8tion.jda.core.entities.*; + +public final class CommandMap { + + private final Map commands; + private final Map objects; + String tag; + + public CommandMap(DiscordBot bot, String tag, EventListener listener) { + System.out.println("[" + DUtils.getTime() + "] [Info] [ZLO]: Command map is being created"); + objects = new HashMap<>(); + commands = new HashMap<>(); + this.tag = tag; + + objects.put(getClass(), this); + objects.put(listener.getClass(), listener); + objects.put(bot.getClass(), bot); + addCommands(); + + StringBuilder sb = new StringBuilder(); + for(Entry entry : commands.entrySet()) + sb.append(entry.getKey()).append(" "); + + System.out.println("[" + DUtils.getTime() + "] [Info] [ZLO]: Command map has been created with " + commands.size() + " commands :\n\t" + sb + .toString() + "\n"); + } + + private void addCommands() { + Reflections reflections = DUtils.reflections; + Set methods = reflections.getMethodsAnnotatedWith(Command.class); + for(Method method : methods) { + if(method.isAnnotationPresent(Command.class)) { + boolean error = false; + try { + Class clazz = method.getDeclaringClass(); + Command command = method.getAnnotation(Command.class); + method.setAccessible(true); + CommandObject simpleCommand = null; + if(!objects.containsKey(clazz)) + try { + objects.put(clazz, clazz.newInstance()); + } catch(InstantiationException | IllegalAccessException e1) { + e1.printStackTrace(); + } + Object object = objects.get(clazz); + + try { + simpleCommand = new CommandObject(command.name(), command.description(), command.group(), command.grp(), command.admin(), + object, method); + } catch(Exception e) { + e.printStackTrace(); + } + commands.put(simpleCommand.getName(), simpleCommand); + } catch(Exception e) { + error = true; + System.err.println("\n" + e.getClass().getSimpleName() + " while loading " + method.getDeclaringClass().getName() + "." + method + .getName() + "() : "); + e.printStackTrace(); + System.err.println(); + } + if(!error) + System.out.println("\t" + method.getDeclaringClass().getSimpleName() + "." + method.getName() + + "() have been successfully loaded"); + + } + } + System.out.println(); + } + + public void commandConsole(String command) { + Object[] object = getCommand(command); + if(object[0] == null) { + try{ + throw new IllegalArgumentException("La methode \"" + command + "\" n'existe pas "); + }catch(Exception e) { + e.printStackTrace(); + } + return; + } + new Thread("Console Command Thread") { + public void run() { + try { + execute(((CommandObject)object[0]), command, (String[])object[1], null); + } catch(Exception e) { + e.printStackTrace(); + } + } + }.start(); + } + + public boolean commandUser(Member member, Message message, Guild guild) { + String command = message.getContent(); + if(!command.startsWith(tag)) + return false; + + EventListener.commandIDs.add(message.getIdLong()); + EventListener.deleteIDs.add(message.getIdLong()); + + String command2 = command.replaceFirst(tag, ""); + Object[] object = getCommand(command2); + if(object[0] == null) + return false; + + if(((CommandObject)object[0]).isAdmin() && !member.getRoles().contains(DUtils.matrixWriter)) + return false; + + new Thread("User Command Thread") { + public void run() { + try { + execute(((CommandObject)object[0]), command2, (String[])object[1], message); + } catch(Exception e) { + e.printStackTrace(); + } + } + }.start(); + return true; + } + + private Object[] getCommand(String command) { + String[] commandSplit = command.split(" "); + String[] args = new String[commandSplit.length - 1]; + for(int i = 1; i < commandSplit.length; i++) + args[i - 1] = commandSplit[i]; + CommandObject simpleCommand = commands.get(commandSplit[0]); + return new Object[]{simpleCommand, args}; + } + + private void execute(CommandObject simpleCommand, String command, String[] args, Message message) throws Exception { + Parameter[] parameters = simpleCommand.getMethod().getParameters(); + Object[] objects = new Object[parameters.length]; + for(int i = 0; i < parameters.length; i++) { + if(parameters[i].getType() == String[].class) + objects[i] = args; + else if(parameters[i].getType() == User.class) + objects[i] = message == null ? null : message.getAuthor(); + else if(parameters[i].getType() == Member.class) + objects[i] = message == null ? null : DUtils.server.getMember(message.getAuthor()); + else if(parameters[i].getType() == TextChannel.class) + objects[i] = message == null ? null : message.getTextChannel(); + else if(parameters[i].getType() == PrivateChannel.class) + objects[i] = message == null ? null : message.getPrivateChannel(); + else if(parameters[i].getType() == Guild.class) + objects[i] = message == null ? null : DUtils.server; + else if(parameters[i].getType() == String.class) + objects[i] = command; + else if(parameters[i].getType() == Message.class) + objects[i] = message; + else if(parameters[i].getType() == JDA.class) + objects[i] = DUtils.jda; + else if(parameters[i].getType() == MessageChannel.class) + objects[i] = message == null ? null : message.getChannel(); + else if(parameters[i].getType() == TextChannel[].class) + objects[i] = new TextChannel[]{DUtils.logS, DUtils.logE, DUtils.logV}; + // System.out.println("objects["+i+"] prend la valeur "+objects[i]); + } + + simpleCommand.getMethod().invoke(simpleCommand.getObject(), objects); + } + +// @Command(name = "help", group = "Help", grp = "hlp", description = "Affiche la liste des commandes existantes", admin = false) +// public void help(Member member, Guild guild, MessageChannel channel, String[] args) { +// ArrayList groups = new ArrayList(); +// ArrayList grps = new ArrayList(); +// for(CommandObject command : commands.values()) +// if(!groups.contains(command.getGroup())) { +// groups.add(command.getGroup()); +// grps.add(command.getGrp()); +// } +// +// String[] groupss = new String[groups.size()]; +// String[] grpss = new String[groups.size()]; +// for(int i = 0; i < groupss.length; i++) { +// groupss[i] = groups.get(i); +// grpss[i] = grps.get(i); +// } +// +// User user = member.getUser(); +// if(!user.hasPrivateChannel()) +// user.openPrivateChannel().complete(); +// +// EmbedBuilder eB = new EmbedBuilder(); +// eB.setColor(DUtils.color); +// +// boolean isGrp = args.length > 0; +// if(isGrp) +// isGrp = grps.contains(args[0]); +// boolean isGroup = args.length > 0; +// if(isGroup) +// isGroup = groups.contains(args[0]); +// +// if(isGroup || isGrp) { +// String grp = isGrp ? args[0] : grps.get(groups.indexOf(args[0])); +// String group = isGroup ? args[0] : groups.get(grps.indexOf(args[0])); +// eB.setTitle("Liste des commandes du groupe " + group + " ( " + grp + ")"); +// for(CommandObject command : commands.values()) { +// if(command.getGroup().equals(group)) +// if(!command.isAdmin() || member.getRoles().contains(DUtils.matrixWriter)) +// eB.addField(command.getName(), command.getDescription(), false); +// } +// } else { +// eB.setTitle("Liste des groupes de commande"); +// +// boolean[] hasCommand = new boolean[groupss.length]; +// for(int i = 0; i < groupss.length; i++) +// hasCommand[i] = false; +// +// for(CommandObject command : commands.values()) +// if(!command.isAdmin() || member.getRoles().contains(DUtils.matrixWriter)) +// hasCommand[groups.indexOf(command.getGroup())] |= true; +// for(int i = 0; i < groups.size(); i++) { +// if(hasCommand[i]) { +// String group = groupss[i]; +// String grp = grpss[i]; +// StringBuilder commandsList = new StringBuilder(); +// for(CommandObject command : commands.values()) { +// if(command.getGroup().equals(group)) { +// if(!command.isAdmin() || member.getRoles().contains(DUtils.matrixWriter)) +// commandsList.append(command.getName()).append(", "); +// } +// } +// eB.addField(group + " ( " + grp + " )", commandsList.toString(), false); +// } +// } +// } +// // channel.sendMessage(eB.build()).complete(); +// ((UserImpl)user).getPrivateChannel().sendMessage(eB.build()).queue(); +// } + +} \ No newline at end of file diff --git a/src/com/bernard/discord/struct/CommandObject.java b/src/com/bernard/discord/struct/CommandObject.java new file mode 100644 index 0000000..152612c --- /dev/null +++ b/src/com/bernard/discord/struct/CommandObject.java @@ -0,0 +1,51 @@ +package com.bernard.discord.struct; + +import java.lang.reflect.Method; + +public class CommandObject { + + private final String group, grp, name, description; + private final boolean admin; + private final Object object; + private final Method method; + + public CommandObject(String name, String desc, String group, String grp, boolean admin, Object object, Method method) { + // this.fullName = (group.equals("")?"":(group+":")) + name; + this.name = name; + this.group = group; + this.grp = grp; + this.description = desc; + this.admin = admin; + this.object = object; + this.method = method; + } + + public String getGrp() { + return grp; + } + + public String getName() { + return name; + } + + public String getGroup() { + return group; + } + + public String getDescription() { + return description; + } + + public boolean isAdmin() { + return admin; + } + + public Object getObject() { + return object; + } + + public Method getMethod() { + return method; + } + +} \ No newline at end of file diff --git a/src/com/bernard/discord/struct/EventListener.java b/src/com/bernard/discord/struct/EventListener.java new file mode 100644 index 0000000..2f64ea0 --- /dev/null +++ b/src/com/bernard/discord/struct/EventListener.java @@ -0,0 +1,193 @@ +package com.bernard.discord.struct; + +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.reflections.Reflections; + +import com.bernard.discord.DiscordBot; +import com.bernard.discord.api.DUtils; +import com.bernard.discord.api.Discord; + +import net.dv8tion.jda.core.events.Event; +import net.dv8tion.jda.core.events.ReconnectedEvent; +import net.dv8tion.jda.core.events.message.MessageReceivedEvent; +import net.dv8tion.jda.core.events.message.guild.GuildMessageReceivedEvent; +import net.dv8tion.jda.core.events.message.priv.PrivateMessageReceivedEvent; + +public class EventListener implements net.dv8tion.jda.core.hooks.EventListener { + + private final DiscordBot bot; + private final Map events; + private final Map objects; +// private final Logs log = new Logs(); + public static ArrayList commandIDs = new ArrayList(); + public static ArrayList deleteIDs = new ArrayList(); + + private boolean waitPrivate = false, waitGuild = false; + private int eventCount = 0; + private long lastEventID = -10; + private String lastEventType = "null"; + + public EventListener(DiscordBot bot) { + System.out.println("[" + DUtils.getTime() + "] [Info] [ZLO]: Event listener is being created"); + objects = new HashMap<>(); + events = new HashMap<>(); + objects.put(getClass(), this); + objects.put(bot.getClass(), bot); + addEvents(); + + this.bot = bot; + System.out.println("[" + DUtils.getTime() + "] [Info] [ZLO]: Event listener has been created with " + events.size() + " events\n"); + } + + public void onEvent(Event event) { + try{ + if(!bot.running) + if(bot.countDown++ == 5) + return; + + if(event.getResponseNumber() > 0) { + if(event.getResponseNumber() < lastEventID) { + if(!(event instanceof ReconnectedEvent)) { + bot.running = false; + bot.stop(lastEventType + "(" + lastEventID + ") ->" + event.getClass().getSimpleName() + "(" + event.getResponseNumber() + ")"); + } + } + lastEventID = event.getResponseNumber(); + lastEventType = event.getClass().getSimpleName(); + } + + if(event instanceof MessageReceivedEvent) + return; + if(event instanceof GuildMessageReceivedEvent) { + GuildMessageReceivedEvent event2 = (GuildMessageReceivedEvent)event; + if(event2.getChannel().getName().startsWith("logs")) + return; + if(DUtils.commands.commandUser(DUtils.server.getMember(event2.getAuthor()), event2.getMessage(), DUtils.server)) + event2.getMessage().delete().complete(); + } + if(event instanceof PrivateMessageReceivedEvent) { + PrivateMessageReceivedEvent event2 = (PrivateMessageReceivedEvent)event; + DUtils.commands.commandUser(DUtils.server.getMember(event2.getAuthor()), event2.getMessage(), DUtils.server); + } + + ArrayList eventsConcerned = new ArrayList(); + for(Entry entry : events.entrySet()) + if(entry.getKey().startsWith(event.getClass().getSimpleName())) + eventsConcerned.add(entry.getValue()); + for(EventObject object : eventsConcerned) + new Thread("User Event Thread") { + public void run() { + try { + execute(object, event); + } catch(Exception e) { + e.printStackTrace(); + } + } + }.start(); + +// log.previousEventID = event.getResponseNumber(); + }catch(Exception e) { + System.err.println("listener"); + e.printStackTrace(); + } + } + + private void addEvents() { + Reflections reflections = DUtils.reflections; + Set methods = reflections.getMethodsAnnotatedWith(Discord.class); + label: for(Method method : methods) { + if(method.isAnnotationPresent(Discord.class)) { + boolean error = false; + try { + Class clazz = method.getDeclaringClass(); + Discord event = method.getAnnotation(Discord.class); + method.setAccessible(true); + EventObject simpleEvent = null; + if(!objects.containsKey(clazz)) + try { + objects.put(clazz, clazz.newInstance()); + } catch(InstantiationException | IllegalAccessException e1) { + e1.printStackTrace(); + } + Object object = objects.get(clazz); + + try { + int i = 0; + for(Class p : method.getParameterTypes()) + if(Event.class.isAssignableFrom(p)) + i++; + if(i > 1) { + System.err.println(clazz.getSimpleName() + " : " + method.getName()); + System.err.println(i + " events en m�me temps... La simultan�it� est relative, non ?"); + continue label; + } + if(i == 0) { + System.err.println(""); + System.err.println("Pas d'event en argument ! Tu fait tout �a pour surveiller... rien ?!"); + continue label; + } + Class clu = null; + for(Class p : method.getParameterTypes()) + if(Event.class.isAssignableFrom(p)) + clu = p; + simpleEvent = new EventObject(clu, object, event.description(), method); + } catch(Exception e) { + e.printStackTrace(); + } + events.put(simpleEvent.getClazz().getSimpleName() + eventCount++, simpleEvent); + } catch(Exception e) { + error = true; + System.err.println("\n" + e.getClass().getSimpleName() + " while loading " + method + .getDeclaringClass().getName() + "." + method.getName()+"() : "); + e.printStackTrace(); + System.err.println(); + } + if(!error) + System.out.println("\t" + method.getDeclaringClass().getSimpleName() + "." + method.getName() + "() have been successfully loaded"); + + } + } + } + + private void execute(EventObject simpleEvent, Event event) throws Exception { + // PrintStream + Parameter[] parameters = simpleEvent.getMethod().getParameters(); + Object[] objects = new Object[parameters.length]; + for(int i = 0; i < parameters.length; i++) { + if(Event.class.isAssignableFrom(parameters[i].getType())) + objects[i] = event; + } + + simpleEvent.getMethod().invoke(simpleEvent.getObject(), objects); + } + + // @Command(name = "helpEvent", group = "Help", grp = "hlp", description = + // "Affiche la liste des events existants", admin = true) + // public void helpEvent(Member member, Guild guild, MessageChannel channel) + // { + // try { + // EmbedBuilder eB = new EmbedBuilder(); + // eB.setTitle("Liste des events: "); + // eB.setColor(DUtils.color); + // + // User user = member.getUser(); + // if(!user.hasPrivateChannel()) + // user.openPrivateChannel().complete(); + // + // for(Entry entry : events.entrySet()) + // eB.addField(entry.getKey().toString(), + // ((EventObject)entry.getValue()).getDescription(), false); + // ((UserImpl)user).getPrivateChannel().sendMessage(eB.build()).queue(); + // } catch(Exception e) { + // e.printStackTrace(); + // } + // } + +} \ No newline at end of file diff --git a/src/com/bernard/discord/struct/EventObject.java b/src/com/bernard/discord/struct/EventObject.java new file mode 100644 index 0000000..db7b751 --- /dev/null +++ b/src/com/bernard/discord/struct/EventObject.java @@ -0,0 +1,35 @@ +package com.bernard.discord.struct; + +import java.lang.reflect.Method; + +public class EventObject { + + private final Class clazz; + private final Object object; + private final Method method; + private final String description; + + public EventObject(Class clazz, Object object, String description, Method method) { + this.clazz = clazz; + this.object = object; + this.description = description; + this.method = method; + } + + public Class getClazz() { + return clazz; + } + + public Object getObject() { + return object; + } + + public Method getMethod() { + return method; + } + + public String getDescription() { + return description; + } + +} \ No newline at end of file