Browse Source

Multiple changes including not forgetting any ISP now

Martin Passard 7 years ago
parent
commit
37b8d015eb
5 changed files with 256 additions and 172 deletions
  1. 47 4
      src/data/ISP.java
  2. 12 3
      src/data/ISPDAO.java
  3. 28 8
      src/main/Bot.java
  4. 167 156
      src/main/Cache.java
  5. 2 1
      src/main/Main.java

+ 47 - 4
src/data/ISP.java

@@ -35,6 +35,45 @@ public class ISP implements AffichableSurIRC {
 		}
 		}
 	}
 	}
 	
 	
+	/**
+	 * Méthode pour récuperer le nom le plus correct pour afficher les informations.
+	 * Si il n'y a pas de Shortname alors name sera utilisé.
+	 * Si name possède des espaces alors le shortname sera utilisé.
+	 * Si name est plus long que 15 caractères alors shortname sera utilisé.
+	 * Sinon, on utilise Name
+	 * @return Le meilleur nom utilisable pour l'affichage.
+	 */
+	public String getBetterName() {
+		if(data.hasShortName()) {
+			String shortname = getShortName();
+			if(name.length()>15 || name.contains(" ")) {
+				return shortname;
+			}else {
+				return name;
+			}
+		}else {
+			return name;
+		}
+		
+	}
+	/**
+	 * Inverse de getBetterName. Le but est dans le cadre de l'affichage de plusieurs noms
+	 * @return Le moins bon nom pour l'affichage
+	 */
+	public String getWorstName() {
+		if(data.hasShortName()) {
+			String shortname = getShortName();
+			if(name.length()>15 || name.contains(" ")) {
+				return name;
+			}else {
+				return shortname;
+			}
+			
+		}else {
+			return name;
+		}
+	}
+	
 	public void setName(String name) {
 	public void setName(String name) {
 		this.name = name;
 		this.name = name;
 	}
 	}
@@ -117,13 +156,17 @@ public class ISP implements AffichableSurIRC {
 	public List<String> toStringIRC () {
 	public List<String> toStringIRC () {
 		Cache c = Cache.getInstance();
 		Cache c = Cache.getInstance();
 		List<String> res = new LinkedList<>();
 		List<String> res = new LinkedList<>();
-		res.add(name+" : ");
-		res.add("Est membre de la fédération : "+booleanToOuiNon(isFFDNMember()));
-		res.add("Nombre de Membres : "+getMembersCount()+" soit "+c.getMembersPercents(getMembersCount()));
-		res.add("Nombre d'abonnements : "+getSubscribersCount()+" soit "+c.getSubscribersPercents(getSubscribersCount()));
+		String preface = "["+getBetterName()+"] ";
+		res.add(preface+"Est membre de la fédération : "+booleanToOuiNon(isFFDNMember()));
+		res.add(preface+"Nombre de Membres : "+getMembersCount()+" soit "+c.getMembersPercents(getMembersCount()));
+		res.add(preface+"Nombre d'abonnements : "+getSubscribersCount()+" soit "+c.getSubscribersPercents(getSubscribersCount()));
 		
 		
 		
 		
 		return res;
 		return res;
 	}
 	}
+	
+	private String getShortName() {
+		return data.getShortname();
+	}
 
 
 }
 }

+ 12 - 3
src/data/ISPDAO.java

@@ -99,16 +99,25 @@ public class ISPDAO {
 	 * @return List of ISPs constructed.
 	 * @return List of ISPs constructed.
 	 */
 	 */
 	public List<ISP> getISPs() throws Exception{
 	public List<ISP> getISPs() throws Exception{
+		
 		String jsonInfo = executeGet(dbAdress+"?per_page=0");
 		String jsonInfo = executeGet(dbAdress+"?per_page=0");
 		JSONObject allISPCount = new JSONObject(jsonInfo);
 		JSONObject allISPCount = new JSONObject(jsonInfo);
 		int nbItems = allISPCount.getInt("total_items");
 		int nbItems = allISPCount.getInt("total_items");
 		ArrayList<ISP> ar = new ArrayList<>(nbItems);
 		ArrayList<ISP> ar = new ArrayList<>(nbItems);
-		
-		for (int i=1; i<nbItems; ++i) {
-			ISP isp = getISP(i);
+		int i=0;
+		int increm=0;
+		final int MAX_FAILS=5;
+		int fails=0;
+		while(i<nbItems && fails < MAX_FAILS) {
+			ISP isp = getISP(increm);
 			if(isp != null) {
 			if(isp != null) {
 				ar.add(isp);
 				ar.add(isp);
+				i++;
+				fails=0;
+			}else {
+				fails++;
 			}
 			}
+			increm++;
 		}
 		}
 		return ar;
 		return ar;
 
 

+ 28 - 8
src/main/Bot.java

@@ -1,5 +1,6 @@
 package main;
 package main;
 
 
+import java.util.Date;
 import java.util.LinkedList;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.List;
 
 
@@ -11,6 +12,7 @@ import verif_saisie.EntierPositifNonVide;
 
 
 public class Bot extends PircBot {
 public class Bot extends PircBot {
 
 
+	public static final long TIME_BETWEEN_RELOADS = 360000;
 	private ISPDAO idao;
 	private ISPDAO idao;
 
 
 	public Bot() {
 	public Bot() {
@@ -35,6 +37,23 @@ public class Bot extends PircBot {
 			list(channel, sender, login, hostname, message);
 			list(channel, sender, login, hostname, message);
 		}
 		}
 
 
+		if(message.equals("+reload")) {
+			Date now = new Date();
+			Date lastCU = Cache.getInstance().getLastCacheUpdate();
+			if(lastCU.getTime() < now.getTime()-TIME_BETWEEN_RELOADS ) {		// Si la dernière MAJ date de + de 5 minutes
+				sendMessage(channel, "Je lance le reload!");
+				if(reload()) {
+					sendMessage(channel, sender+": Le reload s'est bien passé.");
+				}else {
+					sendMessage(channel, sender+": Erreur au moment du reload.");
+				}
+			}else {
+				Date nextAllowed = new Date(lastCU.getTime()+TIME_BETWEEN_RELOADS);
+				sendMessage(channel, "Trop de reload, attendez un peu. Le dernier à eu lieu le "+lastCU.toString()+" Prochain autorisé le "+nextAllowed);
+			}
+		}
+
+
 		//easter Egg
 		//easter Egg
 		String ea="Ehlo UneFede";
 		String ea="Ehlo UneFede";
 		if (message.contains("Ehlo UneFede")) {
 		if (message.contains("Ehlo UneFede")) {
@@ -45,6 +64,11 @@ public class Bot extends PircBot {
 
 
 	}
 	}
 
 
+	private boolean reload() {
+		Cache c = Cache.getInstance();
+		return c.reload();
+	}
+
 	public void sendMessage(String channel, List<String> lines) {
 	public void sendMessage(String channel, List<String> lines) {
 		for(String s : lines) {
 		for(String s : lines) {
 			sendMessage(channel,s);
 			sendMessage(channel,s);
@@ -69,16 +93,12 @@ public class Bot extends PircBot {
 		List<String> messages = new LinkedList<>();
 		List<String> messages = new LinkedList<>();
 		messages.add("Les FAI surveillés par mes petits yeux mignons de bot sont:");
 		messages.add("Les FAI surveillés par mes petits yeux mignons de bot sont:");
 		String s="";
 		String s="";
-		
+
 		for(ISP isp: listeFAI ) {
 		for(ISP isp: listeFAI ) {
 			if(isp.isFFDNMember()) {
 			if(isp.isFFDNMember()) {
-				
-				if(isp.getName().length()<=15 && !isp.getName().contains(" ")){
-					s+=isp.getName();
-				}else {
-					s+=isp.getShortestName();
-				}
-				
+
+				s+= isp.getBetterName();
+
 				if(s.length()>=80) {
 				if(s.length()>=80) {
 					messages.add(s);
 					messages.add(s);
 					s="";
 					s="";

+ 167 - 156
src/main/Cache.java

@@ -1,156 +1,167 @@
-package main;
-
-import java.text.NumberFormat;
-import java.util.LinkedList;
-import java.util.List;
-
-import data.ISP;
-import data.ISPDAO;
-
-public class Cache implements AffichableSurIRC {
-	/**
-	 * Cette classe sert de cache pour les infos de DB
-	 * Elle implemente le Design Pattern Singleton dans la mesure où cette classe doit être l'unique instance de référence peu importe le Thread l'utilisant, et que le cache est unique.
-	 */
-	
-	public static volatile Cache instance = null;
-	private List<ISP> cache;
-	
-	private Cache() {
-		ISPDAO idao = ISPDAO.getInstance();
-		try {
-			cache = idao.getISPs();
-		} catch (Exception e) {
-			System.err.println("Le cache n'as pas pu être géré à cause de l'exception suivante");
-			e.printStackTrace();
-		}
-	}
-	
-	
-	/**
-	 * Méthode du design patern singleton. Permet de récuperer et si besoin d'initialiser, l'unique instance de la classe.
-	 * @return Instance du Cache
-	 */
-	public final static Cache getInstance() {
-		if (Cache.instance == null) {
-			synchronized (ISPDAO.class) {
-				if(Cache.instance == null) {
-					Cache.instance = new Cache();
-				}
-			}
-		}
-		return Cache.instance;
-	}
-	
-	/**
-	 * Cette methode vient mettre à jour le cache des FAI. Pour cela, il récupere l'instance du DAO et récupère la liste des ISP. Si tout cse passe correctement, il supprime le cache précédent et le remplace par les nouvelles valeurs. Sinon, il maaintient le cache précédent.
-	 * @return True si l'operation s'est passée correctement, False sinon et affiche la cause
-	 */
-	public boolean reload() {
-		try {
-			ISPDAO idao = ISPDAO.getInstance();
-			List<ISP> l = idao.getISPs();
-			if(l != null) {
-				cache.clear();
-				cache.addAll(l);
-			}
-		}catch (Exception e) {
-			System.err.println("Erreur au moment du reload() :\n "+e.getMessage());
-			return false;
-		}
-		return true;
-	}
-	
-	public int size() {
-		return cache.size();
-	}
-
-	public List<ISP> getListe(){
-		return cache;
-	}
-	
-	public int getMemberCountInFede() {
-		int i = 0;
-		for(ISP isp : getListe()) {
-			if(isp.isFFDNMember()) {
-				i += isp.getMembersCount();
-			}
-		}
-		return i;
-	}
-	
-	public int getSubscribersCountInFede() {
-		int i = 0;
-		for(ISP isp : getListe()) {
-			if(isp.isFFDNMember()) {
-				i += isp.getSubscribersCount();
-			}
-		}
-		return i;
-	}
-	
-	public String getSubscribersPercents(int val) {
-		NumberFormat nf = NumberFormat.getInstance();
-		nf.setMaximumFractionDigits(2);
-		nf.setMinimumFractionDigits(0);
-		Double val2 = val+0.0;
-		Double nbSubscribers = 0.0+getSubscribersCountInFede();
-		return nf.format((val2/nbSubscribers)*100)+" %";
-	}
-	
-	public String getMembersPercents(int val) {
-		NumberFormat nf = NumberFormat.getInstance();
-		nf.setMaximumFractionDigits(2);
-		nf.setMinimumFractionDigits(0);
-		Double val2 = val+0.0;
-		Double nbMembers = 0.0+getMemberCountInFede();
-		return nf.format((val2/nbMembers)*100)+" %";
-	}
-	
-	
-	
-	/**
-	 * Donne le nombre de FAI de la fédé en parcourant le cache.
-	 * @param ffdn_member Si = null alors on s'en fout, si =true, seuls les FAI de la fédé, si = false, seuls les FAI non membres
-	 * @return nombre de FAI
-	 */
-	public int getISPCount(Boolean ffdn_member) {
-		if(ffdn_member == null) {
-			return cache.size();
-		}else{
-			int count = 0;
-			for(ISP fai : cache) {
-				if(ffdn_member == fai.isFFDNMember()) {
-					count++;
-				}
-			}
-			return count;
-			
-		}
-			
-	}
-	
-	public ISP getISPWithName(String s) {
-		for(ISP i : cache) {
-			if(i.getShortestName().equalsIgnoreCase(s) || i.getName().equalsIgnoreCase(s)) {
-				return i;
-			}
-		}
-		return null;
-	}
-	
-	public String toString() {
-		return "Cache de "+cache.size()+" FAI";
-	}
-	
-	public List<String> toStringIRC() {
-		List<String> liste = new LinkedList<String>();
-		liste.add("Il y a "+cache.size()+" FAI dont "+getISPCount(Boolean.TRUE)+" dans la fédé");
-		liste.add("Cela représente en tout (dans la fédé) "+getSubscribersCountInFede()+" Abonné.e.s et "+getMemberCountInFede()+" Membres");
-		return liste;
-	}
-	
-	
-	
-	
-}
+package main;
+
+import java.text.NumberFormat;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+
+import data.ISP;
+import data.ISPDAO;
+
+public class Cache implements AffichableSurIRC {
+	/**
+	 * Cette classe sert de cache pour les infos de DB
+	 * Elle implemente le Design Pattern Singleton dans la mesure où cette classe doit être l'unique instance de référence peu importe le Thread l'utilisant, et que le cache est unique.
+	 */
+	
+	public static volatile Cache instance = null;
+	private Date lastCacheUpdate;
+	private List<ISP> cache;
+	
+	private Cache() {
+		ISPDAO idao = ISPDAO.getInstance();
+		try {
+			cache = idao.getISPs();
+			lastCacheUpdate = new Date();
+		} catch (Exception e) {
+			System.err.println("Le cache n'as pas pu être géré à cause de l'exception suivante");
+			e.printStackTrace();
+		}
+	}
+	
+	
+	public  Date getLastCacheUpdate() {
+		return lastCacheUpdate;
+	}
+
+
+	/**
+	 * Méthode du design patern singleton. Permet de récuperer et si besoin d'initialiser, l'unique instance de la classe.
+	 * @return Instance du Cache
+	 */
+	public final static Cache getInstance() {
+		if (Cache.instance == null) {
+			synchronized (ISPDAO.class) {
+				if(Cache.instance == null) {
+					Cache.instance = new Cache();
+					
+					
+				}
+			}
+		}
+		return Cache.instance;
+	}
+	
+	/**
+	 * Cette methode vient mettre à jour le cache des FAI. Pour cela, il récupere l'instance du DAO et récupère la liste des ISP. Si tout cse passe correctement, il supprime le cache précédent et le remplace par les nouvelles valeurs. Sinon, il maaintient le cache précédent.
+	 * @return True si l'operation s'est passée correctement, False sinon et affiche la cause
+	 */
+	public boolean reload() {
+		try {
+			ISPDAO idao = ISPDAO.getInstance();
+			List<ISP> l = idao.getISPs();
+			if(l != null) {
+				cache.clear();
+				cache.addAll(l);
+			}
+		}catch (Exception e) {
+			System.err.println("Erreur au moment du reload() :\n "+e.getMessage());
+			return false;
+		}
+		lastCacheUpdate = new Date();
+		return true;
+	}
+	
+	public int size() {
+		return cache.size();
+	}
+
+	public List<ISP> getListe(){
+		return cache;
+	}
+	
+	public int getMemberCountInFede() {
+		int i = 0;
+		for(ISP isp : getListe()) {
+			if(isp.isFFDNMember()) {
+				i += isp.getMembersCount();
+			}
+		}
+		return i;
+	}
+	
+	public int getSubscribersCountInFede() {
+		int i = 0;
+		for(ISP isp : getListe()) {
+			if(isp.isFFDNMember()) {
+				i += isp.getSubscribersCount();
+			}
+		}
+		return i;
+	}
+	
+	public String getSubscribersPercents(int val) {
+		NumberFormat nf = NumberFormat.getInstance();
+		nf.setMaximumFractionDigits(2);
+		nf.setMinimumFractionDigits(0);
+		Double val2 = val+0.0;
+		Double nbSubscribers = 0.0+getSubscribersCountInFede();
+		return nf.format((val2/nbSubscribers)*100)+" %";
+	}
+	
+	public String getMembersPercents(int val) {
+		NumberFormat nf = NumberFormat.getInstance();
+		nf.setMaximumFractionDigits(2);
+		nf.setMinimumFractionDigits(0);
+		Double val2 = val+0.0;
+		Double nbMembers = 0.0+getMemberCountInFede();
+		return nf.format((val2/nbMembers)*100)+" %";
+	}
+	
+	
+	
+	/**
+	 * Donne le nombre de FAI de la fédé en parcourant le cache.
+	 * @param ffdn_member Si = null alors on s'en fout, si =true, seuls les FAI de la fédé, si = false, seuls les FAI non membres
+	 * @return nombre de FAI
+	 */
+	public int getISPCount(Boolean ffdn_member) {
+		if(ffdn_member == null) {
+			return cache.size();
+		}else{
+			int count = 0;
+			for(ISP fai : cache) {
+				if(ffdn_member == fai.isFFDNMember()) {
+					count++;
+				}
+			}
+			return count;
+			
+		}
+			
+	}
+	
+	public ISP getISPWithName(String s) {
+		for(ISP i : cache) {
+			if(i.getShortestName().equalsIgnoreCase(s) || i.getName().equalsIgnoreCase(s)) {
+				return i;
+			}
+		}
+		return null;
+	}
+	
+	public String toString() {
+		return "Cache de "+cache.size()+" FAI";
+	}
+	
+	public List<String> toStringIRC() {
+		List<String> liste = new LinkedList<String>();
+		liste.add("Il y a "+cache.size()+" FAI dont "+getISPCount(Boolean.TRUE)+" dans la fédé");
+		liste.add("Cela représente en tout (dans la fédé) "+getSubscribersCountInFede()+" Abonné.e.s et "+getMemberCountInFede()+" Membres");
+		return liste;
+	}
+	
+	
+	
+	
+}

+ 2 - 1
src/main/Main.java

@@ -6,7 +6,7 @@ public class Main {
 	
 	
 	public static final String SERVER = "irc.geeknode.net";
 	public static final String SERVER = "irc.geeknode.net";
 	public static final int PORT = 6667;
 	public static final int PORT = 6667;
-	public static final String[] CHANNELS = { "#marmat", "#ffdn" };
+	public static final String[] CHANNELS = { "#marmat" };
 	public static final Cache cache = Cache.getInstance();
 	public static final Cache cache = Cache.getInstance();
 	
 	
 	public static void main(String[] args) throws Exception {
 	public static void main(String[] args) throws Exception {
@@ -21,6 +21,7 @@ public class Main {
         bot.connect(SERVER,PORT);
         bot.connect(SERVER,PORT);
         
         
         // Get All the infomations and store in a cache
         // Get All the infomations and store in a cache
+        Cache c = Cache.getInstance();