import net.pterodactylus.rhynodge.Query;
import net.pterodactylus.rhynodge.Reaction;
import net.pterodactylus.rhynodge.State;
-import net.pterodactylus.rhynodge.Trigger;
import net.pterodactylus.rhynodge.actions.EmailAction;
+import net.pterodactylus.rhynodge.Merger;
import net.pterodactylus.rhynodge.output.DefaultOutput;
import net.pterodactylus.rhynodge.output.Output;
import net.pterodactylus.rhynodge.states.FailedState;
/**
* Runs a {@link Reaction}, starting with its {@link Query}, running the {@link
- * State} through its {@link Filter}s, and finally checking the {@link Trigger}
+ * State} through its {@link Filter}s, and finally checking the {@link Merger}
* for whether an {@link Action} needs to be executed.
*
* @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
State state = runQuery();
state = runStateThroughFilters(state);
if (!state.success()) {
- logger.info(format("Reaction %s failed.", reaction.name()));
+ logger.info(format("Reaction %s failed in %s.", reaction.name(), state));
+ Optional<State> lastState = reactionState.loadLastState();
saveStateWithIncreasedFailCount(state);
- errorEmailAction.execute(createErrorOutput(reaction, state));
+ if (thisFailureIsTheFirstFailure(lastState)) {
+ errorEmailAction.execute(createErrorOutput(reaction, state));
+ }
return;
}
Optional<State> lastSuccessfulState = reactionState.loadLastSuccessfulState();
reactionState.saveState(state);
return;
}
- Trigger trigger = reaction.trigger();
- State newState = trigger.mergeStates(lastSuccessfulState.get(), state);
+ Merger merger = reaction.merger();
+ State newState = merger.mergeStates(lastSuccessfulState.get(), state);
reactionState.saveState(newState);
- if (trigger.triggers()) {
+ if (newState.triggered()) {
logger.info(format("Trigger was hit for %s, executing action...", reaction.name()));
- reaction.action().execute(trigger.output(reaction));
+ reaction.action().execute(newState.output(reaction));
}
logger.info(format("Reaction %s finished.", reaction.name()));
}
+ private static boolean thisFailureIsTheFirstFailure(Optional<State> lastState) {
+ return lastState.map(State::success).orElse(true);
+ }
+
private void saveStateWithIncreasedFailCount(State state) {
Optional<State> lastState = reactionState.loadLastState();
state.setFailCount(lastState.map(State::failCount).orElse(0) + 1);
private String createErrorEmailText(Reaction reaction, State state) {
StringBuilder emailText = new StringBuilder();
- emailText.append(String.format("An error occured while processing “.”\n\n", reaction.name()));
+ emailText.append(String.format("An error occured while processing “%s.”\n\n", reaction.name()));
appendExceptionToEmailText(state.exception(), emailText);
return emailText.toString();
}
logger.debug(format("Filtering state through %s...", filter.getClass().getSimpleName()));
try {
currentState = filter.filter(currentState);
- if (currentState.success() && currentState.isEmpty()) {
- errorEmailAction.execute(createEmptyStateOutput(reaction, currentState));
- }
} catch (Throwable t1) {
logger.warn(format("Error during filter %s for %s.", filter.getClass().getSimpleName(), reaction.name()), t1);
return new FailedState(t1);
return currentState;
}
- private Output createEmptyStateOutput(Reaction reaction, State state) {
- DefaultOutput defaultOutput = new DefaultOutput(String.format("Reached Empty State for “%s!”", reaction.name()));
- defaultOutput.addText("text/plain", String.format("The %s for %s was empty.", state.getClass().getSimpleName(), reaction.name()));
- return defaultOutput;
- }
-
}