From 504a878c674669a2a3d86dcc379cf55cb4eafe93 Mon Sep 17 00:00:00 2001 From: "Weston Rye (Demod)" Date: Thu, 22 Jun 2017 01:05:13 -0400 Subject: [PATCH] Resolved #62 --- .../config.template.json | 1 + .../fbsr/app/BlueprintBotDiscordService.java | 17 ++++++ .../fbsr/app/BlueprintBotRedditService.java | 8 ++- .../src/com/demod/fbsr/app/ServiceFinder.java | 10 ++- .../com/demod/fbsr/app/StartAllServices.java | 3 +- .../com/demod/fbsr/app/WatchdogService.java | 61 +++++++++++++++++++ 6 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/WatchdogService.java diff --git a/FactorioBlueprintStringRenderer/config.template.json b/FactorioBlueprintStringRenderer/config.template.json index 85ae1e4..03d44d8 100644 --- a/FactorioBlueprintStringRenderer/config.template.json +++ b/FactorioBlueprintStringRenderer/config.template.json @@ -13,5 +13,6 @@ "refresh_seconds": 20, "age_limit_hours": 24 }, + "watchdog_interval_minutes": 1, "factorio": "C:\\Program Files (x86)\\Steam\\steamapps\\common\\Factorio" } \ No newline at end of file diff --git a/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/BlueprintBotDiscordService.java b/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/BlueprintBotDiscordService.java index f151747..265e543 100644 --- a/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/BlueprintBotDiscordService.java +++ b/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/BlueprintBotDiscordService.java @@ -44,6 +44,7 @@ import com.demod.fbsr.TaskReporting; import com.demod.fbsr.TaskReporting.Level; import com.demod.fbsr.WebUtils; import com.demod.fbsr.WorldMap; +import com.demod.fbsr.app.WatchdogService.WatchdogReporter; import com.google.common.collect.LinkedHashMultiset; import com.google.common.collect.Multiset; import com.google.common.util.concurrent.AbstractIdleService; @@ -420,6 +421,7 @@ public class BlueprintBotDiscordService extends AbstractIdleService { @Override protected void shutDown() throws Exception { ServiceFinder.removeService(this); + ServiceFinder.removeService(WatchdogReporter.class); bot.stopAsync().awaitTerminated(); } @@ -479,6 +481,21 @@ public class BlueprintBotDiscordService extends AbstractIdleService { reportingUserID = Config.get().getString("discord_reporting_user_id"); ServiceFinder.addService(this); + ServiceFinder.addService(WatchdogReporter.class, new WatchdogReporter() { + @Override + public void notifyInactive(String label) { + TaskReporting reporting = new TaskReporting(); + reporting.addWarning(label + " has gone inactive!"); + sendReport("Watchdog", null, reporting); + } + + @Override + public void notifyReactive(String label) { + TaskReporting reporting = new TaskReporting(); + reporting.addInfo(label + " is now active again!"); + sendReport("Watchdog", null, reporting); + } + }); } catch (Exception e) { e.printStackTrace(); } diff --git a/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/BlueprintBotRedditService.java b/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/BlueprintBotRedditService.java index f05901a..fae6c5a 100644 --- a/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/BlueprintBotRedditService.java +++ b/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/BlueprintBotRedditService.java @@ -163,8 +163,8 @@ public class BlueprintBotRedditService extends AbstractScheduledService { " There was a problem completing your request. I have contacted my programmer to fix it for you!"); } - ServiceFinder.findService(BlueprintBotDiscordService.class).ifPresent( - s -> s.sendReport("Reddit / " + subreddit + " / " + author, REDDIT_AUTHOR_URL, reporting)); + ServiceFinder.findService(BlueprintBotDiscordService.class) + .ifPresent(s -> s.sendReport("Reddit / " + subreddit + " / " + author, REDDIT_AUTHOR_URL, reporting)); return Optional.of(lines.stream().collect(Collectors.joining("\n\n"))); } @@ -317,6 +317,10 @@ public class BlueprintBotRedditService extends AbstractScheduledService { if (cacheUpdated) { saveCache(cacheJson); } + + ServiceFinder.findService(WatchdogService.class).ifPresent(watchdog -> { + watchdog.notifyActive("Reddit Bot"); + }); } catch (NetworkException e) { System.out.println("Network Problem [" + e.getClass().getSimpleName() + "]: " + e.getMessage()); authExpireMillis = 0; diff --git a/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/ServiceFinder.java b/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/ServiceFinder.java index 0148e83..425524d 100644 --- a/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/ServiceFinder.java +++ b/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/ServiceFinder.java @@ -7,6 +7,10 @@ import java.util.concurrent.ConcurrentHashMap; public class ServiceFinder { private static final Map, Object> registry = new ConcurrentHashMap<>(); + public static void addService(Class clazz, S service) { + registry.put(clazz, service); + } + public static void addService(Object service) { registry.put(service.getClass(), service); } @@ -16,7 +20,11 @@ public class ServiceFinder { return Optional.ofNullable((T) registry.get(clazz)); } + public static void removeService(Class clazz) { + registry.remove(clazz); + } + public static void removeService(Object service) { - registry.remove(service.getClass()); + removeService(service.getClass()); } } diff --git a/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/StartAllServices.java b/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/StartAllServices.java index 9451705..1333a54 100644 --- a/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/StartAllServices.java +++ b/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/StartAllServices.java @@ -10,7 +10,8 @@ public class StartAllServices { public static void main(String[] args) { ServiceManager manager = new ServiceManager(Arrays.asList(new Service[] { // new BlueprintBotDiscordService(), // - new BlueprintBotRedditService(),// + new BlueprintBotRedditService(), // + new WatchdogService(),// })); manager.startAsync(); diff --git a/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/WatchdogService.java b/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/WatchdogService.java new file mode 100644 index 0000000..597233c --- /dev/null +++ b/FactorioBlueprintStringRenderer/src/com/demod/fbsr/app/WatchdogService.java @@ -0,0 +1,61 @@ +package com.demod.fbsr.app; + +import java.util.LinkedHashSet; +import java.util.concurrent.TimeUnit; + +import com.demod.factorio.Config; +import com.google.common.util.concurrent.AbstractScheduledService; + +public class WatchdogService extends AbstractScheduledService { + + public static interface WatchdogReporter { + public void notifyInactive(String label); + + public void notifyReactive(String label); + } + + private final LinkedHashSet known = new LinkedHashSet<>(); + private final LinkedHashSet active = new LinkedHashSet<>(); + private final LinkedHashSet alarmed = new LinkedHashSet<>(); + + public synchronized void notifyActive(String label) { + known.add(label); + active.add(label); + if (alarmed.remove(label)) { + System.out.println("WATCHDOG: " + label + " is now active again!"); + ServiceFinder.findService(WatchdogReporter.class).ifPresent(reporter -> { + reporter.notifyReactive(label); + }); + } + } + + @Override + protected synchronized void runOneIteration() throws Exception { + for (String label : known) { + if (!active.contains(label) && !alarmed.contains(label)) { + alarmed.add(label); + System.out.println("WATCHDOG: " + label + " has gone inactive!"); + ServiceFinder.findService(WatchdogReporter.class).ifPresent(reporter -> { + reporter.notifyInactive(label); + }); + } + } + active.clear(); + } + + @Override + protected Scheduler scheduler() { + return Scheduler.newFixedDelaySchedule(0, Config.get().getInt("watchdog_interval_minutes"), TimeUnit.MINUTES); + } + + @Override + protected void shutDown() throws Exception { + ServiceFinder.removeService(this); + } + + @Override + protected void startUp() throws Exception { + ServiceFinder.addService(this); + } + +}