QString IrcUserItem::toolTip(int column) const {
Q_UNUSED(column);
- QString toolTip = "<b>" + nickName() + "</b><br />" + _ircUser->hostmask();
- if(_ircUser->isAway()) {
- toolTip += "<br /> away";
- if(!_ircUser->awayMessage().isEmpty()) {
- toolTip += " (" + _ircUser->awayMessage() + ")";
+ QStringList toolTip(QString("<b>%1</b>").arg(nickName()));
+ if(_ircUser->isAway()) toolTip[0].append(" is away");
+ if(!_ircUser->awayMessage().isEmpty()) toolTip[0].append(QString(" (%1)").arg(_ircUser->awayMessage()));
+ if(!_ircUser->realName().isEmpty()) toolTip.append(_ircUser->realName());
+ if(!_ircUser->ircOperator().isEmpty()) toolTip.append(_ircUser->ircOperator());
+ toolTip.append(_ircUser->hostmask());
+
+ if(_ircUser->idleTime().isValid()) {
+ QDateTime now = QDateTime::currentDateTime();
+ QDateTime idle = _ircUser->idleTime();
+ int idleTime = idle.secsTo(now);
+
+ QList< QPair<int, QString> > timeUnit;
+ timeUnit.append(qMakePair(365*60*60, tr("year")));
+ timeUnit.append(qMakePair(24*60*60, tr("day")));
+ timeUnit.append(qMakePair(60*60, tr("h")));
+ timeUnit.append(qMakePair(60, tr("min")));
+ timeUnit.append(qMakePair(1, tr("sec")));
+
+ QString idleString(' ');
+ for(int i=0; i < timeUnit.size(); i++) {
+ int n = idleTime / timeUnit[i].first;
+ if(n > 0) {
+ idleString += QString("%1 %2 ").arg(QString::number(n), timeUnit[i].second);
+ }
+ idleTime = idleTime % timeUnit[i].first;
}
+ toolTip.append(QString("idling since %1").arg(idleString));
}
- return "<p>" + toolTip + "</p>";
+
+ if(!_ircUser->server().isEmpty()) toolTip.append(QString("server: %1").arg(_ircUser->server()));
+
+ return QString("<p> %1 </p>").arg(toolTip.join("<br />"));
}
void IrcUserItem::setNick(QString newNick) {
_nick(nickFromMask(hostmask)),
_user(userFromMask(hostmask)),
_host(hostFromMask(hostmask)),
+ _realName(),
+ _awayMessage(),
+ _away(false),
+ _server(),
+ _idleTime(QDateTime::currentDateTime()),
+ _ircOperator(),
_network(network),
_codecForEncoding(0),
_codecForDecoding(0)
{
updateObjectName();
- _away = false;
}
IrcUser::~IrcUser() {
return _awayMessage;
}
+QString IrcUser::server() const {
+ return _server;
+}
+
+QDateTime IrcUser::idleTime() const {
+ return _idleTime;
+}
+
+QString IrcUser::ircOperator() const {
+ return _ircOperator;
+}
+
QString IrcUser::userModes() const {
return _userModes;
}
}
}
+void IrcUser::setIdleTime(const QDateTime &idleTime) {
+ if(idleTime.isValid() && _idleTime != idleTime) {
+ _idleTime = idleTime;
+ emit idleTimeSet(idleTime);
+ }
+}
+
+void IrcUser::setServer(const QString &server) {
+ if(!server.isEmpty() && _server != server) {
+ _server = server;
+ emit serverSet(server);
+ }
+}
+
+void IrcUser::setIrcOperator(const QString &ircOperator) {
+ if(!ircOperator.isEmpty() && _ircOperator != ircOperator) {
+ _ircOperator = ircOperator;
+ emit ircOperatorSet(ircOperator);
+ }
+}
void IrcUser::setHost(const QString &host) {
if(!host.isEmpty() && _host != host) {
#include <QString>
#include <QStringList>
#include <QVariantMap>
+#include <QDateTime>
#include "syncableobject.h"
Q_PROPERTY(QString realName READ realName WRITE setRealName STORED false)
Q_PROPERTY(bool away READ isAway WRITE setAway STORED false)
Q_PROPERTY(QString awayMessage READ awayMessage WRITE setAwayMessage STORED false)
+ Q_PROPERTY(QDateTime idleTime READ idleTime WRITE setIdleTime STORED false)
+ Q_PROPERTY(QString server READ server WRITE setServer STORED false)
+ Q_PROPERTY(QString ircOperator READ ircOperator WRITE setIrcOperator STORED false)
Q_PROPERTY(QStringList channels READ channels STORED false)
// Q_PROPERTY(QStringList usermodes READ usermodes WRITE setUsermodes)
QString hostmask() const;
bool isAway() const;
QString awayMessage() const;
+ QDateTime idleTime() const;
+ QString server() const;
+ QString ircOperator() const;
Network *network() const;
QString userModes() const;
void setRealName(const QString &realName);
void setAway(const bool &away);
void setAwayMessage(const QString &awayMessage);
+ void setIdleTime(const QDateTime &idleTime);
+ void setServer(const QString &server);
+ void setIrcOperator(const QString &ircOperator);
void updateHostmask(const QString &mask);
void setUserModes(const QString &modes);
void realNameSet(QString realName);
void awaySet(bool away);
void awayMessageSet(QString awayMessage);
+ void idleTimeSet(QDateTime idleTime);
+ void serverSet(QString server);
+ void ircOperatorSet(QString ircOperator);
void hostmaskUpdated(QString mask);
void userModesSet(QString modes);
QString _realName;
QString _awayMessage;
bool _away;
-
+ QString _server;
+ QDateTime _idleTime;
+ QString _ircOperator;
+
// QSet<QString> _channels;
QSet<IrcChannel *> _channels;
QString _userModes;
IrcServerHandler::IrcServerHandler(NetworkConnection *parent)
: BasicHandler(parent),
networkConnection(parent) {
+ _whowas = false;
}
IrcServerHandler::~IrcServerHandler() {
WHOWAS-Message:
Replies 314 and 369 are responses to a WHOWAS message.
+
+ ??? BitlBee program, simulating IRC server with one channel, 374-378
*/
/* RPL_AWAY - "<nick> :<away message>" */
void IrcServerHandler::handle301(QString prefix, QList<QByteArray> params) {
+ Q_UNUSED(prefix)
IrcUser *ircuser = network()->ircUser(serverDecode(params[0]));
ircuser->setAwayMessage(serverDecode(params.last()));
ircuser->setAway(true);
/* RPL_WHOISUSER - "<nick> <user> <host> * :<real name>" */
void IrcServerHandler::handle311(QString prefix, QList<QByteArray> params) {
+ Q_UNUSED(prefix)
IrcUser *ircuser = network()->ircUser(serverDecode(params[0]));
ircuser->setUser(serverDecode(params[1]));
ircuser->setHost(serverDecode(params[2]));
/* RPL_WHOISSERVER - "<nick> <server> :<server info>" */
void IrcServerHandler::handle312(QString prefix, QList<QByteArray> params) {
- emit displayMsg(Message::Server, "", tr("[Whois/Whowas] %1").arg(serverDecode(params).join(" ")));
+ Q_UNUSED(prefix)
+ IrcUser *ircuser = network()->ircUser(serverDecode(params[0]));
+ ircuser->setServer(serverDecode(params[1]));
+ if(_whowas) {
+ emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
+ } else {
+ emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
+ }
}
/* RPL_WHOISOPERATOR - "<nick> :is an IRC operator" */
void IrcServerHandler::handle313(QString prefix, QList<QByteArray> params) {
+ Q_UNUSED(prefix)
+ IrcUser *ircuser = network()->ircUser(serverDecode(params[0]));
+ ircuser->setIrcOperator(params.last());
emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
}
/* RPL_WHOWASUSER - "<nick> <user> <host> * :<real name>" */
void IrcServerHandler::handle314(QString prefix, QList<QByteArray> params) {
+ Q_UNUSED(prefix)
+ _whowas = true;
emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
}
/* RPL_ENDOFWHO: "<name> :End of WHO list" */
void IrcServerHandler::handle315(QString prefix, QList<QByteArray> params) {
+ Q_UNUSED(prefix)
emit displayMsg(Message::Server, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
}
/* RPL_WHOISIDLE - "<nick> <integer> :seconds idle" */
void IrcServerHandler::handle317(QString prefix, QList<QByteArray> params) {
- emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
+ Q_UNUSED(prefix)
+ IrcUser *ircuser = network()->ircUser(serverDecode(params[0]));
+ QDateTime now = QDateTime::currentDateTime();
+ int idleSecs = serverDecode(params[1]).toInt();
+ idleSecs *= -1;
+ ircuser->setIdleTime(now.addSecs(idleSecs));
+ emit displayMsg(Message::Server, "", tr("[Whois] %1 %2").arg(ircuser->nick()).arg(ircuser->idleTime().secsTo(now)));
}
/* RPL_ENDOFWHOIS - "<nick> :End of WHOIS list" */
void IrcServerHandler::handle318(QString prefix, QList<QByteArray> params) {
+ Q_UNUSED(prefix)
emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
}
/* RPL_WHOISCHANNELS - "<nick> :*( ( "@" / "+" ) <channel> " " )" */
void IrcServerHandler::handle319(QString prefix, QList<QByteArray> params) {
+ Q_UNUSED(prefix)
emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
}
/* RPL_WHOREPLY: "<channel> <user> <host> <server> <nick>
( "H" / "G" > ["*"] [ ( "@" / "+" ) ] :<hopcount> <real name>" */
void IrcServerHandler::handle352(QString prefix, QList<QByteArray> params) {
+ Q_UNUSED(prefix)
QString channel = serverDecode(params[0]);
IrcUser *ircuser = network()->ircUser(serverDecode(params[4]));
ircuser->setUser(serverDecode(params[1]));
bool away = serverDecode(params[5]).startsWith("G") ? true : false;
ircuser->setAway(away);
-
- // TODO: !!
- QString server = serverDecode(params[3]);
- int hopCount = serverDecode(params.last()).section(" ", 0, 0).toInt();
+ ircuser->setServer(serverDecode(params[3]));
ircuser->setRealName(serverDecode(params.last()).section(" ", 1));
emit displayMsg(Message::Server, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
/* RPL_ENDOFWHOWAS - "<nick> :End of WHOWAS" */
void IrcServerHandler::handle369(QString prefix, QList<QByteArray> params) {
+ Q_UNUSED(prefix)
+ _whowas = false;
emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
}
private:
void tryNextNick(const QString &errnick);
+ bool _whowas;
NetworkConnection *networkConnection;
};
emit putRawLine(msg);
}
-
void UserInputHandler::handleSay(QString bufname, QString msg) {
if(bufname.isEmpty()) return; // server buffer
QStringList params;
}
}
-
void UserInputHandler::handleTopic(QString bufname, QString msg) {
if(bufname.isEmpty()) return;
QStringList params;
emit putCmd("MODE", params);
}
-
void UserInputHandler::handleWho(QString bufname, QString msg) {
- emit putCmd("WHO", QStringList(msg));
+ emit putCmd("WHO", msg.split(' '));
}
-
void UserInputHandler::handleWhois(QString bufname, QString msg) {
- emit putCmd("WHOIS", QStringList(msg));
+ qDebug() << "WHOIS" << QStringList(msg);
+ emit putCmd("WHOIS", msg.split(' '));
}
-
void UserInputHandler::handleWhowas(QString bufname, QString msg) {
- emit putCmd("WHOWAS", QStringList(msg));
+ emit putCmd("WHOWAS", msg.split(' '));
}
void UserInputHandler::defaultHandler(QString cmd, QString bufname, QString msg) {
QAction *result = nickContextMenu.exec(QCursor::pos());
- if(result == whoisAction) { Client::instance()->userInput(bufferInfo, "/WHOIS "+username); }
- else if(result == versionAction) { Client::instance()->userInput(bufferInfo, "/CTCP "+username+" VERSION"); }
- else if(result == pingAction) { Client::instance()->userInput(bufferInfo, "/CTCP "+username+" PING"); }
+ if(result == whoisAction) { Client::instance()->userInput(bufferInfo, "/WHOIS " + username + " " + username); }
+ else if(result == versionAction) { Client::instance()->userInput(bufferInfo, "/CTCP " + username + " VERSION"); }
+ else if(result == pingAction) { Client::instance()->userInput(bufferInfo, "/CTCP " + username + " PING"); }
- else if(result == opAction) { Client::instance()->userInput(bufferInfo, "/OP "+username); }
- else if(result == deOpAction) { Client::instance()->userInput(bufferInfo, "/DEOP "+username); }
- else if(result == voiceAction) { Client::instance()->userInput(bufferInfo, "/VOICE "+username); }
- else if(result == deVoiceAction) { Client::instance()->userInput(bufferInfo, "/DEVOICE "+username); }
+ else if(result == opAction) { Client::instance()->userInput(bufferInfo, "/OP " + username); }
+ else if(result == deOpAction) { Client::instance()->userInput(bufferInfo, "/DEOP " + username); }
+ else if(result == voiceAction) { Client::instance()->userInput(bufferInfo, "/VOICE " + username); }
+ else if(result == deVoiceAction) { Client::instance()->userInput(bufferInfo, "/DEVOICE " + username); }
- else if(result == kickAction) { Client::instance()->userInput(bufferInfo, "/KICK "+username); }
- else if(result == kickBanAction) { Client::instance()->userInput(bufferInfo, "/KICKBAN "+username); }
+ else if(result == kickAction) { Client::instance()->userInput(bufferInfo, "/KICK " + username); }
+ else if(result == kickBanAction) { Client::instance()->userInput(bufferInfo, "/KICKBAN " + username); }
}