libkazv
Loading...
Searching...
No Matches
room.hpp
Go to the documentation of this file.
1/*
2 * This file is part of libkazv.
3 * SPDX-FileCopyrightText: 2020-2023 tusooa <tusooa@kazv.moe>
4 * SPDX-License-Identifier: AGPL-3.0-or-later
5 */
6
7#pragma once
8#include <libkazv-config.hpp>
9
10#include <lager/reader.hpp>
11#include <lager/context.hpp>
12#include <lager/with.hpp>
13#include <lager/constant.hpp>
14#include <lager/lenses/optional.hpp>
15#include <zug/transducer/map.hpp>
16#include <zug/transducer/filter.hpp>
17#include <zug/sequence.hpp>
18#include <immer/flex_vector_transient.hpp>
19
20#include "debug.hpp"
21
22#include "sdk-model.hpp"
23#include "client-model.hpp"
24#include "room-model.hpp"
25#include <cursorutil.hpp>
27#include "random-generator.hpp"
28#include "power-levels-desc.hpp"
29
30namespace Kazv
31{
37 class Room
38 {
39 public:
42#ifdef KAZV_USE_THREAD_SAFETY_HELPER
43 , EventLoopThreadIdKeeper &
44#endif
45 >;
47
48 struct InEventLoopTag {};
49
62 Room(lager::reader<SdkModel> sdk,
63 lager::reader<std::string> roomId,
64 ContextT ctx);
65
78 Room(lager::reader<SdkModel> sdk,
79 lager::reader<std::string> roomId,
80 ContextT ctx, DepsT deps);
81
94 Room(InEventLoopTag, std::string roomId, ContextT ctx, DepsT deps);
95
120 Room toEventLoop() const;
121
122 /* lager::reader<MapT<KeyOfState, Event>> */
123 inline auto stateEvents() const {
124 return roomCursor()
126 }
127
133 auto inviteState() const -> lager::reader<immer::map<KeyOfState, Event>>;
134
135 /* lager::reader<std::optional<Event>> */
136 inline auto stateOpt(KeyOfState k) const {
137 return stateEvents()
138 [std::move(k)];
139 }
140
141 /* lager::reader<Event> */
142 inline auto state(KeyOfState k) const {
143 return stateOpt(k)
144 [lager::lenses::or_default];
145 }
146
153 auto timelineEventIds() const -> lager::reader<immer::flex_vector<std::string>>;
154
161 auto messagesMap() const -> lager::reader<immer::map<std::string, Event>>;
162
170 auto timelineEvents() const -> lager::reader<immer::flex_vector<Event>>;
171
179 auto message(lager::reader<std::string> eventId) const -> lager::reader<Event>;
180
188 auto localEcho(lager::reader<std::string> txnId) const -> lager::reader<LocalEchoDesc>;
189
195 auto heroMemberEvents() const -> lager::reader<immer::flex_vector<Event>>;
196
202 auto heroDisplayNames() const -> lager::reader<immer::flex_vector<std::string>>;
203
212 auto nameOpt() const -> lager::reader<std::optional<std::string>>;
213
222 auto name() const -> lager::reader<std::string>;
223
229 auto avatarMxcUri() const -> lager::reader<std::string>;
230
236 auto members() const -> lager::reader<immer::flex_vector<std::string>>;
237
243 auto invitedMembers() const -> lager::reader<immer::flex_vector<std::string>>;
244
250 auto knockedMembers() const -> lager::reader<immer::flex_vector<std::string>>;
251
257 auto leftMembers() const -> lager::reader<immer::flex_vector<std::string>>;
258
264 auto bannedMembers() const -> lager::reader<immer::flex_vector<std::string>>;
265
271 auto joinedMemberEvents() const -> lager::reader<EventList>;
272
278 auto invitedMemberEvents() const -> lager::reader<EventList>;
279
285 auto knockedMemberEvents() const -> lager::reader<EventList>;
286
292 auto leftMemberEvents() const -> lager::reader<EventList>;
293
299 auto bannedMemberEvents() const -> lager::reader<EventList>;
300
309 auto memberEventByCursor(lager::reader<std::string> userId) const -> lager::reader<Event>;
310
319 auto memberEventFor(std::string userId) const -> lager::reader<Event>;
320
332 lager::reader<bool> encrypted() const;
333
334 /*lager::reader<std::string>*/
335 KAZV_WRAP_ATTR(RoomModel, roomCursor(), roomId);
336 /*lager::reader<RoomMembership>*/
337 KAZV_WRAP_ATTR(RoomModel, roomCursor(), membership);
338 /*lager::reader<immer::flex_vector<Kazv::LocalDraft>>*/
339 KAZV_WRAP_ATTR(RoomModel, roomCursor(), localDrafts);
340 /* lager::reader<bool> */
341 KAZV_WRAP_ATTR(RoomModel, roomCursor(), membersFullyLoaded);
342
348 auto localReadMarker() const -> lager::reader<std::string>;
349
356 auto heroIds() const -> lager::reader<immer::flex_vector<std::string>>;
357
364 auto joinedMemberCount() const -> lager::reader<std::size_t>;
365
372 auto invitedMemberCount() const -> lager::reader<std::size_t>;
373
384 PromiseT setLocalDraft(std::string localDraft) const;
385
398 PromiseT setLocalDraft(std::string text,
399 std::string relType, std::string relatedEventId) const;
400
412 PromiseT setLocalDraftRel(std::string relType,
413 std::string relatedEventId) const;
414
427 PromiseT pushLocalDraft(std::string text,
428 std::string relType, std::string relatedEventId) const;
429
439 PromiseT popLocalDraft() const;
440
448 PromiseT sendMessage(Event msg) const;
449
457 PromiseT sendTextMessage(std::string text) const;
458
466 PromiseT resendMessage(std::string txnId) const;
467
476 PromiseT redactEvent(std::string eventId, std::optional<std::string> reason) const;
477
485 PromiseT sendPendingKeyEvent(std::string txnId) const;
486
494
507
520 PromiseT getStateEvent(std::string type, std::string stateKey) const;
521
530
538 PromiseT setName(std::string name) const;
539
540 // lager::reader<std::string>
541 inline auto topic() const {
542 using namespace lager::lenses;
543 return stateEvents()
544 [KeyOfState{"m.room.topic", ""}]
545 [or_default]
546 .xform(eventContent
547 | jsonAtOr("topic"s, ""s));
548 }
549
557 PromiseT setTopic(std::string topic) const;
558
566 PromiseT invite(std::string userId) const;
567
568 /* lager::reader<MapT<std::string, Event>> */
569 inline auto ephemeralEvents() const {
570 return roomCursor()
572 }
573
574 /* lager::reader<std::optional<Event>> */
575 inline auto ephemeralOpt(std::string type) const {
576 return roomCursor()
578 [type];
579 }
580
581 /* lager::reader<Event> */
582 inline auto ephemeral(std::string type) const {
583 return roomCursor()
585 [type]
586 [lager::lenses::or_default];
587 }
588
594 auto typingUsers() const -> lager::reader<immer::flex_vector<std::string>>;
595
601 auto typingMemberEvents() const -> lager::reader<EventList>;
602
612 PromiseT setTyping(bool typing, std::optional<int> timeoutMs) const;
613
614 /* lager::reader<MapT<std::string, Event>> */
615 inline auto accountDataEvents() const {
616 return roomCursor()
618 }
619
620 /* lager::reader<std::optional<Event>> */
621 inline auto accountDataOpt(std::string type) const {
622 return roomCursor()
624 [type];
625 }
626
627 /* lager::reader<Event> */
628 inline auto accountData(std::string type) const {
629 return roomCursor()
631 [type]
632 [lager::lenses::or_default];
633 }
634
635 /* lager::reader<std::string> */
636 inline auto readMarker() const {
637 using namespace lager::lenses;
638 return accountData("m.fully_read")
639 .xform(eventContent
640 | jsonAtOr("event_id", std::string{}));
641 }
642
649 PromiseT setAccountData(Event accountDataEvent) const;
650
657 auto tags() const -> lager::reader<immer::map<std::string, double>>;
658
668 PromiseT addOrSetTag(std::string tagId, std::optional<double> order = std::nullopt) const;
669
678 PromiseT removeTag(std::string tagId) const;
679
686 PromiseT leave() const;
687
696 PromiseT forget() const;
697
709 PromiseT kick(std::string userId, std::optional<std::string> reason = std::nullopt) const;
710
722 PromiseT ban(std::string userId, std::optional<std::string> reason = std::nullopt) const;
723
724 // TODO: v1.1 adds reason field
735 PromiseT unban(std::string userId/*, std::optional<std::string> reason = std::nullopt*/) const;
736
737 /* lager::reader<JsonWrap> */
738 inline auto avatar() const {
739 return state(KeyOfState{"m.room.avatar", ""})
740 .xform(eventContent);
741 }
742
748 auto pinnedEvents() const -> lager::reader<immer::flex_vector<std::string>>;
749
758 PromiseT setPinnedEvents(immer::flex_vector<std::string> eventIds) const;
759
767 PromiseT pinEvents(immer::flex_vector<std::string> eventIds) const;
768
776 PromiseT unpinEvents(immer::flex_vector<std::string> eventIds) const;
777
787 lager::reader<immer::map<std::string /* eventId */, std::string /* prevBatch */>> timelineGaps() const;
788
802 PromiseT paginateBackFromEvent(std::string eventId) const;
803
810 auto localEchoes() const -> lager::reader<immer::flex_vector<LocalEchoDesc>>;
811
819 PromiseT removeLocalEcho(std::string txnId) const;
820
827 auto pendingRoomKeyEvents() const -> lager::reader<immer::flex_vector<PendingRoomKeyEvent>>;
828
834 auto powerLevels() const -> lager::reader<PowerLevelsDesc>;
835
843 auto relatedEvents(lager::reader<std::string> eventId, std::string relType) const -> lager::reader<EventList>;
844
851 auto eventReaders(lager::reader<std::string> eventId) const -> lager::reader<immer::flex_vector<EventReader>>;
852
860 PromiseT postReceipt(std::string eventId) const;
861
868 auto unreadNotificationEventIds() const -> lager::reader<immer::flex_vector<std::string>>;
869
877 bool isReadBy(const std::string &eventId, const std::string &userId) const;
878
879 private:
880 const lager::reader<SdkModel> &sdkCursor() const;
881 const lager::reader<RoomModel> &roomCursor() const;
882 lager::reader<RoomModel> makeRoomCursor() const;
883 std::string currentRoomId() const;
885 lager::reader<immer::map<KeyOfState, Event>> inviteStateOrState() const;
887 lager::reader<Event> inviteStateOrStateEvent(lager::reader<KeyOfState> key) const;
888
889 std::optional<lager::reader<SdkModel>> m_sdk;
890 std::variant<lager::reader<std::string>, std::string> m_roomId;
891
892 ContextT m_ctx;
893 std::optional<DepsT> m_deps;
894 lager::reader<RoomModel> m_roomCursor;
895 KAZV_DECLARE_THREAD_ID();
896 KAZV_DECLARE_EVENT_LOOP_THREAD_ID_KEEPER(m_deps.has_value() ? &lager::get<EventLoopThreadIdKeeper &>(m_deps.value()) : 0);
897 };
898}
Definition context.hpp:130
Definition event.hpp:21
Represent a m.power_levels event.
Definition power-levels-desc.hpp:26
Definition random-generator.hpp:16
Represent a Matrix room.
Definition room.hpp:38
auto relatedEvents(lager::reader< std::string > eventId, std::string relType) const -> lager::reader< EventList >
Get a list of child events of a specified event.
Definition room.cpp:933
auto memberEventByCursor(lager::reader< std::string > userId) const -> lager::reader< Event >
Get the member event for userId.
Definition room.cpp:192
PromiseT setTyping(bool typing, std::optional< int > timeoutMs) const
Set the typing status of the current user in this room.
Definition room.cpp:744
auto leftMembers() const -> lager::reader< immer::flex_vector< std::string > >
Get the list of left member ids.
Definition room.cpp:143
PromiseT sendAllPendingKeyEvents() const
Send all pending key events in this room.
Definition room.cpp:649
PromiseT sendStateEvent(Event state) const
Send a state event to this room.
Definition room.cpp:684
auto name() const -> lager::reader< std::string >
Get the name of this room.
Definition room.cpp:271
auto messagesMap() const -> lager::reader< immer::map< std::string, Event > >
Get a map from event ids to events.
Definition room.cpp:872
PromiseT resendMessage(std::string txnId) const
Resend an event to this room.
Definition room.cpp:571
PromiseT unban(std::string userId) const
Unban a user from this room.
Definition room.cpp:779
auto accountDataEvents() const
Definition room.hpp:615
PromiseT ban(std::string userId, std::optional< std::string > reason=std::nullopt) const
Ban a user from this room.
Definition room.cpp:772
auto joinedMemberCount() const -> lager::reader< std::size_t >
Get the joined member count of this room.
Definition room.cpp:296
auto invitedMembers() const -> lager::reader< immer::flex_vector< std::string > >
Get the list of invited member ids.
Definition room.cpp:129
auto topic() const
Definition room.hpp:541
PromiseT leave() const
Leave this room.
Definition room.cpp:751
auto unreadNotificationEventIds() const -> lager::reader< immer::flex_vector< std::string > >
Get a list of event ids of unread notifications.
Definition room.cpp:977
auto heroMemberEvents() const -> lager::reader< immer::flex_vector< Event > >
Get the member events of heroes this room.
Definition room.cpp:234
PromiseT setLocalDraft(std::string localDraft) const
Set local draft for this room.
Definition room.cpp:320
auto knockedMemberEvents() const -> lager::reader< EventList >
Get the list of knocked member events.
Definition room.cpp:171
Context< ClientAction > ContextT
Definition room.hpp:46
PromiseT refreshRoomState() const
Get the full state of this room.
Definition room.cpp:670
auto pinnedEvents() const -> lager::reader< immer::flex_vector< std::string > >
Get pinned events of this room.
Definition room.cpp:815
PromiseT sendMessage(Event msg) const
Send an event to this room.
Definition room.cpp:360
SingleTypePromise< DefaultRetType > PromiseT
Definition room.hpp:40
PromiseT setAccountData(Event accountDataEvent) const
Set the account data for this room.
Definition room.cpp:786
auto localEchoes() const -> lager::reader< immer::flex_vector< LocalEchoDesc > >
Get the list of local echoes in this room.
Definition room.cpp:907
auto heroIds() const -> lager::reader< immer::flex_vector< std::string > >
Get the ids of the heroes of the room.
Definition room.cpp:288
PromiseT removeLocalEcho(std::string txnId) const
Remove a local echo from this room.
Definition room.cpp:912
auto accountData(std::string type) const
Definition room.hpp:628
auto state(KeyOfState k) const
Definition room.hpp:142
PromiseT setName(std::string name) const
Set the room name.
Definition room.cpp:691
auto invitedMemberCount() const -> lager::reader< std::size_t >
Get the invited member count of this room.
Definition room.cpp:301
auto stateOpt(KeyOfState k) const
Definition room.hpp:136
auto leftMemberEvents() const -> lager::reader< EventList >
Get the list of left member events.
Definition room.cpp:178
Room toEventLoop() const
Return a Room that represents the room currently represented by this, but suitable for use in the eve...
Definition room.cpp:53
PromiseT paginateBackFromEvent(std::string eventId) const
Try to paginate back from eventId.
Definition room.cpp:899
PromiseT removeTag(std::string tagId) const
Remove a tag from this room.
Definition room.cpp:806
auto members() const -> lager::reader< immer::flex_vector< std::string > >
Get the list of joined member ids.
Definition room.cpp:122
auto readMarker() const
Definition room.hpp:636
auto nameOpt() const -> lager::reader< std::optional< std::string > >
Get the name of this room.
Definition room.cpp:257
auto bannedMemberEvents() const -> lager::reader< EventList >
Get the list of banned member events.
Definition room.cpp:185
PromiseT setPinnedEvents(immer::flex_vector< std::string > eventIds) const
Set pinned events of this room.
Definition room.cpp:821
PromiseT addOrSetTag(std::string tagId, std::optional< double > order=std::nullopt) const
Add or set a tag to this room.
Definition room.cpp:797
auto ephemeralEvents() const
Definition room.hpp:569
auto typingMemberEvents() const -> lager::reader< EventList >
Get the member events of all typing users in this room.
Definition room.cpp:734
PromiseT pushLocalDraft(std::string text, std::string relType, std::string relatedEventId) const
Push a local draft and related event for this room.
Definition room.cpp:345
auto memberEventFor(std::string userId) const -> lager::reader< Event >
Get the member event for userId.
Definition room.cpp:199
PromiseT sendTextMessage(std::string text) const
Send a text message to this room.
Definition room.cpp:556
auto timelineEvents() const -> lager::reader< immer::flex_vector< Event > >
Get a list of timeline events in this room.
Definition room.cpp:877
lager::deps< SdkModelCursorKey, RandomInterface & > DepsT
Definition room.hpp:45
Room(lager::reader< SdkModel > sdk, lager::reader< std::string > roomId, ContextT ctx, DepsT deps)
Constructor.
lager::reader< bool > encrypted() const
Get whether this room is encrypted.
Definition room.cpp:277
auto stateEvents() const
Definition room.hpp:123
PromiseT setTopic(std::string topic) const
Set the room topic.
Definition room.cpp:705
PromiseT getStateEvent(std::string type, std::string stateKey) const
Get one state event with type and stateKey .
Definition room.cpp:677
lager::reader< immer::map< std::string, std::string > > timelineGaps() const
Get the Gaps in the timeline for this room.
Definition room.cpp:892
auto knockedMembers() const -> lager::reader< immer::flex_vector< std::string > >
Get the list of knocked member ids.
Definition room.cpp:136
auto localEcho(lager::reader< std::string > txnId) const -> lager::reader< LocalEchoDesc >
Get one local echo by the txnId.
Definition room.cpp:106
bool isReadBy(const std::string &eventId, const std::string &userId) const
Check if an event has been read by the given user.
Definition room.cpp:982
auto avatar() const
Definition room.hpp:738
auto ephemeralOpt(std::string type) const
Definition room.hpp:575
auto invitedMemberEvents() const -> lager::reader< EventList >
Get the list of invited member events.
Definition room.cpp:164
auto ephemeral(std::string type) const
Definition room.hpp:582
PromiseT forget() const
Forget this room.
Definition room.cpp:758
auto tags() const -> lager::reader< immer::map< std::string, double > >
Get the tags of the current room.
Definition room.cpp:792
auto message(lager::reader< std::string > eventId) const -> lager::reader< Event >
Get one message by the event id.
Definition room.cpp:98
Room(lager::reader< SdkModel > sdk, lager::reader< std::string > roomId, ContextT ctx)
Constructor.
auto inviteState() const -> lager::reader< immer::map< KeyOfState, Event > >
Get the invite_state of this room.
Definition room.cpp:229
PromiseT pinEvents(immer::flex_vector< std::string > eventIds) const
Add eventIds to the pinned events of this room.
Definition room.cpp:835
auto typingUsers() const -> lager::reader< immer::flex_vector< std::string > >
Get the ids of all typing users in this room.
Definition room.cpp:726
auto accountDataOpt(std::string type) const
Definition room.hpp:621
PromiseT redactEvent(std::string eventId, std::optional< std::string > reason) const
Redact an event.
Definition room.cpp:611
PromiseT invite(std::string userId) const
Invite a user to this room.
Definition room.cpp:719
auto pendingRoomKeyEvents() const -> lager::reader< immer::flex_vector< PendingRoomKeyEvent > >
Get the list of pending room key events in this room.
Definition room.cpp:920
PromiseT setLocalDraftRel(std::string relType, std::string relatedEventId) const
Set event related to local draft for this room.
Definition room.cpp:337
auto bannedMembers() const -> lager::reader< immer::flex_vector< std::string > >
Get the list of banned member ids.
Definition room.cpp:150
auto timelineEventIds() const -> lager::reader< immer::flex_vector< std::string > >
Get the timeline event ids of this room in ascending timestamp order.
Definition room.cpp:867
PromiseT sendPendingKeyEvent(std::string txnId) const
Send one pending key event in this room.
Definition room.cpp:620
auto eventReaders(lager::reader< std::string > eventId) const -> lager::reader< immer::flex_vector< EventReader > >
Get a list of read receipts of some event in this room.
Definition room.cpp:954
PromiseT unpinEvents(immer::flex_vector< std::string > eventIds) const
Remove eventIds from the pinned events of this room.
Definition room.cpp:851
auto heroDisplayNames() const -> lager::reader< immer::flex_vector< std::string > >
Get the member events of heroes this room.
Definition room.cpp:240
PromiseT kick(std::string userId, std::optional< std::string > reason=std::nullopt) const
Kick a user from this room.
Definition room.cpp:765
auto powerLevels() const -> lager::reader< PowerLevelsDesc >
Get the power levels of this room.
Definition room.cpp:925
PromiseT popLocalDraft() const
Pop a Kazv::LocalDraft in RoomModel::localDrafts.
Definition room.cpp:353
auto avatarMxcUri() const -> lager::reader< std::string >
Get the avatar mxc uri of this room.
Definition room.cpp:306
auto joinedMemberEvents() const -> lager::reader< EventList >
Get the list of joined member events.
Definition room.cpp:157
auto localReadMarker() const -> lager::reader< std::string >
Get the local read marker in this room.
Definition room.cpp:282
PromiseT postReceipt(std::string eventId) const
Post a read receipt for this room.
Definition room.cpp:972
Definition promise-interface.hpp:122
#define KAZV_WRAP_ATTR(_type, _d, _attr)
Definition clientutil.hpp:152
Definition location.hpp:10
constexpr auto eventContent
Definition cursorutil.hpp:128
lager::dep::key< SdkModelCursorTag, lager::dep::fn< std::shared_ptr< lager::reader< SdkModel > > > > SdkModelCursorKey
Definition sdk-model-cursor-tag.hpp:23
constexpr auto jsonAtOr(T &&key, V &&defaultValue)
Definition cursorutil.hpp:140
immer::flex_vector< Event > EventList
Definition types.hpp:107
Definition clientutil.hpp:140
Definition room-model.hpp:61
Definition clientutil.hpp:56
Describes a local echo.
Definition local-echo.hpp:19
Definition room-model.hpp:35
The model to store information about a room.
Definition room-model.hpp:261
immer::map< KeyOfState, Event > stateEvents
Definition room-model.hpp:268
immer::map< std::string, Event > ephemeral
Definition room-model.hpp:282
immer::map< std::string, Event > accountData
Definition room-model.hpp:274
Definition room.hpp:48
Definition sdk-model.hpp:26
#define KAZV_DECLARE_EVENT_LOOP_THREAD_ID_KEEPER(_initializer)
Definition thread-safety-helper.hpp:75