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 { |
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 } |