40 m_game_connected(false), |
40 m_game_connected(false), |
41 loginStep(0), |
41 loginStep(0), |
42 netClientState(0) |
42 netClientState(0) |
43 { |
43 { |
44 // socket stuff |
44 // socket stuff |
45 connect(&NetSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); |
45 connect(&NetSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); |
46 connect(&NetSocket, SIGNAL(connected()), this, SLOT(OnConnect())); |
46 connect(&NetSocket, SIGNAL(connected()), this, SLOT(OnConnect())); |
47 connect(&NetSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnect())); |
47 connect(&NetSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnect())); |
48 connect(&NetSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, |
48 connect(&NetSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, |
49 SLOT(displayError(QAbstractSocket::SocketError))); |
49 SLOT(displayError(QAbstractSocket::SocketError))); |
50 |
50 |
51 // config stuff |
51 // config stuff |
52 connect(this, SIGNAL(paramChanged(const QString &, const QStringList &)), pGameCFGWidget, SLOT(setParam(const QString &, const QStringList &))); |
52 connect(this, SIGNAL(paramChanged(const QString &, const QStringList &)), pGameCFGWidget, SLOT(setParam(const QString &, const QStringList &))); |
53 connect(pGameCFGWidget, SIGNAL(paramChanged(const QString &, const QStringList &)), this, SLOT(onParamChanged(const QString &, const QStringList &))); |
53 connect(pGameCFGWidget, SIGNAL(paramChanged(const QString &, const QStringList &)), this, SLOT(onParamChanged(const QString &, const QStringList &))); |
54 connect(this, SIGNAL(configAsked()), pGameCFGWidget, SLOT(fullNetConfig())); |
54 connect(this, SIGNAL(configAsked()), pGameCFGWidget, SLOT(fullNetConfig())); |
55 } |
55 } |
56 |
56 |
57 HWNewNet::~HWNewNet() |
57 HWNewNet::~HWNewNet() |
58 { |
58 { |
59 if (m_game_connected) |
59 if (m_game_connected) |
60 { |
60 { |
61 RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit")); |
61 RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit")); |
62 emit Disconnected(); |
62 emit Disconnected(); |
63 } |
63 } |
64 NetSocket.flush(); |
64 NetSocket.flush(); |
65 } |
65 } |
66 |
66 |
67 void HWNewNet::Connect(const QString & hostName, quint16 port, const QString & nick) |
67 void HWNewNet::Connect(const QString & hostName, quint16 port, const QString & nick) |
68 { |
68 { |
69 mynick = nick.isEmpty() ? QLineEdit::tr("unnamed") : nick; |
69 mynick = nick.isEmpty() ? QLineEdit::tr("unnamed") : nick; |
70 myhost = hostName + QString(":%1").arg(port); |
70 myhost = hostName + QString(":%1").arg(port); |
71 NetSocket.connectToHost(hostName, port); |
71 NetSocket.connectToHost(hostName, port); |
72 } |
72 } |
73 |
73 |
74 void HWNewNet::Disconnect() |
74 void HWNewNet::Disconnect() |
75 { |
75 { |
76 if (m_game_connected) |
76 if (m_game_connected) |
77 RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit")); |
77 RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit")); |
78 m_game_connected = false; |
78 m_game_connected = false; |
79 |
79 |
80 NetSocket.disconnectFromHost(); |
80 NetSocket.disconnectFromHost(); |
81 } |
81 } |
82 |
82 |
83 void HWNewNet::CreateRoom(const QString & room) |
83 void HWNewNet::CreateRoom(const QString & room) |
84 { |
84 { |
85 if(netClientState != 2) |
85 if(netClientState != 2) |
86 { |
86 { |
87 qWarning("Illegal try to create room!"); |
87 qWarning("Illegal try to create room!"); |
88 return; |
88 return; |
89 } |
89 } |
90 |
90 |
91 myroom = room; |
91 myroom = room; |
92 |
92 |
93 RawSendNet(QString("CREATE_ROOM%1%2").arg(delimeter).arg(room)); |
93 RawSendNet(QString("CREATE_ROOM%1%2").arg(delimeter).arg(room)); |
94 isChief = true; |
94 isChief = true; |
95 } |
95 } |
96 |
96 |
97 void HWNewNet::JoinRoom(const QString & room) |
97 void HWNewNet::JoinRoom(const QString & room) |
98 { |
98 { |
99 if(netClientState != 2) |
99 if(netClientState != 2) |
100 { |
100 { |
101 qWarning("Illegal try to join room!"); |
101 qWarning("Illegal try to join room!"); |
102 return; |
102 return; |
103 } |
103 } |
104 |
104 |
105 myroom = room; |
105 myroom = room; |
106 |
106 |
107 RawSendNet(QString("JOIN_ROOM%1%2").arg(delimeter).arg(room)); |
107 RawSendNet(QString("JOIN_ROOM%1%2").arg(delimeter).arg(room)); |
108 isChief = false; |
108 isChief = false; |
109 } |
109 } |
110 |
110 |
111 void HWNewNet::AddTeam(const HWTeam & team) |
111 void HWNewNet::AddTeam(const HWTeam & team) |
112 { |
112 { |
113 QString cmd = QString("ADD_TEAM") + delimeter + |
113 QString cmd = QString("ADD_TEAM") + delimeter + |
114 team.TeamName + delimeter + |
114 team.TeamName + delimeter + |
115 team.teamColor.name() + delimeter + |
115 team.teamColor.name() + delimeter + |
116 team.Grave + delimeter + |
116 team.Grave + delimeter + |
117 team.Fort + delimeter + |
117 team.Fort + delimeter + |
118 team.Voicepack + delimeter + |
118 team.Voicepack + delimeter + |
119 team.Flag + delimeter + |
119 team.Flag + delimeter + |
120 QString::number(team.difficulty); |
120 QString::number(team.difficulty); |
121 |
121 |
122 for(int i = 0; i < 8; ++i) |
122 for(int i = 0; i < 8; ++i) |
123 { |
123 { |
124 cmd.append(delimeter); |
124 cmd.append(delimeter); |
125 cmd.append(team.HHName[i]); |
125 cmd.append(team.HHName[i]); |
126 cmd.append(delimeter); |
126 cmd.append(delimeter); |
127 cmd.append(team.HHHat[i]); |
127 cmd.append(team.HHHat[i]); |
128 } |
128 } |
129 RawSendNet(cmd); |
129 RawSendNet(cmd); |
130 } |
130 } |
131 |
131 |
132 void HWNewNet::RemoveTeam(const HWTeam & team) |
132 void HWNewNet::RemoveTeam(const HWTeam & team) |
133 { |
133 { |
134 RawSendNet(QString("REMOVE_TEAM") + delimeter + team.TeamName); |
134 RawSendNet(QString("REMOVE_TEAM") + delimeter + team.TeamName); |
135 } |
135 } |
136 |
136 |
137 void HWNewNet::ToggleReady() |
137 void HWNewNet::ToggleReady() |
138 { |
138 { |
139 RawSendNet(QString("TOGGLE_READY")); |
139 RawSendNet(QString("TOGGLE_READY")); |
151 RawSendNet(str.toUtf8()); |
151 RawSendNet(str.toUtf8()); |
152 } |
152 } |
153 |
153 |
154 void HWNewNet::RawSendNet(const QByteArray & buf) |
154 void HWNewNet::RawSendNet(const QByteArray & buf) |
155 { |
155 { |
156 // qDebug() << "Client: " << QString(buf).split("\n"); |
156 // qDebug() << "Client: " << QString(buf).split("\n"); |
157 NetSocket.write(buf); |
157 NetSocket.write(buf); |
158 NetSocket.write("\n\n", 2); |
158 NetSocket.write("\n\n", 2); |
159 } |
159 } |
160 |
160 |
161 void HWNewNet::ClientRead() |
161 void HWNewNet::ClientRead() |
162 { |
162 { |
163 while (NetSocket.canReadLine()) { |
163 while (NetSocket.canReadLine()) { |
164 QString s = QString::fromUtf8(NetSocket.readLine()); |
164 QString s = QString::fromUtf8(NetSocket.readLine()); |
165 if (s.endsWith('\n')) s.chop(1); |
165 if (s.endsWith('\n')) s.chop(1); |
166 |
166 |
167 if (s.size() == 0) { |
167 if (s.size() == 0) { |
168 ParseCmd(cmdbuf); |
168 ParseCmd(cmdbuf); |
169 cmdbuf.clear(); |
169 cmdbuf.clear(); |
170 } else |
170 } else |
171 cmdbuf << s; |
171 cmdbuf << s; |
172 } |
172 } |
173 } |
173 } |
174 |
174 |
175 void HWNewNet::OnConnect() |
175 void HWNewNet::OnConnect() |
176 { |
176 { |
177 } |
177 } |
178 |
178 |
179 void HWNewNet::OnDisconnect() |
179 void HWNewNet::OnDisconnect() |
180 { |
180 { |
181 if(m_game_connected) emit Disconnected(); |
181 if(m_game_connected) emit Disconnected(); |
182 m_game_connected = false; |
182 m_game_connected = false; |
183 } |
183 } |
184 |
184 |
185 void HWNewNet::displayError(QAbstractSocket::SocketError socketError) |
185 void HWNewNet::displayError(QAbstractSocket::SocketError socketError) |
186 { |
186 { |
187 emit Disconnected(); |
187 emit Disconnected(); |
188 |
188 |
189 switch (socketError) { |
189 switch (socketError) { |
190 case QAbstractSocket::RemoteHostClosedError: |
190 case QAbstractSocket::RemoteHostClosedError: |
191 break; |
191 break; |
192 case QAbstractSocket::HostNotFoundError: |
192 case QAbstractSocket::HostNotFoundError: |
193 emit showMessage(tr("The host was not found. Please check the host name and port settings.")); |
193 emit showMessage(tr("The host was not found. Please check the host name and port settings.")); |
194 break; |
194 break; |
195 case QAbstractSocket::ConnectionRefusedError: |
195 case QAbstractSocket::ConnectionRefusedError: |
196 emit showMessage(tr("Connection refused")); |
196 emit showMessage(tr("Connection refused")); |
197 break; |
197 break; |
198 default: |
198 default: |
199 emit showMessage(NetSocket.errorString()); |
199 emit showMessage(NetSocket.errorString()); |
200 } |
200 } |
201 } |
201 } |
202 |
202 |
203 void HWNewNet::ParseCmd(const QStringList & lst) |
203 void HWNewNet::ParseCmd(const QStringList & lst) |
204 { |
204 { |
205 // qDebug() << "Server: " << lst; |
205 // qDebug() << "Server: " << lst; |
206 |
206 |
207 if(!lst.size()) |
207 if(!lst.size()) |
208 { |
208 { |
209 qWarning("Net client: Bad message"); |
209 qWarning("Net client: Bad message"); |
210 return; |
210 return; |
211 } |
211 } |
212 |
212 |
213 if (lst[0] == "NICK") |
213 if (lst[0] == "NICK") |
214 { |
214 { |
215 mynick = lst[1]; |
215 mynick = lst[1]; |
216 return ; |
216 return ; |
217 } |
217 } |
218 |
218 |
219 if (lst[0] == "PROTO") |
219 if (lst[0] == "PROTO") |
220 return ; |
220 return ; |
221 |
221 |
222 if (lst[0] == "ERROR") { |
222 if (lst[0] == "ERROR") { |
223 if (lst.size() == 2) |
223 if (lst.size() == 2) |
224 emit showMessage("Error: " + lst[1]); |
224 emit showMessage("Error: " + lst[1]); |
225 else |
225 else |
226 emit showMessage("Unknown error"); |
226 emit showMessage("Unknown error"); |
227 return; |
227 return; |
228 } |
228 } |
229 |
229 |
230 if (lst[0] == "WARNING") { |
230 if (lst[0] == "WARNING") { |
231 if (lst.size() == 2) |
231 if (lst.size() == 2) |
232 emit showMessage("Warning: " + lst[1]); |
232 emit showMessage("Warning: " + lst[1]); |
233 else |
233 else |
234 emit showMessage("Unknown warning"); |
234 emit showMessage("Unknown warning"); |
235 return; |
235 return; |
236 } |
236 } |
237 |
237 |
238 if (lst[0] == "CONNECTED") { |
238 if (lst[0] == "CONNECTED") { |
239 RawSendNet(QString("NICK%1%2").arg(delimeter).arg(mynick)); |
239 RawSendNet(QString("NICK%1%2").arg(delimeter).arg(mynick)); |
240 RawSendNet(QString("PROTO%1%2").arg(delimeter).arg(*cProtoVer)); |
240 RawSendNet(QString("PROTO%1%2").arg(delimeter).arg(*cProtoVer)); |
241 netClientState = 1; |
241 netClientState = 1; |
242 m_game_connected = true; |
242 m_game_connected = true; |
243 emit adminAccess(false); |
243 emit adminAccess(false); |
244 return; |
244 return; |
245 } |
245 } |
246 |
246 |
247 if (lst[0] == "PING") { |
247 if (lst[0] == "PING") { |
248 if (lst.size() > 1) |
248 if (lst.size() > 1) |
249 RawSendNet(QString("PONG%1%2").arg(delimeter).arg(lst[1])); |
249 RawSendNet(QString("PONG%1%2").arg(delimeter).arg(lst[1])); |
250 else |
250 else |
251 RawSendNet(QString("PONG")); |
251 RawSendNet(QString("PONG")); |
252 return; |
252 return; |
253 } |
253 } |
254 |
254 |
255 if (lst[0] == "ROOMS") { |
255 if (lst[0] == "ROOMS") { |
256 QStringList tmp = lst; |
256 QStringList tmp = lst; |
257 tmp.removeFirst(); |
257 tmp.removeFirst(); |
258 emit roomsList(tmp); |
258 emit roomsList(tmp); |
259 return; |
259 return; |
260 } |
260 } |
261 |
261 |
262 if (lst[0] == "SERVER_MESSAGE") { |
262 if (lst[0] == "SERVER_MESSAGE") { |
263 if(lst.size() < 2) |
263 if(lst.size() < 2) |
264 { |
264 { |
265 qWarning("Net: Empty SERVERMESSAGE message"); |
265 qWarning("Net: Empty SERVERMESSAGE message"); |
266 return; |
266 return; |
267 } |
267 } |
268 emit serverMessage(lst[1]); |
268 emit serverMessage(lst[1]); |
269 return; |
269 return; |
270 } |
270 } |
271 |
271 |
272 if (lst[0] == "CHAT") { |
272 if (lst[0] == "CHAT") { |
273 if(lst.size() < 3) |
273 if(lst.size() < 3) |
274 { |
274 { |
275 qWarning("Net: Empty CHAT message"); |
275 qWarning("Net: Empty CHAT message"); |
276 return; |
276 return; |
277 } |
277 } |
278 if (netClientState == 2) |
278 if (netClientState == 2) |
279 emit chatStringLobby(HWProto::formatChatMsg(lst[1], lst[2])); |
279 emit chatStringLobby(HWProto::formatChatMsg(lst[1], lst[2])); |
280 else |
280 else |
281 emit chatStringFromNet(HWProto::formatChatMsg(lst[1], lst[2])); |
281 emit chatStringFromNet(HWProto::formatChatMsg(lst[1], lst[2])); |
282 return; |
282 return; |
283 } |
283 } |
284 |
284 |
285 if (lst[0] == "INFO") { |
285 if (lst[0] == "INFO") { |
286 if(lst.size() < 5) |
286 if(lst.size() < 5) |
287 { |
287 { |
288 qWarning("Net: Malformed INFO message"); |
288 qWarning("Net: Malformed INFO message"); |
289 return; |
289 return; |
290 } |
290 } |
291 QStringList tmp = lst; |
291 QStringList tmp = lst; |
292 tmp.removeFirst(); |
292 tmp.removeFirst(); |
293 if (netClientState == 2) |
293 if (netClientState == 2) |
294 emit chatStringLobby(tmp.join("\n").prepend('\x01')); |
294 emit chatStringLobby(tmp.join("\n").prepend('\x01')); |
295 else |
295 else |
296 emit chatStringFromNet(tmp.join("\n").prepend('\x01')); |
296 emit chatStringFromNet(tmp.join("\n").prepend('\x01')); |
297 return; |
297 return; |
298 } |
298 } |
299 |
299 |
300 if (lst[0] == "READY") { |
300 if (lst[0] == "READY") { |
301 if(lst.size() < 2) |
301 if(lst.size() < 2) |
302 { |
302 { |
303 qWarning("Net: Malformed READY message"); |
303 qWarning("Net: Malformed READY message"); |
304 return; |
304 return; |
305 } |
305 } |
306 for(int i = 1; i < lst.size(); ++i) |
306 for(int i = 1; i < lst.size(); ++i) |
307 { |
307 { |
308 if (lst[i] == mynick) |
308 if (lst[i] == mynick) |
309 emit setMyReadyStatus(true); |
309 emit setMyReadyStatus(true); |
310 emit setReadyStatus(lst[i], true); |
310 emit setReadyStatus(lst[i], true); |
311 } |
311 } |
312 return; |
312 return; |
313 } |
313 } |
314 |
314 |
315 if (lst[0] == "NOT_READY") { |
315 if (lst[0] == "NOT_READY") { |
316 if(lst.size() < 2) |
316 if(lst.size() < 2) |
317 { |
317 { |
318 qWarning("Net: Malformed NOT_READY message"); |
318 qWarning("Net: Malformed NOT_READY message"); |
319 return; |
319 return; |
320 } |
320 } |
321 for(int i = 1; i < lst.size(); ++i) |
321 for(int i = 1; i < lst.size(); ++i) |
322 { |
322 { |
323 if (lst[i] == mynick) |
323 if (lst[i] == mynick) |
324 emit setMyReadyStatus(false); |
324 emit setMyReadyStatus(false); |
325 emit setReadyStatus(lst[i], false); |
325 emit setReadyStatus(lst[i], false); |
326 } |
326 } |
327 return; |
327 return; |
328 } |
328 } |
329 |
329 |
330 if (lst[0] == "ADD_TEAM") { |
330 if (lst[0] == "ADD_TEAM") { |
331 if(lst.size() != 24) |
331 if(lst.size() != 24) |
332 { |
332 { |
333 qWarning("Net: Bad ADDTEAM message"); |
333 qWarning("Net: Bad ADDTEAM message"); |
334 return; |
334 return; |
335 } |
335 } |
336 QStringList tmp = lst; |
336 QStringList tmp = lst; |
337 tmp.removeFirst(); |
337 tmp.removeFirst(); |
338 emit AddNetTeam(tmp); |
338 emit AddNetTeam(tmp); |
339 return; |
339 return; |
340 } |
340 } |
341 |
341 |
342 if (lst[0] == "REMOVE_TEAM") { |
342 if (lst[0] == "REMOVE_TEAM") { |
343 if(lst.size() != 2) |
343 if(lst.size() != 2) |
344 { |
344 { |
345 qWarning("Net: Bad REMOVETEAM message"); |
345 qWarning("Net: Bad REMOVETEAM message"); |
346 return; |
346 return; |
347 } |
347 } |
348 m_pTeamSelWidget->removeNetTeam(HWTeam(lst[1])); |
348 m_pTeamSelWidget->removeNetTeam(HWTeam(lst[1])); |
349 return; |
349 return; |
350 } |
350 } |
351 |
351 |
352 if(lst[0] == "ROOMABANDONED") { |
352 if(lst[0] == "ROOMABANDONED") { |
353 netClientState = 2; |
353 netClientState = 2; |
354 emit showMessage(HWNewNet::tr("Room destroyed")); |
354 emit showMessage(HWNewNet::tr("Room destroyed")); |
355 emit LeftRoom(); |
355 emit LeftRoom(); |
356 return; |
356 return; |
357 } |
357 } |
358 |
358 |
359 if(lst[0] == "KICKED") { |
359 if(lst[0] == "KICKED") { |
360 netClientState = 2; |
360 netClientState = 2; |
361 emit showMessage(HWNewNet::tr("You got kicked")); |
361 emit showMessage(HWNewNet::tr("You got kicked")); |
362 emit LeftRoom(); |
362 emit LeftRoom(); |
363 return; |
363 return; |
364 } |
364 } |
365 |
365 |
366 if(lst[0] == "JOINED") { |
366 if(lst[0] == "JOINED") { |
367 if(lst.size() < 2) |
367 if(lst.size() < 2) |
368 { |
368 { |
369 qWarning("Net: Bad JOINED message"); |
369 qWarning("Net: Bad JOINED message"); |
370 return; |
370 return; |
371 } |
371 } |
372 |
372 |
373 for(int i = 1; i < lst.size(); ++i) |
373 for(int i = 1; i < lst.size(); ++i) |
374 { |
374 { |
375 if (lst[i] == mynick) |
375 if (lst[i] == mynick) |
376 { |
376 { |
377 netClientState = 3; |
377 netClientState = 3; |
378 emit EnteredGame(); |
378 emit EnteredGame(); |
379 emit roomMaster(isChief); |
379 emit roomMaster(isChief); |
380 if (isChief) |
380 if (isChief) |
381 emit configAsked(); |
381 emit configAsked(); |
382 } |
382 } |
383 emit nickAdded(lst[i], isChief && (lst[i] != mynick)); |
383 emit nickAdded(lst[i], isChief && (lst[i] != mynick)); |
384 emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i])); |
384 emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i])); |
385 } |
385 } |
386 return; |
386 return; |
387 } |
387 } |
388 |
388 |
389 if(lst[0] == "LOBBY:JOINED") { |
389 if(lst[0] == "LOBBY:JOINED") { |
390 if(lst.size() < 2) |
390 if(lst.size() < 2) |
391 { |
391 { |
392 qWarning("Net: Bad JOINED message"); |
392 qWarning("Net: Bad JOINED message"); |
393 return; |
393 return; |
394 } |
394 } |
395 |
395 |
396 for(int i = 1; i < lst.size(); ++i) |
396 for(int i = 1; i < lst.size(); ++i) |
397 { |
397 { |
398 if (lst[i] == mynick) |
398 if (lst[i] == mynick) |
399 { |
399 { |
400 netClientState = 2; |
400 netClientState = 2; |
401 RawSendNet(QString("LIST")); |
401 RawSendNet(QString("LIST")); |
402 emit Connected(); |
402 emit Connected(); |
403 } |
403 } |
404 |
404 |
405 emit nickAddedLobby(lst[i], false); |
405 emit nickAddedLobby(lst[i], false); |
406 emit chatStringLobby(tr("%1 *** %2 has joined").arg('\x03').arg(lst[i])); |
406 emit chatStringLobby(tr("%1 *** %2 has joined").arg('\x03').arg(lst[i])); |
407 } |
407 } |
408 return; |
408 return; |
409 } |
409 } |
410 |
410 |
411 if(lst[0] == "LEFT") { |
411 if(lst[0] == "LEFT") { |
412 if(lst.size() < 2) |
412 if(lst.size() < 2) |
413 { |
413 { |
414 qWarning("Net: Bad LEFT message"); |
414 qWarning("Net: Bad LEFT message"); |
415 return; |
415 return; |
416 } |
416 } |
417 emit nickRemoved(lst[1]); |
417 emit nickRemoved(lst[1]); |
418 if (lst.size() < 3) |
418 if (lst.size() < 3) |
419 emit chatStringFromNet(tr("%1 *** %2 has left").arg('\x03').arg(lst[1])); |
419 emit chatStringFromNet(tr("%1 *** %2 has left").arg('\x03').arg(lst[1])); |
420 else |
420 else |
421 emit chatStringFromNet(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2])); |
421 emit chatStringFromNet(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2])); |
422 return; |
422 return; |
423 } |
423 } |
424 |
424 |
425 if(lst[0] == "ROOM") { |
425 if(lst[0] == "ROOM") { |
426 if(lst.size() < 2) |
426 if(lst.size() < 2) |
427 { |
427 { |
428 qWarning("Net: Bad ROOM message"); |
428 qWarning("Net: Bad ROOM message"); |
429 return; |
429 return; |
430 } |
430 } |
431 RawSendNet(QString("LIST")); |
431 RawSendNet(QString("LIST")); |
432 return; |
432 return; |
433 } |
433 } |
434 |
434 |
435 if(lst[0] == "LOBBY:LEFT") { |
435 if(lst[0] == "LOBBY:LEFT") { |
436 if(lst.size() < 2) |
436 if(lst.size() < 2) |
437 { |
437 { |
438 qWarning("Net: Bad LOBBY:LEFT message"); |
438 qWarning("Net: Bad LOBBY:LEFT message"); |
439 return; |
439 return; |
440 } |
440 } |
441 emit nickRemovedLobby(lst[1]); |
441 emit nickRemovedLobby(lst[1]); |
442 if (lst.size() < 3) |
442 if (lst.size() < 3) |
443 emit chatStringLobby(tr("%1 *** %2 has left").arg('\x03').arg(lst[1])); |
443 emit chatStringLobby(tr("%1 *** %2 has left").arg('\x03').arg(lst[1])); |
444 else |
444 else |
445 emit chatStringLobby(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2])); |
445 emit chatStringLobby(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2])); |
446 return; |
446 return; |
447 } |
447 } |
448 |
448 |
449 if (lst[0] == "RUN_GAME") { |
449 if (lst[0] == "RUN_GAME") { |
450 netClientState = 5; |
450 netClientState = 5; |
451 emit AskForRunGame(); |
451 emit AskForRunGame(); |
452 return; |
452 return; |
453 } |
453 } |
454 |
454 |
455 if (lst[0] == "ASKPASSWORD") { |
455 if (lst[0] == "ASKPASSWORD") { |
456 int passLength = config->value("net/passwordlength", 0).toInt(); |
456 int passLength = config->value("net/passwordlength", 0).toInt(); |
457 QString hash = config->value("net/passwordhash", "").toString(); |
457 QString hash = config->value("net/passwordhash", "").toString(); |
458 QString password = QInputDialog::getText(0, tr("Password"), tr("Your nickname %1 is\nregistered on Hedgewars.org\nPlease provide your password\nor pick another nickname:").arg(mynick), QLineEdit::Password, passLength==0?NULL:QString(passLength,'\0')); |
458 QString password = QInputDialog::getText(0, tr("Password"), tr("Your nickname %1 is\nregistered on Hedgewars.org\nPlease provide your password\nor pick another nickname:").arg(mynick), QLineEdit::Password, passLength==0?NULL:QString(passLength,'\0')); |
459 |
459 |
460 if (!passLength || password!=QString(passLength, '\0')) { |
460 if (!passLength || password!=QString(passLength, '\0')) { |
461 hash = QCryptographicHash::hash(password.toLatin1(), QCryptographicHash::Md5).toHex(); |
461 hash = QCryptographicHash::hash(password.toLatin1(), QCryptographicHash::Md5).toHex(); |
462 config->setValue("net/passwordhash", hash); |
462 config->setValue("net/passwordhash", hash); |
463 config->setValue("net/passwordlength", password.size()); |
463 config->setValue("net/passwordlength", password.size()); |
464 } |
464 } |
465 |
465 |
466 RawSendNet(QString("PASSWORD%1%2").arg(delimeter).arg(hash)); |
466 RawSendNet(QString("PASSWORD%1%2").arg(delimeter).arg(hash)); |
467 return; |
467 return; |
468 } |
468 } |
469 |
469 |
470 if (lst[0] == "TEAM_ACCEPTED") { |
470 if (lst[0] == "TEAM_ACCEPTED") { |
471 if (lst.size() != 2) |
471 if (lst.size() != 2) |
472 { |
472 { |
473 qWarning("Net: Bad TEAM_ACCEPTED message"); |
473 qWarning("Net: Bad TEAM_ACCEPTED message"); |
474 return; |
474 return; |
475 } |
475 } |
476 m_pTeamSelWidget->changeTeamStatus(lst[1]); |
476 m_pTeamSelWidget->changeTeamStatus(lst[1]); |
477 return; |
477 return; |
478 } |
478 } |
479 |
479 |
480 |
480 |
481 if (lst[0] == "CFG") { |
481 if (lst[0] == "CFG") { |
482 if(lst.size() < 3) |
482 if(lst.size() < 3) |
483 { |
483 { |
484 qWarning("Net: Bad CFG message"); |
484 qWarning("Net: Bad CFG message"); |
485 return; |
485 return; |
486 } |
486 } |
487 QStringList tmp = lst; |
487 QStringList tmp = lst; |
488 tmp.removeFirst(); |
488 tmp.removeFirst(); |
489 tmp.removeFirst(); |
489 tmp.removeFirst(); |
490 if (lst[1] == "SCHEME") |
490 if (lst[1] == "SCHEME") |
491 emit netSchemeConfig(tmp); |
491 emit netSchemeConfig(tmp); |
492 else |
492 else |
493 emit paramChanged(lst[1], tmp); |
493 emit paramChanged(lst[1], tmp); |
494 return; |
494 return; |
495 } |
495 } |
496 |
496 |
497 if (lst[0] == "HH_NUM") { |
497 if (lst[0] == "HH_NUM") { |
498 if (lst.size() != 3) |
498 if (lst.size() != 3) |
499 { |
499 { |
500 qWarning("Net: Bad TEAM_ACCEPTED message"); |
500 qWarning("Net: Bad TEAM_ACCEPTED message"); |
501 return; |
501 return; |
502 } |
502 } |
503 HWTeam tmptm(lst[1]); |
503 HWTeam tmptm(lst[1]); |
504 tmptm.numHedgehogs = lst[2].toUInt(); |
504 tmptm.numHedgehogs = lst[2].toUInt(); |
505 emit hhnumChanged(tmptm); |
505 emit hhnumChanged(tmptm); |
506 return; |
506 return; |
507 } |
507 } |
508 |
508 |
509 if (lst[0] == "TEAM_COLOR") { |
509 if (lst[0] == "TEAM_COLOR") { |
510 if (lst.size() != 3) |
510 if (lst.size() != 3) |
511 { |
511 { |
512 qWarning("Net: Bad TEAM_COLOR message"); |
512 qWarning("Net: Bad TEAM_COLOR message"); |
513 return; |
513 return; |
514 } |
514 } |
515 HWTeam tmptm(lst[1]); |
515 HWTeam tmptm(lst[1]); |
516 tmptm.teamColor = QColor(lst[2]); |
516 tmptm.teamColor = QColor(lst[2]); |
517 emit teamColorChanged(tmptm); |
517 emit teamColorChanged(tmptm); |
518 return; |
518 return; |
519 } |
519 } |
520 |
520 |
521 if (lst[0] == "EM") { |
521 if (lst[0] == "EM") { |
522 if(lst.size() < 2) |
522 if(lst.size() < 2) |
523 { |
523 { |
524 qWarning("Net: Bad EM message"); |
524 qWarning("Net: Bad EM message"); |
525 return; |
525 return; |
526 } |
526 } |
527 for(int i = 1; i < lst.size(); ++i) |
527 for(int i = 1; i < lst.size(); ++i) |
528 { |
528 { |
529 QByteArray em = QByteArray::fromBase64(lst[i].toAscii()); |
529 QByteArray em = QByteArray::fromBase64(lst[i].toAscii()); |
530 emit FromNet(em); |
530 emit FromNet(em); |
531 } |
531 } |
532 return; |
532 return; |
533 } |
533 } |
534 |
534 |
535 if (lst[0] == "BYE") { |
535 if (lst[0] == "BYE") { |
536 if (lst.size() < 2) |
536 if (lst.size() < 2) |
537 { |
537 { |
538 qWarning("Net: Bad BYE message"); |
538 qWarning("Net: Bad BYE message"); |
539 return; |
539 return; |
540 } |
540 } |
541 emit showMessage(HWNewNet::tr("Quit reason: ") + lst[1]); |
541 emit showMessage(HWNewNet::tr("Quit reason: ") + lst[1]); |
542 return; |
542 return; |
543 } |
543 } |
544 |
544 |
545 |
545 |
546 if (lst[0] == "ADMIN_ACCESS") { |
546 if (lst[0] == "ADMIN_ACCESS") { |
547 emit adminAccess(true); |
547 emit adminAccess(true); |
548 return; |
548 return; |
549 } |
549 } |
550 |
550 |
551 if (lst[0] == "ROOM_CONTROL_ACCESS") { |
551 if (lst[0] == "ROOM_CONTROL_ACCESS") { |
552 if (lst.size() < 2) |
552 if (lst.size() < 2) |
553 { |
553 { |
554 qWarning("Net: Bad BYE message"); |
554 qWarning("Net: Bad BYE message"); |
555 return; |
555 return; |
556 } |
556 } |
557 bool b = lst[1] != "0"; |
557 bool b = lst[1] != "0"; |
558 m_pGameCFGWidget->setEnabled(b); |
558 m_pGameCFGWidget->setEnabled(b); |
559 m_pTeamSelWidget->setInteractivity(b); |
559 m_pTeamSelWidget->setInteractivity(b); |
560 isChief = b; |
560 isChief = b; |
561 emit roomMaster(isChief); |
561 emit roomMaster(isChief); |
562 |
562 |
563 return; |
563 return; |
564 } |
564 } |
565 |
565 |
566 qWarning() << "Net: Unknown message:" << lst; |
566 qWarning() << "Net: Unknown message:" << lst; |
567 } |
567 } |
568 |
568 |
569 void HWNewNet::onHedgehogsNumChanged(const HWTeam& team) |
569 void HWNewNet::onHedgehogsNumChanged(const HWTeam& team) |
570 { |
570 { |
571 if (isChief) |
571 if (isChief) |
572 RawSendNet(QString("HH_NUM%1%2%1%3") |
572 RawSendNet(QString("HH_NUM%1%2%1%3") |
573 .arg(delimeter) |
573 .arg(delimeter) |
574 .arg(team.TeamName) |
574 .arg(team.TeamName) |
575 .arg(team.numHedgehogs)); |
575 .arg(team.numHedgehogs)); |
576 } |
576 } |
577 |
577 |
578 void HWNewNet::onTeamColorChanged(const HWTeam& team) |
578 void HWNewNet::onTeamColorChanged(const HWTeam& team) |
579 { |
579 { |
580 if (isChief) |
580 if (isChief) |
581 RawSendNet(QString("TEAM_COLOR%1%2%1%3") |
581 RawSendNet(QString("TEAM_COLOR%1%2%1%3") |
582 .arg(delimeter) |
582 .arg(delimeter) |
583 .arg(team.TeamName) |
583 .arg(team.TeamName) |
584 .arg(team.teamColor.name())); |
584 .arg(team.teamColor.name())); |
585 } |
585 } |
586 |
586 |
587 void HWNewNet::onParamChanged(const QString & param, const QStringList & value) |
587 void HWNewNet::onParamChanged(const QString & param, const QStringList & value) |
588 { |
588 { |
589 if (isChief) |
589 if (isChief) |
590 RawSendNet( |
590 RawSendNet( |
591 QString("CFG%1%2%1%3") |
591 QString("CFG%1%2%1%3") |
592 .arg(delimeter) |
592 .arg(delimeter) |
593 .arg(param) |
593 .arg(param) |
594 .arg(value.join(QString(delimeter))) |
594 .arg(value.join(QString(delimeter))) |
595 ); |
595 ); |
596 } |
596 } |
597 |
597 |
598 void HWNewNet::chatLineToNet(const QString& str) |
598 void HWNewNet::chatLineToNet(const QString& str) |
599 { |
599 { |
600 if(str != "") { |
600 if(str != "") { |
601 RawSendNet(QString("CHAT") + delimeter + str); |
601 RawSendNet(QString("CHAT") + delimeter + str); |
602 emit(chatStringFromMe(HWProto::formatChatMsg(mynick, str))); |
602 emit(chatStringFromMe(HWProto::formatChatMsg(mynick, str))); |
603 } |
603 } |
604 } |
604 } |
605 |
605 |
606 void HWNewNet::chatLineToLobby(const QString& str) |
606 void HWNewNet::chatLineToLobby(const QString& str) |
607 { |
607 { |
608 if(str != "") { |
608 if(str != "") { |
609 RawSendNet(QString("CHAT") + delimeter + str); |
609 RawSendNet(QString("CHAT") + delimeter + str); |
610 emit(chatStringFromMeLobby(HWProto::formatChatMsg(mynick, str))); |
610 emit(chatStringFromMeLobby(HWProto::formatChatMsg(mynick, str))); |
611 } |
611 } |
612 } |
612 } |
613 |
613 |
614 void HWNewNet::SendTeamMessage(const QString& str) |
614 void HWNewNet::SendTeamMessage(const QString& str) |
615 { |
615 { |
616 RawSendNet(QString("TEAMCHAT") + delimeter + str); |
616 RawSendNet(QString("TEAMCHAT") + delimeter + str); |
617 } |
617 } |
618 |
618 |
619 void HWNewNet::askRoomsList() |
619 void HWNewNet::askRoomsList() |
620 { |
620 { |
621 if(netClientState != 2) |
621 if(netClientState != 2) |
622 { |
622 { |
623 qWarning("Illegal try to get rooms list!"); |
623 qWarning("Illegal try to get rooms list!"); |
624 return; |
624 return; |
625 } |
625 } |
626 RawSendNet(QString("LIST")); |
626 RawSendNet(QString("LIST")); |
627 } |
627 } |
628 |
628 |
629 int HWNewNet::getClientState() |
629 int HWNewNet::getClientState() |
630 { |
630 { |
631 return netClientState; |
631 return netClientState; |
632 } |
632 } |
633 |
633 |
634 QString HWNewNet::getNick() |
634 QString HWNewNet::getNick() |
635 { |
635 { |
636 return mynick; |
636 return mynick; |
637 } |
637 } |
638 |
638 |
639 QString HWNewNet::getRoom() |
639 QString HWNewNet::getRoom() |
640 { |
640 { |
641 return myroom; |
641 return myroom; |
642 } |
642 } |
643 |
643 |
644 QString HWNewNet::getHost() |
644 QString HWNewNet::getHost() |
645 { |
645 { |
646 return myhost; |
646 return myhost; |
647 } |
647 } |
648 |
648 |
649 bool HWNewNet::isRoomChief() |
649 bool HWNewNet::isRoomChief() |
650 { |
650 { |
651 return isChief; |
651 return isChief; |
652 } |
652 } |
653 |
653 |
654 void HWNewNet::gameFinished() |
654 void HWNewNet::gameFinished() |
655 { |
655 { |
656 if (netClientState == 5) netClientState = 3; |
656 if (netClientState == 5) netClientState = 3; |
657 RawSendNet(QString("ROUNDFINISHED")); |
657 RawSendNet(QString("ROUNDFINISHED")); |
658 } |
658 } |
659 |
659 |
660 void HWNewNet::banPlayer(const QString & nick) |
660 void HWNewNet::banPlayer(const QString & nick) |
661 { |
661 { |
662 RawSendNet(QString("BAN%1%2").arg(delimeter).arg(nick)); |
662 RawSendNet(QString("BAN%1%2").arg(delimeter).arg(nick)); |
663 } |
663 } |
664 |
664 |
665 void HWNewNet::kickPlayer(const QString & nick) |
665 void HWNewNet::kickPlayer(const QString & nick) |
666 { |
666 { |
667 RawSendNet(QString("KICK%1%2").arg(delimeter).arg(nick)); |
667 RawSendNet(QString("KICK%1%2").arg(delimeter).arg(nick)); |
668 } |
668 } |
669 |
669 |
670 void HWNewNet::infoPlayer(const QString & nick) |
670 void HWNewNet::infoPlayer(const QString & nick) |
671 { |
671 { |
672 RawSendNet(QString("INFO%1%2").arg(delimeter).arg(nick)); |
672 RawSendNet(QString("INFO%1%2").arg(delimeter).arg(nick)); |
673 } |
673 } |
674 |
674 |
675 void HWNewNet::followPlayer(const QString & nick) |
675 void HWNewNet::followPlayer(const QString & nick) |
676 { |
676 { |
677 if (!isInRoom()) { |
677 if (!isInRoom()) { |
678 RawSendNet(QString("FOLLOW%1%2").arg(delimeter).arg(nick)); |
678 RawSendNet(QString("FOLLOW%1%2").arg(delimeter).arg(nick)); |
679 isChief = false; |
679 isChief = false; |
680 } |
680 } |
681 } |
681 } |
682 |
682 |
683 void HWNewNet::startGame() |
683 void HWNewNet::startGame() |
684 { |
684 { |
685 RawSendNet(QString("START_GAME")); |
685 RawSendNet(QString("START_GAME")); |
686 } |
686 } |
687 |
687 |
688 void HWNewNet::toggleRestrictJoins() |
688 void HWNewNet::toggleRestrictJoins() |
689 { |
689 { |
690 RawSendNet(QString("TOGGLE_RESTRICT_JOINS")); |
690 RawSendNet(QString("TOGGLE_RESTRICT_JOINS")); |
691 } |
691 } |
692 |
692 |
693 void HWNewNet::toggleRestrictTeamAdds() |
693 void HWNewNet::toggleRestrictTeamAdds() |
694 { |
694 { |
695 RawSendNet(QString("TOGGLE_RESTRICT_TEAMS")); |
695 RawSendNet(QString("TOGGLE_RESTRICT_TEAMS")); |
696 } |
696 } |
697 |
697 |
698 void HWNewNet::clearAccountsCache() |
698 void HWNewNet::clearAccountsCache() |
699 { |
699 { |
700 RawSendNet(QString("CLEAR_ACCOUNTS_CACHE")); |
700 RawSendNet(QString("CLEAR_ACCOUNTS_CACHE")); |
701 } |
701 } |
702 |
702 |
703 void HWNewNet::partRoom() |
703 void HWNewNet::partRoom() |
704 { |
704 { |
705 netClientState = 2; |
705 netClientState = 2; |
706 RawSendNet(QString("PART")); |
706 RawSendNet(QString("PART")); |
707 } |
707 } |
708 |
708 |
709 bool HWNewNet::isInRoom() |
709 bool HWNewNet::isInRoom() |
710 { |
710 { |
711 return netClientState > 2; |
711 return netClientState > 2; |
712 } |
712 } |
713 |
713 |
714 void HWNewNet::newServerMessage(const QString & msg) |
714 void HWNewNet::newServerMessage(const QString & msg) |
715 { |
715 { |
716 RawSendNet(QString("SET_SERVER_MESSAGE%1%2").arg(delimeter).arg(msg)); |
716 RawSendNet(QString("SET_SERVER_MESSAGE%1%2").arg(delimeter).arg(msg)); |
717 } |
717 } |