diff --git a/Tools/BiblioTech/BaseCommand.cs b/Tools/BiblioTech/BaseCommand.cs index ee90df2..c68aaeb 100644 --- a/Tools/BiblioTech/BaseCommand.cs +++ b/Tools/BiblioTech/BaseCommand.cs @@ -23,9 +23,9 @@ namespace BiblioTech try { - await command.RespondAsync(StartingMessage, ephemeral: true); - await Invoke(new CommandContext(command, command.Data.Options)); - await command.DeleteOriginalResponseAsync(); + var context = new CommandContext(command, command.Data.Options); + await command.RespondAsync(StartingMessage, ephemeral: IsEphemeral(context)); + await Invoke(context); } catch (Exception ex) { @@ -34,6 +34,12 @@ namespace BiblioTech } } + private bool IsEphemeral(CommandContext context) + { + if (IsSenderAdmin(context.Command) && IsInAdminChannel(context.Command)) return false; + return true; + } + protected abstract Task Invoke(CommandContext context); protected bool IsSenderAdmin(SocketSlashCommand command) diff --git a/Tools/BiblioTech/Commands/AdminCommand.cs b/Tools/BiblioTech/Commands/AdminCommand.cs index 4de4985..6ed79a8 100644 --- a/Tools/BiblioTech/Commands/AdminCommand.cs +++ b/Tools/BiblioTech/Commands/AdminCommand.cs @@ -78,12 +78,12 @@ namespace BiblioTech.Commands var user = userOption.GetUser(context); if (user == null) { - await context.AdminFollowup("Failed to get user ID"); + await context.Followup("Failed to get user ID"); return; } Program.UserRepo.ClearUserAssociatedAddress(user); - await context.AdminFollowup("Done."); + await context.Followup("Done."); } } @@ -105,12 +105,20 @@ namespace BiblioTech.Commands var user = userOption.GetUser(context); if (user == null) { - await context.AdminFollowup("Failed to get user ID"); + await context.Followup("Failed to get user ID"); return; } - var report = Program.UserRepo.GetInteractionReport(user); - await context.AdminFollowup(string.Join(Environment.NewLine, report)); + var report = string.Join(Environment.NewLine, Program.UserRepo.GetInteractionReport(user)); + if (report.Length > 1900) + { + var filename = $"user-{user.Username}.log"; + await context.FollowupWithAttachement(filename, report); + } + else + { + await context.Followup(report); + } } } @@ -127,11 +135,12 @@ namespace BiblioTech.Commands if (!deployments.Any()) { - await context.AdminFollowup("No deployments available."); + await context.Followup("No deployments available."); return; } - await context.AdminFollowup($"Deployments: {string.Join(", ", deployments.Select(FormatDeployment))}"); + var nl = Environment.NewLine; + await context.Followup($"Deployments:{nl}{string.Join(nl, deployments.Select(FormatDeployment))}"); } private string FormatDeployment(CodexDeployment deployment) @@ -163,11 +172,11 @@ namespace BiblioTech.Commands var result = await Program.DeploymentFilesMonitor.DownloadDeployment(file); if (result) { - await context.AdminFollowup("Success!"); + await context.Followup("Success!"); } else { - await context.AdminFollowup("That didn't work."); + await context.Followup("That didn't work."); } } } @@ -194,11 +203,11 @@ namespace BiblioTech.Commands var result = Program.DeploymentFilesMonitor.DeleteDeployment(str); if (result) { - await context.AdminFollowup("Success!"); + await context.Followup("Success!"); } else { - await context.AdminFollowup("That didn't work."); + await context.Followup("That didn't work."); } } } @@ -227,11 +236,11 @@ namespace BiblioTech.Commands if (user != null) { - await context.AdminFollowup(Program.UserRepo.GetUserReport(user)); + await context.Followup(Program.UserRepo.GetUserReport(user)); } if (ethAddr != null) { - await context.AdminFollowup(Program.UserRepo.GetUserReport(ethAddr)); + await context.Followup(Program.UserRepo.GetUserReport(ethAddr)); } } } @@ -246,23 +255,23 @@ namespace BiblioTech.Commands this.ci = ci; } - protected async Task OnDeployment(CommandContext context, Func action) + protected async Task OnDeployment(CommandContext context, Func action) { var deployment = Program.DeploymentFilesMonitor.GetDeployments().SingleOrDefault(); if (deployment == null) { - await context.AdminFollowup("No deployment found."); + await context.Followup("No deployment found."); return; } try { var group = ci.WrapCodexContainers(deployment.CodexInstances.Select(i => i.Container).ToArray()); - await action(group); + await action(group, deployment.Metadata.Name); } catch (Exception ex) { - await context.AdminFollowup("Failed to wrap nodes with exception: " + ex); + await context.Followup("Failed to wrap nodes with exception: " + ex); } } } @@ -277,24 +286,31 @@ namespace BiblioTech.Commands protected override async Task onSubCommand(CommandContext context) { - await OnDeployment(context, async group => + await OnDeployment(context, async (group, name) => { - await context.AdminFollowup($"{group.Count()} Codex nodes."); + var nl = Environment.NewLine; + var content = new List + { + $"{DateTime.UtcNow.ToString("o")} - {group.Count()} Codex nodes." + }; + foreach (var node in group) { try { var info = node.GetDebugInfo(); - var nl = Environment.NewLine; var json = JsonConvert.SerializeObject(info, Formatting.Indented); var jsonInsert = $"{nl}```{nl}{json}{nl}```{nl}"; - await context.AdminFollowup($"Node '{node.GetName()}' responded with {jsonInsert}"); + content.Add($"Node '{node.GetName()}' responded with {jsonInsert}"); } catch (Exception ex) { - await context.AdminFollowup($"Node '{node.GetName()}' failed to respond with exception: " + ex); + content.Add($"Node '{node.GetName()}' failed to respond with exception: " + ex); } } + + var filename = $"netinfo-{NoWhitespaces(name)}.log"; + await context.FollowupWithAttachement(filename, string.Join(nl, content.ToArray())); }); } } @@ -316,9 +332,9 @@ namespace BiblioTech.Commands var peerId = await peerIdOption.Parse(context); if (string.IsNullOrEmpty(peerId)) return; - await OnDeployment(context, async group => + await OnDeployment(context, async (group, name) => { - await context.AdminFollowup($"Calling debug/peer for '{peerId}' on {group.Count()} Codex nodes."); + await context.Followup($"Calling debug/peer for '{peerId}' on {group.Count()} Codex nodes."); foreach (var node in group) { try @@ -327,15 +343,20 @@ namespace BiblioTech.Commands var nl = Environment.NewLine; var json = JsonConvert.SerializeObject(info, Formatting.Indented); var jsonInsert = $"{nl}```{nl}{json}{nl}```{nl}"; - await context.AdminFollowup($"Node '{node.GetName()}' responded with {jsonInsert}"); + await context.Followup($"Node '{node.GetName()}' responded with {jsonInsert}"); } catch (Exception ex) { - await context.AdminFollowup($"Node '{node.GetName()}' failed to respond with exception: " + ex); + await context.Followup($"Node '{node.GetName()}' failed to respond with exception: " + ex); } } }); } } + + private static string NoWhitespaces(string s) + { + return s.Replace(" ", "-"); + } } } diff --git a/Tools/BiblioTech/Options/CommandContext.cs b/Tools/BiblioTech/Options/CommandContext.cs index 186bf2f..01567ce 100644 --- a/Tools/BiblioTech/Options/CommandContext.cs +++ b/Tools/BiblioTech/Options/CommandContext.cs @@ -15,12 +15,19 @@ namespace BiblioTech.Options public async Task Followup(string message) { - await Command.FollowupAsync(message, ephemeral: true); + await Command.ModifyOriginalResponseAsync(m => + { + m.Content = message; + }); } - public async Task AdminFollowup(string message) + public async Task FollowupWithAttachement(string filename, string content) { - await Command.FollowupAsync(message); + using var fileStream = new MemoryStream(); + using var streamWriter = new StreamWriter(fileStream); + await streamWriter.WriteAsync(content); + + await Command.FollowupWithFileAsync(fileStream, filename); } } } diff --git a/Tools/BiblioTech/UserRepo.cs b/Tools/BiblioTech/UserRepo.cs index b1190d3..1a78ac4 100644 --- a/Tools/BiblioTech/UserRepo.cs +++ b/Tools/BiblioTech/UserRepo.cs @@ -46,7 +46,10 @@ namespace BiblioTech public string[] GetInteractionReport(IUser user) { - var result = new List(); + var result = new List + { + $"User report create on {DateTime.UtcNow.ToString("o")}" + }; lock (repoLock) {