private void handleComplexObject(JArray decoded) { // only handle "event" types if (decoded[0].ToString() != "event") { return; } // only handle follows from twitch if (decoded[1]["provider"].ToString() != "twitch") { return; } switch (decoded[1]["type"].ToString()) { case "follow": OnFollower?.Invoke(client, Parsing.Follower.handleFollower(decoded[1]["data"])); return; case "cheer": OnCheer?.Invoke(client, Parsing.Cheer.handleCheer(decoded[1]["data"])); return; case "host": OnHost?.Invoke(client, Parsing.Host.handleHost(decoded[1]["data"])); return; case "tip": OnTip?.Invoke(client, Parsing.Tip.handleTip(decoded[1]["data"])); return; case "subscriber": OnSubscriber?.Invoke(client, Parsing.Subscriber.handleSubscriber(decoded[1]["data"])); return; default: OnUnknownComplexObject?.Invoke(client, decoded[1]["type"].ToString()); return; } }
private void onMessage(object sender, MessageEventArgs e) { if (!e.IsText) { return; } JObject json = JObject.Parse(e.Data); if (json.SelectToken("type") != null) { switch (json.SelectToken("type").ToString()) { case "command": OnPing?.Invoke(client, new Events.Client.OnPingArgs { UUID = json.SelectToken("extra").SelectToken("uuid").ToString() }); break; case "follow": OnFollow?.Invoke(client, new Events.Client.OnFollowArgs { Channel = json.SelectToken("channel").ToString(), Date = Internal.Common.DateTimeStringToObject(json.SelectToken("date").ToString()), Message = json.SelectToken("message")?.ToString(), UserMessage = json.SelectToken("user_message")?.ToString(), Extra = new Models.Client.Follow.Extra(json.SelectToken("extra")), Viewer = new Models.Client.Viewer(json.SelectToken("viewer")) }); break; case "subscribe": OnSubscriber?.Invoke(client, new Events.Client.OnSubscriberArgs { Channel = json.SelectToken("channel").ToString(), Date = Internal.Common.DateTimeStringToObject(json.SelectToken("date").ToString()), Message = json.SelectToken("message")?.ToString(), UserMessage = json.SelectToken("user_message")?.ToString(), Extra = new Models.Client.Sub.Extra(json.SelectToken("extra")), Viewer = new Models.Client.Viewer(json.SelectToken("viewer")) }); break; case "points_given": OnBits?.Invoke(client, new Events.Client.OnBitsArgs { Channel = json.SelectToken("channel").ToString(), Date = Internal.Common.DateTimeStringToObject(json.SelectToken("date").ToString()), Message = json.SelectToken("message")?.ToString(), UserMessage = json.SelectToken("user_message")?.ToString(), Extra = new Models.Client.Bits.Extra(json.SelectToken("extra")), Viewer = new Models.Client.Viewer(json.SelectToken("viewer")) }); break; case "session_change": OnSessionChanged?.Invoke(client, new Events.Client.OnSessionChangeArgs { Channel = json.SelectToken("channel").ToString(), Date = Internal.Common.DateTimeStringToObject(json.SelectToken("date").ToString()), Message = json.SelectToken("message")?.ToString(), UserMessage = json.SelectToken("user_message")?.ToString(), Extra = new Models.Client.SessionChange.Extra(json.SelectToken("extra")) }); break; case "hosted": OnHosted?.Invoke(client, new Events.Client.OnHostedArgs { Channel = json.SelectToken("channel").ToString(), Date = Internal.Common.DateTimeStringToObject(json.SelectToken("date").ToString()), Message = json.SelectToken("message")?.ToString(), UserMessage = json.SelectToken("user_message")?.ToString(), Extra = new Models.Client.Hosted.Extra(json.SelectToken("extra")), Viewer = new Models.Client.Viewer(json.SelectToken("viewer")) }); break; case "donate": OnDonation?.Invoke(client, new Events.Client.OnDonationArgs { Channel = json.SelectToken("channel").ToString(), Date = Internal.Common.DateTimeStringToObject(json.SelectToken("date").ToString()), Message = json.SelectToken("message")?.ToString(), UserMessage = json.SelectToken("user_message")?.ToString(), Extra = new Models.Client.Donation.Extra(json.SelectToken("extra")), Viewer = new Models.Client.Viewer(json.SelectToken("viewer")) }); break; } } }
private void OnReadLine(object sender, ReadLineEventArgs e) { if (_logging) { Console.WriteLine(e.Line); } if (e.Line.Split(':').Length > 2) { if (e.Line.Split(':')[2] == "You are in a maze of twisty passages, all alike.") { _connected = true; OnConnected?.Invoke(null, new OnConnectedArgs { Channel = _channel, Username = TwitchUsername }); } } if (e.Line.Contains($"#{_channel}")) { var splitter = Regex.Split(e.Line, $" #{_channel}"); var readType = splitter[0].Split(' ')[splitter[0].Split(' ').Length - 1]; switch (readType) { case "PRIVMSG": if (e.Line.Split('!')[0] == ":twitchnotify" && (e.Line.Contains("just subscribed!") || e.Line.Contains("subscribed for"))) { var subscriber = new Subscriber(e.Line); OnSubscriber?.Invoke(null, new OnSubscriberArgs { Subscriber = subscriber, Channel = _channel }); } else { var chatMessage = new ChatMessage(e.Line); _previousMessage = chatMessage; OnMessageReceived?.Invoke(null, new OnMessageReceivedArgs { ChatMessage = chatMessage }); if (_commandIdentifier != '\0' && chatMessage.Message[0] == _commandIdentifier) { string command; var argumentsAsString = ""; var argumentsAsList = new List <string>(); if (chatMessage.Message.Contains(" ")) { command = chatMessage.Message.Split(' ')[0].Substring(1, chatMessage.Message.Split(' ')[0].Length - 1); argumentsAsList.AddRange( chatMessage.Message.Split(' ').Where(arg => arg != _commandIdentifier + command)); argumentsAsString = chatMessage.Message.Replace(chatMessage.Message.Split(' ')[0] + " ", ""); } else { command = chatMessage.Message.Substring(1, chatMessage.Message.Length - 1); } OnCommandReceived?.Invoke(null, new OnCommandReceivedArgs { Command = command, ChatMessage = chatMessage, Channel = _channel, ArgumentsAsList = argumentsAsList, ArgumentsAsString = argumentsAsString }); } } break; case "JOIN": //:the_kraken_bot!the_kraken_bot@the_kraken_bot.tmi.twitch.tv JOIN #swiftyspiffy OnViewerJoined?.Invoke(null, new OnViewerJoinedArgs { Username = e.Line.Split('!')[1].Split('@')[0], Channel = _channel }); break; case "MODE": //:jtv MODE #swiftyspiffy +o swiftyspiffy if (e.Line.Split(' ').Length == 4) { OnModeratorJoined?.Invoke(null, new OnModeratorJoinedArgs { Username = e.Line.Split(' ')[4], Channel = _channel }); } else { if (_logging) { Console.WriteLine("FAILED PARSE: " + e.Line); } } break; case "NOTICE": if (e.Line.Contains("Error logging in")) { _client.Disconnect(); OnIncorrectLogin?.Invoke(null, new OnIncorrectLoginArgs { Exception = new ErrorLoggingInException(e.Line, _credentials.TwitchUsername) }); } if (e.Line.Contains("has gone offline")) { OnHostLeft?.Invoke(null, null); } break; case "ROOMSTATE": _state = new ChannelState(e.Line); OnChannelStateChanged?.Invoke(null, new OnChannelStateChangedArgs { ChannelState = _state }); break; case "USERSTATE": //@color=#8A2BE2;display-name=The_Kraken_Bot;emote-sets=0,5628;subscriber=0;turbo=0;user-type=mod :tmi.twitch.tv USERSTATE #swiftyspiffy var userState = new UserState(e.Line); OnUserStateChanged?.Invoke(null, new OnUserStateChangedArgs { UserState = userState }); break; default: if (_logging) { Console.WriteLine("Unaccounted for: {0}", e.Line); } break; } } else { //Special cases if (e.Line == ":tmi.twitch.tv NOTICE * :Error logging in") { _client.Disconnect(); OnIncorrectLogin?.Invoke(null, new OnIncorrectLoginArgs { Exception = new ErrorLoggingInException(e.Line, _credentials.TwitchUsername) }); } else { if (_logging) { Console.WriteLine("Not registered: " + e.Line); } } } }