aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorKitsune Ral <Kitsune-Ral@users.sf.net>2018-11-19 09:22:27 +0900
committerKitsune Ral <Kitsune-Ral@users.sf.net>2018-11-19 09:22:27 +0900
commite1fdb33a4161b29d6df590ccea339d361d9fc4e8 (patch)
tree730a6efb2a2987454855cfe01719e93004c67d1b /lib
parent06998c1406aab9943b62d6facb36cdee1cf52115 (diff)
downloadlibquotient-e1fdb33a4161b29d6df590ccea339d361d9fc4e8.tar.gz
libquotient-e1fdb33a4161b29d6df590ccea339d361d9fc4e8.zip
Don't cache empty events; prepare for lazy-loading
These two are intermingled in Room::addHistoricalMessageEvents because processing empty events found in a historical batch is no different from discovering (not lazy-loaded) members.
Diffstat (limited to 'lib')
-rw-r--r--lib/room.cpp38
1 files changed, 30 insertions, 8 deletions
diff --git a/lib/room.cpp b/lib/room.cpp
index 5faff271..656788cb 100644
--- a/lib/room.cpp
+++ b/lib/room.cpp
@@ -1784,14 +1784,25 @@ void Room::Private::addHistoricalMessageEvents(RoomEvents&& events)
const auto timelineSize = timeline.size();
dropDuplicateEvents(events);
- RoomEventsRange normalEvents {
- events.begin(), events.end() //remove_if(events.begin(), events.end(), isRedaction)
- };
- if (normalEvents.empty())
+ if (events.empty())
return;
- emit q->aboutToAddHistoricalMessages(normalEvents);
- const auto insertedSize = moveEventsToTimeline(normalEvents, Older);
+ // In case of lazy-loading new members may be loaded with historical
+ // messages. Also, the cache doesn't store events with empty content;
+ // so when such events show up in the timeline they should be properly
+ // incorporated.
+ for (const auto& eptr: events)
+ {
+ const auto& e = *eptr;
+ if (e.isStateEvent() &&
+ !currentState.contains({e.matrixType(), e.stateKey()}))
+ {
+ q->processStateEvent(e);
+ }
+ }
+
+ emit q->aboutToAddHistoricalMessages(events);
+ const auto insertedSize = moveEventsToTimeline(events, Older);
const auto from = timeline.crend() - insertedSize;
qCDebug(MAIN) << "Room" << displayname << "received" << insertedSize
@@ -2085,7 +2096,15 @@ QJsonObject Room::Private::toJson() const
for (const auto* evt: currentState)
{
Q_ASSERT(evt->isStateEvent());
- stateEvents.append(evt->fullJson());
+ if ((evt->isRedacted() && !is<RoomMemberEvent>(*evt)) ||
+ evt->contentJson().isEmpty())
+ continue;
+
+ auto json = evt->fullJson();
+ auto unsignedJson = evt->unsignedJson();
+ unsignedJson.remove(QStringLiteral("prev_content"));
+ json[UnsignedKeyL] = unsignedJson;
+ stateEvents.append(json);
}
const auto stateObjName = joinState == JoinState::Invite ?
@@ -2098,7 +2117,10 @@ QJsonObject Room::Private::toJson() const
{
QJsonArray accountDataEvents;
for (const auto& e: accountData)
- accountDataEvents.append(e.second->fullJson());
+ {
+ if (!e.second->contentJson().isEmpty())
+ accountDataEvents.append(e.second->fullJson());
+ }
result.insert(QStringLiteral("account_data"),
QJsonObject {{ QStringLiteral("events"), accountDataEvents }});
}