From 8da5d0b0372461e85c86595d65dbab4d8f9871d6 Mon Sep 17 00:00:00 2001 From: Mysaa Date: Mon, 12 Jul 2021 02:11:41 +0200 Subject: [PATCH] =?UTF-8?q?L'addon=20est=20maintenant=20fonctionnel,=20?= =?UTF-8?q?=C3=A0=20peu=20pr=C3=A8s=20^^?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 - .../bernard/julianatheme/EventReciever.java | 3 + .../julianatheme/JuliAnathemeManager.java | 90 ++++++++++--------- .../anathemes/StopTalkingAnatheme.java | 7 -- 4 files changed, 53 insertions(+), 49 deletions(-) diff --git a/build.gradle b/build.gradle index d637bfe..bf47168 100644 --- a/build.gradle +++ b/build.gradle @@ -48,8 +48,6 @@ dependencies { implementation group: 'org.postgresql', name: 'postgresql', version: '42.2.22' - implementation group: 'org.reflections', name: 'reflections', version: '0.9.11' - implementation name:'JuliabotAPI' //implementation name:'JuLSoundbox' diff --git a/src/com/bernard/julianatheme/EventReciever.java b/src/com/bernard/julianatheme/EventReciever.java index c9afb2b..d7c584c 100644 --- a/src/com/bernard/julianatheme/EventReciever.java +++ b/src/com/bernard/julianatheme/EventReciever.java @@ -2,9 +2,12 @@ package com.bernard.julianatheme; import static java.lang.annotation.ElementType.METHOD; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(METHOD) +@Retention(RetentionPolicy.RUNTIME) public @interface EventReciever { } diff --git a/src/com/bernard/julianatheme/JuliAnathemeManager.java b/src/com/bernard/julianatheme/JuliAnathemeManager.java index 87a9a84..f34b5d6 100644 --- a/src/com/bernard/julianatheme/JuliAnathemeManager.java +++ b/src/com/bernard/julianatheme/JuliAnathemeManager.java @@ -3,6 +3,8 @@ package com.bernard.julianatheme; import java.awt.Color; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; @@ -11,13 +13,11 @@ import java.util.Map.Entry; import java.util.Set; import java.util.regex.Pattern; -import org.reflections.Reflections; -import org.reflections.scanners.SubTypesScanner; - import com.bernard.juliabot.api.Command; import com.bernard.juliabot.api.Discord; import com.bernard.juliabot.api.DiscordCCommande; import com.bernard.juliabot.api.JuLIAddon; +import com.bernard.juliabot.api.Trukilie; import com.bernard.julianatheme.JuLIAnatheme.InvalidAnathemDescriptionException; import net.dv8tion.jda.api.EmbedBuilder; @@ -28,6 +28,7 @@ import net.dv8tion.jda.api.entities.Message; import net.dv8tion.jda.api.entities.MessageChannel; import net.dv8tion.jda.api.entities.User; import net.dv8tion.jda.api.events.Event; +import net.dv8tion.jda.api.events.GenericEvent; @JuLIAddon(name = "julianatheme",devs="Mysaa",version = "20w33a") public class JuliAnathemeManager { @@ -36,28 +37,21 @@ public class JuliAnathemeManager { Map,Set> anathemes = new HashMap<>(); static Map> registeredAnathemes = new HashMap<>(); + static Map nomsDAffichage = new HashMap<>(); static Map,Set> registeredEvents = new HashMap<>(); public static final String anathemeNamePattern = "^[a-zA-Z0-9_-]*$"; public JuliAnathemeManager() { System.out.println("Instanciation du manager"); - try { - Class.forName("com.bernard.julianatheme.anathemes.StopTalkingAnatheme"); - } catch (ClassNotFoundException e) { - System.err.println("La classe n'a pas été trouvée."); - e.printStackTrace(); - } - //registerAnatheme(StopTalkingAnatheme.NAME, StopTalkingAnatheme.class); reloadAnathemes(); // La commande ne sert à rien } @Discord(description="Lance les évents de toutes les malédictions chagées") - public void anathemeEvent(Event e){ - System.out.println("Alors l'event "+e.toString()); - Set callList = registeredEvents.getOrDefault(e.getClass(), new HashSet<>()) ; + public void anathemeEvent(GenericEvent e){ + Set callList = registeredEvents.getOrDefault(e.getClass(), Set.of()); for(Method m : callList) { - Set callObjects = anathemes.getOrDefault(m.getDeclaringClass(), new HashSet<>()); + Set callObjects = anathemes.getOrDefault(m.getDeclaringClass(), Set.of()); for(JuLIAnatheme o : callObjects) { try { m.invoke(o, e); @@ -69,25 +63,37 @@ public class JuliAnathemeManager { } } - public void reloadAnathemes() { - // La commande n'utilise en réalité pas les paramètres. - reloadAnathemes(null); - } - @Command(admin=true,name="reloadAnathemes",description="Recharge la liste des anathèmes") - public void reloadAnathemes(DiscordCCommande commande) { -// registeredAnathemes.clear(); -// registeredEvents.clear(); -// anathemes.clear(); + public void reloadAnathemes() { + nomsDAffichage.clear(); + registeredAnathemes.clear(); + registeredEvents.clear(); + anathemes.clear(); - Reflections r = new Reflections("",new SubTypesScanner(false)); - Set> classes = r.getSubTypesOf(JuLIAnatheme.class); - for (Class clazz : classes) { - try { - registerAnatheme(clazz.getField("NAME").get(null).toString(), clazz); - } catch (Exception e) { - registerAnatheme(clazz.getSimpleName(), clazz); + try { + ResultSet sqlResult = Trukilie.juliaDB().createStatement() + .executeQuery("SELECT nom,classe_java,nom_affichage FROM julianathemes.anathemes"); + + while (sqlResult.next()) { + try { + @SuppressWarnings("unchecked") + Class theClass = (Class) Class.forName(sqlResult.getString("classe_java")); + if(!JuLIAnatheme.class.isAssignableFrom(theClass)) + throw new ClassNotFoundException(theClass.getName()+" doit étendre la classe JuLIAnatheme !"); + String theName = sqlResult.getString("nom"); + String displayName = sqlResult.getString("nom_affichage"); + + registerAnatheme(theName, theClass); + nomsDAffichage.put(theName, displayName); + + } catch (ClassNotFoundException | ClassCastException e) { + System.err.println("Impossible de charger l'anathème associé à "+sqlResult.getString("nom")); + e.printStackTrace(); + } } + } catch (SQLException e1) { + System.err.println("Impossible de récupérer la liste des anathèmes disponibles."); + e1.printStackTrace(); } System.out.println("Anathèmes enregistrés: "+registeredAnathemes.keySet()); } @@ -97,7 +103,7 @@ public class JuliAnathemeManager { Message m = commande.getMessage(); Guild g = m.getGuild(); - + //TODO: Changer pour la super interface dans le Juliaddon if(m.getMentionedUsers().size() < 1) { notifyUser("Il faut notifier l'utilisateur qu vous voulez maudir", m.getAuthor(), m.getChannel()); return; @@ -108,8 +114,8 @@ public class JuliAnathemeManager { return; } System.out.println("Splitted : "+Arrays.toString(splitted)); - Member cible = g.getMember(m.getMentionedUsers().get(0)); - Member source = g.getMember(m.getAuthor()); + Member cible = g.retrieveMember(m.getMentionedUsers().get(0)).complete(); + Member source = g.retrieveMember(m.getAuthor()).complete(); String type = splitted[2]; if(!registeredAnathemes.containsKey(type)) { @@ -133,7 +139,7 @@ public class JuliAnathemeManager { builder.setTitle("Voila le log :"); builder.addField(e.getClass().getCanonicalName(),e.getLocalizedMessage(),false); builder.setColor(Color.red); - m.getChannel().sendMessage(builder.build()).complete(); + m.getChannel().sendMessageEmbeds(builder.build()).complete(); return; } try { @@ -174,7 +180,7 @@ public class JuliAnathemeManager { notifyUser("Il faut notifier l'utilisateur qu vous voulez 'oracler'", m.getAuthor(), m.getChannel()); return; } - Member cible = g.getMember(m.getMentionedUsers().get(0)); + Member cible = g.retrieveMember(m.getMentionedUsers().get(0)).complete(); Set anathemes = new HashSet<>(); for(Entry,Set> anathemez : this.anathemes.entrySet()) @@ -198,7 +204,7 @@ public class JuliAnathemeManager { for (JuLIAnatheme juLIAnatheme : anathemes) { dumper.addField(juLIAnatheme.getClass().getSimpleName(), juLIAnatheme.dump(), false); } - m.getChannel().sendMessage(dumper.build()).complete(); + m.getChannel().sendMessageEmbeds(dumper.build()).complete(); } @Command(admin=true,name="exorciser",description="Excorcise une personne (lui enlève sa malediction). Usage 'exorciser <@pseudo> ") @@ -217,7 +223,7 @@ public class JuliAnathemeManager { return; } System.out.println("Splitted : "+Arrays.toString(splitted)); - Member cible = g.getMember(m.getMentionedUsers().get(0)); + Member cible = g.retrieveMember(m.getMentionedUsers().get(0)).complete(); String type = splitted[2]; if(!registeredAnathemes.containsKey(type)) { @@ -244,7 +250,6 @@ public class JuliAnathemeManager { public static void registerAnatheme(String name, Class clazz) { - System.out.println("Je vais registerer "+name); if(clazz == null) { System.err.println("Bon ben ... j'ajoute aucune classe ..."); return; @@ -272,10 +277,15 @@ public class JuliAnathemeManager { for(Method m : mtds) { if(m.getAnnotationsByType(EventReciever.class).length > 0) { Class[] pmts = m.getParameterTypes(); - if(pmts.length != 1 || Event.class.isAssignableFrom(pmts[0])){ - System.err.println("La methode "+m.getName()+" de la classe "+clazz.getName()+" possède l'annotation EventReciever mais ne possède pas un seul argument de type enfant de Event"); + System.out.println(Arrays.toString(pmts)); + if(pmts.length != 1 || (!GenericEvent.class.isAssignableFrom(pmts[0]))){ + System.err.println("La methode "+m.getName()+" de la classe "+clazz.getName()+" possède l'annotation EventReciever mais ne possède pas un seul argument de type enfant de GenericEvent"); return; } + @SuppressWarnings("unchecked") + Class vraieClasse = (Class) pmts[0]; + registeredEvents.putIfAbsent(vraieClasse, new HashSet<>()); + registeredEvents.get(vraieClasse).add(m); } } diff --git a/src/com/bernard/julianatheme/anathemes/StopTalkingAnatheme.java b/src/com/bernard/julianatheme/anathemes/StopTalkingAnatheme.java index 7c3b7aa..cd377c8 100644 --- a/src/com/bernard/julianatheme/anathemes/StopTalkingAnatheme.java +++ b/src/com/bernard/julianatheme/anathemes/StopTalkingAnatheme.java @@ -8,7 +8,6 @@ import java.util.List; import com.bernard.julianatheme.EventReciever; import com.bernard.julianatheme.JuLIAnatheme; -import com.bernard.julianatheme.JuliAnathemeManager; import net.dv8tion.jda.api.MessageBuilder; import net.dv8tion.jda.api.entities.Guild; @@ -18,12 +17,6 @@ import net.dv8tion.jda.api.events.message.MessageReceivedEvent; public class StopTalkingAnatheme extends JuLIAnatheme { - public static final String NAME = "stopTalking"; - - static { - JuliAnathemeManager.registerAnatheme(NAME, StopTalkingAnatheme.class); - } - long[] channelsIDs;