void OnPrivMsg(TwitchIRCMessage message) { //if (activeChatWindow != null && !message.Message.StartsWith("!") && message.User != ToolkitSettings.Username) //{ // if ((_voteActive && !int.TryParse(message.Message[0].ToString(), out int result)) || !_voteActive) // { // activeChatWindow.AddMessage( // message.Message, // message.User, // (message.Parameters.ContainsKey("color")) ? message.Parameters["color"].Remove(0, 1) : Viewer.GetViewerColorCode(message.User) // ); // } //} message.Viewer = TwitchViewer.GetTwitchViewer(message.User); if (message.Viewer == null) { Helper.Log(message.User.CapitalizeFirst() + " tried to run a command but is not registed."); return; } if (Helper.ModActive) { CommandsHandler.CheckCommand(message); } if (VoteHandler.voteActive && int.TryParse(message.Message[0].ToString(), out int voteKey)) { VoteHandler.currentVote.RecordVote(Viewers.GetViewer(message.User).id, voteKey - 1); } }
public abstract void ParseCommand(TwitchIRCMessage msg);
public void Parse(byte[] buffer, int length, OnMessage callback) { Decoder decoder = Helper.LanguageEncoding().GetDecoder(); char[] chars; int charCount = decoder.GetCharCount(buffer, 0, buffer.Length); chars = new Char[charCount]; int charLength = decoder.GetChars(buffer, 0, buffer.Length, chars, 0, true); _state = IRCParserState.Start; for (int i = 0; i < length; i++) { if (i > 8024) { continue; } var b = chars[i]; switch (_state) { case IRCParserState.Start: //Helper.Log($"{_state} starts at {i} {b}"); string msg = ""; foreach (char c in chars) { msg += c; } _message = new TwitchIRCMessage(); _key = ""; _value = ""; switch (b) { case 'P': _state = IRCParserState.P; break; case '@': _state = IRCParserState.Key; break; case ':': _state = IRCParserState.Host; break; default: _state = IRCParserState.Unknown; break; } break; case IRCParserState.P: if (b == 'I') { _state = IRCParserState.Pi; } else if (b == 'O') { _state = IRCParserState.Po; } else { _state = IRCParserState.Unknown; } break; case IRCParserState.Pi: if (b == 'N') { _state = IRCParserState.Pin; } else { _state = IRCParserState.Unknown; } break; case IRCParserState.Pin: if (b == 'G') { _state = IRCParserState.Ping; } else { _state = IRCParserState.Unknown; } break; case IRCParserState.Ping: if (b == '\n') { _message.Cmd = "PING"; callback(_message); _state = IRCParserState.Start; } break; case IRCParserState.Po: if (b == 'N') { _state = IRCParserState.Pon; } else { _state = IRCParserState.Unknown; } break; case IRCParserState.Pon: if (b == 'G') { _state = IRCParserState.Pong; } else { _state = IRCParserState.Unknown; } break; case IRCParserState.Pong: if (b == '\n') { _message.Cmd = "PONG"; callback(_message); _state = IRCParserState.Start; } break; case IRCParserState.Host: if (b == ' ') { _state = IRCParserState.Cmd; } else if (b == '@') { _state = IRCParserState.User; } else if (b != '\r') { _message.Host += b; } break; case IRCParserState.User: if (b == '.') { _state = IRCParserState.Host; } else { _message.User += b; } break; case IRCParserState.Cmd: if (b == '\n') { callback(_message); _state = IRCParserState.Start; } else if (b == ' ') { _state = IRCParserState.Args; } else if (b != '\r') { _message.Cmd += b; } break; case IRCParserState.Args: if (b == '\n') { if (Array.IndexOf(new string[] { "PRIVMSG", "WHISPER", "USERSTATE", "USERNOTICE", "NOTICE" }, _message.Cmd) != -1) { int state = 0; for (int j = 0; j < _message.Args.Length; j++) { switch (state) { case 0: if (_message.Args[j] == ' ') { state = 1; } else { _message.Channel += _message.Args[j]; } break; case 1: if (_message.Args[j] == ':') { state = 2; } break; default: _message.Message += _message.Args[j]; break; } } } callback(_message); _state = IRCParserState.Start; } else if (b != '\r') { _message.Args += b; } break; case IRCParserState.Unknown: if (b == '\n') { _state = IRCParserState.Start; } break; case IRCParserState.Key: if (b == '=') { _state = IRCParserState.Value; } else if (b == ' ') { _state = IRCParserState.Host; } else { _key += b; } break; case IRCParserState.Value: if (b == ';' || b == ' ') { _message.Parameters.Add(_key, _value); _key = ""; _value = ""; } if (b == ';') { _state = IRCParserState.Key; } else if (b == ' ') { _state = IRCParserState.Host; } else { _value += b; } break; default: _state = IRCParserState.Start; break; } } }
void OnCommand(TwitchIRCMessage message) { Ticker.LastIRCPong = DateTime.Now.ToFileTime(); _ircMessages.Put(message.Cmd + " " + message.Args); switch (message.Cmd) { case "USERSTATE": if (message.Parameters.ContainsKey("mod") && message.Parameters["mod"] == "1") { _messageInterval = 1; } else { _messageInterval = 2; } break; case "PING": Send("PONG\n"); break; case "376": if (ToolkitSettings.UseSeparateChatRoom && ToolkitSettings.ChatroomUUID != "" && ToolkitSettings.ChannelID != "") { Send( "CAP REQ :twitch.tv/membership\n" + "CAP REQ :twitch.tv/tags\n" + "CAP REQ :twitch.tv/commands\n" + "JOIN #" + _channel + "\n" + "JOIN #chatrooms:" + ToolkitSettings.ChannelID + ":" + ToolkitSettings.ChatroomUUID + "\n" ); } else { Send( "CAP REQ :twitch.tv/membership\n" + "CAP REQ :twitch.tv/tags\n" + "CAP REQ :twitch.tv/commands\n" + "JOIN #" + _channel + "\n" ); } _socketReady = true; break; case "PRIVMSG": if (OnPrivMsg != null && !ToolkitSettings.WhisperCmdsOnly) { OnPrivMsg.Invoke(message); } break; case "WHISPER": if (OnPrivMsg != null && ToolkitSettings.WhisperCmdsAllowed) { message.Whisper = true; OnPrivMsg.Invoke(message); } break; case "PONG": break; default: if (OnUnkwnMsg != null) { OnUnkwnMsg.Invoke(message); } break; } }
public override void ParseCommand(TwitchIRCMessage msg) { foreach (KeyValuePair <string, string> pair in msg.Parameters) { //Helper.Log(pair.Key + " : " + pair.Value); switch (pair.Key) { case "color": if (pair.Value == null) { break; } string colorCode = ""; if (pair.Value.Length > 6) { colorCode = pair.Value.Remove(0, 1); ToolkitSettings.ViewerColorCodes[msg.User.ToLower()] = colorCode; } else { break; } GameComponentPawns component = Current.Game.GetComponent <GameComponentPawns>(); if (component.HasUserBeenNamed(msg.User)) { Pawn pawn = component.PawnAssignedToUser(msg.User); pawn.story.hairColor = GetColorFromHex(colorCode); } break; case "mod": if (msg.Viewer.Mod || pair.Value == null) { break; } bool modValue = int.TryParse(pair.Value, out int modStatus); if (!msg.Viewer.Mod && modValue && modStatus == 1) { msg.Viewer.ToggleMod(); } break; case "subscriber": if (pair.Value == null) { break; } bool subValue = int.TryParse(pair.Value, out int subStatus); if (subValue && subStatus == 1) { msg.Viewer.Subscriber = true; } else { msg.Viewer.Subscriber = false; } break; case "badges": if (pair.Value == null) { break; } IEnumerable <string> badges = pair.Value.Split(','); foreach (string badge in badges) { if (badge == "vip/1") { msg.Viewer.VIP = true; break; } } msg.Viewer.VIP = false; break; } } Store_Logger.LogString("Parsed command parameters"); }