{-# LANGUAGE OverloadedStrings #-} import Control.Monad (forever) import Network (withSocketsDo, PortID(..), connectTo) import Network.Socket (HostName, PortNumber) import System.IO (hSetBuffering, hSetNewlineMode, hPutStrLn, hClose, hGetLine, BufferMode(LineBuffering), universalNewlineMode, Handle) import Control.Concurrent.Async (race) import Control.Exception.Base (finally) import Data.Text (isPrefixOf, pack, replace, unpack) nick :: String nick = "ni" chan :: String chan = "#retiolum" server_hostname :: HostName server_hostname = "ni.r" server_port :: PortNumber server_port = 6667; main :: IO () main = withSocketsDo $ do h <- connectTo server_hostname (PortNumber server_port) talk h `finally` hClose h handshake :: Handle -> IO () handshake h = do hPutStrLn h ("NICK " ++ nick) hPutStrLn h ("USER " ++ nick ++ " * 0 :" ++ nick) hPutStrLn h ("JOIN " ++ chan) talk :: Handle -> IO () talk h = do hSetNewlineMode h universalNewlineMode hSetBuffering h LineBuffering handshake h _ <- race fromServer toServer return () where fromServer = forever $ do line <- hGetLine h --case line of if (isPrefixOf "PING" (pack line)) then hPutStrLn h (unpack (replace "PING" "PONG" (pack line))) else print line toServer = do line <- getLine case line of ":quit" -> do hPutStrLn h "/quit"; return () _ -> do hPutStrLn h ("PRIVMSG " ++ chan ++ " :" ++ line); toServer