78 let message = if protonum < latestReleaseVersion si then |
78 let message = if protonum < latestReleaseVersion si then |
79 serverMessageForOldVersions si |
79 serverMessageForOldVersions si |
80 else |
80 else |
81 serverMessage si |
81 serverMessage si |
82 processAction $ AnswerClients [chan] ["SERVER_MESSAGE", message] |
82 processAction $ AnswerClients [chan] ["SERVER_MESSAGE", message] |
83 {- |
83 |
84 |
84 |
85 processAction (clID, serverInfo, rnc) SendServerVars = do |
85 processAction SendServerVars = do |
86 writeChan (sendChan $ clients ! clID) ("SERVER_VARS" : vars) |
86 chan <- client's sendChan |
87 return (clID, serverInfo, rnc) |
87 si <- gets serverInfo |
88 where |
88 io $ writeChan chan ("SERVER_VARS" : vars si) |
89 client = clients ! clID |
89 where |
90 vars = [ |
90 vars si = [ |
91 "MOTD_NEW", serverMessage serverInfo, |
91 "MOTD_NEW", serverMessage si, |
92 "MOTD_OLD", serverMessageForOldVersions serverInfo, |
92 "MOTD_OLD", serverMessageForOldVersions si, |
93 "LATEST_PROTO", show $ latestReleaseVersion serverInfo |
93 "LATEST_PROTO", B.pack . show $ latestReleaseVersion si |
94 ] |
94 ] |
95 |
95 |
96 |
|
97 -} |
|
98 |
96 |
99 processAction (ProtocolError msg) = do |
97 processAction (ProtocolError msg) = do |
100 chan <- client's sendChan |
98 chan <- client's sendChan |
101 processAction $ AnswerClients [chan] ["ERROR", msg] |
99 processAction $ AnswerClients [chan] ["ERROR", msg] |
102 |
100 |
109 (Just ci) <- gets clientIndex |
107 (Just ci) <- gets clientIndex |
110 rnc <- gets roomsClients |
108 rnc <- gets roomsClients |
111 ri <- clientRoomA |
109 ri <- clientRoomA |
112 |
110 |
113 chan <- client's sendChan |
111 chan <- client's sendChan |
|
112 clNick <- client's nick |
114 |
113 |
115 when (ri /= lobbyId) $ do |
114 when (ri /= lobbyId) $ do |
116 processAction $ MoveToLobby ("quit: " `B.append` msg) |
115 processAction $ MoveToLobby ("quit: " `B.append` msg) |
117 return () |
116 return () |
118 |
117 |
|
118 clientsChans <- liftM (Prelude.map sendChan . Prelude.filter logonPassed) $! allClientsS |
119 io $ do |
119 io $ do |
120 infoM "Clients" (show ci ++ " quits: " ++ (B.unpack msg)) |
120 infoM "Clients" (show ci ++ " quits: " ++ (B.unpack msg)) |
121 |
121 |
122 --mapM_ (processAction (ci, serverInfo, rnc)) $ answerOthersQuit ++ answerInformRoom |
|
123 |
|
124 processAction $ AnswerClients [chan] ["BYE", msg] |
122 processAction $ AnswerClients [chan] ["BYE", msg] |
|
123 processAction $ AnswerClients clientsChans ["LOBBY:LEFT", clNick, msg] |
125 |
124 |
126 s <- get |
125 s <- get |
127 put $! s{removedClients = ci `Set.insert` removedClients s} |
126 put $! s{removedClients = ci `Set.insert` removedClients s} |
128 |
127 |
129 processAction (DeleteClient ci) = do |
128 processAction (DeleteClient ci) = do |
131 io $ removeClient rnc ci |
130 io $ removeClient rnc ci |
132 |
131 |
133 s <- get |
132 s <- get |
134 put $! s{removedClients = ci `Set.delete` removedClients s} |
133 put $! s{removedClients = ci `Set.delete` removedClients s} |
135 |
134 |
136 {- |
|
137 where |
|
138 client = clients ! clID |
|
139 clientNick = nick client |
|
140 answerInformRoom = |
|
141 if roomID client /= 0 then |
|
142 if not $ Prelude.null msg then |
|
143 [AnswerThisRoom ["LEFT", clientNick, msg]] |
|
144 else |
|
145 [AnswerThisRoom ["LEFT", clientNick]] |
|
146 else |
|
147 [] |
|
148 answerOthersQuit = |
|
149 if logonPassed client then |
|
150 if not $ Prelude.null msg then |
|
151 [AnswerAll ["LOBBY:LEFT", clientNick, msg]] |
|
152 else |
|
153 [AnswerAll ["LOBBY:LEFT", clientNick]] |
|
154 else |
|
155 [] |
|
156 -} |
|
157 |
|
158 processAction (ModifyClient f) = do |
135 processAction (ModifyClient f) = do |
159 (Just ci) <- gets clientIndex |
136 (Just ci) <- gets clientIndex |
160 rnc <- gets roomsClients |
137 rnc <- gets roomsClients |
161 io $ modifyClient rnc f ci |
138 io $ modifyClient rnc f ci |
162 return () |
139 return () |
171 rnc <- gets roomsClients |
148 rnc <- gets roomsClients |
172 ri <- clientRoomA |
149 ri <- clientRoomA |
173 io $ modifyRoom rnc f ri |
150 io $ modifyRoom rnc f ri |
174 return () |
151 return () |
175 |
152 |
176 {- |
153 |
177 |
154 processAction (ModifyServerInfo f) = |
178 processAction (clID, serverInfo, rnc) (ModifyServerInfo func) = |
155 modify (\s -> s{serverInfo = f $ serverInfo s}) |
179 return (clID, func serverInfo, rnc) |
156 |
180 |
|
181 -} |
|
182 |
157 |
183 processAction (MoveToRoom ri) = do |
158 processAction (MoveToRoom ri) = do |
184 (Just ci) <- gets clientIndex |
159 (Just ci) <- gets clientIndex |
185 rnc <- gets roomsClients |
160 rnc <- gets roomsClients |
186 |
161 |