using System; using System.IO; namespace MinecraftClient.ChatBots { /// /// This bot saves the received messages in a text file. /// public class ChatLog : ChatBot { public enum MessageFilter { AllText, AllMessages, OnlyChat, OnlyWhispers, OnlyInternalCommands }; private readonly bool dateandtime; private readonly bool saveOther = true; private readonly bool saveChat = true; private readonly bool savePrivate = true; private readonly bool saveInternal = true; private readonly string logfile; private readonly object logfileLock = new(); /// /// This bot saves the messages received in the specified file, with some filters and date/time tagging. /// /// The file to save the log in /// The kind of messages to save /// Add a date and time before each message public ChatLog(string file, MessageFilter filter, bool AddDateAndTime) { dateandtime = AddDateAndTime; logfile = file; switch (filter) { case MessageFilter.AllText: saveOther = true; savePrivate = true; saveChat = true; break; case MessageFilter.AllMessages: saveOther = false; savePrivate = true; saveChat = true; break; case MessageFilter.OnlyChat: saveOther = false; savePrivate = false; saveChat = true; break; case MessageFilter.OnlyWhispers: saveOther = false; savePrivate = true; saveChat = false; break; case MessageFilter.OnlyInternalCommands: saveOther = false; savePrivate = false; saveChat = false; saveInternal = true; break; } if (String.IsNullOrEmpty(file) || file.IndexOfAny(Path.GetInvalidPathChars()) >= 0) { LogToConsoleTranslated("bot.chatLog.invalid_file", file); UnloadBot(); } } public static MessageFilter str2filter(string filtername) { return Settings.ToLowerIfNeed(filtername) switch { #pragma warning disable format // @formatter:off "all" => MessageFilter.AllText, "messages" => MessageFilter.AllMessages, "chat" => MessageFilter.OnlyChat, "private" => MessageFilter.OnlyWhispers, "internal" => MessageFilter.OnlyInternalCommands, _ => MessageFilter.AllText, #pragma warning restore format // @formatter:on }; } public override void GetText(string text) { text = GetVerbatim(text); string sender = ""; string message = ""; if (saveChat && IsChatMessage(text, ref message, ref sender)) { Save("Chat " + sender + ": " + message); } else if (savePrivate && IsPrivateMessage(text, ref message, ref sender)) { Save("Private " + sender + ": " + message); } else if (saveOther) { Save("Other: " + text); } } public override void OnInternalCommand(string commandName, string commandParams, string result) { if (saveInternal) { Save(string.Format("Internal {0}({1}): {2}", commandName, commandParams, result)); } } private void Save(string tosave) { if (dateandtime) tosave = GetTimestamp() + ' ' + tosave; lock (logfileLock) { string? directory = Path.GetDirectoryName(logfile); if (!String.IsNullOrEmpty(directory) && !Directory.Exists(directory)) Directory.CreateDirectory(directory); FileStream stream = new(logfile, FileMode.OpenOrCreate); StreamWriter writer = new(stream); stream.Seek(0, SeekOrigin.End); writer.WriteLine(tosave); writer.Dispose(); stream.Close(); } } } }