Browse Source

feat: RSS Remainder, Actions and Bugfixs

Martin Passard 7 years ago
parent
commit
1440ac0230

+ 2 - 0
src/actions/Action.java

@@ -4,6 +4,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import main.Bot;
+import rss.RssDataRemainder;
 
 public abstract class Action {
 
@@ -84,6 +85,7 @@ public abstract class Action {
 		ar.add(new Reload(b));
 		ar.add(new ID(b));
 		ar.add(new Distance(b));
+		ar.add(new RSS(b));
 		return ar;
 	}
 	

+ 44 - 0
src/actions/RSS.java

@@ -0,0 +1,44 @@
+package actions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import main.Bot;
+import rss.RssDataRemainder;
+
+public class RSS extends Action {
+
+	public RSS(Bot b) {
+		super(b);
+		List<String> kw = new ArrayList<>();
+		kw.add("rss");
+		kw.add("planet");
+		kw.add("flux");
+		this.keyWords=kw;
+	}
+
+	@Override
+	public void react(String channel, String sender, String login, String hostname, String message) {
+		RssDataRemainder remainder = bot.getRssdata();
+		if(message.indexOf(' ')==-1 || message.substring(message.indexOf(' ')).replaceAll(" ", "").equals("")) {
+			bot.sendMessages(sender, channel, remainder.toStringIRC());
+		}else {
+			String contenu = message.substring(message.indexOf(' ')+1);
+			try {
+				int id = Integer.parseInt(contenu);
+				if(id<0 || id>remainder.getCompletion()) {
+					throw new IllegalArgumentException();
+				}
+				bot.sendMessages(sender, channel, remainder.getDataWithId(id-1));
+			}catch ( NullPointerException | IllegalArgumentException e) {
+				bot.sendMessage(sender, channel, "erreur: Vous devez utiliser un nombre, et ce dernier doit être entre 0 et "+remainder.getCompletion());
+			}
+		}
+	}
+
+	@Override
+	public String help() {
+		return " Permet l'affichage des article RSS. Si vous ajoutez un nombre, affiche l'article du numero correspondant.";
+	}
+
+}

+ 15 - 3
src/main/Bot.java

@@ -2,10 +2,8 @@ package main;
 
 import java.io.IOException;
 import java.net.UnknownHostException;
-import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.List;
-import java.util.Locale;
 
 import org.jibble.pircbot.IrcException;
 import org.jibble.pircbot.NickAlreadyInUseException;
@@ -13,6 +11,7 @@ import org.jibble.pircbot.PircBot;
 
 import actions.Action;
 import comportement.Comportement;
+import rss.RssDataRemainder;
 
 public class Bot extends PircBot {
 
@@ -23,6 +22,7 @@ public class Bot extends PircBot {
 	private boolean responseOnPrivateChannel = true;
 	private boolean responseOnPrivateMessages = true;
 	private volatile static long WAIT_BEFORE_RECONNECT = 60;
+	private volatile RssDataRemainder rssdata = new RssDataRemainder();
 	
 
 	public Bot() {
@@ -249,6 +249,18 @@ public class Bot extends PircBot {
 	}
 	
 	
-	
+	public void sendMessages(String sender, String channel, AffichableSurIRC affichable) {
+		sendMessages(sender,channel,affichable.toStringIRC());
+	}
+
+
+	public RssDataRemainder getRssdata() {
+		return rssdata;
+	}
+
+
+	public void setRssdata(RssDataRemainder rssdata) {
+		this.rssdata = rssdata;
+	}
 
 }

+ 4 - 8
src/main/Main.java

@@ -13,7 +13,7 @@ public class Main {
 	private volatile static String[] CHANNELS = { "#marmat" };
 	private static long TIMEOUT_BEFORE_RECONNECTING = 360;
 	private static int failures = 0;
-	private static boolean DEBUG=true;
+	private static volatile boolean DEBUG=true;
 	
 	public static final SimpleDateFormat DATE_FORMAT_OUT = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss", Locale.FRENCH);;
 
@@ -26,7 +26,7 @@ public class Main {
 			Bot bot = new Bot();
 			
 			RSSChecker rcheck = new RSSChecker("https://planet.ffdn.org/atom.xml", bot);
-			
+					
 			//Properties Setter
 			PropertiesSetter ps = new PropertiesSetter("../../ressources/config/config.properties");
 			
@@ -44,16 +44,12 @@ public class Main {
 			}
 			
 			cr.start();
-			if(args.length>0) {
-				setDebug(args[0].equals("-debug"));
-				}else {
-					setDebug(false);
-			}
-			System.out.println("Debug? "+DEBUG);
 			
+			System.out.println("Debug? "+DEBUG);
 			
 			rcheck.start();
 			
+			
 		}catch(ConnectException ce) {
 			failures++;
 			System.err.println("Erreur numéro "+failures);

+ 36 - 6
src/rss/RSSChecker.java

@@ -11,16 +11,20 @@ import javax.xml.parsers.ParserConfigurationException;
 
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 import org.xml.sax.SAXException;
 
-import data.ISPDAO;
 import main.Bot;
 import main.Main;
 
+/**
+ * Cette classe verifie si il y a de nouveaux articles sur le flux RSS.
+ * Dans ce cas, il les affiche et les met en mémoire pour l'action +RSS
+ * @author marmat
+ */
 public class RSSChecker implements Runnable {
+	
 
 	private Thread thread;
 	private final String threadName="RssChecker";
@@ -31,14 +35,16 @@ public class RSSChecker implements Runnable {
 	private Date lastarticle = new Date(); //last info
 	public static final SimpleDateFormat DATE_FORMATIN =  new SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ss'Z'");
 	private Bot b;
+	private volatile RssDataRemainder remainder;
 	
 	public RSSChecker() {
-		this.rssaddr="";
+		this("",null);
 	}
 
 	public RSSChecker(String address, Bot b) {
 		this.rssaddr = address;
 		this.b=b;
+		this.remainder = b.getRssdata();
 	}
 
 	public void start() {
@@ -50,8 +56,8 @@ public class RSSChecker implements Runnable {
 	
 	
 	private void afficheArticle(Node article, String date) {
-		NodeList nl = article.getChildNodes();
 		RssData rssdata = new RssData(article);
+		remainder.push(rssdata);
 		rssdata.setDate(date);
 		b.sendMessagesOnAllChannels(rssdata.toStringIRC());
 		
@@ -79,8 +85,10 @@ public class RSSChecker implements Runnable {
 							if(!istherenews) {
 								istherenews=true;
 								b.sendMessageOnAllChannels("Nouveautée sur planet.ffdn.org:");
+								
 							}
 							afficheArticle(article,Main.DATE_FORMAT_OUT.format(date));
+							remainder.push(new RssData(article));
 							lastarticle = date;
 						}
 					} catch (DOMException | ParseException e) {
@@ -91,11 +99,20 @@ public class RSSChecker implements Runnable {
 		}
 	}
 
+	public RssDataRemainder getRemainder() {
+		return remainder;
+	}
+
+	public void setRemainder(RssDataRemainder remainder) {
+		this.remainder = remainder;
+	}
+
 	@Override
 	public void run() {
 		if(Main.isDebug()) {
 			System.out.println(this.threadName+" lancé sur "+rssaddr);
 		}
+		boolean firstRun = true;
 		do {
 			if(Main.isDebug()) {
 				System.out.println("Parsing du RSS "+rssaddr);
@@ -105,10 +122,9 @@ public class RSSChecker implements Runnable {
 			try {
 				db = docbfact.newDocumentBuilder();
 			} catch (ParserConfigurationException e1) {
-				// TODO Auto-generated catch block
+				b.sendMessageToAdmins("Erreur lors de la creation du document Builder dans RSSChecker.run()"); 
 				e1.printStackTrace();
 			}
-			ISPDAO idao = ISPDAO.getInstance();
 			try {
 				doc = db.parse(rssaddr);
 			} catch (SAXException | IOException e1) {
@@ -116,7 +132,12 @@ public class RSSChecker implements Runnable {
 			}
 			if(doc!=null) {
 				NodeList nl = doc.getElementsByTagName("entry");
+				if(firstRun) {
+					initRemainder(nl);
+				}
 				workOnEntry(nl);
+			}else {
+				b.sendMessageToAdmins("Erreur au parsing du RSS");
 			}
 
 			try {
@@ -124,11 +145,20 @@ public class RSSChecker implements Runnable {
 			} catch (InterruptedException e) {
 				System.err.println(this.threadName+" à été arrété");
 			}
+			firstRun=false;
 		}while(!end);
 
 
 
 	}
+	
+	private void initRemainder(NodeList nl) {
+		int len = nl.getLength();
+		for(int i=len-1; i>=0;--i) {
+			RssData data = new RssData(nl.item(i));
+			remainder.push(data);
+		}
+	}
 
 	public String getRssaddr() {
 		return rssaddr;

+ 0 - 1
src/rss/RssData.java

@@ -41,7 +41,6 @@ public class RssData implements AffichableSurIRC{
 				if(bn.getNodeName().equalsIgnoreCase("name")) {
 					String a = ""+bn.getTextContent();
 					setAuteur(a);
-					System.out.println("Mise de l'auteur a "+a);
 				}
 			}
 		}else if(balise.equalsIgnoreCase("link")) {

+ 6 - 1
src/rss/RssDataRemainder.java

@@ -12,10 +12,15 @@ import main.AffichableSurIRC;
 public class RssDataRemainder implements AffichableSurIRC{
 
 	public RssData[] data;
+	public static final int DEFAULT_SIZE=10;
 
 	public RssDataRemainder(int default_size) {
 		data = new RssData[default_size];
 	}
+	
+	public RssDataRemainder() {
+		this(DEFAULT_SIZE);
+	}
 
 	public int getSize() {
 		return data.length;
@@ -71,7 +76,7 @@ public class RssDataRemainder implements AffichableSurIRC{
 		List<String> res = new ArrayList<String>();
 		int len = getCompletion();
 		for(int i=0;i<len;i++) {
-			String ligne = "["+(i+1)+"] "+data[i].getTitre();
+			String ligne = "["+(i)+"] "+data[i].getTitre();
 			if(data[i].getAuteur()!= null && !data[i].getAuteur().equals("")) {
 				ligne +=" par "+data[i].getAuteur();
 			}

+ 31 - 0
src/rss/RssDataRemainderTest.java

@@ -0,0 +1,31 @@
+package rss;
+
+import java.util.Date;
+import java.util.List;
+
+public class RssDataRemainderTest {
+
+	public static void main(String[] args) {
+		RssDataRemainder rd = new RssDataRemainder(3);
+		RssData d1  =  new RssData("adrien",new Date().toString(), "A bit blog", "www.irc.to");
+		RssData d2  =  new RssData("MArmat",new Date().toString(), "UneFede", "www.marmat.ovh");
+		RssData d3  =  new RssData("quota",new Date().toString(), "Café", "www.ca.fe");
+		RssData d4  =  new RssData("zorun",new Date().toString(), "ftth", "www.fible.ffdn.org");
+		rd.push(d1);
+		printList(rd.toStringIRC());
+		rd.push(d2);
+		rd.push(d3);
+		printList(rd.toStringIRC());
+		rd.push(d4);
+		printList(rd.toStringIRC());
+		rd.push(d4);
+		printList(rd.toStringIRC());
+		
+	}
+
+	public static void printList(List<String> data) {
+		for(String s : data) {
+			System.out.println(s);
+		}
+	}
+}