libkazv
room-model.hpp
Go to the documentation of this file.
1 /*
2  * This file is part of libkazv.
3  * SPDX-FileCopyrightText: 2021-2023 tusooa <tusooa@kazv.moe>
4  * SPDX-License-Identifier: AGPL-3.0-or-later
5  */
6 
7 
8 #pragma once
9 #include <libkazv-config.hpp>
10 
11 #include <string>
12 #include <variant>
13 #include <immer/flex_vector.hpp>
14 #include <immer/map.hpp>
15 
20 
21 #include <csapi/sync.hpp>
22 #include <event.hpp>
23 
24 #include <crypto.hpp>
25 #include "push-rules-desc.hpp"
26 #include "local-echo.hpp"
27 #include "clientutil.hpp"
28 
29 namespace Kazv
30 {
32  {
33  std::string txnId;
34  immer::map<std::string, immer::map<std::string, Event>> messages;
35  };
36 
37  PendingRoomKeyEvent makePendingRoomKeyEventV0(std::string txnId, Event event, immer::map<std::string, immer::flex_vector<std::string>> devices);
38 
39  struct ReadReceipt
40  {
41  std::string eventId;
43  };
44 
45  template<class Archive>
46  void serialize(Archive &ar, ReadReceipt &r, std::uint32_t const /* version */)
47  {
48  ar & r.eventId & r.timestamp;
49  }
50 
51  bool operator==(const ReadReceipt &a, const ReadReceipt &b);
52  bool operator!=(const ReadReceipt &a, const ReadReceipt &b);
53 
54  struct EventReader
55  {
56  std::string userId;
58  };
59 
60  bool operator==(const EventReader &a, const EventReader &b);
61  bool operator!=(const EventReader &a, const EventReader &b);
62 
64  {
65  immer::flex_vector<Event> stateEvents;
66  };
67 
72  {
73  immer::flex_vector<Event> stateEvents;
74  };
75 
77  {
79  immer::flex_vector<Event> events;
80  std::optional<std::string> prevBatch;
81  std::optional<bool> limited;
82  std::optional<std::string> gapEventId;
83  };
84 
86  {
87  immer::flex_vector<Event> events;
88  };
89 
91  {
93  };
94 
96  {
97  immer::flex_vector<Event> events;
98  };
99 
101  {
103  };
104 
106  {
107  std::string localDraft;
108  };
109 
111  {
112  };
113 
115  {
116  };
117 
119  {
120  immer::flex_vector<std::string> heroIds;
121  };
122 
124  {
126  };
127 
129  {
130  std::string txnId;
131  };
132 
134  {
136  };
137 
139  {
140  std::string txnId;
141  };
142 
144  {
145  std::size_t joinedMemberCount;
146  };
147 
149  {
150  std::size_t invitedMemberCount;
151  };
152 
157  {
160  std::string myUserId;
161  };
162 
165  {
166  std::string myUserId;
167  };
168 
169  inline bool operator==(const PendingRoomKeyEvent &a, const PendingRoomKeyEvent &b)
170  {
171  return a.txnId == b.txnId && a.messages == b.messages;
172  }
173 
174  inline bool operator!=(const PendingRoomKeyEvent &a, const PendingRoomKeyEvent &b)
175  {
176  return !(a == b);
177  }
178 
179  inline const double ROOM_TAG_DEFAULT_ORDER = 2;
180 
181  template<class Archive>
182  void serialize(Archive &ar, PendingRoomKeyEvent &e, std::uint32_t const version)
183  {
184  if (version < 1) {
185  // loading an older version where there is only one event
186  std::string txnId;
187  Event event;
188  immer::map<std::string, immer::flex_vector<std::string>> devices;
189  ar & txnId & event & devices;
191  std::move(txnId), std::move(event), std::move(devices));
192  } else {
193  ar & e.txnId & e.messages;
194  }
195  }
196 
207  auto sortKeyForTimelineEvent(Event e) -> std::tuple<Timestamp, std::string>;
208 
209  struct RoomModel
210  {
212  using ReverseEventRelationshipMap = immer::map<
213  std::string /* related event id */,
214  immer::map<std::string /* relation type */, immer::flex_vector<std::string /* relater event id */>>>;
215 
216  std::string roomId;
217  immer::map<KeyOfState, Event> stateEvents;
218  immer::map<KeyOfState, Event> inviteState;
219  // Smaller indices mean earlier events
220  // (oldest) 0 --------> n (latest)
221  immer::flex_vector<std::string> timeline;
222  immer::map<std::string, Event> messages;
223  immer::map<std::string, Event> accountData;
225  std::string paginateBackToken;
227  bool canPaginateBack{true};
228 
229  immer::map<std::string /* eventId */, std::string /* prevBatch */> timelineGaps;
230 
231  immer::map<std::string, Event> ephemeral;
232 
233  std::string localDraft;
234 
235  bool encrypted{false};
241 
242  bool membersFullyLoaded{false};
243  immer::flex_vector<std::string> heroIds;
244 
245  immer::flex_vector<LocalEchoDesc> localEchoes;
246 
247  immer::flex_vector<PendingRoomKeyEvent> pendingRoomKeyEvents;
248 
250 
251  std::size_t joinedMemberCount{0};
252  std::size_t invitedMemberCount{0};
253 
256  std::string localReadMarker;
258  std::size_t localUnreadCount{0};
261  std::size_t localNotificationCount{0};
263  immer::map<std::string /* userId */, ReadReceipt> readReceipts;
266  immer::map<
267  std::string /* eventId */,
268  immer::flex_vector<std::string /* userId */>> eventReadUsers;
269 
272  immer::map<
273  std::string /* sessionId */,
274  immer::flex_vector<std::string /* eventId */>> undecryptedEvents;
275 
276  immer::flex_vector<std::string> unreadNotificationEventIds;
277 
278  immer::flex_vector<std::string> joinedMemberIds() const;
279  immer::flex_vector<std::string> invitedMemberIds() const;
280  immer::flex_vector<std::string> knockedMemberIds() const;
281  immer::flex_vector<std::string> leftMemberIds() const;
282  immer::flex_vector<std::string> bannedMemberIds() const;
283 
287  EventList leftMemberEvents() const;
289  EventList heroMemberEvents() const;
290 
292 
293  bool hasUser(std::string userId) const;
294 
295  std::optional<LocalEchoDesc> getLocalEchoByTxnId(std::string txnId) const;
296  std::optional<PendingRoomKeyEvent> getPendingRoomKeyEventByTxnId(std::string txnId) const;
297 
298  immer::map<std::string, double> tags() const;
299 
300  Event makeAddTagEvent(std::string tagId, std::optional<double> order) const;
301  Event makeRemoveTagEvent(std::string tagId) const;
302 
310  void generateRelationships(EventList newEvents);
311 
313 
320  void addToUndecryptedEvents(EventList newEvents);
321 
323 
324  using Action = std::variant<
344  >;
345 
346  static RoomModel update(RoomModel r, Action a);
347  };
348 
350 
351  inline bool operator==(const RoomModel &a, const RoomModel &b)
352  {
353  return a.roomId == b.roomId
354  && a.stateEvents == b.stateEvents
355  && a.inviteState == b.inviteState
356  && a.timeline == b.timeline
357  && a.messages == b.messages
358  && a.accountData == b.accountData
359  && a.membership == b.membership
362  && a.timelineGaps == b.timelineGaps
363  && a.ephemeral == b.ephemeral
364  && a.localDraft == b.localDraft
365  && a.encrypted == b.encrypted
368  && a.heroIds == b.heroIds
369  && a.localEchoes == b.localEchoes
376  && a.readReceipts == b.readReceipts
380  ;
381  }
382 
384  {
385  std::string roomId;
387  };
388 
390  {
391  immer::map<std::string, RoomModel> rooms;
392 
393  inline auto at(std::string id) const { return rooms.at(id); }
394  inline auto operator[](std::string id) const { return rooms[id]; }
395  inline bool has(std::string id) const { return rooms.find(id); }
396 
397  using Action = std::variant<
399  >;
401  };
402 
404 
405  inline bool operator==(const RoomListModel &a, const RoomListModel &b)
406  {
407  return a.rooms == b.rooms;
408  }
409 
410  template<class Archive>
411  void serialize(Archive &ar, RoomModel &r, std::uint32_t const version)
412  {
413  ar
414  & r.roomId
415  & r.stateEvents
416  & r.inviteState
417 
418  & r.timeline
419  & r.messages
420  & r.accountData
421  & r.membership
423  & r.canPaginateBack
424 
425  & r.timelineGaps
426  & r.ephemeral
427 
428  & r.localDraft
429 
430  & r.encrypted
432 
434  ;
435 
436  if (version >= 1) {
437  ar
438  & r.heroIds
439  ;
440  }
441  if (version >= 2) {
442  ar & r.localEchoes;
443  }
444  if (version >= 3) {
445  ar & r.pendingRoomKeyEvents;
446  }
447  if (version >= 4) {
449  } else { // must be reading from an older version
450  if constexpr (typename Archive::is_loading()) {
452  }
453  }
454  if (version >= 5) {
456  }
457  if (version >= 6) {
458  ar
459  & r.localReadMarker
460  & r.localUnreadCount
462  & r.readReceipts
463  & r.eventReadUsers;
464  }
465  if (version >= 7) {
466  ar & r.undecryptedEvents;
467  } else {
468  if constexpr (typename Archive::is_loading()) {
470  }
471  }
472  if (version >= 8) {
474  }
475  }
476 
477  template<class Archive>
478  void serialize(Archive &ar, RoomListModel &l, std::uint32_t const /*version*/)
479  {
480  ar & l.rooms;
481  }
482 }
483 
484 BOOST_CLASS_VERSION(Kazv::PendingRoomKeyEvent, 1)
485 BOOST_CLASS_VERSION(Kazv::ReadReceipt, 0)
486 BOOST_CLASS_VERSION(Kazv::RoomModel, 8)
487 BOOST_CLASS_VERSION(Kazv::RoomListModel, 0)
Kazv::ChangeInviteStateAction::events
immer::flex_vector< Event > events
Definition: room-model.hpp:97
Kazv::RoomModel::tags
immer::map< std::string, double > tags() const
Definition: room-model.cpp:571
Kazv::AddLocalEchoAction
Definition: room-model.hpp:123
Kazv::RoomModel::heroMemberEvents
EventList heroMemberEvents() const
Definition: room-model.cpp:492
Kazv::RoomModel::shouldRotateSessionKey
bool shouldRotateSessionKey
a marker to indicate whether we need to rotate the session key earlier than it expires (e....
Definition: room-model.hpp:240
Kazv::RoomModel::localUnreadCount
std::size_t localUnreadCount
The local unread count for this room.
Definition: room-model.hpp:258
immer-box.hpp
Kazv::AddToTimelineAction::gapEventId
std::optional< std::string > gapEventId
Definition: room-model.hpp:82
Kazv::RoomModel::invitedMemberEvents
EventList invitedMemberEvents() const
Definition: room-model.cpp:472
Kazv::RoomModel::heroIds
immer::flex_vector< std::string > heroIds
Definition: room-model.hpp:243
Kazv::RoomModel::membership
Membership membership
Definition: room-model.hpp:224
Kazv::RoomModel::messages
immer::map< std::string, Event > messages
Definition: room-model.hpp:222
Kazv::RoomModel::reverseEventRelationships
ReverseEventRelationshipMap reverseEventRelationships
Definition: room-model.hpp:249
Kazv::RoomListModel::update
static RoomListModel update(RoomListModel l, Action a)
Definition: room-model.cpp:384
Kazv::ChangeMembershipAction
Definition: room-model.hpp:90
Kazv::RoomModel::invitedMemberCount
std::size_t invitedMemberCount
Definition: room-model.hpp:252
Kazv::RoomModel::localDraft
std::string localDraft
Definition: room-model.hpp:233
Kazv::RoomModel::stateEvents
immer::map< KeyOfState, Event > stateEvents
Definition: room-model.hpp:217
Kazv::ReadReceipt::timestamp
Timestamp timestamp
Definition: room-model.hpp:42
Kazv::PendingRoomKeyEvent
Definition: room-model.hpp:31
Kazv::ChangeInviteStateAction
Definition: room-model.hpp:95
Kazv::RoomModel::timeline
immer::flex_vector< std::string > timeline
Definition: room-model.hpp:221
Kazv::AddEphemeralAction::events
EventList events
Definition: room-model.hpp:102
Kazv::MarkMembersFullyLoadedAction
Definition: room-model.hpp:114
clientutil.hpp
Kazv::RoomModel::regenerateRelationships
void regenerateRelationships()
Definition: room-model.cpp:631
Kazv::RemovePendingRoomKeyAction
Definition: room-model.hpp:138
Kazv::RoomModel::encrypted
bool encrypted
Definition: room-model.hpp:235
Kazv::operator!=
bool operator!=(BaseJob a, BaseJob b)
Definition: basejob.cpp:292
Kazv::ROOM_TAG_DEFAULT_ORDER
const double ROOM_TAG_DEFAULT_ORDER
Definition: room-model.hpp:179
Kazv::RoomMembership
RoomMembership
Definition: types.hpp:116
Kazv::RoomModel::roomId
std::string roomId
Definition: room-model.hpp:216
Kazv::RoomListModel::rooms
immer::map< std::string, RoomModel > rooms
Definition: room-model.hpp:391
event.hpp
Kazv::RoomListModel::at
auto at(std::string id) const
Definition: room-model.hpp:393
Kazv::RoomModel::hasUser
bool hasUser(std::string userId) const
Definition: room-model.cpp:525
Kazv::UpdateRoomAction::roomAction
RoomAction roomAction
Definition: room-model.hpp:386
Kazv::AddToTimelineAction
Definition: room-model.hpp:76
Kazv::makePendingRoomKeyEventV0
PendingRoomKeyEvent makePendingRoomKeyEventV0(std::string txnId, Event event, immer::map< std::string, immer::flex_vector< std::string >> devices)
Definition: room-model.cpp:25
Kazv::operator==
bool operator==(BaseJob a, BaseJob b)
Definition: basejob.cpp:280
Kazv::RoomModel::knockedMemberEvents
EventList knockedMemberEvents() const
Definition: room-model.cpp:477
Kazv::RemoveReadLocalNotificationsAction::myUserId
std::string myUserId
Definition: room-model.hpp:166
Kazv::RoomModel::getPendingRoomKeyEventByTxnId
std::optional< PendingRoomKeyEvent > getPendingRoomKeyEventByTxnId(std::string txnId) const
Definition: room-model.cpp:550
Kazv::EventReader::userId
std::string userId
Definition: room-model.hpp:56
Kazv
Definition: location.hpp:10
Kazv::RoomModel::joinedMemberIds
immer::flex_vector< std::string > joinedMemberIds() const
Definition: room-model.cpp:442
Kazv::Timestamp
std::int_fast64_t Timestamp
Definition: event.hpp:18
Kazv::MegOlmSessionRotateDesc
Definition: crypto.hpp:26
Kazv::UpdateJoinedMemberCountAction::joinedMemberCount
std::size_t joinedMemberCount
Definition: room-model.hpp:145
Kazv::RoomModel::joinedMemberEvents
EventList joinedMemberEvents() const
Definition: room-model.cpp:467
Kazv::UpdateJoinedMemberCountAction
Definition: room-model.hpp:143
Kazv::RoomListModel::operator[]
auto operator[](std::string id) const
Definition: room-model.hpp:394
Kazv::RoomModel::bannedMemberIds
immer::flex_vector< std::string > bannedMemberIds() const
Definition: room-model.cpp:462
Kazv::RoomModel::makeAddTagEvent
Event makeAddTagEvent(std::string tagId, std::optional< double > order) const
Definition: room-model.cpp:600
Kazv::AddPendingRoomKeyAction
Definition: room-model.hpp:133
Kazv::RoomModel::getLocalEchoByTxnId
std::optional< LocalEchoDesc > getLocalEchoByTxnId(std::string txnId) const
Definition: room-model.cpp:538
Kazv::AddToTimelineAction::prevBatch
std::optional< std::string > prevBatch
Definition: room-model.hpp:80
Kazv::RoomModel::update
static RoomModel update(RoomModel r, Action a)
Definition: room-model.cpp:66
Kazv::SetLocalDraftAction
Definition: room-model.hpp:105
Kazv::RoomModel
Definition: room-model.hpp:209
Kazv::RoomModel::ephemeral
immer::map< std::string, Event > ephemeral
Definition: room-model.hpp:231
Kazv::EventReader
Definition: room-model.hpp:54
Kazv::RoomModel::makeRemoveTagEvent
Event makeRemoveTagEvent(std::string tagId) const
Definition: room-model.cpp:612
Kazv::RoomModel::leftMemberEvents
EventList leftMemberEvents() const
Definition: room-model.cpp:482
Kazv::serialize
void serialize(Archive &ar, ClientModel &m, std::uint32_t const version)
Definition: client-model.hpp:582
Kazv::AddPendingRoomKeyAction::pendingRoomKeyEvent
PendingRoomKeyEvent pendingRoomKeyEvent
Definition: room-model.hpp:135
Kazv::PushRulesDesc
Definition: push-rules-desc.hpp:37
Kazv::RoomModel::membersFullyLoaded
bool membersFullyLoaded
Definition: room-model.hpp:242
Kazv::RoomModel::paginateBackToken
std::string paginateBackToken
Definition: room-model.hpp:225
Kazv::PendingRoomKeyEvent::messages
immer::map< std::string, immer::map< std::string, Event > > messages
Definition: room-model.hpp:34
Kazv::RoomModel::joinedMemberCount
std::size_t joinedMemberCount
Definition: room-model.hpp:251
Kazv::RoomModel::readReceipts
immer::map< std::string, ReadReceipt > readReceipts
Read receipts for all users.
Definition: room-model.hpp:263
Kazv::RoomModel::localReadMarker
std::string localReadMarker
The local read marker for this room.
Definition: room-model.hpp:256
Kazv::RoomModel::canPaginateBack
bool canPaginateBack
whether this room has earlier events to be fetched
Definition: room-model.hpp:227
Kazv::RoomListAction
RoomListModel::Action RoomListAction
Definition: room-model.hpp:403
Kazv::RoomModel::sessionRotateDesc
MegOlmSessionRotateDesc sessionRotateDesc() const
Definition: room-model.cpp:512
local-echo.hpp
Kazv::SetRoomEncryptionAction
Definition: room-model.hpp:110
Kazv::RemoveLocalEchoAction
Definition: room-model.hpp:128
Kazv::EventReader::timestamp
Timestamp timestamp
Definition: room-model.hpp:57
Kazv::RoomModel::localNotificationCount
std::size_t localNotificationCount
The local unread notification count for this room.
Definition: room-model.hpp:261
Kazv::ReadReceipt
Definition: room-model.hpp:39
Kazv::AddLocalEchoAction::localEcho
LocalEchoDesc localEcho
Definition: room-model.hpp:125
Kazv::RoomModel::unreadNotificationEventIds
immer::flex_vector< std::string > unreadNotificationEventIds
Definition: room-model.hpp:276
Kazv::RoomModel::bannedMemberEvents
EventList bannedMemberEvents() const
Definition: room-model.cpp:487
push-rules-desc.hpp
Kazv::RoomModel::eventReadUsers
immer::map< std::string, immer::flex_vector< std::string > > eventReadUsers
A map from event id to a list of users that has read receipt at that point.
Definition: room-model.hpp:268
Kazv::AddAccountDataAction::events
immer::flex_vector< Event > events
Definition: room-model.hpp:87
Kazv::UpdateRoomAction::roomId
std::string roomId
Definition: room-model.hpp:385
Kazv::MaybeAddStateEventsAction::stateEvents
immer::flex_vector< Event > stateEvents
Definition: room-model.hpp:73
Kazv::RoomModel::localEchoes
immer::flex_vector< LocalEchoDesc > localEchoes
Definition: room-model.hpp:245
Kazv::RemoveReadLocalNotificationsAction
Remove local notifications that are already read.
Definition: room-model.hpp:164
Kazv::RoomModel::generateRelationships
void generateRelationships(EventList newEvents)
Fill in reverseEventRelationships by gathering the relationships specified in newEvents
Definition: room-model.cpp:619
Kazv::RoomModel::inviteState
immer::map< KeyOfState, Event > inviteState
Definition: room-model.hpp:218
Kazv::Event
Definition: event.hpp:20
immer-map.hpp
Kazv::AddLocalNotificationsAction::pushRulesDesc
PushRulesDesc pushRulesDesc
Definition: room-model.hpp:159
Kazv::AddEphemeralAction
Definition: room-model.hpp:100
Kazv::AddStateEventsAction
Definition: room-model.hpp:63
Kazv::AddAccountDataAction
Definition: room-model.hpp:85
Kazv::AddStateEventsAction::stateEvents
immer::flex_vector< Event > stateEvents
Definition: room-model.hpp:65
libkazv-config.hpp
immer-flex-vector.hpp
Kazv::AddLocalNotificationsAction
Update local notifications to include the new events.
Definition: room-model.hpp:156
Kazv::SetLocalDraftAction::localDraft
std::string localDraft
Definition: room-model.hpp:107
Kazv::PendingRoomKeyEvent::txnId
std::string txnId
Definition: room-model.hpp:33
Kazv::RoomAction
RoomModel::Action RoomAction
Definition: room-model.hpp:349
Kazv::RoomModel::undecryptedEvents
immer::map< std::string, immer::flex_vector< std::string > > undecryptedEvents
A map from the session id to a list of event ids of events that cannot (yet) be decrypted.
Definition: room-model.hpp:274
Kazv::RoomModel::recalculateUndecryptedEvents
void recalculateUndecryptedEvents()
Definition: room-model.cpp:662
Kazv::RoomModel::pendingRoomKeyEvents
immer::flex_vector< PendingRoomKeyEvent > pendingRoomKeyEvents
Definition: room-model.hpp:247
Kazv::MaybeAddStateEventsAction
Go from the back of stateEvents to the beginning, adding the event to room state only if the room has...
Definition: room-model.hpp:71
crypto.hpp
Kazv::sortKeyForTimelineEvent
auto sortKeyForTimelineEvent(Event e) -> std::tuple< Timestamp, std::string >
Get the sort key for a timeline event.
Definition: room-model.cpp:61
Kazv::AddToTimelineAction::limited
std::optional< bool > limited
Definition: room-model.hpp:81
Kazv::SetHeroIdsAction::heroIds
immer::flex_vector< std::string > heroIds
Definition: room-model.hpp:120
sync.hpp
Kazv::RoomModel::accountData
immer::map< std::string, Event > accountData
Definition: room-model.hpp:223
Kazv::RoomListModel
Definition: room-model.hpp:389
Kazv::AddLocalNotificationsAction::myUserId
std::string myUserId
Definition: room-model.hpp:160
Kazv::RoomModel::ReverseEventRelationshipMap
immer::map< std::string, immer::map< std::string, immer::flex_vector< std::string > >> ReverseEventRelationshipMap
Definition: room-model.hpp:214
Kazv::RoomListModel::Action
std::variant< UpdateRoomAction > Action
Definition: room-model.hpp:399
Kazv::RoomModel::invitedMemberIds
immer::flex_vector< std::string > invitedMemberIds() const
Definition: room-model.cpp:447
Kazv::AddToTimelineAction::events
immer::flex_vector< Event > events
Events from oldest to latest.
Definition: room-model.hpp:79
Kazv::EventList
immer::flex_vector< Event > EventList
Definition: types.hpp:96
Kazv::RemovePendingRoomKeyAction::txnId
std::string txnId
Definition: room-model.hpp:140
Kazv::UpdateInvitedMemberCountAction::invitedMemberCount
std::size_t invitedMemberCount
Definition: room-model.hpp:150
Kazv::ReadReceipt::eventId
std::string eventId
Definition: room-model.hpp:41
Kazv::RoomModel::addToUndecryptedEvents
void addToUndecryptedEvents(EventList newEvents)
Fill in undecryptedEvents by gathering the session ids specified in newEvents.
Definition: room-model.cpp:638
Kazv::ChangeMembershipAction::membership
RoomMembership membership
Definition: room-model.hpp:92
Kazv::RoomModel::knockedMemberIds
immer::flex_vector< std::string > knockedMemberIds() const
Definition: room-model.cpp:452
Kazv::RoomModel::Action
std::variant< AddStateEventsAction, MaybeAddStateEventsAction, AddToTimelineAction, AddAccountDataAction, ChangeMembershipAction, ChangeInviteStateAction, AddEphemeralAction, SetLocalDraftAction, SetRoomEncryptionAction, MarkMembersFullyLoadedAction, SetHeroIdsAction, AddLocalEchoAction, RemoveLocalEchoAction, AddPendingRoomKeyAction, RemovePendingRoomKeyAction, UpdateJoinedMemberCountAction, UpdateInvitedMemberCountAction, AddLocalNotificationsAction, RemoveReadLocalNotificationsAction > Action
Definition: room-model.hpp:344
Kazv::RoomListModel::has
bool has(std::string id) const
Definition: room-model.hpp:395
Kazv::AddLocalNotificationsAction::newEvents
EventList newEvents
Definition: room-model.hpp:158
Kazv::SetHeroIdsAction
Definition: room-model.hpp:118
Kazv::RoomModel::timelineGaps
immer::map< std::string, std::string > timelineGaps
Definition: room-model.hpp:229
immer-array.hpp
Kazv::RemoveLocalEchoAction::txnId
std::string txnId
Definition: room-model.hpp:130
Kazv::LocalEchoDesc
Describes a local echo.
Definition: local-echo.hpp:18
Kazv::UpdateRoomAction
Definition: room-model.hpp:383
Kazv::UpdateInvitedMemberCountAction
Definition: room-model.hpp:148
Kazv::RoomModel::leftMemberIds
immer::flex_vector< std::string > leftMemberIds() const
Definition: room-model.cpp:457