diff --git a/MinecraftClient/ChatBots/Alerts.cs b/MinecraftClient/ChatBots/Alerts.cs index 4be3b16c..b60a39ee 100644 --- a/MinecraftClient/ChatBots/Alerts.cs +++ b/MinecraftClient/ChatBots/Alerts.cs @@ -2,125 +2,96 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using System.IO; namespace MinecraftClient.ChatBots { /// /// This bot make the console beep on some specified words. Useful to detect when someone is talking to you, for example. /// - public class Alerts : ChatBot { private string[] dictionary = new string[0]; private string[] excludelist = new string[0]; - public override void Initialize() + /// + /// Import alerts from the specified file + /// + /// + /// + private static string[] FromFile(string file) { - if (System.IO.File.Exists(Settings.Alerts_MatchesFile)) + if (File.Exists(file)) { - List tmp_dictionary = new List(); - string[] file_lines = System.IO.File.ReadAllLines(Settings.Alerts_MatchesFile); - foreach (string line in file_lines) - if (line.Trim().Length > 0 && !tmp_dictionary.Contains(line.ToLower())) - tmp_dictionary.Add(line.ToLower()); - dictionary = tmp_dictionary.ToArray(); + //Read all lines from file, remove lines with no text, convert to lowercase, + //remove duplicate entries, convert to a string array, and return the result. + return File.ReadAllLines(file) + .Where(line => !String.IsNullOrWhiteSpace(line)) + .Select(line => line.ToLower()) + .Distinct().ToArray(); } - else LogToConsole("File not found: " + Settings.Alerts_MatchesFile); - - if (System.IO.File.Exists(Settings.Alerts_ExcludesFile)) + else { - List tmp_excludelist = new List(); - string[] file_lines = System.IO.File.ReadAllLines(Settings.Alerts_ExcludesFile); - foreach (string line in file_lines) - if (line.Trim().Length > 0 && !tmp_excludelist.Contains(line.Trim().ToLower())) - tmp_excludelist.Add(line.ToLower()); - excludelist = tmp_excludelist.ToArray(); + LogToConsole("File not found: " + Settings.Alerts_MatchesFile); + return new string[0]; } - else LogToConsole("File not found : " + Settings.Alerts_ExcludesFile); } + /// + /// Intitialize the Alerts bot + /// + public override void Initialize() + { + dictionary = FromFile(Settings.Alerts_MatchesFile); + excludelist = FromFile(Settings.Alerts_ExcludesFile); + } + + /// + /// Process text received from the server to display alerts + /// + /// Received text public override void GetText(string text) { - text = getVerbatim(text); - string comp = text.ToLower(); - foreach (string alert in dictionary) + //Remove color codes and convert to lowercase + text = getVerbatim(text).ToLower(); + + //Proceed only if no exclusions are found in text + if (!excludelist.Any(exclusion => text.Contains(exclusion))) { - if (comp.Contains(alert)) + //Show an alert for each alert item found in text, if any + foreach (string alert in dictionary.Where(alert => text.Contains(alert))) { - bool ok = true; + if (Settings.Alerts_Beep_Enabled) + Console.Beep(); //Text found ! - foreach (string exclusion in excludelist) + if (ConsoleIO.basicIO) //Using a GUI? Pass text as is. + ConsoleIO.WriteLine(text.Replace(alert, "§c" + alert + "§r")); + + else //Using Consome Prompt : Print text with alert highlighted { - if (comp.Contains(exclusion)) + string[] splitted = text.Split(new string[] { alert }, StringSplitOptions.None); + + if (splitted.Length > 0) { - ok = false; - break; - } - } - - if (ok) - { - if (Settings.Alerts_Beep_Enabled) { Console.Beep(); } //Text found ! - - if (ConsoleIO.basicIO) { ConsoleIO.WriteLine(comp.Replace(alert, "§c" + alert + "§r")); } - else - { - - #region Displaying the text with the interesting part highlighted - Console.BackgroundColor = ConsoleColor.DarkGray; Console.ForegroundColor = ConsoleColor.White; + ConsoleIO.Write(splitted[0]); - //Will be used for text displaying - string[] temp = comp.Split(alert.Split(','), StringSplitOptions.None); - int p = 0; - - //Special case : alert in the beginning of the text - string test = ""; - for (int i = 0; i < alert.Length; i++) - { - test += comp[i]; - } - if (test == alert) + for (int i = 1; i < splitted.Length; i++) { Console.BackgroundColor = ConsoleColor.Yellow; Console.ForegroundColor = ConsoleColor.Red; - for (int i = 0; i < alert.Length; i++) - { - ConsoleIO.Write(text[p]); - p++; - } - } + ConsoleIO.Write(alert); - //Displaying the rest of the text - for (int i = 0; i < temp.Length; i++) - { Console.BackgroundColor = ConsoleColor.DarkGray; Console.ForegroundColor = ConsoleColor.White; - for (int j = 0; j < temp[i].Length; j++) - { - ConsoleIO.Write(text[p]); - p++; - } - Console.BackgroundColor = ConsoleColor.Yellow; - Console.ForegroundColor = ConsoleColor.Red; - try - { - for (int j = 0; j < alert.Length; j++) - { - ConsoleIO.Write(text[p]); - p++; - } - } - catch (IndexOutOfRangeException) { } + ConsoleIO.Write(splitted[i]); } - Console.BackgroundColor = ConsoleColor.Black; - Console.ForegroundColor = ConsoleColor.Gray; - ConsoleIO.Write('\n'); - - #endregion - } + + Console.BackgroundColor = ConsoleColor.Black; + Console.ForegroundColor = ConsoleColor.Gray; + ConsoleIO.Write('\n'); } } }