QString foo = serverDecode(params.takeFirst());
// with SASL, the command is 'AUTHENTICATE +' and we should check for this here.
+ /* obsolete because of events
if(foo == QString("AUTHENTICATE +")) {
handleAuthenticate();
return;
}
-
+ */
// a colon as the first chars indicates the existence of a prefix
if(foo[0] == ':') {
foo.remove(0, 1);
void IrcServerHandler::defaultHandler(QString cmd, const QString &prefix, const QList<QByteArray> &rawparams) {
- // we assume that all this happens in server encoding
- QStringList params = serverDecode(rawparams);
- uint num = cmd.toUInt();
- if(num) {
- // A lot of server messages don't really need their own handler because they don't do much.
- // Catch and handle these here.
- switch(num) {
- // Welcome, status, info messages. Just display these.
- case 2: case 3: case 4: case 5: case 251: case 252: case 253: case 254: case 255: case 372: case 375:
- emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", params.join(" "), prefix);
- break;
- // Server error messages without param, just display them
- case 409: case 411: case 412: case 422: case 424: case 445: case 446: case 451: case 462:
- case 463: case 464: case 465: case 466: case 472: case 481: case 483: case 485: case 491: case 501: case 502:
- case 431: // ERR_NONICKNAMEGIVEN
- emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", params.join(" "), prefix);
- break;
- // Server error messages, display them in red. First param will be appended.
- case 401: {
- QString target = params.takeFirst();
- emit displayMsg(Message::Error, target, params.join(" ") + " " + target, prefix, Message::Redirected);
- break;
- }
- case 402: case 403: case 404: case 406: case 408: case 415: case 421: case 442: {
- QString channelName = params.takeFirst();
- emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", params.join(" ") + " " + channelName, prefix);
- break;
- }
- // Server error messages which will be displayed with a colon between the first param and the rest
- case 413: case 414: case 423: case 441: case 444: case 461: // FIXME see below for the 47x codes
- case 467: case 471: case 473: case 474: case 475: case 476: case 477: case 478: case 482:
- case 436: // ERR_NICKCOLLISION
- {
- QString p = params.takeFirst();
- emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", p + ": " + params.join(" "));
- break;
- }
- // Ignore these commands.
- case 321: case 366: case 376:
- break;
-
- case 903: case 904: case 905: case 906: case 907:
- {
- network()->putRawLine("CAP END");
- emit displayMsg(Message::Info, BufferInfo::StatusBuffer, "", "CAP: " + params.join(""));
- }
- // Everything else will be marked in red, so we can add them somewhere.
- default:
- if(_whois) {
- // many nets define their own WHOIS fields. we fetch those not in need of special attention here:
- emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", "[Whois] " + params.join(" "), prefix);
- } else {
- if(coreSession()->ircListHelper()->requestInProgress(network()->networkId()))
- coreSession()->ircListHelper()->reportError(params.join(" "));
- else
- emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", cmd + " " + params.join(" "), prefix);
- }
- }
- //qDebug() << prefix <<":"<<cmd<<params;
- } else {
- emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", QString("Unknown: ") + cmd + " " + params.join(" "), prefix);
- //qDebug() << prefix <<":"<<cmd<<params;
- }
+ // many commands are handled by the event system now
+ Q_UNUSED(cmd)
+ Q_UNUSED(prefix)
+ Q_UNUSED(rawparams)
}
//******************************/
// IRC SERVER HANDLER
//******************************/
-void IrcServerHandler::handleInvite(const QString &prefix, const QList<QByteArray> ¶ms) {
- if(!checkParamCount("IrcServerHandler::handleInvite()", params, 2))
- return;
-// qDebug() << "IrcServerHandler::handleInvite()" << prefix << params;
-
- IrcUser *ircuser = network()->updateNickFromMask(prefix);
- if(!ircuser) {
- return;
- }
-
- QString channel = serverDecode(params[1]);
-
- emit displayMsg(Message::Invite, BufferInfo::StatusBuffer, "", tr("%1 invited you to channel %2").arg(ircuser->nick()).arg(channel));
-}
void IrcServerHandler::handleJoin(const QString &prefix, const QList<QByteArray> ¶ms) {
if(!checkParamCount("IrcServerHandler::handleJoin()", params, 1))
}
}
-void IrcServerHandler::handleKick(const QString &prefix, const QList<QByteArray> ¶ms) {
- if(!checkParamCount("IrcServerHandler::handleKick()", params, 2))
- return;
-
- network()->updateNickFromMask(prefix);
- IrcUser *victim = network()->ircUser(params[1]);
- if(!victim)
- return;
-
- QString channel = serverDecode(params[0]);
- victim->partChannel(channel);
-
- QString msg;
- if(params.count() > 2) // someone got a reason!
- msg = QString("%1 %2").arg(victim->nick()).arg(channelDecode(channel, params[2]));
- else
- msg = victim->nick();
-
- emit displayMsg(Message::Kick, BufferInfo::ChannelBuffer, channel, msg, prefix);
- //if(network()->isMe(victim)) network()->setKickedFromChannel(channel);
-}
-
void IrcServerHandler::handleMode(const QString &prefix, const QList<QByteArray> ¶ms) {
if(!checkParamCount("IrcServerHandler::handleMode()", params, 2))
return;
}
}
-void IrcServerHandler::handleNick(const QString &prefix, const QList<QByteArray> ¶ms) {
- if(!checkParamCount("IrcServerHandler::handleNick()", params, 1))
- return;
-
- IrcUser *ircuser = network()->updateNickFromMask(prefix);
- if(!ircuser) {
- qWarning() << "IrcServerHandler::handleNick(): Unknown IrcUser!";
- return;
- }
- QString newnick = serverDecode(params[0]);
- QString oldnick = ircuser->nick();
-
- QString sender = network()->isMyNick(oldnick)
- ? newnick
- : prefix;
-
-
- // the order is cruicial
- // otherwise the client would rename the buffer, see that the assigned ircuser doesn't match anymore
- // and remove the ircuser from the querybuffer leading to a wrong on/offline state
- ircuser->setNick(newnick);
- coreSession()->renameBuffer(network()->networkId(), newnick, oldnick);
-
- foreach(QString channel, ircuser->channels())
- emit displayMsg(Message::Nick, BufferInfo::ChannelBuffer, channel, newnick, sender);
-}
-
void IrcServerHandler::handleNotice(const QString &prefix, const QList<QByteArray> ¶ms) {
if(!checkParamCount("IrcServerHandler::handleNotice()", params, 2))
return;
}
-void IrcServerHandler::handlePart(const QString &prefix, const QList<QByteArray> ¶ms) {
- if(!checkParamCount("IrcServerHandler::handlePart()", params, 1))
- return;
-
- IrcUser *ircuser = network()->updateNickFromMask(prefix);
- QString channel = serverDecode(params[0]);
- if(!ircuser) {
- qWarning() << "IrcServerHandler::handlePart(): Unknown IrcUser!";
- return;
- }
-
- ircuser->partChannel(channel);
-
- QString msg;
- if(params.count() > 1)
- msg = userDecode(ircuser->nick(), params[1]);
-
- emit displayMsg(Message::Part, BufferInfo::ChannelBuffer, channel, msg, prefix);
- if(network()->isMe(ircuser)) network()->setChannelParted(channel);
-}
-
void IrcServerHandler::handlePing(const QString &prefix, const QList<QByteArray> ¶ms) {
Q_UNUSED(prefix);
putCmd("PONG", params);
}
-void IrcServerHandler::handlePong(const QString &prefix, const QList<QByteArray> ¶ms) {
- Q_UNUSED(prefix);
- // the server is supposed to send back what we passed as param. and we send a timestamp
- // but using quote and whatnought one can send arbitrary pings, so we have to do some sanity checks
- if(params.count() < 2)
- return;
-
- QString timestamp = serverDecode(params[1]);
- QTime sendTime = QTime::fromString(timestamp, "hh:mm:ss.zzz");
- if(!sendTime.isValid()) {
- emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", "PONG " + serverDecode(params).join(" "), prefix);
- return;
- }
-
- network()->setLatency(sendTime.msecsTo(QTime::currentTime()) / 2);
-}
-
void IrcServerHandler::handlePrivmsg(const QString &prefix, const QList<QByteArray> ¶ms) {
if(!checkParamCount("IrcServerHandler::handlePrivmsg()", params, 1))
return;
}
}
-void IrcServerHandler::handleTopic(const QString &prefix, const QList<QByteArray> ¶ms) {
- if(!checkParamCount("IrcServerHandler::handleTopic()", params, 1))
- return;
-
- IrcUser *ircuser = network()->updateNickFromMask(prefix);
- if(!ircuser)
- return;
-
- IrcChannel *channel = network()->ircChannel(serverDecode(params[0]));
- if(!channel)
- return;
-
- QString topic;
- if(params.count() > 1) {
- QByteArray rawTopic = params[1];
-#ifdef HAVE_QCA2
- rawTopic = decrypt(channel->name(), rawTopic, true);
-#endif
- topic = channelDecode(channel->name(), rawTopic);
- }
-
- channel->setTopic(topic);
-
- emit displayMsg(Message::Topic, BufferInfo::ChannelBuffer, channel->name(), tr("%1 has changed topic for %2 to: \"%3\"").arg(ircuser->nick()).arg(channel->name()).arg(topic));
-}
-
-void IrcServerHandler::handleCap(const QString &prefix, const QList<QByteArray> ¶ms) {
- // for SASL, there will only be a single param of 'sasl', however you can check here for
- // additional CAP messages (ls, multi-prefix, et cetera).
-
- Q_UNUSED(prefix);
-
- if(params.size() == 3) {
- QString param = serverDecode(params[2]);
- if(param == QString("sasl")) { // SASL Ready
- network()->putRawLine(serverEncode("AUTHENTICATE PLAIN")); // Only working with PLAIN atm, blowfish later
- }
- }
-}
-
-void IrcServerHandler::handleAuthenticate() {
- QString construct = network()->saslAccount();
- construct.append(QChar(QChar::Null));
- construct.append(network()->saslAccount());
- construct.append(QChar(QChar::Null));
- construct.append(network()->saslPassword());
- QByteArray saslData = QByteArray(construct.toAscii().toBase64());
- saslData.prepend(QString("AUTHENTICATE ").toAscii());
- network()->putRawLine(saslData);
-}
-
-/* RPL_WELCOME */
-void IrcServerHandler::handle001(const QString &prefix, const QList<QByteArray> ¶ms) {
- network()->setCurrentServer(prefix);
-
- if(params.isEmpty()) {
- emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", QString("%1 didn't supply a valid welcome message... expect some serious issues..."));
- }
- // there should be only one param: "Welcome to the Internet Relay Network <nick>!<user>@<host>"
- QString param = serverDecode(params[0]);
- QString myhostmask = param.section(' ', -1, -1);
-
- network()->setMyNick(nickFromMask(myhostmask));
-
- emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", param, prefix);
-}
-
/* RPL_ISUPPORT */
// TODO Complete 005 handling, also use sensible defaults for non-sent stuff
void IrcServerHandler::handle005(const QString &prefix, const QList<QByteArray> ¶ms) {
network()->determinePrefixes();
}
-/* RPL_UMODEIS - "<user_modes> [<user_mode_params>]" */
-void IrcServerHandler::handle221(const QString &prefix, const QList<QByteArray> ¶ms) {
- Q_UNUSED(prefix)
- //TODO: save information in network object
- emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("%1").arg(serverDecode(params).join(" ")));
-}
-
-/* RPL_STATSCONN - "Highest connection cout: 8000 (7999 clients)" */
-void IrcServerHandler::handle250(const QString &prefix, const QList<QByteArray> ¶ms) {
- Q_UNUSED(prefix)
- //TODO: save information in network object
- emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("%1").arg(serverDecode(params).join(" ")));
-}
-
-/* RPL_LOCALUSERS - "Current local user: 5024 Max: 7999 */
-void IrcServerHandler::handle265(const QString &prefix, const QList<QByteArray> ¶ms) {
- Q_UNUSED(prefix)
- //TODO: save information in network object
- emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("%1").arg(serverDecode(params).join(" ")));
-}
-
-/* RPL_GLOBALUSERS - "Current global users: 46093 Max: 47650" */
-void IrcServerHandler::handle266(const QString &prefix, const QList<QByteArray> ¶ms) {
- Q_UNUSED(prefix)
- //TODO: save information in network object
- emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("%1").arg(serverDecode(params).join(" ")));
-}
-
/*
WHOIS-Message:
Replies 311 - 313, 317 - 319 are all replies generated in response to a WHOIS message.
QString nick = serverDecode(params[0]);
IrcUser *ircuser = network()->ircUser(nick);
-
+
QDateTime now = QDateTime::currentDateTime();
int idleSecs = serverDecode(params[1]).toInt();
idleSecs *= -1;
-
+
if(ircuser) {
ircuser->setIdleTime(now.addSecs(idleSecs));
if(params.size() > 3) { // if we have more then 3 params we have the above mentioned "real life" situation
qWarning() << "IrcServerHandler::handle341(): unknown channel:" << params[1];
return;
}
-
+
emit displayMsg(Message::Server, BufferInfo::ChannelBuffer, channel->name(), tr("%1 has been invited to %2").arg(nick).arg(channel->name()));
}