diff -r 48b7823ec7e4 -r 109e9b5761c2 gameServer/Actions.hs --- a/gameServer/Actions.hs Wed Jul 20 00:09:13 2011 +0200 +++ b/gameServer/Actions.hs Sat Jul 23 09:30:51 2011 +0400 @@ -45,6 +45,8 @@ | KickClient ClientIndex | KickRoomClient ClientIndex | BanClient NominalDiffTime B.ByteString ClientIndex + | BanIP B.ByteString NominalDiffTime B.ByteString + | BanList | ChangeMaster | RemoveClientTeams ClientIndex | ModifyClient (ClientInfo -> ClientInfo) @@ -393,12 +395,25 @@ modify (\s -> s{clientIndex = Just banId}) clHost <- client's host currentTime <- io getCurrentTime - let msg = B.concat ["Ban for ", B.pack . show $ seconds, "seconds (", reason, ")"] + let msg = B.concat ["Ban for ", B.pack . show $ seconds, " (", reason, ")"] mapM_ processAction [ AddIP2Bans clHost msg (addUTCTime seconds currentTime) , KickClient banId ] +processAction (BanIP ip seconds reason) = do + currentTime <- io getCurrentTime + let msg = B.concat ["Ban for ", B.pack . show $ seconds, " (", reason, ")"] + processAction $ + AddIP2Bans ip msg (addUTCTime seconds currentTime) + +processAction BanList = do + ch <- client's sendChan + bans <- gets (bans . serverInfo) + processAction $ + AnswerClients [ch] ["BANLIST", B.pack $ show bans] + + processAction (KickRoomClient kickId) = do modify (\s -> s{clientIndex = Just kickId}) @@ -442,15 +457,13 @@ si <- gets serverInfo let validBans = filter (checkNotExpired clTime) $ bans si let ban = L.find (checkBan clHost clNick) $ validBans - when (isJust ban) $ - mapM_ processAction [ + mapM_ processAction $ ModifyServerInfo (\s -> s{bans = validBans}) - , ByeClient (getBanReason $ fromJust ban) - ] + : [ByeClient (getBanReason $ fromJust ban) | isJust ban] where checkNotExpired testTime (BanByIP _ _ time) = testTime `diffUTCTime` time <= 0 checkNotExpired testTime (BanByNick _ _ time) = testTime `diffUTCTime` time <= 0 - checkBan ip _ (BanByIP bip _ _) = bip == ip + checkBan ip _ (BanByIP bip _ _) = bip `B.isPrefixOf` ip checkBan _ n (BanByNick bn _ _) = bn == n getBanReason (BanByIP _ msg _) = msg getBanReason (BanByNick _ msg _) = msg