Browse Source

Refactoring pour permettre à plusieurs Bots différents de tourner.

Martin Passard 6 years ago
parent
commit
ad292f2aac

+ 1 - 1
ressources/config/config.properties

@@ -8,7 +8,7 @@ SERVER=irc.geeknode.net
 #Main port
 PORT=6667
 #Channels with
-CHANNELS=#ffdn,#marmat
+CHANNELS=#marmat
 
 ##IRC bot admins setting ##
 #Set who will be messaged if the bot needs to: exemple: if it get's kicked from somewhere

+ 21 - 11
src/actions/Action.java

@@ -4,25 +4,26 @@ import java.util.ArrayList;
 import java.util.List;
 
 import data.Message;
+import main.Bot;
 import main.IRCBot;
 
 public abstract class Action {
 
 	public List<String> keyWords;
-	public IRCBot iRCBot;
+	public Bot bot;
 	public volatile static char CARACTERE_COMMANDE = '+';
 	
-	protected Action(IRCBot b, List<String> keywords) {
+	protected Action(Bot b, List<String> keywords) {
 		this.keyWords = keywords;
-		this.iRCBot = b;
+		this.bot = b;
 	}
 	
-	protected Action(IRCBot b) {
-		this.iRCBot = b;
+	protected Action(Bot b) {
+		this.bot = b;
 	}
 	
-	protected Action(IRCBot b, String...keywords) {
-		this.iRCBot = b;
+	protected Action(Bot b, String...keywords) {
+		this.bot = b;
 		List<String> ar = new ArrayList<>(keywords.length); 
 		for(int i=0;i<keywords.length;++i) {
 			ar.add(keywords[i]);
@@ -30,17 +31,26 @@ public abstract class Action {
 		this.keyWords=ar;
 	}
 	
-	
+	/**
+	 * @deprecated
+	 * @param channel
+	 * @param sender
+	 * @param login
+	 * @param hostname
+	 * @param message
+	 */
+	public abstract void react(String channel, String sender,
+			String login, String hostname, Message message);
 	/**
 	 * 
-	 * Methode réagissant au message @see PircBot;
+	 * Methode réagissant au message @see ;
 	 * @param channel channer sur l'IRC
 	 * @param sender personne ayant envoyé le message
 	 * @param login	login du bot
 	 * @param hostname hostname actuell
 	 * @param message message en question
 	 */
-	public abstract void react(String channel, String sender,
+	public abstract List<String> reactL(String channel, String sender,
 			String login, String hostname, Message message);
 	
 	public void reactUsingMessage(String channel,String sender,
@@ -98,7 +108,7 @@ public abstract class Action {
 	 * @param b Bot que nous utiliserons pour nos actions
 	 * @return Liste d'actions prete à être utilisée dans un forEach verifiant si elle doivent être executées.
 	 */
-	public static List<Action> getAllActions(IRCBot b){
+	public static List<Action> getAllActions(Bot b){
 		List<Action> ar= new ArrayList<>();
 		ar.add(new Help(b));
 		ar.add(new Contact(b));

+ 25 - 5
src/actions/Contact.java

@@ -5,13 +5,13 @@ import java.util.List;
 
 import data.ISP;
 import data.Message;
-import main.IRCBot;
+import main.Bot;
 import main.Cache;
 import verif_saisie.EntierPositifNonVide;
 
 public class Contact extends Action {
 
-	public Contact(IRCBot b) {
+	public Contact(Bot b) {
 		super(b);
 		List<String> ar = new ArrayList<>();
 		ar.add("contact");
@@ -25,23 +25,43 @@ public class Contact extends Action {
 	}
 
 	@Override
+	@Deprecated
 	public void react(String channel, String sender, String login, String hostname, Message message) {
 
 		if(message.hasNoParameters()) {
-			iRCBot.sendMessage(sender, message.commandCharacterAndKeyword()+help());
+			bot.sendMessage(sender, channel, message.commandCharacterAndKeyword()+help());
 		}else{
 			Cache c = Cache.getInstance();
 			String s = message.getAllParametersAsOneString();
 			ISP fai = c.getISPWithName(s);
 			if(fai == null) {
-				iRCBot.sendMessage(sender,channel, "Aucun FAI "+s);
+				bot.sendMessage(sender,channel, "Aucun FAI "+s);
 			}else {
-				iRCBot.sendMessages(sender, channel, fai.contact());
+				bot.sendMessages(sender, channel, fai.contact());
 			}
 		}
 		
 	}
 
+
+	@Override
+	public List<String> reactL(String channel, String sender, String login, String hostname, Message message) {
+		List<String> res = new ArrayList<>();
+		if(message.hasNoParameters()) {
+			res.add(message.commandCharacterAndKeyword()+help());
+		}else{
+			Cache c = Cache.getInstance();
+			String s = message.getAllParametersAsOneString();
+			ISP fai = c.getISPWithName(s);
+			if(fai == null) {
+				res.add("Aucun FAI "+s);
+			}else {
+				res.addAll(fai.contact());
+			}
+		}
+		return res;
+	}
+
 	
 
 }

+ 73 - 17
src/actions/Distance.java

@@ -9,14 +9,14 @@ import data.AddresseToGPS.Lieu;
 import data.Coordinates;
 import data.ISP;
 import data.Message;
-import data.MultiplePossibleAddressException;
-import main.IRCBot;
+import data.ErrorAddressException;
+import main.Bot;
 import main.Cache;
 
 public class Distance extends Action {
 	public static final int NOMBRE_AFFICHABLE = 3;
 
-	public Distance(IRCBot b) {
+	public Distance(Bot b) {
 		super(b);
 		List<String> kw = new ArrayList<>();
 		kw.add("dist");
@@ -24,7 +24,7 @@ public class Distance extends Action {
 		this.keyWords=kw;
 	}
 
-	
+	@Deprecated
 	private void affichePlusProches(double latitude, double longitude, String sender, String channel) {
 		ISP[] plusProches = getISPPlusProche(latitude, longitude);
 		for(int i=0;i<plusProches.length;++i) {
@@ -34,26 +34,42 @@ public class Distance extends Action {
 				nf.setMaximumFractionDigits(2);
 				nf.setMinimumFractionDigits(0);
 				distance = distance / 1000.0; 	//On met en KM		
-				iRCBot.sendMessage(sender,channel, (i+1)+": "+plusProches[i].getBetterName()+" à "+nf.format(distance)+" Km");
+				bot.sendMessage(sender,channel, (i+1)+": "+plusProches[i].getBetterName()+" à "+nf.format(distance)+" Km");
 			}
 		}
 	}
-
+	
+	private List<String> getPlusProchesL(double latitude, double longitude, String sender, String channel) {
+		List<String> res = new ArrayList<>();
+		ISP[] plusProches = getISPPlusProche(latitude, longitude);
+		for(int i=0;i<plusProches.length;++i) {
+			if(plusProches[i]!=null) {
+				double distance =  plusProches[i].getData().getCoordonnees().distanceAvec(latitude, longitude);
+				NumberFormat nf = NumberFormat.getInstance();
+				nf.setMaximumFractionDigits(2);
+				nf.setMinimumFractionDigits(0);
+				distance = distance / 1000.0; 	//On met en KM		
+				res.add((i+1)+": "+plusProches[i].getBetterName()+" à "+nf.format(distance)+" Km");
+			}
+		}
+		return res;
+	}
+	
+	
+	
 	/**
-	 * 
 	 * @param message message recu
 	 * @param sender personne qui envoie le message
 	 * @param channel channel dont le message provient
 	 * @return Les coordonnées du lieu correspondant au contenu du message
-	 * @throws MultiplePossibleAddressException Si il y a plussieurs coordonnées correspondantes à l'adresse demandée.
+	 * @throws ErrorAddressException Si il y a plussieurs coordonnées correspondantes à l'adresse demandée.
 	 */
-	private Coordinates getCoordinatesFromMessage(String message, String sender, String channel) throws MultiplePossibleAddressException {
+	private Coordinates getCoordinatesFromMessage(String message, String sender, String channel) throws ErrorAddressException {
 		final double MAX_DIFF = 0.1; //Differences there MUST between 2 coordinates so they are seen as differents
 		AddresseToGPS a2gps = new AddresseToGPS(message.substring(message.indexOf(' ')+1));
 		Lieu[] lieux = a2gps.getAllLieu();
 		if(lieux == null || lieux.length == 0) {
-			iRCBot.sendMessage(sender,channel, "Aucun lieu ne correspond. Requete effectuée: "+a2gps.getAddressToQuerry());
-			return null;
+			throw new ErrorAddressException(null, a2gps.getAdresse(),"Aucun lieu ne correspond. Requete effectuée: "+a2gps.getAddressToQuerry());
 		}else if(lieux.length == 1) {
 			return lieux[0].coordonees;
 		}else {
@@ -61,7 +77,7 @@ public class Distance extends Action {
 			for(int i=0;i<lieux.length; ++i) {
 				for(int j=0;j<lieux.length; ++j) {
 					if(!lieux[i].coordonees.equals(lieux[j].coordonees, MAX_DIFF)) {
-						throw new MultiplePossibleAddressException(lieux, a2gps.getAdresse());
+						throw new ErrorAddressException(lieux, a2gps.getAdresse());
 					}
 				}
 			}
@@ -70,7 +86,8 @@ public class Distance extends Action {
 
 	}
 
-
+	
+	
 	/**
 	 * Récupere le FAI le plus proche de la position indiquée en paramètre. Utilise {@link Distance#getISPPlusProche(Coordinates)}
 	 * @param latitude
@@ -134,6 +151,7 @@ public class Distance extends Action {
 	}
 
 	@Override
+	@Deprecated
 	public void react(String channel, String sender, String login, String hostname, Message message) {
 		double latitude = Double.POSITIVE_INFINITY, longitude = latitude;
 		if(!message.hasNoParameters()) {
@@ -147,10 +165,10 @@ public class Distance extends Action {
 					latitude = ca.getLatitude();
 					longitude = ca.getLongitude();
 					affichePlusProches(latitude, longitude, sender, channel);
-				} catch (MultiplePossibleAddressException e1) {
-					iRCBot.sendMessage(sender, channel, "Plusieurs possibilités pour cet endroit, nous choisirons le premier:");
+				} catch (ErrorAddressException e1) {
+					bot.sendMessage(sender, channel, "Plusieurs possibilités pour cet endroit, nous choisirons le premier:");
 					for(int i = 0; i<e1.lieux.length; ++i) {
-						iRCBot.sendMessage(sender, channel, (i+1)+":"+e1.lieux[i].toString());
+						bot.sendMessage(sender, channel, (i+1)+":"+e1.lieux[i].toString());
 					}
 					latitude = e1.lieux[0].coordonees.getLatitude();
 					longitude = e1.lieux[0].coordonees.getLongitude();
@@ -159,11 +177,49 @@ public class Distance extends Action {
 			}
 
 		}else {
-			iRCBot.sendMessage(sender, channel, message.commandCharacterAndKeyword()+help());
+			bot.sendMessage(sender, channel, message.commandCharacterAndKeyword()+help());
 		}
 	
 		
 	}
 
+
+	@Override
+	public List<String> reactL(String channel, String sender, String login, String hostname, Message message) {
+		List<String> res = new ArrayList<>();
+		double latitude = Double.POSITIVE_INFINITY, longitude = latitude;
+		if(!message.hasNoParameters()) {
+			try {
+				latitude = message.getElementAsDouble(0);
+				longitude = message.getElementAsDouble(1);
+				res.addAll(getPlusProchesL(latitude, longitude, sender, channel));
+			}catch(NumberFormatException e) {	//Cela doit alors être une adresse!
+				try {
+					Coordinates ca = getCoordinatesFromMessage(message.getAllParametersAsOneString(), sender, channel);
+					latitude = ca.getLatitude();
+					longitude = ca.getLongitude();
+					res.addAll(getPlusProchesL(latitude, longitude, sender, channel));
+				} catch (ErrorAddressException e1) {
+					if(!e1.isVide()) {
+						res.add("Plusieurs possibilités pour cet endroit, nous choisirons le premier:");
+						for(int i = 0; i<e1.lieux.length; ++i) {
+							res.add((i+1)+":"+e1.lieux[i].toString());
+						}
+						latitude = e1.lieux[0].coordonees.getLatitude();
+						longitude = e1.lieux[0].coordonees.getLongitude();
+						res.addAll(getPlusProchesL(latitude, longitude, sender, channel));
+					}else {
+						res.add(e1.msg);
+					}
+				}
+			}
+
+		}else {
+			res.add(message.commandCharacterAndKeyword()+help());
+		}
+	
+		return res;
+	}
+
 }
 

+ 56 - 8
src/actions/Help.java

@@ -4,11 +4,11 @@ import java.util.ArrayList;
 import java.util.List;
 
 import data.Message;
-import main.IRCBot;
+import main.Bot;
 
 public class Help extends Action {
 
-	public Help(IRCBot b) {
+	public Help(Bot b) {
 		super(b);
 		List<String> kw = new ArrayList<>(3);
 		kw.add("help");
@@ -18,7 +18,7 @@ public class Help extends Action {
 
 
 	/**
-	 * 
+	 * @deprecated remplacé par getListeCommandes
 	 * @param l liste des actions possibles
 	 * @param sender personne ayant envoyé le message de demande
 	 * @param channel channel dans lequel la demande à été envoyé
@@ -28,7 +28,15 @@ public class Help extends Action {
 		for(Action a : l) {
 			listeCommandes += CARACTERE_COMMANDE+a.keyWords.get(0)+" ";
 		}
-		iRCBot.sendMessage(sender,channel, listeCommandes);
+		bot.sendMessage(sender,channel, listeCommandes);
+	}
+	
+	private String getListeCommandes(List<Action> l, String sender, String channel) {
+		String listeCommandes="Voici la liste des commandes: ";
+		for(Action a : l) {
+			listeCommandes += CARACTERE_COMMANDE+a.keyWords.get(0)+" ";
+		}
+		return listeCommandes;
 	}
 
 
@@ -38,11 +46,12 @@ public class Help extends Action {
 	}
 
 	@Override
+	@Deprecated
 	public void react(String channel, String sender, String login, String hostname, Message message) {
-		List<Action> l = Action.getAllActions((IRCBot) iRCBot);
+		List<Action> l = Action.getAllActions(bot);
 		boolean hasreacted = false;
 		if(message.hasNoParameters()) {
-			iRCBot.sendMessage(sender,channel, help());
+			bot.sendMessage(sender,channel, help());
 			afficheListeCommandes(l, sender, channel);
 			hasreacted = true;
 		}else {
@@ -57,7 +66,7 @@ public class Help extends Action {
 							msg+=Action.CARACTERE_COMMANDE+s+" ";
 						}
 						msg += a.help();
-						iRCBot.sendMessage(sender,channel, msg);
+						bot.sendMessage(sender,channel, msg);
 						hasreacted = true;
 					}
 				}
@@ -65,10 +74,49 @@ public class Help extends Action {
 
 			// Si il n'as pas encore réagi
 			if(!hasreacted) {
-				iRCBot.sendMessage(sender,channel, "Commande inconnue.");
+				bot.sendMessage(sender,channel, "Commande inconnue.");
 				afficheListeCommandes(l, sender, channel);
 			}
 
 		}
 	}
+	
+	@Override
+	public List<String> reactL(String channel, String sender, String login, String hostname, Message message) {
+		List<String> res = new ArrayList<>();
+		List<Action> l = Action.getAllActions(bot);
+		boolean hasreacted = false;
+		if(message.hasNoParameters()) {
+			res.add(help());
+			res.add(getListeCommandes(l, sender, channel));
+			hasreacted = true;
+		}else {
+			int nbParameters = message.parameterSize();
+			for(int i=0; i<nbParameters; ++i) {
+				String commande = message.getElementAsString(i);
+				commande = commande.replaceAll(""+Action.CARACTERE_COMMANDE, "");
+				for(Action a : l) {
+					if(a.keyWords.contains(commande)) {
+						String msg = "";
+						for(String s : a.keyWords) {
+							msg+=Action.CARACTERE_COMMANDE+s+" ";
+						}
+						msg += a.help();
+						res.add (msg);
+						hasreacted = true;
+					}
+				}
+			}
+
+			// Si il n'as pas encore réagi
+			if(!hasreacted) {
+				res.add("Commande inconnue.");
+				res.add(getListeCommandes(l, sender, channel));
+			}
+
+		}
+		return res;
+	}
+
+
 }

+ 40 - 6
src/actions/ID.java

@@ -6,6 +6,7 @@ import java.util.List;
 import data.ISP;
 import data.Message;
 import main.IRCBot;
+import main.Bot;
 import main.Cache;
 import verif_saisie.EntierPositifNonVide;
 
@@ -15,15 +16,15 @@ import verif_saisie.EntierPositifNonVide;
  */
 public class ID extends Action {
 
-	public ID(IRCBot b) {
+	public ID(Bot b) {
 		super(b);
 		List<String> keywords = new ArrayList<>();
 		keywords.add("id");
 		this.keyWords=keywords;
 	}
 
-	private void erreur(String sender,String channel, String s) {
-		iRCBot.sendMessage(sender,channel, sender+": "+s);
+	private String erreur(String sender,String channel, String s) {
+		return sender+": "+s;
 	}
 
 	@Override
@@ -32,6 +33,7 @@ public class ID extends Action {
 	}
 
 	@Override
+	@Deprecated
 	public void react(String channel, String sender, String login, String hostname, Message message) {
 		if(message.hasNoParameters()) {
 			erreur(sender,channel,"Erreur de syntaxe: vous devez specifier un ID ou un nom");
@@ -42,15 +44,15 @@ public class ID extends Action {
 				int id = Integer.parseInt(idString);
 				ISP fai = c.getISPWithID(id);
 				if(fai!=null) {
-					iRCBot.sendMessage(sender, "Le FAI "+id+" est: "+fai.getBetterName());
+					bot.sendMessage(sender, channel, "Le FAI "+id+" est: "+fai.getBetterName());
 				}else {
 					erreur(sender,sender,idString+" est un id null");
 				}
 			}else {
 				ISP fai = c.getISPWithName(idString);
 				if(fai!=null) {
-					iRCBot.sendMessage(sender,channel, "Le FAI "+fai.getBetterName()+" a pour ID: "+fai.getId());
-					iRCBot.sendMessage(sender,channel, "L'url dans db est https://db.ffdn.org/api/v1/isp/"+fai.getId()+"/");
+					bot.sendMessage(sender,channel, "Le FAI "+fai.getBetterName()+" a pour ID: "+fai.getId());
+					bot.sendMessage(sender,channel, "L'url dans db est https://db.ffdn.org/api/v1/isp/"+fai.getId()+"/");
 				}else {
 					erreur(sender,channel,idString+" ne correspond a aucun FAI");
 				}
@@ -59,5 +61,37 @@ public class ID extends Action {
 
 		}
 	}
+	
+
+	@Override
+	public List<String> reactL(String channel, String sender, String login, String hostname, Message message) {
+		List<String> res = new ArrayList<>();
+		if(message.hasNoParameters()) {
+			res.add(erreur(sender,channel,"Erreur de syntaxe: vous devez specifier un ID ou un nom"));
+		}else {
+			Cache c = Cache.getInstance();
+			String idString=message.getAllParametersAsOneString();
+			if(EntierPositifNonVide.verifie(idString)) {
+				int id = Integer.parseInt(idString);
+				ISP fai = c.getISPWithID(id);
+				if(fai!=null) {
+					res.add("Le FAI "+id+" est: "+fai.getBetterName());
+				}else {
+					res.add(erreur(sender,sender,idString+" est un id null"));
+				}
+			}else {
+				ISP fai = c.getISPWithName(idString);
+				if(fai!=null) {
+					res.add("Le FAI "+fai.getBetterName()+" a pour ID: "+fai.getId());
+					res.add("L'url dans db est https://db.ffdn.org/api/v1/isp/"+fai.getId()+"/");
+				}else {
+					res.add(erreur(sender,channel,idString+" ne correspond a aucun FAI"));
+				}
+
+			}
+
+		}
+		return res;
+	}
 
 }

+ 77 - 9
src/actions/Info.java

@@ -8,6 +8,7 @@ import data.ISP;
 import data.ISPDAO;
 import data.Message;
 import main.IRCBot;
+import main.Bot;
 import main.Cache;
 import verif_saisie.EntierPositifNonVide;
 /**
@@ -19,7 +20,7 @@ public class Info extends Action {
 	
 	public static boolean INFO_ALL = false;
 
-	public Info(IRCBot b) {
+	public Info(Bot b) {
 		super(b);
 		List<String> ar = new ArrayList<>();
 		ar.add("info");
@@ -32,14 +33,15 @@ public class Info extends Action {
 	}
 
 	@Override
+	@Deprecated
 	public void react(String channel, String sender, String login, String hostname, Message message) {
 		
 		if(message.hasNoParameters()) {
-			iRCBot.sendMessage(channel,message.commandCharacterAndKeyword()+" doit être suivi d'une chaine de caractère ou d'un numero");
+			bot.sendMessage(sender,channel,message.commandCharacterAndKeyword()+" doit être suivi d'une chaine de caractère ou d'un numero");
 		}else {
 			String s = message.getAllParametersAsOneString();
 			ISPDAO idao = ISPDAO.getInstance();
-			IRCBot ib = iRCBot;
+			Bot ib = bot;
 
 			if(!EntierPositifNonVide.verifie(s)) {			// Un mot après commande
 
@@ -60,12 +62,12 @@ public class Info extends Action {
 					Cache c = Cache.getInstance();
 					ISP i = c.getISPWithName(s);
 					if(i == null) {
-						iRCBot.sendMessage(sender, "Recherche d'une zone "+s);
+						bot.sendMessage(sender, channel, "Recherche d'une zone "+s);
 						ISP j = c.getISPWithGeoZone(s);
 						if(j == null)
-							iRCBot.sendMessage(sender, channel, "Le FAI "+s+" est Inconnu, désolé. Et aucun FAI n'opère sur une sone dénomée "+s+" ...");
+							bot.sendMessage(sender, channel, "Le FAI "+s+" est Inconnu, désolé. Et aucun FAI n'opère sur une sone dénomée "+s+" ...");
 						else {
-							iRCBot.sendMessage(sender, channel, "Un FAI opère sur une zone correspondante : ");
+							bot.sendMessage(sender, channel, "Un FAI opère sur une zone correspondante : ");
 							ib.sendMessages(sender, channel, j.toStringIRC());
 							List<CoveredAreas> cas = j.getCoveredAreas(s);
 							String technos = "Avec pour techno:";
@@ -74,7 +76,7 @@ public class Info extends Action {
 								technos+=ca.getTechnos()+" ";
 								}
 							}
-							iRCBot.sendMessage(sender, channel, technos);
+							bot.sendMessage(sender, channel, technos);
 						}
 					}else {
 						ib.sendMessages(sender,channel, i.toStringIRC());
@@ -88,10 +90,10 @@ public class Info extends Action {
 					int  id = message.getElementAsInt(i);
 					List<String> strings = idao.getISP(id).toStringIRC();
 						for(String response : strings) {
-							iRCBot.sendMessage(sender, channel, response);
+							bot.sendMessage(sender, channel, response);
 						}
 					}catch(NumberFormatException ne) {
-						iRCBot.sendMessage(sender, channel, message.getElementAsString(i)+" n'est pas un nombre");
+						bot.sendMessage(sender, channel, message.getElementAsString(i)+" n'est pas un nombre");
 					}
 				}
 			}
@@ -99,6 +101,72 @@ public class Info extends Action {
 		
 	}
 
+	@Override
+	public List<String> reactL(String channel, String sender, String login, String hostname, Message message) {
+		List<String> res = new ArrayList<>();
+		if(message.hasNoParameters()) {
+			res.add(message.commandCharacterAndKeyword()+" doit être suivi d'une chaine de caractère ou d'un numero");
+		}else {
+			String s = message.getAllParametersAsOneString();
+			ISPDAO idao = ISPDAO.getInstance();
+
+			if(!EntierPositifNonVide.verifie(s)) {			// Un mot après commande
+
+				if(s.equalsIgnoreCase("all") && INFO_ALL) {	          			  // info all
+					Cache c = Cache.getInstance();
+					res.addAll(c.toStringIRC());
+					for(ISP i : c.getListe()) {
+						if(i.isFFDNMember()) {
+							res.addAll(i.toStringIRC());
+						}
+					}
+
+				}else if(s.equalsIgnoreCase("ffdn")) {				//info ffdn
+					Cache c = Cache.getInstance();
+					res.addAll(c.toStringIRC());
+
+				}else {												//info FAI / Zone
+					Cache c = Cache.getInstance();
+					ISP i = c.getISPWithName(s);
+					if(i == null) {
+						res.add("Recherche d'une zone "+s);
+						ISP j = c.getISPWithGeoZone(s);
+						if(j == null)
+							res.add("Le FAI "+s+" est Inconnu, désolé. Et aucun FAI n'opère sur une sone dénomée "+s+" ...");
+						else {
+							res.add("Un FAI opère sur une zone correspondante : ");
+							res.addAll(j.toStringIRC());
+							List<CoveredAreas> cas = j.getCoveredAreas(s);
+							String technos = "Avec pour techno:";
+							for(CoveredAreas ca: cas) {
+								if(ca.getName().toLowerCase().contains(s.toLowerCase())) {
+								technos+=ca.getTechnos()+" ";
+								}
+							}
+							res.add(technos);
+						}
+					}else {
+						res.addAll(i.toStringIRC());
+					}
+				}
+
+			}else {												// Un nombre après info
+				int nbParameters = message.parameterSize();
+				for(int i=0; i<nbParameters;i++) {
+					try {
+					int id = message.getElementAsInt(i);
+					res.addAll(idao.getISP(id).toStringIRC());
+						
+					}catch(NumberFormatException ne) {
+						res.add(message.getElementAsString(i)+" n'est pas un nombre");
+					}
+				}
+			}
+		}
+		return res;
+		
+	}
+
 }
 
 

+ 11 - 4
src/actions/Liste.java

@@ -8,7 +8,7 @@ import data.ISP;
 import data.ISPDAO;
 import data.Message;
 import main.AffichableSurIRC;
-import main.IRCBot;
+import main.Bot;
 import main.Cache;
 
 /**
@@ -20,7 +20,7 @@ public class Liste extends Action {
 	
 	public static volatile boolean allAllowed=true;
 
-	public Liste(IRCBot b) {
+	public Liste(Bot b) {
 		super(b);
 		List<String> ar = new ArrayList<>();
 		ar.add("liste");
@@ -33,8 +33,16 @@ public class Liste extends Action {
 		return " Liste tous les FAI de la fédération. L'Ajout du parametre All affiche aussi ceux hors fédération.";
 	}
 
+	
 	@Override
+	@Deprecated
 	public void react(String channel, String sender, String login, String hostname, Message message) {
+		bot.sendMessages(sender,channel, reactL(channel, sender, login, hostname, message));
+		
+	}
+
+	@Override
+	public List<String> reactL(String channel, String sender, String login, String hostname, Message message) {
 		ISPDAO idao = ISPDAO.getInstance();
 		Cache c = Cache.getInstance();
 		List<ISP> listeFAI=null;
@@ -80,8 +88,7 @@ public class Liste extends Action {
 			}
 		}
 		messages.add(s);
-		iRCBot.sendMessages(sender,channel, messages);
-		
+		return messages;
 	}
 
 }

+ 26 - 5
src/actions/RP.java

@@ -10,7 +10,7 @@ import java.util.Date;
 import java.util.List;
 
 import data.Message;
-import main.IRCBot;
+import main.Bot;
 import main.Main;
 import main.PropertiesSetter;
 
@@ -28,7 +28,7 @@ public class RP extends Action {
 	 * Crée le fichier si il n'existe pas et prépare la possibilité d'utiliser l'action rp.
 	 * @param b bot b
 	 */
-	protected RP(IRCBot b) {
+	protected RP(Bot b) {
 		super(b);
 		List<String> ar = new ArrayList<>();
 		ar.add("rp");
@@ -81,16 +81,37 @@ public class RP extends Action {
 		try {
 			writer = new PrintWriter(rpFile, "UTF-8");
 		} catch (FileNotFoundException e) {
-			iRCBot.sendMessageToAdmins("Erreur: Le fichier rp n'existe pas, impossible d'écrire");
-			iRCBot.sendMessageToAdmins(e.getLocalizedMessage());
+			bot.sendMessageToAdmins("Erreur: Le fichier rp n'existe pas, impossible d'écrire");
+			bot.sendMessageToAdmins(e.getLocalizedMessage());
 			e.printStackTrace();
 		} catch (UnsupportedEncodingException e) {
 			e.printStackTrace();
 		}
 		writer.println(Main.DATE_FORMAT_OUT.format(now)+": "+message.getAllParametersAsOneString());
-		iRCBot.sendMessage(sender, channel, "Ajout a la RP réussi!");
+		bot.sendMessage(sender, channel, "Ajout a la RP réussi!");
 		writer.close();
 		
 	}
 
+	@Override
+	public List<String> reactL(String channel, String sender, String login, String hostname, Message message) {
+		List<String> res = new ArrayList<>();
+		Date now = new Date();
+		PrintWriter writer = null;
+		try {
+			writer = new PrintWriter(rpFile, "UTF-8");
+		} catch (FileNotFoundException e) {
+			String s = "Erreur: Le fichier rp n'existe pas, impossible d'écrire";
+			System.err.println(s);
+			res.add(s);
+			e.printStackTrace();
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		writer.println(Main.DATE_FORMAT_OUT.format(now)+": "+message.getAllParametersAsOneString());
+		res.add("Ajout a la RP réussi!");
+		writer.close();
+		return res;
+	}
+
 }

+ 40 - 8
src/actions/RSS.java

@@ -4,7 +4,8 @@ import java.util.ArrayList;
 import java.util.List;
 
 import data.Message;
-import main.IRCBot;
+import main.Bot;
+import main.Main;
 import rss.RssData;
 import rss.RssDataRemainder;
 
@@ -16,7 +17,7 @@ import rss.RssDataRemainder;
 
 public class RSS extends Action {
 
-	public RSS(IRCBot b) {
+	public RSS(Bot b) {
 		super(b);
 		List<String> kw = new ArrayList<>();
 		kw.add("rss");
@@ -31,10 +32,11 @@ public class RSS extends Action {
 	}
 
 	@Override
+	@Deprecated
 	public void react(String channel, String sender, String login, String hostname, Message message) {
-		RssDataRemainder remainder = iRCBot.getRssdata();
+		RssDataRemainder remainder = Main.getRSS_DATA_REMAINDER();
 		if(message.hasNoParameters()) {
-			iRCBot.sendMessages(sender, channel, remainder.toStringIRC());
+			bot.sendMessages(sender, channel, remainder.toStringIRC());
 		}
 		int nbParams = message.parameterSize();
 		try {
@@ -42,17 +44,47 @@ public class RSS extends Action {
 				int id = message.getElementAsInt(i);
 				RssData data = remainder.getDataWithId(id);
 				if(data != null) {
-					iRCBot.sendMessages(sender, channel, data);
+					bot.sendMessages(sender, channel, data);
 				}else {
-					iRCBot.sendMessage(sender, channel, "erreur: le nombre "+id+" n'est pas correct, ce dernier doit être entre 0 et "+(remainder.getCompletion()-1));
+					bot.sendMessage(sender, channel, "erreur: le nombre "+id+" n'est pas correct, ce dernier doit être entre 0 et "+(remainder.getCompletion()-1));
 				}
 				if(i!=nbParams-1) {
-					iRCBot.sendMessage(sender, channel, "-------");
+					bot.sendMessage(sender, channel, "-------");
 				}
 			}
 		}catch (NumberFormatException e) {
-			iRCBot.sendMessage(sender, channel, "erreur: Vous devez utiliser des entiers en paramètres, et ces derniers doivent être entre 0 et "+(remainder.getCompletion()-1));
+			bot.sendMessage(sender, channel, "erreur: Vous devez utiliser des entiers en paramètres, et ces derniers doivent être entre 0 et "+(remainder.getCompletion()-1));
 		}
 	}
 
+	@Override
+	public List<String> reactL(String channel, String sender, String login, String hostname, Message message) {
+		List<String> s = new ArrayList<>();
+		RssDataRemainder remainder = Main.getRSS_DATA_REMAINDER();
+		if(message.hasNoParameters()) {
+			bot.sendMessages(sender, channel, remainder.toStringIRC());
+		}
+		int nbParams = message.parameterSize();
+		try {
+			for(int i = 0; i<nbParams;++i) {
+				int id = message.getElementAsInt(i);
+				RssData data = remainder.getDataWithId(id);
+				if(data != null) {
+					s.add(data.toString());
+				}else {
+					s.add("erreur: le nombre "+id+" n'est pas correct, ce dernier doit être entre 0 et "+(remainder.getCompletion()-1));
+				}
+				if(i!=nbParams-1) {
+					s.add("-------");
+				}
+			}
+		}catch (NumberFormatException e) {
+			s.add("erreur: Vous devez utiliser des entiers en paramètres, et ces derniers doivent être entre 0 et "+(remainder.getCompletion()-1));
+			return s;
+		}finally {
+			
+		}
+		return s;
+	}
+
 }

+ 25 - 6
src/actions/Reload.java

@@ -5,8 +5,9 @@ import java.util.Date;
 import java.util.List;
 
 import data.Message;
-import main.IRCBot;
+import main.Bot;
 import main.Cache;
+import main.Main;
 
 /**
  * Classe servant à l'action de forcer une mise à jour des informations
@@ -15,7 +16,7 @@ import main.Cache;
  */
 public class Reload extends Action {
 
-	public Reload(IRCBot b) {
+	public Reload(Bot b) {
 		super(b);
 		List<String> ar = new ArrayList<>();
 		ar.add("reload");
@@ -33,21 +34,39 @@ public class Reload extends Action {
 	}
 
 	@Override
+	@Deprecated
 	public void react(String channel, String sender, String login, String hostname, Message message) {
 		Date now = new Date();
 		Date lastCU = Cache.getInstance().getLastCacheUpdate();
 		if(lastCU.getTime() < now.getTime()-Cache.getTIME_BETWEEN_RELOADS() ) {		// Si la dernière MAJ date de + de 5 minutes
-			iRCBot.sendMessage(sender,channel, "Je lance le reload!");
+			bot.sendMessage(sender,channel, "Je lance le reload!");
 			if(reload()) {
-				iRCBot.sendMessage(sender, channel, sender+": Le reload s'est bien passé.");
+				bot.sendMessage(sender, channel, sender+": Le reload s'est bien passé.");
 			}else {
-				iRCBot.sendMessage(sender, channel, sender+": Erreur au moment du reload.");
+				bot.sendMessage(sender, channel, sender+": Erreur au moment du reload.");
 			}
 		}else {
 			Date nextAllowed = new Date(lastCU.getTime()+Cache.getTIME_BETWEEN_RELOADS());
-			iRCBot.sendMessage(sender, channel, "Trop de reload, attendez un peu. Le dernier à eu lieu le "+lastCU.toString()+" Prochain autorisé le "+nextAllowed);
+			bot.sendMessage(sender, channel, "Trop de reload, attendez un peu. Le dernier à eu lieu le "+lastCU.toString()+" Prochain autorisé le "+nextAllowed);
 		}
 		
 	}
 
+	@Override
+	public List<String> reactL(String channel, String sender, String login, String hostname, Message message) {
+		List<String> res = new ArrayList<>();
+		Date now = new Date();
+		Date lastCU = Cache.getInstance().getLastCacheUpdate();
+		if(lastCU.getTime() < now.getTime()-Cache.getTIME_BETWEEN_RELOADS() ) {		// Si la dernière MAJ date de + de 5 minutes
+			if(reload()) {
+				res.add(sender+": Le reload s'est bien passé.");
+			}else {
+				res.add(sender+": Erreur au moment du reload.");
+			}
+		}else {
+			Date nextAllowed = new Date(lastCU.getTime()+Cache.getTIME_BETWEEN_RELOADS());
+			res.add("Trop de reload, attendez un peu. Le dernier à eu lieu le "+Main.DATE_FORMAT_OUT.format(lastCU.toString())+" Prochain autorisé le "+Main.DATE_FORMAT_OUT.format(nextAllowed));
+		}
+		return res;
+	}
 }

+ 11 - 3
src/actions/Source.java

@@ -4,7 +4,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import data.Message;
-import main.IRCBot;
+import main.Bot;
 
 /**
  * Indique simplement où on peut trouver le code source
@@ -13,7 +13,7 @@ import main.IRCBot;
  */
 public class Source extends Action {
 
-	public Source(IRCBot b) {
+	public Source(Bot b) {
 		super(b);
 		List<String> ar = new ArrayList<>();
 		ar.add("source");
@@ -32,8 +32,16 @@ public class Source extends Action {
 		react(channel, sender);
 	}
 	
+	@Deprecated
 	private void react(String channel, String sender) {
-		iRCBot.sendMessage(sender, channel, sender+": mes sources sont disponibles ici: https://code.ffdn.org/marmat8951/bot-irc2");
+		bot.sendMessage(sender, channel, sender+": mes sources sont disponibles ici: https://code.ffdn.org/marmat8951/bot-irc2");
+	}
+
+	@Override
+	public List<String> reactL(String channel, String sender, String login, String hostname, Message message) {
+		List<String> s = new ArrayList<>(1);
+		s.add(sender+": mes sources sont disponibles ici: https://code.ffdn.org/marmat8951/bot-irc2");
+		return s;
 	}
 }
 

+ 5 - 5
src/data/AddresseToGPS.java

@@ -60,9 +60,9 @@ public class AddresseToGPS {
 	/**
 	 * Récupère les coordonnée du lieu correspondant à l'adresse
 	 * @return Coordonnée du lieu
-	 * @throws MultiplePossibleAddressException si plusieurs addresses sont possibles.
+	 * @throws ErrorAddressException si plusieurs addresses sont possibles.
 	 */
-	public Coordinates getCoordinates() throws MultiplePossibleAddressException {
+	public Coordinates getCoordinates() throws ErrorAddressException {
 		Lieu l = getLieu();
 		return l.coordonees;
 	}
@@ -80,9 +80,9 @@ public class AddresseToGPS {
 	/**
 	 * Effectue la requète pour récuperer le lieu et le renvoie
 	 * @return Lieu correspondant ou null si il n'y en a pas
-	 * @throws MultiplePossibleAddressException si il y a plusieurs lieux possibles
+	 * @throws ErrorAddressException si il y a plusieurs lieux possibles
 	 */
-	public Lieu getLieu() throws MultiplePossibleAddressException {
+	public Lieu getLieu() throws ErrorAddressException {
 		String get = ISPDAO.getInstance().executeGet(getAddressToQuerry());
 		JSONArray ja = new JSONArray(get);
 		if(ja.length()<1) {
@@ -93,7 +93,7 @@ public class AddresseToGPS {
 			for(int i=0;i<len;++i) {
 				l[i]=new Lieu(ja.getJSONObject(i));
 			}
-			throw new MultiplePossibleAddressException(l, adresse);
+			throw new ErrorAddressException(l, adresse);
 		}else {
 			Lieu l = new Lieu(ja.getJSONObject(0));
 			return l;

+ 40 - 0
src/data/ErrorAddressException.java

@@ -0,0 +1,40 @@
+package data;
+
+import data.AddresseToGPS.Lieu;
+
+/**
+ * Classe servant pour {@link AddresseToGPS} a indiquer plusieurs possibilitées et a les stoquer, afin qu'elles soient traitées dans un catch ou a indiquer qu'aucune n'est disponible
+ * @author marmat
+ *
+ */
+public class ErrorAddressException extends Exception {
+
+	private static final long serialVersionUID = 1L;
+	public final Lieu[] lieux;
+	public final String adresse;
+	public boolean vide=false;
+	public final String msg;
+	
+	
+	public ErrorAddressException(Lieu [] lieux, String requestedAdress) {
+		this(lieux,requestedAdress,"");
+	}
+	
+	public ErrorAddressException(Lieu [] lieux, String requestedAdress, String msg) {
+		this.lieux = lieux;
+		this.adresse = requestedAdress;
+		if(lieux == null || lieux.length==0) {
+			vide=true;
+		}
+		this.msg = msg;
+	}
+
+	/**
+	 * @return Si le tableaua d'adresse est vide ou non
+	 */
+	public boolean isVide() {
+		return vide;
+	}
+
+	
+}

+ 0 - 26
src/data/MultiplePossibleAddressException.java

@@ -1,26 +0,0 @@
-package data;
-
-import data.AddresseToGPS.Lieu;
-
-/**
- * Classe servant pour {@link AddresseToGPS} a indiquer plusieurs possibilitées et a les stoquer, afin qu'elles soient traitées dans un catch
- * @author marmat
- *
- */
-public class MultiplePossibleAddressException extends Exception {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 1L;
-	public final Lieu[] lieux;
-	public final String adresse;
-	
-	
-	public MultiplePossibleAddressException(Lieu [] lieux, String requestedAdress) {
-		this.lieux = lieux;
-		this.adresse = requestedAdress;
-	}
-
-
-}

+ 1 - 1
src/data/TestAdresseToGPS.java

@@ -12,7 +12,7 @@ public class TestAdresseToGPS {
 		Lieu l=null;
 		try {
 			l=ad.getLieu();
-		} catch (MultiplePossibleAddressException e) {
+		} catch (ErrorAddressException e) {
 			System.err.println("Plusieurs lieux pour cette adresse, soyez plus précis");
 		}
 		if(l!=null) {

+ 6 - 0
src/main/Bot.java

@@ -12,4 +12,10 @@ public interface Bot {
 	public void sendMessages(String sender, String channel,List<String> messages);
 	
 	public void sendMessages(String sender, String channel, AffichableSurIRC affichable);
+	
+	public String getBotName();
+
+	public void sendMessageToAdmins(String string);
+	
+	public void sendRSSMessage(List<String> messages);
 }

+ 8 - 6
src/main/IRCBot.java

@@ -23,8 +23,7 @@ public class IRCBot extends PircBot implements Bot {
 	private boolean responseOnPrivateChannel = true;
 	private boolean responseOnPrivateMessages = true;
 	private volatile static long WAIT_BEFORE_RECONNECT = 60;
-	private volatile RssDataRemainder rssdata = new RssDataRemainder();
-	
+	private String BotName = "IRC";
 
 	public IRCBot() {
 		this.setAutoNickChange(true);
@@ -255,13 +254,16 @@ public class IRCBot extends PircBot implements Bot {
 	}
 
 
-	public RssDataRemainder getRssdata() {
-		return rssdata;
+	@Override
+	public String getBotName() {
+		return BotName;
 	}
 
 
-	public void setRssdata(RssDataRemainder rssdata) {
-		this.rssdata = rssdata;
+	@Override
+	public void sendRSSMessage(List<String> messages) {
+		sendMessagesOnAllChannels(messages);
+		
 	}
 
 }

+ 70 - 7
src/main/Main.java

@@ -2,9 +2,13 @@ package main;
 
 import java.net.ConnectException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Locale;
 
 import rss.RSSChecker;
+import rss.RssDataRemainder;
+import socials.TwitterBot;
 
 public class Main {
 
@@ -14,6 +18,11 @@ public class Main {
 	private static long TIMEOUT_BEFORE_RECONNECTING = 360;
 	private static int failures = 0;
 	private static volatile boolean DEBUG=true;
+	private static CacheReloader CR;
+	private static IRCBot IRCBOT;
+	private static TwitterBot TWITTER;
+	private static List<Bot> BOTS = new ArrayList<>();
+	private static RssDataRemainder RSS_DATA_REMAINDER;
 	
 	public static final SimpleDateFormat DATE_FORMAT_OUT = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss", Locale.FRENCH);;
 
@@ -21,29 +30,34 @@ public class Main {
 
 		try {
 			
-			CacheReloader cr = new CacheReloader(3600); // Met à jour la base toute les heures.
+			CR = new CacheReloader(3600); // Met à jour la base toute les heures.
 			// Now start our bot up.
-			IRCBot iRCBot = new IRCBot();
+			IRCBOT = new IRCBot();
+			BOTS.add(IRCBOT);
 			
-			RSSChecker rcheck = new RSSChecker("https://planet.ffdn.org/atom.xml", iRCBot);
+			TWITTER = new TwitterBot();
+			BOTS.add(TWITTER);
+			
+			RSSChecker rcheck = new RSSChecker("https://planet.ffdn.org/atom.xml", BOTS);
+			RSS_DATA_REMAINDER = rcheck.getRemainder();
 					
 			//Properties Setter
 			PropertiesSetter ps = new PropertiesSetter("../../ressources/config/config.properties");
 			
-			ps.setPropertiesOn(cr, iRCBot,rcheck);
+			ps.setPropertiesOn(CR, IRCBOT,rcheck);
 
 			// Connect to the IRC server.
-			iRCBot.connect(SERVER,PORT);
+			IRCBOT.connect(SERVER,PORT);
 
 			// Get All the infomations and store in a cache
 			Cache c = Cache.getInstance();
 
 			// Join the #pircbot channel.
 			for(int i = 0; i< CHANNELS.length; i++) {
-				iRCBot.joinChannel(CHANNELS[i]);
+				IRCBOT.joinChannel(CHANNELS[i]);
 			}
 			
-			cr.start();
+			CR.start();
 			
 			System.out.println("Debug? "+DEBUG);
 			
@@ -100,4 +114,53 @@ public class Main {
 		TIMEOUT_BEFORE_RECONNECTING = tIMEOUT_BEFORE_RECONNECTING;
 	}
 
+	/**
+	 * @return the failures
+	 */
+	public static int getFailures() {
+		return failures;
+	}
+
+	/**
+	 * @return the dEBUG
+	 */
+	public static boolean isDEBUG() {
+		return DEBUG;
+	}
+
+	/**
+	 * @return the cR
+	 */
+	public static CacheReloader getCR() {
+		return CR;
+	}
+
+	/**
+	 * @return the iRCBOT
+	 */
+	public static IRCBot getIRCBOT() {
+		return IRCBOT;
+	}
+
+	/**
+	 * @return the bOTS
+	 */
+	public static List<Bot> getBOTS() {
+		return BOTS;
+	}
+
+	/**
+	 * @return the rSS_DATA_REMAINDER
+	 */
+	public static RssDataRemainder getRSS_DATA_REMAINDER() {
+		return RSS_DATA_REMAINDER;
+	}
+
+	/**
+	 * @return the dateFormatOut
+	 */
+	public static SimpleDateFormat getDateFormatOut() {
+		return DATE_FORMAT_OUT;
+	}
+
 }

+ 35 - 17
src/rss/RSSChecker.java

@@ -3,7 +3,9 @@ package rss;
 import java.io.IOException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -15,6 +17,7 @@ import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
+import main.Bot;
 import main.IRCBot;
 import main.Main;
 
@@ -31,25 +34,22 @@ public class RSSChecker implements Runnable {
 	private long timeout=3600;
 	private String rssaddr;  // Must be https://planet.ffdn.org/atom.xml
 	boolean end = false;
-	DocumentBuilderFactory docbfact=DocumentBuilderFactory.newInstance();
+	private DocumentBuilderFactory docbfact=DocumentBuilderFactory.newInstance();
 	private Date lastarticle = new Date(); //last info
 	public static final SimpleDateFormat DATE_FORMATIN =  new SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ss'Z'");
-	private IRCBot b;
+	private List<Bot> b;
 	private volatile RssDataRemainder remainder;
 	
-	public RSSChecker() {
-		this("",null);
-	}
 	
 	/**
 	 * Crée le checker de RSS sur l'adresse en paramètre
 	 * @param address adresse à laquelle faire la vérification
 	 * @param b bot utilisé pour stoquer les données et retravailler 
 	 */
-	public RSSChecker(String address, IRCBot b) {
+	public RSSChecker(String address, List<Bot> b) {
 		this.rssaddr = address;
-		this.b=b;
-		this.remainder = b.getRssdata();
+		this.b=new ArrayList<>(4);
+		this.remainder = new RssDataRemainder();
 	}
 
 	public void start() {
@@ -62,9 +62,12 @@ public class RSSChecker implements Runnable {
 	/**
 	 * Affiche l'aricle sur tous les channels du bot
 	 * @param data donnée RSS
+	 * @deprecated
 	 */
 	private void afficheArticle(RssData data) {
-		b.sendMessagesOnAllChannels(data.toStringIRC());
+		for(Bot actualbot : b) {
+			actualbot.sendRSSMessage(data.toStringIRC());
+		}
 	}
 
 	/**
@@ -75,12 +78,24 @@ public class RSSChecker implements Runnable {
 		afficheArticle(new RssData(article));
 	}
 
+	private void sendToAllBots(List<String> s) {
+		for(Bot a : b) {
+			a.sendRSSMessage(s);
+		}
+		
+	}
+	
+	
+	
+	
 	/**
 	 * Travaille sur la liste d'entrée. Vérifie si il y en a des plus récents que
 	 * le dernier socké. Si c'est le cas, va prévenir les channels de la nouveautée, et l'intégrer au flux RSS du bot.
 	 * @param nl
 	 */
-	private void workOnEntry(NodeList nl) {
+
+	private List<String> workOnEntry(NodeList nl) {
+		List<String> res = new ArrayList<>();
 		if(Main.isDebug()) {
 			System.out.println("Verification des <entry>");
 			System.out.println("Dernier article le: "+Main.DATE_FORMAT_OUT.format(lastarticle));
@@ -104,12 +119,12 @@ public class RSSChecker implements Runnable {
 							}
 							if(!istherenews) {
 								istherenews=true;
-								b.sendMessageOnAllChannels("Nouveauté sur planet.ffdn.org:");
+								res.add("Nouveauté sur planet.ffdn.org:");
 								
 							}
 							RssData rs = new RssData(article);
 							remainder.push(rs);
-							afficheArticle(rs);
+							res.addAll(rs.toStringIRC());
 							lastarticle = date;
 						}
 					} catch (DOMException | ParseException e) {
@@ -118,8 +133,9 @@ public class RSSChecker implements Runnable {
 				}
 			}
 		}
+		return res;
 	}
-
+	
 	public RssDataRemainder getRemainder() {
 		return remainder;
 	}
@@ -143,23 +159,25 @@ public class RSSChecker implements Runnable {
 			try {
 				db = docbfact.newDocumentBuilder();
 			} catch (ParserConfigurationException e1) {
-				b.sendMessageToAdmins("Erreur lors de la creation du document Builder dans RSSChecker.run()"); 
+				System.err.println("Erreur lors de la creation du document Builder dans RSSChecker.run()");
 				e1.printStackTrace();
 			}
 			try {
 				doc = db.parse(rssaddr);
 			} catch (SAXException | IOException e1) {
 				e1.printStackTrace();
-				b.sendMessageToAdmins("Erreur du parseur XML");
+				System.err.println("Erreur du parseur XML");
 			}
 			if(doc!=null) {
 				NodeList nl = doc.getElementsByTagName("entry");
 				if(firstRun) {
 					initRemainder(nl);
 				}
-				workOnEntry(nl);
+				List<String> result = workOnEntry(nl);
+				if(!result.isEmpty()) {
+					sendToAllBots(result);
+				}
 			}else {
-				b.sendMessageToAdmins("Erreur au parsing du RSS, le document était null");
 				System.err.println("Erreur au parsing du RSS, le document était null");
 			}
 

+ 45 - 4
src/socials/TwitterBot.java

@@ -9,6 +9,7 @@ import main.Bot;
 import twitter4j.DirectMessage;
 import twitter4j.IDs;
 import twitter4j.ResponseList;
+import twitter4j.StatusUpdate;
 import twitter4j.Twitter;
 import twitter4j.TwitterAdapter;
 import twitter4j.TwitterException;
@@ -18,6 +19,7 @@ public class TwitterBot extends TwitterAdapter implements Bot {
 	
 	private Twitter sender;
 	private String login;
+	private String BotName = "Twitter";
 	
 	public TwitterBot() {
 		super();
@@ -48,6 +50,7 @@ public class TwitterBot extends TwitterAdapter implements Bot {
 	}
 
 	
+	
 
 	/* (non-Javadoc)
 	 * @see twitter4j.TwitterAdapter#gotIncomingFriendships(twitter4j.IDs)
@@ -72,22 +75,60 @@ public class TwitterBot extends TwitterAdapter implements Bot {
 
 	@Override
 	public void sendMessage(String sender, String channel, String message) {
-		// TODO Auto-generated method stub
+		try {
+			DirectMessage msg = this.sender.sendDirectMessage(sender, message);
+			System.out.println(BotName+": Envoyé: "+ msg.getText() + " à @" + msg.getRecipientScreenName());
+		} catch (TwitterException e) {
+			System.err.println(BotName+"Twitter : Impossible d'envoyer le message");
+			e.printStackTrace();
+		}
 		
 	}
 
 	@Override
 	public void sendMessages(String sender, String channel, List<String> messages) {
-		// TODO Auto-generated method stub
-		
+		String m="";
+		for(String s : messages) {
+			m=m+s+'\n';
+		}
+		if(!m.equals("")) {
+			sendMessage(sender, channel, m);
+		}
 	}
 
 	@Override
 	public void sendMessages(String sender, String channel, AffichableSurIRC affichable) {
-		// TODO Auto-generated method stub
+		sendMessages(sender,channel,affichable.toStringIRC());
+		
+	}
+
+	@Override
+	public String getBotName() {
+		return BotName;
+	}
+
+	@Override
+	public void sendMessageToAdmins(String string) {
+		//TODO Not yet implemented
 		
 	}
+
+	@Override
+	public void sendRSSMessage(List<String> messages) {
+		String aff = "";
+		for(String s : messages) {
+			aff += s+"\n";
+		}
+		StatusUpdate status = new StatusUpdate(aff);
+		try {
+			sender.updateStatus(status);
+		} catch (TwitterException e) {
+			System.err.println(BotName+": Erreur: impossible de twitter");
+			e.printStackTrace();
+		}
 		
+	}
+	
 	
 
 }