// 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 {
+ // numeric commands are handled by the event system now
+ if(!num) {
emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", QString("Unknown: ") + cmd + " " + params.join(" "), prefix);
//qDebug() << prefix <<":"<<cmd<<params;
}
//******************************/
// 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))
return;
QString value = rawSupport.section("=", 1);
network()->addSupport(key, value);
}
+
+ /* determine our prefixes here to get an accurate result */
+ network()->determinePrefixes();
}
/* RPL_UMODEIS - "<user_modes> [<user_mode_params>]" */
ircuser->setRealName(serverDecode(params.last()));
emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is %2 (%3)") .arg(ircuser->nick()).arg(ircuser->hostmask()).arg(ircuser->realName()));
} else {
- emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is %2 (%3)") .arg(serverDecode(params[1])).arg(serverDecode(params[2])).arg(serverDecode(params.last())));
+ QString host = QString("%1!%2@%3").arg(serverDecode(params[0])).arg(serverDecode(params[1])).arg(serverDecode(params[2]));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is %2 (%3)") .arg(serverDecode(params[0])).arg(host).arg(serverDecode(params.last())));
}
}
QString nick = serverDecode(params[0]);
IrcUser *ircuser = network()->ircUser(nick);
+
+ QDateTime now = QDateTime::currentDateTime();
+ int idleSecs = serverDecode(params[1]).toInt();
+ idleSecs *= -1;
+
if(ircuser) {
- QDateTime now = QDateTime::currentDateTime();
- int idleSecs = serverDecode(params[1]).toInt();
- idleSecs *= -1;
ircuser->setIdleTime(now.addSecs(idleSecs));
if(params.size() > 3) { // if we have more then 3 params we have the above mentioned "real life" situation
int loginTime = serverDecode(params[2]).toInt();
emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is logged in since %2").arg(ircuser->nick()).arg(ircuser->loginTime().toString()));
}
emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is idling for %2 (%3)").arg(ircuser->nick()).arg(secondsToString(ircuser->idleTime().secsTo(now))).arg(ircuser->idleTime().toString()));
-
} else {
- emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] idle message: %1").arg(userDecode(nick, params).join(" ")));
+ QDateTime idleSince = now.addSecs(idleSecs);
+ if (params.size() > 3) { // we have a signon time
+ int loginTime = serverDecode(params[2]).toInt();
+ QDateTime datetime = QDateTime::fromTime_t(loginTime);
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is logged in since %2").arg(nick).arg(datetime.toString()));
+ }
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is idling for %2 (%3)").arg(nick).arg(secondsToString(idleSince.secsTo(now))).arg(idleSince.toString()));
}
}
emit displayMsg(Message::Server, BufferInfo::ChannelBuffer, channel, tr("Channel %1 created on %2").arg(channel, time.toString()));
}
+/* RPL_WHOISACCOUNT: "<nick> <account> :is authed as */
+void IrcServerHandler::handle330(const QString &prefix, const QList<QByteArray> ¶ms) {
+ Q_UNUSED(prefix);
+ if(!checkParamCount("IrcServerHandler::handle330()", params, 3))
+ return;
+
+ QString nick = serverDecode(params[0]);
+ QString account = serverDecode(params[1]);
+
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is authed as %2").arg(nick).arg(account));
+}
+
/* RPL_NOTOPIC */
void IrcServerHandler::handle331(const QString &prefix, const QList<QByteArray> ¶ms) {
Q_UNUSED(prefix);
tr("Topic set by %1 on %2") .arg(serverDecode(params[1]), QDateTime::fromTime_t(channelDecode(channel, params[2]).toUInt()).toString()));
}
+/* RPL_INVITING - "<nick> <channel>*/
+void IrcServerHandler::handle341(const QString &prefix, const QList<QByteArray> ¶ms) {
+ Q_UNUSED(prefix);
+ if(!checkParamCount("IrcServerHandler::handle341()", params, 2))
+ return;
+
+ QString nick = serverDecode(params[0]);
+
+ IrcChannel *channel = network()->ircChannel(serverDecode(params[1]));
+ if(!channel) {
+ 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()));
+}
+
/* RPL_WHOREPLY: "<channel> <user> <host> <server> <nick>
( "H" / "G" > ["*"] [ ( "@" / "+" ) ] :<hopcount> <real name>" */
void IrcServerHandler::handle352(const QString &prefix, const QList<QByteArray> ¶ms) {
#ifdef HAVE_QCA2
QByteArray IrcServerHandler::decrypt(const QString &bufferName, const QByteArray &message_, bool isTopic) {
- if(bufferName.isEmpty() || message_.isEmpty())
+ if(message_.isEmpty())
return message_;
- const QByteArray key = network()->cipherKey(bufferName);
- if(key.isEmpty())
+ Cipher *cipher = network()->cipher(bufferName);
+ if(!cipher)
return message_;
QByteArray message = message_;
-
- CoreIrcChannel *channel = qobject_cast<CoreIrcChannel *>(network()->ircChannel(bufferName));
- if(channel) {
- if(channel->cipher()->setKey(key))
- message = isTopic? channel->cipher()->decryptTopic(message) : channel->cipher()->decrypt(message);
- } else {
- CoreIrcUser *user = qobject_cast<CoreIrcUser *>(network()->ircUser(bufferName));
- if(user && user->cipher()->setKey(key))
- message = user->cipher()->decrypt(message);
- }
-
+ message = isTopic? cipher->decryptTopic(message) : cipher->decrypt(message);
return message;
}
#endif