74 lines
2.0 KiB
Haskell
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
|