pipes-irc-server/src/Pipes/IRC/Message/Render.hs

74 lines
2.0 KiB
Haskell

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Pipes.IRC.Message.Render where
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as C8
import Data.ByteString.Lazy.Builder
import Data.ByteString.Lazy.Builder.ASCII (intDec)
import Data.Monoid
import Pipes.IRC.Message.Types
renderIrcMessage :: IrcMessage -> Builder
renderIrcMessage IrcMessage {..} =
renderMsgPrefix prefix
<> renderMsgCommand command
<> renderIrcParams params
<> byteString "\r\n"
renderMsgPrefix :: Maybe MsgPrefix -> Builder
renderMsgPrefix Nothing = mempty
renderMsgPrefix mp =
char8 ':'
<> case mp of
Just (Left sn) -> renderServerName sn
Just (Right nn) -> renderNickName nn
_ -> mempty
<> char8 ' '
renderServerName :: ServerName -> Builder
renderServerName = byteString
renderNickName :: NickName -> Builder
renderNickName NickName {..} =
byteString nick
<> renderUser user
<> renderHost host
renderUser :: Maybe ByteString -> Builder
renderUser user =
case user of
Nothing -> mempty
Just name -> byteString "!" <> byteString name
renderHost :: Maybe ByteString -> Builder
renderHost host =
case host of
Nothing -> mempty
Just name -> byteString "@" <> byteString name
renderMsgCommand :: MsgCommand -> Builder
renderMsgCommand cmd =
case cmd of
Left ircCmd -> renderIrcCommand ircCmd
Right ircReply -> renderIrcReply ircReply
<> byteString " "
renderIrcCommand :: IrcCommand -> Builder
renderIrcCommand cmd =
case cmd of
(Unknown name) -> byteString name
_ -> byteString . C8.pack . show $ cmd
renderIrcReply :: IrcReply -> Builder
renderIrcReply IrcReply {..} = intDec replyCode
renderIrcParams :: [IrcParam] -> Builder
renderIrcParams [] = mempty
renderIrcParams (p:ps) =
renderParam p <> mconcat [char8 ' ' <> renderParam p' | p' <- ps ]
renderParam :: IrcParam -> Builder
renderParam = byteString