From b95ba974ecaa5515bc6ccf4920626fe2cac5f706 Mon Sep 17 00:00:00 2001 From: NovaFox161 Date: Thu, 14 May 2020 14:54:33 -0500 Subject: [PATCH] This should allow the announcement system to run now --- .../discal/client/DisCalClient.java | 9 +- .../listeners/discord/ReadyEventListener.java | 1 + .../announcement/AnnouncementThread.java | 149 +++++++++--------- .../announcement/AnnouncementThreader.java | 37 ++--- 4 files changed, 94 insertions(+), 102 deletions(-) diff --git a/client/src/main/java/org/dreamexposure/discal/client/DisCalClient.java b/client/src/main/java/org/dreamexposure/discal/client/DisCalClient.java index bab8dd00..bdcb6a77 100644 --- a/client/src/main/java/org/dreamexposure/discal/client/DisCalClient.java +++ b/client/src/main/java/org/dreamexposure/discal/client/DisCalClient.java @@ -83,8 +83,6 @@ public class DisCalClient { CommandExecutor.registerCommand(new DevCommand()); //Start some of the daemon threads - AnnouncementThreader.getThreader().init(); - KeepAliveHandler.startKeepAlive(60); TimeManager.getManager().init(); @@ -108,7 +106,6 @@ public class DisCalClient { LogFeed.log(LogObject.forStatus("Shutting down Shard", "Shard shutting down")); TimeManager.getManager().shutdown(); - AnnouncementThreader.getThreader().shutdown(); DatabaseManager.disconnectFromMySQL(); client.logout().subscribe(); @@ -140,7 +137,11 @@ public class DisCalClient { .flatMap(MessageCreateListener::handle) .then(); - return Mono.when(onReady, onTextChannelDelete, onRoleDelete, onCommand); + Mono startAnnouncement = client.on(ReadyEvent.class) + .next() + .flatMap(ignore -> AnnouncementThreader.getThreader().init()); + + return Mono.when(onReady, onTextChannelDelete, onRoleDelete, onCommand, startAnnouncement); }).block(); } diff --git a/client/src/main/java/org/dreamexposure/discal/client/listeners/discord/ReadyEventListener.java b/client/src/main/java/org/dreamexposure/discal/client/listeners/discord/ReadyEventListener.java index fa0c83c5..076bc27f 100644 --- a/client/src/main/java/org/dreamexposure/discal/client/listeners/discord/ReadyEventListener.java +++ b/client/src/main/java/org/dreamexposure/discal/client/listeners/discord/ReadyEventListener.java @@ -33,5 +33,6 @@ public class ReadyEventListener { return Mono.empty(); }) .then(); + } } \ No newline at end of file diff --git a/client/src/main/java/org/dreamexposure/discal/client/module/announcement/AnnouncementThread.java b/client/src/main/java/org/dreamexposure/discal/client/module/announcement/AnnouncementThread.java index ee808028..c1e00dd6 100644 --- a/client/src/main/java/org/dreamexposure/discal/client/module/announcement/AnnouncementThread.java +++ b/client/src/main/java/org/dreamexposure/discal/client/module/announcement/AnnouncementThread.java @@ -15,8 +15,9 @@ import org.dreamexposure.discal.core.object.calendar.CalendarData; import org.dreamexposure.discal.core.utils.EventUtils; import org.dreamexposure.discal.core.wrapper.google.EventWrapper; -import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import discord4j.rest.util.Snowflake; import reactor.core.publisher.Flux; @@ -25,88 +26,86 @@ import reactor.core.scheduler.Schedulers; import reactor.function.TupleUtils; @SuppressWarnings({"WeakerAccess", "Duplicates"}) -public class AnnouncementThread extends Thread { +public class AnnouncementThread { - private Mono discalService; + private final Mono discalService; - private final HashMap> allSettings = new HashMap<>(); - private final HashMap> calendars = new HashMap<>(); - private final HashMap> customServices = new HashMap<>(); - private final HashMap>> allEvents = new HashMap<>(); + private final Map> allSettings = new ConcurrentHashMap<>(); + private final Map> calendars = new ConcurrentHashMap<>(); + private final Map> customServices = new ConcurrentHashMap<>(); + private final Map>> allEvents = new ConcurrentHashMap<>(); public AnnouncementThread() { + discalService = CalendarAuth.getCalendarService(null).cache(); } + public Mono run() { + return Mono.defer(() -> { + if (DisCalClient.getClient() == null) + return Mono.empty(); - @Override - public void run() { - //Verify the client is logged in - if (DisCalClient.getClient() == null) - return; + return DisCalClient.getClient().getGuilds() + .flatMap(guild -> DatabaseManager.getEnabledAnnouncements(guild.getId()) + .flatMapMany(Flux::fromIterable) + .flatMap(a -> { + Mono s = getSettings(a); + Mono cd = getCalendarData(a); + Mono se = s.flatMap(this::getService); - discalService = CalendarAuth.getCalendarService(null).cache(); - - DisCalClient.getClient().getGuilds() - .flatMap(guild -> DatabaseManager.getEnabledAnnouncements(guild.getId()) - .flatMapMany(Flux::fromIterable) - .flatMap(a -> { - Mono s = getSettings(a); - Mono cd = getCalendarData(a); - Mono se = s.flatMap(this::getService); - - return Mono.zip(s, cd, se) - .map(TupleUtils.function((settings, calData, service) -> { - switch (a.getAnnouncementType()) { - case SPECIFIC: - return EventUtils.eventExists(settings, calData.getCalendarNumber(), a.getEventId()) - .filter(identity -> identity) - .switchIfEmpty(DatabaseManager.deleteAnnouncement(a.getAnnouncementId().toString()) - .then(Mono.empty())) - .flatMap(ignored -> EventWrapper.getEvent(calData, settings, a.getEventId())) - .filter(event -> inRange(a, event)) - .flatMap(e -> - AnnouncementMessageFormatter.sendAnnouncementMessage(guild, a, e, calData, settings) - .then(DatabaseManager.deleteAnnouncement(a.getAnnouncementId().toString())) - ); - case UNIVERSAL: - return getEvents(settings, calData, service) - .flatMapMany(Flux::fromIterable) - .filter(e -> inRange(a, e)) - .flatMap(e -> - AnnouncementMessageFormatter - .sendAnnouncementMessage(guild, a, e, calData, settings) - ); - case COLOR: - return getEvents(settings, calData, service) - .flatMapMany(Flux::fromIterable) - .filter(e -> e.getColorId() != null - && a.getEventColor().equals(EventColor.fromNameOrHexOrID(e.getColorId())) - ) - .filter(e -> inRange(a, e)) - .flatMap(e -> - AnnouncementMessageFormatter - .sendAnnouncementMessage(guild, a, e, calData, settings)); - case RECUR: - return getEvents(settings, calData, service) - .flatMapMany(Flux::fromIterable) - .filter(e -> e.getId().contains("_") && e.getId().split("_")[0].equals(a.getEventId())) - .filter(e -> inRange(a, e)) - .flatMap(e -> - AnnouncementMessageFormatter - .sendAnnouncementMessage(guild, a, e, calData, settings)); - default: - return Mono.empty(); - } - })); - }).onErrorResume(e -> Mono.empty()) - ).onErrorResume(e -> Mono.empty()) - .doFinally(ignore -> { - allSettings.clear(); - calendars.clear(); - customServices.clear(); - allEvents.clear(); - }).subscribeOn(Schedulers.immediate()) - .subscribe(); + return Mono.zip(s, cd, se) + .map(TupleUtils.function((settings, calData, service) -> { + switch (a.getAnnouncementType()) { + case SPECIFIC: + return EventUtils.eventExists(settings, calData.getCalendarNumber(), a.getEventId()) + .filter(identity -> identity) + .switchIfEmpty(DatabaseManager.deleteAnnouncement(a.getAnnouncementId().toString()) + .then(Mono.empty())) + .flatMap(ignored -> EventWrapper.getEvent(calData, settings, a.getEventId())) + .filter(event -> inRange(a, event)) + .flatMap(e -> + AnnouncementMessageFormatter.sendAnnouncementMessage(guild, a, e, calData, settings) + .then(DatabaseManager.deleteAnnouncement(a.getAnnouncementId().toString())) + ); + case UNIVERSAL: + return getEvents(settings, calData, service) + .flatMapMany(Flux::fromIterable) + .filter(e -> inRange(a, e)) + .flatMap(e -> + AnnouncementMessageFormatter + .sendAnnouncementMessage(guild, a, e, calData, settings) + ); + case COLOR: + return getEvents(settings, calData, service) + .flatMapMany(Flux::fromIterable) + .filter(e -> e.getColorId() != null + && a.getEventColor().equals(EventColor.fromNameOrHexOrID(e.getColorId())) + ) + .filter(e -> inRange(a, e)) + .flatMap(e -> + AnnouncementMessageFormatter + .sendAnnouncementMessage(guild, a, e, calData, settings)); + case RECUR: + return getEvents(settings, calData, service) + .flatMapMany(Flux::fromIterable) + .filter(e -> e.getId().contains("_") && e.getId().split("_")[0].equals(a.getEventId())) + .filter(e -> inRange(a, e)) + .flatMap(e -> + AnnouncementMessageFormatter + .sendAnnouncementMessage(guild, a, e, calData, settings)); + default: + return Mono.empty(); + } + })); + }).onErrorResume(e -> Mono.empty()) + ).onErrorResume(e -> Mono.empty()) + .doFinally(ignore -> { + allSettings.clear(); + calendars.clear(); + customServices.clear(); + allEvents.clear(); + }).subscribeOn(Schedulers.immediate()) + .then(); + }); } private boolean inRange(Announcement a, Event e) { diff --git a/client/src/main/java/org/dreamexposure/discal/client/module/announcement/AnnouncementThreader.java b/client/src/main/java/org/dreamexposure/discal/client/module/announcement/AnnouncementThreader.java index 2321f29b..3650fdd9 100644 --- a/client/src/main/java/org/dreamexposure/discal/client/module/announcement/AnnouncementThreader.java +++ b/client/src/main/java/org/dreamexposure/discal/client/module/announcement/AnnouncementThreader.java @@ -1,37 +1,28 @@ package org.dreamexposure.discal.client.module.announcement; -import java.util.Timer; -import java.util.TimerTask; +import java.time.Duration; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; public class AnnouncementThreader { - private static AnnouncementThreader threader; + static { + instance = new AnnouncementThreader(); + } - private Timer timer; + private final static AnnouncementThreader instance; private AnnouncementThreader() { } public static AnnouncementThreader getThreader() { - if (threader == null) - threader = new AnnouncementThreader(); - - return threader; + return instance; } - public void init() { - timer = new Timer(true); - - timer.schedule(new TimerTask() { - @Override - public void run() { - AnnouncementThread t = new AnnouncementThread(); - t.setDaemon(true); - t.start(); - } - }, 5 * 1000 * 60, 5 * 1000 * 60); - } - - public void shutdown() { - timer.cancel(); + public Mono init() { + return Flux.interval(Duration.ofMinutes(5)) + .onBackpressureBuffer() + .flatMap(i -> new AnnouncementThread().run()) + .then(); } } \ No newline at end of file