packages feed

ircbot 0.2.3 → 0.3.0

raw patch · 6 files changed

+56/−25 lines, 6 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Network.IRC.Bot.BotMonad: askSenderNickName :: BotMonad m => m (Maybe String)
+ Network.IRC.Bot.BotMonad: maybeZero :: MonadPlus m => Maybe a -> m a
+ Network.IRC.Bot.Commands: askReceiver :: (Alternative m, BotMonad m) => m (Maybe String)
+ Network.IRC.Bot.Commands: askSenderNickName :: BotMonad m => m (Maybe String)
+ Network.IRC.Bot.Commands: replyTo :: BotMonad m => m (Maybe String)
- Network.IRC.Bot.Parsec: parsecPart :: BotMonad m => (String -> ParsecT String () m a) -> m a
+ Network.IRC.Bot.Parsec: parsecPart :: BotMonad m => (ParsecT String () m a) -> m a
- Network.IRC.Bot.Part.Dice: diceCommand :: BotMonad m => String -> ParsecT String () m ()
+ Network.IRC.Bot.Part.Dice: diceCommand :: BotMonad m => ParsecT String () m ()
- Network.IRC.Bot.Part.Hello: helloCommand :: BotMonad m => String -> ParsecT String () m ()
+ Network.IRC.Bot.Part.Hello: helloCommand :: BotMonad m => ParsecT String () m ()

Files

Network/IRC/Bot/BotMonad.hs view
@@ -5,7 +5,7 @@     , BotEnv(..)     , runBotPartT     , mapBotPartT-    , askSenderNickName+    , maybeZero     ) where  import Control.Applicative (Applicative, Alternative, (<$>))@@ -69,10 +69,6 @@                   liftIO $ l lvl msg   whoami       =  BotPartT $ botName <$> ask --- | get the nickname of the user who sent the message-askSenderNickName :: (BotMonad m) => m (Maybe String)-askSenderNickName =-    do msg <- askMessage-       case msg_prefix msg of-         (Just (NickName nick _ _)) -> return (Just nick)-         _ -> return Nothing+maybeZero :: (MonadPlus m) => Maybe a -> m a+maybeZero Nothing = mzero+maybeZero (Just a) = return a
Network/IRC/Bot/Commands.hs view
@@ -4,6 +4,7 @@ import Control.Applicative import Control.Monad import Data.Data+import Data.List (isPrefixOf) import Network (HostName, PortID(PortNumber)) import Network.IRC import Network.IRC.Bot.BotMonad@@ -66,4 +67,34 @@  instance ToMessage PrivMsg where     toMessage (PrivMsg prefix receivers msg) = Message prefix "PRIVMSG" (receivers ++ [msg])+++-- | get the nickname of the user who sent the message+askSenderNickName :: (BotMonad m) => m (Maybe String)+askSenderNickName =+    do msg <- askMessage+       case msg_prefix msg of+         (Just (NickName nick _ _)) -> return (Just nick)+         _ -> return Nothing++-- | figure out who to reply to for a given `Message`+-- +-- If message was sent to a #channel reply to the channel. Otherwise reply to the sender.+replyTo :: (BotMonad m) => m (Maybe String)+replyTo =+    do priv <- privMsg+       let receiver = head (receivers priv)+       if ("#" `isPrefixOf` receiver)+          then return (Just receiver)+          else askSenderNickName++-- | returns the receiver of a message+-- +-- if multiple receivers, it returns only the first+askReceiver :: (Alternative m, BotMonad m) => m (Maybe String)+askReceiver =+    do priv <- privMsg+       return (Just (head $ receivers priv))+    <|>+    do return Nothing 
Network/IRC/Bot/Parsec.hs view
@@ -35,7 +35,8 @@ import Control.Monad.Reader (MonadReader, ask) import Control.Monad.Trans import Data.Char (digitToInt)-import Data.List (intercalate, nub)+import Data.List (intercalate, isPrefixOf, nub)+import Data.Maybe (fromMaybe) import Network.IRC.Bot.Log import Network.IRC.Bot.BotMonad import Network.IRC.Bot.Commands@@ -64,11 +65,11 @@ -- | parser that checks for the 'cmdPrefix' (from the 'BotEnv') botPrefix :: (BotMonad m) => ParsecT String () m () botPrefix =-    (try $ do str <- cmdPrefix <$> askBotEnv-              string str-              return ())-      <|>-       lift mzero+    do recv <- fromMaybe "" <$> askReceiver+       pref <- cmdPrefix <$> askBotEnv+       if "#" `isPrefixOf` recv+          then (try $ string pref >> return ()) <|> lift mzero+          else (try $ string pref >> return ()) <|> return ()  -- | create a bot part by using Parsec to parse the command --@@ -80,12 +81,12 @@ -- -- see 'dicePart' for an example usage. parsecPart :: (BotMonad m) =>-              (String -> ParsecT String () m a) +              (ParsecT String () m a)             -> m a parsecPart p =      do priv <- privMsg         logM Debug $ "I got a message: " ++ msg priv ++ " sent to " ++ show (receivers priv)-       ma <- runParserT (p $ head (receivers priv)) () (msg priv) (msg priv)+       ma <- runParserT p () (msg priv) (msg priv)        case ma of          (Left e) ->               do logM Debug $ "Parse error: " ++ show e
Network/IRC/Bot/Part/Dice.hs view
@@ -3,8 +3,8 @@ import Control.Monad            (replicateM) import Control.Monad.Trans      (liftIO) import Network.IRC.Bot.Log      (LogLevel(Debug))-import Network.IRC.Bot.BotMonad (BotMonad(..))-import Network.IRC.Bot.Commands (PrivMsg(..), sendCommand)+import Network.IRC.Bot.BotMonad (BotMonad(..), maybeZero)+import Network.IRC.Bot.Commands (PrivMsg(..), sendCommand, replyTo) import Network.IRC.Bot.Parsec   (botPrefix, nat, parsecPart) import System.Random            (randomRIO) import Text.Parsec              (ParsecT, (<|>), (<?>), char, skipMany1, space, string, try)@@ -12,10 +12,11 @@ dicePart :: (BotMonad m) => m () dicePart = parsecPart diceCommand -diceCommand :: (BotMonad m) => String -> ParsecT String () m ()-diceCommand target =+diceCommand :: (BotMonad m) => ParsecT String () m ()+diceCommand =     do try $ botPrefix >> string "dice"        logM Debug "dicePart"+       target <- maybeZero =<< replyTo        (numDice, numSides, modifier) <- (do           skipMany1 space          nd <- nat <|> return 1
Network/IRC/Bot/Part/Hello.hs view
@@ -3,8 +3,8 @@ import Control.Monad.Trans      (liftIO) import Data.Maybe               (fromMaybe) import Network.IRC.Bot.Log      (LogLevel(Debug))-import Network.IRC.Bot.BotMonad (BotMonad(..), askSenderNickName)-import Network.IRC.Bot.Commands (PrivMsg(..), sendCommand)+import Network.IRC.Bot.BotMonad (BotMonad(..), maybeZero)+import Network.IRC.Bot.Commands (PrivMsg(..),askSenderNickName, replyTo, sendCommand) import Network.IRC.Bot.Parsec   (botPrefix, parsecPart) import System.Random            (randomRIO) import Text.Parsec              (ParsecT, (<|>), string, try)@@ -12,10 +12,12 @@ helloPart :: (BotMonad m) => m () helloPart = parsecPart helloCommand -helloCommand :: (BotMonad m) => String -> ParsecT String () m ()-helloCommand target =+helloCommand :: (BotMonad m) => ParsecT String () m ()+helloCommand =     do try $ botPrefix >> string "hello"        logM Debug "helloPart"+       target <- maybeZero =<< replyTo+       logM Debug $ "target: " ++ target        mNick <- askSenderNickName        let greetings = ["Hello", "Howdy", "Greetings", "Word up"]        n <- liftIO $ randomRIO (0, length greetings - 1)
ircbot.cabal view
@@ -1,5 +1,5 @@ Name:                ircbot-Version:             0.2.3+Version:             0.3.0 Synopsis:            A library for writing irc bots Homepage:            http://patch-tag.com/r/stepcut/ircbot License:             BSD3