gameServer/Votes.hs
author unc0rr
Tue, 28 Jan 2014 00:22:49 +0400
changeset 10081 0af84e5cbd4d
parent 10058 4ed428389c4e
child 10087 5ba891578621
permissions -rw-r--r--
Implement 'voted' function
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10058
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
     1
{-# LANGUAGE OverloadedStrings #-}
10049
ca11d122f54e Oops, forgot this
unc0rr
parents:
diff changeset
     2
module Votes where
ca11d122f54e Oops, forgot this
unc0rr
parents:
diff changeset
     3
ca11d122f54e Oops, forgot this
unc0rr
parents:
diff changeset
     4
import Control.Monad.Reader
ca11d122f54e Oops, forgot this
unc0rr
parents:
diff changeset
     5
import Control.Monad.State
ca11d122f54e Oops, forgot this
unc0rr
parents:
diff changeset
     6
import ServerState
10058
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
     7
import qualified Data.ByteString.Char8 as B
10081
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
     8
import qualified Data.List as L
10058
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
     9
import Data.Maybe
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    10
-------------------
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    11
import Utils
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    12
import CoreTypes
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    13
import HandlerUtils
10049
ca11d122f54e Oops, forgot this
unc0rr
parents:
diff changeset
    14
10081
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    15
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    16
voted :: Bool -> Reader (ClientIndex, IRnC) [Action]
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    17
voted vote = do
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    18
    cl <- thisClient
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    19
    rm <- thisRoom
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    20
    uid <- liftM clUID thisClient
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    21
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    22
    if isNothing $ voting rm then
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    23
        return [AnswerClients [sendChan cl] ["CHAT", "[server]", loc "There's no voting going on"]]
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    24
    else if uid `L.notElem` entitledToVote (fromJust $ voting rm) then
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    25
        return []
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    26
    else if uid `L.elem` map fst (votes . fromJust $ voting rm) then
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    27
        return [AnswerClients [sendChan cl] ["CHAT", "[server]", loc "You already have voted"]]
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    28
    else
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    29
        return [ModifyRoom $ \r -> r{voting = liftM (\v -> v{votes = (uid, vote):votes v}) $ voting rm}]
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    30
10049
ca11d122f54e Oops, forgot this
unc0rr
parents:
diff changeset
    31
ca11d122f54e Oops, forgot this
unc0rr
parents:
diff changeset
    32
startVote :: VoteType -> Reader (ClientIndex, IRnC) [Action]
10058
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    33
startVote vt = do
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    34
    (ci, rnc) <- ask
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    35
    cl <- thisClient
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    36
    rm <- thisRoom
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    37
    chans <- roomClientsChans
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    38
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    39
    let uids = map (clUID . client rnc) . roomClients rnc $ clientRoom rnc ci
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    40
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    41
    if isJust $ voting rm then
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    42
        return []
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    43
    else
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    44
        liftM ([ModifyRoom (\r -> r{voting = Just (newVoting vt){entitledToVote = uids}})
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    45
        , AnswerClients chans ["CHAT", "[server]", B.concat [loc "New voting started", ": ", voteInfo vt]]
10081
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    46
        ] ++ ) $ voted True
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    47
10049
ca11d122f54e Oops, forgot this
unc0rr
parents:
diff changeset
    48
ca11d122f54e Oops, forgot this
unc0rr
parents:
diff changeset
    49
checkVotes :: StateT ServerState IO ()
ca11d122f54e Oops, forgot this
unc0rr
parents:
diff changeset
    50
checkVotes = undefined
10058
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    51
10081
0af84e5cbd4d Implement 'voted' function
unc0rr
parents: 10058
diff changeset
    52
10058
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    53
voteInfo :: VoteType -> B.ByteString
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    54
voteInfo (VoteKick n) = B.concat [loc "kick", " ", n]
4ed428389c4e - Implement /callvote
unc0rr
parents: 10049
diff changeset
    55