This should allow the announcement system to run now

This commit is contained in:
NovaFox161
2020-05-14 14:54:33 -05:00
parent 3f7a7f54d0
commit b95ba974ec
4 changed files with 94 additions and 102 deletions

View File

@@ -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<Void> startAnnouncement = client.on(ReadyEvent.class)
.next()
.flatMap(ignore -> AnnouncementThreader.getThreader().init());
return Mono.when(onReady, onTextChannelDelete, onRoleDelete, onCommand, startAnnouncement);
}).block();
}

View File

@@ -33,5 +33,6 @@ public class ReadyEventListener {
return Mono.empty();
})
.then();
}
}

View File

@@ -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<Calendar> discalService;
private final Mono<Calendar> discalService;
private final HashMap<Snowflake, Mono<GuildSettings>> allSettings = new HashMap<>();
private final HashMap<Snowflake, Mono<CalendarData>> calendars = new HashMap<>();
private final HashMap<Snowflake, Mono<Calendar>> customServices = new HashMap<>();
private final HashMap<Snowflake, Mono<List<Event>>> allEvents = new HashMap<>();
private final Map<Snowflake, Mono<GuildSettings>> allSettings = new ConcurrentHashMap<>();
private final Map<Snowflake, Mono<CalendarData>> calendars = new ConcurrentHashMap<>();
private final Map<Snowflake, Mono<Calendar>> customServices = new ConcurrentHashMap<>();
private final Map<Snowflake, Mono<List<Event>>> allEvents = new ConcurrentHashMap<>();
public AnnouncementThread() {
discalService = CalendarAuth.getCalendarService(null).cache();
}
public Mono<Void> 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<GuildSettings> s = getSettings(a);
Mono<CalendarData> cd = getCalendarData(a);
Mono<Calendar> 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<GuildSettings> s = getSettings(a);
Mono<CalendarData> cd = getCalendarData(a);
Mono<Calendar> 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) {

View File

@@ -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<Void> init() {
return Flux.interval(Duration.ofMinutes(5))
.onBackpressureBuffer()
.flatMap(i -> new AnnouncementThread().run())
.then();
}
}