/ Tools / BiblioTech / AdminChecker.cs
AdminChecker.cs
 1  using BiblioTech.Options;
 2  using Discord;
 3  using Discord.WebSocket;
 4  
 5  namespace BiblioTech
 6  {
 7      public class AdminChecker
 8      {
 9          private SocketGuild guild = null!;
10          private ulong[] adminIds = Array.Empty<ulong>();
11          private DateTime lastUpdate = DateTime.MinValue;
12          private ISocketMessageChannel adminChannel = null!;
13  
14          public void SetGuild(SocketGuild guild)
15          {
16              this.guild = guild;
17          }
18  
19          public bool IsUserAdmin(ulong userId)
20          {
21              if (ShouldUpdate()) UpdateAdminIds();
22  
23              return adminIds.Contains(userId);
24          }
25  
26          public bool IsAdminChannel(IChannel channel)
27          {
28              return channel.Id == Program.Config.AdminChannelId;
29          }
30  
31          public async Task SendInAdminChannel(string msg)
32          {
33              await SendInAdminChannel(msg.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries));
34          }
35  
36          public async Task SendInAdminChannel(string[] lines)
37          {
38              if (adminChannel == null) return;
39              var chunker = new LineChunker(lines);
40              var chunks = chunker.GetChunks();
41              if (!chunks.Any()) return;
42  
43              foreach (var chunk in chunks)
44              {
45                  await adminChannel.SendMessageAsync(string.Join(Environment.NewLine, chunk));
46              }
47          }
48  
49          public void SetAdminChannel(ISocketMessageChannel adminChannel)
50          {
51              this.adminChannel = adminChannel;
52          }
53  
54          private bool ShouldUpdate()
55          {
56              return !adminIds.Any() || (DateTime.UtcNow - lastUpdate) > TimeSpan.FromMinutes(10);
57          }
58  
59          private void UpdateAdminIds()
60          {
61              lastUpdate = DateTime.UtcNow;
62              var adminRole = guild.Roles.Single(r => r.Id == Program.Config.AdminRoleId);
63              adminIds = adminRole.Members.Select(m => m.Id).ToArray();
64          }
65      }
66  }