diff --git a/include/TimelineItem.h b/include/TimelineItem.h
index df43c26d..59c79d50 100644
--- a/include/TimelineItem.h
+++ b/include/TimelineItem.h
@@ -25,6 +25,7 @@
#include "Sync.h"
#include "Avatar.h"
+#include "Emote.h"
#include "Image.h"
#include "MessageEvent.h"
#include "Notice.h"
@@ -44,6 +45,9 @@ public:
TimelineItem(const events::MessageEvent<msgs::Text> &e,
bool with_sender,
QWidget *parent = 0);
+ TimelineItem(const events::MessageEvent<msgs::Emote> &e,
+ bool with_sender,
+ QWidget *parent = 0);
// For local messages.
TimelineItem(const QString &userid, QString body, QWidget *parent = 0);
diff --git a/include/TimelineView.h b/include/TimelineView.h
index c6eef266..7583e4c2 100644
--- a/include/TimelineView.h
+++ b/include/TimelineView.h
@@ -28,6 +28,7 @@
#include "TimelineItem.h"
#include "Image.h"
+#include "Emote.h"
#include "Notice.h"
#include "RoomInfoListItem.h"
#include "Text.h"
@@ -77,6 +78,8 @@ public:
bool with_sender);
TimelineItem *createTimelineItem(const events::MessageEvent<msgs::Text> &e,
bool with_sender);
+ TimelineItem *createTimelineItem(const events::MessageEvent<msgs::Emote> &e,
+ bool with_sender);
// Add new events at the end of the timeline.
int addEvents(const Timeline &timeline);
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)
{
|