#include <QDataStream>
-Message::Message(const BufferInfo &bufferInfo, Type type, const QString &contents, const QString &sender, Flags flags)
+Message::Message(const BufferInfo &bufferInfo, Type type, const QString &contents, const QString &sender, const QString &senderPrefixes, Flags flags)
: _timestamp(QDateTime::currentDateTime().toUTC()),
_bufferInfo(bufferInfo),
_contents(contents),
_sender(sender),
+ _senderPrefixes(senderPrefixes),
_type(type),
_flags(flags)
{
}
-Message::Message(const QDateTime &ts, const BufferInfo &bufferInfo, Type type, const QString &contents, const QString &sender, Flags flags)
+Message::Message(const QDateTime &ts, const BufferInfo &bufferInfo, Type type, const QString &contents, const QString &sender, const QString &senderPrefixes, Flags flags)
: _timestamp(ts),
_bufferInfo(bufferInfo),
_contents(contents),
_sender(sender),
+ _senderPrefixes(senderPrefixes),
_type(type),
_flags(flags)
{
msg._bufferInfo = buf;
msg._timestamp = QDateTime::fromTime_t(ts);
msg._sender = QString::fromUtf8(s);
+ msg._senderPrefixes = QString("");
msg._contents = QString::fromUtf8(m);
return in;
}
};
Q_DECLARE_FLAGS(Flags, Flag)
- Message(const BufferInfo &bufferInfo = BufferInfo(), Type type = Plain, const QString &contents = "", const QString &sender = "", Flags flags = None);
+ Message(const BufferInfo &bufferInfo = BufferInfo(), Type type = Plain, const QString &contents = "", const QString &sender = "", const QString &senderPrefixes = "", Flags flags = None);
Message(const QDateTime &ts, const BufferInfo &buffer = BufferInfo(), Type type = Plain,
- const QString &contents = "", const QString &sender = "", Flags flags = None);
+ const QString &contents = "", const QString &sender = "", const QString &senderPrefixes = "", Flags flags = None);
inline static Message ChangeOfDay(const QDateTime &day) { return Message(day, BufferInfo(), DayChange); }
inline const MsgId &msgId() const { return _msgId; }
inline void setBufferId(BufferId id) { _bufferInfo.setBufferId(id); }
inline const QString &contents() const { return _contents; }
inline const QString &sender() const { return _sender; }
+ inline const QString &senderPrefixes() const { return _senderPrefixes; }
inline Type type() const { return _type; }
inline Flags flags() const { return _flags; }
inline void setFlags(Flags flags) { _flags = flags; }
BufferInfo _bufferInfo;
QString _contents;
QString _sender;
+ QString _senderPrefixes;
Type _type;
Flags _flags;
//Network::ConnectionState connectionState() const;
inline int connectionState() const { return _connectionState; }
+ /**@{*/
+ /**
+ * Translates a user’s prefix to the channelmode associated with it.
+ * @param prefix Prefix to be translated.
+ */
QString prefixToMode(const QString &prefix) const;
inline QString prefixToMode(const QCharRef &prefix) const { return prefixToMode(QString(prefix)); }
+ inline QString prefixesToModes(const QString &prefix) const {
+ QString mode = "";
+ for (QChar c : prefix) {
+ mode += prefixToMode(c);
+ }
+ return mode;
+ }
+ /**@}*/
+
+ /**@{*/
+ /**
+ * Translates a user’s prefix to the channelmode associated with it.
+ * @param prefix Prefix to be translated.
+ */
QString modeToPrefix(const QString &mode) const;
inline QString modeToPrefix(const QCharRef &mode) const { return modeToPrefix(QString(mode)); }
+ inline QString modesToPrefixes(const QString &mode) const {
+ QString prefix = "";
+ for (QChar c : mode) {
+ prefix += modeToPrefix(c);
+ }
+ return prefix;
+ }
+ /**@}*/
ChannelModeType channelModeType(const QString &mode);
inline ChannelModeType channelModeType(const QCharRef &mode) { return channelModeType(QString(mode)); }
-INSERT INTO backlog (time, bufferid, type, flags, senderid, message)
-VALUES ($1, $2, $3, $4, $5, $6)
+INSERT INTO backlog (time, bufferid, type, flags, senderid, senderprefixes, message)
+VALUES ($1, $2, $3, $4, $5, $6, $7)
RETURNING messageid
-INSERT INTO backlog (messageid, time, bufferid, type, flags, senderid, message)
-VALUES (?, ?, ?, ?, ?, ?, ?)
+INSERT INTO backlog (messageid, time, bufferid, type, flags, senderid, senderprefixes, message)
+VALUES (?, ?, ?, ?, ?, ?, ?, ?)
-SELECT messageid, bufferid, time, type, flags, sender, message
+SELECT messageid, bufferid, time, type, flags, sender, senderprefixes, message
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE backlog.bufferid IN (SELECT bufferid FROM buffer WHERE userid = :userid)
-SELECT messageid, bufferid, time, type, flags, sender, message
+SELECT messageid, bufferid, time, type, flags, sender, senderprefixes, message
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE backlog.bufferid IN (SELECT bufferid FROM buffer WHERE userid = :userid)
-SELECT messageid, time, type, flags, sender, message
+SELECT messageid, time, type, flags, sender, senderprefixes, message
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE backlog.messageid >= $1
-SELECT messageid, time, type, flags, sender, message
+SELECT messageid, time, type, flags, sender, senderprefixes, message
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE bufferid = $1
-SELECT messageid, time, type, flags, sender, message
+SELECT messageid, time, type, flags, sender, senderprefixes, message
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE backlog.messageid >= $1
type integer NOT NULL,
flags integer NOT NULL,
senderid integer NOT NULL REFERENCES sender (senderid) ON DELETE SET NULL,
+ senderprefixes TEXT,
message TEXT
)
--- /dev/null
+ALTER TABLE backlog
+ADD COLUMN senderprefixes TEXT;
-INSERT INTO backlog (time, bufferid, type, flags, senderid, message)
-VALUES (:time, :bufferid, :type, :flags, (SELECT senderid FROM sender WHERE sender = :sender), :message)
+INSERT INTO backlog (time, bufferid, type, flags, senderid, senderprefixes, message)
+VALUES (:time, :bufferid, :type, :flags, (SELECT senderid FROM sender WHERE sender = :sender), :senderprefixes, :message)
-SELECT messageid, time, bufferid, type, flags, senderid, message
+SELECT messageid, time, bufferid, type, flags, senderid, senderprefixes, message
FROM backlog
WHERE messageid > ? AND messageid <= ?
ORDER BY messageid ASC
-SELECT messageid, bufferid, time, type, flags, sender, message
+SELECT messageid, bufferid, time, type, flags, sender, senderprefixes, message
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE backlog.bufferid IN (SELECT bufferid FROM buffer WHERE userid = :userid)
-SELECT messageid, bufferid, time, type, flags, sender, message
+SELECT messageid, bufferid, time, type, flags, sender, senderprefixes, message
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE backlog.bufferid IN (SELECT bufferid FROM buffer WHERE userid = :userid)
-SELECT messageid, time, type, flags, sender, message
+SELECT messageid, time, type, flags, sender, senderprefixes, message
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE backlog.messageid >= :firstmsg
-SELECT messageid, time, type, flags, sender, message
+SELECT messageid, time, type, flags, sender, senderprefixes, message
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE bufferid = :bufferid
-SELECT messageid, time, type, flags, sender, message
+SELECT messageid, time, type, flags, sender, senderprefixes, message
FROM backlog
JOIN sender ON backlog.senderid = sender.senderid
WHERE bufferid = :bufferid
type INTEGER NOT NULL,
flags INTEGER NOT NULL,
senderid INTEGER NOT NULL,
+ senderprefixes TEXT,
message TEXT)
--- /dev/null
+ALTER TABLE backlog
+ADD COLUMN senderprefixes TEXT;
int type;
int flags;
int senderid;
+ QString senderprefixes;
QString message;
};
Q_ASSERT(!createBuffer);
bufferInfo = Core::bufferInfo(user(), rawMsg.networkId, BufferInfo::StatusBuffer, "");
}
- Message msg(bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender, rawMsg.flags);
+ Message msg(bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender,
+ senderPrefixes(rawMsg.sender, bufferInfo), rawMsg.flags);
if(Core::storeMessage(msg))
emit displayMsg(msg);
}
}
bufferInfoCache[rawMsg.networkId][rawMsg.target] = bufferInfo;
}
- Message msg(bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender, rawMsg.flags);
+ Message msg(bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender,
+ senderPrefixes(rawMsg.sender, bufferInfo), rawMsg.flags);
messages << msg;
}
// add the StatusBuffer to the Cache in case there are more Messages for the original target
bufferInfoCache[rawMsg.networkId][rawMsg.target] = bufferInfo;
}
- Message msg(bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender, rawMsg.flags);
+ Message msg(bufferInfo, rawMsg.type, rawMsg.text, rawMsg.sender,
+ senderPrefixes(rawMsg.sender, bufferInfo), rawMsg.flags);
messages << msg;
}
_messageQueue.clear();
}
+QString CoreSession::senderPrefixes(const QString &sender, const BufferInfo &bufferInfo) const
+{
+ CoreNetwork *currentNetwork = network(bufferInfo.networkId());
+ if (!currentNetwork) {
+ return "";
+ }
+
+ if (bufferInfo.type() != BufferInfo::ChannelBuffer) {
+ return "";
+ }
+
+ IrcChannel *currentChannel = currentNetwork->ircChannel(bufferInfo.bufferName());
+ if (!currentChannel) {
+ return "";
+ }
+
+ const QString modes = currentChannel->userModes(nickFromMask(sender).toLower());
+ return currentNetwork->modesToPrefixes(modes);
+}
Protocol::SessionState CoreSession::sessionState() const
{
QScriptEngine *scriptEngine;
+ /**
+ * This method obtains the prefixes of the message's sender within a channel, by looking up their channelmodes, and
+ * processing them to prefixes based on the network's settings.
+ * @param sender The hostmask of the sender
+ * @param bufferInfo The BufferInfo object of the buffer
+ */
+ QString senderPrefixes(const QString &sender, const BufferInfo &bufferInfo) const;
QList<RawMessage> _messageQueue;
bool _processMessages;
CoreIgnoreListManager _ignoreListManager;
<< msg.type()
<< (int)msg.flags()
<< senderId
+ << msg.senderPrefixes()
<< msg.contents();
QSqlQuery logMessageQuery = executePreparedQuery("insert_message", params, db);
<< msg.type()
<< (int)msg.flags()
<< senderIdList.at(i)
+ << msg.senderPrefixes()
<< msg.contents();
QSqlQuery logMessageQuery = executePreparedQuery("insert_message", params, db);
if (!watchQuery(logMessageQuery)) {
Message msg(timestamp,
bufferInfo,
(Message::Type)query.value(2).toUInt(),
- query.value(5).toString(),
+ query.value(6).toString(),
query.value(4).toString(),
+ query.value(5).toString(),
(Message::Flags)query.value(3).toUInt());
msg.setMsgId(query.value(0).toInt());
messagelist << msg;
Message msg(timestamp,
bufferInfoHash[query.value(1).toInt()],
(Message::Type)query.value(3).toUInt(),
- query.value(6).toString(),
+ query.value(7).toString(),
query.value(5).toString(),
+ query.value(6).toString(),
(Message::Flags)query.value(4).toUInt());
msg.setMsgId(query.value(0).toInt());
messagelist << msg;
bindValue(3, backlog.type);
bindValue(4, (int)backlog.flags);
bindValue(5, backlog.senderid);
- bindValue(6, backlog.message);
+ bindValue(6, backlog.senderprefixes);
+ bindValue(7, backlog.message);
return exec();
}
<file>./SQL/PostgreSQL/version/21/upgrade_000_add_function_backlog_lastmsgid_update.sql</file>
<file>./SQL/PostgreSQL/version/21/upgrade_001_add_trigger_backlog_lastmsgid_update.sql</file>
<file>./SQL/PostgreSQL/version/22/upgrade_000_alter_quasseluser_add_authenticator.sql</file>
+ <file>./SQL/PostgreSQL/version/23/upgrade_000_create_mode.sql</file>
<file>./SQL/SQLite/delete_backlog_by_uid.sql</file>
<file>./SQL/SQLite/delete_backlog_for_buffer.sql</file>
<file>./SQL/SQLite/delete_backlog_for_network.sql</file>
<file>./SQL/SQLite/version/22/upgrade_000_add_trigger_backlog_lastmsgid_update_direct_insert.sql</file>
<file>./SQL/SQLite/version/22/upgrade_001_add_trigger_backlog_lastmsgid_update_direct_update.sql</file>
<file>./SQL/SQLite/version/23/upgrade_000_alter_quasseluser_add_authenticator.sql</file>
+ <file>./SQL/SQLite/version/24/upgrade_000_create_mode.sql</file>
</qresource>
</RCC>
logMessageQuery.bindValue(":type", msg.type());
logMessageQuery.bindValue(":flags", (int)msg.flags());
logMessageQuery.bindValue(":sender", msg.sender());
+ logMessageQuery.bindValue(":senderprefixes", msg.senderPrefixes());
logMessageQuery.bindValue(":message", msg.contents());
lockForWrite();
logMessageQuery.bindValue(":type", msg.type());
logMessageQuery.bindValue(":flags", (int)msg.flags());
logMessageQuery.bindValue(":sender", msg.sender());
+ logMessageQuery.bindValue(":senderprefixes", msg.senderPrefixes());
logMessageQuery.bindValue(":message", msg.contents());
safeExec(logMessageQuery);
Message msg(QDateTime::fromTime_t(query.value(1).toInt()),
bufferInfo,
(Message::Type)query.value(2).toUInt(),
- query.value(5).toString(),
+ query.value(6).toString(),
query.value(4).toString(),
+ query.value(5).toString(),
(Message::Flags)query.value(3).toUInt());
msg.setMsgId(query.value(0).toInt());
messagelist << msg;
Message msg(QDateTime::fromTime_t(query.value(2).toInt()),
bufferInfoHash[query.value(1).toInt()],
(Message::Type)query.value(3).toUInt(),
- query.value(6).toString(),
+ query.value(7).toString(),
query.value(5).toString(),
+ query.value(6).toString(),
(Message::Flags)query.value(4).toUInt());
msg.setMsgId(query.value(0).toInt());
messagelist << msg;
backlog.type = value(3).toInt();
backlog.flags = value(4).toInt();
backlog.senderid = value(5).toInt();
- backlog.message = value(6).toString();
+ backlog.senderprefixes = value(6).toString();
+ backlog.message = value(7).toString();
return true;
}