netserver/hedgewars-server.hs
changeset 1476 b3b28e99570f
parent 1475 bab5650fc894
child 1477 001a52a108ed
equal deleted inserted replaced
1475:bab5650fc894 1476:b3b28e99570f
    55 
    55 
    56 
    56 
    57 sendAnswers [] _ clients _ = return clients
    57 sendAnswers [] _ clients _ = return clients
    58 sendAnswers ((handlesFunc, answer):answers) client clients rooms = do
    58 sendAnswers ((handlesFunc, answer):answers) client clients rooms = do
    59 	let recipients = handlesFunc client clients rooms
    59 	let recipients = handlesFunc client clients rooms
    60 	unless (null recipients) $ putStrLn ("< " ++ (show answer))
    60 	--unless (null recipients) $ putStrLn ("< " ++ (show answer))
    61 
    61 
    62 	clHandles' <- forM recipients $
    62 	clHandles' <- forM recipients $
    63 		\ch -> Control.Exception.handle
    63 		\ch -> Control.Exception.handle
    64 			(\e -> putStrLn ("handle exception: " ++ show e) >>
    64 			(\e -> putStrLn ("handle exception: " ++ show e) >>
    65 				if head answer == "BYE" then
    65 				if head answer == "BYE" then
    71 			forM_ answer (\str -> hPutStrLn ch str)
    71 			forM_ answer (\str -> hPutStrLn ch str)
    72 			hPutStrLn ch ""
    72 			hPutStrLn ch ""
    73 			hFlush ch
    73 			hFlush ch
    74 			if head answer == "BYE" then return [ch] else return []
    74 			if head answer == "BYE" then return [ch] else return []
    75 
    75 
    76 	let mclients = remove clients $ concat clHandles'
    76 	let outHandles = concat clHandles'
       
    77 	mapM_ (\ch -> Control.Exception.handle (const $ putStrLn "error on hClose") (hClose ch)) outHandles
       
    78 	let mclients = remove clients outHandles
    77 
    79 
    78 	sendAnswers answers client mclients rooms
    80 	sendAnswers answers client mclients rooms
    79 	where
    81 	where
    80 		remove list rmClHandles = deleteFirstsBy2t (\ a b -> (Miscutils.handle a) == b) list rmClHandles
    82 		remove list rmClHandles = deleteFirstsBy2t (\ a b -> (Miscutils.handle a) == b) list rmClHandles
    81 
    83