using System.Reflection;
using System.Text.Json.Nodes;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using LibMatrix.EventTypes;
using LibMatrix.EventTypes.Spec.State;
using LibMatrix.Homeservers;
namespace LibMatrix.Responses;
public class CreateRoomRequest {
[JsonIgnore] public CreationContentBaseType CreationContentBaseType;
public CreateRoomRequest() {
CreationContentBaseType = new CreationContentBaseType(this);
}
[JsonPropertyName("name")]
public string? Name { get; set; }
///
/// Room alias local name. Must be unique on the homeserver.
///
[JsonPropertyName("room_alias_name")]
public string? RoomAliasName { get; set; }
//we dont want to use this, we want more control
// [JsonPropertyName("preset")]
// public string Preset { get; set; } = null!;
[JsonPropertyName("initial_state")]
public List? InitialState { get; set; }
///
/// One of: ["public", "private"]
///
[JsonPropertyName("visibility")]
public string? Visibility { get; set; }
[JsonPropertyName("power_level_content_override")]
public RoomPowerLevelEventContent? PowerLevelContentOverride { get; set; } = null!;
[JsonPropertyName("creation_content")]
public JsonObject CreationContent { get; set; } = new();
[JsonPropertyName("invite")]
public List? Invite { get; set; }
///
/// For use only when you can't use the CreationContent property
///
public StateEvent this[string eventType, string eventKey = ""] {
get {
var stateEvent = InitialState.FirstOrDefault(x => x.Type == eventType && x.StateKey == eventKey);
if (stateEvent == null)
InitialState.Add(stateEvent = new StateEvent {
Type = eventType,
StateKey = eventKey,
TypedContent = (EventContent)Activator.CreateInstance(
StateEvent.KnownStateEventTypes.FirstOrDefault(x =>
x.GetCustomAttributes()?
.Any(y => y.EventName == eventType) ?? false) ?? typeof(UnknownEventContent)
)!
});
return stateEvent;
}
set {
var stateEvent = InitialState.FirstOrDefault(x => x.Type == eventType && x.StateKey == eventKey);
if (stateEvent == null)
InitialState.Add(value);
else
InitialState[InitialState.IndexOf(stateEvent)] = value;
}
}
public Dictionary Validate() {
Dictionary errors = new();
if (!Regex.IsMatch(RoomAliasName, @"[a-zA-Z0-9_\-]+$"))
errors.Add("room_alias_name",
"Room alias name must only contain letters, numbers, underscores, and hyphens.");
return errors;
}
public static CreateRoomRequest CreatePublic(AuthenticatedHomeserverGeneric hs, string? name = null, string? roomAliasName = null) {
var request = new CreateRoomRequest {
Name = name ?? "New public Room",
Visibility = "public",
CreationContent = new JsonObject(),
PowerLevelContentOverride = new RoomPowerLevelEventContent {
EventsDefault = 0,
UsersDefault = 0,
Kick = 50,
Ban = 50,
Invite = 25,
StateDefault = 10,
Redact = 50,
NotificationsPl = new RoomPowerLevelEventContent.NotificationsPL {
Room = 10
},
Events = new Dictionary {
{ "m.room.avatar", 50 },
{ "m.room.canonical_alias", 50 },
{ "m.room.encryption", 100 },
{ "m.room.history_visibility", 100 },
{ "m.room.name", 50 },
{ "m.room.power_levels", 100 },
{ "m.room.server_acl", 100 },
{ "m.room.tombstone", 100 }
},
Users = new Dictionary {
{
hs.UserId,
101
}
}
},
RoomAliasName = roomAliasName,
InitialState = new List()
};
return request;
}
public static CreateRoomRequest CreatePrivate(AuthenticatedHomeserverGeneric hs, string? name = null, string? roomAliasName = null) {
var request = new CreateRoomRequest {
Name = name ?? "New private Room",
Visibility = "private",
CreationContent = new JsonObject(),
PowerLevelContentOverride = new RoomPowerLevelEventContent {
EventsDefault = 0,
UsersDefault = 0,
Kick = 50,
Ban = 50,
Invite = 25,
StateDefault = 10,
Redact = 50,
NotificationsPl = new RoomPowerLevelEventContent.NotificationsPL {
Room = 10
},
Events = new Dictionary {
{ "m.room.avatar", 50 },
{ "m.room.canonical_alias", 50 },
{ "m.room.encryption", 100 },
{ "m.room.history_visibility", 100 },
{ "m.room.name", 50 },
{ "m.room.power_levels", 100 },
{ "m.room.server_acl", 100 },
{ "m.room.tombstone", 100 }
},
Users = new Dictionary {
{
hs.UserId,
101
}
}
},
RoomAliasName = roomAliasName,
InitialState = new List()
};
return request;
}
}