Use command-line parameters to define directory for states and chains.
[rhynodge.git] / README.md
1 # Reactor
2
3 ## Description
4
5 Reactor is a tool that lets you periodically execute tasks that depend on certain conditions.
6
7 Its concept is quite similar to websites like ifttt (“if this then that”): you evaluate an input condition (e. g. data from a website, Facebook or Twitter posts, incoming emails, existence of a file), and if it evaluates to “yes” you execute a certain action.
8
9 ## Concepts
10
11 The core of Reactor comprises ``Reaction``s which in turn consist of ``Query``s, ``Filter``s, ``Trigger``s, and ``Action``s.
12
13 ### Query
14
15 A query is a component that determines the state of a system: it can determine whether a file exists, or retrieves the latest 5 Twitter posts, or loads data from a website.
16
17 The result of a ``Query`` is a ``State``.
18
19 ### Filter
20
21 A filter is an optional component that turns a ``State`` into a different ``State``. It is used to process data and extract more useful information; e. g. a filter could take the raw data from a website and parse its HTML into a DOM tree, or a list of files could be filtered for CD images larger than 400 MiB.
22
23 The result of a ``Filter`` is a ``State``, again.
24
25 ### Trigger
26
27 A trigger decides if, given the current state and the previous state, a noteworthy change has occured. It could calculate the difference between two file lists, or of two Facebook post lists.
28
29 The result of a ``Trigger`` is an ``Output``.
30
31 ### Action
32
33 If a trigger found a change, the action is then executed. Again, an action can be almost anything: it can send an email, it can execute programs, print documents, initiate phone calls, take a picture from a webcam — anything you can program can be used an an action.
34
35 ## Configuration
36
37 Reactor’s configuration uses JSON files (I tried using XML first but apparently polymorphic deserialization is something that is not easily done with XML parsers). The format of a ``Chain`` configuration is pretty straight-forward and can be seen in the example configuration files.