blob: 51bc17cfb57d61203d1de7153583db6630a99226 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
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
v <- preview _Value <$> readFile configPath
Reaktor.run (reaktorConfig v) (apiConfig 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
]
apiConfig :: (FromJSON b) => Maybe Value -> Maybe b
apiConfig = \case
Just v -> maybe Nothing parseOrDie (v ^? key "API")
Nothing -> Nothing
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
|