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
|