ircbot 0.6.5.3 → 0.6.6
raw patch · 5 files changed
+40/−26 lines, 5 filesdep ~containersdep ~networkdep ~stmPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: containers, network, stm
API changes (from Hackage documentation)
+ Network.IRC.Bot.Commands: Notice :: Maybe Prefix -> [ByteString] -> ByteString -> Notice
+ Network.IRC.Bot.Commands: [noticeMsg] :: Notice -> ByteString
+ Network.IRC.Bot.Commands: [noticePrefix] :: Notice -> Maybe Prefix
+ Network.IRC.Bot.Commands: [noticeReceivers] :: Notice -> [ByteString]
+ Network.IRC.Bot.Commands: data Notice
+ Network.IRC.Bot.Commands: instance GHC.Classes.Eq Network.IRC.Bot.Commands.Notice
+ Network.IRC.Bot.Commands: instance GHC.Read.Read Network.IRC.Bot.Commands.Notice
+ Network.IRC.Bot.Commands: instance GHC.Show.Show Network.IRC.Bot.Commands.Notice
+ Network.IRC.Bot.Commands: instance Network.IRC.Bot.Commands.ToMessage Network.IRC.Bot.Commands.Notice
- Network.IRC.Bot.BotMonad: maybeZero :: (MonadPlus m) => Maybe a -> m a
+ Network.IRC.Bot.BotMonad: maybeZero :: MonadPlus m => Maybe a -> m a
- Network.IRC.Bot.Commands: PrivMsg :: (Maybe Prefix) -> [ByteString] -> ByteString -> PrivMsg
+ Network.IRC.Bot.Commands: PrivMsg :: Maybe Prefix -> [ByteString] -> ByteString -> PrivMsg
- Network.IRC.Bot.Commands: [prefix] :: PrivMsg -> (Maybe Prefix)
+ Network.IRC.Bot.Commands: [prefix] :: PrivMsg -> Maybe Prefix
- Network.IRC.Bot.Commands: askSenderNickName :: (BotMonad m) => m (Maybe ByteString)
+ Network.IRC.Bot.Commands: askSenderNickName :: BotMonad m => m (Maybe ByteString)
- Network.IRC.Bot.Commands: replyTo :: (BotMonad m) => m (Maybe ByteString)
+ Network.IRC.Bot.Commands: replyTo :: BotMonad m => m (Maybe ByteString)
- Network.IRC.Bot.Core: BotConf :: (Maybe (Chan Message -> IO ())) -> Logger -> HostName -> PortID -> ByteString -> String -> User -> Set ByteString -> Maybe (Int, Int) -> BotConf
+ Network.IRC.Bot.Core: BotConf :: Maybe (Chan Message -> IO ()) -> Logger -> HostName -> PortNumber -> ByteString -> String -> User -> Set ByteString -> Maybe (Int, Int) -> BotConf
- Network.IRC.Bot.Core: [channelLogger] :: BotConf -> (Maybe (Chan Message -> IO ()))
+ Network.IRC.Bot.Core: [channelLogger] :: BotConf -> Maybe (Chan Message -> IO ())
- Network.IRC.Bot.Core: [port] :: BotConf -> PortID
+ Network.IRC.Bot.Core: [port] :: BotConf -> PortNumber
- Network.IRC.Bot.Core: simpleBot' :: (Maybe (Chan Message -> IO ())) -> Logger -> Maybe (Int, Int) -> HostName -> PortID -> ByteString -> String -> User -> [BotPartT IO ()] -> IO ([ThreadId], IO ())
+ Network.IRC.Bot.Core: simpleBot' :: Maybe (Chan Message -> IO ()) -> Logger -> Maybe (Int, Int) -> HostName -> PortNumber -> ByteString -> String -> User -> [BotPartT IO ()] -> IO ([ThreadId], IO ())
- Network.IRC.Bot.Parsec: botPrefix :: (BotMonad m) => ParsecT ByteString () m ()
+ Network.IRC.Bot.Parsec: botPrefix :: BotMonad m => ParsecT ByteString () m ()
- Network.IRC.Bot.Parsec: nat :: (Monad m) => ParsecT ByteString () m Integer
+ Network.IRC.Bot.Parsec: nat :: Monad m => ParsecT ByteString () m Integer
- Network.IRC.Bot.Parsec: parsecPart :: (BotMonad m) => (ParsecT ByteString () m a) -> m a
+ Network.IRC.Bot.Parsec: parsecPart :: BotMonad m => ParsecT ByteString () m a -> m a
- Network.IRC.Bot.Parsec: reportError :: (BotMonad m) => ByteString -> ParseError -> m ()
+ Network.IRC.Bot.Parsec: reportError :: BotMonad m => ByteString -> ParseError -> m ()
- Network.IRC.Bot.Part.Channels: channelsPart :: (BotMonad m) => TVar (Set ByteString) -> m ()
+ Network.IRC.Bot.Part.Channels: channelsPart :: BotMonad m => TVar (Set ByteString) -> m ()
- Network.IRC.Bot.Part.Channels: initChannelsPart :: (BotMonad m) => Set ByteString -> IO (TVar (Set ByteString), m ())
+ Network.IRC.Bot.Part.Channels: initChannelsPart :: BotMonad m => Set ByteString -> IO (TVar (Set ByteString), m ())
- Network.IRC.Bot.Part.Channels: joinChannel :: (BotMonad m) => ByteString -> TVar (Set ByteString) -> m ()
+ Network.IRC.Bot.Part.Channels: joinChannel :: BotMonad m => ByteString -> TVar (Set ByteString) -> m ()
- Network.IRC.Bot.Part.Dice: diceCommand :: (BotMonad m) => ParsecT ByteString () m ()
+ Network.IRC.Bot.Part.Dice: diceCommand :: BotMonad m => ParsecT ByteString () m ()
- Network.IRC.Bot.Part.Dice: dicePart :: (BotMonad m) => m ()
+ Network.IRC.Bot.Part.Dice: dicePart :: BotMonad m => m ()
- Network.IRC.Bot.Part.Hello: helloCommand :: (BotMonad m) => ParsecT ByteString () m ()
+ Network.IRC.Bot.Part.Hello: helloCommand :: BotMonad m => ParsecT ByteString () m ()
- Network.IRC.Bot.Part.Hello: helloPart :: (BotMonad m) => m ()
+ Network.IRC.Bot.Part.Hello: helloPart :: BotMonad m => m ()
- Network.IRC.Bot.Part.NickUser: changeNickUser :: (BotMonad m) => ByteString -> Maybe User -> m ()
+ Network.IRC.Bot.Part.NickUser: changeNickUser :: BotMonad m => ByteString -> Maybe User -> m ()
- Network.IRC.Bot.Part.NickUser: nickUserPart :: (BotMonad m) => m ()
+ Network.IRC.Bot.Part.NickUser: nickUserPart :: BotMonad m => m ()
- Network.IRC.Bot.Part.Ping: pingPart :: (BotMonad m) => m ()
+ Network.IRC.Bot.Part.Ping: pingPart :: BotMonad m => m ()
Files
- Network/IRC/Bot/Commands.hs +10/−1
- Network/IRC/Bot/Core.hs +19/−14
- Network/IRC/Bot/Types.hs +1/−1
- demo.hs +2/−2
- ircbot.cabal +8/−8
Network/IRC/Bot/Commands.hs view
@@ -8,7 +8,7 @@ import Data.Data import Data.List (isPrefixOf) import Data.Monoid ((<>))-import Network (PortID(PortNumber))+import Network.Socket (PortNumber) import Network.IRC import Network.IRC.Bot.BotMonad @@ -73,6 +73,15 @@ instance ToMessage PrivMsg where toMessage (PrivMsg prefix receivers msg) = Message prefix "PRIVMSG" (receivers <> [msg]) +data Notice+ = Notice { noticePrefix :: (Maybe Prefix)+ , noticeReceivers :: [ByteString]+ , noticeMsg :: ByteString+ }+ deriving (Eq, Read, Show)++instance ToMessage Notice where+ toMessage (Notice prefix receivers msg) = Message prefix "NOTICE" (receivers <> [msg]) -- | get the nickname of the user who sent the message askSenderNickName :: (BotMonad m) => m (Maybe ByteString)
Network/IRC/Bot/Core.hs view
@@ -22,7 +22,7 @@ import Data.Set (Set, empty) import Data.Time (UTCTime, addUTCTime, getCurrentTime) import GHC.IO.Handle (hFlushAll)-import Network (HostName, PortID(PortNumber), connectTo)+import Network.Socket hiding (Debug) import Network.IRC (Message, decode, encode, joinChan, nick, showMessage, user) import Network.IRC as I import Network.IRC.Bot.Types (User(..), nullUser)@@ -33,7 +33,7 @@ import Prelude hiding (catch) import Control.Concurrent.SSem (SSem) import qualified Control.Concurrent.SSem as SSem-import System.IO (BufferMode(NoBuffering, LineBuffering), Handle, hClose, hGetLine, hPutChar, hSetBuffering)+import System.IO (BufferMode(NoBuffering, LineBuffering), Handle, hClose, hGetLine, hPutChar, hSetBuffering, IOMode(..)) -- |Bot configuration data BotConf =@@ -41,7 +41,7 @@ { 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')+ , port :: PortNumber -- ^ irc port to connect to (usually, 'PortNumber 6667') , nick :: ByteString -- ^ irc nick , commandPrefix :: String -- ^ command prefix , user :: User -- ^ irc user info@@ -54,7 +54,7 @@ BotConf { channelLogger = Nothing , logger = stdoutLogger Normal , host = ""- , port = PortNumber 6667+ , port = 6667 , nick = "" , commandPrefix = "#" , user = nullUser@@ -64,15 +64,20 @@ -- | connect to irc server and send NICK and USER commands ircConnect :: HostName- -> PortID+ -> PortNumber -> ByteString -> User -> IO Handle-ircConnect host port n u =- do h <- connectTo host port- hSetBuffering h LineBuffering- return h+ircConnect host port n u = do+ addr <- head <$> getAddrInfo Nothing (Just host) (Just $ show port)+ print addr+ sock <- socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)+ connect sock $ addrAddress addr + h <- socketToHandle sock ReadWriteMode+ hSetBuffering h LineBuffering+ return h+ partLoop :: Logger -> ByteString -> String -> Chan Message -> Chan Message -> (BotPartT IO ()) -> IO () partLoop logger botName prefix incomingChan outgoingChan botPart = forever $ do msg <- readChan incomingChan@@ -89,7 +94,7 @@ -- reconnect loop is still a bit buggy -- if you try to write multiple lines, and the all fail, reconnect will be called multiple times.. -- something should be done so that this does not happen-connectionLoop :: Logger -> Maybe (Int, Int) -> TMVar UTCTime -> HostName -> PortID -> ByteString -> User -> Chan Message -> Chan Message -> Maybe (Chan Message) -> SSem -> IO (ThreadId, ThreadId, Maybe ThreadId, IO ())+connectionLoop :: Logger -> Maybe (Int, Int) -> TMVar UTCTime -> HostName -> PortNumber -> ByteString -> User -> Chan Message -> Chan Message -> Maybe (Chan Message) -> SSem -> IO (ThreadId, ThreadId, Maybe ThreadId, IO ()) connectionLoop logger mLimitConf tmv host port nick user outgoingChan incomingChan logChan connSSem = do hTMVar <- atomically $ newTMVar (undefined :: Handle) (limit, limitTid) <-@@ -133,7 +138,7 @@ ircConnectLoop :: (LogLevel -> ByteString -> IO a) -- ^ logging -> HostName- -> PortID+ -> PortNumber -> ByteString -> User -> IO Handle@@ -144,7 +149,7 @@ threadDelay (60 * 10^6) ircConnectLoop logger host port nick user) -doConnect :: (LogLevel -> ByteString -> IO a) -> HostName -> PortID -> ByteString -> User -> TMVar Handle -> SSem -> IO ()+doConnect :: (LogLevel -> ByteString -> IO a) -> HostName -> PortNumber -> ByteString -> User -> TMVar Handle -> SSem -> IO () doConnect logger host port nick user hTMVar connSSem = do logger Normal $ "Connecting to " <> (C.pack host) <> " as " <> nick h <- ircConnectLoop logger host port nick user@@ -153,7 +158,7 @@ SSem.signal connSSem return () -reconnect :: Logger -> HostName -> PortID -> ByteString -> User -> TMVar Handle -> SSem -> IOException -> IO ()+reconnect :: Logger -> HostName -> PortNumber -> ByteString -> User -> TMVar Handle -> SSem -> IOException -> IO () reconnect logger host port nick user hTMVar connSSem e = do logger Normal $ "IRC Connection died: " <> C.pack (show e) {-@@ -190,7 +195,7 @@ -> Logger -- ^ application logging -> Maybe (Int, Int) -- ^ rate limiter settings (burst length, delay in microseconds) -> HostName -- ^ irc server to connect- -> PortID -- ^ irc port to connect to (usually, 'PortNumber 6667')+ -> PortNumber -- ^ irc port to connect to (usually, '6667') -> ByteString -- ^ irc nick -> String -- ^ command prefix -> User -- ^ irc user info
Network/IRC/Bot/Types.hs view
@@ -7,7 +7,7 @@ import Data.ByteString (ByteString) import Data.Data (Data, Typeable) import Network.IRC as I-import Network (HostName)+import Network.Socket (HostName) data User = User { username :: ByteString -- ^ username on client system
demo.hs view
@@ -6,7 +6,7 @@ import Data.ByteString (ByteString) import qualified Data.ByteString.Char8 as C import Data.Set (Set, insert)-import Network (HostName, PortID(PortNumber), connectTo)+import Network.Socket hiding (Debug) import Network.IRC (Message) import Network.IRC.Bot.BotMonad (BotMonad(..)) import Network.IRC.Bot.Core (BotConf(..), User(..), nullBotConf, simpleBot)@@ -39,7 +39,7 @@ ] where setIrcServer n = BotConfOpt $ \c -> c { host = n, user = (user c) { servername = n } }- setPort str = BotConfOpt $ \c -> c { port = PortNumber (fromIntegral $ read str) }+ setPort str = BotConfOpt $ \c -> c { port = (fromIntegral $ read str) } setNick n = BotConfOpt $ \c -> c { nick = C.pack n } setUsername n = BotConfOpt $ \c -> c { user = (user c) { username = C.pack n } } setHostname n = BotConfOpt $ \c -> c { user = (user c) { hostname = n } }
ircbot.cabal view
@@ -1,5 +1,5 @@ Name: ircbot-Version: 0.6.5.3+Version: 0.6.6 Synopsis: A library for writing IRC bots Description: A simple library for an IRC bot License: BSD3@@ -12,7 +12,7 @@ Build-type: Simple Cabal-version: >=1.10 Homepage: https://github.com/stepcut/ircbot-tested-with: GHC == 7.6.3, GHC == 7.8.4, GHC == 7.10.2, GHC==8.0.2+tested-with: GHC == 7.10.2, GHC==8.0.2, GHC==8.6.5, GHC==8.8.3, GHC==8.10.1 source-repository head type: git@@ -39,17 +39,17 @@ Build-depends: base >= 4 && <5, bytestring >= 0.10 && < 0.11,- containers >= 0.4 && < 0.6,+ containers >= 0.4 && < 0.7, directory < 1.4, filepath >= 1.2 && < 1.5, irc == 0.6.*, mtl >= 2.0 && < 2.3,- network >= 2.3 && < 2.7,+ network >= 3.1 && < 3.2, parsec == 3.1.*, time >= 1.5 && < 1.10, unix >= 2.4 && < 2.8, random >= 1.0 && < 1.2,- stm >= 2.2 && < 2.5,+ stm >= 2.2 && < 2.6, SafeSemaphore >= 0.10 && < 0.11 Executable demo@@ -57,17 +57,17 @@ ghc-options: -threaded -rtsopts -with-rtsopts=-N build-depends: base >= 4 && <5, bytestring >= 0.10 && < 0.11,- containers >= 0.4 && < 0.6,+ containers >= 0.4 && < 0.7, directory < 1.4, filepath >= 1.2 && < 1.5, irc == 0.6.*, mtl >= 2.0 && < 2.3,- network >= 2.3 && < 2.7,+ network >= 3.1 && < 3.2, parsec == 3.1.*, time >= 1.5 && < 1.10, unix >= 2.4 && < 2.8, random >= 1.0 && < 1.2,- stm >= 2.2 && < 2.5,+ stm >= 2.2 && < 2.6, SafeSemaphore >= 0.10 && < 0.11 other-modules: Network.IRC.Bot