Replaces debug/info fetching with list of known SPRs, settable via admin commands.
This commit is contained in:
parent
54471d41d5
commit
a84d6a3c22
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -15,11 +15,17 @@ namespace BiblioTech.Commands
|
||||||
private readonly WhoIsCommand whoIsCommand = new WhoIsCommand();
|
private readonly WhoIsCommand whoIsCommand = new WhoIsCommand();
|
||||||
private readonly NetInfoCommand netInfoCommand;
|
private readonly NetInfoCommand netInfoCommand;
|
||||||
private readonly DebugPeerCommand debugPeerCommand;
|
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);
|
netInfoCommand = new NetInfoCommand(ci);
|
||||||
debugPeerCommand = new DebugPeerCommand(ci);
|
debugPeerCommand = new DebugPeerCommand(ci);
|
||||||
|
addSprCommand = new AddSprCommand(sprCommand);
|
||||||
|
clearSprsCommand = new ClearSprsCommand(sprCommand);
|
||||||
|
getSprCommand = new GetSprCommand(sprCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string Name => "admin";
|
public override string Name => "admin";
|
||||||
|
@ -35,7 +41,10 @@ namespace BiblioTech.Commands
|
||||||
deployRemoveCommand,
|
deployRemoveCommand,
|
||||||
whoIsCommand,
|
whoIsCommand,
|
||||||
netInfoCommand,
|
netInfoCommand,
|
||||||
debugPeerCommand
|
debugPeerCommand,
|
||||||
|
addSprCommand,
|
||||||
|
clearSprsCommand,
|
||||||
|
getSprCommand
|
||||||
};
|
};
|
||||||
|
|
||||||
protected override async Task Invoke(CommandContext context)
|
protected override async Task Invoke(CommandContext context)
|
||||||
|
@ -60,6 +69,9 @@ namespace BiblioTech.Commands
|
||||||
await whoIsCommand.CommandHandler(context);
|
await whoIsCommand.CommandHandler(context);
|
||||||
await netInfoCommand.CommandHandler(context);
|
await netInfoCommand.CommandHandler(context);
|
||||||
await debugPeerCommand.CommandHandler(context);
|
await debugPeerCommand.CommandHandler(context);
|
||||||
|
await addSprCommand.CommandHandler(context);
|
||||||
|
await clearSprsCommand.CommandHandler(context);
|
||||||
|
await deployUploadCommand.CommandHandler(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ClearUserAssociationCommand : SubCommandOption
|
public class ClearUserAssociationCommand : SubCommandOption
|
||||||
|
@ -379,5 +391,77 @@ namespace BiblioTech.Commands
|
||||||
return content.ToArray();
|
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}'")));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,61 +1,48 @@
|
||||||
using BiblioTech.Options;
|
using BiblioTech.Options;
|
||||||
using CodexPlugin;
|
|
||||||
using Core;
|
|
||||||
|
|
||||||
namespace BiblioTech.Commands
|
namespace BiblioTech.Commands
|
||||||
{
|
{
|
||||||
public class SprCommand : BaseCodexCommand
|
public class SprCommand : BaseCommand
|
||||||
{
|
{
|
||||||
private readonly Random random = new Random();
|
private readonly Random random = new Random();
|
||||||
private readonly List<string> sprCache = new List<string>();
|
private readonly List<string> knownSprs = new List<string>();
|
||||||
private DateTime lastUpdate = DateTime.MinValue;
|
|
||||||
|
|
||||||
public SprCommand(CoreInterface ci) : base(ci)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string Name => "boot";
|
public override string Name => "boot";
|
||||||
public override string StartingMessage => RandomBusyMessage.Get();
|
public override string StartingMessage => RandomBusyMessage.Get();
|
||||||
public override string Description => "Gets an SPR. (Signed peer record, used for bootstrapping.)";
|
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);
|
await ReplyWithRandomSpr(context);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async Task Execute(CommandContext context, ICodexNodeGroup codexGroup)
|
public void Add(string spr)
|
||||||
{
|
{
|
||||||
lastUpdate = DateTime.UtcNow;
|
if (knownSprs.Contains(spr)) return;
|
||||||
sprCache.Clear();
|
knownSprs.Add(spr);
|
||||||
|
}
|
||||||
|
|
||||||
var infos = codexGroup.Select(c => c.GetDebugInfo()).ToArray();
|
public void Clear()
|
||||||
sprCache.AddRange(infos.Select(i => i.spr));
|
{
|
||||||
|
knownSprs.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
await ReplyWithRandomSpr(context);
|
public string[] Get()
|
||||||
|
{
|
||||||
|
return knownSprs.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task ReplyWithRandomSpr(CommandContext context)
|
private async Task ReplyWithRandomSpr(CommandContext context)
|
||||||
{
|
{
|
||||||
if (!sprCache.Any())
|
if (!knownSprs.Any())
|
||||||
{
|
{
|
||||||
await context.Followup("I'm sorry, no SPRs are available... :c");
|
await context.Followup("I'm sorry, no SPRs are available... :c");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var i = random.Next(0, sprCache.Count);
|
var i = random.Next(0, knownSprs.Count);
|
||||||
var spr = sprCache[i];
|
var spr = knownSprs[i];
|
||||||
await context.Followup($"Your SPR: `{spr}`");
|
await context.Followup($"Your SPR: `{spr}`");
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool ShouldUpdate()
|
|
||||||
{
|
|
||||||
return (DateTime.UtcNow - lastUpdate) > TimeSpan.FromMinutes(10);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,12 +49,13 @@ namespace BiblioTech
|
||||||
var ci = entryPoint.CreateInterface();
|
var ci = entryPoint.CreateInterface();
|
||||||
|
|
||||||
var associateCommand = new UserAssociateCommand();
|
var associateCommand = new UserAssociateCommand();
|
||||||
|
var sprCommand = new SprCommand();
|
||||||
var handler = new CommandHandler(client,
|
var handler = new CommandHandler(client,
|
||||||
new GetBalanceCommand(ci, associateCommand),
|
new GetBalanceCommand(ci, associateCommand),
|
||||||
new MintCommand(ci, associateCommand),
|
new MintCommand(ci, associateCommand),
|
||||||
new SprCommand(ci),
|
sprCommand,
|
||||||
associateCommand,
|
associateCommand,
|
||||||
new AdminCommand(ci)
|
new AdminCommand(ci, sprCommand)
|
||||||
);
|
);
|
||||||
|
|
||||||
await client.LoginAsync(TokenType.Bot, Config.ApplicationToken);
|
await client.LoginAsync(TokenType.Bot, Config.ApplicationToken);
|
||||||
|
|
Loading…
Reference in New Issue