gameServer/HWProtoInRoomState.hs
changeset 8002 8113afd3858f
parent 7986 53b1da5ee7f4
child 8189 328f429c3ecc
--- a/gameServer/HWProtoInRoomState.hs	Wed Nov 07 13:24:01 2012 -0500
+++ b/gameServer/HWProtoInRoomState.hs	Wed Nov 07 23:02:18 2012 +0400
@@ -8,6 +8,7 @@
 import qualified Data.ByteString.Char8 as B
 import Control.Monad
 import Control.Monad.Reader
+import Control.DeepSeq
 --------------------------------------
 import CoreTypes
 import Actions
@@ -300,11 +301,18 @@
         engineMsg cl = toEngineMsg $ B.concat ["b", nick cl, "(team): ", msg, "\x20\x20"]
 
 handleCmd_inRoom ["BAN", banNick] = do
-    (_, rnc) <- ask
+    (thisClientId, rnc) <- ask
     maybeClientId <- clientByNick banNick
+    master <- liftM isMaster thisClient
     let banId = fromJust maybeClientId
-    master <- liftM isMaster thisClient
-    return [ModifyRoom (\r -> r{roomBansList = (host $ rnc `client` banId) : roomBansList r}) | master && isJust maybeClientId]
+    let sameRoom = clientRoom rnc thisClientId == clientRoom rnc banId
+    if master && isJust maybeClientId && (banId /= thisClientId) && sameRoom then
+        return [
+                ModifyRoom (\r -> r{roomBansList = let h = host $ rnc `client` banId in h `deepseq` h : roomBansList r})
+              , KickRoomClient banId
+            ]
+        else
+        return []
 
 
 handleCmd_inRoom ["LIST"] = return [] -- for old clients (<= 0.9.17)