summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2017-09-02 16:47:59 +0300
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2017-09-02 16:47:59 +0300
commita44a4f36af67c016e207b1cbd63817c6751ed89d (patch)
tree13a8cbee8ae04b081fcbc4999a4e9efe8d9a0ffe /src
parentLinkify URLs in room topics (diff)
downloadnheko-a44a4f36af67c016e207b1cbd63817c6751ed89d.tar.xz
Add read support for m.emote events (#41)
Diffstat (limited to 'src')
-rw-r--r--src/TimelineItem.cc39
-rw-r--r--src/TimelineView.cc29
2 files changed, 66 insertions, 2 deletions
diff --git a/src/TimelineItem.cc b/src/TimelineItem.cc

index cfa5a988..62ebc515 100644 --- a/src/TimelineItem.cc +++ b/src/TimelineItem.cc
@@ -192,6 +192,43 @@ TimelineItem::TimelineItem(const events::MessageEvent<msgs::Notice> &event, } /* + * Used to display remote emote messages. + */ +TimelineItem::TimelineItem(const events::MessageEvent<msgs::Emote> &event, + bool with_sender, + QWidget *parent) + : QWidget(parent) +{ + init(); + + auto body = event.content().body().trimmed().toHtmlEscaped(); + auto timestamp = QDateTime::fromMSecsSinceEpoch(event.timestamp()); + auto displayName = TimelineViewManager::displayName(event.sender()); + auto emoteMsg = QString("* %1 %2").arg(displayName).arg(body); + + descriptionMsg_ = { "", + event.sender(), + emoteMsg, + descriptiveTime(QDateTime::fromMSecsSinceEpoch(event.timestamp())) }; + + generateTimestamp(timestamp); + emoteMsg.replace(URL_REGEX, URL_HTML); + + if (with_sender) { + generateBody(displayName, emoteMsg); + setupAvatarLayout(displayName); + mainLayout_->addLayout(headerLayout_); + + AvatarProvider::resolve(event.sender(), this); + } else { + generateBody(emoteMsg); + setupSimpleLayout(); + } + + mainLayout_->addWidget(body_); +} + +/* * Used to display remote text messages. */ TimelineItem::TimelineItem(const events::MessageEvent<msgs::Text> &event, @@ -216,8 +253,6 @@ TimelineItem::TimelineItem(const events::MessageEvent<msgs::Text> &event, body.replace(URL_REGEX, URL_HTML); if (with_sender) { - auto displayName = TimelineViewManager::displayName(event.sender()); - generateBody(displayName, body); setupAvatarLayout(displayName); diff --git a/src/TimelineView.cc b/src/TimelineView.cc
index 114e5fda..4dd63604 100644 --- a/src/TimelineView.cc +++ b/src/TimelineView.cc
@@ -274,6 +274,28 @@ TimelineView::parseMessageEvent(const QJsonObject &event, TimelineDirection dire updateLastSender(img.sender(), direction); return createTimelineItem(img, with_sender); + } else if (msg_type == events::MessageEventType::Emote) { + events::MessageEvent<msgs::Emote> emote; + + try { + emote.deserialize(event); + } catch (const DeserializationException &e) { + qWarning() << e.what() << event; + return nullptr; + } + + if (isDuplicate(emote.eventId())) + return nullptr; + + eventIds_[emote.eventId()] = true; + + // TODO Check if it's a message waiting for validation + + auto with_sender = isSenderRendered(emote.sender(), direction); + + updateLastSender(emote.sender(), direction); + + return createTimelineItem(emote, with_sender); } else if (msg_type == events::MessageEventType::Unknown) { qWarning() << "Unknown message type" << event; return nullptr; @@ -403,6 +425,13 @@ TimelineView::createTimelineItem(const events::MessageEvent<msgs::Text> &event, return item; } +TimelineItem * +TimelineView::createTimelineItem(const events::MessageEvent<msgs::Emote> &event, bool with_sender) +{ + TimelineItem *item = new TimelineItem(event, with_sender, scroll_widget_); + return item; +} + void TimelineView::addTimelineItem(TimelineItem *item, TimelineDirection direction) {