QTfrontend/newnetclient.cpp
changeset 2948 3f21a9dc93d0
parent 2821 67815ee123d7
child 3236 4ab3917d7d44
equal deleted inserted replaced
2947:803b277e4894 2948:3f21a9dc93d0
    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 }