packages feed

esotericbot-0.0.1: Esotericbot/Help.hs

{-# OPTIONS -fglasgow-exts #-}
module Esotericbot.Help where

import Data.Attoparsec as A
import Data.List.Stream as L
import Data.ByteString.Lazy.Char8 as BS

import Control.Monad.State

import Esotericbot.EBTypes
import Esotericbot.BSUtils
import Esotericbot.BSH
import Esotericbot.IRCCom

data BSHit =
   forall bs . BSHAble bs => BSHit bs

instance BSHAble BSHit where
   send ( BSHit bs ) =
      send bs

get_help h cmds = do
   let cmd = irc_cmd cmds
   sb <- get
   if null_cmd cmd
      then do 
         avo <- liftIO $ ls2bs 45 "Try 'help' followed by one of the following: "#
         priv_msg h cmds $ avo `hAppend` 
                                  L.intersperse ( BSHit ' ' ) 
                                                ( L.map ( \ l -> 
                                                           BSHit $ prefix l `hAppend` -- this wonky code looks similar to a 'contrived' example of syntax in the Haskell 98 report
                                                                               '/' `hAppend` 
                                                                                      name l 
                                                        )
                                                        $ plugins sb )
         maybe ( return ( ) )
               ( \ _ -> do
                  chan_help <- liftIO $ ls2bs 128 "If you are an operator for this channel, you can also use the commands 'op enable' and 'op disable' to enable or disable the bot."#
                  priv_msg h cmds chan_help
               ) $ irc_chan cmds
      else do
         either ( const $ do un <- liftIO $ ls2bs 22 "Unrecognized command: "#
                             priv_msg h cmds $ un `hAppend` cmd
                )
                id
                $ snd $ parse ( get_lang_help h cmds $ plugins sb ) cmd

null_cmd =
   BS.all (==' ')
 
get_lang_help h cmds ls = do
   spaces 
   choices $ L.map ( \ l -> do 
                      let p = prefix l
                      string p
                      return $ do
                          u <- liftIO $ ls2bs 7 "Usage: "#
                          let un = u `hAppend` name l
                          maybe ( priv_msg h cmds $ un `hAppend` p )
                                ( \ is -> do
                                   input <- liftIO $ ls2bs 7 " INPUT "#
                                   open <- liftIO $ ls2bs 2 "[ "#
                                   priv_msg h cmds $ un `hAppend` p `hAppend` ' ' `hAppend` open `hAppend` is `hAppend` input `hAppend` ']'
                                )
                                $ input_seperator l
                   ) ls