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 +4/−8
- Network/IRC/Bot/Commands.hs +31/−0
- Network/IRC/Bot/Parsec.hs +9/−8
- Network/IRC/Bot/Part/Dice.hs +5/−4
- Network/IRC/Bot/Part/Hello.hs +6/−4
- ircbot.cabal +1/−1
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