diff --git a/src/net/borken/BotListener.java b/src/net/borken/BotListener.java new file mode 100644 index 0000000..1526037 --- /dev/null +++ b/src/net/borken/BotListener.java @@ -0,0 +1,87 @@ +package net.borken; + +import net.borken.Outils.AntiSpam; +import net.borken.Outils.Moderateur; +import net.dv8tion.jda.core.entities.ChannelType; +import net.dv8tion.jda.core.entities.Guild; +import net.dv8tion.jda.core.entities.Member; +import net.dv8tion.jda.core.entities.User; +import net.dv8tion.jda.core.events.DisconnectEvent; +import net.dv8tion.jda.core.events.ReadyEvent; +import net.dv8tion.jda.core.events.ReconnectedEvent; +import net.dv8tion.jda.core.events.StatusChangeEvent; +import net.dv8tion.jda.core.events.message.MessageReceivedEvent; +import net.dv8tion.jda.core.hooks.ListenerAdapter; +import net.dv8tion.jda.core.managers.GuildManager; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + + +/** + * Created by seb65 on 19/10/2016. + */ + +public class BotListener extends ListenerAdapter { + AntiSpam antispam=new AntiSpam(); + Moderateur modo = new Moderateur(); + Logger logger = LogManager.getLogger(); + + + @Override + public void onReady(ReadyEvent event) { + logger.info("Connection succees"); + } + + + + @Override + public void onMessageReceived(MessageReceivedEvent event) { + // ----------------------Test pour eviter eco de commande------------------------- + try + { + + if (event.getMessage().getContent().startsWith("//") && event.getMessage().getAuthor().getId() != event.getJDA().getSelfUser().getId()) { + //On a detecter que c'etait une commande + //System.out.println(event.getMessage().getContent()); + + MainBot.handleCommand(MainBot.parser.parse(event.getMessage().getContent(), event)); + + + + } + else if (event.getMessage().getAuthor().getId() != event.getJDA().getSelfUser().getId() && !event.getTextChannel().getName().equals("le_dongeon")) + { + //N'est pas une commande + + Guild serveur=event.getGuild(); + GuildManager guildManager = serveur.getManager(); + Member user = event.getMember(); + + if(!event.isFromType(ChannelType.PRIVATE)) + { + // appel de la methode d'analyse de message de "Moderateur" + if(!event.getAuthor().getName().equals("Aethex") && event.getMessage().getContent().length()>0) { + + if (modo.analyse(user, serveur, guildManager, event) == 1) { + antispam.extermine(user, serveur, guildManager,true, event); + } + } + else if(event.getMessage().getContent().length() == 0) + logger.error("Image detected, ignoring it."); + } + + + + + } + }catch (Exception e) + { + if (e.getMessage()==null) { + logger.error("NullPointerException"); + } else { + logger.error(e.getMessage()); + } + } + + } +} diff --git a/src/net/borken/MainBot.java b/src/net/borken/MainBot.java new file mode 100644 index 0000000..02ffd00 --- /dev/null +++ b/src/net/borken/MainBot.java @@ -0,0 +1,240 @@ +package net.borken; + +import net.borken.Outils.CommandParser; +import net.borken.Outils.DayListener; +import net.borken.Outils.Redirection; +import net.borken.commandes.*; +import net.borken.commandes.Over18.*; +import net.dv8tion.jda.core.AccountType; +import net.dv8tion.jda.core.JDA; +import net.dv8tion.jda.core.JDABuilder; +import net.dv8tion.jda.core.OnlineStatus; +import net.dv8tion.jda.core.entities.ChannelType; +import net.dv8tion.jda.core.entities.Guild; +import net.dv8tion.jda.core.entities.Member; +import net.dv8tion.jda.core.events.message.MessageReceivedEvent; +import net.dv8tion.jda.core.exceptions.RateLimitedException; +import net.dv8tion.jda.core.managers.GuildManager; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import javax.security.auth.login.LoginException; +import java.io.IOException; +import java.util.*; + +/** + * Created by seb65 on 19/10/2016. + */ +public class MainBot { + + private static JDA jda; + public static final CommandParser parser =new CommandParser(); + public static HashMap commandes = new HashMap<>(); + public static boolean okInit=false; + public static HashMap historique =new HashMap<>(); + public static HashMap message_compteur =new HashMap<>(); + + public static Hashtable userMulti = new Hashtable(); + public static Hashtable minuteurStatut = new Hashtable<>(); + + public static ArrayList> privateUsableCommand = new ArrayList<>(); + + static Logger logger = LogManager.getLogger(); + + public static void main(String[] args) throws IOException { + logger.trace("trace"); + logger.debug("debug"); + logger.info("info"); + logger.warn("warn"); + logger.error("error"); + Stop stopTh=new Stop(); + stopTh.start(); + /**************************** + * Initialisation * + ****************************/ + logger.info("-------------------INITIALISATION-------------------"); + //Bot démarrer sans token + if (args.length < 1) { + logger.fatal("Veuilliez indiquer le token du bot en argument..."); + okInit=false; + } + else + { + //Token présent + try + { + + logger.info("Connection au serveur..."); + //connection au bot + jda = new JDABuilder(AccountType.BOT).addListener(new BotListener()).setToken(args[0]).setBulkDeleteSplittingEnabled(false).buildBlocking(); + jda.setAutoReconnect(true); + jda.addEventListener(); + jda.addEventListener(); + + okInit=true; + + } + catch (LoginException | InterruptedException | RateLimitedException e) + { + logger.catching(e); + okInit=false; + } + } + + //Connection reussi + if(okInit) + { + /************************************* + * Definition des commande * + *************************************/ + commandes.put("ping", new PingCommande()); + commandes.put("help",new Help()); + commandes.put("move", new Move()); + commandes.put("spam", new Spam()); + commandes.put("ass",new Ass()); + commandes.put("boobs",new Boobs()); + commandes.put("pipe",new Pipe()); + commandes.put("sm",new SM()); + commandes.put("madame",new Madame()); + commandes.put("cat",new Cat()); + + privateUsableCommand.add(Help.class); + privateUsableCommand.add(PingCommande.class); + + //On recupere le l'id serveur + Guild serveur = jda.getGuilds().get(0); + + //On recupere le serveur manageur + GuildManager guildManager = serveur.getManager(); + + //on recupere les utilisateur conecter + List utilisateurCo = serveur.getMembers(); + + logger.info("Utilisatieur connecté: "); + for (Member anUtilisateurCo : utilisateurCo) //= for(int i=0; i userAction = serveur.getUsersByName("Broken_Fire"); + new Move().exc(userAction.get(0),"Big Daddy",true,serveur,serveur.getManager());*/ + Redirection urlRedirect=new Redirection(); + + } + + } + + /*************************************** + * Traitement de la commande * + ***************************************/ + public static void handleCommand(CommandParser.CommandContainer cmd) + { + //On verifie que la commande existe + if (commandes.containsKey(cmd.commande)) + { + if(cmd.event.isFromType(ChannelType.PRIVATE) && privateUsableCommand.contains(commandes.get(cmd.commande).getClass())) + { + commandes.get(cmd.commande).action(cmd.args, cmd.event); + commandes.get(cmd.commande).executed(true, cmd.event); + } + else if (!cmd.event.isFromType(ChannelType.PRIVATE)) + { + commandes.get(cmd.commande).action(cmd.args, cmd.event); + commandes.get(cmd.commande).executed(true, cmd.event); + } + else + cmd.event.getPrivateChannel().sendMessage("\n:warning: **__Commande non disponible en priver!__** :warning:").queue(); + + + } + else + { + MessageReceivedEvent event = cmd.event; + if(event.isFromType(ChannelType.PRIVATE)) + event.getPrivateChannel().sendMessage("\n:warning: **__Commande inconnue!__** :warning:\n:arrow_right: Utilisez `//help` pour voirs les commandes disponible. ").queue(); + else + event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n:warning: **__Commande inconnue!__** :warning:\n:arrow_right: Utilisez `//help` pour voirs les commandes disponible. ").queue(); + logger.info("Commande inconnue"); + } + + } + /******************************* + * RAZ Compteur Spam * + *******************************/ + public static class ModoTimer extends Thread{ + + + public ModoTimer() + { + + } + + + @Override + public void run() + { + while (true) + { + try { + sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + //System.out.println("\n5sec Ecoulées !"); + for (Member unUser: message_compteur.keySet() ) //=for(int i=0; i saveRoleUser; + public Member user; + public Guild serveur; + public GuildManager serveurManager; + public GuildController guildController; + + /** + * + * @param user + * @param cible + * @param reset + * @param serveur + * @param serveurManager + * @return + */ + public boolean exc(Member user, Role cible , boolean reset, Guild serveur, GuildManager serveurManager) + { + guildController = new GuildController(serveur); + boolean erreur = false; + List allRoll = serveur.getRoles(); + + + + //On recupere les roles de l'utilisateur + + List roleUserList = user.getRoles(); + + logger.info("Roles de " + user.getEffectiveName() + ":"); + + //On les save + saveRoleUser = roleUserList; + + //Ajout du role cible + + //On transforme la le role a ajouter en une liste pour pouvoir l'utiliser dans modifyMemberRoles + Collection temp = new ArrayList<>(); + temp.add(cible); + + //on fait ensuite les modif + guildController.modifyMemberRoles(user,temp,saveRoleUser).queue(); + + logger.info("Role " + cible + " attribuer a " + user.getEffectiveName()); + + this.user=user; + this.serveur=serveur; + this.serveurManager=serveurManager; + return erreur; + } + + @Override + + public boolean called(String[] args, MessageReceivedEvent event) { + return false; + } + + /** + * + * @param args + * @param event + */ + public void action(String[] args, MessageReceivedEvent event) + { + if(!event.isFromType(ChannelType.PRIVATE)) + { + if(args.length>=2) + { + serveur=event.getGuild(); + List userL = event.getMessage().getMentionedUsers(); + List roleL = event.getMessage().getMentionedRoles(); + + if(userL.size()<1 ||roleL.size()<1) + { + logger.info("Mentionnement Incorect."); + event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n:warning: **__Erreur de déplacement__** :warning:\n:arrow_right: Erreur, Utilisateur ou Role mal mentioner. `//help move` pour plus d'info ").queue(); + } + else + { + user = serveur.getMember(userL.get(0)); + Role roleCible = roleL.get(0); + serveur=event.getGuild(); + logger.info("Tentative de déplacement de "+user.getEffectiveName()+" vers "+roleCible.getName()+" par l'utilisateur "+event.getAuthor().getName()); + if(event.getMember().getRoles().contains(serveur.getRolesByName("Big_Daddy",false).get(0))) + { + + logger.info("Autorisation suffisante, deplacement autorisé"); + logger.info("Utilisateur trouvée"); + boolean erreur=this.exc(user,roleCible,true,serveur,serveur.getManager()); + if(erreur) + { + event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n:warning: **__Erreur de déplacement.__** :warning:\n:arrow_right: Verifier le rôle cible. ").queue(); + } + else + { + event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n:ok: **Déplacement de "+user.getEffectiveName()+" vers "+roleCible.getName()+" reussi.** :ok:").queue(); + } + } + else + { + logger.info("Autorisation insuffisante, deplacement refusé"); + event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n:warning: **__Vous n'avez pas l'autorisation de faire ca!__**:warning: ").queue(); + + } + } + + } + else + { + logger.warn("Arguments maquant."); + event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n:warning: **__Erreur de déplacement__** :warning:\n:arrow_right: Arguments manquant. `//help move` pour plus d'info ").queue(); + + } + } + else + event.getPrivateChannel().sendMessage("\n:warning: **__Commande non disponible en priver!__** :warning:"); + + + + + + + + + } + + /** + * + * @param args + * @return + */ + @Override + public String help(String[] args) { + return HELP; + } + + /** + * + * @param success + * @param event + */ + @Override + public void executed(boolean success, MessageReceivedEvent event) { + + } + +} diff --git a/src/net/borken/commandes/PingCommande.java b/src/net/borken/commandes/PingCommande.java new file mode 100644 index 0000000..8f66616 --- /dev/null +++ b/src/net/borken/commandes/PingCommande.java @@ -0,0 +1,46 @@ +package net.borken.commandes; + +import net.borken.Commande; +import net.dv8tion.jda.core.entities.ChannelType; +import net.dv8tion.jda.core.events.message.MessageReceivedEvent; +import org.apache.logging.log4j.LogManager; + +import java.sql.Timestamp; +import java.time.*; + + +/** + * Created by seb65 on 19/10/2016. + */ +public class PingCommande implements Commande { + + + private String HELP = "`//ping` \n :arrow_right:\t*Le bot vous répondra Pong!*"; + @Override + public boolean called(String[] args, MessageReceivedEvent event) { + return true; + } + + @Override + public void action(String[] args, MessageReceivedEvent event) { + long receivedTime = Timestamp.valueOf(LocalDateTime.ofInstant(event.getMessage().getCreationTime().toInstant(), ZoneId.systemDefault())).getTime(); + if(event.isFromType(ChannelType.PRIVATE)) + event.getPrivateChannel().sendMessage(":arrow_right: Pong! `"+((Timestamp.from(Instant.now()).getTime()-receivedTime))+"ms`").queue(); + else + event.getTextChannel().sendMessage(event.getAuthor().getAsMention()+"\n:arrow_right: Pong! `"+((Timestamp.from(Instant.now()).getTime()-receivedTime))+"ms`").queue(); + LogManager.getLogger().info("pong"); + } + + @Override + public String help(String[] args) { + + return HELP; + } + + @Override + public void executed(boolean success, MessageReceivedEvent event) + { + return; + + } +} diff --git a/src/net/borken/commandes/SpamInfo.java b/src/net/borken/commandes/SpamInfo.java new file mode 100644 index 0000000..484ae42 --- /dev/null +++ b/src/net/borken/commandes/SpamInfo.java @@ -0,0 +1,8 @@ +package net.borken.commandes; + +/** + * Created by sebastien on 13/03/17. + */ +public class SpamInfo { + +} diff --git a/src/net/borken/log4j2.xml b/src/net/borken/log4j2.xml new file mode 100644 index 0000000..efdbd28 --- /dev/null +++ b/src/net/borken/log4j2.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file