27 QStringList splitMessage(
const QString& message, uint64_t maxLength)
29 QStringList splittedMsgs;
30 QByteArray ba_message{
message.toUtf8()};
31 while (
static_cast<uint64_t
>(ba_message.size()) > maxLength) {
32 int splitPos = ba_message.lastIndexOf(
'\n', maxLength - 1);
35 splitPos = ba_message.lastIndexOf(
' ', maxLength - 1);
39 constexpr uint8_t firstOfMultiByteMask = 0xC0;
40 constexpr uint8_t multiByteMask = 0x80;
43 if ((ba_message[splitPos] & multiByteMask) == multiByteMask) {
44 while ((ba_message[splitPos] & firstOfMultiByteMask) != firstOfMultiByteMask) {
50 splittedMsgs.append(QString{ba_message.left(splitPos + 1)});
51 ba_message = ba_message.mid(splitPos + 1);
54 splittedMsgs.append(QString{ba_message});
60 QString sanename = username;
61 sanename.remove(QRegularExpression(
"[\\t\\n\\v\\f\\r\\x0000]"));
62 nameMention = QRegularExpression(
"\\b" + QRegularExpression::escape(username) +
"\\b",
63 QRegularExpression::CaseInsensitiveOption);
65 QRegularExpression::CaseInsensitiveOption);
75 pubKeyMention = QRegularExpression(
"\\b" + pk +
"\\b",
76 QRegularExpression::CaseInsensitiveOption);
88 std::vector<Message> ret;
94 const auto splitMsgs = splitMessage(content, maxSendingSize);
96 ret.reserve(splitMsgs.size());
98 QDateTime timestamp = QDateTime::currentDateTime();
99 std::transform(splitMsgs.begin(), splitMsgs.end(), std::back_inserter(ret),
100 [&](
const QString& part) {
102 message.isAction = isAction;
103 message.content = part;
104 message.timestamp = timestamp;
108 message.extensionSet = extensions;
120 QDateTime timestamp = QDateTime::currentDateTime();
124 ret.timestamp = timestamp;
131 for (
auto const& mention : {nameMention, sanitizedNameMention, pubKeyMention}) {
132 auto matchIt = mention.globalMatch(ret.content);
133 if (!matchIt.hasNext()) {
137 auto match = matchIt.next();
139 auto pos =
static_cast<size_t>(match.capturedStart());
140 auto length =
static_cast<size_t>(match.capturedLength());
163 message.timestamp = QDateTime::currentDateTime();