Browse Source

WIP: RSS checker

Martin Passard 7 years ago
parent
commit
4fa3a94f96
3 changed files with 173 additions and 11 deletions
  1. 9 1
      src/main/Main.java
  2. 82 8
      src/rss/RSSChecker.java
  3. 82 2
      src/rss/RssData.java

+ 9 - 1
src/main/Main.java

@@ -1,6 +1,10 @@
 package main;
 
 import java.net.ConnectException;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+
+import rss.RSSChecker;
 
 public class Main {
 
@@ -10,6 +14,8 @@ public class Main {
 	private static long TIMEOUT_BEFORE_RECONNECTING = 360;
 	private static int failures = 0;
 	private static boolean DEBUG=true;
+	
+	public static final SimpleDateFormat DATE_FORMAT_OUT = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss", Locale.FRENCH);;
 
 	public static void main(String[] args) throws Exception {
 
@@ -42,7 +48,9 @@ public class Main {
 			}
 			System.out.println("Debug? "+DEBUG);
 			
-
+			RSSChecker rcheck = new RSSChecker("https://planet.ffdn.org/atom.xml", bot);
+			rcheck.start();
+			
 		}catch(ConnectException ce) {
 			failures++;
 			System.err.println("Erreur numéro "+failures);

+ 82 - 8
src/rss/RSSChecker.java

@@ -1,28 +1,40 @@
 package rss;
 
 import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 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;
 
 public class RSSChecker implements Runnable {
 
 	private Thread thread;
 	private final String threadName="RssChecker";
 	private long timeout=3600;
-	private String rssaddr;
+	private String rssaddr;  // Must be https://planet.ffdn.org/atom.xml
 	boolean end = false;
 	DocumentBuilderFactory docbfact=DocumentBuilderFactory.newInstance();
-	
-	public RSSChecker(String address) {
+	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;
+
+	public RSSChecker(String address, Bot b) {
 		this.rssaddr = address;
+		this.b=b;
 	}
 
 	public void start() {
@@ -32,8 +44,67 @@ public class RSSChecker implements Runnable {
 		}
 	}
 	
+	private void afficheArticle(Node article) {
+		NodeList nl = article.getChildNodes();
+		int length = nl.getLength();
+		RssData rssdata = new RssData();
+		
+		itemToRssData(article, rssdata);
+		b.sendMessagesOnAllChannels(rssdata.toStringIRC());
+			
+	}
+	
+	private void itemToRssData(Node item, RssData data) {
+		System.out.println(item);
+		String balise = item.getNodeName();
+		if(balise.equalsIgnoreCase("title")) {
+			data.setTitre(item.getTextContent());
+		}else if(balise.equalsIgnoreCase("author")) {
+			NodeList authlist =item.getChildNodes();
+			for(int i = 0;i<authlist.getLength();i++) {
+				Node bn = authlist.item(i);
+				if(bn.getNodeName().equalsIgnoreCase("name")) data.setAuteur(bn.getTextContent());
+			}
+		}else if(balise.equalsIgnoreCase("link")) {
+			NamedNodeMap nmp = item.getAttributes();
+			Node n = nmp.getNamedItem("href");
+			if(n!=null) data.setLien(n.getTextContent());
+		}
+		
+	}
+	
+	private void workOnEntry(NodeList nl) {
+		int len = nl.getLength();
+		boolean istherenews = false;
+		for(int i=len-1; i>=0;i--) {
+			Node article = nl.item(i);
+			NodeList fils = article.getChildNodes();
+			int flen = fils.getLength();
+			for(int j=0; j<flen;j++) {
+				if(fils.item(j).getNodeName().equalsIgnoreCase("updated")){
+					try {
+						Date date = DATE_FORMATIN.parse(fils.item(j).getTextContent());
+						if(date.after(lastarticle)) {
+							if(!istherenews) {
+								istherenews=true;
+								b.sendMessageOnAllChannels("Nouveautée sur planet.ffdn.org:");
+							}
+							afficheArticle(article);
+						}
+						System.out.println(Main.DATE_FORMAT_OUT.format(date));
+					} catch (DOMException | ParseException e) {
+						e.printStackTrace();
+					}
+				}
+			}
+		}
+	}
+
 	@Override
 	public void run() {
+		if(Main.isDebug()) {
+			System.out.println("RSS checker lancé sur "+rssaddr);
+		}
 		do {
 			DocumentBuilder db=null;
 			Document doc = null;
@@ -45,13 +116,15 @@ public class RSSChecker implements Runnable {
 			}
 			ISPDAO idao = ISPDAO.getInstance();
 			try {
-				doc = db.parse(idao.executeGet("https://planet.ffdn.org/atom.xml"));
+				doc = db.parse(rssaddr);
 			} catch (SAXException | IOException e1) {
 				e1.printStackTrace();
 			}
-			NodeList nl = doc.getElementsByTagName("entry");
-			nl.getLength();
-			
+			if(doc!=null) {
+				NodeList nl = doc.getElementsByTagName("entry");
+				workOnEntry(nl);
+			}
+
 			try {
 				Thread.sleep(1000*timeout);
 			} catch (InterruptedException e) {
@@ -59,6 +132,7 @@ public class RSSChecker implements Runnable {
 			}
 		}while(!end);
 
-	}
 
+
+	}
 }

+ 82 - 2
src/rss/RssData.java

@@ -1,9 +1,89 @@
 package rss;
 
-public class RssData {
+import java.util.ArrayList;
+import java.util.List;
+
+import main.AffichableSurIRC;
+
+public class RssData implements AffichableSurIRC{
+
+	private String auteur;
+	private String date;
+	private String titre;
+	private String lien;
+	
+	public RssData(String auteur, String date, String titre, String lien) {
+		super();
+		this.auteur = auteur;
+		this.date = date;
+		this.titre = titre;
+		this.lien = lien;
+	}
+
 
 	public RssData() {
-		// TODO Auto-generated constructor stub
+		
+	}
+	
+	public String getAuteur() {
+		return auteur;
+	}
+
+
+	public void setAuteur(String auteur) {
+		auteur = auteur;
+	}
+
+
+	public String getDate() {
+		return date;
+	}
+
+
+	public void setDate(String date) {
+		this.date = date;
+	}
+
+
+	public String getTitre() {
+		return titre;
+	}
+
+
+	public void setTitre(String titre) {
+		this.titre = titre;
+	}
+
+
+	public String getLien() {
+		return lien;
+	}
+
+
+	public void setLien(String lien) {
+		this.lien = lien;
+	}
+
+	public String toString() {
+		return "Article par "+auteur+" : "+titre+" le "+date+" lien: "+lien;
+	}
+
+
+	@Override
+	public List<String> toStringIRC() {
+		List<String> res = new ArrayList<>();
+		res.add(titre);
+		String auth = "Par "+auteur;
+		if(date != null) {
+			auth += "le "+date;
+		}
+		res.add(auth);
+		if(lien != null) {
+		res.add("Plus d'infos sur "+lien);
+		}
+		return res;
 	}
+	
+	
 
 }