QTfrontend/netclient.cpp
changeset 29 9311259d5242
parent 28 59f7db859b8a
child 31 99888245a4e8
equal deleted inserted replaced
28:59f7db859b8a 29:9311259d5242
    38 	: QObject()
    38 	: QObject()
    39 {
    39 {
    40 	state = nsDisconnected;
    40 	state = nsDisconnected;
    41 	IRCmsg_cmd_param = new QRegExp("^[A-Z]+ :.+$");
    41 	IRCmsg_cmd_param = new QRegExp("^[A-Z]+ :.+$");
    42 	IRCmsg_number_param = new QRegExp("^:\\S+ [0-9]{3} .+$");
    42 	IRCmsg_number_param = new QRegExp("^:\\S+ [0-9]{3} .+$");
       
    43 	IRCmsg_who_cmd_param = new QRegExp("^:\\S+ [A-Z]+ \\S+");
       
    44 	IRCmsg_who_cmd_param_text = new QRegExp("^:\\S+ [A-Z]+ \\S+ :.+$");
       
    45 	isOp = false;
    43 
    46 
    44 	connect(&NetSocket, SIGNAL(readyRead()), this, SLOT(ClientRead()));
    47 	connect(&NetSocket, SIGNAL(readyRead()), this, SLOT(ClientRead()));
    45 	connect(&NetSocket, SIGNAL(connected()), this, SLOT(OnConnect()));
    48 	connect(&NetSocket, SIGNAL(connected()), this, SLOT(OnConnect()));
    46 	connect(&NetSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnect()));
    49 	connect(&NetSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnect()));
    47 	connect(&NetSocket, SIGNAL(error(QAbstractSocket::SocketError)), this,
    50 	connect(&NetSocket, SIGNAL(error(QAbstractSocket::SocketError)), this,
    74 			QMessageBox::information(0, tr("Error"),
    77 			QMessageBox::information(0, tr("Error"),
    75 					NetSocket.errorString());
    78 					NetSocket.errorString());
    76     }
    79     }
    77 }
    80 }
    78 
    81 
    79 void HWNet::Connect(const QString & hostName, quint16 port)
    82 void HWNet::Connect(const QString & hostName, quint16 port, const QString & nick)
    80 {
    83 {
    81 	state = nsConnecting;
    84 	state = nsConnecting;
    82 	NetSocket.connectToHost(hostName, port);
    85 	NetSocket.connectToHost(hostName, port);
       
    86 	mynick = nick;
       
    87 	opnick = "";
       
    88 	opCount = 0;
    83 }
    89 }
    84 
    90 
    85 
    91 
    86 void HWNet::OnConnect()
    92 void HWNet::OnConnect()
    87 {
    93 {
    88 	state = nsConnected;
    94 	state = nsConnected;
    89 	SendNet(QString("USER hwgame 1 2 Hedgewars game"));
    95 	SendNet(QString("USER hwgame 1 2 Hedgewars game"));
    90 	SendNet(QString("NICK Hedgewars"));
    96 	SendNet(QString("NICK %1").arg(mynick));
    91 }
    97 }
    92 
    98 
    93 void HWNet::OnDisconnect()
    99 void HWNet::OnDisconnect()
    94 {
   100 {
    95 	state = nsDisconnected;
   101 	state = nsDisconnected;
    96 }
   102 }
    97 
   103 
    98 void HWNet::Perform()
   104 void HWNet::Perform()
    99 {
   105 {
   100 	SendNet(QString("LIST"));
   106 //	SendNet(QString("LIST"));
   101 	SendNet(QString("JOIN #hw"));
   107 	SendNet(QString("JOIN #alex"));
   102 }
   108 }
   103 
   109 
   104 void HWNet::Disconnect()
   110 void HWNet::Disconnect()
   105 {
   111 {
   106 	switch (state)
   112 	switch (state)
   135 	NetSocket.write("\x0d\x0a", 2);
   141 	NetSocket.write("\x0d\x0a", 2);
   136 }
   142 }
   137 
   143 
   138 void HWNet::ParseLine(const QString & msg)
   144 void HWNet::ParseLine(const QString & msg)
   139 {
   145 {
       
   146 	//QMessageBox::information(0, "", msg);
   140 	if (IRCmsg_cmd_param->exactMatch(msg))
   147 	if (IRCmsg_cmd_param->exactMatch(msg))
   141 	{
   148 	{
   142 		msgcmd_paramHandler(msg);
   149 		msgcmd_paramHandler(msg);
   143 	} else
   150 	} else
   144 	if (IRCmsg_number_param->exactMatch(msg))
   151 	if (IRCmsg_number_param->exactMatch(msg))
   145 	{
   152 	{
   146 		msgnumber_paramHandler(msg);
   153 		msgnumber_paramHandler(msg);
       
   154 	} else
       
   155 	if (IRCmsg_who_cmd_param->exactMatch(msg))
       
   156 	{
       
   157 		msgwho_cmd_paramHandler(msg);
       
   158 	} else
       
   159 	if (IRCmsg_who_cmd_param_text->exactMatch(msg))
       
   160 	{
       
   161 		msgwho_cmd_param_textHandler(msg);
   147 	}
   162 	}
   148 }
   163 }
   149 
   164 
   150 void HWNet::msgcmd_paramHandler(const QString & msg)
   165 void HWNet::msgcmd_paramHandler(const QString & msg)
   151 {
   166 {
   156 	}
   171 	}
   157 }
   172 }
   158 
   173 
   159 void HWNet::msgnumber_paramHandler(const QString & msg)
   174 void HWNet::msgnumber_paramHandler(const QString & msg)
   160 {
   175 {
   161 	QStringList list = msg.split(" ");
   176 	int pos = msg.indexOf(" :");
       
   177 	QString text = msg.mid(pos + 2);
       
   178 	QStringList list = msg.mid(0, pos).split(" ");
   162 	bool ok;
   179 	bool ok;
   163 	quint16 number = list[1].toInt(&ok);
   180 	quint16 number = list[1].toInt(&ok);
   164 	if (!ok)
   181 	if (!ok)
   165 		return ;
   182 		return ;
   166 	switch (number)
   183 	switch (number)
   169 		{
   186 		{
   170 			Perform();
   187 			Perform();
   171 			emit Connected();
   188 			emit Connected();
   172 			break;
   189 			break;
   173 		}
   190 		}
   174 		case 322 :
   191 		case 322 : // RPL_LIST
   175 		{
   192 		{
   176 			emit AddGame(list[3]);
   193 			emit AddGame(list[3]);
   177 		}
   194 			break;
   178 	}
   195 		}
   179 }
   196 		case 353 : // RPL_NAMREPLY
       
   197 		{
       
   198 			QStringList ops = text.split(" ").filter(QRegExp("^@\\S+$"));
       
   199 			opCount += ops.size();
       
   200 			if (ops.size() == 1)
       
   201 			{
       
   202 				opnick = ops[0].mid(1);
       
   203 			}
       
   204 			break;
       
   205 		}
       
   206 		case 366 : // RPL_ENDOFNAMES
       
   207 		{
       
   208 			if (opCount != 1)
       
   209 			{
       
   210 				opnick = "";
       
   211 			}
       
   212 			SendNet(QString("PRIVMSG #alex :%1 ops here").arg(opCount));
       
   213 			opCount = 0;
       
   214 			break;
       
   215 		}
       
   216 		case 432 : // ERR_ERRONEUSNICKNAME
       
   217 		case 433 : // ERR_NICKNAMEINUSE
       
   218 		{
       
   219 			// ask for another nick
       
   220 		}
       
   221 	}
       
   222 }
       
   223 
       
   224 void HWNet::msgwho_cmd_paramHandler(const QString & msg)
       
   225 {
       
   226 	QStringList list = msg.split(" ");
       
   227 	QString who = list[0].mid(1).split("!")[0];
       
   228 	if (list[1] == "NICK")
       
   229 	{
       
   230 		if (mynick == who)
       
   231 			mynick = list[2];
       
   232 		if (opnick == who)
       
   233 			opnick = list[2];
       
   234 	}
       
   235 }
       
   236 
       
   237 void HWNet::msgwho_cmd_param_textHandler(const QString & msg)
       
   238 {
       
   239 	int pos = msg.indexOf(" :");
       
   240 	QString text = msg.mid(pos + 2);
       
   241 	QStringList list = msg.mid(0, pos).split(" ");
       
   242 	QString who = list[0].mid(1).split("!")[0];
       
   243 	if (list[1] == "PRIVMSG")
       
   244 	{
       
   245 		SendNet(QString("PRIVMSG #alex :%1 said \"%2\" to %3").arg(who, text, list[2]));
       
   246 	}
       
   247 }