module Network.IRC.Client
(
connect
, connectWithTLS
, connectWithTLSConfig
, connectWithTLSVerify
, start
, start'
, startStateful
, Origin (..)
, connect'
, connectWithTLS'
, connectWithTLSConfig'
, connectWithTLSVerify'
, stdoutLogger
, fileLogger
, noopLogger
, send
, sendBS
, disconnect
, defaultIRCConf
, defaultOnConnect
, defaultOnDisconnect
, defaultEventHandlers
, module Network.IRC.Client.Types
, module Network.IRC.Client.Utils
, C.rawMessage
, C.toByteString
) where
import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.Trans.Reader (runReaderT)
import Data.ByteString (ByteString)
import qualified Data.Conduit.Network.TLS as TLS
import Data.Text (Text)
import Data.Time.Clock (NominalDiffTime)
import qualified Data.X509 as X
import qualified Data.X509.CertificateStore as X
import qualified Data.X509.Validation as X
import qualified Network.Connection as TLS (TLSSettings(..))
import Network.IRC.Client.Handlers
import Network.IRC.Client.Internal
import Network.IRC.Client.Types
import Network.IRC.Client.Utils
import qualified Network.IRC.Conduit as C
import qualified Network.TLS as TLS
connect :: MonadIO m
=> ByteString
-> Int
-> NominalDiffTime
-> m (ConnectionConfig s)
connect = connect' noopLogger
connectWithTLS :: MonadIO m
=> ByteString
-> Int
-> NominalDiffTime
-> m (ConnectionConfig s)
connectWithTLS = connectWithTLS' noopLogger
connectWithTLSConfig :: MonadIO m
=> TLS.TLSClientConfig
-> NominalDiffTime
-> m (ConnectionConfig s)
connectWithTLSConfig = connectWithTLSConfig' noopLogger
connectWithTLSVerify :: MonadIO m
=> (X.CertificateStore -> TLS.ValidationCache -> X.ServiceID -> X.CertificateChain -> IO [X.FailedReason])
-> ByteString
-> Int
-> NominalDiffTime
-> m (ConnectionConfig s)
connectWithTLSVerify = connectWithTLSVerify' noopLogger
connect' :: MonadIO m
=> (Origin -> ByteString -> IO ())
-> ByteString
-> Int
-> NominalDiffTime
-> m (ConnectionConfig s)
connect' lg host port =
connectInternal (C.ircClient port host) defaultOnConnect defaultOnDisconnect lg host port
connectWithTLS' :: MonadIO m
=> (Origin -> ByteString -> IO ())
-> ByteString
-> Int
-> NominalDiffTime
-> m (ConnectionConfig s)
connectWithTLS' lg host port =
connectInternal (C.ircTLSClient port host) defaultOnConnect defaultOnDisconnect lg host port
connectWithTLSConfig' :: MonadIO m
=> (Origin -> ByteString -> IO ())
-> TLS.TLSClientConfig
-> NominalDiffTime
-> m (ConnectionConfig s)
connectWithTLSConfig' lg cfg =
connectInternal (C.ircTLSClient' cfg) defaultOnConnect defaultOnDisconnect lg host port
where
host = TLS.tlsClientHost cfg
port = TLS.tlsClientPort cfg
connectWithTLSVerify' :: MonadIO m
=> (Origin -> ByteString -> IO ())
-> (X.CertificateStore -> TLS.ValidationCache -> X.ServiceID -> X.CertificateChain -> IO [X.FailedReason])
-> ByteString
-> Int
-> NominalDiffTime
-> m (ConnectionConfig s)
connectWithTLSVerify' lg verifier host port =
connectInternal (C.ircTLSClient' cfg) defaultOnConnect defaultOnDisconnect lg host port
where
cfg =
let cfg0 = C.defaultTLSConfig port host
TLS.TLSSettings cTLSSettings = TLS.tlsClientTLSSettings cfg0
cHooks = TLS.clientHooks cTLSSettings
in cfg0 { TLS.tlsClientTLSSettings = TLS.TLSSettings cTLSSettings
{ TLS.clientHooks = cHooks
{ TLS.onServerCertificate = verifier }
}
}
start :: MonadIO m => ConnectionConfig () -> InstanceConfig () -> m ()
start cconf iconf = startStateful cconf iconf ()
startStateful :: MonadIO m => ConnectionConfig s -> InstanceConfig s -> s -> m ()
startStateful cconf iconf ustate = newIRCState cconf iconf ustate >>= start'
start' :: MonadIO m => IRCState s -> m ()
start' = liftIO . runReaderT runner
defaultIRCConf :: Text -> InstanceConfig s
defaultIRCConf n = InstanceConfig
{ _nick = n
, _username = n
, _realname = n
, _password = Nothing
, _channels = []
, _ctcpVer = "irc-client-0.4.4"
, _eventHandlers = defaultEventHandlers
, _ignore = []
}