1#pragma once
2
3/// @file
4/// @brief Manage the permission of how people can join a room.
5
6#if __has_include(<nlohmann/json_fwd.hpp>)
7#include <nlohmann/json_fwd.hpp>
8#else
9#include <nlohmann/json.hpp>
10#endif
11
12#include <string>
13
14namespace mtx {
15namespace events {
16namespace state {
17//! The different JoinRules
18enum class JoinRule
19{
20 //! Anyone can join the room without any prior action.
21 Public,
22 //! A user who wishes to join the room must first receive
23 //! an invite to the room from someone already inside of the room.
24 Invite,
25 //! the same as invite, except anyone can knock. See MSC2403.
26 Knock,
27 //! Reserved but not yet implemented by the Matrix specification.
28 Private,
29 //! the same as invite, except users may also join if they are a member of a room listed in
30 //! the allow rules.
31 Restricted,
32 //! a user can request an invite using the same functions offered by the knock join rule, or can
33 //! attempt to join having satisfied an allow condition per the restricted join rule.
34 KnockRestricted,
35};
36
37std::string
38joinRuleToString(const JoinRule &rule);
39
40JoinRule
41stringToJoinRule(const std::string &rule);
42
43enum class JoinAllowanceType
44{
45 RoomMembership,
46 Unknown,
47};
48
49//! An additional rule specifying what users are allowed to join.
50struct JoinAllowance
51{
52 //! "m.room_membership" to describe that we are allowing access via room membership. Future
53 //! MSCs may define other types.
54 JoinAllowanceType type;
55 //! The room ID to check the membership of.
56 std::string room_id;
57
58 friend void from_json(const nlohmann::json &obj, JoinAllowance &join_rules);
59 friend void to_json(nlohmann::json &obj, const JoinAllowance &join_rules);
60};
61
62//! Content of the `m.room.join_rules` state event.
63struct JoinRules
64{
65 //! The type of rules used for users wishing to join this room.
66 JoinRule join_rule;
67
68 //! A list of rooms to join via. Might be extended to other join types in the future.
69 //! Only relevant in combination with restricted joinrules atm.
70 std::vector<JoinAllowance> allow;
71
72 friend void from_json(const nlohmann::json &obj, JoinRules &join_rules);
73 friend void to_json(nlohmann::json &obj, const JoinRules &join_rules);
74};
75
76} // namespace state
77} // namespace events
78} // namespace mtx
79