/// <summary> /// Constructor for UserState. /// </summary> /// <param name="ircString"></param> public UserState(string ircString) { foreach (string part in ircString.Split(';')) { // The 'user-type' section does not have a ; suffix, we will account for this outside of for loop, we should exit loop immediately if (part.Contains(" :tmi.twitch.tv USERSTATE ")) { break; } if (!part.Contains("=")) { // This should never happen, unless Twitch changes their shit. Console.WriteLine($"Unaccounted for [UserState]: {part}"); continue; } switch (part.Split('=')[0]) { case "@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])); } } } break; case "color": ColorHex = part.Split('=')[1]; break; case "display-name": DisplayName = part.Split('=')[1]; break; case "emote-sets": EmoteSet = part.Split('=')[1]; break; case "mod": Moderator = part.Split('=')[1] == "1"; break; case "subscriber": Subscriber = part.Split('=')[1] == "1"; break; default: // This should never happen, unless Twitch changes their shit Console.WriteLine($"Unaccounted for [UserState]: {part.Split('=')[0]}"); break; } } // Lets deal with that user-type switch (ircString.Split('=')[6].Split(' ')[0]) { case "mod": UserType = Common.UserType.Moderator; break; case "global_mod": UserType = Common.UserType.GlobalModerator; break; case "admin": UserType = Common.UserType.Admin; break; case "staff": UserType = Common.UserType.Staff; break; default: UserType = Common.UserType.Viewer; break; } Channel = ircString.Split(' ')[3].Replace("#", ""); if (DisplayName.ToLower() == Channel.ToLower()) { UserType = Common.UserType.Broadcaster; } }