- BufferTypes are now stored persistent in the Storage engine and can be accessed via BufferInfo.type()
Major breakage of protocol. Distclean mandatory.
const Network *net = network(msg.bufferInfo().networkId());
if(net && !net->myNick().isEmpty()) {
QRegExp nickRegExp("^(.*\\W)?" + QRegExp::escape(net->myNick()) + "(\\W.*)?$");
- if((msg.type() == Message::Plain || msg.type() == Message::Notice || msg.type() == Message::Action) && nickRegExp.exactMatch(msg.text()))
+ if((msg.type() & (Message::Plain | Message::Notice | Message::Action)) && nickRegExp.exactMatch(msg.text()))
msg.setFlags(msg.flags() | Message::Highlight);
}
}
_bufferInfo(bufferInfo),
_activity(NoActivity)
{
- // determine BufferType
- if(bufferInfo.bufferName().isEmpty())
- _type = StatusType;
- else if(isChannelName(bufferInfo.bufferName()))
- _type = ChannelType;
- else
- _type = QueryType;
-
Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;
- if(bufferType() == QueryType)
+ if(bufferType() == BufferInfo::QueryBuffer)
flags |= Qt::ItemIsDropEnabled;
setFlags(flags);
}
bool BufferItem::isStatusBuffer() const {
- return bufferType() == StatusType;
+ return bufferType() == BufferInfo::StatusBuffer;
}
-BufferItem::Type BufferItem::bufferType() const {
- return _type;
+BufferInfo::Type BufferItem::bufferType() const {
+ return bufferInfo().type();
}
bool BufferItem::isActive() const {
- if(bufferType() == ChannelType)
+ if(bufferType() == BufferInfo::ChannelBuffer)
return _ircChannel;
else
return qobject_cast<NetworkItem *>(parent())->isActive();
}
QString BufferItem::bufferName() const {
- if(bufferType() == StatusType)
+ if(bufferType() == BufferInfo::StatusBuffer)
return tr("Status Buffer");
else
return bufferInfo().bufferName();
return false;
// target must be a query
- BufferItem::Type targetType = (BufferItem::Type)parent.data(NetworkModel::BufferTypeRole).toInt();
- if(targetType != BufferItem::QueryType)
+ BufferInfo::Type targetType = (BufferInfo::Type)parent.data(NetworkModel::BufferTypeRole).toInt();
+ if(targetType != BufferInfo::QueryBuffer)
return false;
QList< QPair<NetworkId, BufferId> > bufferList = mimeDataToBufferList(data);
Q_ASSERT(rootItem->childById(qHash(netId))->childById(qHash(bufferId)));
// source must be a query too
- BufferItem::Type sourceType = (BufferItem::Type)rootItem->childById(qHash(netId))->childById(qHash(bufferId))->data(0, BufferTypeRole).toInt();
- if(sourceType != BufferItem::QueryType)
+ BufferInfo::Type sourceType = (BufferInfo::Type)rootItem->childById(qHash(netId))->childById(qHash(bufferId))->data(0, BufferTypeRole).toInt();
+ if(sourceType != BufferInfo::QueryBuffer)
return false;
// TODO: warn user about buffermerge!
QString bufferName() const;
QString topic() const;
int nickCount() const;
-
- enum Type {
- StatusType,
- ChannelType,
- QueryType
- };
bool isStatusBuffer() const;
- Type bufferType() const;
+ BufferInfo::Type bufferType() const;
bool isActive() const;
private:
BufferInfo _bufferInfo;
ActivityLevel _activity;
- Type _type;
QDateTime _lastMsgInsert;
QDateTime _lastSeen;
BufferInfo::BufferInfo()
: _bufferId(0),
_netid(0),
+ _type(InvalidBuffer),
_groupId(0),
_bufferName(QString())
{
}
-BufferInfo::BufferInfo(BufferId id, NetworkId networkid, uint gid, QString buf)
+BufferInfo::BufferInfo(BufferId id, NetworkId networkid, Type type, uint gid, QString buf)
: _bufferId(id),
_netid(networkid),
+ _type(type),
_groupId(gid),
_bufferName(buf)
{
}
QDataStream &operator<<(QDataStream &out, const BufferInfo &bufferInfo) {
- out << bufferInfo._bufferId << bufferInfo._netid << bufferInfo._groupId << bufferInfo._bufferName.toUtf8();
+ out << bufferInfo._bufferId << bufferInfo._netid << (qint16)bufferInfo._type << bufferInfo._groupId << bufferInfo._bufferName.toUtf8();
return out;
}
QDataStream &operator>>(QDataStream &in, BufferInfo &bufferInfo) {
QByteArray buffername;
- in >> bufferInfo._bufferId >> bufferInfo._netid >> bufferInfo._groupId >> buffername;
+ qint16 bufferType;
+ in >> bufferInfo._bufferId >> bufferInfo._netid >> bufferType >> bufferInfo._groupId >> buffername;
+ bufferInfo._type = (BufferInfo::Type)bufferType;
bufferInfo._bufferName = QString::fromUtf8(buffername);
return in;
}
uint qHash(const BufferInfo &bufferid) {
- return qHash(bufferid._bufferId.toInt());
+ return qHash(bufferid._bufferId);
}
class BufferInfo {
public:
+ enum Type {
+ InvalidBuffer = 0x00,
+ StatusBuffer = 0x01,
+ ChannelBuffer = 0x02,
+ QueryBuffer = 0x04,
+ GroupBuffer = 0x08
+ };
+
BufferInfo();
- BufferInfo(BufferId id, NetworkId networkid, uint gid = 0, QString buf = QString());
+ BufferInfo(BufferId id, NetworkId networkid, Type type, uint gid = 0, QString buf = QString());
inline BufferId bufferId() const { return _bufferId; }
inline NetworkId networkId() const { return _netid; }
+ inline Type type() const { return _type; }
inline uint groupId() const { return _groupId; }
QString bufferName() const;
private:
BufferId _bufferId;
NetworkId _netid;
+ Type _type;
uint _groupId;
QString _bufferName;
*/
QDataStream &operator<<(QDataStream &out, const Message &msg) {
- out << (quint32)msg.timestamp().toTime_t() << (quint8)msg.type() << (quint8)msg.flags()
+ out << (quint32)msg.timestamp().toTime_t() << (quint32)msg.type() << (quint8)msg.flags()
<< msg.bufferInfo() << msg.sender().toUtf8() << msg.text().toUtf8();
return out;
}
QDataStream &operator>>(QDataStream &in, Message &msg) {
- quint8 t, f;
+ quint8 f;
+ quint32 t;
quint32 ts;
QByteArray s, m;
BufferInfo buf;
public:
/** The different types a message can have for display */
enum Type {
- Plain,
- Notice,
- Action,
- Nick,
- Mode,
- Join,
- Part,
- Quit,
- Kick,
- Kill,
- Server,
- Info,
- Error
+ Plain = 0x0001,
+ Notice = 0x0002,
+ Action = 0x0004,
+ Nick = 0x0008,
+ Mode = 0x0010,
+ Join = 0x0020,
+ Part = 0x0040,
+ Quit = 0x0080,
+ Kick = 0x0100,
+ Kill = 0x0200,
+ Server = 0x0400,
+ Info = 0x0800,
+ Error = 0x1000
};
enum Flags {
None = 0,
Self = 1,
- Highlight = 2
+ Highlight = 2,
+ Redirected = 4
};
Q_DECLARE_FLAGS(MessageFlags, Flags)
+++ /dev/null
-INSERT INTO buffer (userid, networkid, buffername, buffercname)
-VALUES (:userid, :networkid, :buffername, :buffercname)
+++ /dev/null
-INSERT INTO coreinfo (key, value) VALUES ('schemaversion', '5')
--- /dev/null
+INSERT INTO buffer (userid, networkid, buffername, buffercname, buffertype)
+VALUES (:userid, :networkid, :buffername, :buffercname, :buffertype)
-SELECT bufferid
+SELECT bufferid, buffertype, groupid
FROM buffer
WHERE buffer.networkid = :networkid AND buffer.userid = :userid AND buffer.buffercname = :buffercname
-SELECT DISTINCT buffer.bufferid, buffername, network.networkid
+SELECT DISTINCT buffer.bufferid, network.networkid, buffertype, groupid, buffername
FROM buffer
JOIN network ON buffer.networkid = network.networkid
JOIN backlog ON buffer.bufferid = backlog.bufferid
groupid INTEGER,
networkid INTEGER NOT NULL,
buffername TEXT NOT NULL,
- buffercname TEXT NOT NULL -- CANONICAL BUFFER NAME (lowercase version)
+ buffercname TEXT NOT NULL, -- CANONICAL BUFFER NAME (lowercase version)
+ buffertype INTEGER NOT NULL DEFAULT 0
)
--- /dev/null
+INSERT INTO coreinfo (key, value) VALUES ('schemaversion', '6')
--- /dev/null
+ALTER TABLE buffer
+ADD COLUMN buffertype INTEGER NOT NULL DEFAULT 0
--- /dev/null
+UPDATE buffer
+SET buffertype = 1
+WHERE buffercname = ''
--- /dev/null
+UPDATE buffer
+SET buffertype = 2
+WHERE buffercname LIKE '#%' OR buffercname LIKE '&%'
--- /dev/null
+UPDATE buffer
+SET buffertype = 4
+WHERE buffertype = 0
--- /dev/null
+UPDATE backlog SET type = 4069 WHERE type = 12
--- /dev/null
+UPDATE backlog SET type = 2048 WHERE type = 11
--- /dev/null
+UPDATE backlog SET type = 1024 WHERE type = 10
--- /dev/null
+UPDATE backlog SET type = 512 WHERE type = 9
--- /dev/null
+UPDATE backlog SET type = 256 WHERE type = 8
--- /dev/null
+UPDATE backlog SET type = 128 WHERE type = 7
--- /dev/null
+UPDATE backlog SET type = 64 WHERE type = 6
--- /dev/null
+UPDATE backlog SET type = 32 WHERE type = 5
--- /dev/null
+UPDATE backlog SET type = 16 WHERE type = 4
--- /dev/null
+UPDATE backlog SET type = 8 WHERE type = 3
--- /dev/null
+UPDATE backlog SET type = 4 WHERE type = 2
--- /dev/null
+UPDATE backlog SET type = 2 WHERE type = 1
--- /dev/null
+UPDATE backlog SET type = 1 WHERE type = 0
--- /dev/null
+UPDATE coreinfo
+SET value='6'
+WHERE key = 'schemaversion'
defaultHandler(-1),
initDone(false)
{
- connect(this, SIGNAL(displayMsg(Message::Type, QString, QString, QString, quint8)),
- server, SIGNAL(displayMsg(Message::Type, QString, QString, QString, quint8)));
+ connect(this, SIGNAL(displayMsg(Message::Type, BufferInfo::Type, QString, QString, QString, quint8)),
+ server, SIGNAL(displayMsg(Message::Type, BufferInfo::Type, QString, QString, QString, quint8)));
connect(this, SIGNAL(putCmd(QString, QStringList, QString)),
server, SLOT(putCmd(QString, QStringList, QString)));
Network *BasicHandler::network() const {
return server->network();
}
+
+BufferInfo::Type BasicHandler::typeByTarget(const QString &target) const {
+ if(target.isEmpty())
+ return BufferInfo::StatusBuffer;
+
+ if(network()->isChannelName(target))
+ return BufferInfo::ChannelBuffer;
+
+ return BufferInfo::QueryBuffer;
+}
QStringList providesHandlers();
signals:
- void displayMsg(Message::Type, QString target, QString text, QString sender = "", quint8 flags = Message::None);
+ void displayMsg(Message::Type, BufferInfo::Type, QString target, QString text, QString sender = "", quint8 flags = Message::None);
void putCmd(QString cmd, QStringList params, QString prefix = 0);
void putRawLine(QString msg);
NetworkConnection *server;
Network *network() const;
+ BufferInfo::Type typeByTarget(const QString &target) const;
private:
const QHash<QString, int> &handlerHash();
return instance()->storage->getNetworkId(user, network);
}
-BufferInfo Core::bufferInfo(UserId user, const NetworkId &networkId, const QString &buffer) {
+BufferInfo Core::bufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer) {
QMutexLocker locker(&mutex);
- return instance()->storage->getBufferInfo(user, networkId, buffer);
+ return instance()->storage->getBufferInfo(user, networkId, type, buffer);
}
MsgId Core::storeMessage(const Message &message) {
*
* \param user The core user who owns this buffername
* \param networkId The network id
+ * \param type The type of the buffer (StatusBuffer, Channel, etc.)
* \param buffer The buffer name (if empty, the net's status buffer is returned)
* \return The BufferInfo corresponding to the given network and buffer name, or 0 if not found
*/
- static BufferInfo bufferInfo(UserId user, const NetworkId &networkId, const QString &buffer = "");
+ static BufferInfo bufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type, const QString &buffer = "");
//! Store a Message in the backlog.
/** \note This method is threadsafe.
//signalProxy()->attachSignal(conn, SIGNAL(connected(NetworkId)), SIGNAL(networkConnected(NetworkId)));
//signalProxy()->attachSignal(conn, SIGNAL(disconnected(NetworkId)), SIGNAL(networkDisconnected(NetworkId)));
- connect(conn, SIGNAL(displayMsg(Message::Type, QString, QString, QString, quint8)), this, SLOT(recvMessageFromServer(Message::Type, QString, QString, QString, quint8)));
+ connect(conn, SIGNAL(displayMsg(Message::Type, BufferInfo::Type, QString, QString, QString, quint8)),
+ this, SLOT(recvMessageFromServer(Message::Type, BufferInfo::Type, QString, QString, QString, quint8)));
connect(conn, SIGNAL(displayStatusMsg(QString)), this, SLOT(recvStatusMsgFromServer(QString)));
}
// FIXME we need a sane way for creating buffers!
void CoreSession::networkConnected(NetworkId networkid) {
- Core::bufferInfo(user(), networkid); // create status buffer
+ Core::bufferInfo(user(), networkid, BufferInfo::StatusBuffer); // create status buffer
}
void CoreSession::networkDisconnected(NetworkId networkid) {
void CoreSession::msgFromClient(BufferInfo bufinfo, QString msg) {
NetworkConnection *conn = networkConnection(bufinfo.networkId());
if(conn) {
- conn->userInput(bufinfo.bufferName(), msg);
+ conn->userInput(bufinfo, msg);
} else {
qWarning() << "Trying to send to unconnected network!";
}
// ALL messages coming pass through these functions before going to the GUI.
// So this is the perfect place for storing the backlog and log stuff.
-void CoreSession::recvMessageFromServer(Message::Type type, QString target, QString text, QString sender, quint8 flags) {
+void CoreSession::recvMessageFromServer(Message::Type type, BufferInfo::Type bufferType, QString target, QString text, QString sender, quint8 flags) {
NetworkConnection *netCon = qobject_cast<NetworkConnection*>(this->sender());
Q_ASSERT(netCon);
- BufferInfo bufferInfo = Core::bufferInfo(user(), netCon->networkId(), target);
+ BufferInfo bufferInfo = Core::bufferInfo(user(), netCon->networkId(), bufferType, target);
Message msg(bufferInfo, type, text, sender, flags);
msg.setMsgId(Core::storeMessage(msg));
Q_ASSERT(msg.msgId() != 0);
private slots:
void recvStatusMsgFromServer(QString msg);
- void recvMessageFromServer(Message::Type, QString target, QString text, QString sender = "", quint8 flags = Message::None);
+ void recvMessageFromServer(Message::Type, BufferInfo::Type, QString target, QString text, QString sender = "", quint8 flags = Message::None);
void networkConnected(NetworkId networkid);
void networkDisconnected(NetworkId networkid);
#include "global.h"
#include "util.h"
#include "message.h"
+#include "network.h"
CtcpHandler::CtcpHandler(NetworkConnection *parent)
: BasicHandler(parent) {
? CtcpReply
: CtcpQuery;
+ BufferInfo::Type bufferType = typeByTarget(target);
+
// extract tagged / extended data
while(dequotedMessage.contains(XDELIM)) {
if(dequotedMessage.indexOf(XDELIM) > 0)
- emit displayMsg(messageType, target, dequotedMessage.section(XDELIM,0,0), prefix);
+ emit displayMsg(messageType, bufferType, target, dequotedMessage.section(XDELIM,0,0), prefix);
// messages << dequotedMessage.section(XDELIM,0,0), prefix);
ctcp = XdelimDequote(dequotedMessage.section(XDELIM,1,1));
dequotedMessage = dequotedMessage.section(XDELIM,2,2);
}
if(!dequotedMessage.isEmpty())
- emit displayMsg(messageType, target, dequotedMessage, prefix);
+ emit displayMsg(messageType, bufferType, target, dequotedMessage, prefix);
}
//******************************/
void CtcpHandler::handleAction(CtcpType ctcptype, QString prefix, QString target, QString param) {
Q_UNUSED(ctcptype)
- emit displayMsg(Message::Action, target, param, prefix);
+ emit displayMsg(Message::Action, typeByTarget(target), target, param, prefix);
}
void CtcpHandler::handlePing(CtcpType ctcptype, QString prefix, QString target, QString param) {
Q_UNUSED(target)
if(ctcptype == CtcpQuery) {
reply(nickFromMask(prefix), "PING", param);
- emit displayMsg(Message::Server, "", tr("Received CTCP PING request from %1").arg(prefix));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Received CTCP PING request from %1").arg(prefix));
} else {
// display ping answer
uint now = QDateTime::currentDateTime().toTime_t();
uint then = QDateTime().fromTime_t(param.toInt()).toTime_t();
- emit displayMsg(Message::Server, "", tr("Received CTCP PING answer from %1 with %2 seconds round trip time").arg(prefix).arg(now-then));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Received CTCP PING answer from %1 with %2 seconds round trip time").arg(prefix).arg(now-then));
}
}
// FIXME use real Info about quassel :)
reply(nickFromMask(prefix), "VERSION", QString("Quassel IRC (v%1 build >= %2) -- http://www.quassel-irc.org")
.arg(Global::quasselVersion).arg(Global::quasselBuild));
- emit displayMsg(Message::Server, "", tr("Received CTCP VERSION request by %1").arg(prefix));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Received CTCP VERSION request by %1").arg(prefix));
} else {
// display Version answer
- emit displayMsg(Message::Server, "", tr("Received CTCP VERSION answer from %1: %2").arg(prefix).arg(param));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("Received CTCP VERSION answer from %1: %2").arg(prefix).arg(param));
}
}
Q_UNUSED(ctcptype);
Q_UNUSED(target);
Q_UNUSED(param);
- emit displayMsg(Message::Error, "", tr("Received unknown CTCP %1 by %2").arg(cmd).arg(prefix));
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Received unknown CTCP %1 by %2").arg(cmd).arg(prefix));
}
handle(cmd, Q_ARG(QString, prefix), Q_ARG(QList<QByteArray>, params));
//handle(cmd, Q_ARG(QString, prefix));
} catch(Exception e) {
- emit displayMsg(Message::Error, "", e.msg());
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", e.msg());
}
}
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, "", params.join(" "), prefix);
+ 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, "", params.join(" "), prefix);
+ 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 channelName = params.takeFirst();
- emit displayMsg(Message::Error, "", params.join(" ") + " " + channelName, prefix);
- emit displayMsg(Message::Error, channelName, params.join(" ") + " " + channelName, prefix);
+ {
+ // FIXME needs proper redirection
+ QString target = params.takeFirst();
+ BufferInfo::Type bufferType = network()->isChannelName(target)
+ ? BufferInfo::ChannelBuffer
+ : BufferInfo::QueryBuffer;
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", params.join(" ") + " " + target, prefix);
+ emit displayMsg(Message::Error, bufferType, target, params.join(" ") + " " + target, prefix);
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, "", params.join(" ") + " " + channelName, prefix);
+ 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 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, "", p + ": " + params.join(" "));
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", p + ": " + params.join(" "));
break;
}
// Ignore these commands.
// Everything else will be marked in red, so we can add them somewhere.
default:
- emit displayMsg(Message::Error, "", cmd + " " + params.join(" "), prefix);
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", cmd + " " + params.join(" "), prefix);
}
//qDebug() << prefix <<":"<<cmd<<params;
} else {
- emit displayMsg(Message::Error, "", QString("Unknown: ") + cmd + " " + params.join(" "), prefix);
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", QString("Unknown: ") + cmd + " " + params.join(" "), prefix);
//qDebug() << prefix <<":"<<cmd<<params;
}
}
Q_ASSERT(params.count() == 1);
QString channel = serverDecode(params[0]);
IrcUser *ircuser = network()->updateNickFromMask(prefix);
- emit displayMsg(Message::Join, channel, channel, prefix);
+ emit displayMsg(Message::Join, BufferInfo::ChannelBuffer, channel, channel, prefix);
//qDebug() << "IrcServerHandler::handleJoin()" << prefix << params;
ircuser->joinChannel(channel);
}
else
msg = victim->nick();
- emit displayMsg(Message::Kick, channel, msg, prefix);
+ emit displayMsg(Message::Kick, BufferInfo::ChannelBuffer, channel, msg, prefix);
}
void IrcServerHandler::handleMode(QString prefix, QList<QByteArray> params) {
if(params.count() < 2) {
- emit displayMsg(Message::Error, "", tr("Received invalid MODE from %s: %s").arg(prefix).arg(serverDecode(params).join(" ")));
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Received invalid MODE from %s: %s").arg(prefix).arg(serverDecode(params).join(" ")));
return;
}
if(network()->isChannelName(params[0])) {
// Channel Modes
- emit displayMsg(Message::Mode, serverDecode(params[0]), serverDecode(params).join(" "), prefix);
+ emit displayMsg(Message::Mode, BufferInfo::ChannelBuffer, serverDecode(params[0]), serverDecode(params).join(" "), prefix);
IrcChannel *channel = network()->ircChannel(params.takeFirst());
// FIXME: currently the IrcChannels only support PREFIX-Modes for users
} else {
// pure User Modes
- emit displayMsg(Message::Mode, "", serverDecode(params).join(" "), prefix);
+ // FIXME: redirect
+ emit displayMsg(Message::Mode, BufferInfo::StatusBuffer, "", serverDecode(params).join(" "), prefix);
}
}
QString newnick = serverDecode(params[0]);
QString oldnick = ircuser->nick();
- foreach(QString channel, ircuser->channels()) {
- if(network()->isMyNick(oldnick)) {
- emit displayMsg(Message::Nick, channel, newnick, newnick);
- } else {
- emit displayMsg(Message::Nick, channel, newnick, prefix);
- }
- }
+ QString sender = network()->isMyNick(oldnick)
+ ? newnick
+ : prefix;
+
+ foreach(QString channel, ircuser->channels())
+ emit displayMsg(Message::Nick, BufferInfo::ChannelBuffer, channel, newnick, sender);
+
ircuser->setNick(newnick);
}
// check if it's only a Server Message or if it's a regular Notice
if(network()->currentServer().isEmpty() || network()->currentServer() == prefix) {
- emit displayMsg(Message::Server, "", serverDecode(params[1]), prefix);
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", serverDecode(params[1]), prefix);
return;
}
if(params.count() > 1)
msg = userDecode(ircuser->nick(), params[1]);
- emit displayMsg(Message::Part, channel, msg, prefix);
+ emit displayMsg(Message::Part, BufferInfo::ChannelBuffer, channel, msg, prefix);
}
void IrcServerHandler::handlePing(QString prefix, QList<QByteArray> params) {
msg = userDecode(ircuser->nick(), params[0]);
foreach(QString channel, ircuser->channels())
- emit displayMsg(Message::Quit, channel, msg, prefix);
+ emit displayMsg(Message::Quit, BufferInfo::ChannelBuffer, channel, msg, prefix);
network()->removeIrcUser(nickFromMask(prefix));
}
network()->ircChannel(channel)->setTopic(topic);
- emit displayMsg(Message::Server, channel, tr("%1 has changed topic for %2 to: \"%3\"").arg(ircuser->nick()).arg(channel).arg(topic));
+ emit displayMsg(Message::Server, BufferInfo::ChannelBuffer, channel, tr("%1 has changed topic for %2 to: \"%3\"").arg(ircuser->nick()).arg(channel).arg(topic));
}
/* RPL_WELCOME */
network()->setCurrentServer(prefix);
network()->setMyNick(nickFromMask(myhostmask));
- emit displayMsg(Message::Server, "", param, prefix);
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", param, prefix);
}
/* RPL_ISUPPORT */
ircuser->setAway(true);
}
+ // FIXME: proper redirection needed
if(_whois) {
- emit displayMsg(Message::Server, "", tr("[Whois] %1 is away: \"%2\"").arg(nickName).arg(awayMessage));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is away: \"%2\"").arg(nickName).arg(awayMessage));
} else {
if(ircuser) {
int now = QDateTime::currentDateTime().toTime_t();
int silenceTime = 60;
if(ircuser->lastAwayMessage() + silenceTime < now) {
- emit displayMsg(Message::Server, params[0], tr("%1 is away: \"%2\"").arg(nickName).arg(awayMessage));
+ emit displayMsg(Message::Server, BufferInfo::QueryBuffer, params[0], tr("%1 is away: \"%2\"").arg(nickName).arg(awayMessage));
}
ircuser->setLastAwayMessage(now);
} else {
// probably should not happen
- emit displayMsg(Message::Server, params[0], tr("%1 is away: \"%2\"").arg(nickName).arg(awayMessage));
+ emit displayMsg(Message::Server, BufferInfo::QueryBuffer, params[0], tr("%1 is away: \"%2\"").arg(nickName).arg(awayMessage));
}
}
}
ircuser->setHost(serverDecode(params[2]));
ircuser->setRealName(serverDecode(params.last()));
}
- emit displayMsg(Message::Server, "", tr("[Whois] %1")
- .arg(serverDecode(params).join(" ")));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1") .arg(serverDecode(params).join(" ")));
}
/* RPL_WHOISSERVER - "<nick> <server> :<server info>" */
ircuser->setServer(serverDecode(params[1]));
}
if(_whois) {
- emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
} else {
- emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
}
}
if(ircuser) {
ircuser->setIrcOperator(params.last());
}
- emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", 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)
- emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", 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(" ")));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
}
/* RPL_WHOISIDLE - "<nick> <integer> :seconds idle"
int idleSecs = serverDecode(params[1]).toInt();
idleSecs *= -1;
ircuser->setIdleTime(now.addSecs(idleSecs));
- emit displayMsg(Message::Server, "", tr("[Whois] %1 is idling for %2 seconds").arg(ircuser->nick()).arg(ircuser->idleTime().secsTo(now)));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1 is idling for %2 seconds").arg(ircuser->nick()).arg(ircuser->idleTime().secsTo(now)));
} else {
- emit displayMsg(Message::Server, "", tr("[Whois] idle message: %1").arg(serverDecode(params).join(" ")));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] idle message: %1").arg(serverDecode(params).join(" ")));
}
}
void IrcServerHandler::handle318(QString prefix, QList<QByteArray> params) {
Q_UNUSED(prefix)
_whois = false;
- emit displayMsg(Message::Server, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", 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(" ")));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whois] %1").arg(serverDecode(params).join(" ")));
}
/* RPL_NOTOPIC */
Q_UNUSED(prefix);
QString channel = serverDecode(params[0]);
network()->ircChannel(channel)->setTopic(QString());
- emit displayMsg(Message::Server, channel, tr("No topic is set for %1.").arg(channel));
+ emit displayMsg(Message::Server, BufferInfo::ChannelBuffer, channel, tr("No topic is set for %1.").arg(channel));
}
/* RPL_TOPIC */
QString channel = serverDecode(params[0]);
QString topic = bufferDecode(channel, params[1]);
network()->ircChannel(channel)->setTopic(topic);
- emit displayMsg(Message::Server, channel, tr("Topic for %1 is \"%2\"").arg(channel, topic));
+ emit displayMsg(Message::Server, BufferInfo::ChannelBuffer, channel, tr("Topic for %1 is \"%2\"").arg(channel, topic));
}
/* Topic set by... */
void IrcServerHandler::handle333(QString prefix, QList<QByteArray> params) {
Q_UNUSED(prefix);
QString channel = serverDecode(params[0]);
- emit displayMsg(Message::Server, channel, tr("Topic set by %1 on %2")
- .arg(bufferDecode(channel, params[1]), QDateTime::fromTime_t(bufferDecode(channel, params[2]).toUInt()).toString()));
+ emit displayMsg(Message::Server, BufferInfo::ChannelBuffer, channel, tr("Topic set by %1 on %2") .arg(bufferDecode(channel, params[1]), QDateTime::fromTime_t(bufferDecode(channel, params[2]).toUInt()).toString()));
}
/* RPL_WHOREPLY: "<channel> <user> <host> <server> <nick>
ircuser->setRealName(serverDecode(params.last()).section(" ", 1));
}
- emit displayMsg(Message::Server, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Who] %1").arg(serverDecode(params).join(" ")));
}
/* RPL_NAMREPLY */
/* RPL_ENDOFWHOWAS - "<nick> :End of WHOWAS" */
void IrcServerHandler::handle369(QString prefix, QList<QByteArray> params) {
Q_UNUSED(prefix)
- emit displayMsg(Message::Server, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
+ emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", tr("[Whowas] %1").arg(serverDecode(params).join(" ")));
}
/* ERR_ERRONEUSNICKNAME */
// :irc.scortum.moep.net 432 @@@ :Erroneous Nickname: Illegal characters
// correct server reply:
// :irc.scortum.moep.net 432 * @@@ :Erroneous Nickname: Illegal characters
- emit displayMsg(Message::Error, "", tr("There is a nickname in your identity's nicklist which contains illegal characters"));
- emit displayMsg(Message::Error, "", tr("Due to a bug in Unreal IRCd (and maybe other irc-servers too) we're unable to determine the erroneous nick"));
- emit displayMsg(Message::Error, "", tr("Please use: /nick <othernick> to continue or clean up your nicklist"));
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("There is a nickname in your identity's nicklist which contains illegal characters"));
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Due to a bug in Unreal IRCd (and maybe other irc-servers too) we're unable to determine the erroneous nick"));
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Please use: /nick <othernick> to continue or clean up your nicklist"));
} else {
QString errnick = params[0];
- emit displayMsg(Message::Error, "", tr("Nick %1 contains illegal characters").arg(errnick));
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Nick %1 contains illegal characters").arg(errnick));
tryNextNick(errnick);
}
}
Q_UNUSED(prefix);
QString errnick = serverDecode(params[0]);
- emit displayMsg(Message::Error, "", tr("Nick already in use: %1").arg(errnick));
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Nick already in use: %1").arg(errnick));
// if there is a problem while connecting to the server -> we handle it
// but only if our connection has not been finished yet...
if(desiredNicks.size() > nextNick) {
putCmd("NICK", QStringList(desiredNicks[nextNick]));
} else {
- emit displayMsg(Message::Error, "", tr("No free and valid nicks in nicklist found. use: /nick <othernick> to continue"));
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("No free and valid nicks in nicklist found. use: /nick <othernick> to continue"));
}
}
void NetworkConnection::socketError(QAbstractSocket::SocketError) {
qDebug() << qPrintable(tr("Could not connect to %1 (%2)").arg(network()->networkName(), socket.errorString()));
emit connectionError(socket.errorString());
- emit displayMsg(Message::Error, "", tr("Connection failure: %1").arg(socket.errorString()));
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", tr("Connection failure: %1").arg(socket.errorString()));
network()->emitConnectionError(socket.errorString());
}
}
// FIXME switch to BufferId
-void NetworkConnection::userInput(QString buf, QString msg) {
+void NetworkConnection::userInput(BufferInfo buf, QString msg) {
userInputHandler()->handleUserInput(buf, msg);
}
// void setServerOptions();
void connectToIrc();
void disconnectFromIrc();
- void userInput(QString buffer, QString msg);
+ void userInput(BufferInfo bufferInfo, QString msg);
void putRawLine(QString input);
void putCmd(QString cmd, QStringList params, QString prefix = 0);
void recvRawServerMsg(QString);
void displayStatusMsg(QString);
//void displayMsg(Message msg);
- void displayMsg(Message::Type, QString target, QString text, QString sender = "", quint8 flags = Message::None);
+ void displayMsg(Message::Type, BufferInfo::Type, QString target, QString text, QString sender = "", quint8 flags = Message::None);
void connected(NetworkId networkId); ///< Emitted after receipt of 001 to indicate that we can now send data to the IRC server
void disconnected(NetworkId networkId);
void connectionStateChanged(Network::ConnectionState);
<file>./SQL/SQLite/4/upgrade_040_create_buffer_idx.sql</file>
<file>./SQL/SQLite/4/upgrade_050_create_buffer_cname_idx.sql</file>
<file>./SQL/SQLite/4/upgrade_999_update_schemaversion.sql</file>
- <file>./SQL/SQLite/5/delete_backlog_by_uid.sql</file>
- <file>./SQL/SQLite/5/delete_backlog_for_network.sql</file>
- <file>./SQL/SQLite/5/delete_buffers_by_uid.sql</file>
- <file>./SQL/SQLite/5/delete_buffers_for_network.sql</file>
- <file>./SQL/SQLite/5/delete_ircservers_for_network.sql</file>
- <file>./SQL/SQLite/5/delete_network.sql</file>
- <file>./SQL/SQLite/5/delete_networks_by_uid.sql</file>
- <file>./SQL/SQLite/5/delete_quasseluser.sql</file>
- <file>./SQL/SQLite/5/insert_buffer.sql</file>
- <file>./SQL/SQLite/5/insert_message.sql</file>
- <file>./SQL/SQLite/5/insert_network.sql</file>
- <file>./SQL/SQLite/5/insert_quasseluser.sql</file>
- <file>./SQL/SQLite/5/insert_sender.sql</file>
- <file>./SQL/SQLite/5/insert_server.sql</file>
- <file>./SQL/SQLite/5/select_authuser.sql</file>
- <file>./SQL/SQLite/5/select_bufferByName.sql</file>
- <file>./SQL/SQLite/5/select_buffers.sql</file>
- <file>./SQL/SQLite/5/select_lastMessage.sql</file>
- <file>./SQL/SQLite/5/select_messageRange.sql</file>
- <file>./SQL/SQLite/5/select_messages.sql</file>
- <file>./SQL/SQLite/5/select_messagesOffset.sql</file>
- <file>./SQL/SQLite/5/select_messagesSince.sql</file>
- <file>./SQL/SQLite/5/select_messagesSinceOffset.sql</file>
- <file>./SQL/SQLite/5/select_networkExists.sql</file>
- <file>./SQL/SQLite/5/select_networks_for_user.sql</file>
- <file>./SQL/SQLite/5/select_servers_for_network.sql</file>
- <file>./SQL/SQLite/5/select_userid.sql</file>
- <file>./SQL/SQLite/5/setup_000_quasseluser.sql</file>
- <file>./SQL/SQLite/5/setup_010_sender.sql</file>
- <file>./SQL/SQLite/5/setup_020_network.sql</file>
- <file>./SQL/SQLite/5/setup_030_buffer.sql</file>
- <file>./SQL/SQLite/5/setup_040_buffer_idx.sql</file>
- <file>./SQL/SQLite/5/setup_050_buffer_cname_idx.sql</file>
- <file>./SQL/SQLite/5/setup_060_backlog.sql</file>
- <file>./SQL/SQLite/5/setup_070_coreinfo.sql</file>
- <file>./SQL/SQLite/5/setup_080_ircservers.sql</file>
- <file>./SQL/SQLite/5/setup_999_version.sql</file>
- <file>./SQL/SQLite/5/update_network.sql</file>
- <file>./SQL/SQLite/5/update_username.sql</file>
- <file>./SQL/SQLite/5/update_userpassword.sql</file>
<file>./SQL/SQLite/5/upgrade_000_rename_networktable.sql</file>
<file>./SQL/SQLite/5/upgrade_010_create_newnetworktable.sql</file>
<file>./SQL/SQLite/5/upgrade_020_copy_networktable.sql</file>
<file>./SQL/SQLite/5/upgrade_030_drop_oldnetworktable.sql</file>
<file>./SQL/SQLite/5/upgrade_180_create_ircservers.sql</file>
<file>./SQL/SQLite/5/upgrade_999_update_schemaversion.sql</file>
+ <file>./SQL/SQLite/6/delete_backlog_by_uid.sql</file>
+ <file>./SQL/SQLite/6/delete_backlog_for_network.sql</file>
+ <file>./SQL/SQLite/6/delete_buffers_by_uid.sql</file>
+ <file>./SQL/SQLite/6/delete_buffers_for_network.sql</file>
+ <file>./SQL/SQLite/6/delete_ircservers_for_network.sql</file>
+ <file>./SQL/SQLite/6/delete_network.sql</file>
+ <file>./SQL/SQLite/6/delete_networks_by_uid.sql</file>
+ <file>./SQL/SQLite/6/delete_quasseluser.sql</file>
+ <file>./SQL/SQLite/6/insert_buffer.sql</file>
+ <file>./SQL/SQLite/6/insert_message.sql</file>
+ <file>./SQL/SQLite/6/insert_network.sql</file>
+ <file>./SQL/SQLite/6/insert_quasseluser.sql</file>
+ <file>./SQL/SQLite/6/insert_sender.sql</file>
+ <file>./SQL/SQLite/6/insert_server.sql</file>
+ <file>./SQL/SQLite/6/select_authuser.sql</file>
+ <file>./SQL/SQLite/6/select_bufferByName.sql</file>
+ <file>./SQL/SQLite/6/select_buffers.sql</file>
+ <file>./SQL/SQLite/6/select_lastMessage.sql</file>
+ <file>./SQL/SQLite/6/select_messageRange.sql</file>
+ <file>./SQL/SQLite/6/select_messages.sql</file>
+ <file>./SQL/SQLite/6/select_messagesOffset.sql</file>
+ <file>./SQL/SQLite/6/select_messagesSince.sql</file>
+ <file>./SQL/SQLite/6/select_messagesSinceOffset.sql</file>
+ <file>./SQL/SQLite/6/select_networkExists.sql</file>
+ <file>./SQL/SQLite/6/select_networks_for_user.sql</file>
+ <file>./SQL/SQLite/6/select_servers_for_network.sql</file>
+ <file>./SQL/SQLite/6/select_userid.sql</file>
+ <file>./SQL/SQLite/6/setup_000_quasseluser.sql</file>
+ <file>./SQL/SQLite/6/setup_010_sender.sql</file>
+ <file>./SQL/SQLite/6/setup_020_network.sql</file>
+ <file>./SQL/SQLite/6/setup_030_buffer.sql</file>
+ <file>./SQL/SQLite/6/setup_040_buffer_idx.sql</file>
+ <file>./SQL/SQLite/6/setup_050_buffer_cname_idx.sql</file>
+ <file>./SQL/SQLite/6/setup_060_backlog.sql</file>
+ <file>./SQL/SQLite/6/setup_070_coreinfo.sql</file>
+ <file>./SQL/SQLite/6/setup_080_ircservers.sql</file>
+ <file>./SQL/SQLite/6/setup_999_version.sql</file>
+ <file>./SQL/SQLite/6/update_network.sql</file>
+ <file>./SQL/SQLite/6/update_username.sql</file>
+ <file>./SQL/SQLite/6/update_userpassword.sql</file>
+ <file>./SQL/SQLite/6/upgrade_000_alter_buffertable.sql</file>
+ <file>./SQL/SQLite/6/upgrade_010_set_statusbuffertype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_020_set_channelbuffertype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_030_set_querybuffertype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_040_update_msgtype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_050_update_msgtype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_060_update_msgtype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_070_update_msgtype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_080_update_msgtype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_090_update_msgtype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_100_update_msgtype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_110_update_msgtype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_120_update_msgtype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_130_update_msgtype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_140_update_msgtype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_150_update_msgtype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_160_update_msgtype.sql</file>
+ <file>./SQL/SQLite/6/upgrade_999_version.sql</file>
</qresource>
</RCC>
return NetworkId();
}
-void SqliteStorage::createBuffer(UserId user, const NetworkId &networkId, const QString &buffer) {
+void SqliteStorage::createBuffer(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer) {
QSqlQuery *query = cachedQuery("insert_buffer");
query->bindValue(":userid", user.toInt());
query->bindValue(":networkid", networkId.toInt());
+ query->bindValue(":buffertype", (int)type);
query->bindValue(":buffername", buffer);
query->bindValue(":buffercname", buffer.toLower());
query->exec();
watchQuery(query);
}
-BufferInfo SqliteStorage::getBufferInfo(UserId user, const NetworkId &networkId, const QString &buffer) {
+BufferInfo SqliteStorage::getBufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer) {
QSqlQuery *query = cachedQuery("select_bufferByName");
query->bindValue(":networkid", networkId.toInt());
query->bindValue(":userid", user.toInt());
query->exec();
if(!query->first()) {
- createBuffer(user, networkId, buffer);
+ createBuffer(user, networkId, type, buffer);
query->exec();
if(!query->first()) {
watchQuery(query);
}
}
- BufferInfo bufferInfo = BufferInfo(query->value(0).toInt(), networkId, 0, buffer);
+ BufferInfo bufferInfo = BufferInfo(query->value(0).toInt(), networkId, (BufferInfo::Type)query->value(1).toInt(), 0, buffer);
if(query->next()) {
qWarning() << "SqliteStorage::getBufferInfo(): received more then one Buffer!";
qWarning() << " Query:" << query->lastQuery();
query.exec();
watchQuery(&query);
while(query.next()) {
- bufferlist << BufferInfo(query.value(0).toInt(), query.value(2).toInt(), 0, query.value(1).toString());
+ bufferlist << BufferInfo(query.value(0).toInt(), query.value(1).toInt(), (BufferInfo::Type)query.value(2).toInt(), query.value(3).toInt(), query.value(4).toString());
}
return bufferlist;
}
virtual QList<NetworkInfo> networks(UserId user);
/* Buffer handling */
- virtual BufferInfo getBufferInfo(UserId user, const NetworkId &networkId, const QString &buffer = "");
+ virtual BufferInfo getBufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer = "");
virtual QList<BufferInfo> requestBuffers(UserId user, QDateTime since = QDateTime());
/* Message handling */
static QString backlogFile();
bool isValidNetwork(UserId user, const NetworkId &networkId);
NetworkId getNetworkId(UserId user, const QString &network);
- void createBuffer(UserId user, const NetworkId &networkId, const QString &buffer);
+ void createBuffer(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer);
};
#endif
/* Buffer handling */
//! Get the unique BufferInfo for the given combination of network and buffername for a user.
- /** \param user The core user who owns this buffername
- * \param network The network name
+ /** \param user The core user who owns this buffername
+ * \param networkId The network id
+ * \param type The type of the buffer (StatusBuffer, Channel, etc.)
* \param buffer The buffer name (if empty, the net's status buffer is returned)
* \return The BufferInfo corresponding to the given network and buffer name, or 0 if not found
*/
- virtual BufferInfo getBufferInfo(UserId user, const NetworkId &networkId, const QString &buffer = "") = 0;
+ virtual BufferInfo getBufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer = "") = 0;
//! Request a list of all buffers known to a user since a certain point in time.
/** This method is used to get a list of all buffers we have stored a backlog from.
: BasicHandler(parent) {
}
-void UserInputHandler::handleUserInput(QString bufname, QString msg) {
+void UserInputHandler::handleUserInput(const BufferInfo &bufferInfo, const QString &msg_) {
try {
- if(msg.isEmpty())
+ if(msg_.isEmpty())
return;
QString cmd;
+ QString msg = msg_;
if(!msg.startsWith('/')) {
cmd = QString("SAY");
} else {
cmd = msg.section(' ', 0, 0).remove(0, 1).toUpper();
msg = msg.section(' ', 1);
}
- handle(cmd, Q_ARG(QString, bufname), Q_ARG(QString, msg));
+ handle(cmd, Q_ARG(BufferInfo, bufferInfo), Q_ARG(QString, msg));
} catch(Exception e) {
- emit displayMsg(Message::Error, "", e.msg());
+ emit displayMsg(Message::Error, bufferInfo.type(), "", e.msg());
}
}
// Public Slots
// ====================
-void UserInputHandler::handleAway(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleAway(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
emit putCmd("AWAY", QStringList(msg));
}
-void UserInputHandler::handleBan(QString bufname, QString msg) {
- if(!isChannelName(bufname))
+void UserInputHandler::handleBan(const BufferInfo &bufferInfo, const QString &msg) {
+ if(bufferInfo.type() != BufferInfo::ChannelBuffer)
return;
//TODO: find suitable default hostmask if msg gives only nickname
// Example: MODE &oulu +b *!*@*
- QStringList banMsg(bufname+" +b "+msg);
+ QStringList banMsg(bufferInfo.bufferName()+" +b "+msg);
emit putCmd("MODE", banMsg);
}
-void UserInputHandler::handleCtcp(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleCtcp(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
QString nick = msg.section(' ', 0, 0);
QString ctcpTag = msg.section(' ', 1, 1).toUpper();
if (ctcpTag.isEmpty()) return;
}
server->ctcpHandler()->query(nick, ctcpTag, message);
- emit displayMsg(Message::Action, "", verboseMessage, network()->myNick());
+ emit displayMsg(Message::Action, BufferInfo::StatusBuffer, "", verboseMessage, network()->myNick());
}
-void UserInputHandler::handleDeop(QString bufname, QString msg) {
+void UserInputHandler::handleDeop(const BufferInfo &bufferInfo, const QString &msg) {
QStringList nicks = msg.split(' ', QString::SkipEmptyParts);
QString m = "-"; for(int i = 0; i < nicks.count(); i++) m += 'o';
QStringList params;
- params << bufname << m << nicks;
+ params << bufferInfo.bufferName() << m << nicks;
emit putCmd("MODE", params);
}
-void UserInputHandler::handleDevoice(QString bufname, QString msg) {
+void UserInputHandler::handleDevoice(const BufferInfo &bufferInfo, const QString &msg) {
QStringList nicks = msg.split(' ', QString::SkipEmptyParts);
QString m = "-"; for(int i = 0; i < nicks.count(); i++) m += 'v';
QStringList params;
- params << bufname << m << nicks;
+ params << bufferInfo.bufferName() << m << nicks;
emit putCmd("MODE", params);
}
-void UserInputHandler::handleInvite(QString bufname, QString msg) {
+void UserInputHandler::handleInvite(const BufferInfo &bufferInfo, const QString &msg) {
QStringList params;
- params << msg << bufname;
+ params << msg << bufferInfo.bufferName();
emit putCmd("INVITE", params);
}
-void UserInputHandler::handleJ(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleJ(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
QStringList params = msg.split(" ");
if(params.size() > 0 && !params[0].startsWith("#")) {
params[0] = QString("#%1").arg(params[0]);
emit putCmd("JOIN", params);
}
-void UserInputHandler::handleJoin(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleJoin(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
emit putCmd("JOIN", msg.split(" "));
}
-void UserInputHandler::handleKick(QString bufname, QString msg) {
+void UserInputHandler::handleKick(const BufferInfo &bufferInfo, const QString &msg) {
QStringList params;
- params << bufname << msg.split(' ', QString::SkipEmptyParts);
+ params << bufferInfo.bufferName() << msg.split(' ', QString::SkipEmptyParts);
emit putCmd("KICK", params);
}
-void UserInputHandler::handleList(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleList(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
emit putCmd("LIST", msg.split(' ', QString::SkipEmptyParts));
}
-void UserInputHandler::handleMe(QString bufname, QString msg) {
- if(bufname.isEmpty()) return; // server buffer
- server->ctcpHandler()->query(bufname, "ACTION", msg);
- emit displayMsg(Message::Action, bufname, msg, network()->myNick());
+void UserInputHandler::handleMe(const BufferInfo &bufferInfo, const QString &msg) {
+ if(bufferInfo.bufferName().isEmpty()) return; // server buffer
+ server->ctcpHandler()->query(bufferInfo.bufferName(), "ACTION", msg);
+ emit displayMsg(Message::Action, bufferInfo.type(), bufferInfo.bufferName(), msg, network()->myNick());
}
-void UserInputHandler::handleMode(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleMode(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
emit putCmd("MODE", msg.split(' ', QString::SkipEmptyParts));
}
// TODO: show privmsgs
-void UserInputHandler::handleMsg(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleMsg(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
if(!msg.contains(' '))
return;
emit putCmd("PRIVMSG", params);
}
-void UserInputHandler::handleNick(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleNick(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
QString nick = msg.section(' ', 0, 0);
emit putCmd("NICK", QStringList(nick));
}
-void UserInputHandler::handleOp(QString bufname, QString msg) {
+void UserInputHandler::handleOp(const BufferInfo &bufferInfo, const QString &msg) {
QStringList nicks = msg.split(' ', QString::SkipEmptyParts);
QString m = "+"; for(int i = 0; i < nicks.count(); i++) m += 'o';
QStringList params;
- params << bufname << m << nicks;
+ params << bufferInfo.bufferName() << m << nicks;
emit putCmd("MODE", params);
}
-void UserInputHandler::handlePart(QString bufname, QString msg) {
+void UserInputHandler::handlePart(const BufferInfo &bufferInfo, const QString &msg) {
QStringList params;
- params << bufname << msg;
+ params << bufferInfo.bufferName() << msg;
emit putCmd("PART", params);
}
// TODO: implement queries
-void UserInputHandler::handleQuery(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleQuery(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
QString target = msg.section(' ', 0, 0);
QString message = msg.section(' ', 1);
if(message.isEmpty())
- emit displayMsg(Message::Server, target, "Starting query with " + target, network()->myNick(), Message::Self);
+ emit displayMsg(Message::Server, BufferInfo::QueryBuffer, target, "Starting query with " + target, network()->myNick(), Message::Self);
else
- emit displayMsg(Message::Plain, target, message, network()->myNick(), Message::Self);
- handleMsg(bufname, msg);
+ emit displayMsg(Message::Plain, BufferInfo::QueryBuffer, target, message, network()->myNick(), Message::Self);
+ handleMsg(bufferInfo, msg);
}
-void UserInputHandler::handleQuit(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleQuit(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
emit putCmd("QUIT", QStringList(msg));
}
-void UserInputHandler::handleQuote(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleQuote(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
emit putRawLine(msg);
}
-void UserInputHandler::handleSay(QString bufname, QString msg) {
- if(bufname.isEmpty()) return; // server buffer
+void UserInputHandler::handleSay(const BufferInfo &bufferInfo, const QString &msg) {
+ if(bufferInfo.bufferName().isEmpty()) return; // server buffer
QStringList params;
- params << bufname << msg;
+ params << bufferInfo.bufferName() << msg;
emit putCmd("PRIVMSG", params);
- emit displayMsg(Message::Plain, params[0], msg, network()->myNick(), Message::Self);
+ emit displayMsg(Message::Plain, bufferInfo.type(), params[0], msg, network()->myNick(), Message::Self);
}
-void UserInputHandler::handleTopic(QString bufname, QString msg) {
- if(bufname.isEmpty()) return;
+void UserInputHandler::handleTopic(const BufferInfo &bufferInfo, const QString &msg) {
+ if(bufferInfo.bufferName().isEmpty()) return;
QStringList params;
- params << bufname << msg;
+ params << bufferInfo.bufferName() << msg;
emit putCmd("TOPIC", params);
}
-void UserInputHandler::handleVoice(QString bufname, QString msg) {
+void UserInputHandler::handleVoice(const BufferInfo &bufferInfo, const QString &msg) {
QStringList nicks = msg.split(' ', QString::SkipEmptyParts);
QString m = "+"; for(int i = 0; i < nicks.count(); i++) m += 'v';
QStringList params;
- params << bufname << m << nicks;
+ params << bufferInfo.bufferName() << m << nicks;
emit putCmd("MODE", params);
}
-void UserInputHandler::handleWho(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleWho(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
emit putCmd("WHO", msg.split(' '));
}
-void UserInputHandler::handleWhois(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleWhois(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
emit putCmd("WHOIS", msg.split(' '));
}
-void UserInputHandler::handleWhowas(QString bufname, QString msg) {
- Q_UNUSED(bufname)
+void UserInputHandler::handleWhowas(const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
emit putCmd("WHOWAS", msg.split(' '));
}
-void UserInputHandler::defaultHandler(QString cmd, QString bufname, QString msg) {
- Q_UNUSED(bufname)
- emit displayMsg(Message::Error, "", QString("Error: %1 %2").arg(cmd).arg(msg));
+void UserInputHandler::defaultHandler(QString cmd, const BufferInfo &bufferInfo, const QString &msg) {
+ Q_UNUSED(bufferInfo)
+ emit displayMsg(Message::Error, BufferInfo::StatusBuffer, "", QString("Error: %1 %2").arg(cmd).arg(msg));
}
public:
UserInputHandler(NetworkConnection *parent = 0);
- void handleUserInput(QString buffer, QString msg);
+ void handleUserInput(const BufferInfo &bufferInfo, const QString &text);
public slots:
- void handleAway(QString, QString);
- void handleBan(QString, QString);
- void handleCtcp(QString, QString);
- void handleDeop(QString, QString);
- void handleDevoice(QString, QString);
- void handleInvite(QString, QString);
- void handleJ(QString, QString);
- void handleJoin(QString, QString);
- void handleKick(QString, QString);
- void handleList(QString, QString);
- void handleMe(QString, QString);
- void handleMode(QString, QString);
- void handleMsg(QString, QString);
- void handleNick(QString, QString);
- void handleOp(QString, QString);
- void handlePart(QString, QString);
- void handleQuery(QString, QString);
- void handleQuit(QString, QString);
- void handleQuote(QString, QString);
- void handleSay(QString, QString);
- void handleTopic(QString, QString);
- void handleVoice(QString, QString);
- void handleWho(QString, QString);
- void handleWhois(QString, QString);
- void handleWhowas(QString, QString);
+ void handleAway(const BufferInfo &bufferInfo, const QString &text);
+ void handleBan(const BufferInfo &bufferInfo, const QString &text);
+ void handleCtcp(const BufferInfo &bufferInfo, const QString &text);
+ void handleDeop(const BufferInfo &bufferInfo, const QString &text);
+ void handleDevoice(const BufferInfo &bufferInfo, const QString &text);
+ void handleInvite(const BufferInfo &bufferInfo, const QString &text);
+ void handleJ(const BufferInfo &bufferInfo, const QString &text);
+ void handleJoin(const BufferInfo &bufferInfo, const QString &text);
+ void handleKick(const BufferInfo &bufferInfo, const QString &text);
+ void handleList(const BufferInfo &bufferInfo, const QString &text);
+ void handleMe(const BufferInfo &bufferInfo, const QString &text);
+ void handleMode(const BufferInfo &bufferInfo, const QString &text);
+ void handleMsg(const BufferInfo &bufferInfo, const QString &text);
+ void handleNick(const BufferInfo &bufferInfo, const QString &text);
+ void handleOp(const BufferInfo &bufferInfo, const QString &text);
+ void handlePart(const BufferInfo &bufferInfo, const QString &text);
+ void handleQuery(const BufferInfo &bufferInfo, const QString &text);
+ void handleQuit(const BufferInfo &bufferInfo, const QString &text);
+ void handleQuote(const BufferInfo &bufferInfo, const QString &text);
+ void handleSay(const BufferInfo &bufferInfo, const QString &text);
+ void handleTopic(const BufferInfo &bufferInfo, const QString &text);
+ void handleVoice(const BufferInfo &bufferInfo, const QString &text);
+ void handleWho(const BufferInfo &bufferInfo, const QString &text);
+ void handleWhois(const BufferInfo &bufferInfo, const QString &text);
+ void handleWhowas(const BufferInfo &bufferInfo, const QString &text);
- void defaultHandler(QString cmd, QString buf, QString msg);
+ void defaultHandler(QString cmd, const BufferInfo &bufferInfo, const QString &text);
};
void NickListWidget::setCurrentBuffer(BufferId bufferId) {
QModelIndex bufferIdx = Client::networkModel()->bufferIndex(bufferId);
- if(bufferIdx.data(NetworkModel::BufferTypeRole) != BufferItem::ChannelType) {
+ if(bufferIdx.data(NetworkModel::BufferTypeRole) != BufferInfo::ChannelBuffer) {
ui.stackedWidget->setCurrentWidget(ui.emptyPage);
return;
}
}
void BufferView::joinChannel(const QModelIndex &index) {
- BufferItem::Type bufferType = (BufferItem::Type)index.data(NetworkModel::BufferTypeRole).value<int>();
+ BufferInfo::Type bufferType = (BufferInfo::Type)index.data(NetworkModel::BufferTypeRole).value<int>();
- if(bufferType != BufferItem::ChannelType)
+ if(bufferType != BufferInfo::ChannelBuffer)
return;
BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
bool BufferViewFilter::filterAcceptBuffer(const QModelIndex &source_bufferIndex) const {
- BufferItem::Type bufferType = (BufferItem::Type) source_bufferIndex.data(NetworkModel::BufferTypeRole).toInt();
+ BufferInfo::Type bufferType = (BufferInfo::Type) source_bufferIndex.data(NetworkModel::BufferTypeRole).toInt();
- if((mode & NoChannels) && bufferType == BufferItem::ChannelType)
+ if((mode & NoChannels) && bufferType == BufferInfo::ChannelBuffer)
return false;
- if((mode & NoQueries) && bufferType == BufferItem::QueryType)
+ if((mode & NoQueries) && bufferType == BufferInfo::QueryBuffer)
return false;
- if((mode & NoServers) && bufferType == BufferItem::StatusType)
+ if((mode & NoServers) && bufferType == BufferInfo::StatusBuffer)
return false;
// bool isActive = source_bufferIndex.data(NetworkModel::BufferActiveRole).toBool();
{ using namespace Global;
quasselVersion = "0.2.0-pre";
- quasselDate = "2008-02-11";
- quasselBuild = 506;
+ quasselDate = "2008-02-12";
+ quasselBuild = 509;
//! Minimum client build number the core needs
- clientBuildNeeded = 480;
+ clientBuildNeeded = 509;
clientVersionNeeded = quasselVersion;
//! Minimum core build number the client needs
- coreBuildNeeded = 506;
+ coreBuildNeeded = 509;
coreVersionNeeded = quasselVersion;
}