diff options
Diffstat (limited to 'Services/ModerationBotRoomProvider.cs')
-rw-r--r-- | Services/ModerationBotRoomProvider.cs | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/Services/ModerationBotRoomProvider.cs b/Services/ModerationBotRoomProvider.cs new file mode 100644 index 0000000..d4a200f --- /dev/null +++ b/Services/ModerationBotRoomProvider.cs @@ -0,0 +1,76 @@ +using System.Diagnostics.CodeAnalysis; +using LibMatrix.Homeservers; +using LibMatrix.Responses; +using LibMatrix.RoomTypes; +using ModerationBot.AccountData; + +namespace ModerationBot.Services; + +public class ModerationBotRoomProvider(AuthenticatedHomeserverGeneric hs, ModerationBotConfiguration cfg) { + private BotData? _botData; + + public BotData? BotData { + get { + if (BotDataExpiry >= DateTime.UtcNow) return _botData; + Console.WriteLine("BotData expired!"); + return null; + } + set { + _botData = value; + Console.WriteLine("BotData updated!"); + BotDataExpiry = DateTime.UtcNow.AddMinutes(5); + } + } + + private DateTime BotDataExpiry { get; set; } + + [MemberNotNull(nameof(BotData))] + private async Task<BotData> GetBotDataAsync() { + try { + BotData ??= await hs.GetAccountDataAsync<BotData>(BotData.EventId); + } + catch (Exception e) { + Console.WriteLine(e); + await hs.SetAccountDataAsync(BotData.EventId, new BotData()); + return await GetBotDataAsync(); + } + + if (BotData == null) + throw new NullReferenceException("BotData is null!"); + + return BotData; + } + + public async Task<GenericRoom> GetControlRoomAsync() { + var botData = await GetBotDataAsync(); + if (botData.ControlRoom == null) { + var createRoomRequest = CreateRoomRequest.CreatePrivate(hs, "Rory&::ModerationBot - Control Room"); + createRoomRequest.Invite = cfg.Admins; + var newRoom = await hs.CreateRoom(createRoomRequest, true, true, true); + BotData.ControlRoom = newRoom.RoomId; + await hs.SetAccountDataAsync(BotData.EventId, BotData); + } + + return hs.GetRoom(BotData.ControlRoom!); + } + + public async Task<GenericRoom> GetLogRoomAsync() { + var botData = await GetBotDataAsync(); + if (botData.LogRoom == null) { + var controlRoom = await GetControlRoomAsync(); + var createRoomRequest = CreateRoomRequest.CreatePrivate(hs, "Rory&::ModerationBot - Log Room"); + createRoomRequest.Invite = (await controlRoom.GetMembersListAsync()).Select(x=>x.StateKey).ToList(); + var newRoom = await hs.CreateRoom(createRoomRequest, true, true, true); + BotData.LogRoom = newRoom.RoomId; + await hs.SetAccountDataAsync(BotData.EventId, BotData); + } + + return hs.GetRoom(BotData.LogRoom!); + } + + public async Task<GenericRoom?> GetDefaultPolicyRoomAsync() { + var botData = await GetBotDataAsync(); + + return string.IsNullOrWhiteSpace(botData.DefaultPolicyRoom) ? null : hs.GetRoom(BotData.DefaultPolicyRoom!); + } +} \ No newline at end of file |