module Hach.Types
( Nick, Timestamp
, CMessage(..), SMessage(..)
, C2S(..), S2C(..)
, fromS2C, toC2S
) where
import Control.Arrow (second)
import Data.Char (isSpace)
import Data.Monoid ((<>))
import Data.Text as T
import Data.Time
import System.Exit (exitSuccess)
import System.Locale (defaultTimeLocale)
type Nick = Text
type Timestamp = UTCTime
data S2C = S2C { text :: Text
, messageType :: SMessage
, time :: Timestamp
} deriving (Read, Show)
data SMessage = SPlain Nick
| SAction Nick
| SSetNick Nick
| SSystem
deriving (Read, Show)
data C2S = C2S Text CMessage deriving (Read, Show)
data CMessage = CPlain
| CAction
| CSetNick
deriving (Read, Show)
fromS2C :: S2C -> Text
fromS2C (S2C message (SPlain n) t) = "[" <> formatTime' t <> "] <" <> n <> ">: " <> message <> "\n"
fromS2C (S2C message (SAction n) t) = "[" <> formatTime' t <> "] *" <> n <> " " <> message <> "\n"
fromS2C (S2C message (SSetNick n) t) = "[" <> formatTime' t <> "] " <> n <> " " <> message <> "\n"
fromS2C (S2C message SSystem t) = "[" <> formatTime' t <> "] ! " <> message <> "\n"
formatTime' :: Timestamp -> Text
formatTime' = T.pack . formatTime defaultTimeLocale "%T"
toC2S :: T.Text -> IO C2S
toC2S m = case format m of
("/exit", _) -> exitSuccess
("/nick", t) -> return $ C2S t CSetNick
("/me", t) -> return $ C2S t CAction
_ -> return $ C2S (T.reverse . T.drop 1 $ T.reverse m) CPlain
where format = second (T.reverse . dropSpaces . T.reverse . dropSpaces) . T.break isSpace . dropSpaces
dropSpaces = T.dropWhile isSpace