author | unc0rr |
Wed, 22 Jan 2014 23:06:50 +0400 | |
changeset 10055 | f738693be9be |
parent 10039 | 58cf89284115 |
child 10061 | b7161f00a6ca |
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 |
|
8479
8d71109b04d2
Some work on loading replay and interaction with checker
unc0rr
parents:
8478
diff
changeset
|
13 |
import HWProtoChecker |
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
|
14 |
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
|
15 |
import RoomsAndClients |
4612 | 16 |
import Utils |
1804 | 17 |
|
4989 | 18 |
handleCmd, handleCmd_loggedin :: CmdHandler |
1804 | 19 |
|
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
|
20 |
|
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
|
21 |
handleCmd ["PING"] = answerClient ["PONG"] |
1804 | 22 |
|
23 |
||
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
|
24 |
handleCmd ("QUIT" : xs) = return [ByeClient msg] |
2867
9be6693c78cb
- Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents:
2706
diff
changeset
|
25 |
where |
8401
87410ae372f6
Server messages localization using Qt's l10n subsystem:
unc0rr
parents:
8396
diff
changeset
|
26 |
msg = if not $ null xs then head xs else loc "bye" |
1804 | 27 |
|
4568 | 28 |
|
4612 | 29 |
handleCmd ["PONG"] = do |
30 |
cl <- thisClient |
|
31 |
if pingsQueue cl == 0 then |
|
8897
d6c310c65c91
- Revert server workaround over desync from r98e2dbdda8c0
unc0rr
parents:
8547
diff
changeset
|
32 |
return [ProtocolError "Protocol violation"] |
4612 | 33 |
else |
34 |
return [ModifyClient (\c -> c{pingsQueue = pingsQueue c - 1})] |
|
4568 | 35 |
|
10039 | 36 |
handleCmd ["CMD", parameters] = uncurry h $ extractParameters parameters |
8396 | 37 |
where |
9105 | 38 |
h "DELEGATE" n | not $ B.null n = handleCmd ["DELEGATE", n] |
39 |
h "STATS" _ = handleCmd ["STATS"] |
|
40 |
h "PART" m | not $ B.null m = handleCmd ["PART", m] |
|
41 |
| otherwise = handleCmd ["PART"] |
|
42 |
h "QUIT" m | not $ B.null m = handleCmd ["QUIT", m] |
|
43 |
| otherwise = handleCmd ["QUIT"] |
|
44 |
h "RND" p = handleCmd ("RND" : B.words p) |
|
45 |
h "GLOBAL" p = do |
|
9035
e84d42a4311c
'/rnd' command. Pass it a (possibly empty) list of items.
unc0rr
parents:
9034
diff
changeset
|
46 |
cl <- thisClient |
8547
6898be8aa261
Global notice with /global command. Can now warn users when doing server restart.
unc0rr
parents:
8519
diff
changeset
|
47 |
rnc <- liftM snd ask |
6898be8aa261
Global notice with /global command. Can now warn users when doing server restart.
unc0rr
parents:
8519
diff
changeset
|
48 |
let chans = map (sendChan . client rnc) $ allClients rnc |
9105 | 49 |
return [AnswerClients chans ["CHAT", "[global notice]", p] | isAdministrator cl] |
9448 | 50 |
h "WATCH" f = return [QueryReplay f] |
9753
9579596cf471
- Special rooms which stay even when last player quits. Not useful for now, and can't be removed at all.
unc0rr
parents:
9448
diff
changeset
|
51 |
h "FIX" _ = handleCmd ["FIX"] |
9770 | 52 |
h "UNFIX" _ = handleCmd ["UNFIX"] |
9787 | 53 |
h "GREETING" msg = handleCmd ["GREETING", msg] |
10039 | 54 |
h "CALLVOTE" msg | B.null msg = handleCmd ["CALLVOTE"] |
55 |
| otherwise = let (c, p) = extractParameters msg in |
|
56 |
if B.null p then handleCmd ["CALLVOTE", c] else handleCmd ["CALLVOTE", c, p] |
|
57 |
h "VOTE" msg = handleCmd ["VOTE", upperCase msg] |
|
9105 | 58 |
h c p = return [Warning $ B.concat ["Unknown cmd: /", c, p]] |
8396 | 59 |
|
10039 | 60 |
extractParameters p = let (a, b) = B.break (== ' ') p in (upperCase a, B.dropWhile (== ' ') b) |
61 |
||
62 |
||
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
|
63 |
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
|
64 |
(ci, irnc) <- ask |
8479
8d71109b04d2
Some work on loading replay and interaction with checker
unc0rr
parents:
8478
diff
changeset
|
65 |
let cl = irnc `client` ci |
8d71109b04d2
Some work on loading replay and interaction with checker
unc0rr
parents:
8478
diff
changeset
|
66 |
if logonPassed cl then |
8d71109b04d2
Some work on loading replay and interaction with checker
unc0rr
parents:
8478
diff
changeset
|
67 |
if isChecker cl then |
8d71109b04d2
Some work on loading replay and interaction with checker
unc0rr
parents:
8478
diff
changeset
|
68 |
handleCmd_checker cmd |
8d71109b04d2
Some work on loading replay and interaction with checker
unc0rr
parents:
8478
diff
changeset
|
69 |
else |
8d71109b04d2
Some work on loading replay and interaction with checker
unc0rr
parents:
8478
diff
changeset
|
70 |
handleCmd_loggedin cmd |
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
|
71 |
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
|
72 |
handleCmd_NotEntered cmd |
1862 | 73 |
|
4568 | 74 |
|
4612 | 75 |
handleCmd_loggedin ["INFO", asknick] = do |
76 |
(_, rnc) <- ask |
|
4614 | 77 |
maybeClientId <- clientByNick asknick |
5060
7d0f6e5b1c1c
Hide last two octets of IP address from usual users
unc0rr
parents:
5030
diff
changeset
|
78 |
isAdminAsking <- liftM isAdministrator thisClient |
4612 | 79 |
let noSuchClient = isNothing maybeClientId |
80 |
let clientId = fromJust maybeClientId |
|
81 |
let cl = rnc `client` fromJust maybeClientId |
|
82 |
let roomId = clientRoom rnc clientId |
|
83 |
let clRoom = room rnc roomId |
|
9061 | 84 |
let roomMasterSign = if isMaster cl then "+" else "" |
4612 | 85 |
let adminSign = if isAdministrator cl then "@" else "" |
9061 | 86 |
let rInfo = if roomId /= lobbyId then B.concat [adminSign, roomMasterSign, "room ", name clRoom] else adminSign `B.append` "lobby" |
5996
2c72fe81dd37
Convert boolean variable + a bunch of fields which make sense only while game is going on into Maybe + structure
unc0rr
parents:
5060
diff
changeset
|
87 |
let roomStatus = if isJust $ gameInfo clRoom then |
4612 | 88 |
if teamsInGame cl > 0 then "(playing)" else "(spectating)" |
89 |
else |
|
90 |
"" |
|
5060
7d0f6e5b1c1c
Hide last two octets of IP address from usual users
unc0rr
parents:
5030
diff
changeset
|
91 |
let hostStr = if isAdminAsking then host cl else cutHost $ host cl |
2867
9be6693c78cb
- Unbreak support for client versions prior to 0.9.13-dev
unc0rr
parents:
2706
diff
changeset
|
92 |
if noSuchClient then |
4612 | 93 |
return [] |
94 |
else |
|
95 |
answerClient [ |
|
96 |
"INFO", |
|
97 |
nick cl, |
|
5060
7d0f6e5b1c1c
Hide last two octets of IP address from usual users
unc0rr
parents:
5030
diff
changeset
|
98 |
B.concat ["[", hostStr, "]"], |
4612 | 99 |
protoNumber2ver $ clientProto cl, |
7766 | 100 |
B.concat ["[", rInfo, "]", roomStatus] |
4612 | 101 |
] |
1862 | 102 |
|
103 |
||
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
|
104 |
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
|
105 |
(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
|
106 |
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
|
107 |
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
|
108 |
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
|
109 |
handleCmd_inRoom cmd |