QTfrontend/newnetclient.cpp
changeset 6101 5a4ea2c7b9df
parent 5801 531f64292489
parent 6100 e6426c6b2882
child 6102 97565ab4afe9
equal deleted inserted replaced
5801:531f64292489 6101:5a4ea2c7b9df
     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 }