diff --git a/LibMatrix.LegacyEvents.EventTypes/Spec/State/RoomInfo/RoomJoinRulesEventContent.cs b/LibMatrix.LegacyEvents.EventTypes/Spec/State/RoomInfo/RoomJoinRulesEventContent.cs
new file mode 100644
index 0000000..48202a5
--- /dev/null
+++ b/LibMatrix.LegacyEvents.EventTypes/Spec/State/RoomInfo/RoomJoinRulesEventContent.cs
@@ -0,0 +1,60 @@
+using System.Text.Json.Serialization;
+
+namespace LibMatrix.LegacyEvents.EventTypes.Spec.State;
+
+[MatrixEvent(EventName = EventId)]
+public class RoomJoinRulesEventContent : EventContent {
+ public const string EventId = "m.room.join_rules";
+
+ /// <summary>
+ /// one of ["public", "invite", "knock", "restricted", "knock_restricted"]
+ /// "private" is reserved without implementation!
+ /// unknown values are treated as "private"
+ /// </summary>
+ [JsonPropertyName("join_rule")]
+ public string JoinRuleValue { get; set; }
+
+ [JsonIgnore]
+ public JoinRules JoinRule {
+ get => JoinRuleValue switch {
+ "public" => JoinRules.Public,
+ "invite" => JoinRules.Invite,
+ "knock" => JoinRules.Knock,
+ "restricted" => JoinRules.Restricted,
+ "knock_restricted" => JoinRules.KnockRestricted,
+ _ => JoinRules.Private
+ };
+ set => JoinRuleValue = value switch {
+ JoinRules.Public => "public",
+ JoinRules.Invite => "invite",
+ JoinRules.Knock => "knock",
+ JoinRules.Restricted => "restricted",
+ JoinRules.KnockRestricted => "knock_restricted",
+ _ => "private"
+ };
+ }
+
+ [JsonPropertyName("allow")]
+ public List<AllowEntry>? Allow { get; set; }
+
+ public class AllowEntry {
+ [JsonPropertyName("type")]
+ public required string Type { get; set; }
+
+ [JsonPropertyName("room_id")]
+ public required string RoomId { get; set; }
+
+ public static class Types {
+ public const string RoomMembership = "m.room_membership";
+ }
+ }
+
+ public enum JoinRules {
+ Public,
+ Invite,
+ Knock,
+ Restricted,
+ KnockRestricted,
+ Private // reserved without implementation!
+ }
+}
\ No newline at end of file
|