ircbot 0.2.0 → 0.2.1
raw patch · 5 files changed
+65/−24 lines, 5 filesdep +containersdep +stm
Dependencies added: containers, stm
Files
- Network/IRC/Bot/BotMonad.hs +1/−1
- Network/IRC/Bot/Commands.hs +4/−4
- Network/IRC/Bot/Core.hs +17/−17
- Network/IRC/Bot/Types.hs +38/−0
- ircbot.cabal +5/−2
Network/IRC/Bot/BotMonad.hs view
@@ -36,7 +36,7 @@ , outChan :: Chan Message , logFn :: Logger , botName :: String- , cmdPrefix :: String+ , cmdPrefix :: String } newtype BotPartT m a = BotPartT { unBotPartT :: ReaderT BotEnv m a }
Network/IRC/Bot/Commands.hs view
@@ -31,9 +31,9 @@ data PrivMsg - = PrivMsg { prefix :: (Maybe Prefix) - , receivers :: [String] - , msg :: String+ = PrivMsg { prefix :: (Maybe Prefix) + , receivers :: [String] + , msg :: String } deriving (Eq, Read, Show) @@ -49,7 +49,7 @@ prefix = msg_prefix msg in case cmd of "PRIVMSG" -> Just $ PrivMsg prefix (init params) (last params)- _ -> Nothing+ _ -> Nothing class ToMessage a where toMessage :: a -> Message
Network/IRC/Bot/Core.hs view
@@ -32,25 +32,25 @@ data BotConf = BotConf { channelLogger :: (Maybe (Chan Message -> IO ())) -- ^ optional channel logging function- , logger :: Logger -- ^ app logging- , host :: HostName -- ^ irc server to connect - , port :: PortID -- ^ irc port to connect to (usually, 'PortNumber 6667')- , nick :: String -- ^ irc nick- , prefix :: String -- ^ command prefix- , user :: User -- ^ irc user info- , channels :: Set String -- ^ channel to join+ , logger :: Logger -- ^ app logging+ , host :: HostName -- ^ irc server to connect + , port :: PortID -- ^ irc port to connect to (usually, 'PortNumber 6667')+ , nick :: String -- ^ irc nick+ , commandPrefix :: String -- ^ command prefix+ , user :: User -- ^ irc user info+ , channels :: Set String -- ^ channel to join } nullBotConf :: BotConf nullBotConf = BotConf { channelLogger = Nothing- , logger = stdoutLogger Normal- , host = ""- , port = PortNumber 6667- , nick = ""- , prefix = "#"- , user = nullUser- , channels = empty+ , logger = stdoutLogger Normal+ , host = ""+ , port = PortNumber 6667+ , nick = ""+ , commandPrefix = "#"+ , user = nullUser+ , channels = empty } -- | connect to irc server and send NICK and USER commands@@ -66,12 +66,12 @@ runBotPartT botPart (BotEnv msg outgoingChan logger botName prefix) ircLoop :: Logger -> String -> String -> Chan Message -> Chan Message -> [BotPartT IO ()] -> IO [ThreadId]-ircLoop logger botName cmdPrefix incomingChan outgoingChan parts = +ircLoop logger botName prefix incomingChan outgoingChan parts = mapM forkPart parts where forkPart botPart = do inChan <- dupChan incomingChan- forkIO $ partLoop logger botName cmdPrefix inChan outgoingChan (botPart `mplus` return ())+ forkIO $ partLoop logger botName prefix inChan outgoingChan (botPart `mplus` return ()) -- reconnect loop is still a bit buggy -- if you try to write multiple lines, and the all fail, reconnect will be called multiple times..@@ -137,7 +137,7 @@ -> [BotPartT IO ()] -- ^ bot parts (must include 'pingPart', or equivalent) -> IO [ThreadId] -- ^ 'ThreadId' for all forked handler threads simpleBot BotConf{..} parts =- simpleBot' channelLogger logger host port nick prefix user parts+ simpleBot' channelLogger logger host port nick commandPrefix user parts -- |simpleBot' connects to the server and handles messages using the supplied BotPartTs --
+ Network/IRC/Bot/Types.hs view
@@ -0,0 +1,38 @@+{-# LANGUAGE DeriveDataTypeable, RecordWildCards #-}+module Network.IRC.Bot.Types+ ( User(..)+ , nullUser+ ) where++import Control.Concurrent (ThreadId, forkIO, threadDelay)+import Control.Concurrent.Chan (Chan, dupChan, newChan, readChan, writeChan)+import Control.Concurrent.MVar (MVar, modifyMVar_, newMVar, readMVar)+import Control.Concurrent.QSem (QSem, newQSem, waitQSem, signalQSem)+import Control.Exception (IOException, catch)+import Control.Monad (mplus, forever, when)+import Control.Monad.Trans (liftIO)+import Data.Data (Data, Typeable)+import Data.Time (UTCTime, addUTCTime, getCurrentTime)+import Network (HostName, PortID(PortNumber), connectTo)+import Network.IRC (Message, decode, encode, joinChan, nick, user)+import Network.IRC as I+import Network.IRC.Bot.Log (Logger, LogLevel(Normal, Debug), stdoutLogger)+import Network.IRC.Bot.BotMonad (BotMonad(logM), BotPartT, BotEnv(..), runBotPartT)+import Prelude hiding (catch)+import System.IO (BufferMode(LineBuffering), Handle, hClose, hGetLine, hPutStrLn, hSetBuffering)+++data User = User+ { username :: String -- ^ username on client system+ , hostname :: HostName -- ^ hostname of client system+ , servername :: HostName -- ^ irc server client is connected to+ , realname :: String -- ^ client's real name+ }+ deriving (Data, Typeable, Eq, Ord, Read, Show)++nullUser :: User+nullUser = User { username = ""+ , hostname = "."+ , servername = "."+ , realname = ""+ }
ircbot.cabal view
@@ -1,5 +1,5 @@ Name: ircbot-Version: 0.2.0+Version: 0.2.1 Synopsis: A library for writing irc bots Homepage: http://patch-tag.com/r/stepcut/ircbot License: BSD3@@ -26,8 +26,10 @@ Network.IRC.Bot.Part.NickUser Network.IRC.Bot.Parsec Network.IRC.Bot.PosixLogger+ Network.IRC.Bot.Types Build-depends: base >= 4 && <5,+ containers == 0.4.*, filepath >= 1.2 && < 1.4, irc == 0.5.*, mtl == 2.0.*,@@ -36,7 +38,8 @@ parsec == 3.1.*, time == 1.4.*, unix >= 2.4 && < 2.6,- random == 1.0.*+ random == 1.0.*,+ stm == 2.2.* -- Modules not exported by this package. -- Other-modules: