diff --git a/Tools/BiblioTech/AdminChecker.cs b/Tools/BiblioTech/AdminChecker.cs new file mode 100644 index 00000000..684721d6 --- /dev/null +++ b/Tools/BiblioTech/AdminChecker.cs @@ -0,0 +1,35 @@ +using Discord.WebSocket; + +namespace BiblioTech +{ + public class AdminChecker + { + private SocketGuild guild = null!; + private ulong[] adminIds = Array.Empty(); + private DateTime lastUpdate = DateTime.MinValue; + + public void SetGuild(SocketGuild guild) + { + this.guild = guild; + } + + public bool IsUserAdmin(ulong userId) + { + if (ShouldUpdate()) UpdateAdminIds(); + + return adminIds.Contains(userId); + } + + private bool ShouldUpdate() + { + return !adminIds.Any() || (DateTime.UtcNow - lastUpdate) > TimeSpan.FromMinutes(10); + } + + private void UpdateAdminIds() + { + lastUpdate = DateTime.UtcNow; + var adminRole = guild.Roles.Single(r => r.Name == Program.Config.AdminRoleName); + adminIds = adminRole.Members.Select(m => m.Id).ToArray(); + } + } +} diff --git a/Tools/BiblioTech/BaseCommand.cs b/Tools/BiblioTech/BaseCommand.cs index 6086d341..066ade4f 100644 --- a/Tools/BiblioTech/BaseCommand.cs +++ b/Tools/BiblioTech/BaseCommand.cs @@ -1,6 +1,6 @@ using Discord.WebSocket; using Discord; -using BiblioTech.TokenCommands; +using BiblioTech.Commands; namespace BiblioTech { @@ -37,7 +37,7 @@ namespace BiblioTech protected bool IsSenderAdmin(SocketSlashCommand command) { - + return Program.AdminChecker.IsUserAdmin(command.User.Id); } protected ulong GetUserId(UserOption userOption, SocketSlashCommand command) diff --git a/Tools/BiblioTech/CommandHandler.cs b/Tools/BiblioTech/CommandHandler.cs index 4e5d8de2..5726ee6f 100644 --- a/Tools/BiblioTech/CommandHandler.cs +++ b/Tools/BiblioTech/CommandHandler.cs @@ -22,6 +22,7 @@ namespace BiblioTech private async Task Client_Ready() { var guild = client.Guilds.Single(g => g.Name == Program.Config.ServerName); + Program.AdminChecker.SetGuild(guild); var builders = commands.Select(c => { diff --git a/Tools/BiblioTech/TokenCommands/ClearUserAssociationCommand.cs b/Tools/BiblioTech/Commands/ClearUserAssociationCommand.cs similarity index 96% rename from Tools/BiblioTech/TokenCommands/ClearUserAssociationCommand.cs rename to Tools/BiblioTech/Commands/ClearUserAssociationCommand.cs index 10aa2b2d..62eb649e 100644 --- a/Tools/BiblioTech/TokenCommands/ClearUserAssociationCommand.cs +++ b/Tools/BiblioTech/Commands/ClearUserAssociationCommand.cs @@ -1,6 +1,6 @@ using Discord.WebSocket; -namespace BiblioTech.TokenCommands +namespace BiblioTech.Commands { public class ClearUserAssociationCommand : BaseCommand { diff --git a/Tools/BiblioTech/DeploymentsCommand.cs b/Tools/BiblioTech/Commands/DeploymentsCommand.cs similarity index 96% rename from Tools/BiblioTech/DeploymentsCommand.cs rename to Tools/BiblioTech/Commands/DeploymentsCommand.cs index 414b0c41..3bc44f88 100644 --- a/Tools/BiblioTech/DeploymentsCommand.cs +++ b/Tools/BiblioTech/Commands/DeploymentsCommand.cs @@ -1,6 +1,6 @@ using Discord.WebSocket; -namespace BiblioTech +namespace BiblioTech.Commands { public class DeploymentsCommand : BaseCommand { diff --git a/Tools/BiblioTech/TokenCommands/EthAddressOption.cs b/Tools/BiblioTech/Commands/EthAddressOption.cs similarity index 96% rename from Tools/BiblioTech/TokenCommands/EthAddressOption.cs rename to Tools/BiblioTech/Commands/EthAddressOption.cs index 3298ee8b..e9e57840 100644 --- a/Tools/BiblioTech/TokenCommands/EthAddressOption.cs +++ b/Tools/BiblioTech/Commands/EthAddressOption.cs @@ -1,7 +1,7 @@ using Discord.WebSocket; using GethPlugin; -namespace BiblioTech.TokenCommands +namespace BiblioTech.Commands { public class EthAddressOption : CommandOption { diff --git a/Tools/BiblioTech/TokenCommands/GetBalanceCommand.cs b/Tools/BiblioTech/Commands/GetBalanceCommand.cs similarity index 96% rename from Tools/BiblioTech/TokenCommands/GetBalanceCommand.cs rename to Tools/BiblioTech/Commands/GetBalanceCommand.cs index 000cfaae..e51ab112 100644 --- a/Tools/BiblioTech/TokenCommands/GetBalanceCommand.cs +++ b/Tools/BiblioTech/Commands/GetBalanceCommand.cs @@ -3,13 +3,13 @@ using Core; using Discord.WebSocket; using GethPlugin; -namespace BiblioTech.TokenCommands +namespace BiblioTech.Commands { public class GetBalanceCommand : BaseNetCommand { private readonly UserAssociateCommand userAssociateCommand; private readonly UserOption optionalUser = new UserOption( - description: "If set, get balance for another user. (Optional, admin-only)", + description: "If set, get balance for another user. (Optional, admin-only)", isRequired: false); public GetBalanceCommand(DeploymentsFilesMonitor monitor, CoreInterface ci, UserAssociateCommand userAssociateCommand) diff --git a/Tools/BiblioTech/TokenCommands/MintCommand.cs b/Tools/BiblioTech/Commands/MintCommand.cs similarity index 98% rename from Tools/BiblioTech/TokenCommands/MintCommand.cs rename to Tools/BiblioTech/Commands/MintCommand.cs index 330d2333..664cba81 100644 --- a/Tools/BiblioTech/TokenCommands/MintCommand.cs +++ b/Tools/BiblioTech/Commands/MintCommand.cs @@ -3,7 +3,7 @@ using Core; using Discord.WebSocket; using GethPlugin; -namespace BiblioTech.TokenCommands +namespace BiblioTech.Commands { public class MintCommand : BaseNetCommand { diff --git a/Tools/BiblioTech/TokenCommands/ReportHistoryCommand.cs b/Tools/BiblioTech/Commands/ReportHistoryCommand.cs similarity index 96% rename from Tools/BiblioTech/TokenCommands/ReportHistoryCommand.cs rename to Tools/BiblioTech/Commands/ReportHistoryCommand.cs index 6cf58f1b..61f5da85 100644 --- a/Tools/BiblioTech/TokenCommands/ReportHistoryCommand.cs +++ b/Tools/BiblioTech/Commands/ReportHistoryCommand.cs @@ -1,6 +1,6 @@ using Discord.WebSocket; -namespace BiblioTech.TokenCommands +namespace BiblioTech.Commands { public class ReportHistoryCommand : BaseCommand { diff --git a/Tools/BiblioTech/TokenCommands/UserAssociateCommand.cs b/Tools/BiblioTech/Commands/UserAssociateCommand.cs similarity index 76% rename from Tools/BiblioTech/TokenCommands/UserAssociateCommand.cs rename to Tools/BiblioTech/Commands/UserAssociateCommand.cs index e989f33e..58fc32a5 100644 --- a/Tools/BiblioTech/TokenCommands/UserAssociateCommand.cs +++ b/Tools/BiblioTech/Commands/UserAssociateCommand.cs @@ -1,10 +1,13 @@ using Discord.WebSocket; -namespace BiblioTech.TokenCommands +namespace BiblioTech.Commands { public class UserAssociateCommand : BaseCommand { private readonly EthAddressOption ethOption = new EthAddressOption(); + private readonly UserOption optionalUser = new UserOption( + description: "If set, associates Ethereum address for another user. (Optional, admin-only)", + isRequired: false); public override string Name => "set"; public override string StartingMessage => "hold on..."; @@ -15,12 +18,12 @@ namespace BiblioTech.TokenCommands protected override async Task Invoke(SocketSlashCommand command) { - var userId = command.User.Id; + var userId = GetUserId(optionalUser, command); var data = await ethOption.Parse(command); if (data == null) return; var currentAddress = Program.UserRepo.GetCurrentAddressForUser(userId); - if (currentAddress != null) + if (currentAddress != null && !IsSenderAdmin(command)) { await command.FollowupAsync($"You've already set your Ethereum address to {currentAddress}."); return; diff --git a/Tools/BiblioTech/TokenCommands/UserOption.cs b/Tools/BiblioTech/Commands/UserOption.cs similarity index 94% rename from Tools/BiblioTech/TokenCommands/UserOption.cs rename to Tools/BiblioTech/Commands/UserOption.cs index 3f1628f6..e61558d8 100644 --- a/Tools/BiblioTech/TokenCommands/UserOption.cs +++ b/Tools/BiblioTech/Commands/UserOption.cs @@ -1,7 +1,7 @@ using Discord; using Discord.WebSocket; -namespace BiblioTech.TokenCommands +namespace BiblioTech.Commands { public class UserOption : CommandOption { diff --git a/Tools/BiblioTech/DeploymentsFilesMonitor.cs b/Tools/BiblioTech/DeploymentsFilesMonitor.cs index ac44e586..d0d135bb 100644 --- a/Tools/BiblioTech/DeploymentsFilesMonitor.cs +++ b/Tools/BiblioTech/DeploymentsFilesMonitor.cs @@ -10,10 +10,7 @@ namespace BiblioTech public CodexDeployment[] GetDeployments() { - if (ShouldUpdate()) - { - UpdateDeployments(); - } + if (ShouldUpdate()) UpdateDeployments(); return deployments; } diff --git a/Tools/BiblioTech/Program.cs b/Tools/BiblioTech/Program.cs index 395111fd..725b304d 100644 --- a/Tools/BiblioTech/Program.cs +++ b/Tools/BiblioTech/Program.cs @@ -1,5 +1,5 @@ using ArgsUniform; -using BiblioTech.TokenCommands; +using BiblioTech.Commands; using Core; using Discord; using Discord.WebSocket; @@ -14,6 +14,7 @@ namespace BiblioTech public static Configuration Config { get; private set; } = null!; public static DeploymentsFilesMonitor DeploymentFilesMonitor { get; } = new DeploymentsFilesMonitor(); public static UserRepo UserRepo { get; } = new UserRepo(); + public static AdminChecker AdminChecker { get; } = new AdminChecker(); public static Task Main(string[] args) { @@ -43,9 +44,13 @@ namespace BiblioTech var ci = entryPoint.CreateInterface(); + var associateCommand = new UserAssociateCommand(); var handler = new CommandHandler(client, - new GetBalanceCommand(monitor, ci), + new ClearUserAssociationCommand(), + new GetBalanceCommand(monitor, ci, associateCommand), new MintCommand(monitor, ci), + new ReportHistoryCommand(), + associateCommand, new DeploymentsCommand(monitor) ); diff --git a/Tools/BiblioTech/TokenCommands/ShowIdCommand.cs b/Tools/BiblioTech/TokenCommands/ShowIdCommand.cs deleted file mode 100644 index 39d9bf4c..00000000 --- a/Tools/BiblioTech/TokenCommands/ShowIdCommand.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Discord.WebSocket; - -namespace BiblioTech.TokenCommands -{ - public class ShowIdCommand : BaseCommand - { - public override string Name => "my-id"; - public override string StartingMessage => "..."; - public override string Description => "Shows you your Discord ID. (Useful for admins)"; - - protected override async Task Invoke(SocketSlashCommand command) - { - await command.FollowupAsync("Your ID: " + command.User.Id); - } - } -}