diff --git a/src/ruqolacore/messages/message.cpp b/src/ruqolacore/messages/message.cpp index 7b3f9a23..60a8c99e 100644 --- a/src/ruqolacore/messages/message.cpp +++ b/src/ruqolacore/messages/message.cpp @@ -1,702 +1,703 @@ /* Copyright (c) 2017-2019 Montel Laurent This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License or ( at your option ) version 3 or, at the discretion of KDE e.V. ( which shall act as a proxy as in section 14 of the GPLv3 ), any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "message.h" #include "utils.h" #include "ruqola_debug.h" #include #include #include Message::Message() { } void Message::parseMessage(const QJsonObject &o, bool restApi) { const QString roomId = o.value(QLatin1String("rid")).toString(); //t ? I can't find it. const QString type = o.value(QLatin1String("t")).toString(); mMessageId = o.value(QLatin1String("_id")).toString(); mRoomId = roomId; mText = o.value(QLatin1String("msg")).toString(); if (restApi) { mUpdatedAt = Utils::parseIsoDate(QStringLiteral("_updatedAt"), o); mEditedAt = Utils::parseIsoDate(QStringLiteral("editedAt"), o); mTimeStamp = Utils::parseIsoDate(QStringLiteral("ts"), o); } else { mTimeStamp = Utils::parseDate(QStringLiteral("ts"), o); mUpdatedAt = Utils::parseDate(QStringLiteral("_updatedAt"), o); mEditedAt = Utils::parseDate(QStringLiteral("editedAt"), o); } mUsername = o.value(QLatin1String("u")).toObject().value(QLatin1String("username")).toString(); mUserId = o.value(QLatin1String("u")).toObject().value(QLatin1String("_id")).toString(); mEditedByUsername = o.value(QLatin1String("editedBy")).toObject().value(QLatin1String("username")).toString(); mEditedByUserId = o.value(QLatin1String("editedBy")).toObject().value(QLatin1String("_id")).toString(); mAlias = o.value(QLatin1String("alias")).toString(); mAvatar = o.value(QLatin1String("avatar")).toString(); mGroupable = o.value(QLatin1String("groupable")).toBool(); mParseUrls = o.value(QLatin1String("parseUrls")).toBool(); mRole = o.value(QLatin1String("role")).toString(); mMessageStarred.parse(o); mMessagePinned.parse(o); mMessageType = Message::MessageType::NormalText; if (!type.isEmpty()) { mSystemMessageType = type; mMessageType = System; } parseMentions(o.value(QLatin1String("mentions")).toArray()); parseAttachment(o.value(QLatin1String("attachments")).toArray()); parseUrls(o.value(QLatin1String("urls")).toArray()); parseReactions(o.value(QLatin1String("reactions")).toObject()); //TODO unread element } void Message::parseReactions(const QJsonObject &reacts) { if (!reacts.isEmpty()) { mReactions.parseReactions(reacts); } } MessageStarred Message::messageStarred() const { return mMessageStarred; } void Message::setMessageStarred(const MessageStarred &messageStarred) { mMessageStarred = messageStarred; } MessagePinned Message::messagePinned() const { return mMessagePinned; } void Message::setMessagePinned(const MessagePinned &messagePinned) { mMessagePinned = messagePinned; } bool Message::unread() const { return mUnread; } void Message::setUnread(bool unread) { mUnread = unread; } QString Message::role() const { return mRole; } void Message::setRole(const QString &role) { mRole = role; } void Message::parseMentions(const QJsonArray &mentions) { mMentions.clear(); for (int i = 0; i < mentions.size(); i++) { const QJsonObject mention = mentions.at(i).toObject(); mMentions.insert(mention.value(QLatin1String("username")).toString(), mention.value(QLatin1String("_id")).toString()); } } void Message::parseUrls(const QJsonArray &urls) { mUrls.clear(); if (!urls.isEmpty()) { qCDebug(RUQOLA_LOG) << " void Message::urls(const QJsonObject &attachements)"< Message::mentions() const { return mMentions; } void Message::setMentions(const QMap &mentions) { mMentions = mentions; } void Message::parseAttachment(const QJsonArray &attachments) { + //TODO add support de support mAttachements.clear(); if (!attachments.isEmpty()) { - //qCDebug(RUQOLA_LOG) << " void Message::parseAttachment(const QJsonObject &attachements)"<%1", mText, mUsername); } } else if (mSystemMessageType == QLatin1String("au")) { return i18n("%2 added %1 to the conversation", mText, mUsername); } else if (mSystemMessageType == QLatin1String("r")) { return i18n("%2 changed room name to #%1", mText, mUsername); } else if (mSystemMessageType == QLatin1String("ru")) { return i18n("%2 removed user %1", mText, mUsername); } else if (mSystemMessageType == QLatin1String("room_changed_description")) { if (mText.isEmpty()) { return i18n("Description was cleared by %1", mUsername); } else { return i18n("%2 changed room description to %1", mText, mUsername); } } else if (mSystemMessageType == QLatin1String("room_changed_announcement")) { if (mText.isEmpty()) { return i18n("Announcement was cleared by %1", mUsername); } else { return i18n("%2 changed room announcement to %1", mText, mUsername); } } else if (mSystemMessageType == QLatin1String("room_changed_privacy")) { return i18n("%2 changed room privacy to %1", mText, mUsername); } else if (mSystemMessageType == QLatin1String("jitsi_call_started")) { return i18n("Click to join to video"); } else if (mSystemMessageType == QLatin1String("rm")) { //TODO encrypted message return i18n("Message Deleted"); } else if (mSystemMessageType == QLatin1String("message_pinned")) { return i18n("Message Pinned"); } else if (mSystemMessageType == QLatin1String("otr")) { return i18n("Encrypted Message"); } else if (mSystemMessageType == QLatin1String("user-unmuted")) { //TODO improve it return i18n("%1 was unmuted", mUsername); } else if (mSystemMessageType == QLatin1String("user-muted")) { //TODO improve it return i18n("%1 was muted", mUsername); } else if (mSystemMessageType == QLatin1String("subscription-role-added")) { return i18n("Role \'%3\' was added to %1 by %2", mUsername, mText, mRole); } else if (mSystemMessageType == QLatin1String("subscription-role-removed")) { return i18n("Role \'%3\' was removed to %1 by %2", mUsername, mText, mRole); } else if (mSystemMessageType == QLatin1String("e2e")) { //TODO need to unencrypt it return i18n("Encrypted message: %1", mText); } else { qCWarning(RUQOLA_LOG) << "Unknown type for message: type: " << mSystemMessageType << " mText " << mText; return i18n("Unknown action!"); } } void Message::setMessageType(const MessageType &messageType) { mMessageType = messageType; } QVector Message::attachements() const { return mAttachements; } void Message::setAttachements(const QVector &attachements) { mAttachements = attachements; } QVector Message::urls() const { return mUrls; } void Message::setUrls(const QVector &urls) { mUrls = urls; } QString Message::alias() const { return mAlias; } void Message::setAlias(const QString &alias) { mAlias = alias; } QString Message::editedByUserId() const { return mEditedByUserId; } void Message::setEditedByUserId(const QString &editedByUserId) { mEditedByUserId = editedByUserId; } QString Message::editedByUsername() const { return mEditedByUsername; } void Message::setEditedByUsername(const QString &editedByUsername) { mEditedByUsername = editedByUsername; } qint64 Message::editedAt() const { return mEditedAt; } void Message::setEditedAt(const qint64 &editedAt) { mEditedAt = editedAt; } qint64 Message::updatedAt() const { return mUpdatedAt; } void Message::setUpdatedAt(const qint64 &updatedAt) { mUpdatedAt = updatedAt; } QString Message::userId() const { return mUserId; } void Message::setUserId(const QString &userId) { mUserId = userId; } QString Message::username() const { return mUsername; } void Message::setUsername(const QString &username) { mUsername = username; } qint64 Message::timeStamp() const { return mTimeStamp; } void Message::setTimeStamp(const qint64 &timeStamp) { mTimeStamp = timeStamp; } QString Message::text() const { return mText; } void Message::setText(const QString &text) { mText = text; } QString Message::messageId() const { return mMessageId; } void Message::setMessageId(const QString &messageId) { mMessageId = messageId; } QString Message::roomId() const { return mRoomId; } void Message::setRoomId(const QString &roomId) { mRoomId = roomId; } QString Message::avatar() const { return mAvatar; } void Message::setAvatar(const QString &avatar) { mAvatar = avatar; } bool Message::parseUrls() const { return mParseUrls; } void Message::setParseUrls(bool parseUrls) { mParseUrls = parseUrls; } bool Message::groupable() const { return mGroupable; } void Message::setGroupable(bool groupable) { mGroupable = groupable; } Message Message::fromJSon(const QJsonObject &o) { Message message; message.mMessageId = o[QStringLiteral("messageID")].toString(); message.mRoomId = o[QStringLiteral("roomID")].toString(); message.mText = o[QStringLiteral("message")].toString(); message.mTimeStamp = static_cast(o[QStringLiteral("timestamp")].toDouble()); message.mUsername = o[QStringLiteral("username")].toString(); message.mUserId = o[QStringLiteral("userID")].toString(); message.mUpdatedAt = static_cast(o[QStringLiteral("updatedAt")].toDouble()); message.mEditedAt = static_cast(o[QStringLiteral("editedAt")].toDouble()); message.mEditedByUsername = o[QStringLiteral("editedByUsername")].toString(); message.mEditedByUserId = o[QStringLiteral("editedByUserID")].toString(); message.mAlias = o[QStringLiteral("alias")].toString(); message.mAvatar = o[QStringLiteral("avatar")].toString(); message.mGroupable = o[QStringLiteral("groupable")].toBool(); message.mParseUrls = o[QStringLiteral("parseUrls")].toBool(); message.mMessageStarred.setIsStarred(o[QStringLiteral("starred")].toBool()); message.mMessagePinned.setPinned(o[QStringLiteral("pinned")].toBool()); message.mRole = o[QStringLiteral("role")].toString(); message.mSystemMessageType = o[QStringLiteral("type")].toString(); message.mMessageType = o[QStringLiteral("messageType")].toVariant().value(); const QJsonArray attachmentsArray = o.value(QLatin1String("attachments")).toArray(); for (int i = 0; i < attachmentsArray.count(); ++i) { const QJsonObject attachment = attachmentsArray.at(i).toObject(); const MessageAttachment att = MessageAttachment::fromJSon(attachment); if (!att.isEmpty()) { message.mAttachements.append(att); } } const QJsonArray urlsArray = o.value(QLatin1String("urls")).toArray(); for (int i = 0; i < urlsArray.count(); ++i) { const QJsonObject urlObj = urlsArray.at(i).toObject(); const MessageUrl url = MessageUrl::fromJSon(urlObj); if (!url.isEmpty()) { message.mUrls.append(url); } } const QJsonObject reactionsArray = o.value(QLatin1String("reactions")).toObject(); message.setReactions(Reactions::fromJSon(reactionsArray)); const QJsonArray mentionsArray = o.value(QLatin1String("mentions")).toArray(); for (int i = 0; i < mentionsArray.count(); ++i) { const QJsonObject mention = mentionsArray.at(i).toObject(); qCDebug(RUQOLA_LOG) << " mention"<(message.mMessageType)); //TODO add mentions //Attachments if (!message.mAttachements.isEmpty()) { QJsonArray array; const int nbAttachment = message.mAttachements.count(); for (int i = 0; i < nbAttachment; ++i) { array.append(MessageAttachment::serialize(message.mAttachements.at(i))); } o[QStringLiteral("attachments")] = array; } //FIXME save mentions QMapIterator i(message.mentions()); while (i.hasNext()) { i.next(); //TODO } //Urls if (!message.mUrls.isEmpty()) { QJsonArray array; const int nbUrls = message.mUrls.count(); for (int i = 0; i < nbUrls; ++i) { array.append(MessageUrl::serialize(message.mUrls.at(i))); } o[QStringLiteral("urls")] = array; } if (!message.reactions().isEmpty()) { o[QStringLiteral("reactions")] = Reactions::serialize(message.reactions()); } d.setObject(o); if (toBinary) { return d.toBinaryData(); } return d.toJson(QJsonDocument::Indented); } QDebug operator <<(QDebug d, const Message &t) { d << "mMessageId : " << t.messageId(); d << "mText: " << t.text(); d << "mTimeStamp: " << t.timeStamp(); d << "mUsername: " << t.username(); d << "mUserId: " << t.userId(); d << "mUpdatedAt: " << t.updatedAt(); d << "mEditedAt: " << t.editedAt(); d << "mEditedByUsername: " << t.editedByUsername(); d << "mEditedByUserId: " << t.editedByUserId(); d << "mAlias: " << t.alias(); d << "mSystemMessageType: " << t.systemMessageType(); d << "mRoomId: " << t.roomId(); d << "mAvatar: " << t.avatar(); d << "mGroupable: " << t.groupable(); d << "mParseUrls: " << t.parseUrls(); for (int i = 0, total = t.attachements().count(); i < total; ++i) { d << "Attachment :" << t.attachements().at(i); } for (int i = 0, total = t.urls().count(); i < total; ++i) { d << "Urls :" << t.urls().at(i); } d << "Mentions :" << t.mentions(); d << "mMessageType: " << t.messageType(); d << "mRole: " << t.role(); d << "mReaction: " << t.reactions(); d << "mUnread: " << t.unread(); d << "starred " << t.messageStarred(); d << "pinned " << t.messagePinned(); return d; }