/// <summary> /// Updates the game being played on the Twitch channel /// </summary> /// <param name="chatter"></param> /// <param name="hasTwitterInfo">Check for Twitter credentials</param> public async Task CmdUpdateGame(TwitchChatter chatter, bool hasTwitterInfo) { try { // Get game from command parameter string game = chatter.Message.Substring(chatter.Message.IndexOf(" ") + 1); // Send HTTP method PUT to base URI in order to change the game RestClient client = new RestClient("https://api.twitch.tv/kraken/channels/" + _broadcasterInstance.TwitchId); RestRequest request = new RestRequest(Method.PUT); request.AddHeader("Cache-Control", "no-cache"); request.AddHeader("Content-Type", "application/json"); request.AddHeader("Authorization", "OAuth " + _botConfig.TwitchAccessToken); request.AddHeader("Accept", "application/vnd.twitchtv.v5+json"); request.AddHeader("Client-ID", _botConfig.TwitchClientId); request.AddParameter("application/json", "{\"channel\":{\"game\":\"" + game + "\"}}", ParameterType.RequestBody); IRestResponse response = null; try { response = await client.ExecuteAsync <Task>(request); string statResponse = response.StatusCode.ToString(); if (statResponse.Contains("OK")) { _irc.SendPublicChatMessage($"Twitch channel game status updated to \"{game}\""); await ChatReminder.RefreshReminders(); await _customCommandInstance.LoadCustomCommands(_botConfig.TwitchBotApiLink, _broadcasterInstance.DatabaseId); } else { Console.WriteLine(response.Content); } } catch (WebException ex) { if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.BadRequest) { Console.WriteLine("Error 400 detected!!"); } response = (IRestResponse)ex.Response; Console.WriteLine("Error: " + response); } } catch (Exception ex) { await _errHndlrInstance.LogError(ex, "CmdMod", "CmdUpdateGame(TwitchChatter, bool)", false, "!updategame"); } }
public async Task RunAsync() { try { // ToDo: Check version number of application } catch (Exception ex) { Console.WriteLine($"Error Message: {ex.Message}"); Console.WriteLine(); Console.WriteLine("Cannot connect to database to verify the correct version of myself"); Console.WriteLine("Local troubleshooting needed by author of this bot"); Console.WriteLine(); Console.WriteLine("Shutting down now..."); Thread.Sleep(5000); Environment.Exit(1); } try { // Configure error handler singleton class ErrorHandler.Configure(_broadcasterInstance.DatabaseId, _irc, _botConfig); // Get broadcaster ID so the user can only see their data from the db await SetBroadcasterIdsAsync(); if (_broadcasterInstance.DatabaseId == 0 || string.IsNullOrEmpty(_broadcasterInstance.TwitchId)) { Console.WriteLine("Cannot find a broadcaster ID for you. " + "Please contact the author with a detailed description of the issue"); Console.WriteLine(); Console.WriteLine("Shutting down now..."); Thread.Sleep(5000); Environment.Exit(1); } // Configure error handler singleton class ErrorHandler.Configure(_broadcasterInstance.DatabaseId, _irc, _botConfig); /* Connect to local Spotify client */ _spotify = new SpotifyWebClient(_botConfig); await _spotify.ConnectAsync(); /* Load command classes */ _commandSystem = new CommandSystem(_irc, _botConfig, _appConfig, _bank, _songRequestBlacklist, _libVLCSharpPlayer, _songRequestSetting, _spotify, _twitchInfo, _follower, _gameDirectory, _ign, _manualSongRequest, _quote, _partyUp); /* Whisper broadcaster bot settings */ Console.WriteLine(); Console.WriteLine("---> Extra Bot Settings <---"); Console.WriteLine($"Currency type: {_botConfig.CurrencyType}"); Console.WriteLine($"Enable Auto Tweets: {_botConfig.EnableTweets}"); Console.WriteLine($"Enable Auto Display Songs: {_botConfig.EnableDisplaySong}"); Console.WriteLine($"Stream latency: {_botConfig.StreamLatency} second(s)"); Console.WriteLine($"Regular follower hours: {_botConfig.RegularFollowerHours}"); Console.WriteLine(); /* Configure YouTube song request from user's YT account (request permission if needed) */ await GetYouTubeAuthAsync(); /* Start listening for delayed messages */ DelayMessage delayMsg = new DelayMessage(_irc); delayMsg.Start(); /* Grab list of chatters from channel */ _twitchChatterListener.Start(); /* Get the status of the Twitch stream */ _twitchStreamStatus = new TwitchStreamStatus(_irc, _twitchInfo, _botConfig.Broadcaster); await _twitchStreamStatus.LoadChannelInfoAsync(); _twitchStreamStatus.Start(); /* Pull list of followers and check experience points for stream leveling */ _followerSubscriberListener.Start(_irc, _broadcasterInstance.DatabaseId); /* Load/create settings and start the queue for the heist */ await _bankHeistInstance.LoadSettings(_broadcasterInstance.DatabaseId, _botConfig.TwitchBotApiLink); _bankHeist.Start(_irc, _broadcasterInstance.DatabaseId); if (string.IsNullOrEmpty(TwitchStreamStatus.CurrentCategory)) { _irc.SendPublicChatMessage("WARNING: I cannot see the name of the game. It's currently set to either NULL or EMPTY. " + "Please have the chat verify that the game has been set for this stream. " + $"If the error persists, please have @{_botConfig.Broadcaster.ToLower()} retype the game in their Twitch Live Dashboard. " + "If this error shows up again and your chat can see the game set for the stream, please contact my master with !support in this chat"); } // Grab game id in order to find party member TwitchGameCategory game = await _gameDirectory.GetGameIdAsync(TwitchStreamStatus.CurrentCategory); /* Load/create settings and start the queue for the boss fight */ await _bossFightInstance.LoadSettings(_broadcasterInstance.DatabaseId, game?.Id, _botConfig.TwitchBotApiLink); _bossFight.Start(_irc, _broadcasterInstance.DatabaseId); /* Ping to twitch server to prevent auto-disconnect */ PingSender ping = new PingSender(_irc); ping.Start(); /* Send reminders of certain events */ ChatReminder chatReminder = new ChatReminder(_irc, _broadcasterInstance.DatabaseId, _botConfig.TwitchBotApiLink, _twitchInfo, _gameDirectory); chatReminder.Start(); /* Load in Twitch users that have bot moderation privileges (separate from channel moderators) */ await _botModeratorInstance.LoadExistingModerators(_botConfig.TwitchBotApiLink, _broadcasterInstance.DatabaseId); /* Load in custom commands */ await _customCommandInstance.LoadCustomCommands(_botConfig.TwitchBotApiLink, _broadcasterInstance.DatabaseId); /* Authenticate to Twitter if possible */ GetTwitterAuth(); Console.WriteLine("===== Time to get to work! ====="); Console.WriteLine(); /* Finished setup, time to start */ await GetChatBoxAsync(); } catch (Exception ex) { await _errHndlrInstance.LogError(ex, "TwitchBotApplication", "RunAsync()", true); } }
/// <summary> /// Updates the game being played on the Twitch channel /// </summary> /// <param name="chatter"></param> private async Task <DateTime> UpdateGameAsync(TwitchChatter chatter) { try { // Get game from command parameter string gameTitle = chatter.Message.Substring(chatter.Message.IndexOf(" ") + 1); // Send HTTP method PUT to base URI in order to change the game RestClient client = new RestClient("https://api.twitch.tv/kraken/channels/" + _broadcasterInstance.TwitchId); RestRequest request = new RestRequest(Method.PUT); request.AddHeader("Cache-Control", "no-cache"); request.AddHeader("Content-Type", "application/json"); request.AddHeader("Authorization", "OAuth " + _botConfig.TwitchAccessToken); request.AddHeader("Accept", "application/vnd.twitchtv.v5+json"); request.AddHeader("Client-ID", _botConfig.TwitchClientId); request.AddParameter("application/json", "{\"channel\":{\"game\":\"" + gameTitle + "\"}}", ParameterType.RequestBody); IRestResponse response = null; try { response = await client.ExecuteAsync <Task>(request); string statResponse = response.StatusCode.ToString(); if (statResponse.Contains("OK")) { _irc.SendPublicChatMessage($"Twitch channel game status updated to \"{gameTitle}\""); await ChatReminder.RefreshRemindersAsync(); await _customCommandInstance.LoadCustomCommands(_botConfig.TwitchBotApiLink, _broadcasterInstance.DatabaseId); _irc.SendPublicChatMessage($"Your commands have been refreshed @{chatter.DisplayName}"); // Grab game id in order to find party member TwitchGameCategory game = await _gameDirectory.GetGameIdAsync(gameTitle); // During refresh, make sure no fighters can join _bossFightSettingsInstance.RefreshBossFight = true; await _bossFightSettingsInstance.LoadSettings(_broadcasterInstance.DatabaseId, game?.Id, _botConfig.TwitchBotApiLink); _bossFightSettingsInstance.RefreshBossFight = false; } else { Console.WriteLine(response.Content); } } catch (WebException ex) { if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.BadRequest) { Console.WriteLine("Error 400 detected!!"); } response = (IRestResponse)ex.Response; Console.WriteLine("Error: " + response); } } catch (Exception ex) { await _errHndlrInstance.LogError(ex, "TwitchChannelFeature", "UpdateGame(TwitchChatter)", false, "!updategame"); } return(DateTime.Now); }