diff --git a/Common.cs b/Common.cs index 6a49ea0..3136a51 100644 --- a/Common.cs +++ b/Common.cs @@ -1,68 +1,53 @@ using Discord.WebSocket; -using System; using System.Collections.Generic; using System.Text; -namespace BirthdayBot -{ - static class Common - { - /// - /// Formats a user's name to a consistent, readable format which makes use of their nickname. - /// - public static string FormatName(SocketGuildUser member, bool ping) - { - if (ping) return member.Mention; +namespace BirthdayBot; - static string escapeFormattingCharacters(string input) - { - var result = new StringBuilder(); - foreach (var c in input) - { - if (c is '\\' or '_' or '~' or '*' or '@') - { - result.Append('\\'); - } - result.Append(c); +static class Common { + /// + /// Formats a user's name to a consistent, readable format which makes use of their nickname. + /// + public static string FormatName(SocketGuildUser member, bool ping) { + if (ping) return member.Mention; + + static string escapeFormattingCharacters(string input) { + var result = new StringBuilder(); + foreach (var c in input) { + if (c is '\\' or '_' or '~' or '*' or '@') { + result.Append('\\'); } - return result.ToString(); + result.Append(c); } - - var username = escapeFormattingCharacters(member.Username); - if (member.Nickname != null) - { - return $"**{escapeFormattingCharacters(member.Nickname)}** ({username}#{member.Discriminator})"; - } - return $"**{username}**#{member.Discriminator}"; + return result.ToString(); } - public static readonly Dictionary MonthNames = new() - { - {1, "Jan"}, {2, "Feb"}, {3, "Mar"}, {4, "Apr"}, {5, "May"}, {6, "Jun"}, - {7, "Jul"}, {8, "Aug"}, {9, "Sep"}, {10, "Oct"}, {11, "Nov"}, {12, "Dec"} - }; + var username = escapeFormattingCharacters(member.Username); + if (member.Nickname != null) { + return $"**{escapeFormattingCharacters(member.Nickname)}** ({username}#{member.Discriminator})"; + } + return $"**{username}**#{member.Discriminator}"; + } - public static string BotUptime => (DateTimeOffset.UtcNow - Program.BotStartTime).ToString("d' days, 'hh':'mm':'ss"); + public static Dictionary MonthNames { get; } = new() { + { 1, "Jan" }, { 2, "Feb" }, { 3, "Mar" }, { 4, "Apr" }, { 5, "May" }, { 6, "Jun" }, + { 7, "Jul" }, { 8, "Aug" }, { 9, "Sep" }, { 10, "Oct" }, { 11, "Nov" }, { 12, "Dec" } + }; - /// - /// An alternative to . - /// Returns true if *most* members have been downloaded. - /// - public static bool HasMostMembersDownloaded(SocketGuild guild) - { - if (guild.HasAllMembers) return true; - if (guild.MemberCount > 30) - { - // For guilds of size over 30, require 85% or more of the members to be known - // (26/30, 42/50, 255/300, etc) - int threshold = (int)(guild.MemberCount * 0.85); - return guild.DownloadedMemberCount >= threshold; - } - else - { - // For smaller guilds, fail if two or more members are missing - return guild.MemberCount - guild.DownloadedMemberCount <= 2; - } + /// + /// An alternative to . + /// Returns true if *most* members have been downloaded. + /// + public static bool HasMostMembersDownloaded(SocketGuild guild) { + if (guild.HasAllMembers) return true; + if (guild.MemberCount > 30) { + // For guilds of size over 30, require 85% or more of the members to be known + // (26/30, 42/50, 255/300, etc) + int threshold = (int)(guild.MemberCount * 0.85); + return guild.DownloadedMemberCount >= threshold; + } else { + // For smaller guilds, fail if two or more members are missing + return guild.MemberCount - guild.DownloadedMemberCount <= 2; } } } diff --git a/Program.cs b/Program.cs index d6d32bc..b827fba 100644 --- a/Program.cs +++ b/Program.cs @@ -6,7 +6,12 @@ namespace BirthdayBot; class Program { private static ShardManager _bot; - public static DateTimeOffset BotStartTime { get; } = DateTimeOffset.UtcNow; + private static readonly DateTimeOffset _botStartTime = DateTimeOffset.UtcNow; + + /// + /// Returns the amount of time the program has been running in a human-readable format. + /// + public static string BotUptime => (DateTimeOffset.UtcNow - _botStartTime).ToString("d' days, 'hh':'mm':'ss"); static async Task Main() { var cfg = new Configuration(); diff --git a/ShardManager.cs b/ShardManager.cs index b1e3a2d..3910023 100644 --- a/ShardManager.cs +++ b/ShardManager.cs @@ -105,7 +105,7 @@ class ShardManager : IDisposable { Log("Warning: Not all shards terminated cleanly after 30 seconds. Continuing..."); } - Log($"Uptime: {Common.BotUptime}"); + Log($"Uptime: {Program.BotUptime}"); } private void Log(string message) => Program.Log(nameof(ShardManager), message); @@ -158,7 +158,7 @@ class ShardManager : IDisposable { private async Task StatusLoop() { try { while (!_mainCancel.IsCancellationRequested) { - Log($"Bot uptime: {Common.BotUptime}"); + Log($"Bot uptime: {Program.BotUptime}"); // Iterate through shard list, extract data var guildInfo = new Dictionary(); diff --git a/UserInterface/HelpInfoCommands.cs b/UserInterface/HelpInfoCommands.cs index d026927..137a001 100644 --- a/UserInterface/HelpInfoCommands.cs +++ b/UserInterface/HelpInfoCommands.cs @@ -156,7 +156,7 @@ namespace BirthdayBot.UserInterface //strStats.AppendLine("Server count: " + Discord.Guilds.Count.ToString()); // TODO restore this statistic strStats.AppendLine("Shard #" + instance.ShardId.ToString("00")); - strStats.AppendLine("Uptime: " + Common.BotUptime); + strStats.AppendLine("Uptime: " + Program.BotUptime); // TODO fun stats // current birthdays, total names registered, unique time zones