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; 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); } return result.ToString(); } var username = escapeFormattingCharacters(member.Username); if (member.Nickname != null) { return $"**{escapeFormattingCharacters(member.Nickname)}** ({username}#{member.Discriminator})"; } return $"**{username}**#{member.Discriminator}"; } 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"} }; public static string BotUptime => (DateTimeOffset.UtcNow - Program.BotStartTime).ToString("d' days, 'hh':'mm':'ss"); /// /// 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; } } } }