replicant-0.1.0.0: src/Replicant/Plugins/Score.hs
{-# LANGUAGE FlexibleContexts #-}
module Replicant.Plugins.Score
( score
) where
import Replicant.Plugins.Base
import qualified Data.Text as T
import qualified Database.Redis.Namespace as R
score :: Replicant e m => Plugin m
score = Plugin "score" [scoreUp, scoreDown, scoreShow]
scoreShow, scoreUp, scoreDown :: Replicant e m => Handler m
scoreShow = mkHandler "Show score" False ("score " *> word)
[ Example "score leeloo" "Show the score for leeloo"]
$ \term -> delta term 0
scoreUp = mkHandler "Add score" False (word <* "++")
[ Example "leeloo++" "Give leeloo 1 point"]
$ \term -> delta term 1
scoreDown = mkHandler "Lower score" False (word <* "--")
[ Example "leeloo--" "Be a monster"]
$ \term -> delta term (-1)
delta :: Replicant e m => Text -> Integer -> H m ()
delta term dn = redis (R.incrby term' dn) >>= explain term
where term' = encodeUtf8 term
explain :: Monad m => Text -> Integer -> H m ()
explain term n = reply $ term <> " has " <> T.pack (show n) <> " points"