// Path: src/main/java/data/RSS.java
// public class RSS implements Comparable<RSS>, Embedded {
// 
//     private final static Logger LOG = LoggerFactory.getLogger(RSS.class);
//     private final static DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy à HH:mm", Locale.FRANCE);
// 
//     private String title;
//     private String url;
//     private String imageUrl;
//     private long date;
// 
//     private RSS(String title, String url, String imageUrl, long date) {
//         this.title = title;
//         this.url = url;
//         if (imageUrl != null && !imageUrl.isEmpty())
//             this.imageUrl = imageUrl;
//         else
//             this.imageUrl = Constants.officialLogo;
//         this.date = date;
//     }
// 
//     public static List<RSS> getRSSFeeds(Language lg){
//         List<RSS> rss = new ArrayList<>();
// 
//         try {
//             SyndFeedInput input = new SyndFeedInput();
//             SyndFeed feed = input.build(new XmlReader(new URL(Translator.getLabel(lg, "game.url")
//                     + Translator.getLabel(lg, "feed.url"))));
// 
//             for(SyndEntry entry : feed.getEntries()) {
//                 Matcher m = Pattern.compile("<img.+src=\"(.*\\.jpg)\".+>").matcher(entry.getDescription().getValue());
//                 rss.add(new RSS(entry.getTitle(), entry.getLink(), (m.find()? m.group(1) : null),
//                         entry.getPublishedDate().getTime()));
//             }
//         } catch (FeedException e){
//             Reporter.report(e);
//             LOG.error("getRSSFeeds", e);
//         } catch(IOException e){
//             ExceptionManager.manageSilentlyIOException(e);
//         } catch(Exception e){
//             ExceptionManager.manageSilentlyException(e);
//         }
//         Collections.sort(rss);
//         return rss;
//     }
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public String getUrl() {
//         return url;
//     }
// 
//     public long getDate() {
//         return date;
//     }
// 
//     public String toStringDiscord(){
//         return getTitle() + " (" + dateFormat.format(new Date(getDate())) + ")\n" + getUrl();
//     }
// 
//     @Override
//     public String toString(){
//         return getTitle() + " (" + dateFormat.format(new Date(getDate())) + ")\n";
//     }
// 
//     @Override
//     public int compareTo(RSS o) {
//         return (int) (getDate() - o.getDate());
//     }
// 
//     @Override
//     public EmbedCreateSpec decorateEmbedObject(Language lg) {
//         return EmbedCreateSpec.builder()
//                 .author("Dofus.com", getUrl(), null)
//                 .title(getTitle())
//                 .image(imageUrl)
//                 .thumbnail(Constants.rssIcon)
//                 .footer(dateFormat.format(new Date(getDate())), null)
//                 .build();
//     }
// 
//     public EmbedData decorateRestEmbedObject(Language lg) {
//         return EmbedData.builder()
//                 .author(EmbedAuthorData.builder().name("Dofus.com").url(getUrl()).build())
//                 .title(getTitle())
//                 .image(EmbedImageData.builder().url(imageUrl).build())
//                 .thumbnail(EmbedThumbnailData.builder().url(Constants.rssIcon).build())
//                 .footer(EmbedFooterData.builder().text(dateFormat.format(new Date(getDate()))).build())
//                 .build();
//     }
// 
//     @Override
//     public EmbedCreateSpec decorateMoreEmbedObject(Language lg) {
//         return decorateEmbedObject(lg);
//     }
// }
// 
// Path: src/main/java/enums/Language.java
// public enum Language {
// 
//     FR("Français", "FR"), EN("English", "EN"), ES("Español", "ES");
// 
//     private String name;
//     private String abrev;
// 
//     Language(String name, String abrev){
//         this.name = name;
//         this.abrev = abrev;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getAbrev() {
//         return abrev;
//     }
// 
//     @Override
//     public String toString(){
//         return name;
//     }
// }


import data.RSS;
import discord4j.common.util.Snowflake;
import discord4j.rest.entity.RestChannel;
import discord4j.rest.http.client.ClientException;
import enums.Language;
import util.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
package finders;



/**
 * Created by steve on 12/01/2017.
 */
public class RSSFinder {
    private final static Logger LOG = LoggerFactory.getLogger(RSSFinder.class);
    private final static long DELTA = 10; // 10min
    private static boolean isStarted = false;

    private static Map<String, RSSFinder> rssFinders = null;
    private String idGuild;
    private String chan;
    private long lastRSS;

    public RSSFinder(String idGuild, String chan) {
        this(idGuild, chan, System.currentTimeMillis());
    }

    private RSSFinder(String idGuild, String chan, long lastRSS) {
        this.idGuild = idGuild;
        this.chan = chan;
        this.lastRSS = lastRSS;
    }

    public synchronized void setLastRSS(long lastRSS) {
        this.lastRSS = lastRSS;

        Connexion connexion = Connexion.getInstance();
        Connection connection = connexion.getConnection();

        try {
            PreparedStatement preparedStatement = connection.prepareStatement(
                    "UPDATE RSS_Finder SET last_update = ? WHERE id_chan = ?;");
// Path: src/main/java/data/RSS.java
// public class RSS implements Comparable<RSS>, Embedded {
// 
//     private final static Logger LOG = LoggerFactory.getLogger(RSS.class);
//     private final static DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy à HH:mm", Locale.FRANCE);
// 
//     private String title;
//     private String url;
//     private String imageUrl;
//     private long date;
// 
//     private RSS(String title, String url, String imageUrl, long date) {
//         this.title = title;
//         this.url = url;
//         if (imageUrl != null && !imageUrl.isEmpty())
//             this.imageUrl = imageUrl;
//         else
//             this.imageUrl = Constants.officialLogo;
//         this.date = date;
//     }
// 
//     public static List<RSS> getRSSFeeds(Language lg){
//         List<RSS> rss = new ArrayList<>();
// 
//         try {
//             SyndFeedInput input = new SyndFeedInput();
//             SyndFeed feed = input.build(new XmlReader(new URL(Translator.getLabel(lg, "game.url")
//                     + Translator.getLabel(lg, "feed.url"))));
// 
//             for(SyndEntry entry : feed.getEntries()) {
//                 Matcher m = Pattern.compile("<img.+src=\"(.*\\.jpg)\".+>").matcher(entry.getDescription().getValue());
//                 rss.add(new RSS(entry.getTitle(), entry.getLink(), (m.find()? m.group(1) : null),
//                         entry.getPublishedDate().getTime()));
//             }
//         } catch (FeedException e){
//             Reporter.report(e);
//             LOG.error("getRSSFeeds", e);
//         } catch(IOException e){
//             ExceptionManager.manageSilentlyIOException(e);
//         } catch(Exception e){
//             ExceptionManager.manageSilentlyException(e);
//         }
//         Collections.sort(rss);
//         return rss;
//     }
// 
//     public String getTitle() {
//         return title;
//     }
// 
//     public String getUrl() {
//         return url;
//     }
// 
//     public long getDate() {
//         return date;
//     }
// 
//     public String toStringDiscord(){
//         return getTitle() + " (" + dateFormat.format(new Date(getDate())) + ")\n" + getUrl();
//     }
// 
//     @Override
//     public String toString(){
//         return getTitle() + " (" + dateFormat.format(new Date(getDate())) + ")\n";
//     }
// 
//     @Override
//     public int compareTo(RSS o) {
//         return (int) (getDate() - o.getDate());
//     }
// 
//     @Override
//     public EmbedCreateSpec decorateEmbedObject(Language lg) {
//         return EmbedCreateSpec.builder()
//                 .author("Dofus.com", getUrl(), null)
//                 .title(getTitle())
//                 .image(imageUrl)
//                 .thumbnail(Constants.rssIcon)
//                 .footer(dateFormat.format(new Date(getDate())), null)
//                 .build();
//     }
// 
//     public EmbedData decorateRestEmbedObject(Language lg) {
//         return EmbedData.builder()
//                 .author(EmbedAuthorData.builder().name("Dofus.com").url(getUrl()).build())
//                 .title(getTitle())
//                 .image(EmbedImageData.builder().url(imageUrl).build())
//                 .thumbnail(EmbedThumbnailData.builder().url(Constants.rssIcon).build())
//                 .footer(EmbedFooterData.builder().text(dateFormat.format(new Date(getDate()))).build())
//                 .build();
//     }
// 
//     @Override
//     public EmbedCreateSpec decorateMoreEmbedObject(Language lg) {
//         return decorateEmbedObject(lg);
//     }
// }
// 
// Path: src/main/java/enums/Language.java
// public enum Language {
// 
//     FR("Français", "FR"), EN("English", "EN"), ES("Español", "ES");
// 
//     private String name;
//     private String abrev;
// 
//     Language(String name, String abrev){
//         this.name = name;
//         this.abrev = abrev;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String getAbrev() {
//         return abrev;
//     }
// 
//     @Override
//     public String toString(){
//         return name;
//     }
// }


// Path: src/main/java/finders/RSSFinder.java
import data.RSS;
import discord4j.common.util.Snowflake;
import discord4j.rest.entity.RestChannel;
import discord4j.rest.http.client.ClientException;
import enums.Language;
import util.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

package finders;



/**
 * Created by steve on 12/01/2017.
 */
public class RSSFinder {
    private final static Logger LOG = LoggerFactory.getLogger(RSSFinder.class);
    private final static long DELTA = 10; // 10min
    private static boolean isStarted = false;

    private static Map<String, RSSFinder> rssFinders = null;
    private String idGuild;
    private String chan;
    private long lastRSS;

    public RSSFinder(String idGuild, String chan) {
        this(idGuild, chan, System.currentTimeMillis());
    }

    private RSSFinder(String idGuild, String chan, long lastRSS) {
        this.idGuild = idGuild;
        this.chan = chan;
        this.lastRSS = lastRSS;
    }

    public synchronized void setLastRSS(long lastRSS) {
        this.lastRSS = lastRSS;

        Connexion connexion = Connexion.getInstance();
        Connection connection = connexion.getConnection();

        try {
            PreparedStatement preparedStatement = connection.prepareStatement(
                    "UPDATE RSS_Finder SET last_update = ? WHERE id_chan = ?;");
            preparedStatement.setLong(1, lastRSS);