simpleirc-0.1.0: Network/SimpleIRC/Types.hs
{-# LANGUAGE DeriveDataTypeable #-}
module Network.SimpleIRC.Types
(
-- * Datatypes
IrcConfig(..)
, IrcServer(..)
, SIrcCommand(..)
, IrcEvent(..)
, EventFunc
, IrcMessage(..)
) where
import qualified Data.ByteString.Char8 as B
import Control.Concurrent (ThreadId)
import Control.Concurrent.Chan (Chan)
import System.IO (Handle)
import Data.Unique (Unique)
import Data.Map (Map)
import Data.Typeable
data IrcConfig = IrcConfig
{ cAddr :: String -- ^ Server address to connect to
, cPort :: Int -- ^ Server port to connect to
, cNick :: String -- ^ Nickname
, cUsername :: String -- ^ Username
, cRealname :: String -- ^ Realname
, cChannels :: [String] -- ^ List of channels to join on connect
, cEvents :: [IrcEvent] -- ^ Events to bind
, cCTCPVersion :: String -- ^ What to send on CTCP VERSION
, cCTCPTime :: IO String -- ^ What to send on CTCP TIME
}
data SIrcCommand =
SIrcAddEvent (Unique, IrcEvent)
| SIrcChangeEvents (Map Unique IrcEvent)
| SIrcRemoveEvent Unique
data IrcServer = IrcServer
{ sAddr :: B.ByteString
, sPort :: Int
, sNickname :: B.ByteString
, sUsername :: B.ByteString
, sRealname :: B.ByteString
, sChannels :: [B.ByteString]
, sEvents :: Map Unique IrcEvent
, sSock :: Maybe Handle
, sListenThread :: Maybe ThreadId
, sCmdChan :: Chan SIrcCommand
, sDebug :: Bool
-- Other info
, sCTCPVersion :: String
, sCTCPTime :: IO String
}
type EventFunc = (IrcServer -> IrcMessage -> IO ())
-- When adding events here, remember add them in callEvents and in eventFunc
-- AND also in the Show instance and Eq instance
data IrcEvent =
Privmsg EventFunc -- ^ PRIVMSG
| Numeric EventFunc -- ^ Numeric, 001, 002, 372 etc.
| Ping EventFunc -- ^ PING
| Join EventFunc -- ^ JOIN
| Part EventFunc -- ^ PART
| Mode EventFunc -- ^ MODE
| Topic EventFunc -- ^ TOPIC
| Invite EventFunc -- ^ INVITE
| Kick EventFunc -- ^ KICK
| Quit EventFunc -- ^ QUIT
| Nick EventFunc -- ^ NICK
| Notice EventFunc -- ^ NOTICE
| RawMsg EventFunc -- ^ This event gets called on every message received
| Disconnect (IrcServer -> IO ()) -- ^ This event gets called whenever the
-- connection with the server is dropped
instance Show IrcEvent where
show (Privmsg _) = "IrcEvent - Privmsg"
show (Numeric _) = "IrcEvent - Numeric"
show (Ping _) = "IrcEvent - Ping"
show (Join _) = "IrcEvent - Join"
show (Part _) = "IrcEvent - Part"
show (Mode _) = "IrcEvent - Mode"
show (Topic _) = "IrcEvent - Topic"
show (Invite _) = "IrcEvent - Invite"
show (Kick _) = "IrcEvent - Kick"
show (Quit _) = "IrcEvent - Quit"
show (Nick _) = "IrcEvent - Nick"
show (Notice _) = "IrcEvent - Notice"
show (RawMsg _) = "IrcEvent - RawMsg"
show (Disconnect _) = "IrcEvent - Disconnect"
data IrcMessage = IrcMessage
{ mNick :: Maybe B.ByteString
, mHost :: Maybe B.ByteString
, mServer :: Maybe B.ByteString
, mCode :: B.ByteString
, mMsg :: B.ByteString
, mChan :: Maybe B.ByteString
, mOther :: Maybe [B.ByteString]
, mRaw :: B.ByteString
} deriving (Show, Typeable)