Skip to content
Snippets Groups Projects
Commit 9f320d9f authored by Nicolas Werner's avatar Nicolas Werner
Browse files

Try to handle state replacements

parent 1415d3c2
No related branches found
No related tags found
No related merge requests found
......@@ -40,6 +40,9 @@ template <class T> auto eventUserId(const mtx::events::RoomEvent<T> &e) -> std::
template <class T> auto eventTimestamp(const mtx::events::Event<T> &e) -> uint64_t { return 0; }
template <class T> auto eventTimestamp(const mtx::events::RoomEvent<T> &e) -> uint64_t { return e.origin_server_ts; }
template <class T> auto eventStateKey(const mtx::events::Event<T> &e) -> std::string { return ""; }
template <class T> auto eventStateKey(const mtx::events::StateEvent<T> &e) -> std::string { return e.state_key; }
template <class T>::EventType::Type toRoomEventType(const Event<T> &e) {
using mtx::events::EventType;
switch (e.type) {
......@@ -138,19 +141,31 @@ void Room::addEvents(std::vector<mtx::events::collections::TimelineEvents> event
using namespace mtx::events;
if (this->prev_batch == next_batch) {
qDebug() << "New events at beginning of timeline";
int i = 0;
for (const auto &event : this->events) {
if (boost::apply_visitor([](const auto &e) -> uint64_t { return eventTimestamp(e); }, event) != 0)
break;
i++;
for (const auto &event : events) {
std::string state_key =
boost::apply_visitor([](const auto &e) -> std::string { return eventStateKey(e); }, event);
if (!state_key.empty() && stateKeys.count(state_key)) {
for (int i = 0; i < (int)this->events.size(); i++) {
if (boost::apply_visitor([](const auto &e) -> std::string { return eventStateKey(e); },
this->events[i]) == state_key) {
beginRemoveRows(QModelIndex(), i, i);
this->events.erase(this->events.begin() + i);
endRemoveRows();
break;
}
}
}
}
beginInsertRows(QModelIndex(), (int)i, (int)events.size() + i - 1);
this->events.insert(this->events.begin() + i, events.begin(), events.end());
beginInsertRows(QModelIndex(), (int)0, (int)events.size() - 1);
this->events.insert(this->events.begin(), events.begin(), events.end());
this->prev_batch = prev_batch;
endInsertRows();
} else {
for (const mtx::events::collections::TimelineEvents &e : events) {
this->stateKeys.insert(
boost::apply_visitor([](const auto &e) -> std::string { return eventStateKey(e); }, e));
if (const auto ev = boost::get<StateEvent<state::Aliases>>(&e)) {
if (this->canonical_alias.empty() && !ev->content.aliases.empty())
this->canonical_alias = ev->content.aliases.front();
......
......@@ -130,6 +130,7 @@ struct Room : public QAbstractListModel {
std::vector<std::string> tags;
std::set<std::string> members;
std::set<std::string> stateKeys;
std::map<std::string, MemberInfo> memberInfos;
void applyEvents(const std::vector<mtx::events::collections::TimelineEvents> &events, std::string prev_batch,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment