X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Freactor%2Fengine%2FEngine.java;h=e82267cefaf6c39543a1fd748b6f94f413c39975;hb=e700c7d888d36c44d648cff6344c876f71c0bba8;hp=60bc91dc116d449a2b7b642800ea68f5d613c7c8;hpb=9111850302534fa585ab2c418b36fe036aa9b404;p=rhynodge.git diff --git a/src/main/java/net/pterodactylus/reactor/engine/Engine.java b/src/main/java/net/pterodactylus/reactor/engine/Engine.java index 60bc91d..e82267c 100644 --- a/src/main/java/net/pterodactylus/reactor/engine/Engine.java +++ b/src/main/java/net/pterodactylus/reactor/engine/Engine.java @@ -64,15 +64,9 @@ public class Engine extends AbstractExecutionThreadService { * The name of the reaction * @param reaction * The reaction to add to this engine - * @throws IllegalStateException - * if the engine already contains a {@link Reaction} with the - * given name */ public void addReaction(String name, Reaction reaction) { synchronized (reactions) { - if (reactions.containsKey(name)) { - throw new IllegalStateException(String.format("Engine already contains a Reaction named “%s!”", name)); - } reactions.put(name, reaction); reactions.notifyAll(); } @@ -124,7 +118,7 @@ public class Engine extends AbstractExecutionThreadService { Reaction nextReaction; synchronized (reactions) { for (Entry reactionEntry : reactions.entrySet()) { - net.pterodactylus.reactor.State state = stateManager.loadState(reactionEntry.getKey()); + net.pterodactylus.reactor.State state = stateManager.loadLastState(reactionEntry.getKey()); long stateTime = (state != null) ? state.time() : 0; nextReactions.put(stateTime + reactionEntry.getValue().updateInterval(), Pair.of(reactionEntry.getKey(), reactionEntry.getValue())); } @@ -134,8 +128,9 @@ public class Engine extends AbstractExecutionThreadService { logger.debug(String.format("Next Reaction: %s.", nextReaction)); /* wait until the next reaction has to run. */ - net.pterodactylus.reactor.State lastState = stateManager.loadState(reactionName); + net.pterodactylus.reactor.State lastState = stateManager.loadLastState(reactionName); long lastStateTime = (lastState != null) ? lastState.time() : 0; + int lastStateFailCount = (lastState != null) ? lastState.failCount() : 0; long waitTime = (lastStateTime + nextReaction.updateInterval()) - System.currentTimeMillis(); logger.debug(String.format("Time to wait for next Reaction: %d millseconds.", waitTime)); if (waitTime > 0) { @@ -179,14 +174,15 @@ public class Engine extends AbstractExecutionThreadService { state = newState; } } - if (state.success()) { - stateManager.saveState(reactionName, state); + if (!state.success()) { + state.setFailCount(lastStateFailCount + 1); } + stateManager.saveState(reactionName, state); - /* only run trigger if we have collected two states. */ + /* only run trigger if we have collected two successful states. */ Trigger trigger = nextReaction.trigger(); boolean triggerHit = false; - if ((lastState != null) && state.success()) { + if ((lastState != null) && lastState.success() && state.success()) { logger.debug("Checking Trigger for changes..."); triggerHit = trigger.triggers(state, lastState); }