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 }