gameServer/ClientIO.hs
changeset 2352 7eaf82cf0890
parent 2348 b39d826e1ccd
child 2867 9be6693c78cb
equal deleted inserted replaced
2351:a4a17b8df591 2352:7eaf82cf0890
    21 			listenLoop handle (linesNumber + 1) (buf ++ [str]) chan clientID
    21 			listenLoop handle (linesNumber + 1) (buf ++ [str]) chan clientID
    22 
    22 
    23 clientRecvLoop :: Handle -> Chan CoreMessage -> Int -> IO ()
    23 clientRecvLoop :: Handle -> Chan CoreMessage -> Int -> IO ()
    24 clientRecvLoop handle chan clientID =
    24 clientRecvLoop handle chan clientID =
    25 	listenLoop handle 0 [] chan clientID
    25 	listenLoop handle 0 [] chan clientID
    26 		`catch` (\e -> (clientOff $ show e) >> return ())
    26 		`catch` (\e -> clientOff (show e) >> return ())
    27 	where clientOff msg = writeChan chan $ ClientMessage (clientID, ["QUIT", msg]) -- if the client disconnects, we perform as if it sent QUIT message
    27 	where clientOff msg = writeChan chan $ ClientMessage (clientID, ["QUIT", msg]) -- if the client disconnects, we perform as if it sent QUIT message
    28 
    28 
    29 clientSendLoop :: Handle -> Chan CoreMessage -> Chan [String] -> Int -> IO()
    29 clientSendLoop :: Handle -> Chan CoreMessage -> Chan [String] -> Int -> IO()
    30 clientSendLoop handle coreChan chan clientID = do
    30 clientSendLoop handle coreChan chan clientID = do
    31 	answer <- readChan chan
    31 	answer <- readChan chan
    32 	doClose <- Exception.handle
    32 	doClose <- Exception.handle
    33 		(\(e :: Exception.IOException) -> if isQuit answer then return True else sendQuit e >> return False) $ do
    33 		(\(e :: Exception.IOException) -> if isQuit answer then return True else sendQuit e >> return False) $ do
    34 		forM_ answer (\str -> hPutStrLn handle str)
    34 		forM_ answer (hPutStrLn handle)
    35 		hPutStrLn handle ""
    35 		hPutStrLn handle ""
    36 		hFlush handle
    36 		hFlush handle
    37 		return $ isQuit answer
    37 		return $ isQuit answer
    38 
    38 
    39 	if doClose then
    39 	if doClose then