/// <summary> /// Greet a user (new or returning) with a welcome message and a "thank-you" deposit of stream currency /// </summary> ///<param name="chatter"></param> private async Task GreetUserAsync(TwitchChatter chatter) { try { if (!_greetedUsers.Any(u => u == chatter.Username) && chatter.Username != _botConfig.Broadcaster.ToLower() && chatter.Message.Length > 1 && TwitchStreamStatus.IsLive) { // check if user has a stream currency account int funds = await _bank.CheckBalanceAsync(chatter.Username, _broadcasterInstance.DatabaseId); int greetedDeposit = 500; // ToDo: Make greeted deposit config setting if (funds > -1 || chatter.Badges.Contains("moderator") || chatter.Badges.Contains("vip") || chatter.Badges.Contains("bits")) { int currentExp = await _follower.CurrentExpAsync(chatter.Username, _broadcasterInstance.DatabaseId); IEnumerable <Rank> rankList = await _follower.GetRankListAsync(_broadcasterInstance.DatabaseId); Rank rank = _follower.GetCurrentRank(rankList, currentExp); string rankName = ""; if (rank != null) { rankName = rank.Name; } funds += greetedDeposit; // deposit stream currency await _bank.UpdateFundsAsync(chatter.Username, _broadcasterInstance.DatabaseId, funds); _irc.SendPublicChatMessage($"Welcome back {rankName} @{chatter.DisplayName} ! " + $"Let me reward your return with {greetedDeposit} {_botConfig.CurrencyType}"); } else { await _bank.CreateAccountAsync(chatter.Username, _broadcasterInstance.DatabaseId, greetedDeposit); _irc.SendPublicChatMessage($"Welcome to the channel @{chatter.DisplayName} ! Thanks for saying something! " + $"Let me show you my appreciation with {greetedDeposit} {_botConfig.CurrencyType}"); } _greetedUsers.Add(chatter.Username); // make sure user doesn't get greeted again as long as this bot is alive } } catch (Exception ex) { await _errHndlrInstance.LogError(ex, "TwitchBotApplication", "GreetUser(TwitchChatter)", false); } }
/// <summary> /// Display the follower's stream rank /// </summary> /// <param name="chatter">User that sent the message</param> /// <returns></returns> private async Task <DateTime> ViewRankAsync(TwitchChatter chatter) { try { if (chatter.Username == _botConfig.Broadcaster.ToLower()) { _irc.SendPublicChatMessage($"Here goes {_botConfig.Broadcaster.ToLower()} flexing his rank...oh wait OpieOP"); return(DateTime.Now); } DateTime?createdAt = _twitchChatterListInstance.TwitchFollowers.FirstOrDefault(c => c.Username == chatter.Username)?.CreatedAt ?? null; if (createdAt == null) { using (HttpResponseMessage message = await _twitchInfo.CheckFollowerStatusAsync(chatter.TwitchId)) { string body = await message.Content.ReadAsStringAsync(); FollowerJSON response = JsonConvert.DeserializeObject <FollowerJSON>(body); if (!string.IsNullOrEmpty(response.CreatedAt)) { createdAt = Convert.ToDateTime(response.CreatedAt); } } } if (createdAt != null) { int currExp = await _follower.CurrentExpAsync(chatter.Username, _broadcasterInstance.DatabaseId); // Grab the follower's associated rank if (currExp > -1) { IEnumerable <Rank> rankList = await _follower.GetRankListAsync(_broadcasterInstance.DatabaseId); Rank currFollowerRank = _follower.GetCurrentRank(rankList, currExp); decimal hoursWatched = _follower.GetHoursWatched(currExp); _irc.SendPublicChatMessage($"@{chatter.DisplayName}: \"{currFollowerRank.Name}\" " + $"{currExp}/{currFollowerRank.ExpCap} EXP ({hoursWatched} hours watched)"); } else { await _follower.EnlistRecruitAsync(chatter.Username, _broadcasterInstance.DatabaseId); _irc.SendPublicChatMessage($"Welcome to the army @{chatter.DisplayName}. View your new rank using !rank"); } } else { _irc.SendPublicChatMessage($"{chatter.DisplayName} is not following {_botConfig.Broadcaster.ToLower()}"); } } catch (Exception ex) { await _errHndlrInstance.LogError(ex, "FollowerFeature", "ViewRank(TwitchChatter)", false, "!rank"); } return(DateTime.Now); }
private async Task CheckFollowerAsync(string chatter, string userTwitchId) { try { TwitchChatter follower = await GetTwitchFollowerInfoAsync(chatter, userTwitchId); if (follower == null) { return; } /* Manage follower experience */ int currentExp = await _follower.CurrentExpAsync(chatter, _broadcasterId); if (TwitchStreamStatus.IsLive) { if (currentExp > -1) { await _follower.UpdateExpAsync(chatter, _broadcasterId, ++currentExp); } else { // add new user to the ranks await _follower.EnlistRecruitAsync(chatter, _broadcasterId); } } // check if follower has a stream currency account int setIncrementFunds = 10; // default to normal follower amount if (_follower.IsRegularFollower(currentExp, _botConfig.RegularFollowerHours)) { setIncrementFunds = 15; if (!_twitchChatterListInstance.TwitchRegularFollowers.Any(c => c.Username == chatter)) { _twitchChatterListInstance.TwitchRegularFollowers.Add(follower); } } /* Manage follower streaming currency */ if (TwitchStreamStatus.IsLive) { int funds = await _bank.CheckBalanceAsync(chatter, _broadcasterId); if (funds > -1) { funds += setIncrementFunds; await _bank.UpdateFundsAsync(chatter, _broadcasterId, funds); } else // ToDo: Make currency auto-increment setting { await _bank.CreateAccountAsync(chatter, _broadcasterId, setIncrementFunds); } } } catch (Exception ex) { Console.WriteLine($"Error inside FollowerSubscriberListener.CheckFollower(string, string): {ex.Message}"); if (ex.InnerException != null) { Console.WriteLine($"Inner Exception: {ex.InnerException.Message}"); } } }
/// <summary> /// Engage in the boss fight minigame /// </summary> /// <param name="chatter">User that sent the message</param> public async Task <DateTime> BossFight(TwitchChatter chatter) { try { BossFight bossFight = new BossFight(); int funds = await _bank.CheckBalanceAsync(chatter.Username, _broadcasterInstance.DatabaseId); if (_bossSettingsInstance.IsBossFightOnCooldown()) { TimeSpan cooldown = _bossSettingsInstance.CooldownTimePeriod.Subtract(DateTime.Now); if (cooldown.Minutes >= 1) { _irc.SendPublicChatMessage(_bossSettingsInstance.CooldownEntry .Replace("@timeleft@", cooldown.Minutes.ToString())); } else { _irc.SendPublicChatMessage(_bossSettingsInstance.CooldownEntry .Replace("@timeleft@", cooldown.Seconds.ToString()) .Replace("minutes", "seconds")); } return(DateTime.Now); } if (_bossSettingsInstance.RefreshBossFight) { _irc.SendPublicChatMessage($"The boss fight is currently being refreshed with new settings @{chatter.DisplayName}"); return(DateTime.Now); } if (bossFight.HasFighterAlreadyEntered(chatter.Username)) { _irc.SendPublicChatMessage($"You are already in this fight @{chatter.DisplayName}"); return(DateTime.Now); } if (funds < _bossSettingsInstance.Cost) { _irc.SendPublicChatMessage($"You do need {_bossSettingsInstance.Cost} {_botConfig.CurrencyType} to enter this fight @{chatter.DisplayName}"); return(DateTime.Now); } if (!bossFight.IsEntryPeriodOver()) { ChatterType chatterType = ChatterType.DoesNotExist; // join boss fight if (chatter.Badges.Contains("moderator") || chatter.Badges.Contains("admin") || chatter.Badges.Contains("global_mod") || chatter.Badges.Contains("staff") || chatter.Username == _botConfig.Broadcaster.ToLower()) { chatterType = ChatterType.Moderator; } else if (chatter.Badges.Contains("subscriber") || chatter.Badges.Contains("vip")) { chatterType = ChatterType.Subscriber; } // ToDo: Create new columns in the BossFightClassStats table for VIP stats //else if (chatter.Badges.Contains("vip")) //{ // chatterType = ChatterType.VIP; //} else { chatterType = _twitchChatterListInstance.GetUserChatterType(chatter.Username); if (chatterType == ChatterType.DoesNotExist) { using (HttpResponseMessage message = await _twitchInfo.CheckFollowerStatusAsync(chatter.TwitchId)) { // check if chatter is a follower if (!message.IsSuccessStatusCode) { int currentExp = await _follower.CurrentExpAsync(chatter.Username, _broadcasterInstance.DatabaseId); if (_follower.IsRegularFollower(currentExp, _botConfig.RegularFollowerHours)) { chatterType = ChatterType.RegularFollower; } else { chatterType = ChatterType.Follower; } } else { chatterType = ChatterType.Viewer; } } } } // make boss fight announcement if first fighter and start recruiting members if (_bossSettingsInstance.Fighters.Count == 0) { _bossSettingsInstance.EntryPeriod = DateTime.Now.AddSeconds(_bossSettingsInstance.EntryPeriodSeconds); _irc.SendPublicChatMessage(_bossSettingsInstance.EntryMessage.Replace("user@", chatter.Username)); } FighterClass fighterClass = _bossSettingsInstance.ClassStats.Single(c => c.ChatterType == chatterType); BossFighter fighter = new BossFighter { Username = chatter.Username, FighterClass = fighterClass }; bossFight.Produce(fighter); await _bank.UpdateFundsAsync(chatter.Username, _broadcasterInstance.DatabaseId, funds - _bossSettingsInstance.Cost); // display new boss level if (!string.IsNullOrEmpty(bossFight.NextLevelMessage())) { _irc.SendPublicChatMessage(bossFight.NextLevelMessage()); } } } catch (Exception ex) { await _errHndlrInstance.LogError(ex, "MinigameFeature", "BossFight(TwitchChatter)", false, "!raid"); } return(DateTime.Now); }