using LibMatrix; using LibMatrix.EventTypes.Spec.State; using LibMatrix.Homeservers; using LibMatrix.Responses; using LibMatrix.RoomTypes; using OsuFederatedBeatmapApi.Events.AccountData; namespace OsuFederatedBeatmapApi.Services; public class FederatedBeatmapApiBotAccountDataService(ILogger logger, AuthenticatedHomeserverGeneric hs, FederatedBeatmapApiBotConfiguration configuration) { private const string BotDataKey = "gay.rory.federated_beatmap_repository_bot_data"; public GenericRoom LogRoom; public GenericRoom ControlRoom; public List ListedRepositories; private BotData botData; public async Task LoadAccountDataAsync() { try { botData = await hs.GetAccountDataAsync(BotDataKey); } catch (Exception e) { if (e is not MatrixException { ErrorCode: "M_NOT_FOUND" }) { logger.LogError("{}", e.ToString()); throw; } botData = new BotData(); var creationContent = CreateRoomRequest.CreatePrivate(hs, name: "Beatmap Repository - Control room", roomAliasName: "beatmap-repo-control-room"); creationContent.Invite = configuration.Admins; creationContent.CreationContent["type"] = "gay.rory.federated_beatmap_repository.control_room"; botData.ControlRoom = (await hs.CreateRoom(creationContent)).RoomId; //set access rules to allow joining via control room creationContent.InitialState.Add(new StateEvent { Type = "m.room.join_rules", StateKey = "", TypedContent = new RoomJoinRulesEventContent { JoinRule = "knock_restricted", Allow = new() { new RoomJoinRulesEventContent.AllowEntry { Type = "m.room_membership", RoomId = botData.ControlRoom } } } }); creationContent.Name = "Beatmap Repository - Log room"; creationContent.RoomAliasName = "beatmap-repo-log-room"; creationContent.CreationContent["type"] = "gay.rory.media_moderator_poc.log_room"; botData.LogRoom = (await hs.CreateRoom(creationContent)).RoomId; await hs.SetAccountData(BotDataKey, botData); } LogRoom = hs.GetRoom(botData.LogRoom ?? botData.ControlRoom); ControlRoom = hs.GetRoom(botData.ControlRoom); ListedRepositories = botData.ListedRepositories.Select(hs.GetRoom).ToList(); } }