Replaces debug/info fetching with list of known SPRs, settable via admin commands.

This commit is contained in:
benbierens 2023-11-21 09:38:58 +01:00
parent 54471d41d5
commit a84d6a3c22
No known key found for this signature in database
GPG Key ID: FE44815D96D0A1AA
4 changed files with 106 additions and 61 deletions

View File

@ -1,27 +0,0 @@
using BiblioTech.Options;
using CodexPlugin;
using Core;
namespace BiblioTech
{
public abstract class BaseCodexCommand : BaseDeploymentCommand
{
private readonly CoreInterface ci;
public BaseCodexCommand(CoreInterface ci)
{
this.ci = ci;
}
protected override async Task ExecuteDeploymentCommand(CommandContext context, CodexDeployment codexDeployment)
{
var codexContainers = codexDeployment.CodexInstances.Select(c => c.Containers).ToArray();
var group = ci.WrapCodexContainers(codexContainers);
await Execute(context, group);
}
protected abstract Task Execute(CommandContext context, ICodexNodeGroup codexGroup);
}
}

View File

@ -15,11 +15,17 @@ namespace BiblioTech.Commands
private readonly WhoIsCommand whoIsCommand = new WhoIsCommand();
private readonly NetInfoCommand netInfoCommand;
private readonly DebugPeerCommand debugPeerCommand;
private readonly AddSprCommand addSprCommand;
private readonly ClearSprsCommand clearSprsCommand;
private readonly GetSprCommand getSprCommand;
public AdminCommand(CoreInterface ci)
public AdminCommand(CoreInterface ci, SprCommand sprCommand)
{
netInfoCommand = new NetInfoCommand(ci);
debugPeerCommand = new DebugPeerCommand(ci);
addSprCommand = new AddSprCommand(sprCommand);
clearSprsCommand = new ClearSprsCommand(sprCommand);
getSprCommand = new GetSprCommand(sprCommand);
}
public override string Name => "admin";
@ -35,7 +41,10 @@ namespace BiblioTech.Commands
deployRemoveCommand,
whoIsCommand,
netInfoCommand,
debugPeerCommand
debugPeerCommand,
addSprCommand,
clearSprsCommand,
getSprCommand
};
protected override async Task Invoke(CommandContext context)
@ -60,6 +69,9 @@ namespace BiblioTech.Commands
await whoIsCommand.CommandHandler(context);
await netInfoCommand.CommandHandler(context);
await debugPeerCommand.CommandHandler(context);
await addSprCommand.CommandHandler(context);
await clearSprsCommand.CommandHandler(context);
await deployUploadCommand.CommandHandler(context);
}
public class ClearUserAssociationCommand : SubCommandOption
@ -379,5 +391,77 @@ namespace BiblioTech.Commands
return content.ToArray();
}
}
public class AddSprCommand : SubCommandOption
{
private readonly SprCommand sprCommand;
private readonly StringOption stringOption = new StringOption("spr", "Codex SPR", true);
public AddSprCommand(SprCommand sprCommand)
: base(name: "addspr",
description: "Adds a Codex SPR, to be given to users with '/boot'.")
{
this.sprCommand = sprCommand;
}
public override CommandOption[] Options => new[] { stringOption };
protected override async Task onSubCommand(CommandContext context)
{
var spr = await stringOption.Parse(context);
if (!string.IsNullOrEmpty(spr) )
{
sprCommand.Add(spr);
await context.Followup("A-OK!");
}
else
{
await context.Followup("SPR is null or empty.");
}
}
}
public class ClearSprsCommand : SubCommandOption
{
private readonly SprCommand sprCommand;
private readonly StringOption stringOption = new StringOption("areyousure", "set to 'true' if you are.", true);
public ClearSprsCommand(SprCommand sprCommand)
: base(name: "clearsprs",
description: "Clears all Codex SPRs in the bot. Users won't be able to use '/boot' till new ones are added.")
{
this.sprCommand = sprCommand;
}
public override CommandOption[] Options => new[] { stringOption };
protected override async Task onSubCommand(CommandContext context)
{
var areyousure = await stringOption.Parse(context);
if (areyousure != "true") return;
sprCommand.Clear();
await context.Followup("Cleared all SPRs.");
}
}
public class GetSprCommand: SubCommandOption
{
private readonly SprCommand sprCommand;
public GetSprCommand(SprCommand sprCommand)
: base(name: "getsprs",
description: "Shows all Codex SPRs in the bot.")
{
this.sprCommand = sprCommand;
}
protected override async Task onSubCommand(CommandContext context)
{
await context.Followup("SPRs: " + string.Join(", ", sprCommand.Get().Select(s => $"'{s}'")));
}
}
}
}

View File

@ -1,61 +1,48 @@
using BiblioTech.Options;
using CodexPlugin;
using Core;
namespace BiblioTech.Commands
{
public class SprCommand : BaseCodexCommand
public class SprCommand : BaseCommand
{
private readonly Random random = new Random();
private readonly List<string> sprCache = new List<string>();
private DateTime lastUpdate = DateTime.MinValue;
public SprCommand(CoreInterface ci) : base(ci)
{
}
private readonly List<string> knownSprs = new List<string>();
public override string Name => "boot";
public override string StartingMessage => RandomBusyMessage.Get();
public override string Description => "Gets an SPR. (Signed peer record, used for bootstrapping.)";
protected override async Task<bool> OnInvoke(CommandContext context)
protected override async Task Invoke(CommandContext context)
{
if (ShouldUpdate())
{
return true;
}
await ReplyWithRandomSpr(context);
return false;
}
protected override async Task Execute(CommandContext context, ICodexNodeGroup codexGroup)
public void Add(string spr)
{
lastUpdate = DateTime.UtcNow;
sprCache.Clear();
if (knownSprs.Contains(spr)) return;
knownSprs.Add(spr);
}
var infos = codexGroup.Select(c => c.GetDebugInfo()).ToArray();
sprCache.AddRange(infos.Select(i => i.spr));
public void Clear()
{
knownSprs.Clear();
}
await ReplyWithRandomSpr(context);
public string[] Get()
{
return knownSprs.ToArray();
}
private async Task ReplyWithRandomSpr(CommandContext context)
{
if (!sprCache.Any())
if (!knownSprs.Any())
{
await context.Followup("I'm sorry, no SPRs are available... :c");
return;
}
var i = random.Next(0, sprCache.Count);
var spr = sprCache[i];
var i = random.Next(0, knownSprs.Count);
var spr = knownSprs[i];
await context.Followup($"Your SPR: `{spr}`");
}
private bool ShouldUpdate()
{
return (DateTime.UtcNow - lastUpdate) > TimeSpan.FromMinutes(10);
}
}
}

View File

@ -49,12 +49,13 @@ namespace BiblioTech
var ci = entryPoint.CreateInterface();
var associateCommand = new UserAssociateCommand();
var sprCommand = new SprCommand();
var handler = new CommandHandler(client,
new GetBalanceCommand(ci, associateCommand),
new MintCommand(ci, associateCommand),
new SprCommand(ci),
sprCommand,
associateCommand,
new AdminCommand(ci)
new AdminCommand(ci, sprCommand)
);
await client.LoginAsync(TokenType.Bot, Config.ApplicationToken);