    -- | This module is for throwing dice for e.g. RPGs. (\@dice 3d6+2)

    -- Original version copyright Einar Karttunen <ekarttun@cs.helsinki.fi> 2005-04-06.
    -- Massive rewrite circa 2008-10-20 copyright James Cook <mokus@deepbondi.net>
    module Lambdabot.Plugin.Novelty.Dice (dicePlugin) where

    import Lambdabot.Plugin
    import Lambdabot.Util

    import Data.List
    import Data.Random.Dice (rollEm)

    type Dice = ModuleT () LB

    dicePlugin :: Module ()
    dicePlugin = newModule
        { moduleCmds = return
            [ (command "dice")
                { aliases = ["roll"]
                , help = say "@dice <expr>. Throw random dice. <expr> is of the form 3d6+2."
                , process = doDice True
                }
            ]
        , contextual = doDice False
        }

    doDice :: Bool -> String -> Cmd Dice ()
    doDice printErrs text = do
        user <- showNick =<< getSender
        result <- io (rollEm text)
        case result of
            Left err    -> if printErrs
                then say (trimError err)
                else return ()
            Right str   ->
                say (limitStr 75 (user ++ ": " ++ str))

        where
            trimError = concat . intersperse ": " . tail . lines . show