module Network.SimpleServer.Examples.ChatClient(main, run) where
import Network
import System.Environment
import Control.Concurrent
import Control.Concurrent.MVar
import Control.Concurrent.Thread.Delay
import Control.Monad
import System.IO
import Data.Char
run :: HostName -> Int -> IO ()
run host port = do
handle <- connectTo host (PortNumber (fromIntegral port))
stopVar <- newEmptyMVar
ioo <- forkIO $ forever (doOutput handle)
ioi <- forkIO $ forever (doInput handle stopVar)
iom <- forkIO $ forever (maintainConnection handle)
readMVar stopVar
killThread ioo
killThread ioi
killThread iom
return ()
doOutput :: Handle -> IO ()
doOutput handle = do
msg <- getLine
case msg of
msg@('/':_) -> hPutStrLn handle msg
msg -> hPutStrLn handle $ "/message " ++ msg
doInput :: Handle -> MVar Bool -> IO ()
doInput handle mvar = do
string <- hGetLine handle
putStrLn string
if string == "disconnected" then putMVar mvar True else return ()
maintainConnection :: Handle -> IO ()
maintainConnection handle = do
hPutStrLn handle "/ping silent"
delay (1000 * 1000 * 30)
main = do
args <- getArgs
case args of
[] -> printUsage
(x:[]) -> printUsage
(host:port:_) -> if isInt port then run host (read port) else printUsage
printUsage :: IO ()
printUsage = putStrLn "./ChatClient hostname port"
isInt :: [Char] -> Bool
isInt = (== []) . (filter (not . isDigit))