Sets up guild role checking
This commit is contained in:
parent
4aa4731480
commit
e16b1ce079
|
@ -0,0 +1,35 @@
|
||||||
|
using Discord.WebSocket;
|
||||||
|
|
||||||
|
namespace BiblioTech
|
||||||
|
{
|
||||||
|
public class AdminChecker
|
||||||
|
{
|
||||||
|
private SocketGuild guild = null!;
|
||||||
|
private ulong[] adminIds = Array.Empty<ulong>();
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
using Discord;
|
using Discord;
|
||||||
using BiblioTech.TokenCommands;
|
using BiblioTech.Commands;
|
||||||
|
|
||||||
namespace BiblioTech
|
namespace BiblioTech
|
||||||
{
|
{
|
||||||
|
@ -37,7 +37,7 @@ namespace BiblioTech
|
||||||
|
|
||||||
protected bool IsSenderAdmin(SocketSlashCommand command)
|
protected bool IsSenderAdmin(SocketSlashCommand command)
|
||||||
{
|
{
|
||||||
|
return Program.AdminChecker.IsUserAdmin(command.User.Id);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ulong GetUserId(UserOption userOption, SocketSlashCommand command)
|
protected ulong GetUserId(UserOption userOption, SocketSlashCommand command)
|
||||||
|
|
|
@ -22,6 +22,7 @@ namespace BiblioTech
|
||||||
private async Task Client_Ready()
|
private async Task Client_Ready()
|
||||||
{
|
{
|
||||||
var guild = client.Guilds.Single(g => g.Name == Program.Config.ServerName);
|
var guild = client.Guilds.Single(g => g.Name == Program.Config.ServerName);
|
||||||
|
Program.AdminChecker.SetGuild(guild);
|
||||||
|
|
||||||
var builders = commands.Select(c =>
|
var builders = commands.Select(c =>
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
namespace BiblioTech.TokenCommands
|
namespace BiblioTech.Commands
|
||||||
{
|
{
|
||||||
public class ClearUserAssociationCommand : BaseCommand
|
public class ClearUserAssociationCommand : BaseCommand
|
||||||
{
|
{
|
|
@ -1,6 +1,6 @@
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
namespace BiblioTech
|
namespace BiblioTech.Commands
|
||||||
{
|
{
|
||||||
public class DeploymentsCommand : BaseCommand
|
public class DeploymentsCommand : BaseCommand
|
||||||
{
|
{
|
|
@ -1,7 +1,7 @@
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
using GethPlugin;
|
using GethPlugin;
|
||||||
|
|
||||||
namespace BiblioTech.TokenCommands
|
namespace BiblioTech.Commands
|
||||||
{
|
{
|
||||||
public class EthAddressOption : CommandOption
|
public class EthAddressOption : CommandOption
|
||||||
{
|
{
|
|
@ -3,7 +3,7 @@ using Core;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
using GethPlugin;
|
using GethPlugin;
|
||||||
|
|
||||||
namespace BiblioTech.TokenCommands
|
namespace BiblioTech.Commands
|
||||||
{
|
{
|
||||||
public class GetBalanceCommand : BaseNetCommand
|
public class GetBalanceCommand : BaseNetCommand
|
||||||
{
|
{
|
|
@ -3,7 +3,7 @@ using Core;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
using GethPlugin;
|
using GethPlugin;
|
||||||
|
|
||||||
namespace BiblioTech.TokenCommands
|
namespace BiblioTech.Commands
|
||||||
{
|
{
|
||||||
public class MintCommand : BaseNetCommand
|
public class MintCommand : BaseNetCommand
|
||||||
{
|
{
|
|
@ -1,6 +1,6 @@
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
namespace BiblioTech.TokenCommands
|
namespace BiblioTech.Commands
|
||||||
{
|
{
|
||||||
public class ReportHistoryCommand : BaseCommand
|
public class ReportHistoryCommand : BaseCommand
|
||||||
{
|
{
|
|
@ -1,10 +1,13 @@
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
namespace BiblioTech.TokenCommands
|
namespace BiblioTech.Commands
|
||||||
{
|
{
|
||||||
public class UserAssociateCommand : BaseCommand
|
public class UserAssociateCommand : BaseCommand
|
||||||
{
|
{
|
||||||
private readonly EthAddressOption ethOption = new EthAddressOption();
|
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 Name => "set";
|
||||||
public override string StartingMessage => "hold on...";
|
public override string StartingMessage => "hold on...";
|
||||||
|
@ -15,12 +18,12 @@ namespace BiblioTech.TokenCommands
|
||||||
|
|
||||||
protected override async Task Invoke(SocketSlashCommand command)
|
protected override async Task Invoke(SocketSlashCommand command)
|
||||||
{
|
{
|
||||||
var userId = command.User.Id;
|
var userId = GetUserId(optionalUser, command);
|
||||||
var data = await ethOption.Parse(command);
|
var data = await ethOption.Parse(command);
|
||||||
if (data == null) return;
|
if (data == null) return;
|
||||||
|
|
||||||
var currentAddress = Program.UserRepo.GetCurrentAddressForUser(userId);
|
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}.");
|
await command.FollowupAsync($"You've already set your Ethereum address to {currentAddress}.");
|
||||||
return;
|
return;
|
|
@ -1,7 +1,7 @@
|
||||||
using Discord;
|
using Discord;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
|
||||||
namespace BiblioTech.TokenCommands
|
namespace BiblioTech.Commands
|
||||||
{
|
{
|
||||||
public class UserOption : CommandOption
|
public class UserOption : CommandOption
|
||||||
{
|
{
|
|
@ -10,10 +10,7 @@ namespace BiblioTech
|
||||||
|
|
||||||
public CodexDeployment[] GetDeployments()
|
public CodexDeployment[] GetDeployments()
|
||||||
{
|
{
|
||||||
if (ShouldUpdate())
|
if (ShouldUpdate()) UpdateDeployments();
|
||||||
{
|
|
||||||
UpdateDeployments();
|
|
||||||
}
|
|
||||||
|
|
||||||
return deployments;
|
return deployments;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
using ArgsUniform;
|
using ArgsUniform;
|
||||||
using BiblioTech.TokenCommands;
|
using BiblioTech.Commands;
|
||||||
using Core;
|
using Core;
|
||||||
using Discord;
|
using Discord;
|
||||||
using Discord.WebSocket;
|
using Discord.WebSocket;
|
||||||
|
@ -14,6 +14,7 @@ namespace BiblioTech
|
||||||
public static Configuration Config { get; private set; } = null!;
|
public static Configuration Config { get; private set; } = null!;
|
||||||
public static DeploymentsFilesMonitor DeploymentFilesMonitor { get; } = new DeploymentsFilesMonitor();
|
public static DeploymentsFilesMonitor DeploymentFilesMonitor { get; } = new DeploymentsFilesMonitor();
|
||||||
public static UserRepo UserRepo { get; } = new UserRepo();
|
public static UserRepo UserRepo { get; } = new UserRepo();
|
||||||
|
public static AdminChecker AdminChecker { get; } = new AdminChecker();
|
||||||
|
|
||||||
public static Task Main(string[] args)
|
public static Task Main(string[] args)
|
||||||
{
|
{
|
||||||
|
@ -43,9 +44,13 @@ namespace BiblioTech
|
||||||
|
|
||||||
var ci = entryPoint.CreateInterface();
|
var ci = entryPoint.CreateInterface();
|
||||||
|
|
||||||
|
var associateCommand = new UserAssociateCommand();
|
||||||
var handler = new CommandHandler(client,
|
var handler = new CommandHandler(client,
|
||||||
new GetBalanceCommand(monitor, ci),
|
new ClearUserAssociationCommand(),
|
||||||
|
new GetBalanceCommand(monitor, ci, associateCommand),
|
||||||
new MintCommand(monitor, ci),
|
new MintCommand(monitor, ci),
|
||||||
|
new ReportHistoryCommand(),
|
||||||
|
associateCommand,
|
||||||
new DeploymentsCommand(monitor)
|
new DeploymentsCommand(monitor)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue