From 3f937205296d2962111fa4910cf82d46e44220c7 Mon Sep 17 00:00:00 2001 From: Ed Halley <1223980+hariedo@users.noreply.github.com> Date: Wed, 11 Jun 2025 15:53:40 -0500 Subject: [PATCH 01/12] Add ToCommaList to StringExtensions.cs --- DiscordBot/Extensions/StringExtensions.cs | 32 +++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/DiscordBot/Extensions/StringExtensions.cs b/DiscordBot/Extensions/StringExtensions.cs index a06ed58e..470bb677 100644 --- a/DiscordBot/Extensions/StringExtensions.cs +++ b/DiscordBot/Extensions/StringExtensions.cs @@ -122,7 +122,7 @@ public static string GetSha256(this string input) /// /// Returns true if the string contains only upper case characters, including spaces and all punctuation ie; "I NEED HELP!?!?!?!#$?!" will return true /// - public static bool IsAlLCaps(this string str) + public static bool IsAllCaps(this string str) { return Regex.IsMatch(str, @"^[A-Z\s\p{P}]+$"); } @@ -133,4 +133,32 @@ public static string ToCapitalizeFirstLetter(this string str) return string.Empty; return char.ToUpper(str[0]) + str[1..]; } -} \ No newline at end of file + + /// + /// Joins a list of strings with commas into a natural phrase: + /// "apples" + /// "apples and bananas" + /// "apples, bananas, and cherries" + /// + /// array of element phrases to be listed + /// final conjunction; defaults to "and" if not given + public static string ToCommaList(string[] nouns, string conj=null) + { + if (conj == null) + conj = "and"; + var sb = new StringBuilder(); + for (int i = 0; i < nouns.Length; i++) + { + if (i > 0) + { + if (nouns.Length > 2) + sb.Append(","); + sb.Append(" "); + if (i == nouns.Length-1) + sb.Append(conj).Append(" "); + } + sb.Append(nouns[i]); + } + return sb.ToString(); + } +} From f04e1b7b8a457579175361bbe9703acf405acb28 Mon Sep 17 00:00:00 2001 From: Ed Halley <1223980+hariedo@users.noreply.github.com> Date: Wed, 11 Jun 2025 15:54:38 -0500 Subject: [PATCH 02/12] Fix typo in UnityHelpService.cs IsAllCaps was spelled as IsAlLCaps (one capital L) in StringExtensions.cs --- DiscordBot/Services/UnityHelp/UnityHelpService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DiscordBot/Services/UnityHelp/UnityHelpService.cs b/DiscordBot/Services/UnityHelp/UnityHelpService.cs index 62c77b6b..2ae6b3c4 100644 --- a/DiscordBot/Services/UnityHelp/UnityHelpService.cs +++ b/DiscordBot/Services/UnityHelp/UnityHelpService.cs @@ -184,7 +184,7 @@ private async Task OnThreadCreated(SocketThreadChannel thread) } var threadTitle = thread.Name; - if (threadTitle.IsAlLCaps()) + if (threadTitle.IsAllCaps()) { threadTitle = thread.Name.ToLower(); } @@ -750,4 +750,4 @@ public int GetTrackedQuestionCount() #endregion // Utility Methods -} \ No newline at end of file +} From 0264e9d9c135c4bdfbda6c49d9fd87bb2485c8cd Mon Sep 17 00:00:00 2001 From: Ed Halley <1223980+hariedo@users.noreply.github.com> Date: Wed, 11 Jun 2025 16:04:27 -0500 Subject: [PATCH 03/12] Offer list and array for ToCommaList in StringExtensions.cs --- DiscordBot/Extensions/StringExtensions.cs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/DiscordBot/Extensions/StringExtensions.cs b/DiscordBot/Extensions/StringExtensions.cs index 470bb677..4167dfc9 100644 --- a/DiscordBot/Extensions/StringExtensions.cs +++ b/DiscordBot/Extensions/StringExtensions.cs @@ -140,7 +140,7 @@ public static string ToCapitalizeFirstLetter(this string str) /// "apples and bananas" /// "apples, bananas, and cherries" /// - /// array of element phrases to be listed + /// array or list of element phrases to be listed /// final conjunction; defaults to "and" if not given public static string ToCommaList(string[] nouns, string conj=null) { @@ -161,4 +161,23 @@ public static string ToCommaList(string[] nouns, string conj=null) } return sb.ToString(); } + public static string ToCommaList(List nouns, string conj=null) + { + if (conj == null) + conj = "and"; + var sb = new StringBuilder(); + for (int i = 0; i < nouns.Count; i++) + { + if (i > 0) + { + if (nouns.Count > 2) + sb.Append(","); + sb.Append(" "); + if (i == nouns.Count-1) + sb.Append(conj).Append(" "); + } + sb.Append(nouns[i]); + } + return sb.ToString(); + } } From d2e1a97b4410be62c09075386de331b265aaf6c2 Mon Sep 17 00:00:00 2001 From: Ed Halley <1223980+hariedo@users.noreply.github.com> Date: Wed, 11 Jun 2025 16:12:52 -0500 Subject: [PATCH 04/12] Add mapped array helpers for UserExtensions.cs Add users.ToUserPreferredNameArray() and users.ToMentionArray() for convenience and consistency. --- DiscordBot/Extensions/UserExtensions.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/DiscordBot/Extensions/UserExtensions.cs b/DiscordBot/Extensions/UserExtensions.cs index 8f341868..76ed2e0b 100644 --- a/DiscordBot/Extensions/UserExtensions.cs +++ b/DiscordBot/Extensions/UserExtensions.cs @@ -45,4 +45,20 @@ public static string GetUserLoggingString(this IUser user) return $"{user.Username} `{user.Id}`"; return $"{guildUser.GetPreferredAndUsername()} `{guildUser.Id}`"; } -} \ No newline at end of file + + public static string[] ToUserPreferredNameArray(this IUser[] users) + { + var names = new string[users.Length]; + for (int i = 0; i < users.Length; i++) + names[i] = GetUserPreferredName(users[i]); + return names; + } + + public static string[] ToMentionArray(this IUser[] users) + { + var mentions = new string[users.Length]; + for (int i = 0; i < users.Length; i++) + mentions[i] = users[i].Mention; + return mentions; + } +} From cdbc5683ff6d8c095b94e0565252c9bcc6eedcf3 Mon Sep 17 00:00:00 2001 From: Ed Halley <1223980+hariedo@users.noreply.github.com> Date: Wed, 11 Jun 2025 16:15:22 -0500 Subject: [PATCH 05/12] Update StringExtensions.cs --- DiscordBot/Extensions/StringExtensions.cs | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/DiscordBot/Extensions/StringExtensions.cs b/DiscordBot/Extensions/StringExtensions.cs index 4167dfc9..bed2dd98 100644 --- a/DiscordBot/Extensions/StringExtensions.cs +++ b/DiscordBot/Extensions/StringExtensions.cs @@ -142,7 +142,7 @@ public static string ToCapitalizeFirstLetter(this string str) /// /// array or list of element phrases to be listed /// final conjunction; defaults to "and" if not given - public static string ToCommaList(string[] nouns, string conj=null) + public static string ToCommaList(this string[] nouns, string conj=null) { if (conj == null) conj = "and"; @@ -161,23 +161,4 @@ public static string ToCommaList(string[] nouns, string conj=null) } return sb.ToString(); } - public static string ToCommaList(List nouns, string conj=null) - { - if (conj == null) - conj = "and"; - var sb = new StringBuilder(); - for (int i = 0; i < nouns.Count; i++) - { - if (i > 0) - { - if (nouns.Count > 2) - sb.Append(","); - sb.Append(" "); - if (i == nouns.Count-1) - sb.Append(conj).Append(" "); - } - sb.Append(nouns[i]); - } - return sb.ToString(); - } } From 5356316acc2b61bca806363d698469cf47b967c0 Mon Sep 17 00:00:00 2001 From: Ed Halley <1223980+hariedo@users.noreply.github.com> Date: Wed, 11 Jun 2025 16:16:57 -0500 Subject: [PATCH 06/12] Update UserModule.cs Rare surprise for !slap users. --- DiscordBot/Modules/UserModule.cs | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/DiscordBot/Modules/UserModule.cs b/DiscordBot/Modules/UserModule.cs index 9ad86032..b65276f9 100644 --- a/DiscordBot/Modules/UserModule.cs +++ b/DiscordBot/Modules/UserModule.cs @@ -623,10 +623,32 @@ public async Task SlapUser(params IUser[] users) var sb = new StringBuilder(); var uname = Context.User.GetUserPreferredName(); - sb.Append($"**{uname}** slaps "); - foreach (var user in users) sb.Append(user.Mention).Append(" "); - sb.Append("around a bit with a large ").Append(Settings.UserModuleSlapChoices[_random.Next() % Settings.UserModuleSlapChoices.Count]).Append("."); + bool fail = (_random.Next(1, 100) < 5); + + if (fail) + sb.Append($"**{uname}** tries to slap "); + else + sb.Append($"**{uname}** slaps "); + + var mentions = users.ToMentionArray(); + sb.Append(mentions.ToCommaList()); + + if (fail) + { + sb.Append(" around a bit with a large "); + sb.Append(Settings.UserModuleSlapChoices[_random.Next() % Settings.UserModuleSlapChoices.Count]); + sb.Append(", but misses and ends up "); + sb.Append("hurting themselves"); + // sb.Append(Settings.UserModuleSlapFailChoices[_random.Next() % Settings.UserModuleSlapFailChoices.Count]); + sb.Append("."); + } + else + { + sb.Append(" around a bit with a large "); + sb.Append(Settings.UserModuleSlapChoices[_random.Next() % Settings.UserModuleSlapChoices.Count]); + sb.Append("."); + } await Context.Channel.SendMessageAsync(sb.ToString()); await Context.Message.DeleteAfterSeconds(seconds: 1); From 325a0a16aa7eed0bd0aa51a0d6db128ad43b3a86 Mon Sep 17 00:00:00 2001 From: Ed Halley <1223980+hariedo@users.noreply.github.com> Date: Wed, 11 Jun 2025 16:27:08 -0500 Subject: [PATCH 07/12] Remove lint in StringExtensions.cs --- DiscordBot/Extensions/StringExtensions.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/DiscordBot/Extensions/StringExtensions.cs b/DiscordBot/Extensions/StringExtensions.cs index bed2dd98..6f2153b4 100644 --- a/DiscordBot/Extensions/StringExtensions.cs +++ b/DiscordBot/Extensions/StringExtensions.cs @@ -152,10 +152,10 @@ public static string ToCommaList(this string[] nouns, string conj=null) if (i > 0) { if (nouns.Length > 2) - sb.Append(","); - sb.Append(" "); + sb.Append(','); + sb.Append(' '); if (i == nouns.Length-1) - sb.Append(conj).Append(" "); + sb.Append(conj).Append(' '); } sb.Append(nouns[i]); } From 50a76c673e9174b5e3350574f06f50d122a00c0f Mon Sep 17 00:00:00 2001 From: Ed Halley <1223980+hariedo@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:05:56 -0500 Subject: [PATCH 08/12] Testing lists in Settings.cs --- DiscordBot/Settings/Deserialized/Settings.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/DiscordBot/Settings/Deserialized/Settings.cs b/DiscordBot/Settings/Deserialized/Settings.cs index 342fe0cb..d450784d 100644 --- a/DiscordBot/Settings/Deserialized/Settings.cs +++ b/DiscordBot/Settings/Deserialized/Settings.cs @@ -25,7 +25,10 @@ public class BotSettings #region Fun Commands - public List UserModuleSlapChoices { get; set; } = new List() { "trout", "duck", "truck", "paddle", "magikarp", "sausage", "student loan", "life choice", "bug report", "unhandled exception", "null pointer", "keyboard", "cheese wheel", "banana peel", "unresolved bug", "low poly donut" }; + public List UserModuleSlapChoices { get; set; }; + // = { "trout", "duck", "truck", "paddle", "magikarp", "sausage", "student loan", + // "life choice", "bug report", "unhandled exception", "null pointer", "keyboard", + // "cheese wheel", "banana peel", "unresolved bug", "low poly donut" }; #endregion // Fun Commands From d9c9342bba724fcab271809933a070d8307d797c Mon Sep 17 00:00:00 2001 From: Ed Halley <1223980+hariedo@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:06:23 -0500 Subject: [PATCH 09/12] Protecting UserModule.cs --- DiscordBot/Modules/UserModule.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/DiscordBot/Modules/UserModule.cs b/DiscordBot/Modules/UserModule.cs index b65276f9..5f132714 100644 --- a/DiscordBot/Modules/UserModule.cs +++ b/DiscordBot/Modules/UserModule.cs @@ -624,6 +624,9 @@ public async Task SlapUser(params IUser[] users) var uname = Context.User.GetUserPreferredName(); + if (Settings.UserModuleSlapChoices == null || Settings.UserModuleSlapChoices.Count == 0) + Settings.UserModuleSlapChoices = new List() { "fish", "mallet" }; + bool fail = (_random.Next(1, 100) < 5); if (fail) From 74ce387612bb4c457fa9476aca22c11b4acb9fa5 Mon Sep 17 00:00:00 2001 From: Ed Halley <1223980+hariedo@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:07:30 -0500 Subject: [PATCH 10/12] Update Settings.cs --- DiscordBot/Settings/Deserialized/Settings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DiscordBot/Settings/Deserialized/Settings.cs b/DiscordBot/Settings/Deserialized/Settings.cs index d450784d..e3c39560 100644 --- a/DiscordBot/Settings/Deserialized/Settings.cs +++ b/DiscordBot/Settings/Deserialized/Settings.cs @@ -25,7 +25,7 @@ public class BotSettings #region Fun Commands - public List UserModuleSlapChoices { get; set; }; + public List UserModuleSlapChoices { get; set; } // = { "trout", "duck", "truck", "paddle", "magikarp", "sausage", "student loan", // "life choice", "bug report", "unhandled exception", "null pointer", "keyboard", // "cheese wheel", "banana peel", "unresolved bug", "low poly donut" }; From 4b3428281823dd7be9f8c05c0df788a65a09a814 Mon Sep 17 00:00:00 2001 From: Ed Halley <1223980+hariedo@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:28:22 -0500 Subject: [PATCH 11/12] Update Settings.cs --- DiscordBot/Settings/Deserialized/Settings.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/DiscordBot/Settings/Deserialized/Settings.cs b/DiscordBot/Settings/Deserialized/Settings.cs index e3c39560..e188c1c0 100644 --- a/DiscordBot/Settings/Deserialized/Settings.cs +++ b/DiscordBot/Settings/Deserialized/Settings.cs @@ -25,10 +25,13 @@ public class BotSettings #region Fun Commands + //NOTE: Deserializer will not override a List from the file if a default one is made here. public List UserModuleSlapChoices { get; set; } // = { "trout", "duck", "truck", "paddle", "magikarp", "sausage", "student loan", // "life choice", "bug report", "unhandled exception", "null pointer", "keyboard", // "cheese wheel", "banana peel", "unresolved bug", "low poly donut" }; + public List UserModuleSlapFails { get; set; } + // = { "hurting themselves" }; #endregion // Fun Commands From 84f461f62e30d258b9fcbd1dd1d2db97ef39b2d3 Mon Sep 17 00:00:00 2001 From: Ed Halley <1223980+hariedo@users.noreply.github.com> Date: Wed, 11 Jun 2025 17:28:29 -0500 Subject: [PATCH 12/12] Update UserModule.cs --- DiscordBot/Modules/UserModule.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/DiscordBot/Modules/UserModule.cs b/DiscordBot/Modules/UserModule.cs index 5f132714..9fe2994e 100644 --- a/DiscordBot/Modules/UserModule.cs +++ b/DiscordBot/Modules/UserModule.cs @@ -626,6 +626,8 @@ public async Task SlapUser(params IUser[] users) if (Settings.UserModuleSlapChoices == null || Settings.UserModuleSlapChoices.Count == 0) Settings.UserModuleSlapChoices = new List() { "fish", "mallet" }; + if (Settings.UserModuleSlapFails == null || Settings.UserModuleSlapFails.Count == 0) + Settings.UserModuleSlapFails = new List() { "hurting themselves" }; bool fail = (_random.Next(1, 100) < 5); @@ -642,8 +644,7 @@ public async Task SlapUser(params IUser[] users) sb.Append(" around a bit with a large "); sb.Append(Settings.UserModuleSlapChoices[_random.Next() % Settings.UserModuleSlapChoices.Count]); sb.Append(", but misses and ends up "); - sb.Append("hurting themselves"); - // sb.Append(Settings.UserModuleSlapFailChoices[_random.Next() % Settings.UserModuleSlapFailChoices.Count]); + sb.Append(Settings.UserModuleSlapFails[_random.Next() % Settings.UserModuleSlapFails.Count]); sb.Append("."); } else