/// <summary> /// Analyze client packets. /// </summary> /// <param name="packet">Client packet</param> /// <returns>True if the packet won't be sent to the server</returns> private bool Local_PacketHandler(Packet packet) { // Opcode filter switch (packet.Opcode) { case Opcode.CLIENT_AUTH_REQUEST: if(Bot.Get.LoggedFromBot) return true; break; case Opcode.CLIENT_CHARACTER_SELECTION_JOIN_REQUEST: { InfoManager.SetCharacter(packet.ReadAscii()); } return true; case Opcode.CLIENT_CHARACTER_CONFIRM_SPAWN: if (!ClientlessMode) InfoManager.OnTeleported(); break; case Opcode.CLIENT_CHAT_REQUEST: { // Keep on track all private messages sent Types.Chat t = (Types.Chat)packet.ReadByte(); byte chatIndex = packet.ReadByte(); if (t == Types.Chat.Private) { Window w = Window.Get; w.LogChatMessage(w.Chat_rtbxPrivate, packet.ReadAscii() + "(To)", packet.ReadAscii()); } else if (t == Types.Chat.All) { string message = packet.ReadAscii(); return Bot.Get.OnChatSending(message); } } break; } return false; }
public static void Chat(string user, string message, Types.Chat type = Types.Chat.Regular, bool isLeave = false) { string lvlColor = @"\cf" + (int)Rtf.Colors[(Irc.UserInList(user) ? Irc.Userlist[user] : Types.UserLevel.Viewer).ToString()][0]; string typeColor = @"\cf" + (int)Rtf.Colors[type.ToString()][0]; string appendText; if ((type == Types.Chat.Regular && type == Types.Chat.Status || type == Types.Chat.Subscribe)) { if (!isLeave && !Irc.UserInList(user)) { Irc.AddUserToList(user); } else if (isLeave) { Irc.RemoveUserFromList(user); } } if (Settings.Default.OptionHideBotMsg && string.Equals(user, Settings.Default.OptionName, StringComparison.OrdinalIgnoreCase)) { return; } switch (type) { case Types.Chat.Regular: // Handle commands. string[] wordArray = message.Split('"') .Select((element, index) => index % 2 == 0 // If even index ? element.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) // Split the item : new[] { element }) // Keep the entire item .SelectMany(element => element).ToArray(); if (Irc.UserInList(user) && Regex.IsMatch(wordArray[0], @"^(?=^[!][\d]*[A-Z|a-z])|(?=^[!][A-Z|a-z][\d|A-Z|a-z])")) { string[] paramStrings = new string[wordArray.Length - 1]; for (int i = 1; i < wordArray.Length; i++) { paramStrings[i - 1] = wordArray[i]; } Commands.ExecuteCommand(user, Irc.Userlist[user], wordArray[0].Substring(1), paramStrings); } // Regular chat messages. string userString = "{" + lvlColor + "<" + user + ">} "; Dictionary <string, string> emoteList = Irc != null && Irc.Emotelist != null ? Irc.Emotelist : new Dictionary <string, string>(); message = Rtf.EscapeString(message); appendText = typeColor + userString + (emoteList.Aggregate(message, (current, pair) => Regex.IsMatch(message, "(^| )" + pair.Key + "( |$)") ? Regex.Replace(current, "(^| )" + pair.Key + "( |$)", Rtf.GetEmbedImageString(pair.Value.ToString()) ?? pair.Key.ToString()) : current)); break; case Types.Chat.Status: // "Joined" and "Left" messages. if (Settings.Default.OptionHideStatusMsg) { return; } appendText = typeColor + user + " " + message.Trim(); break; case Types.Chat.Subscribe: // "[USER] just subscribed!" messages. appendText = typeColor + message.Substring(message.IndexOf(":", 1) + 1).Trim(); break; default: // UNKNOWN, report as ERROR event. appendText = null; EventLog("A chat message of an unknown type (type: " + type + ") has been received", Types.Log.Error); break; } // Output to the console (disabled by default due to muchness) // Console.WriteLine(message.Trim()); // Output to the chat RichTextBox MainDialog.UpdateChatTextUI(appendText); }