diff --git a/API/src/main/java/com/cloudcraftgaming/discal/api/database/DatabaseManager.java b/API/src/main/java/com/cloudcraftgaming/discal/api/database/DatabaseManager.java index 19ba7514..d281464e 100644 --- a/API/src/main/java/com/cloudcraftgaming/discal/api/database/DatabaseManager.java +++ b/API/src/main/java/com/cloudcraftgaming/discal/api/database/DatabaseManager.java @@ -21,7 +21,7 @@ import java.util.UUID; * Website: www.cloudcraftgaming.com * For Project: DisCal-Discord-Bot */ -@SuppressWarnings({"SqlResolve", "UnusedReturnValue", "SqlNoDataSourceInspection"}) +@SuppressWarnings({"SqlResolve", "UnusedReturnValue", "SqlNoDataSourceInspection", "Duplicates"}) public class DatabaseManager { private static DatabaseManager instance; private DatabaseInfo databaseInfo; @@ -173,7 +173,7 @@ public class DatabaseManager { PreparedStatement statement = databaseInfo.getConnection().prepareStatement(query); ResultSet res = statement.executeQuery(); - Boolean hasStuff = res.next(); + boolean hasStuff = res.next(); if (!hasStuff || res.getString("API_KEY") == null) { //Data not present, add to DB. @@ -228,7 +228,7 @@ public class DatabaseManager { PreparedStatement statement = databaseInfo.getConnection().prepareStatement(query); ResultSet res = statement.executeQuery(); - Boolean hasStuff = res.next(); + boolean hasStuff = res.next(); if (!hasStuff || res.getString("GUILD_ID") == null) { //Data not present, add to DB. @@ -309,7 +309,7 @@ public class DatabaseManager { PreparedStatement statement = databaseInfo.getConnection().prepareStatement(query); ResultSet res = statement.executeQuery(); - Boolean hasStuff = res.next(); + boolean hasStuff = res.next(); if (!hasStuff || res.getString("GUILD_ID") == null) { //Data not present, add to DB. @@ -358,7 +358,7 @@ public class DatabaseManager { * @param announcement The announcement object to add to the database. * @return true if successful, else false. */ - public Boolean updateAnnouncement(Announcement announcement) { + public boolean updateAnnouncement(Announcement announcement) { try { if (databaseInfo.getMySQL().checkConnection()) { String announcementTableName = String.format("%sannouncements", databaseInfo.getPrefix()); @@ -367,7 +367,7 @@ public class DatabaseManager { PreparedStatement statement = databaseInfo.getConnection().prepareStatement(query); ResultSet res = statement.executeQuery(); - Boolean hasStuff = res.next(); + boolean hasStuff = res.next(); if (!hasStuff || res.getString("ANNOUNCEMENT_ID") == null) { //Data not present, add to db. @@ -432,7 +432,7 @@ public class DatabaseManager { return false; } - public Boolean updateEventData(EventData data) { + public boolean updateEventData(EventData data) { try { if (databaseInfo.getMySQL().checkConnection()) { String eventTableName = String.format("%sevents", databaseInfo.getPrefix()); @@ -445,7 +445,7 @@ public class DatabaseManager { PreparedStatement statement = databaseInfo.getConnection().prepareStatement(query); ResultSet res = statement.executeQuery(); - Boolean hasStuff = res.next(); + boolean hasStuff = res.next(); if (!hasStuff || res.getString("EVENT_ID") == null) { //Data not present, add to DB. @@ -485,7 +485,7 @@ public class DatabaseManager { return false; } - public Boolean updateRsvpData(RsvpData data) { + public boolean updateRsvpData(RsvpData data) { try { if (databaseInfo.getMySQL().checkConnection()) { String rsvpTableName = String.format("%srsvp", databaseInfo.getPrefix()); @@ -494,7 +494,7 @@ public class DatabaseManager { PreparedStatement statement = databaseInfo.getConnection().prepareStatement(query); ResultSet res = statement.executeQuery(); - Boolean hasStuff = res.next(); + boolean hasStuff = res.next(); if (!hasStuff || res.getString("EVENT_ID") == null) { //Data not present, add to DB. @@ -553,7 +553,7 @@ public class DatabaseManager { PreparedStatement statement = databaseInfo.getConnection().prepareStatement(query); ResultSet res = statement.executeQuery(); - Boolean hasStuff = res.next(); + boolean hasStuff = res.next(); if (hasStuff && res.getString("API_KEY") != null) { UserAPIAccount account = new UserAPIAccount(); @@ -588,7 +588,7 @@ public class DatabaseManager { PreparedStatement statement = databaseInfo.getConnection().prepareStatement(query); ResultSet res = statement.executeQuery(); - Boolean hasStuff = res.next(); + boolean hasStuff = res.next(); if (hasStuff && res.getString("GUILD_ID") != null) { settings.setUseExternalCalendar(res.getBoolean("EXTERNAL_CALENDAR")); @@ -760,7 +760,7 @@ public class DatabaseManager { } public Integer getCalendarCount() { - Integer amount = -1; + int amount = -1; try { if (databaseInfo.getMySQL().checkConnection()) { String calendarTableName = String.format("%scalendars", databaseInfo.getPrefix()); @@ -918,7 +918,7 @@ public class DatabaseManager { PreparedStatement statement = databaseInfo.getConnection().prepareStatement(query); ResultSet res = statement.executeQuery(); - Boolean hasStuff = res.next(); + boolean hasStuff = res.next(); if (hasStuff && res.getString("ANNOUNCEMENT_ID") != null) { Announcement announcement = new Announcement(announcementId, guildId); @@ -1026,6 +1026,44 @@ public class DatabaseManager { return announcements; } + public ArrayList getAnnouncements(AnnouncementType type) { + ArrayList announcements = new ArrayList<>(); + try { + if (databaseInfo.getMySQL().checkConnection()) { + String announcementTableName = String.format("%sannouncements", databaseInfo.getPrefix()); + + PreparedStatement stmt = databaseInfo.getConnection().prepareStatement("SELECT * FROM " + announcementTableName + " WHERE ANNOUNCEMENT_TYPE = ?"); + stmt.setString(1, type.name()); + ResultSet res = stmt.executeQuery(); + + while (res.next()) { + if (res.getString("ANNOUNCEMENT_ID") != null) { + Announcement announcement = new Announcement(UUID.fromString(res.getString("ANNOUNCEMENT_ID")), Long.valueOf(res.getString("GUILD_ID"))); + announcement.setSubscriberRoleIdsFromString(res.getString("SUBSCRIBERS_ROLE")); + announcement.setSubscriberUserIdsFromString(res.getString("SUBSCRIBERS_USER")); + announcement.setAnnouncementChannelId(res.getString("CHANNEL_ID")); + announcement.setAnnouncementType(type); + announcement.setEventId(res.getString("EVENT_ID")); + announcement.setEventColor(EventColor.fromNameOrHexOrID(res.getString("EVENT_COLOR"))); + announcement.setHoursBefore(res.getInt("HOURS_BEFORE")); + announcement.setMinutesBefore(res.getInt("MINUTES_BEFORE")); + announcement.setInfo(res.getString("INFO")); + announcement.setEnabled(res.getBoolean("ENABLED")); + announcement.setInfoOnly(res.getBoolean("INFO_ONLY")); + + announcements.add(announcement); + } + } + + stmt.close(); + } + } catch (SQLException e) { + Logger.getLogger().exception(null, "Failed to get all announcements by type.", e, this.getClass(), true); + } + + return announcements; + } + public ArrayList getEnabledAnnouncements() { ArrayList announcements = new ArrayList<>(); try { @@ -1059,13 +1097,53 @@ public class DatabaseManager { stmt.close(); } } catch (SQLException e) { - Logger.getLogger().exception(null, "Failed to get all announcements.", e, this.getClass(), true); + Logger.getLogger().exception(null, "Failed to get all enabled announcements.", e, this.getClass(), true); } return announcements; } - public Integer getAnnouncementCount() { + public ArrayList getEnabledAnnouncements(AnnouncementType type) { + ArrayList announcements = new ArrayList<>(); + try { + if (databaseInfo.getMySQL().checkConnection()) { + String announcementTableName = String.format("%sannouncements", databaseInfo.getPrefix()); + + PreparedStatement stmt = databaseInfo.getConnection().prepareStatement("SELECT * FROM " + announcementTableName + " WHERE ENABLED = 1 AND ANNOUNCEMENT_ID = ?"); + stmt.setString(1, type.name()); + ResultSet res = stmt.executeQuery(); + + while (res.next()) { + if (res.getString("ANNOUNCEMENT_ID") != null) { + Announcement announcement = new Announcement(UUID.fromString(res.getString("ANNOUNCEMENT_ID")), Long.valueOf(res.getString("GUILD_ID"))); + announcement.setSubscriberRoleIdsFromString(res.getString("SUBSCRIBERS_ROLE")); + announcement.setSubscriberUserIdsFromString(res.getString("SUBSCRIBERS_USER")); + announcement.setAnnouncementChannelId(res.getString("CHANNEL_ID")); + announcement.setAnnouncementType(type); + announcement.setEventId(res.getString("EVENT_ID")); + announcement.setEventColor(EventColor.fromNameOrHexOrID(res.getString("EVENT_COLOR"))); + announcement.setHoursBefore(res.getInt("HOURS_BEFORE")); + announcement.setMinutesBefore(res.getInt("MINUTES_BEFORE")); + announcement.setInfo(res.getString("INFO")); + announcement.setInfoOnly(res.getBoolean("INFO_ONLY")); + + //The announcement is obviously enabled if we have gotten here lol + announcement.setEnabled(true); + + announcements.add(announcement); + } + } + + stmt.close(); + } + } catch (SQLException e) { + Logger.getLogger().exception(null, "Failed to get all enabled announcements by type.", e, this.getClass(), true); + } + + return announcements; + } + + public int getAnnouncementCount() { int amount = -1; try { if (databaseInfo.getMySQL().checkConnection()) { @@ -1096,7 +1174,7 @@ public class DatabaseManager { * @param announcementId The ID of the announcement to delete. * @return true if successful, else false. */ - public Boolean deleteAnnouncement(String announcementId) { + public boolean deleteAnnouncement(String announcementId) { try { if (databaseInfo.getMySQL().checkConnection()) { String announcementTableName = String.format("%sannouncements", databaseInfo.getPrefix()); @@ -1115,7 +1193,7 @@ public class DatabaseManager { return false; } - public Boolean deleteAnnouncementsForEvent(long guildId, String eventId) { + public boolean deleteAnnouncementsForEvent(long guildId, String eventId) { try { if (databaseInfo.getMySQL().checkConnection()) { String announcementTableName = String.format("%sannouncements", databaseInfo.getPrefix()); @@ -1136,7 +1214,7 @@ public class DatabaseManager { return false; } - public Boolean deleteEventData(String eventId) { + public boolean deleteEventData(String eventId) { try { if (databaseInfo.getMySQL().checkConnection()) { String eventTable = String.format("%sevents", databaseInfo.getPrefix()); diff --git a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/internal/service/ApplicationHandler.java b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/internal/service/ApplicationHandler.java index 57a14b79..2f67588c 100644 --- a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/internal/service/ApplicationHandler.java +++ b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/internal/service/ApplicationHandler.java @@ -4,6 +4,7 @@ import com.cloudcraftgaming.discal.api.DisCalAPI; import com.cloudcraftgaming.discal.api.database.DatabaseManager; import com.cloudcraftgaming.discal.bot.internal.network.discordbots.UpdateDisBotData; import com.cloudcraftgaming.discal.bot.internal.network.discordpw.UpdateDisPwData; +import com.cloudcraftgaming.discal.bot.module.announcement.AnnouncementThreader; import com.cloudcraftgaming.discal.logger.Logger; import com.cloudcraftgaming.discal.web.handler.DiscordAccountHandler; import sx.blah.discord.util.DiscordException; @@ -82,16 +83,8 @@ public class ApplicationHandler { //MY CODE: Gracefully exit processes: System.out.println("Restarting Discord bot!"); - try { - DisCalAPI.getAPI().getClient().logout(); - } catch (DiscordException e) { - //No need to print, exiting anyway. - } - TimeManager.getManager().shutdown(); - DatabaseManager.getManager().disconnectFromMySQL(); - // exit - System.exit(0); + exitApplication(); } catch (Exception e) { // something went wrong Logger.getLogger().exception(null, "Failed to restart bot!", e, ApplicationHandler.class, true); @@ -111,6 +104,7 @@ public class ApplicationHandler { } UpdateDisBotData.shutdown(); UpdateDisPwData.shutdown(); + AnnouncementThreader.getThreader().shutdown(); TimeManager.getManager().shutdown(); DiscordAccountHandler.getHandler().shutdown(); DatabaseManager.getManager().disconnectFromMySQL(); diff --git a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/internal/service/TimeManager.java b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/internal/service/TimeManager.java index f8ce166e..06d6213b 100644 --- a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/internal/service/TimeManager.java +++ b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/internal/service/TimeManager.java @@ -1,6 +1,5 @@ package com.cloudcraftgaming.discal.bot.internal.service; -import com.cloudcraftgaming.discal.bot.module.announcement.AnnouncementTask; import com.cloudcraftgaming.discal.bot.module.misc.StatusChanger; import java.util.ArrayList; @@ -37,15 +36,15 @@ public class TimeManager { public void init() { Timer timer = new Timer(true); timer.schedule(new StatusChanger(), 10 * 1000, 10 * 1000); - timers.add(timer); - Timer at = new Timer(true); - at.schedule(new AnnouncementTask(), 5 * 1000 * 60, 5 * 1000 * 60); + //Timer at = new Timer(true); + //at.schedule(new AnnouncementTask(), 5 * 1000 * 60, 5 * 1000 * 60); + //timers.add(at); Timer cc = new Timer(true); cc.schedule(new CreatorCleaner(), 60 * 1000 * 60, 60 * 1000 * 60); - timers.add(at); + timers.add(cc); } /** diff --git a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/listeners/ReadyEventListener.java b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/listeners/ReadyEventListener.java index df9bb43a..7dea8bad 100644 --- a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/listeners/ReadyEventListener.java +++ b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/listeners/ReadyEventListener.java @@ -6,6 +6,7 @@ import com.cloudcraftgaming.discal.api.message.MessageManager; import com.cloudcraftgaming.discal.bot.internal.network.discordbots.UpdateDisBotData; import com.cloudcraftgaming.discal.bot.internal.network.discordpw.UpdateDisPwData; import com.cloudcraftgaming.discal.bot.internal.service.TimeManager; +import com.cloudcraftgaming.discal.bot.module.announcement.AnnouncementThreader; import com.cloudcraftgaming.discal.logger.Logger; import sx.blah.discord.api.events.EventSubscriber; import sx.blah.discord.handle.impl.events.ReadyEvent; @@ -23,6 +24,9 @@ public class ReadyEventListener { try { TimeManager.getManager().init(); + //Lets test the new announcement multi-threader... + AnnouncementThreader.getThreader().init(); + UpdateDisBotData.init(); UpdateDisPwData.init(); diff --git a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/announcement/AnnouncementTask.java b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/announcement/AnnouncementTask.java index b013ce2c..df03adb8 100644 --- a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/announcement/AnnouncementTask.java +++ b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/announcement/AnnouncementTask.java @@ -142,9 +142,9 @@ public class AnnouncementTask extends TimerTask { if (difference < 0) { //Event past, we can delete announcement depending on the type - if (a.getAnnouncementType() == AnnouncementType.SPECIFIC) { + if (a.getAnnouncementType() == AnnouncementType.SPECIFIC) DatabaseManager.getManager().deleteAnnouncement(a.getAnnouncementId().toString()); - } + return false; } else { return difference <= maxDifferenceMs; @@ -152,32 +152,32 @@ public class AnnouncementTask extends TimerTask { } private long getEventStartMs(Event e) { - if (e.getStart().getDateTime() != null) { + if (e.getStart().getDateTime() != null) return e.getStart().getDateTime().getValue(); - } else { + else return e.getStart().getDate().getValue(); - } + } private GuildSettings getSettings(Announcement a) { - if (!allSettings.containsKey(a.getGuildId())) { + if (!allSettings.containsKey(a.getGuildId())) allSettings.put(a.getGuildId(), DatabaseManager.getManager().getSettings(a.getGuildId())); - } + return allSettings.get(a.getGuildId()); } private CalendarData getCalendarData(Announcement a) { - if (!calendars.containsKey(a.getGuildId())) { + if (!calendars.containsKey(a.getGuildId())) calendars.put(a.getGuildId(), DatabaseManager.getManager().getMainCalendar(a.getGuildId())); - } + return calendars.get(a.getGuildId()); } private Calendar getService(GuildSettings gs) throws Exception { if (gs.useExternalCalendar()) { - if (!customServices.containsKey(gs.getGuildID())) { + if (!customServices.containsKey(gs.getGuildID())) customServices.put(gs.getGuildID(), CalendarAuth.getCalendarService(gs)); - } + return customServices.get(gs.getGuildID()); } return discalService; diff --git a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/announcement/AnnouncementThread.java b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/announcement/AnnouncementThread.java new file mode 100644 index 00000000..1edb1fb6 --- /dev/null +++ b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/announcement/AnnouncementThread.java @@ -0,0 +1,214 @@ +package com.cloudcraftgaming.discal.bot.module.announcement; + +import com.cloudcraftgaming.discal.api.calendar.CalendarAuth; +import com.cloudcraftgaming.discal.api.database.DatabaseManager; +import com.cloudcraftgaming.discal.api.enums.announcement.AnnouncementType; +import com.cloudcraftgaming.discal.api.enums.event.EventColor; +import com.cloudcraftgaming.discal.api.object.GuildSettings; +import com.cloudcraftgaming.discal.api.object.announcement.Announcement; +import com.cloudcraftgaming.discal.api.object.calendar.CalendarData; +import com.cloudcraftgaming.discal.api.utils.EventUtils; +import com.cloudcraftgaming.discal.bot.utils.GuildUtils; +import com.cloudcraftgaming.discal.logger.Logger; +import com.google.api.client.util.DateTime; +import com.google.api.services.calendar.Calendar; +import com.google.api.services.calendar.model.Event; +import com.google.api.services.calendar.model.Events; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +@SuppressWarnings({"WeakerAccess", "Duplicates"}) +public class AnnouncementThread extends Thread { + private final AnnouncementType type; + + private Calendar discalService; + + private HashMap allSettings = new HashMap<>(); + private HashMap calendars = new HashMap<>(); + private HashMap customServices = new HashMap<>(); + private HashMap> allEvents = new HashMap<>(); + + public AnnouncementThread(AnnouncementType _type) { + type = _type; + } + + + @Override + public void run() { + Logger.getLogger().announcement("Starting announcement loop for type: " + type.name() + "!"); + try { + //Get the default stuff. + try { + discalService = CalendarAuth.getCalendarService(null); + } catch (IOException e) { + Logger.getLogger().exception(null, "Failed to get service! 01a0101", e, this.getClass(), true); + } + + //NOTE: This list EXCLUDES disabled announcements!!!!!!! + ArrayList allAnnouncements = DatabaseManager.getManager().getEnabledAnnouncements(type); + + for (Announcement a: allAnnouncements) { + Logger.getLogger().announcement("starting an announcement", a.getGuildId() + "", a.getAnnouncementId() + "", "N/a"); + //Check if guild is part of DisCal's guilds. This way we can clear out the database... + if (!GuildUtils.active(a.getGuildId())) { + DatabaseManager.getManager().deleteAnnouncement(a.getAnnouncementId().toString()); + continue; + } + //Get everything we need ready. + GuildSettings settings = getSettings(a); + CalendarData calendar = getCalendarData(a); + Calendar service; + + try { + service = getService(settings); + } catch (Exception e) { + Logger.getLogger().exception(null, "Failed to handle service! 01a102", e, this.getClass(), true); + continue; + } + + //Now we can check the announcement type and do all the actual logic here. + switch (type) { + case SPECIFIC: + if (EventUtils.eventExists(settings, a.getEventId())) { + try { + Event e = service.events().get(calendar.getCalendarId(), a.getEventId()).execute(); + if (inRange(a, e)) { + //We can announce it. + AnnouncementMessageFormatter.sendAnnouncementMessage(a, e, calendar, settings); + //And now lets delete it + DatabaseManager.getManager().deleteAnnouncement(a.getAnnouncementId().toString()); + } + } catch (IOException e) { + //Event getting error, we know it exists tho + Logger.getLogger().exception(null, "Failed to get event! 01a103", e, this.getClass(), true); + } + } else { + //Event is gone, we can just delete this shit. + DatabaseManager.getManager().deleteAnnouncement(a.getAnnouncementId().toString()); + } + break; + case UNIVERSAL: + for (Event e: getEvents(settings, calendar, service, a)) { + if (inRange(a, e)) { + //It fits! Let's do it! + AnnouncementMessageFormatter.sendAnnouncementMessage(a, e, calendar, settings); + } + } + break; + case COLOR: + for (Event e: getEvents(settings, calendar, service, a)) { + if (a.getEventColor() == EventColor.fromNameOrHexOrID(e.getColorId())) { + if (inRange(a, e)) { + //It fits! Let's do it! + AnnouncementMessageFormatter.sendAnnouncementMessage(a, e, calendar, settings); + } + } + } + break; + case RECUR: + for (Event e: getEvents(settings, calendar, service, a)) { + if (inRange(a, e)) { + if (e.getId().contains("_") && e.getId().split("_")[0].equals(a.getEventId())) { + //It fits! Lets announce! + AnnouncementMessageFormatter.sendAnnouncementMessage(a, e, calendar, settings); + } + } + } + break; + } + Logger.getLogger().announcement("finished an announcement", a.getGuildId() + "", a.getAnnouncementId() + "", "N/a"); + } + + //Just clear everything immediately. + allSettings.clear(); + calendars.clear(); + customServices.clear(); + allEvents.clear(); + + Logger.getLogger().announcement("Finished announcement loop for type: " + type.name() + "!"); + } catch (Exception e) { + Logger.getLogger().exception(null, "SOMETHING BAD IN THE ANNOUNCER!!!!! ANNOUNCEMENT TYPE: " + type.name(), e, this.getClass(), true); + + //Clear everything because why take up RAM after is broke??? + allSettings.clear(); + calendars.clear(); + customServices.clear(); + allEvents.clear(); + } + } + + private boolean inRange(Announcement a, Event e) { + long maxDifferenceMs = 5 * 60 * 1000; //5 minutes + + long announcementTimeMs = Integer.toUnsignedLong(a.getMinutesBefore() + (a.getHoursBefore() * 60)) * 60 * 1000; + long timeUntilEvent = getEventStartMs(e) - System.currentTimeMillis(); + + long difference = timeUntilEvent - announcementTimeMs; + + if (difference < 0) { + //Event past, we can delete announcement depending on the type + if (a.getAnnouncementType() == AnnouncementType.SPECIFIC) + DatabaseManager.getManager().deleteAnnouncement(a.getAnnouncementId().toString()); + + return false; + } else { + return difference <= maxDifferenceMs; + } + } + + private long getEventStartMs(Event e) { + if (e.getStart().getDateTime() != null) + return e.getStart().getDateTime().getValue(); + else + return e.getStart().getDate().getValue(); + + } + + private GuildSettings getSettings(Announcement a) { + if (!allSettings.containsKey(a.getGuildId())) + allSettings.put(a.getGuildId(), DatabaseManager.getManager().getSettings(a.getGuildId())); + + return allSettings.get(a.getGuildId()); + } + + private CalendarData getCalendarData(Announcement a) { + if (!calendars.containsKey(a.getGuildId())) + calendars.put(a.getGuildId(), DatabaseManager.getManager().getMainCalendar(a.getGuildId())); + + return calendars.get(a.getGuildId()); + } + + private Calendar getService(GuildSettings gs) throws Exception { + if (gs.useExternalCalendar()) { + if (!customServices.containsKey(gs.getGuildID())) + customServices.put(gs.getGuildID(), CalendarAuth.getCalendarService(gs)); + + return customServices.get(gs.getGuildID()); + } + return discalService; + } + + private List getEvents(GuildSettings gs, CalendarData cd, Calendar service, Announcement a) { + if (!allEvents.containsKey(gs.getGuildID())) { + Logger.getLogger().announcement("getting events for guild...", gs.getGuildID() + "", a.getAnnouncementId() + "", "N/a"); + try { + Events events = service.events().list(cd.getCalendarAddress()) + .setMaxResults(15) + .setTimeMin(new DateTime(System.currentTimeMillis())) + .setOrderBy("startTime") + .setSingleEvents(true) + .setShowDeleted(false) + .execute(); + List items = events.getItems(); + allEvents.put(gs.getGuildID(), items); + } catch (IOException e) { + Logger.getLogger().exception(null, "Failed to get events list! 01ae2304 | Guild: " + gs.getGuildID() + " | Announcement: " + a.getAnnouncementId(), e, this.getClass(), true); + return new ArrayList<>(); + } + } + return allEvents.get(gs.getGuildID()); + } +} \ No newline at end of file diff --git a/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/announcement/AnnouncementThreader.java b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/announcement/AnnouncementThreader.java new file mode 100644 index 00000000..e28360fd --- /dev/null +++ b/Bot/src/main/java/com/cloudcraftgaming/discal/bot/module/announcement/AnnouncementThreader.java @@ -0,0 +1,41 @@ +package com.cloudcraftgaming.discal.bot.module.announcement; + +import com.cloudcraftgaming.discal.api.enums.announcement.AnnouncementType; + +import java.util.Timer; +import java.util.TimerTask; + +public class AnnouncementThreader { + private static AnnouncementThreader threader; + + private Timer timer; + + private AnnouncementThreader() { + } + + public static AnnouncementThreader getThreader() { + if (threader == null) + threader = new AnnouncementThreader(); + + return threader; + } + + public void init() { + timer = new Timer(true); + + timer.schedule(new TimerTask() { + @Override + public void run() { + for (AnnouncementType t: AnnouncementType.values()) { + AnnouncementThread at = new AnnouncementThread(t); + at.setDaemon(true); + at.run(); + } + } + }, 5 * 1000 * 60, 5 * 1000 * 60); + } + + public void shutdown() { + timer.cancel(); + } +} \ No newline at end of file