#include "ircuser.h"
#include "ircchannel.h"
+#include "logger.h"
#include <QDebug>
void IrcServerHandler::handleServerMsg(QByteArray msg) {
try {
if(msg.isEmpty()) {
- qWarning() << "Received empty string from server!";
+ quWarning() << "Received empty string from server!";
return;
}
QList<QByteArray> params = msg.split(' ');
if(!trailing.isEmpty()) params << trailing;
if(params.count() < 1) {
- qWarning() << "Received invalid string from server!";
+ quWarning() << "Received invalid string from server!";
return;
}
foo.remove(0, 1);
prefix = foo;
if(params.count() < 1) {
- qWarning() << "Received invalid string from server!";
+ quWarning() << "Received invalid string from server!";
return;
}
foo = serverDecode(params.takeFirst());
uint num = cmd.toUInt();
if(num > 0) {
if(params.count() == 0) {
- qWarning() << "Message received from server violates RFC and is ignored!";
+ quWarning() << "Message received from server violates RFC and is ignored!";
return;
}
params.removeFirst();
void IrcServerHandler::defaultHandler(QString cmd, const QString &prefix, const QList<QByteArray> &rawparams) {
// we assume that all this happens in server encoding
- QStringList params;
- foreach(QByteArray r, rawparams) params << serverDecode(r);
+ 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.
// Everything else will be marked in red, so we can add them somewhere.
default:
- emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", cmd + " " + params.join(" "), prefix);
+ 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(networkConnection()->coreSession()->ircListHelper()->requestInProgress(network()->networkId()))
+ networkConnection()->coreSession()->ircListHelper()->reportError(params.join(" "));
+ else
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", cmd + " " + params.join(" "), prefix);
+ }
}
//qDebug() << prefix <<":"<<cmd<<params;
} else {
emit displayMsg(Message::Mode, BufferInfo::ChannelBuffer, serverDecode(params[0]), serverDecode(params).join(" "), prefix);
IrcChannel *channel = network()->ircChannel(params[0]);
+ if(!channel) {
+ // we received mode information for a channel we're not in. that means probably we've just been kicked out or something like that
+ // anyways: we don't have a place to store the data --> discard the info.
+ return;
+ }
+
QString modes = params[1];
bool add = true;
int paramOffset = 2;
else
channel->removeUserMode(ircUser, QString(modes[c]));
} else {
- qWarning() << "Received MODE with too few parameters:" << serverDecode(params);
+ quWarning() << "Received MODE with too few parameters:" << serverDecode(params);
}
paramOffset++;
} else {
if(paramOffset < params.count()) {
value = params[paramOffset];
} else {
- qWarning() << "Received MODE with too few parameters:" << serverDecode(params);
+ quWarning() << "Received MODE with too few parameters:" << serverDecode(params);
}
paramOffset++;
}
IrcUser *ircuser = network()->updateNickFromMask(prefix);
if(!ircuser) {
- qWarning() << "IrcServerHandler::handleNick(): Unknown IrcUser!";
+ quWarning() << "IrcServerHandler::handleNick(): Unknown IrcUser!";
return;
}
QString newnick = serverDecode(params[0]);
IrcUser *ircuser = network()->updateNickFromMask(prefix);
QString channel = serverDecode(params[0]);
if(!ircuser) {
- qWarning() << "IrcServerHandler::handlePart(): Unknown IrcUser!";
+ quWarning() << "IrcServerHandler::handlePart(): Unknown IrcUser!";
return;
}
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;
IrcUser *ircuser = network()->updateNickFromMask(prefix);
if(!ircuser) {
- qWarning() << "IrcServerHandler::handlePrivmsg(): Unknown IrcUser!";
+ quWarning() << "IrcServerHandler::handlePrivmsg(): Unknown IrcUser!";
return;
}
if(params.isEmpty()) {
- qWarning() << "IrcServerHandler::handlePrivmsg(): received PRIVMSG without target or message from:" << prefix;
+ quWarning() << "IrcServerHandler::handlePrivmsg(): received PRIVMSG without target or message from:" << prefix;
return;
}
IrcChannel *channel = network()->ircChannel(channelname);
if(!channel) {
- qWarning() << "IrcServerHandler::handle353(): received unknown target channel:" << channelname;
+ quWarning() << "IrcServerHandler::handle353(): received unknown target channel:" << channelname;
return;
}
bool IrcServerHandler::checkParamCount(const QString &methodName, const QList<QByteArray> ¶ms, int minParams) {
if(params.count() < minParams) {
- qWarning() << qPrintable(methodName) << "requieres" << minParams << "parameters but received only" << params.count() << serverDecode(params);
+ quWarning() << qPrintable(methodName) << "requires" << minParams << "parameters but received only" << params.count() << serverDecode(params);
return false;
} else {
return true;