module Network.IRC.Client.Types
( module Network.IRC.Client.Types
, Event(..)
, Source(..)
, Message(..)
) where
import Control.Applicative ((<$>))
import Control.Concurrent.STM (TVar, atomically, readTVar, newTVar, writeTVar)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.Trans.Reader (ReaderT, ask)
import Data.ByteString (ByteString)
import Data.Conduit (Consumer, Producer)
import Data.Conduit.TMChan (TBMChan)
import Data.Text (Text)
import Data.Time.Clock (NominalDiffTime)
import Network.IRC.Conduit (Event(..), Message(..), Source(..), IrcEvent, IrcMessage)
type UnicodeEvent = Event Text
type UnicodeSource = Source Text
type UnicodeMessage = Message Text
type IRC a = ReaderT IRCState IO a
data IRCState = IRCState { _connectionConfig :: ConnectionConfig
, _instanceConfig :: TVar InstanceConfig
}
newIRCState :: MonadIO m => ConnectionConfig -> InstanceConfig -> m IRCState
newIRCState cconf iconf = do
tvar <- liftIO . atomically . newTVar $ iconf
return IRCState
{ _connectionConfig = cconf
, _instanceConfig = tvar
}
ircState :: IRC IRCState
ircState = ask
getConnectionConfig :: IRCState -> ConnectionConfig
getConnectionConfig = _connectionConfig
getInstanceConfig :: IRCState -> TVar InstanceConfig
getInstanceConfig = _instanceConfig
getInstanceConfig' :: MonadIO m => IRCState -> m InstanceConfig
getInstanceConfig' = liftIO . atomically . readTVar . _instanceConfig
connectionConfig :: IRC ConnectionConfig
connectionConfig = _connectionConfig <$> ask
instanceConfigTVar :: IRC (TVar InstanceConfig)
instanceConfigTVar = _instanceConfig <$> ask
instanceConfig :: IRC InstanceConfig
instanceConfig = instanceConfigTVar >>= liftIO . atomically . readTVar
putInstanceConfig :: InstanceConfig -> IRC ()
putInstanceConfig iconf = instanceConfigTVar >>= liftIO . atomically . flip writeTVar iconf
data ConnectionConfig = ConnectionConfig
{ _func :: Int -> ByteString -> IO () -> Consumer (Either ByteString IrcEvent) IO () -> Producer IO IrcMessage -> IO ()
, _sendqueue :: TBMChan IrcMessage
, _server :: ByteString
, _port :: Int
, _flood :: NominalDiffTime
, _disconnect :: IRC ()
}
data InstanceConfig = InstanceConfig
{ _nick :: Text
, _username :: Text
, _realname :: Text
, _channels :: [Text]
, _ctcpVer :: Text
, _eventHandlers :: [EventHandler]
, _ignore :: [(Text, Maybe Text)]
}
data EventType
= EEverything
| ENothing
| EPrivmsg | ENotice | ECTCP | ENick | EJoin | EPart | EQuit | EMode | ETopic | EInvite | EKick | EPing | ENumeric
deriving (Eq, Show)
data EventHandler = EventHandler
{ _description :: Text
, _matchType :: EventType
, _eventFunc :: UnicodeEvent -> IRC ()
}
eventType :: Event a -> EventType
eventType e = case _message e of
(Privmsg _ Right{}) -> EPrivmsg
(Privmsg _ Left{}) -> ECTCP
(Notice _ Right{}) -> ENotice
(Notice _ Left{}) -> ECTCP
Nick{} -> ENick
Join{} -> EJoin
Part{} -> EPart
Quit{} -> EQuit
Mode{} -> EMode
Topic{} -> ETopic
Invite{} -> EInvite
Kick{} -> EKick
Ping{} -> EPing
Numeric{} -> ENumeric
_ -> EEverything