lambdabot-4.0: Plugin/Quote.hs
--
-- | Support for quotes
--
module Plugin.Quote (theModule) where
import Plugin.Quote.Fortune (randFortune)
import Plugin.Quote.Text
import Plugin
import qualified Data.Map as M
import qualified Data.ByteString.Char8 as P
PLUGIN Quote
type Quotes = M.Map P.ByteString [P.ByteString]
instance Module QuoteModule Quotes where
moduleCmds _ = ["quote", "remember", "ghc", "fortune"
,"yow","arr","keal","b52s","brain","palomer"
,"girl19", "v", "yhjulwwiefzojcbxybbruweejw"]
moduleHelp _ "fortune" = "fortune. Provide a random fortune"
moduleHelp _ "yow" = "yow. The zippy man."
moduleHelp _ "arr" = "arr. Talk to a pirate"
moduleHelp _ "keal" = "keal. Talk like Keal"
moduleHelp _ "ghc" = "ghc. Choice quotes from GHC."
moduleHelp _ "b52s" = "b52s. Anyone noticed the b52s sound a lot like zippy?"
moduleHelp _ "brain" = "brain. Pinky and the Brain"
moduleHelp _ "palomer" = "palomer. Sound a bit like palomer on a good day."
moduleHelp _ "girl19" = "girl19 wonders what \"discriminating hackers\" are."
moduleHelp _ "v" = "let v = show v in v"
moduleHelp _ "yhjulwwiefzojcbxybbruweejw"
= "V RETURNS!"
moduleHelp _ _ = help -- required
moduleSerialize _ = Just mapListPackedSerial
moduleDefState _ = return M.empty
process_ _ cmd s = case cmd of
"remember" -> runRemember (dropSpace s)
"quote" -> runQuote (dropSpace s)
"ghc" -> runQuote "ghc"
"fortune" -> return `fmap` io (randFortune Nothing)
"yow" -> return `fmap` io (randFortune (Just "zippy"))
"keal" -> return `fmap` io (randomElem kealList)
"arr" -> return `fmap` io (randomElem arrList)
"b52s" -> return `fmap` io (randomElem b52s)
"brain" -> return `fmap` io (randomElem brain)
"palomer" -> return `fmap` io (randomElem palomer)
"girl19" -> return `fmap` io (randomElem girl19)
"v" -> return `fmap` io (randomElem notoriousV)
"yhjulwwiefzojcbxybbruweejw"
-> return `fmap` io (randomElem notoriousV)
help :: String
help = "quote <nick>\nremember <nick> <quote>\n" ++
"Quote somebody, a random person, or save a memorable quote"
------------------------------------------------------------------------
-- the @remember command stores away a quotation by a user, for future
-- use by @quote
-- error handling!
runRemember :: String -> ModuleLB Quotes
runRemember str = do
case break (== ' ') str of
(_,[]) -> return ["Incorrect arguments to quote"]
(nm,q') -> do let q = tail q'
withMS $ \fm writer -> do
let ss = fromMaybe [] (M.lookup (P.pack nm) fm)
fm' = M.insert (P.pack nm) (P.pack q : ss) fm
writer fm'
return ["Done."]
--
-- the @quote command, takes a user nm to choose a random quote from
--
runQuote :: String -> ModuleLB Quotes
runQuote name' = do
fm <- readMS
if M.null fm then return ["No quotes yet."] else do
let pnm = P.pack name'
qs' = M.lookup pnm fm
(nm,qs) <- if not (P.null pnm)
then return (pnm,qs') -- (ByteString, Maybe [ByteString])
else do (nm',rs') <- io $ randomElem (M.toList fm) -- random person
return (nm', Just rs')
case qs of
Nothing -> return [P.unpack nm ++ " hasn't said anything memorable"]
Just msgs -> do msg <- io $ randomElem msgs
return $ if not (P.null pnm)
then [" " ++ (P.unpack msg)]
else [(P.unpack nm)++" says: " ++ (P.unpack msg)]