Modifications sur les problèmes de caractères (notamment)

This commit is contained in:
Mysaa 2021-05-23 02:36:59 +02:00
parent 0094701c2a
commit b3601efefa
8 changed files with 180 additions and 102 deletions

View File

@ -9,6 +9,9 @@
// Apply the java-library plugin to add support for Java Library // Apply the java-library plugin to add support for Java Library
apply plugin: 'java-library' apply plugin: 'java-library'
apply plugin: 'eclipse' apply plugin: 'eclipse'
apply plugin: 'java'
compileJava.options.encoding = 'UTF-8'
// In this section you declare where to find the dependencies of your project // In this section you declare where to find the dependencies of your project
repositories { repositories {
@ -74,6 +77,8 @@ dependencies {
compile 'com.thedeanda:lorem:2.1' compile 'com.thedeanda:lorem:2.1'
compile 'commons-io:commons-io:2.6'
// https://mvnrepository.com/artifact/mysql/mysql-connector-java // https://mvnrepository.com/artifact/mysql/mysql-connector-java
compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.15' compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.15'

View File

@ -1,18 +1,10 @@
/* /*
* This settings file was generated by the Gradle 'init' task. * This file was generated by the Gradle 'init' task.
* *
* The settings file is used to specify which projects to include in your build. * The settings file is used to specify which projects to include in your build.
* In a single project build this file can be empty or even removed.
* *
* Detailed information about configuring a multi-project build in Gradle can be found * Detailed information about configuring a multi-project build in Gradle can be found
* in the user guide at https://docs.gradle.org/4.3/userguide/multi_project_builds.html * in the user guide at https://docs.gradle.org/4.8.1/userguide/multi_project_builds.html
*/ */
/*
// To declare projects as part of a multi-project build use the 'include' method
include 'shared'
include 'api'
include 'services:webservice'
*/
rootProject.name = 'Juliabot' rootProject.name = 'Juliabot'

View File

@ -25,7 +25,7 @@ public class CommandeSurchargee {
public Method getExecutor(CCommande commande) { public Method getExecutor(CCommande commande) {
Set<Class<?>> critargs = checkFiliature(Stream.of(commande.getClass()).collect(Collectors.toSet())); Set<Class<?>> critargs = checkFiliature(Stream.of(commande.getClass()).collect(Collectors.toSet()));
System.out.println("////////"+critargs); System.out.println("////////"+critargs);
return versions.get(critargs); return versions.get(versions.keySet().stream().filter(cr -> critargs.containsAll(cr)).findAny().orElse(null));
} }
public void surcharger(Set<Class<?>> discriminant, Method m) { public void surcharger(Set<Class<?>> discriminant, Method m) {

View File

@ -1007,7 +1007,7 @@ public class EcouteurDEvents implements EventListener{
case "HttpRequestEvent": case "HttpRequestEvent":
System.err.println("EN attente d'un dev assez motivé pour coder ce foutu HttpRequestEvent !!!"); //TODO System.err.println("EN attente d'un dev assez motivé pour coder ce foutu HttpRequestEvent !!!");
return; return;
default: default:
throw new IllegalStateException("Cette méthode n'est pas a jour avec le JDA ... je gère pas "+event.getClass().getName()); throw new IllegalStateException("Cette méthode n'est pas a jour avec le JDA ... je gère pas "+event.getClass().getName());

View File

@ -8,6 +8,8 @@ import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.commons.io.output.TeeOutputStream;
import com.bernard.juliabot.JuliaAddon.JarWithMultipleAddonsException; import com.bernard.juliabot.JuliaAddon.JarWithMultipleAddonsException;
import com.bernard.juliabot.JuliaAddon.JuliaClassLoader; import com.bernard.juliabot.JuliaAddon.JuliaClassLoader;
import com.bernard.juliabot.api.*; import com.bernard.juliabot.api.*;
@ -41,6 +43,8 @@ public class Julia {
Connection eventDatabase; Connection eventDatabase;
Connection juliaDatabase; Connection juliaDatabase;
JuliaErrPrintStream syserr;
public Julia() { public Julia() {
@ -62,37 +66,49 @@ public class Julia {
connectionProps.put("useSSL", "true"); connectionProps.put("useSSL", "true");
connectionProps.put("requireSSL", "true"); connectionProps.put("requireSSL", "true");
try { try {
Class.forName("com.mysql.jdbc.Driver");
eventDatabase = DriverManager.getConnection("jdbc:mysql://192.168.1.41:3306/juliaEvents", connectionProps); eventDatabase = DriverManager.getConnection("jdbc:mysql://192.168.1.41:3306/juliaEvents", connectionProps);
juliaDatabase = DriverManager.getConnection("jdbc:mysql://192.168.1.41:3306/julia", connectionProps); juliaDatabase = DriverManager.getConnection("jdbc:mysql://192.168.1.41:3306/julia", connectionProps);
} catch (SQLException | ClassNotFoundException e) { } catch (SQLException e) {
System.err.println("Impossible de se connecter a la BDD, ca ne sers a rien de lancer JuL'IA du coup ... Bonne nuit"); System.err.println("Impossible de se connecter a la BDD, ca ne sers a rien de lancer JuL'IA du coup ... Bonne nuit");
e.printStackTrace(); e.printStackTrace();
syserr.flush();
return; return;
} }
System.out.println("La BDD est charg<EFBFBD><EFBFBD>e" + eventDatabase+","+juliaDatabase); System.out.println("La BDD est chargée" + eventDatabase+","+juliaDatabase);
// D<EFBFBD><EFBFBD>marrage de JDA et du Bot // Démarrage de JDA et du Bot
try { try {
lecouteur = new EcouteurDEvents(this); lecouteur = new EcouteurDEvents(this);
jda = new JDABuilder(AccountType.BOT).setToken(token).addEventListener(lecouteur).build(); jda = new JDABuilder(AccountType.BOT).setToken(token).addEventListener(lecouteur).build();
jda.awaitReady(); jda.awaitReady();
} catch(Exception e) { } catch(Exception e) {
System.err.println("Impossible de d<EFBFBD><EFBFBD>marrer JuL'IA"); System.err.println("Impossible de démarrer JuL'IA");
e.printStackTrace(); e.printStackTrace();
syserr.flush();
return; return;
} }
jda.getGuildById(222947179017404416L).getTextChannelById(460935684669046784L).sendMessage(LoremIpsum.getInstance().getWords(10, 15)).complete(); jda.getGuildById(222947179017404416L).getTextChannelById(460935684669046784L).sendMessage(LoremIpsum.getInstance().getWords(10, 15)).complete();
syserr = new JuliaErrPrintStream(jda.getGuildById(222947179017404416L).getTextChannelById(576469792735756309L));
TeeOutputStream tos = new TeeOutputStream(System.err, syserr.printStream());
System.setErr(new PrintStream(tos));
Timer syserrtimer = new Timer("Syserr-refresh", true);
syserrtimer.schedule(new TimerTask() {
@Override
public void run() {Julia.theJulia().syserr.flushMessage();}
} , 0, 1000);
//Launch update to see every addon in juliaddon/ //Launch update to see every addon in juliaddon/
update();//Va remplir la map avalivableAddons update();//Va remplir la map avalivableAddons
//D<EFBFBD><EFBFBD>marrage du sysin //Démarrage du sysin
sysinator = new ReadLoop(); sysinator = new ReadLoop();
Thread sysinThread = new Thread(sysinator, "sysin-reader"); Thread sysinThread = new Thread(sysinator, "sysin-reader");
sysinThread.start(); sysinThread.start();
@ -101,7 +117,7 @@ public class Julia {
//Loader l'internalddon (hard-coded) //Loader l'internalddon (hard-coded)
//laboratoires.get('#').loadAddon("com.bernard.juliabot.internaddon", "beta", false);//Pas besoin d'update, il viens d'etre fait //laboratoires.get('#').loadAddon("com.bernard.juliabot.internaddon", "beta", false);//Pas besoin d'update, il viens d'etre fait
//Load addons in # and in $ (r<EFBFBD><EFBFBD>cupere ce qu'il faut dans la BDD) //Load addons in # and in $ (récupere ce qu'il faut dans la BDD)
Set<String> toLoad = new HashSet<>(); Set<String> toLoad = new HashSet<>();
try { try {
Statement statement = juliaDatabase.createStatement(); Statement statement = juliaDatabase.createStatement();
@ -115,13 +131,15 @@ public class Julia {
} catch (SQLException e) { } catch (SQLException e) {
System.err.println("Impossible de charger les plugins, vous aurez tout a faire a la main !"); System.err.println("Impossible de charger les plugins, vous aurez tout a faire a la main !");
e.printStackTrace(); e.printStackTrace();
syserr.flush();
} }
System.out.println("Les addons <EFBFBD><EFBFBD> charger : "+toLoad); System.out.println("Les addons à charger : "+toLoad);
try { try {
juliaDatabase.createStatement().executeUpdate("DELETE FROM loadedJuliaddons"); juliaDatabase.createStatement().executeUpdate("DELETE FROM loadedJuliaddons");
} catch (SQLException e) { } catch (SQLException e) {
System.err.println("Je n'ai pas pu vider la table ... atention aux doublons !"); System.err.println("Je n'ai pas pu vider la table ... atention aux doublons !");
e.printStackTrace(); e.printStackTrace();
syserr.flush();
} }
for(String l : toLoad) { for(String l : toLoad) {
@ -134,12 +152,13 @@ public class Julia {
} }
public synchronized void update() { public synchronized void update() {
Map<String,JuliaAddon> avalivableAddons = new HashMap<>(); Map<String,JuliaAddon> avalivableAddons = new HashMap<>();
File juliaddonFolder = new File(juliaddonsFolder); File juliaddonFolder = new File(juliaddonsFolder);
for(File f : juliaddonFolder.listFiles((parent,name)->name.toLowerCase().endsWith(".jar"))){ for(File f : juliaddonFolder.listFiles((parent,name)->name.toLowerCase().endsWith(".jar"))){
if(fileTrack.containsKey(f.getName()) && fileTrack.get(f.getName()) == f.lastModified()) if(fileTrack.containsKey(f.getName()) && fileTrack.get(f.getName()) == f.lastModified())
continue;//Le fichier n'a pas boug<EFBFBD><EFBFBD>, pas besoin de le relire continue;//Le fichier n'a pas bougé, pas besoin de le relire
fileTrack.put(f.getName(), f.lastModified()); fileTrack.put(f.getName(), f.lastModified());
try { try {
JarFile jar = new JarFile(f); JarFile jar = new JarFile(f);
@ -147,7 +166,7 @@ public class Julia {
JuliaAddon addon = new JuliaAddon(jar); JuliaAddon addon = new JuliaAddon(jar);
String id = addon.pkg+":"+addon.version; String id = addon.pkg+":"+addon.version;
if(avalivableAddons.containsKey(id)) if(avalivableAddons.containsKey(id))
System.err.println("L'addon "+id+" a d<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD> <20><>t<EFBFBD><74> charg<72><67> dans les fichiers "+avalivableAddons.get(id).jarFile.getName()+" et "+jar.getName()+", je garde que le deuxi<EFBFBD><EFBFBD>me !"); System.err.println("L'addon "+id+" a déjà été chargée dans les fichiers "+avalivableAddons.get(id).jarFile.getName()+" et "+jar.getName()+", je garde que le deuxi<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>me !");
avalivableAddons.put(id, addon); avalivableAddons.put(id, addon);
}catch(JarWithMultipleAddonsException e) { }catch(JarWithMultipleAddonsException e) {
Set<Set<JarEntry>> addonsEntries = e.getAddonsEntries(); Set<Set<JarEntry>> addonsEntries = e.getAddonsEntries();
@ -156,26 +175,38 @@ public class Julia {
JuliaAddon addon = new JuliaAddon(jar, entry); JuliaAddon addon = new JuliaAddon(jar, entry);
String id = addon.pkg+":"+addon.version; String id = addon.pkg+":"+addon.version;
if(avalivableAddons.containsKey(id)) if(avalivableAddons.containsKey(id))
System.err.println("L'addon "+id+" a d<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD> <20><>t<EFBFBD><74> charg<72><67> dans les fichiers "+avalivableAddons.get(id).jarFile.getName()+" et "+jar.getName()+", je garde que le deuxi<EFBFBD><EFBFBD>me !"); System.err.println("L'addon "+id+" a déjà été chargée dans les fichiers "+avalivableAddons.get(id).jarFile.getName()+" et "+jar.getName()+", je garde que le deuxi<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>me !");
avalivableAddons.put(id, addon); avalivableAddons.put(id, addon);
} catch (JarWithMultipleAddonsException e1) { } catch (JarWithMultipleAddonsException e1) {
System.err.println("THIS SHOULD NOT HAPPEN"); System.err.println("THIS SHOULD NOT HAPPEN");
System.err.println("TOUT EST CASS<53><53> ALERTE ROUGE !"); System.err.println("TOUT EST CASSÉ ALERTE ROUGE !");
System.err.println("C'est problematique, j'<27><>teint tout, c'est mieux"); System.err.println("C'est problematique, j'éteint tout, c'est mieux");
syserr.flush();
System.exit(31415926); System.exit(31415926);
} }
} }
}catch(IllegalStateException e) { }catch(IllegalStateException e) {
System.err.println(e.getMessage()); System.err.println(e.getMessage());
syserr.flush();
} }
} catch (IOException e) { } catch (IOException e) {
System.err.println("Impossible de lire le fichier jar "+f.getName()); System.err.println("Impossible de lire le fichier jar "+f.getName());
e.printStackTrace(); e.printStackTrace();
syserr.flush();
} }
syserr.flush();
} }
this.avalivableAddons = avalivableAddons; this.avalivableAddons = avalivableAddons;
} }
public Connection getJuliaDatabase() {
return juliaDatabase;
}
public class ReadLoop implements Runnable{ public class ReadLoop implements Runnable{
boolean running = false; boolean running = false;
@ -189,8 +220,8 @@ public class Julia {
while(running) { while(running) {
String request = sc.nextLine(); String request = sc.nextLine();
System.out.println("Je suis cens<EFBFBD><EFBFBD> avoir lu la commande "+request); System.out.println("Je suis censée avoir lu la commande "+request);
//TODO r<EFBFBD><EFBFBD>agir ... //TODO réagir ...
@ -200,6 +231,7 @@ public class Julia {
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
System.err.println("Erreur de lecture du sysin, je deviens sourd"); System.err.println("Erreur de lecture du sysin, je deviens sourd");
e.printStackTrace(); e.printStackTrace();
syserr.flush();
running=false; running=false;
} }
} }
@ -210,11 +242,11 @@ public class Julia {
public class Laboratory{ public class Laboratory{
char laboratory; char laboratory;
Map<String,JuliaAddon> loadedAddons;//<pkg,JuliaAddon> : les addons charg<EFBFBD><EFBFBD>s dans ce laboratoire Map<String,JuliaAddon> loadedAddons;//<pkg,JuliaAddon> : les addons chargés dans ce laboratoire
Map<String,CommandeSurchargee> loadedCommands;//<commandName,Calling method> : les commandes charg<EFBFBD><EFBFBD>es Map<String,CommandeSurchargee> loadedCommands;//<commandName,Calling method> : les commandes chargées
Map<Class<?>,Object> callerObjects; // <Classe, objet de cette classe> : Les objets instanci<EFBFBD><EFBFBD>s dans ce laboratoire Map<Class<?>,Object> callerObjects; // <Classe, objet de cette classe> : Les objets instanciés dans ce laboratoire
Map<String,String> aliases;// <alias, vrainom> Map<String,String> aliases;// <alias, vrainom>
Map<Class<? extends Event>,Set<Method>> loadedEvents;// Les m<EFBFBD><EFBFBD>thodes <EFBFBD><EFBFBD> appeler quand un event de cette classe est lanc<EFBFBD><EFBFBD> Map<Class<? extends Event>,Set<Method>> loadedEvents;// Les méthodes à appeler quand un event de cette classe est lancé
Map<String,JuliaClassLoader> clazzTrack;//<className,JuliaClassLoader which loaded ths class in this laboratory> Map<String,JuliaClassLoader> clazzTrack;//<className,JuliaClassLoader which loaded ths class in this laboratory>
@ -245,7 +277,7 @@ public class Julia {
public synchronized void loadAddon(String pkg,String version,boolean update) { public synchronized void loadAddon(String pkg,String version,boolean update) {
if(update)Julia.this.update(); if(update)Julia.this.update();
if(loadedAddons.containsKey(pkg)) if(loadedAddons.containsKey(pkg))
throw new IllegalStateException("Impossible de charger le juliaddon "+pkg+" dans le laboratoire "+laboratory+", il est d<><64>j<EFBFBD><EFBFBD> charg<72><67>"); throw new IllegalStateException("Impossible de charger le juliaddon "+pkg+" dans le laboratoire "+laboratory+", il est d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> charg<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
try { try {
PreparedStatement s = juliaDatabase.prepareStatement("INSERT INTO loadedJuliaddons (ID,laboratory,pkg,version) VALUES (NULL,?,?,?)"); PreparedStatement s = juliaDatabase.prepareStatement("INSERT INTO loadedJuliaddons (ID,laboratory,pkg,version) VALUES (NULL,?,?,?)");
s.setString(1, Character.toString(laboratory)); s.setString(1, Character.toString(laboratory));
@ -255,6 +287,7 @@ public class Julia {
} catch (SQLException e) { } catch (SQLException e) {
System.err.println("Je ne peux pas notifier la BDD que je load le plugin, je le load pas du coup ..."); System.err.println("Je ne peux pas notifier la BDD que je load le plugin, je le load pas du coup ...");
e.printStackTrace(); e.printStackTrace();
syserr.flush();
return; return;
} }
@ -268,17 +301,18 @@ public class Julia {
public synchronized void unloadAddon(String pkg) { public synchronized void unloadAddon(String pkg) {
if(!loadedAddons.containsKey(pkg)) if(!loadedAddons.containsKey(pkg))
return;//SI l'addon n'est pas charg<EFBFBD><EFBFBD>, on a rien besoin de faire return;//SI l'addon n'est pas chargé, on a rien besoin de faire
try { try {
PreparedStatement s = juliaDatabase.prepareStatement("DELETE FROM juliaddons WHERE laboratory=? AND pkg=?"); PreparedStatement s = juliaDatabase.prepareStatement("DELETE FROM juliaddons WHERE laboratory=? AND pkg=?");
s.setString(1, Character.toString(laboratory)); s.setString(1, Character.toString(laboratory));
s.setString(2, pkg); s.setString(2, pkg);
if(s.executeUpdate() != 1) { if(s.executeUpdate() != 1) {
System.err.println("Ce juliaddon n'<EFBFBD><EFBFBD>tait pas charg<72><67> dans la BDD ... tr<74><72>s bizzare"); System.err.println("Ce juliaddon n'était pas chargé dans la BDD ... très bizzare");
} }
} catch (SQLException e) { } catch (SQLException e) {
System.err.println("Je ne peux pas notifier la BDD que je unload le plugin, je l'unload mais vous risquez d'avoir des problemes ..."); System.err.println("Je ne peux pas notifier la BDD que je unload le plugin, je l'unload mais vous risquez d'avoir des problemes ...");
e.printStackTrace(); e.printStackTrace();
syserr.flush();
return; return;
} }
JuliaAddon addon = loadedAddons.get(pkg); JuliaAddon addon = loadedAddons.get(pkg);
@ -292,17 +326,17 @@ public class Julia {
//Verify that commands asks for good argument //Verify that commands asks for good argument
if(!Arrays.stream(m.getParameterTypes()).map(CCommande.class::isAssignableFrom).reduce(Boolean::logicalAnd).get()) if(!Arrays.stream(m.getParameterTypes()).map(CCommande.class::isAssignableFrom).reduce(Boolean::logicalAnd).get())
throw new IllegalArgumentException("Les param<EFBFBD><EFBFBD>tres d'une commande doivent tous impl<70><6C>menter CCommande"); throw new IllegalArgumentException("Les paramètres d'une commande doivent tous implémenter CCommande");
try { try {
m.setAccessible(true); m.setAccessible(true);
}catch(SecurityException e) { }catch(SecurityException e) {
throw new IllegalArgumentException("Impossible de me donner le droit d'<EFBFBD><EFBFBD>xecuter "+m.toGenericString()); throw new IllegalArgumentException("Impossible de me donner le droit d'éxecuter "+m.toGenericString());
} }
// Argument OK // Argument OK
//Register aliases //Register aliases
// print un message d'erreur si un alias a d<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> enregistr<EFBFBD><EFBFBD> pour une autre commande // print un message d'erreur si un alias a déjà été enregistré pour une autre commande
Arrays.stream(c.aliases()) Arrays.stream(c.aliases())
.filter(aliases::containsKey).filter(alias -> !aliases.get(alias).equals(c.name())) .filter(aliases::containsKey).filter(alias -> !aliases.get(alias).equals(c.name()))
.forEach(alias -> System.err.println("Faut remplacer l'alias "+alias+", plus de deux addons l'utilisent")); .forEach(alias -> System.err.println("Faut remplacer l'alias "+alias+", plus de deux addons l'utilisent"));
@ -311,7 +345,7 @@ public class Julia {
//Cr<EFBFBD><EFBFBD>ation de l'objet si ca n'a pas <EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> fait //Création de l'objet si ca n'a pas été fait
checkObject(m.getDeclaringClass()); checkObject(m.getDeclaringClass());
//Enregistre la nouvelle surcharge //Enregistre la nouvelle surcharge
@ -323,10 +357,10 @@ public class Julia {
public synchronized void registerEvent(Method m, Discord d) { public synchronized void registerEvent(Method m, Discord d) {
Class<?>[] parameters = m.getParameterTypes(); Class<?>[] parameters = m.getParameterTypes();
if(parameters.length != 1) if(parameters.length != 1)
throw new IllegalArgumentException("Les catcheurs d'events ne doivent avoir qu'un seul param<EFBFBD><EFBFBD>tre, extends Event, la m<><6D>thde fautive <20><>tant "+m.toGenericString()); throw new IllegalArgumentException("Les catcheurs d'events ne doivent avoir qu'un seul paramétre, extends Event, la méthode fautive étant "+m.toGenericString());
if(!Event.class.isAssignableFrom(parameters[0])) if(!Event.class.isAssignableFrom(parameters[0]))
throw new IllegalArgumentException("Les catcheur d'events ne doivent avoir qu'un param<EFBFBD><EFBFBD>tre, qui doit extends Event, la m<><6D>thode fautive <20><>tant "+m.toGenericString()); throw new IllegalArgumentException("Les catcheur d'events ne doivent avoir qu'un paramètre, qui doit extends Event, la méthode fautive étant "+m.toGenericString());
//La m<EFBFBD><EFBFBD>thode est v<EFBFBD><EFBFBD>rifi<EFBFBD><EFBFBD>e //La méthode est vérifiée
if(!loadedEvents.containsKey(parameters[0])) if(!loadedEvents.containsKey(parameters[0]))
loadedEvents.put((Class<? extends Event>) parameters[0], new HashSet<>()); loadedEvents.put((Class<? extends Event>) parameters[0], new HashSet<>());
checkObject(m.getDeclaringClass()); checkObject(m.getDeclaringClass());
@ -335,7 +369,7 @@ public class Julia {
public synchronized void unregisterCommand(Method m,Command c) { public synchronized void unregisterCommand(Method m,Command c) {
if(loadedCommands.containsKey(c.name())) if(loadedCommands.containsKey(c.name()))
throw new IllegalStateException("Une commade "+c.name()+" a d<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD> <20><>t<EFBFBD><74> enregistr<74><72>e !"); throw new IllegalStateException("Une commade "+c.name()+" a déjà été enregistrée !");
//Unregister aliases //Unregister aliases
for(String alias:c.aliases()) for(String alias:c.aliases())
aliases.remove(alias, c.name());//Evite de supprimer les alias d'autres commandes qui auraient overwrite aliases.remove(alias, c.name());//Evite de supprimer les alias d'autres commandes qui auraient overwrite
@ -343,10 +377,10 @@ public class Julia {
loadedCommands.remove(c.name()); loadedCommands.remove(c.name());
} }
@SuppressWarnings("unchecked")//Pour un truc qui n'ets pas cens<EFBFBD><EFBFBD> arriver, donc bon ... @SuppressWarnings("unchecked")//Pour un truc qui n'ets pas censé arriver, donc bon ...
public synchronized void unregisterEvent(Method m, Discord d) { public synchronized void unregisterEvent(Method m, Discord d) {
Class<?>[] parameters = m.getParameterTypes(); Class<?>[] parameters = m.getParameterTypes();
if(!loadedEvents.containsKey(parameters[0]))//N'est pas cens<EFBFBD><EFBFBD> arriver, si l'event a <EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> load, cette HashSet devrai exister if(!loadedEvents.containsKey(parameters[0]))//N'est pas censé arriver, si l'event a été load, cette HashSet devrai exister
loadedEvents.put((Class<? extends Event>) parameters[0], new HashSet<>()); loadedEvents.put((Class<? extends Event>) parameters[0], new HashSet<>());
loadedEvents.get(parameters[0]).remove(m); loadedEvents.get(parameters[0]).remove(m);
} }
@ -370,7 +404,7 @@ public class Julia {
case "net.dv8tion.jda.core.JDA": case "net.dv8tion.jda.core.JDA":
params[i] = Julia.this.jda; params[i] = Julia.this.jda;
break; break;
//TODO completer les param<EFBFBD><EFBFBD>tres //TODO completer les paramètres
default: default:
continue constLoop; continue constLoop;
@ -384,8 +418,8 @@ public class Julia {
if(o != null)break;//Sortir de la boucle, on a notre joli objet if(o != null)break;//Sortir de la boucle, on a notre joli objet
} }
if(o == null) { if(o == null) {
System.err.println("Je ne peux pas cr<EFBFBD><EFBFBD>er l'objet, faudait mettre un costructeur valide (en mon sens :P)"); System.err.println("Je ne peux pas créer l'objet, faudait mettre un costructeur valide (en mon sens :P)");
System.err.println("Je fais tout planter du coup, votrez addon sera pas charg<EFBFBD><EFBFBD> !"); System.err.println("Je fais tout planter du coup, votrez addon sera pas chargé !");
throw new IllegalStateException("Pas de constructeur valable"); throw new IllegalStateException("Pas de constructeur valable");
} }
callerObjects.put(clazz, o); callerObjects.put(clazz, o);
@ -400,14 +434,15 @@ public class Julia {
try { try {
m.invoke(callable, event); m.invoke(callable, event);
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
System.err.println("C'est pas joli joli, je suis cens<EFBFBD><EFBFBD> lancer une m<><6D>thode <20><> laquelle je n'ai pas acc<63><63>s : "+m.toGenericString()); System.err.println("C'est pas joli joli, je suis censé lancer une méthode à laquelle je n'ai pas accès : "+m.toGenericString());
throw new IllegalStateException(e); throw new IllegalStateException(e);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
System.err.println("La m<EFBFBD><EFBFBD>thode n'est pas cens<6E><73>e recevoir de tels erreurs, je devrai avoir ch<63><68>ck<63><6B> la m<><6D>thode, mais elle ne veut pas de mes arguments ... : "+m.toGenericString()); System.err.println("La méthode n'est pas censée recevoir de tels erreurs, je devrai avoir chécké la méthode, mais elle ne veut pas de mes arguments ... : "+m.toGenericString());
throw new IllegalStateException(e); throw new IllegalStateException(e);
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
System.err.println("La m<EFBFBD><EFBFBD>thode <20><> lanc<6E><63> cette exception ... je la relance derri<72><69>re du coup : "+m.toGenericString()); System.err.println("La méthode à lancé cette exception ... je la relance derrière du coup : "+m.toGenericString());
e.printStackTrace(); e.printStackTrace();
syserr.flush();
throw new IllegalStateException(e); throw new IllegalStateException(e);
} }
} }
@ -427,7 +462,7 @@ public class Julia {
CommandeSurchargee scommande = loadedCommands.get(cname); CommandeSurchargee scommande = loadedCommands.get(cname);
Method m = scommande.getExecutor(content); Method m = scommande.getExecutor(content);
if(m==null) if(m==null)
throw new IllegalArgumentException("La commande "+cname+" alias "+name+" n'est pas pr<EFBFBD><EFBFBD>vue pour s'<27><>xecuter avec un "+content.getClass().getCanonicalName()); throw new IllegalArgumentException("La commande "+cname+" alias "+name+" n'est pas prévue pour s'éxecuter avec un "+content.getClass().getCanonicalName());
final Object[] parameters = new Object[m.getParameterCount()]; final Object[] parameters = new Object[m.getParameterCount()];
Arrays.fill(parameters, content); Arrays.fill(parameters, content);
final Object caller = callerObjects.get(m.getDeclaringClass()); final Object caller = callerObjects.get(m.getDeclaringClass());
@ -442,18 +477,22 @@ public class Julia {
m.invoke(caller, parameters); m.invoke(caller, parameters);
} catch (IllegalAccessException e) { } catch (IllegalAccessException e) {
System.err.println("Probl<EFBFBD><EFBFBD>me d'acc<63><63>s <20><> la m<><6D>thode "+m.toGenericString()+" ... c'est emb<EFBFBD><EFBFBD>tant"); System.err.println("Problème d'accès à la méthode "+m.toGenericString()+" ... c'est embêtant");
e.printStackTrace(); e.printStackTrace();
syserr.flush();
called.setExitValue(e.getCause()); called.setExitValue(e.getCause());
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
System.err.println("<EFBFBD><EFBFBD>trange, je pensais avoir check les arguments"); System.err.println("Étrange, je pensais avoir check les arguments");
e.printStackTrace(); e.printStackTrace();
syserr.flush();
called.setExitValue(e.getCause()); called.setExitValue(e.getCause());
} catch (InvocationTargetException e) { } catch (InvocationTargetException e) {
//Lui a plant<EFBFBD><EFBFBD> //Lui a planté
called.setExitValue(e.getCause()); called.setExitValue(e.getCause());
System.err.println("L'appel a la commande a planté ...");
e.getCause().printStackTrace();
} }
syserr.flush();
called.ended(); called.ended();
}, "commande-"+cname+".aka."+name+"-"+System.nanoTime()); }, "commande-"+cname+".aka."+name+"-"+System.nanoTime());

View File

@ -8,6 +8,7 @@ import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
@ -15,9 +16,9 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.bernard.juliabot.Julia.Laboratory;
import com.bernard.juliabot.api.Command; import com.bernard.juliabot.api.Command;
import com.bernard.juliabot.api.Discord; import com.bernard.juliabot.api.Discord;
import com.bernard.juliabot.Julia.Laboratory;
import com.bernard.juliabot.api.JuLIAddon; import com.bernard.juliabot.api.JuLIAddon;
public class JuliaAddon { public class JuliaAddon {
@ -58,12 +59,12 @@ public class JuliaAddon {
//String jarExtra = jarMatcher.group(3); //String jarExtra = jarMatcher.group(3);
version = jarVersion; version = jarVersion;
//Sets addon,pkg,version(si redefini) et addonClass //Sets addon,pkg,version(si redefini) et addonClass
unassignedClassLoader = new JuliaClassLoader(jar, entriesToRead,new DummyLaboratory()); unassignedClassLoader = new JuliaClassLoader(jar, entriesToRead,new DummyLaboratory());
} }
public synchronized JuliaClassLoader newClassLoader(Laboratory laboratory) { public synchronized JuliaClassLoader newClassLoader(Laboratory laboratory) {
if(unassignedClassLoader==null) if(unassignedClassLoader==null)
try { try {
@ -97,6 +98,8 @@ public class JuliaAddon {
public class JuliaClassLoader extends ClassLoader { public class JuliaClassLoader extends ClassLoader {
Map<String,Class<?>> loadedClasses; Map<String,Class<?>> loadedClasses;
Set<JarEntry> entries;
JarFile jar;
Laboratory laboratory = null; Laboratory laboratory = null;
HashSet<Method> registeredCommands; HashSet<Method> registeredCommands;
@ -104,6 +107,8 @@ public class JuliaAddon {
public JuliaClassLoader(JarFile jar,Set<JarEntry> entriesToRead,Laboratory labo) throws JarWithMultipleAddonsException { public JuliaClassLoader(JarFile jar,Set<JarEntry> entriesToRead,Laboratory labo) throws JarWithMultipleAddonsException {
super(); super();
entries = entriesToRead;
this.jar = jar;
loadedClasses = new HashMap<>(); loadedClasses = new HashMap<>();
this.laboratory = labo; this.laboratory = labo;
Set<Class<?>> readClasses = new HashSet<>(); Set<Class<?>> readClasses = new HashSet<>();
@ -116,11 +121,12 @@ public class JuliaAddon {
//Le fichier est un .class //Le fichier est un .class
try { try {
String className = entry.getName().replaceAll("/", ".").substring(0, entry.getName().length()-".class".length()); String className = entry.getName().replaceAll("/", ".").substring(0, entry.getName().length()-".class".length());
byte[] classData = new byte[(int) entry.getSize()]; Class<?> clazz;
InputStream reader = jar.getInputStream(entry); try {
reader.read(classData); clazz = loadClass(className);
reader.close(); } catch (ClassNotFoundException e) {
Class<?> clazz = defineClass(className,classData,0,(int) entry.getSize()); throw new IllegalStateException("J'ai demandé a charger une classe sachant que je l'ai dans le jar, mais j'ai quand meme pas réussi à la charger ...", e);
}
readClasses.add(clazz); readClasses.add(clazz);
//Instantiated class //Instantiated class
@ -131,7 +137,7 @@ public class JuliaAddon {
throw new IllegalArgumentException("Le nom de la classe est invalide pour un Juliaddon (il faut au moins trois de profondeur dans le package) : "+clazz.getName()); throw new IllegalArgumentException("Le nom de la classe est invalide pour un Juliaddon (il faut au moins trois de profondeur dans le package) : "+clazz.getName());
String pkg = m.group(1); String pkg = m.group(1);
if(juliaddons.containsKey(pkg)) if(juliaddons.containsKey(pkg))
throw new IllegalArgumentException("Il existe deja un juliaddon dans le package "+pkg+" , déplacez "+clazz.getName()+" ou "+juliaddons.get(pkg).getName()); throw new IllegalArgumentException("Il existe deja un juliaddon dans le package "+pkg+" , d<EFBFBD><EFBFBD>placez "+clazz.getName()+" ou "+juliaddons.get(pkg).getName());
juliaddons.put(pkg, entry); juliaddons.put(pkg, entry);
//If overwritten, will JarWithMultipleAddonsException //If overwritten, will JarWithMultipleAddonsException
JuliaAddon.this.addon = clazz.getAnnotation(JuLIAddon.class); JuliaAddon.this.addon = clazz.getAnnotation(JuLIAddon.class);
@ -148,18 +154,14 @@ public class JuliaAddon {
System.err.println("Vous essayez de mettre cette classe dans un package interdit ! Honte a vous"); System.err.println("Vous essayez de mettre cette classe dans un package interdit ! Honte a vous");
e.printStackTrace(); e.printStackTrace();
continue; continue;
} catch (IOException e) {
System.err.println("Impossible de lire les données du fichier "+entry.getName()+" dans le jar "+jar.getName());
e.printStackTrace();
continue;
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
System.err.println("Le fichier "+entry.getName()+" ne décris pas un Juliaddon valide, il n'a donc pas été chargé, mais faites attention !"); System.err.println("Le fichier "+entry.getName()+" ne d<><64>cris pas un Juliaddon valide, il n'a donc pas <20><>t<EFBFBD><74> charg<72><67>, mais faites attention !");
e.printStackTrace(); e.printStackTrace();
continue; continue;
} }
} }
//Toutes les classes du Jar ont été lues : Si plusieurs addons, on rentre //Toutes les classes du Jar ont <EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> lues : Si plusieurs addons, on rentre
//dans le if pour lever l'exception, sinon, on initialise le JuliaClassLoader //dans le if pour lever l'exception, sinon, on initialise le JuliaClassLoader
if(juliaddons.size() > 1) { if(juliaddons.size() > 1) {
Set<Set<JarEntry>> addonsEntries = new HashSet<>();//<pkg,Enum of classes associated with this plugin> Set<Set<JarEntry>> addonsEntries = new HashSet<>();//<pkg,Enum of classes associated with this plugin>
@ -179,7 +181,7 @@ public class JuliaAddon {
while((lastPoint = pkg.lastIndexOf(".")) != -1) {//Il y a encore des dossier a monter while((lastPoint = pkg.lastIndexOf(".")) != -1) {//Il y a encore des dossier a monter
pkg = pkg.substring(0, lastPoint+1);//Recule de un dossier pkg = pkg.substring(0, lastPoint+1);//Recule de un dossier
if(addonsEntriesVector.containsKey(pkg)) { if(addonsEntriesVector.containsKey(pkg)) {
//Pas besoin de tester la validite du pkg car si invalide il ne serai pas rentré dans le Set juliaddons //Pas besoin de tester la validite du pkg car si invalide il ne serai pas rentr<EFBFBD><EFBFBD> dans le Set juliaddons
addonsEntriesVector.get(pkg).add(entry); addonsEntriesVector.get(pkg).add(entry);
continue eLoop; continue eLoop;
} }
@ -193,9 +195,7 @@ public class JuliaAddon {
} }
//Initialisation du JuliaClassloader //Initialisation du JuliaClassloader
//Les parametres addon, pkg,version et addonCLass ont déjà été initialisés lors de l'itération des fichiers du jar //Les parametres addon, pkg,version et addonCLass ont d<EFBFBD><EFBFBD>j<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> initialis<EFBFBD><EFBFBD>s lors de l'it<EFBFBD><EFBFBD>ration des fichiers du jar
for(Class<?> clazz : readClasses)
loadedClasses.put(clazz.getName(), clazz);
} }
@ -204,13 +204,30 @@ public class JuliaAddon {
public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
if(loadedClasses.containsKey(name)) if(loadedClasses.containsKey(name))
return loadedClasses.get(name); return loadedClasses.get(name);
//System.out.println("I was asked to load "+name); ///Recherche d'une entry qui collerai
String fileName = name.replaceAll("\\.", "/")+".class";
Optional<JarEntry> oentry = entries.stream().filter(je -> je.getName().equals(fileName)).findAny();
if(oentry.isPresent()) {
try {
JarEntry entry = oentry.get();
byte[] classData = new byte[(int) entry.getSize()];
InputStream reader = jar.getInputStream(entry);
reader.read(classData);
reader.close();
Class<?> clazz = defineClass(name,classData,0,(int) entry.getSize());
loadedClasses.put(name, clazz);
return clazz;
} catch (IOException e) {
System.err.println("Impossible de lire les donn<6E><6E>es du fichier "+oentry.get().getName()+" dans le jar "+jar.getName()+" je peux vous dire adieu je pense");
e.printStackTrace();
}
}
JuliaClassLoader cl = laboratory.findClassLoader(name); JuliaClassLoader cl = laboratory.findClassLoader(name);
if(cl != null) if(cl != null)
try { try {
return cl.loadClass(name, resolve); return cl.loadClass(name, resolve);
}catch(ClassNotFoundException e) { }catch(ClassNotFoundException e) {
throw new ClassNotFoundException("J'ai délégué le chargement de la classe mais j'aurais pas du ... cette classe ne doit pas exister dans l'addon "+cl.getAddon().getName(),e); throw new ClassNotFoundException("J'ai d<EFBFBD><EFBFBD>l<EFBFBD><EFBFBD>gu<EFBFBD><EFBFBD> le chargement de la classe mais j'aurais pas du ... cette classe ne doit pas exister dans l'addon "+cl.getAddon().getName(),e);
} }
else else
try { try {
@ -231,7 +248,7 @@ public class JuliaAddon {
Collections.addAll(toWatch, loadClass(clazz.getName()).getMethods());//loadClass(clazz.getName()) poir eviter les references cassees par les classloaders Collections.addAll(toWatch, loadClass(clazz.getName()).getMethods());//loadClass(clazz.getName()) poir eviter les references cassees par les classloaders
} catch (SecurityException | ClassNotFoundException e) { } catch (SecurityException | ClassNotFoundException e) {
e.printStackTrace(); e.printStackTrace();
System.err.println("L'addon "+JuliaAddon.this.addonClass.getName()+" spécifie la classe "+clazz.getName()); System.err.println("L'addon "+JuliaAddon.this.addonClass.getName()+" sp<EFBFBD><EFBFBD>cifie la classe "+clazz.getName());
} }
for(Method m : toWatch) { for(Method m : toWatch) {
Command c = m.getAnnotation(Command.class); Command c = m.getAnnotation(Command.class);

View File

@ -1,5 +1,7 @@
package com.bernard.juliabot.api; package com.bernard.juliabot.api;
import java.sql.Connection;
import com.bernard.juliabot.Julia; import com.bernard.juliabot.Julia;
import net.dv8tion.jda.core.JDA; import net.dv8tion.jda.core.JDA;
@ -10,4 +12,8 @@ public class Trukilie {
return Julia.theJulia().jda; return Julia.theJulia().jda;
} }
public static Connection juliaDB() {
return Julia.theJulia().getJuliaDatabase();
}
} }

View File

@ -1,16 +1,30 @@
package com.bernard.juliabot.internaddon; package com.bernard.juliabot.internaddon;
import java.time.OffsetDateTime; import java.time.OffsetDateTime;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.IntStream; import java.util.stream.IntStream;
import com.bernard.juliabot.*; import com.bernard.juliabot.CommandCalled;
import com.bernard.juliabot.Julia;
import com.bernard.juliabot.Julia.Laboratory; import com.bernard.juliabot.Julia.Laboratory;
import com.bernard.juliabot.api.*; import com.bernard.juliabot.JuliaAddon;
import com.bernard.juliabot.api.Command;
import com.bernard.juliabot.api.CommandArguments;
import com.bernard.juliabot.api.Discord;
import com.bernard.juliabot.api.DiscordCCommande;
import com.bernard.juliabot.api.JuLIAddon;
import com.bernard.juliabot.api.StringCCommande;
import com.thedeanda.lorem.LoremIpsum; import com.thedeanda.lorem.LoremIpsum;
import net.dv8tion.jda.core.entities.*; import net.dv8tion.jda.core.entities.Message;
import net.dv8tion.jda.core.entities.MessageChannel;
import net.dv8tion.jda.core.entities.User;
import net.dv8tion.jda.core.events.message.MessageReceivedEvent; import net.dv8tion.jda.core.events.message.MessageReceivedEvent;
@JuLIAddon(name="internaddon", devs = "Bernard", version="beta", important=true) @JuLIAddon(name="internaddon", devs = "Bernard", version="beta", important=true)
@ -18,15 +32,20 @@ public class Internaddon {
public static final String COMMANDEUR = "!!"; public static final String COMMANDEUR = "!!";
@Discord(description = "LE catcheur des commandes discords. Les messages recus sont lus uis exeutes ici si ce sont des commandes") @Discord(description = "LE catcheur des commandes discords. Les messages recus sont lus puis executes ici si ce sont des commandes")
public void getCommand(MessageReceivedEvent e) { public void getCommand(MessageReceivedEvent e) {
if(e.getMessage().getContentRaw().startsWith(COMMANDEUR)) { if(e.getMessage().getContentRaw().startsWith(COMMANDEUR)) {
String name = e.getMessage().getContentRaw().split(" ")[0].substring(COMMANDEUR.length()); String name = e.getMessage().getContentRaw().split(" ")[0].substring(COMMANDEUR.length());
Laboratory labo = Julia.theJulia().laboratoires.get(Julia.theJulia().lecouteur.getLabo(e));//Récupère le labo de l'évent Laboratory labo = Julia.theJulia().laboratoires.get(Julia.theJulia().lecouteur.getLabo(e));//Récupére le labo de l'évent
InternalddonCCommande ccommande = new InternalddonCCommande(e,labo); InternalddonCCommande ccommande = new InternalddonCCommande(e,labo);
try {
CommandCalled called = labo.executeCommand(name, ccommande); CommandCalled called = labo.executeCommand(name, ccommande);
System.out.println(called);
}catch(IllegalArgumentException ex) {
// La commande n'existe pas
e.getChannel().sendMessage("Moi pas connaitre `"+name+"`. Vous apprendre moi ?").queue();
}
} }
@ -38,8 +57,8 @@ public class Internaddon {
MessageChannel channel = commande.getChannel(); MessageChannel channel = commande.getChannel();
String[] julias = new String[]{"Présent !", "Présente !", "Présentbleu !", "Présentavion !", "Présent(e) !", "Présent(bleu) !", 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) !", "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 !!!", "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 !", "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 !"}; "Je SuIS Un RObot BZzzBzZZZbZZbZZ", "Juliaaaa dadedidadeda dedadedi dadeda", "Tutturu", "Tadaaaaaaa !"};
String out = julias[(int)Math.floor(Math.random() * julias.length)]; String out = julias[(int)Math.floor(Math.random() * julias.length)];
channel.sendMessage(out).queue(); channel.sendMessage(out).queue();
@ -51,7 +70,7 @@ public class Internaddon {
s.append("```"); s.append("```");
Laboratory l = commande.getLabo(); Laboratory l = commande.getLabo();
s.append("Vous êtes actuellement dans le laboratoire '"+l.getL()+"'\n"); s.append("Vous étes actuellement dans le laboratoire '"+l.getL()+"'\n");
s.append("Liste des addons chargés :\n"); s.append("Liste des addons chargés :\n");
for(JuliaAddon e : l.getLoadedAddons().values()) for(JuliaAddon e : l.getLoadedAddons().values())
s.append("\t- "+e.getName()+" en version "+e.getVersion()+"\n"); s.append("\t- "+e.getName()+" en version "+e.getVersion()+"\n");
@ -89,16 +108,16 @@ public class Internaddon {
@Discord(description = "Arthur, par-ce que vous n'êtes pas qu'une caricature") @Discord(description = "Arthur, par-ce que vous n'étes pas qu'une caricature")
public void shutUp(MessageReceivedEvent e) { public void shutUp(MessageReceivedEvent e) {
if(e.getAuthor().getIdLong() == 460893368264687656L) {//Yukimyo if(e.getAuthor().getIdLong() == 187677269626585089L) {//Yukimyo = L'Orchidoclaste
e.getChannel().sendMessage(e.getAuthor().getAsMention() +" dis du caca").queue(); e.getChannel().sendMessage(e.getAuthor().getAsMention() +" dis du caca").queue();
} }
} }
@Command(name = "args", description = "Décompose les messages 'à la Discord'", admin = true) @Command(name = "args", description = "Décompose les messages à la Discord'", admin = true)
public void args(DiscordCCommande commande) { public void args(DiscordCCommande commande) {
CommandArguments ca = commande.getArguments(); CommandArguments ca = commande.getArguments();
@ -119,9 +138,6 @@ public class Internaddon {
Julia.theJulia().update(); Julia.theJulia().update();
} }
@Command(name="load",description = "Charge l'addon dans ce laboratoire",admin=true) @Command(name="load",description = "Charge l'addon dans ce laboratoire",admin=true)
@ -134,7 +150,7 @@ public class Internaddon {
Laboratory l = commande.getLabo(); Laboratory l = commande.getLabo();
String out = "Terminé avec succès"; String out = "Terminé avec succés";
try { try {
l.loadAddon(addonName, version); l.loadAddon(addonName, version);
}catch (Exception e) { }catch (Exception e) {
@ -152,7 +168,7 @@ public class Internaddon {
Laboratory l = commande.getLabo(); Laboratory l = commande.getLabo();
String out = "Terminé avec succès"; String out = "Terminé avec succés";
try { try {
l.unloadAddon(addonName); l.unloadAddon(addonName);
}catch (Exception e) { }catch (Exception e) {
@ -162,11 +178,14 @@ public class Internaddon {
} }
@Command(name="caca",description = "Déclanche une exception ... Faut bien tester, hein !",admin=true)
public void caca(DiscordCCommande commande) {
throw new IllegalStateException("Nan mais tout va bien ... je fait ce qu'on m'a demandé ^^");
}
public class InternalddonCCommande implements DiscordCCommande,StringCCommande{
public class InternalddonCCommande implements DiscordCCommande{
Message m; Message m;
Laboratory labo; Laboratory labo;