using System.ComponentModel; using System.Diagnostics; using System.Runtime.InteropServices; using App.Metrics; using Catalogger.Backend.Cache; using Catalogger.Backend.Database; using Catalogger.Backend.Extensions; using Humanizer; using Microsoft.EntityFrameworkCore; using Remora.Commands.Attributes; using Remora.Commands.Groups; using Remora.Discord.API.Abstractions.Objects; using Remora.Discord.API.Abstractions.Rest; using Remora.Discord.Commands.Feedback.Services; using Remora.Discord.Extensions.Embeds; using Remora.Discord.Gateway; using Remora.Results; using IClock = NodaTime.IClock; using IResult = Remora.Results.IResult; namespace Catalogger.Backend.Bot.Commands; [Group("catalogger")] public class MetaCommands( IClock clock, IMetrics metrics, DiscordGatewayClient client, IFeedbackService feedbackService, GuildCacheService guildCache, ChannelCacheService channelCache, IDiscordRestChannelAPI channelApi) : CommandGroup { [Command("ping")] [Description("Ping pong! See the bot's latency")] public async Task PingAsync() { var t1 = clock.GetCurrentInstant(); var msg = await feedbackService.SendContextualAsync("...").GetOrThrow(); var elapsed = clock.GetCurrentInstant() - t1; var process = Process.GetCurrentProcess(); var memoryUsage = process.WorkingSet64; var embed = new EmbedBuilder() .WithColour(DiscordUtils.Purple) .WithFooter($"{RuntimeInformation.FrameworkDescription} on {RuntimeInformation.RuntimeIdentifier}") .WithCurrentTimestamp(); embed.AddField("Ping", $"Gateway: {client.Latency.Humanize()}\nAPI: {elapsed.ToTimeSpan().Humanize()}", inline: true); embed.AddField("Memory usage", memoryUsage.Bytes().Humanize(), inline: true); var messagesReceived = metrics.Snapshot.GetForContext("Bot").Meters .FirstOrDefault(m => m.MultidimensionalName == CataloggerMetrics.MessagesReceived.Name)?.Value; if (messagesReceived != null) embed.AddField("Messages received", $"{messagesReceived.OneMinuteRate * 60:F1}/m", true); var messageCount = metrics.Snapshot.GetForContext("Bot").Gauges .FirstOrDefault(m => m.MultidimensionalName == CataloggerMetrics.MessagesStored.Name)?.Value ?? 0; embed.AddField("Numbers", $"{messageCount:N0} messages from {guildCache.Size:N0} servers\nCached {channelCache.Size:N0} channels", inline: false); IEmbed[] embeds = [embed.Build().GetOrThrow()]; return (Result)await channelApi.EditMessageAsync(msg.ChannelID, msg.ID, content: "", embeds: embeds); } }