//Example IRC message: @badges=moderator/1,warcraft/alliance;color=;display-name=Swiftyspiffyv4;emotes=;mod=1;room-id=40876073;subscriber=0;turbo=0;user-id=103325214;user-type=mod :[email protected] PRIVMSG #swiftyspiffy :asd /// <summary>Constructor for ChatMessage object.</summary> public ChatMessage(string ircString) { _rawIrcMessage = ircString; foreach (var part in ircString.Split(';')) { if (part.Contains("!")) { if (_channel == null) { _channel = part.Split('#')[1].Split(' ')[0]; } if (_username == null) { _username = part.Split('!')[1].Split('@')[0]; } } else if (part.Contains("@badges=")) { string badges = part.Split('=')[1]; if (badges.Contains('/')) { if (!badges.Contains(",")) { _badges.Add(new KeyValuePair <string, string>(badges.Split('/')[0], badges.Split('/')[1])); } else { foreach (string badge in badges.Split(',')) { _badges.Add(new KeyValuePair <string, string>(badge.Split('/')[0], badge.Split('/')[1])); } } } } else if (part.Contains("color=")) { if (_colorHex == null) { _colorHex = part.Split('=')[1]; } } else if (part.Contains("display-name")) { if (_displayName == null) { _displayName = part.Split('=')[1]; } } else if (part.Contains("emotes=")) { if (_emoteSet == null) { _emoteSet = part.Split('=')[1]; } } else if (part.Contains("subscriber=")) { _subscriber = part.Split('=')[1] == "1"; } else if (part.Contains("turbo=")) { _turbo = part.Split('=')[1] == "1"; } else if (part.Contains("user-id=")) { _userId = int.Parse(part.Split('=')[1]); } else if (part.Contains("user-type=")) { switch (part.Split('=')[1].Split(' ')[0]) { case "mod": _userType = Common.UType.Moderator; break; case "global_mod": _userType = Common.UType.GlobalModerator; break; case "admin": _userType = Common.UType.Admin; break; case "staff": _userType = Common.UType.Staff; break; default: _userType = Common.UType.Viewer; break; } } else if (part.Contains("mod=")) { _modFlag = part.Split('=')[1] == "1"; } } _message = ircString.Split(new[] { $" PRIVMSG #{_channel} :" }, StringSplitOptions.None)[1]; if ((byte)_message[0] == 1 && (byte)_message[_message.Length - 1] == 1) { //Actions (/me {action}) are wrapped by byte=1 and prepended with "ACTION " //This setup clears all of that leaving just the action's text. //If you want to clear just the nonstandard bytes, use: //_message = _message.Substring(1, text.Length-2); _message = _message.Substring(8, _message.Length - 9); _meFlag = true; } }
// @badges=subscriber/1,turbo/1;color=#2B119C;display-name=JustFunkIt;emotes=;login=justfunkit;mod=0;msg-id=resub;msg-param-months=2;room-id=44338537;subscriber=1;system-msg=JustFunkIt\ssubscribed\sfor\s2\smonths\sin\sa\srow!;turbo=1;user-id=26526370;user-type= :tmi.twitch.tv USERNOTICE #burkeblack :AVAST YEE SCURVY DOG public ReSubscriber(string ircString) { _rawIrc = ircString; foreach (string section in ircString.Split(';')) { if (section.Contains("=")) { string key = section.Split('=')[0]; string value = section.Split('=')[1]; switch (key) { case "@badges": foreach (string badgeValue in value.Split(',')) { _badges.Add(new KeyValuePair <string, string>(badgeValue.Split('/')[0], badgeValue.Split('/')[1])); } break; case "color": _colorHex = value; break; case "display-name": _displayName = value; break; case "emotes": _emoteSet = value; break; case "login": _login = value; break; case "mod": _mod = value == "1"; break; case "msg-param-months": _months = int.Parse(value); break; case "room-id": _roomId = int.Parse(value); break; case "subscriber": _sub = value == "1"; break; case "system-msg": _systemMessage = value; break; case "turbo": _turbo = value == "1"; break; case "user-id": _userId = int.Parse(value); break; } } } // Parse user-type if (ircString.Contains("=") && ircString.Contains(" ")) { switch (ircString.Split(' ')[0].Split(';')[13].Split('=')[1]) { case "mod": _userType = Common.UType.Moderator; break; case "global_mod": _userType = Common.UType.GlobalModerator; break; case "admin": _userType = Common.UType.Admin; break; case "staff": _userType = Common.UType.Staff; break; default: _userType = Common.UType.Viewer; break; } } // Parse channel if (ircString.Contains("#") && ircString.Split('#').Count() > 2) { if (ircString.Split('#')[2].Contains(" ")) { _channel = ircString.Split('#')[2].Split(' ')[0]; } else { _channel = ircString.Split('#')[2]; } } // Parse sub message if (ircString.Contains($"{ircString.Split(':')[0]}:{ircString.Split(':')[1]}:")) { _resubMessage = ircString.Replace($"{ircString.Split(':')[0]}:{ircString.Split(':')[1]}:", String.Empty); } }