// 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;
        if (rssFinders == null){
            rssFinders = new ConcurrentHashMap<>();

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

            try {
                PreparedStatement query = connection.prepareStatement("SELECT id_guild, id_chan, last_update FROM RSS_Finder");
                ResultSet resultSet = query.executeQuery();

                while (resultSet.next()){
                    String idChan = resultSet.getString("id_chan");
                    String idGuild = resultSet.getString("id_guild");
                    long lastUpdate = resultSet.getLong("last_update");
                    rssFinders.put(idChan, new RSSFinder(idGuild, idChan, lastUpdate));
                }
            } catch (SQLException e) {
                Reporter.report(e);
                LOG.error("getRSSFinders", e);
            }
        }

        return rssFinders;
    }

    public static void start(){
        if (!isStarted) {
            isStarted = true;
            ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
            scheduler.scheduleAtFixedRate(() -> {
// 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;

        if (rssFinders == null){
            rssFinders = new ConcurrentHashMap<>();

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

            try {
                PreparedStatement query = connection.prepareStatement("SELECT id_guild, id_chan, last_update FROM RSS_Finder");
                ResultSet resultSet = query.executeQuery();

                while (resultSet.next()){
                    String idChan = resultSet.getString("id_chan");
                    String idGuild = resultSet.getString("id_guild");
                    long lastUpdate = resultSet.getLong("last_update");
                    rssFinders.put(idChan, new RSSFinder(idGuild, idChan, lastUpdate));
                }
            } catch (SQLException e) {
                Reporter.report(e);
                LOG.error("getRSSFinders", e);
            }
        }

        return rssFinders;
    }

    public static void start(){
        if (!isStarted) {
            isStarted = true;
            ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
            scheduler.scheduleAtFixedRate(() -> {
                Map<Language, List<RSS>> allFeeds = new HashMap<>();