summaryrefslogtreecommitdiffstats
path: root/src/main.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.hs')
-rw-r--r--src/main.hs46
1 files changed, 42 insertions, 4 deletions
diff --git a/src/main.hs b/src/main.hs
index db5e54a..89966c2 100644
--- a/src/main.hs
+++ b/src/main.hs
@@ -1,14 +1,52 @@
{-# LANGUAGE LambdaCase #-}
+{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
-import Data.Aeson (eitherDecodeFileStrict)
+import Control.Lens
+import Data.Aeson
+import Data.Aeson (Value)
+import Data.Aeson.Lens
+import Data.Aeson.Types
+import Data.Text (Text)
+import Prelude.Extended
import qualified Reaktor
+import qualified Reaktor.Plugins.Mention
+import qualified Reaktor.Plugins.Ping
+import qualified Reaktor.Plugins.Register
+import qualified Reaktor.Plugins.System
import qualified System.Environment
main :: IO ()
main = do
[configPath] <- System.Environment.getArgs
- eitherDecodeFileStrict configPath >>= \case
- Right cfg -> Reaktor.run cfg
- Left err -> error err
+
+ v <- preview _Value <$> readFile configPath
+
+ Reaktor.run (reaktorConfig v) $ \actions ->
+ mapM id [
+ Reaktor.Plugins.Mention.new actions,
+ Reaktor.Plugins.Ping.new actions,
+ Reaktor.Plugins.Register.new (pluginConfig "register" v) actions,
+ Reaktor.Plugins.System.new (pluginConfig "system" v) actions
+ ]
+
+
+reaktorConfig :: (FromJSON b, Default b) => Maybe Value -> b
+reaktorConfig = maybe def parseOrDie
+
+pluginConfig :: (AsValue a, FromJSON b, Default b) => Text -> Maybe a -> b
+pluginConfig k v = maybe def parseOrDie (v ^? plugin k)
+
+
+plugin :: (Applicative f, AsValue a) =>
+ Text -> (Value -> f Value) -> Maybe a -> f (Maybe a)
+plugin k = _Just
+ . key "plugins"
+ . values
+ . filtered (has (key "plugin" . _String . only k))
+ . key "config"
+
+
+parseOrDie :: FromJSON p => Value -> p
+parseOrDie = either error id . parseEither parseJSON