1 /* |
|
2 * Hedgewars, a free turn based strategy game |
|
3 * Copyright (c) 2006-2008 Igor Ulyanov <iulyanov@gmail.com> |
|
4 * Copyright (c) 2008-2011 Andrey Korotaev <unC0Rr@gmail.com> |
|
5 * |
|
6 * This program is free software; you can redistribute it and/or modify |
|
7 * it under the terms of the GNU General Public License as published by |
|
8 * the Free Software Foundation; version 2 of the License |
|
9 * |
|
10 * This program is distributed in the hope that it will be useful, |
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
13 * GNU General Public License for more details. |
|
14 * |
|
15 * You should have received a copy of the GNU General Public License |
|
16 * along with this program; if not, write to the Free Software |
|
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA |
|
18 */ |
|
19 |
|
20 #include <QDebug> |
|
21 #include <QInputDialog> |
|
22 #include <QCryptographicHash> |
|
23 |
|
24 #include "hwconsts.h" |
|
25 #include "newnetclient.h" |
|
26 #include "proto.h" |
|
27 #include "gameuiconfig.h" |
|
28 #include "game.h" |
|
29 #include "gamecfgwidget.h" |
|
30 #include "teamselect.h" |
|
31 #include "misc.h" |
|
32 /* only to get the ignoreList from the chat widget */ |
|
33 #include "hwform.h" |
|
34 #include "pageroomslist.h" |
|
35 #include "chatwidget.h" |
|
36 |
|
37 char delimeter='\n'; |
|
38 |
|
39 HWNewNet::HWNewNet(GameUIConfig * config, GameCFGWidget* pGameCFGWidget, TeamSelWidget* pTeamSelWidget) : |
|
40 config(config), |
|
41 m_pGameCFGWidget(pGameCFGWidget), |
|
42 m_pTeamSelWidget(pTeamSelWidget), |
|
43 isChief(false), |
|
44 m_game_connected(false), |
|
45 loginStep(0), |
|
46 netClientState(0) |
|
47 { |
|
48 // socket stuff |
|
49 connect(&NetSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); |
|
50 connect(&NetSocket, SIGNAL(connected()), this, SLOT(OnConnect())); |
|
51 connect(&NetSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnect())); |
|
52 connect(&NetSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, |
|
53 SLOT(displayError(QAbstractSocket::SocketError))); |
|
54 |
|
55 // config stuff |
|
56 connect(this, SIGNAL(paramChanged(const QString &, const QStringList &)), pGameCFGWidget, SLOT(setParam(const QString &, const QStringList &))); |
|
57 connect(pGameCFGWidget, SIGNAL(paramChanged(const QString &, const QStringList &)), this, SLOT(onParamChanged(const QString &, const QStringList &))); |
|
58 connect(this, SIGNAL(configAsked()), pGameCFGWidget, SLOT(fullNetConfig())); |
|
59 } |
|
60 |
|
61 HWNewNet::~HWNewNet() |
|
62 { |
|
63 if (m_game_connected) |
|
64 { |
|
65 RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit")); |
|
66 emit Disconnected(); |
|
67 } |
|
68 NetSocket.flush(); |
|
69 } |
|
70 |
|
71 void HWNewNet::Connect(const QString & hostName, quint16 port, const QString & nick) |
|
72 { |
|
73 mynick = nick; |
|
74 while (mynick.isEmpty()) { |
|
75 mynick = QInputDialog::getText(m_pGameCFGWidget, |
|
76 QObject::tr("Nickname"), |
|
77 QObject::tr("Please enter your nickname"), |
|
78 QLineEdit::Normal, |
|
79 QDir::home().dirName()); |
|
80 config->setValue("net/nick",mynick); |
|
81 config->updNetNick(); |
|
82 } |
|
83 myhost = hostName + QString(":%1").arg(port); |
|
84 NetSocket.connectToHost(hostName, port); |
|
85 } |
|
86 |
|
87 void HWNewNet::Disconnect() |
|
88 { |
|
89 if (m_game_connected) |
|
90 RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit")); |
|
91 m_game_connected = false; |
|
92 |
|
93 NetSocket.disconnectFromHost(); |
|
94 } |
|
95 |
|
96 void HWNewNet::CreateRoom(const QString & room) |
|
97 { |
|
98 if(netClientState != 2) |
|
99 { |
|
100 qWarning("Illegal try to create room!"); |
|
101 return; |
|
102 } |
|
103 |
|
104 myroom = room; |
|
105 |
|
106 RawSendNet(QString("CREATE_ROOM%1%2").arg(delimeter).arg(room)); |
|
107 isChief = true; |
|
108 } |
|
109 |
|
110 void HWNewNet::JoinRoom(const QString & room) |
|
111 { |
|
112 if(netClientState != 2) |
|
113 { |
|
114 qWarning("Illegal try to join room!"); |
|
115 return; |
|
116 } |
|
117 |
|
118 myroom = room; |
|
119 |
|
120 RawSendNet(QString("JOIN_ROOM%1%2").arg(delimeter).arg(room)); |
|
121 isChief = false; |
|
122 } |
|
123 |
|
124 void HWNewNet::AddTeam(const HWTeam & team) |
|
125 { |
|
126 QString cmd = QString("ADD_TEAM") + delimeter + |
|
127 team.TeamName + delimeter + |
|
128 team.teamColor.name() + delimeter + |
|
129 team.Grave + delimeter + |
|
130 team.Fort + delimeter + |
|
131 team.Voicepack + delimeter + |
|
132 team.Flag + delimeter + |
|
133 QString::number(team.difficulty); |
|
134 |
|
135 for(int i = 0; i < 8; ++i) |
|
136 { |
|
137 cmd.append(delimeter); |
|
138 cmd.append(team.Hedgehogs[i].Name); |
|
139 cmd.append(delimeter); |
|
140 cmd.append(team.Hedgehogs[i].Hat); |
|
141 } |
|
142 RawSendNet(cmd); |
|
143 } |
|
144 |
|
145 void HWNewNet::RemoveTeam(const HWTeam & team) |
|
146 { |
|
147 RawSendNet(QString("REMOVE_TEAM") + delimeter + team.TeamName); |
|
148 } |
|
149 |
|
150 void HWNewNet::ToggleReady() |
|
151 { |
|
152 RawSendNet(QString("TOGGLE_READY")); |
|
153 } |
|
154 |
|
155 void HWNewNet::SendNet(const QByteArray & buf) |
|
156 { |
|
157 QString msg = QString(buf.toBase64()); |
|
158 |
|
159 RawSendNet(QString("EM%1%2").arg(delimeter).arg(msg)); |
|
160 } |
|
161 |
|
162 void HWNewNet::RawSendNet(const QString & str) |
|
163 { |
|
164 RawSendNet(str.toUtf8()); |
|
165 } |
|
166 |
|
167 void HWNewNet::RawSendNet(const QByteArray & buf) |
|
168 { |
|
169 qDebug() << "Client: " << QString(buf).split("\n"); |
|
170 NetSocket.write(buf); |
|
171 NetSocket.write("\n\n", 2); |
|
172 } |
|
173 |
|
174 void HWNewNet::ClientRead() |
|
175 { |
|
176 while (NetSocket.canReadLine()) { |
|
177 QString s = QString::fromUtf8(NetSocket.readLine()); |
|
178 if (s.endsWith('\n')) s.chop(1); |
|
179 |
|
180 if (s.size() == 0) { |
|
181 ParseCmd(cmdbuf); |
|
182 cmdbuf.clear(); |
|
183 } else |
|
184 cmdbuf << s; |
|
185 } |
|
186 } |
|
187 |
|
188 void HWNewNet::OnConnect() |
|
189 { |
|
190 } |
|
191 |
|
192 void HWNewNet::OnDisconnect() |
|
193 { |
|
194 if(m_game_connected) emit Disconnected(); |
|
195 m_game_connected = false; |
|
196 } |
|
197 |
|
198 void HWNewNet::displayError(QAbstractSocket::SocketError socketError) |
|
199 { |
|
200 emit Disconnected(); |
|
201 m_game_connected = false; |
|
202 |
|
203 switch (socketError) { |
|
204 case QAbstractSocket::RemoteHostClosedError: |
|
205 break; |
|
206 case QAbstractSocket::HostNotFoundError: |
|
207 emit showMessage(tr("The host was not found. Please check the host name and port settings.")); |
|
208 break; |
|
209 case QAbstractSocket::ConnectionRefusedError: |
|
210 emit showMessage(tr("Connection refused")); |
|
211 break; |
|
212 default: |
|
213 emit showMessage(NetSocket.errorString()); |
|
214 } |
|
215 } |
|
216 |
|
217 void HWNewNet::ParseCmd(const QStringList & lst) |
|
218 { |
|
219 qDebug() << "Server: " << lst; |
|
220 |
|
221 if(!lst.size()) |
|
222 { |
|
223 qWarning("Net client: Bad message"); |
|
224 return; |
|
225 } |
|
226 |
|
227 if (lst[0] == "NICK") |
|
228 { |
|
229 mynick = lst[1]; |
|
230 return ; |
|
231 } |
|
232 |
|
233 if (lst[0] == "PROTO") |
|
234 return ; |
|
235 |
|
236 if (lst[0] == "ERROR") { |
|
237 if (lst.size() == 2) |
|
238 emit showMessage("Error: " + lst[1]); |
|
239 else |
|
240 emit showMessage("Unknown error"); |
|
241 return; |
|
242 } |
|
243 |
|
244 if (lst[0] == "WARNING") { |
|
245 if (lst.size() == 2) |
|
246 emit showMessage("Warning: " + lst[1]); |
|
247 else |
|
248 emit showMessage("Unknown warning"); |
|
249 return; |
|
250 } |
|
251 |
|
252 if (lst[0] == "CONNECTED") { |
|
253 if(lst.size() < 3 || lst[2].toInt() < cMinServerVersion) |
|
254 { |
|
255 // TODO: Warn user, disconnect |
|
256 qWarning() << "Server too old"; |
|
257 } |
|
258 |
|
259 RawSendNet(QString("NICK%1%2").arg(delimeter).arg(mynick)); |
|
260 RawSendNet(QString("PROTO%1%2").arg(delimeter).arg(*cProtoVer)); |
|
261 netClientState = 1; |
|
262 m_game_connected = true; |
|
263 emit adminAccess(false); |
|
264 return; |
|
265 } |
|
266 |
|
267 if (lst[0] == "PING") { |
|
268 if (lst.size() > 1) |
|
269 RawSendNet(QString("PONG%1%2").arg(delimeter).arg(lst[1])); |
|
270 else |
|
271 RawSendNet(QString("PONG")); |
|
272 return; |
|
273 } |
|
274 |
|
275 if (lst[0] == "ROOMS") { |
|
276 QStringList tmp = lst; |
|
277 tmp.removeFirst(); |
|
278 emit roomsList(tmp); |
|
279 return; |
|
280 } |
|
281 |
|
282 if (lst[0] == "SERVER_MESSAGE") { |
|
283 if(lst.size() < 2) |
|
284 { |
|
285 qWarning("Net: Empty SERVERMESSAGE message"); |
|
286 return; |
|
287 } |
|
288 emit serverMessage(lst[1]); |
|
289 return; |
|
290 } |
|
291 |
|
292 if (lst[0] == "CHAT") { |
|
293 if(lst.size() < 3) |
|
294 { |
|
295 qWarning("Net: Empty CHAT message"); |
|
296 return; |
|
297 } |
|
298 if (netClientState == 2) |
|
299 emit chatStringLobby(lst[1], HWProto::formatChatMsgForFrontend(lst[2])); |
|
300 else |
|
301 emit chatStringFromNet(HWProto::formatChatMsg(lst[1], lst[2])); |
|
302 return; |
|
303 } |
|
304 |
|
305 if (lst[0] == "INFO") { |
|
306 if(lst.size() < 5) |
|
307 { |
|
308 qWarning("Net: Malformed INFO message"); |
|
309 return; |
|
310 } |
|
311 QStringList tmp = lst; |
|
312 tmp.removeFirst(); |
|
313 if (netClientState == 2) |
|
314 emit chatStringLobby(tmp.join("\n").prepend('\x01')); |
|
315 else |
|
316 emit chatStringFromNet(tmp.join("\n").prepend('\x01')); |
|
317 return; |
|
318 } |
|
319 |
|
320 if (lst[0] == "SERVER_VARS") { |
|
321 QStringList tmp = lst; |
|
322 tmp.removeFirst(); |
|
323 while (tmp.size() >= 2) |
|
324 { |
|
325 if(tmp[0] == "MOTD_NEW") emit serverMessageNew(tmp[1]); |
|
326 else if(tmp[0] == "MOTD_OLD") emit serverMessageOld(tmp[1]); |
|
327 else if(tmp[0] == "LATEST_PROTO") emit latestProtocolVar(tmp[1].toInt()); |
|
328 |
|
329 tmp.removeFirst(); |
|
330 tmp.removeFirst(); |
|
331 } |
|
332 return; |
|
333 } |
|
334 |
|
335 if (lst[0] == "CLIENT_FLAGS") |
|
336 { |
|
337 if(lst.size() < 3 || lst[1].size() < 2) |
|
338 { |
|
339 qWarning("Net: Malformed CLIENT_FLAGS message"); |
|
340 return; |
|
341 } |
|
342 |
|
343 QString flags = lst[1]; |
|
344 bool setFlag = flags[0] == '+'; |
|
345 |
|
346 while(flags.size() > 1) |
|
347 { |
|
348 flags.remove(0, 1); |
|
349 char c = flags[0].toAscii(); |
|
350 |
|
351 switch(c) |
|
352 { |
|
353 case 'r': |
|
354 { |
|
355 for(int i = 2; i < lst.size(); ++i) |
|
356 { |
|
357 if (lst[i] == mynick) |
|
358 emit setMyReadyStatus(setFlag); |
|
359 emit setReadyStatus(lst[i], setFlag); |
|
360 } |
|
361 } |
|
362 } |
|
363 } |
|
364 |
|
365 return; |
|
366 } |
|
367 |
|
368 if (lst[0] == "ADD_TEAM") { |
|
369 if(lst.size() != 24) |
|
370 { |
|
371 qWarning("Net: Bad ADDTEAM message"); |
|
372 return; |
|
373 } |
|
374 QStringList tmp = lst; |
|
375 tmp.removeFirst(); |
|
376 emit AddNetTeam(tmp); |
|
377 return; |
|
378 } |
|
379 |
|
380 if (lst[0] == "REMOVE_TEAM") { |
|
381 if(lst.size() != 2) |
|
382 { |
|
383 qWarning("Net: Bad REMOVETEAM message"); |
|
384 return; |
|
385 } |
|
386 m_pTeamSelWidget->removeNetTeam(HWTeam(lst[1])); |
|
387 return; |
|
388 } |
|
389 |
|
390 if(lst[0] == "ROOMABANDONED") { |
|
391 netClientState = 2; |
|
392 emit showMessage(HWNewNet::tr("Room destroyed")); |
|
393 emit LeftRoom(); |
|
394 return; |
|
395 } |
|
396 |
|
397 if(lst[0] == "KICKED") { |
|
398 netClientState = 2; |
|
399 emit showMessage(HWNewNet::tr("You got kicked")); |
|
400 emit LeftRoom(); |
|
401 return; |
|
402 } |
|
403 |
|
404 if(lst[0] == "JOINED") { |
|
405 if(lst.size() < 2) |
|
406 { |
|
407 qWarning("Net: Bad JOINED message"); |
|
408 return; |
|
409 } |
|
410 |
|
411 for(int i = 1; i < lst.size(); ++i) |
|
412 { |
|
413 if (lst[i] == mynick) |
|
414 { |
|
415 netClientState = 3; |
|
416 emit EnteredGame(); |
|
417 emit roomMaster(isChief); |
|
418 if (isChief) |
|
419 emit configAsked(); |
|
420 } |
|
421 if (lst[i] != mynick && isChief && config->Form->ui.pageRoomsList->chatWidget->ignoreList.contains(lst[i], Qt::CaseInsensitive) && !config->Form->ui.pageRoomsList->chatWidget->friendsList.contains(lst[i], Qt::CaseInsensitive)) |
|
422 { |
|
423 kickPlayer(lst[i]); |
|
424 } |
|
425 else |
|
426 { |
|
427 emit nickAdded(lst[i], isChief && (lst[i] != mynick)); |
|
428 emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i])); |
|
429 } |
|
430 } |
|
431 return; |
|
432 } |
|
433 |
|
434 if(lst[0] == "LOBBY:JOINED") { |
|
435 if(lst.size() < 2) |
|
436 { |
|
437 qWarning("Net: Bad JOINED message"); |
|
438 return; |
|
439 } |
|
440 |
|
441 for(int i = 1; i < lst.size(); ++i) |
|
442 { |
|
443 if (lst[i] == mynick) |
|
444 { |
|
445 netClientState = 2; |
|
446 RawSendNet(QString("LIST")); |
|
447 emit Connected(); |
|
448 } |
|
449 |
|
450 emit nickAddedLobby(lst[i], false); |
|
451 emit chatStringLobby(lst[i], tr("%1 *** %2 has joined").arg('\x03').arg("|nick|")); |
|
452 } |
|
453 return; |
|
454 } |
|
455 |
|
456 if(lst[0] == "LEFT") { |
|
457 if(lst.size() < 2) |
|
458 { |
|
459 qWarning("Net: Bad LEFT message"); |
|
460 return; |
|
461 } |
|
462 emit nickRemoved(lst[1]); |
|
463 if (lst.size() < 3) |
|
464 emit chatStringFromNet(tr("%1 *** %2 has left").arg('\x03').arg(lst[1])); |
|
465 else |
|
466 emit chatStringFromNet(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2])); |
|
467 return; |
|
468 } |
|
469 |
|
470 if(lst[0] == "ROOM") { |
|
471 if(lst.size() < 2) |
|
472 { |
|
473 qWarning("Net: Bad ROOM message"); |
|
474 return; |
|
475 } |
|
476 RawSendNet(QString("LIST")); |
|
477 return; |
|
478 } |
|
479 |
|
480 if(lst[0] == "LOBBY:LEFT") { |
|
481 if(lst.size() < 2) |
|
482 { |
|
483 qWarning("Net: Bad LOBBY:LEFT message"); |
|
484 return; |
|
485 } |
|
486 emit nickRemovedLobby(lst[1]); |
|
487 if (lst.size() < 3) |
|
488 emit chatStringLobby(tr("%1 *** %2 has left").arg('\x03').arg(lst[1])); |
|
489 else |
|
490 emit chatStringLobby(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2])); |
|
491 return; |
|
492 } |
|
493 |
|
494 if (lst[0] == "RUN_GAME") { |
|
495 netClientState = 5; |
|
496 emit AskForRunGame(); |
|
497 return; |
|
498 } |
|
499 |
|
500 if (lst[0] == "BYE") { |
|
501 if (lst[1] == "Authentication failed") |
|
502 { |
|
503 // Set the password blank if case the user tries to join and enter his password again |
|
504 config->setValue("net/passwordlength", 0); |
|
505 config->setNetPasswordLength(0); |
|
506 } |
|
507 // return early so the user won't get an unknown error message dialog (the user already gets a server connection is lost one) |
|
508 return; |
|
509 } |
|
510 |
|
511 if (lst[0] == "ASKPASSWORD") { |
|
512 bool ok = false; |
|
513 int passLength = config->value("net/passwordlength", 0).toInt(); |
|
514 QString hash = config->value("net/passwordhash", "").toString(); |
|
515 |
|
516 // If the password is blank, ask the user to enter one in |
|
517 if (passLength == 0) |
|
518 { |
|
519 QString password = QInputDialog::getText(m_pGameCFGWidget, tr("Password"), tr("Your nickname %1 is\nregistered on Hedgewars.org\nPlease provide your password below\nor pick another nickname in game config:").arg(mynick), QLineEdit::Password, passLength==0?NULL:QString(passLength,'\0'), &ok); |
|
520 |
|
521 if (!ok) { |
|
522 Disconnect(); |
|
523 emit Disconnected(); |
|
524 return; |
|
525 } |
|
526 |
|
527 hash = QCryptographicHash::hash(password.toLatin1(), QCryptographicHash::Md5).toHex(); |
|
528 config->setValue("net/passwordhash", hash); |
|
529 config->setValue("net/passwordlength", password.size()); |
|
530 config->setNetPasswordLength(password.size()); |
|
531 } |
|
532 |
|
533 RawSendNet(QString("PASSWORD%1%2").arg(delimeter).arg(hash)); |
|
534 return; |
|
535 } |
|
536 |
|
537 if (lst[0] == "NOTICE") { |
|
538 if(lst.size() < 2) |
|
539 { |
|
540 qWarning("Net: Bad NOTICE message"); |
|
541 return; |
|
542 } |
|
543 |
|
544 bool ok; |
|
545 int n = lst[1].toInt(&ok); |
|
546 if(!ok) |
|
547 { |
|
548 qWarning("Net: Bad NOTICE message"); |
|
549 return; |
|
550 } |
|
551 |
|
552 handleNotice(n); |
|
553 |
|
554 return; |
|
555 } |
|
556 |
|
557 if (lst[0] == "TEAM_ACCEPTED") { |
|
558 if (lst.size() != 2) |
|
559 { |
|
560 qWarning("Net: Bad TEAM_ACCEPTED message"); |
|
561 return; |
|
562 } |
|
563 m_pTeamSelWidget->changeTeamStatus(lst[1]); |
|
564 return; |
|
565 } |
|
566 |
|
567 |
|
568 if (lst[0] == "CFG") { |
|
569 if(lst.size() < 3) |
|
570 { |
|
571 qWarning("Net: Bad CFG message"); |
|
572 return; |
|
573 } |
|
574 QStringList tmp = lst; |
|
575 tmp.removeFirst(); |
|
576 tmp.removeFirst(); |
|
577 if (lst[1] == "SCHEME") |
|
578 emit netSchemeConfig(tmp); |
|
579 else |
|
580 emit paramChanged(lst[1], tmp); |
|
581 return; |
|
582 } |
|
583 |
|
584 if (lst[0] == "HH_NUM") { |
|
585 if (lst.size() != 3) |
|
586 { |
|
587 qWarning("Net: Bad TEAM_ACCEPTED message"); |
|
588 return; |
|
589 } |
|
590 HWTeam tmptm(lst[1]); |
|
591 tmptm.numHedgehogs = lst[2].toUInt(); |
|
592 emit hhnumChanged(tmptm); |
|
593 return; |
|
594 } |
|
595 |
|
596 if (lst[0] == "TEAM_COLOR") { |
|
597 if (lst.size() != 3) |
|
598 { |
|
599 qWarning("Net: Bad TEAM_COLOR message"); |
|
600 return; |
|
601 } |
|
602 HWTeam tmptm(lst[1]); |
|
603 tmptm.teamColor = QColor(lst[2]); |
|
604 emit teamColorChanged(tmptm); |
|
605 return; |
|
606 } |
|
607 |
|
608 if (lst[0] == "EM") { |
|
609 if(lst.size() < 2) |
|
610 { |
|
611 qWarning("Net: Bad EM message"); |
|
612 return; |
|
613 } |
|
614 for(int i = 1; i < lst.size(); ++i) |
|
615 { |
|
616 QByteArray em = QByteArray::fromBase64(lst[i].toAscii()); |
|
617 emit FromNet(em); |
|
618 } |
|
619 return; |
|
620 } |
|
621 |
|
622 if (lst[0] == "BYE") { |
|
623 if (lst.size() < 2) |
|
624 { |
|
625 qWarning("Net: Bad BYE message"); |
|
626 return; |
|
627 } |
|
628 emit showMessage(HWNewNet::tr("Quit reason: ") + lst[1]); |
|
629 return; |
|
630 } |
|
631 |
|
632 |
|
633 if (lst[0] == "ADMIN_ACCESS") { |
|
634 emit adminAccess(true); |
|
635 return; |
|
636 } |
|
637 |
|
638 if (lst[0] == "ROOM_CONTROL_ACCESS") { |
|
639 if (lst.size() < 2) |
|
640 { |
|
641 qWarning("Net: Bad BYE message"); |
|
642 return; |
|
643 } |
|
644 bool b = lst[1] != "0"; |
|
645 m_pGameCFGWidget->setEnabled(b); |
|
646 m_pTeamSelWidget->setInteractivity(b); |
|
647 isChief = b; |
|
648 emit roomMaster(isChief); |
|
649 |
|
650 return; |
|
651 } |
|
652 |
|
653 qWarning() << "Net: Unknown message:" << lst; |
|
654 } |
|
655 |
|
656 void HWNewNet::onHedgehogsNumChanged(const HWTeam& team) |
|
657 { |
|
658 if (isChief) |
|
659 RawSendNet(QString("HH_NUM%1%2%1%3") |
|
660 .arg(delimeter) |
|
661 .arg(team.TeamName) |
|
662 .arg(team.numHedgehogs)); |
|
663 } |
|
664 |
|
665 void HWNewNet::onTeamColorChanged(const HWTeam& team) |
|
666 { |
|
667 if (isChief) |
|
668 RawSendNet(QString("TEAM_COLOR%1%2%1%3") |
|
669 .arg(delimeter) |
|
670 .arg(team.TeamName) |
|
671 .arg(team.teamColor.name())); |
|
672 } |
|
673 |
|
674 void HWNewNet::onParamChanged(const QString & param, const QStringList & value) |
|
675 { |
|
676 if (isChief) |
|
677 RawSendNet( |
|
678 QString("CFG%1%2%1%3") |
|
679 .arg(delimeter) |
|
680 .arg(param) |
|
681 .arg(value.join(QString(delimeter))) |
|
682 ); |
|
683 } |
|
684 |
|
685 void HWNewNet::chatLineToNet(const QString& str) |
|
686 { |
|
687 if(str != "") { |
|
688 RawSendNet(QString("CHAT") + delimeter + str); |
|
689 emit(chatStringFromMe(HWProto::formatChatMsg(mynick, str))); |
|
690 } |
|
691 } |
|
692 |
|
693 void HWNewNet::chatLineToLobby(const QString& str) |
|
694 { |
|
695 if(str != "") { |
|
696 RawSendNet(QString("CHAT") + delimeter + str); |
|
697 emit(chatStringFromMeLobby(HWProto::formatChatMsg(mynick, str))); |
|
698 } |
|
699 } |
|
700 |
|
701 void HWNewNet::SendTeamMessage(const QString& str) |
|
702 { |
|
703 RawSendNet(QString("TEAMCHAT") + delimeter + str); |
|
704 } |
|
705 |
|
706 void HWNewNet::askRoomsList() |
|
707 { |
|
708 if(netClientState != 2) |
|
709 { |
|
710 qWarning("Illegal try to get rooms list!"); |
|
711 return; |
|
712 } |
|
713 RawSendNet(QString("LIST")); |
|
714 } |
|
715 |
|
716 int HWNewNet::getClientState() |
|
717 { |
|
718 return netClientState; |
|
719 } |
|
720 |
|
721 QString HWNewNet::getNick() |
|
722 { |
|
723 return mynick; |
|
724 } |
|
725 |
|
726 QString HWNewNet::getRoom() |
|
727 { |
|
728 return myroom; |
|
729 } |
|
730 |
|
731 QString HWNewNet::getHost() |
|
732 { |
|
733 return myhost; |
|
734 } |
|
735 |
|
736 bool HWNewNet::isRoomChief() |
|
737 { |
|
738 return isChief; |
|
739 } |
|
740 |
|
741 void HWNewNet::gameFinished(bool correctly) |
|
742 { |
|
743 if (netClientState == 5) netClientState = 3; |
|
744 RawSendNet(QString("ROUNDFINISHED%1%2").arg(delimeter).arg(correctly ? "1" : "0")); |
|
745 } |
|
746 |
|
747 void HWNewNet::banPlayer(const QString & nick) |
|
748 { |
|
749 RawSendNet(QString("BAN%1%2").arg(delimeter).arg(nick)); |
|
750 } |
|
751 |
|
752 void HWNewNet::kickPlayer(const QString & nick) |
|
753 { |
|
754 RawSendNet(QString("KICK%1%2").arg(delimeter).arg(nick)); |
|
755 } |
|
756 |
|
757 void HWNewNet::infoPlayer(const QString & nick) |
|
758 { |
|
759 RawSendNet(QString("INFO%1%2").arg(delimeter).arg(nick)); |
|
760 } |
|
761 |
|
762 void HWNewNet::followPlayer(const QString & nick) |
|
763 { |
|
764 if (!isInRoom()) { |
|
765 RawSendNet(QString("FOLLOW%1%2").arg(delimeter).arg(nick)); |
|
766 isChief = false; |
|
767 } |
|
768 } |
|
769 |
|
770 void HWNewNet::startGame() |
|
771 { |
|
772 RawSendNet(QString("START_GAME")); |
|
773 } |
|
774 |
|
775 void HWNewNet::updateRoomName(const QString & name) |
|
776 { |
|
777 RawSendNet(QString("ROOM_NAME%1%2").arg(delimeter).arg(name)); |
|
778 } |
|
779 |
|
780 |
|
781 void HWNewNet::toggleRestrictJoins() |
|
782 { |
|
783 RawSendNet(QString("TOGGLE_RESTRICT_JOINS")); |
|
784 } |
|
785 |
|
786 void HWNewNet::toggleRestrictTeamAdds() |
|
787 { |
|
788 RawSendNet(QString("TOGGLE_RESTRICT_TEAMS")); |
|
789 } |
|
790 |
|
791 void HWNewNet::clearAccountsCache() |
|
792 { |
|
793 RawSendNet(QString("CLEAR_ACCOUNTS_CACHE")); |
|
794 } |
|
795 |
|
796 void HWNewNet::partRoom() |
|
797 { |
|
798 netClientState = 2; |
|
799 RawSendNet(QString("PART")); |
|
800 } |
|
801 |
|
802 bool HWNewNet::isInRoom() |
|
803 { |
|
804 return netClientState > 2; |
|
805 } |
|
806 |
|
807 void HWNewNet::setServerMessageNew(const QString & msg) |
|
808 { |
|
809 RawSendNet(QString("SET_SERVER_VAR%1MOTD_NEW%1%2").arg(delimeter).arg(msg)); |
|
810 } |
|
811 |
|
812 void HWNewNet::setServerMessageOld(const QString & msg) |
|
813 { |
|
814 RawSendNet(QString("SET_SERVER_VAR%1MOTD_OLD%1%2").arg(delimeter).arg(msg)); |
|
815 } |
|
816 |
|
817 void HWNewNet::setLatestProtocolVar(int proto) |
|
818 { |
|
819 RawSendNet(QString("SET_SERVER_VAR%1LATEST_PROTO%1%2").arg(delimeter).arg(proto)); |
|
820 } |
|
821 |
|
822 void HWNewNet::askServerVars() |
|
823 { |
|
824 RawSendNet(QString("GET_SERVER_VAR")); |
|
825 } |
|
826 |
|
827 void HWNewNet::handleNotice(int n) |
|
828 { |
|
829 switch(n) |
|
830 { |
|
831 case 0: |
|
832 { |
|
833 bool ok = false; |
|
834 QString newNick = QInputDialog::getText(0, tr("Nickname"), tr("Some one already uses\n your nickname %1\non the server.\nPlease pick another nickname:").arg(mynick), QLineEdit::Normal, mynick, &ok); |
|
835 |
|
836 if (!ok || newNick.isEmpty()) { |
|
837 Disconnect(); |
|
838 emit Disconnected(); |
|
839 return; |
|
840 } |
|
841 |
|
842 config->setValue("net/nick", newNick); |
|
843 config->updNetNick(); |
|
844 mynick = newNick; |
|
845 |
|
846 RawSendNet(QString("NICK%1%2").arg(delimeter).arg(newNick)); |
|
847 |
|
848 break; |
|
849 } |
|
850 } |
|
851 } |
|