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 plugin: 'java-library'
apply plugin: 'eclipse'
apply plugin: 'java'
compileJava.options.encoding = 'UTF-8'
// In this section you declare where to find the dependencies of your project
repositories {
@ -54,7 +57,7 @@ task execute(type:JavaExec) {
task copyDependencies(type: Copy) {
group 'build'
from configurations.compile
from configurations.compile
into 'dependencies'
}
@ -74,6 +77,8 @@ dependencies {
compile 'com.thedeanda:lorem:2.1'
compile 'commons-io:commons-io:2.6'
// https://mvnrepository.com/artifact/mysql/mysql-connector-java
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.
* 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
* 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'

View File

@ -25,7 +25,7 @@ public class CommandeSurchargee {
public Method getExecutor(CCommande commande) {
Set<Class<?>> critargs = checkFiliature(Stream.of(commande.getClass()).collect(Collectors.toSet()));
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) {

View File

@ -63,7 +63,7 @@ public class EcouteurDEvents implements EventListener{
results.next();
Long geid = results.getLong(1);
looper = new Thread(new DbLooper(geid),"dbLooper-"+System.nanoTime());
looper.start();
} catch (SQLException e) {
System.err.println("IMPOSSIBLE de récuperer le MAX_GEID : L'Écouteur d'évents ne démarera pas");
@ -1007,7 +1007,7 @@ public class EcouteurDEvents implements EventListener{
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;
default:
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.stream.Collectors;
import org.apache.commons.io.output.TeeOutputStream;
import com.bernard.juliabot.JuliaAddon.JarWithMultipleAddonsException;
import com.bernard.juliabot.JuliaAddon.JuliaClassLoader;
import com.bernard.juliabot.api.*;
@ -41,6 +43,8 @@ public class Julia {
Connection eventDatabase;
Connection juliaDatabase;
JuliaErrPrintStream syserr;
public Julia() {
@ -62,37 +66,49 @@ public class Julia {
connectionProps.put("useSSL", "true");
connectionProps.put("requireSSL", "true");
try {
Class.forName("com.mysql.jdbc.Driver");
eventDatabase = DriverManager.getConnection("jdbc:mysql://192.168.1.41:3306/juliaEvents", 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");
e.printStackTrace();
syserr.flush();
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 {
lecouteur = new EcouteurDEvents(this);
jda = new JDABuilder(AccountType.BOT).setToken(token).addEventListener(lecouteur).build();
jda.awaitReady();
} 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();
syserr.flush();
return;
}
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/
update();//Va remplir la map avalivableAddons
//D<EFBFBD><EFBFBD>marrage du sysin
//Démarrage du sysin
sysinator = new ReadLoop();
Thread sysinThread = new Thread(sysinator, "sysin-reader");
sysinThread.start();
@ -101,7 +117,7 @@ public class Julia {
//Loader l'internalddon (hard-coded)
//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<>();
try {
Statement statement = juliaDatabase.createStatement();
@ -115,13 +131,15 @@ public class Julia {
} catch (SQLException e) {
System.err.println("Impossible de charger les plugins, vous aurez tout a faire a la main !");
e.printStackTrace();
syserr.flush();
}
System.out.println("Les addons <EFBFBD><EFBFBD> charger : "+toLoad);
System.out.println("Les addons à charger : "+toLoad);
try {
juliaDatabase.createStatement().executeUpdate("DELETE FROM loadedJuliaddons");
} catch (SQLException e) {
System.err.println("Je n'ai pas pu vider la table ... atention aux doublons !");
e.printStackTrace();
syserr.flush();
}
for(String l : toLoad) {
@ -134,12 +152,13 @@ public class Julia {
}
public synchronized void update() {
Map<String,JuliaAddon> avalivableAddons = new HashMap<>();
File juliaddonFolder = new File(juliaddonsFolder);
for(File f : juliaddonFolder.listFiles((parent,name)->name.toLowerCase().endsWith(".jar"))){
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());
try {
JarFile jar = new JarFile(f);
@ -147,7 +166,7 @@ public class Julia {
JuliaAddon addon = new JuliaAddon(jar);
String id = addon.pkg+":"+addon.version;
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);
}catch(JarWithMultipleAddonsException e) {
Set<Set<JarEntry>> addonsEntries = e.getAddonsEntries();
@ -156,26 +175,38 @@ public class Julia {
JuliaAddon addon = new JuliaAddon(jar, entry);
String id = addon.pkg+":"+addon.version;
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);
} catch (JarWithMultipleAddonsException e1) {
System.err.println("THIS SHOULD NOT HAPPEN");
System.err.println("TOUT EST CASS<53><53> ALERTE ROUGE !");
System.err.println("C'est problematique, j'<27><>teint tout, c'est mieux");
System.err.println("TOUT EST CASSÉ ALERTE ROUGE !");
System.err.println("C'est problematique, j'éteint tout, c'est mieux");
syserr.flush();
System.exit(31415926);
}
}
}catch(IllegalStateException e) {
System.err.println(e.getMessage());
syserr.flush();
}
} catch (IOException e) {
System.err.println("Impossible de lire le fichier jar "+f.getName());
e.printStackTrace();
syserr.flush();
}
syserr.flush();
}
this.avalivableAddons = avalivableAddons;
}
public Connection getJuliaDatabase() {
return juliaDatabase;
}
public class ReadLoop implements Runnable{
boolean running = false;
@ -189,8 +220,8 @@ public class Julia {
while(running) {
String request = sc.nextLine();
System.out.println("Je suis cens<EFBFBD><EFBFBD> avoir lu la commande "+request);
//TODO r<EFBFBD><EFBFBD>agir ...
System.out.println("Je suis censée avoir lu la commande "+request);
//TODO réagir ...
@ -200,6 +231,7 @@ public class Julia {
} catch (FileNotFoundException e) {
System.err.println("Erreur de lecture du sysin, je deviens sourd");
e.printStackTrace();
syserr.flush();
running=false;
}
}
@ -210,11 +242,11 @@ public class Julia {
public class Laboratory{
char laboratory;
Map<String,JuliaAddon> loadedAddons;//<pkg,JuliaAddon> : les addons charg<EFBFBD><EFBFBD>s dans ce laboratoire
Map<String,CommandeSurchargee> loadedCommands;//<commandName,Calling method> : les commandes charg<EFBFBD><EFBFBD>es
Map<Class<?>,Object> callerObjects; // <Classe, objet de cette classe> : Les objets instanci<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ées
Map<Class<?>,Object> callerObjects; // <Classe, objet de cette classe> : Les objets instanciés dans ce laboratoire
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>
@ -245,7 +277,7 @@ public class Julia {
public synchronized void loadAddon(String pkg,String version,boolean update) {
if(update)Julia.this.update();
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 {
PreparedStatement s = juliaDatabase.prepareStatement("INSERT INTO loadedJuliaddons (ID,laboratory,pkg,version) VALUES (NULL,?,?,?)");
s.setString(1, Character.toString(laboratory));
@ -255,6 +287,7 @@ public class Julia {
} catch (SQLException e) {
System.err.println("Je ne peux pas notifier la BDD que je load le plugin, je le load pas du coup ...");
e.printStackTrace();
syserr.flush();
return;
}
@ -268,17 +301,18 @@ public class Julia {
public synchronized void unloadAddon(String 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 {
PreparedStatement s = juliaDatabase.prepareStatement("DELETE FROM juliaddons WHERE laboratory=? AND pkg=?");
s.setString(1, Character.toString(laboratory));
s.setString(2, pkg);
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) {
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();
syserr.flush();
return;
}
JuliaAddon addon = loadedAddons.get(pkg);
@ -292,26 +326,26 @@ public class Julia {
//Verify that commands asks for good argument
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 {
m.setAccessible(true);
}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
//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())
.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"));
Arrays.stream(c.aliases())
.filter(a -> !aliases.containsKey(a)).forEach(alias -> aliases.put(alias, c.name()));
.filter(a -> !aliases.containsKey(a)).forEach(alias -> aliases.put(alias, c.name()));
//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());
//Enregistre la nouvelle surcharge
@ -323,10 +357,10 @@ public class Julia {
public synchronized void registerEvent(Method m, Discord d) {
Class<?>[] parameters = m.getParameterTypes();
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]))
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());
//La m<EFBFBD><EFBFBD>thode est v<EFBFBD><EFBFBD>rifi<EFBFBD><EFBFBD>e
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éthode est vérifiée
if(!loadedEvents.containsKey(parameters[0]))
loadedEvents.put((Class<? extends Event>) parameters[0], new HashSet<>());
checkObject(m.getDeclaringClass());
@ -335,7 +369,7 @@ public class Julia {
public synchronized void unregisterCommand(Method m,Command c) {
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
for(String alias:c.aliases())
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());
}
@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) {
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.get(parameters[0]).remove(m);
}
@ -370,7 +404,7 @@ public class Julia {
case "net.dv8tion.jda.core.JDA":
params[i] = Julia.this.jda;
break;
//TODO completer les param<EFBFBD><EFBFBD>tres
//TODO completer les paramètres
default:
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) {
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 fais tout planter du coup, votrez addon sera pas charg<EFBFBD><EFBFBD> !");
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é !");
throw new IllegalStateException("Pas de constructeur valable");
}
callerObjects.put(clazz, o);
@ -400,14 +434,15 @@ public class Julia {
try {
m.invoke(callable, event);
} 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);
} 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);
} 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();
syserr.flush();
throw new IllegalStateException(e);
}
}
@ -427,7 +462,7 @@ public class Julia {
CommandeSurchargee scommande = loadedCommands.get(cname);
Method m = scommande.getExecutor(content);
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()];
Arrays.fill(parameters, content);
final Object caller = callerObjects.get(m.getDeclaringClass());
@ -442,18 +477,22 @@ public class Julia {
m.invoke(caller, parameters);
} 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();
syserr.flush();
called.setExitValue(e.getCause());
} 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();
syserr.flush();
called.setExitValue(e.getCause());
} catch (InvocationTargetException e) {
//Lui a plant<EFBFBD><EFBFBD>
//Lui a planté
called.setExitValue(e.getCause());
System.err.println("L'appel a la commande a planté ...");
e.getCause().printStackTrace();
}
syserr.flush();
called.ended();
}, "commande-"+cname+".aka."+name+"-"+System.nanoTime());

View File

@ -8,6 +8,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@ -15,9 +16,9 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import com.bernard.juliabot.Julia.Laboratory;
import com.bernard.juliabot.api.Command;
import com.bernard.juliabot.api.Discord;
import com.bernard.juliabot.Julia.Laboratory;
import com.bernard.juliabot.api.JuLIAddon;
public class JuliaAddon {
@ -58,12 +59,12 @@ public class JuliaAddon {
//String jarExtra = jarMatcher.group(3);
version = jarVersion;
//Sets addon,pkg,version(si redefini) et addonClass
unassignedClassLoader = new JuliaClassLoader(jar, entriesToRead,new DummyLaboratory());
}
public synchronized JuliaClassLoader newClassLoader(Laboratory laboratory) {
if(unassignedClassLoader==null)
try {
@ -97,6 +98,8 @@ public class JuliaAddon {
public class JuliaClassLoader extends ClassLoader {
Map<String,Class<?>> loadedClasses;
Set<JarEntry> entries;
JarFile jar;
Laboratory laboratory = null;
HashSet<Method> registeredCommands;
@ -104,6 +107,8 @@ public class JuliaAddon {
public JuliaClassLoader(JarFile jar,Set<JarEntry> entriesToRead,Laboratory labo) throws JarWithMultipleAddonsException {
super();
entries = entriesToRead;
this.jar = jar;
loadedClasses = new HashMap<>();
this.laboratory = labo;
Set<Class<?>> readClasses = new HashSet<>();
@ -116,11 +121,12 @@ public class JuliaAddon {
//Le fichier est un .class
try {
String className = entry.getName().replaceAll("/", ".").substring(0, entry.getName().length()-".class".length());
byte[] classData = new byte[(int) entry.getSize()];
InputStream reader = jar.getInputStream(entry);
reader.read(classData);
reader.close();
Class<?> clazz = defineClass(className,classData,0,(int) entry.getSize());
Class<?> clazz;
try {
clazz = loadClass(className);
} catch (ClassNotFoundException e) {
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);
//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());
String pkg = m.group(1);
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);
//If overwritten, will JarWithMultipleAddonsException
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");
e.printStackTrace();
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) {
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();
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
if(juliaddons.size() > 1) {
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
pkg = pkg.substring(0, lastPoint+1);//Recule de un dossier
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);
continue eLoop;
}
@ -193,9 +195,7 @@ public class JuliaAddon {
}
//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
for(Class<?> clazz : readClasses)
loadedClasses.put(clazz.getName(), clazz);
//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
}
@ -204,13 +204,30 @@ public class JuliaAddon {
public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
if(loadedClasses.containsKey(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);
if(cl != null)
try {
return cl.loadClass(name, resolve);
}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
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
} catch (SecurityException | ClassNotFoundException e) {
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) {
Command c = m.getAnnotation(Command.class);

View File

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

View File

@ -1,16 +1,30 @@
package com.bernard.juliabot.internaddon;
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.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.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 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;
@JuLIAddon(name="internaddon", devs = "Bernard", version="beta", important=true)
@ -18,15 +32,20 @@ public class Internaddon {
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) {
if(e.getMessage().getContentRaw().startsWith(COMMANDEUR)) {
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);
CommandCalled called = labo.executeCommand(name, ccommande);
try {
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();
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 !",
"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 = julias[(int)Math.floor(Math.random() * julias.length)];
channel.sendMessage(out).queue();
@ -51,7 +70,7 @@ public class Internaddon {
s.append("```");
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");
for(JuliaAddon e : l.getLoadedAddons().values())
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) {
if(e.getAuthor().getIdLong() == 460893368264687656L) {//Yukimyo
if(e.getAuthor().getIdLong() == 187677269626585089L) {//Yukimyo = L'Orchidoclaste
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) {
CommandArguments ca = commande.getArguments();
@ -119,9 +138,6 @@ public class Internaddon {
Julia.theJulia().update();
}
@Command(name="load",description = "Charge l'addon dans ce laboratoire",admin=true)
@ -134,7 +150,7 @@ public class Internaddon {
Laboratory l = commande.getLabo();
String out = "Terminé avec succès";
String out = "Terminé avec succés";
try {
l.loadAddon(addonName, version);
}catch (Exception e) {
@ -152,7 +168,7 @@ public class Internaddon {
Laboratory l = commande.getLabo();
String out = "Terminé avec succès";
String out = "Terminé avec succés";
try {
l.unloadAddon(addonName);
}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{
public class InternalddonCCommande implements DiscordCCommande,StringCCommande{
Message m;
Laboratory labo;