diff -r ce3ccc45d790 -r 5012e1f9e893 gameServer/Votes.hs --- a/gameServer/Votes.hs Fri Aug 22 00:37:26 2014 +0400 +++ b/gameServer/Votes.hs Fri Aug 22 00:57:07 2014 +0400 @@ -12,6 +12,7 @@ import Utils import CoreTypes import HandlerUtils +import EngineInteraction voted :: Bool -> Reader (ClientIndex, IRnC) [Action] @@ -20,23 +21,27 @@ rm <- thisRoom uid <- liftM clUID thisClient - if isNothing $ voting rm then - return [AnswerClients [sendChan cl] ["CHAT", "[server]", loc "There's no voting going on"]] - else if uid `L.notElem` entitledToVote (fromJust $ voting rm) then - return [] - else if uid `L.elem` map fst (votes . fromJust $ voting rm) then - return [AnswerClients [sendChan cl] ["CHAT", "[server]", loc "You already have voted"]] - else - actOnVoting . fromJust . liftM (\v -> v{votes = (uid, vote):votes v}) $ voting rm + case voting rm of + Nothing -> + return [AnswerClients [sendChan cl] ["CHAT", "[server]", loc "There's no voting going on"]] + Just voting -> + if uid `L.notElem` entitledToVote voting then + return [] + else if uid `L.elem` map fst (votes voting) then + return [AnswerClients [sendChan cl] ["CHAT", "[server]", loc "You already have voted"]] + else + actOnVoting $ voting{votes = (uid, vote):votes voting} + where actOnVoting :: Voting -> Reader (ClientIndex, IRnC) [Action] actOnVoting vt = do let (pro, contra) = L.partition snd $ votes vt - let v = (length $ entitledToVote vt) `div` 2 + 1 + let totalV = length $ entitledToVote vt + let successV = totalV `div` 2 + 1 - if length contra >= v then + if length contra > totalV - successV then closeVoting - else if length pro >= v then do + else if length pro >= successV then do a <- act $ voteType vt c <- closeVoting return $ c ++ a @@ -79,6 +84,13 @@ where replaceChans chans (AnswerClients _ msg) = AnswerClients chans msg replaceChans _ a = a + act (VotePause) = do + rm <- thisRoom + chans <- roomClientsChans + let modifyGameInfo f room = room{gameInfo = fmap f $ gameInfo room} + return [ModifyRoom (modifyGameInfo $ \g -> g{isPaused = not $ isPaused g}), + AnswerClients chans ["CHAT", "[server]", "Pause toggled"], + AnswerClients chans ["EM", toEngineMsg "I"]] startVote :: VoteType -> Reader (ClientIndex, IRnC) [Action] @@ -123,3 +135,4 @@ voteInfo :: VoteType -> B.ByteString voteInfo (VoteKick n) = B.concat [loc "kick", " ", n] voteInfo (VoteMap n) = B.concat [loc "map", " ", n] +voteInfo (VotePause) = B.concat [loc "pause"]