author | koda |
Sat, 19 Feb 2011 01:01:03 +0100 | |
changeset 4947 | cfac6aab84a0 |
parent 4932 | f11d80bac7ed |
child 4975 | 31da8979e5b1 |
permissions | -rw-r--r-- |
4295
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
1 |
{-# LANGUAGE OverloadedStrings #-} |
1804 | 2 |
module HWProtoCore where |
3 |
||
4612 | 4 |
import Control.Monad.Reader |
4295
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
5 |
import Data.Maybe |
4612 | 6 |
import qualified Data.ByteString.Char8 as B |
1804 | 7 |
-------------------------------------- |
8 |
import CoreTypes |
|
9 |
import Actions |
|
10 |
import HWProtoNEState |
|
11 |
import HWProtoLobbyState |
|
12 |
import HWProtoInRoomState |
|
4295
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
13 |
import HandlerUtils |
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
14 |
import RoomsAndClients |
4612 | 15 |
import Utils |
1804 | 16 |
|
1862 | 17 |
handleCmd, handleCmd_loggedin :: CmdHandler |
1804 | 18 |
|
4295
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
19 |
|
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
20 |
handleCmd ["PING"] = answerClient ["PONG"] |
1804 | 21 |
|
22 |
||
4295
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
23 |
handleCmd ("QUIT" : xs) = return [ByeClient msg] |
2867
9be6693c78cb
- Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents:
2706
diff
changeset
|
24 |
where |
4612 | 25 |
msg = if not $ null xs then head xs else "bye" |
1804 | 26 |
|
4568 | 27 |
|
4612 | 28 |
handleCmd ["PONG"] = do |
29 |
cl <- thisClient |
|
30 |
if pingsQueue cl == 0 then |
|
31 |
return [ProtocolError "Protocol violation"] |
|
32 |
else |
|
33 |
return [ModifyClient (\c -> c{pingsQueue = pingsQueue c - 1})] |
|
4568 | 34 |
|
4295
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
35 |
handleCmd cmd = do |
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
36 |
(ci, irnc) <- ask |
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
37 |
if logonPassed (irnc `client` ci) then |
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
38 |
handleCmd_loggedin cmd |
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
39 |
else |
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
40 |
handleCmd_NotEntered cmd |
1862 | 41 |
|
4568 | 42 |
|
4612 | 43 |
handleCmd_loggedin ["INFO", asknick] = do |
44 |
(_, rnc) <- ask |
|
4614 | 45 |
maybeClientId <- clientByNick asknick |
4612 | 46 |
let noSuchClient = isNothing maybeClientId |
47 |
let clientId = fromJust maybeClientId |
|
48 |
let cl = rnc `client` fromJust maybeClientId |
|
49 |
let roomId = clientRoom rnc clientId |
|
50 |
let clRoom = room rnc roomId |
|
51 |
let roomMasterSign = if isMaster cl then "@" else "" |
|
52 |
let adminSign = if isAdministrator cl then "@" else "" |
|
4932 | 53 |
let roomInfo = if roomId /= lobbyId then roomMasterSign `B.append` "room " `B.append` name clRoom else adminSign `B.append` "lobby" |
4612 | 54 |
let roomStatus = if gameinprogress clRoom then |
55 |
if teamsInGame cl > 0 then "(playing)" else "(spectating)" |
|
56 |
else |
|
57 |
"" |
|
2867
9be6693c78cb
- Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents:
2706
diff
changeset
|
58 |
if noSuchClient then |
4612 | 59 |
return [] |
60 |
else |
|
61 |
answerClient [ |
|
62 |
"INFO", |
|
63 |
nick cl, |
|
64 |
"[" `B.append` host cl `B.append` "]", |
|
65 |
protoNumber2ver $ clientProto cl, |
|
66 |
"[" `B.append` roomInfo `B.append` "]" `B.append` roomStatus |
|
67 |
] |
|
1862 | 68 |
|
69 |
||
4295
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
70 |
handleCmd_loggedin cmd = do |
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
71 |
(ci, rnc) <- ask |
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
72 |
if clientRoom rnc ci == lobbyId then |
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
73 |
handleCmd_lobby cmd |
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
74 |
else |
1f5604cd99be
This revision should, in theory, correctly merge 0.9.14 and tip, so that future merges of 0.9.14 should work properly
nemo
parents:
4242
diff
changeset
|
75 |
handleCmd_inRoom cmd |