예제 #1
0
 //https://docs.microsoft.com/en-us/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming#:~:text=Avoid%20Async%20Void
 private async void onRewardRedeemed(object sender, OnRewardRedeemedArgs e)
 {
     if (e.RewardTitle == "puppy-rain")
     {
         await _connection.InvokeAsync("SendMessage", e.DisplayName, "It's a torrential downpour of destructopups!!!", MessageTypeEnum.SuperRain);
     }
 }
예제 #2
0
        public async Task <RewardRedemption> UpdateRedemptionReward(OnRewardRedeemedArgs events, CustomRewardRedemptionStatus status)
        {
            try
            {
                var response = await API.Helix.ChannelPoints.UpdateCustomRewardRedemptionStatus(events.ChannelId, events.RewardId.ToString(),
                                                                                                new List <string>() { events.RedemptionId.ToString() },
                                                                                                new UpdateCustomRewardRedemptionStatusRequest()
                {
                    Status = status
                },
                                                                                                this.accessToken);

                _logger.Information($"{response.Data[0]}");
                return(response.Data[0]);
            }
            catch (InvalidCredentialException e)
            {
                _logger.Information($"{e.Message}");
                await RefreshAccessToken();

                return(await UpdateRedemptionReward(events, status));
            }
            catch (Exception e)
            {
                _logger.Error($"{e.Message}");
                throw e;
            }
        }
예제 #3
0
 private async Task FulfillCustomReward(OnRewardRedeemedArgs e)
 {
     if (e.RewardTitle == Constants.KillPlayerString)
     {
         if (isValidCustomReward(e.RewardPrompt, e.Message))
         {
             _logger.Information($"This is a valid kill. Sending over to Among Us Mod");
             // If the pipe returns success, call UpdateCustomRewardRedemptionStatus with status fulfilled
             SendToPipe("killplayer:" + e.RewardPrompt);
             await API.UpdateRedemptionReward(e, CustomRewardRedemptionStatus.FULFILLED);
         }
         else
         {
             _logger.Information($"This is not a valid kill. We are returning the points.");
             await API.UpdateRedemptionReward(e, CustomRewardRedemptionStatus.CANCELED);
         }
     }
     else if (e.RewardTitle == Constants.KillRandomPlayerString)
     {
         _logger.Information($"Going to kill random player");
         // If the pipe returns success, call UpdateCustomRewardRedemptionStatus with status fulfilled
         SendToPipe("killrandomplayer");
         await API.UpdateRedemptionReward(e, CustomRewardRedemptionStatus.FULFILLED);
     }
     else if (e.RewardTitle == Constants.SwapPlayersString)
     {
         _logger.Information($"Going to swap players");
         // If the pipe returns success, call UpdateCustomRewardRedemptionStatus with status fulfilled
         SendToPipe("swapplayers");
         await API.UpdateRedemptionReward(e, CustomRewardRedemptionStatus.FULFILLED);
     }
 }
예제 #4
0
파일: PubSubBot.cs 프로젝트: AzatKzn/CarBot
 private void Upgrade(OnRewardRedeemedArgs e, bool isExp, int sum)
 {
     using (var context = new AppDbContext())
     {
         var user = context.Users.GetByLogin(e.Login);
         if (user == null)
         {
             LogInfo(e);
             return;
         }
         if (isExp)
         {
             user.Experience += sum;
         }
         else
         {
             user.Money += sum;
         }
         var rewardHistory = new RewardHistory()
         {
             User   = user,
             Name   = e.RewardTitle,
             Guid   = e.RewardId,
             Cost   = e.RewardCost,
             Date   = DateTime.Now,
             FactUp = sum,
             IsExp  = isExp
         };
         context.RewardHistories.Add(rewardHistory);
         context.SaveChanges();
     }
 }
예제 #5
0
        public static void UkrainianStreamRewardCallback(object s, OnRewardRedeemedArgs e, CallbackArgs args)
        {
            //TwitchHelpers.FulFillRedemption(args.e.ChannelId, args.e.RewardId.ToString(), args.e.RedemptionId.ToString());
            var rewardTimespan = TimeSpan.FromMinutes(15);

            args.ChannelInfo.Lang = Lang.ua;
            Task.Delay(rewardTimespan).ContinueWith(_ => args.ChannelInfo.Lang = Lang.ru);
        }
예제 #6
0
 private void OnRewardRedeemed(object sender, OnRewardRedeemedArgs e)
 {
     if (!e.Status.Equals("UNFULFILLED"))
     {
         return;
     }
     _notifierMediatorService.NotifyPattern(e.RewardTitle.ToLowerInvariant(), e);
 }
예제 #7
0
 private void _pubSub_OnRewardRedeemed(object sender, OnRewardRedeemedArgs e)
 {
     if (SettingsSingleton.Instance.genSettings.RedemptionsEnabled)
     {
         PushNewChatMessage(
             $"redeemed '{e.RewardTitle}' ({e.RewardCost} points)", // ~ {e.ChannelId}",
             e.DisplayName, "#708090");
     }
 }
예제 #8
0
        private void ClientOnOnRewardRedeemed(object?sender, OnRewardRedeemedArgs e)
        {
            IRewardRedemption rewardRedemption = e.ToRewardRedemption();

            foreach (IRewardRedeemHandler rewardRedeemHandler in this.rewardRedeemHandlers)
            {
                rewardRedeemHandler.Handle(rewardRedemption);
            }
        }
예제 #9
0
 private void onRewardRedeemed(object?sender, OnRewardRedeemedArgs args)
 {
     /*
      * _Logger.LogInformation($"{args.DisplayName} redeemed {args.RewardId}/{args.RewardTitle}\n\tPrompt:{args.RewardPrompt}\n\tCost:{args.RewardCost}\n\tMessage: {args.Message}\n\tLogin: {args.Login} {args.Status} {args.TimeStamp}");
      *
      * if (args.RewardTitle == "monkaW") {
      *  _Challenges.Start(1);
      * }
      */
 }
예제 #10
0
        private void PubSub_OnRewardRedeemed(object sender, OnRewardRedeemedArgs e)
        {
            Console.WriteLine(e.RewardTitle.Trim() + " was redeemed!");

            bool useKeywords = !String.IsNullOrEmpty(e.Message);

            Setting settings = repository.LoadSettings();

            if (String.IsNullOrEmpty(settings.Application))
            {
                Console.WriteLine("is there any point?");
                return;
            }

            List <Trigger> triggers = repository.GetTriggers().Where(trigger => !String.IsNullOrEmpty(trigger.RewardName)).ToList <Trigger>();

            foreach (Trigger trigger in triggers)
            {
                if (trigger.RewardName != e.RewardTitle.Trim())
                {
                    continue;
                }

                if (useKeywords)
                {
                    if (!PassesKeywordCheck(trigger.Keywords, e.Message))
                    {
                        continue;
                    }
                }

                Console.WriteLine("matched!!");
                SendKeystroke.Send(settings.Application, trigger.CharAnimTriggerKeyValue);

                DateTime triggeredAt = DateTime.Now;

                repository.UpdateTriggerUsage(trigger.Name, triggeredAt);

                BotTriggeredArgs args = new BotTriggeredArgs {
                    TriggeredAt = triggeredAt
                };
                BotTriggered?.Invoke(this, args);

                if (settings.LoggingEnabled)
                {
                    Logger.Write($"{trigger.Name} (REWARD: {e.RewardTitle.Trim()})", e.DisplayName, e.RewardCost, e.Message);
                }

                if (useKeywords)
                {
                    break;
                }
            }
        }
예제 #11
0
 //Pure Debug to see what containes a OnRewardRedeemedArgs
 void RewardRedeemedDebug(OnRewardRedeemedArgs e)
 {
     Console.WriteLine("Points redeemed");
     Console.WriteLine(e.Login);
     Console.WriteLine(e.Message);
     Console.WriteLine(e.RewardCost);
     Console.WriteLine(e.RewardId);
     Console.WriteLine(e.RewardPrompt);
     Console.WriteLine(e.RewardTitle);
     Console.WriteLine(e.Status);
     Console.WriteLine(e.TimeStamp);
 }
 internal static RewardRedeemedEvent Create(OnRewardRedeemedArgs e)
 => new RewardRedeemedEvent
 {
     ChannelId    = e.ChannelId,
     DisplayName  = e.DisplayName,
     Login        = e.Login,
     Message      = e.Message,
     RewardCost   = e.RewardCost,
     RewardId     = e.RewardId,
     RewardPrompt = e.RewardPrompt,
     RewardTitle  = e.RewardTitle,
     Status       = e.Status,
     TimeStamp    = e.TimeStamp
 };
예제 #13
0
        public bool TryGetReward(OnRewardRedeemedArgs args, out SupportedReward reward)
        {
            reward = null;

            foreach (var item in Rewards)
            {
                if (item.Title == args.RewardTitle)
                {
                    reward = item;
                    return(true);
                }
            }

            return(false);
        }
예제 #14
0
        private async void OnRewardRedeemed(object sender, OnRewardRedeemedArgs e)
        {
            // Check if the reward is a buy spice reward in the format ... (xN) where N is amount of spice bought
            if (e.Status == "ACTION_TAKEN")
            {
                Regex rxCheck = new Regex(@"\d+",
                                          RegexOptions.Compiled | RegexOptions.IgnoreCase);
                MatchCollection matches = rxCheck.Matches(e.RewardTitle);
                foreach (Match match in matches)
                {
                    int amount = Int32.Parse(match.Value);
                    TwitchLib.Api.V5.Models.Users.Users user = await UsernameToUser(e.DisplayName);

                    UpdateSpiceStorage(ref userStorage, user.Matches[0].Id, user.Matches[0].DisplayName, amount);
                }
            }
        }
예제 #15
0
        private async void PubSub_OnRewardRedeemed(object sender, OnRewardRedeemedArgs e)
        {
            //Statuses can be:
            // "UNFULFILLED": when a user redeemed the reward
            // "FULFILLED": when a broadcaster or moderator marked the reward as complete
            if (e.Status == "UNFULFILLED")
            {
                _logger.Information($"{e.DisplayName} redeemed: {e.RewardTitle} " +
                                    $"with prompt ${e.RewardPrompt.Split()}. With message: {e.Message}");
                await FulfillCustomReward(e);
            }

            if (e.Status == "FULFILLED")
            {
                _logger.Information($"Reward from {e.DisplayName} ({e.RewardTitle}) has been marked as complete");
            }
        }
예제 #16
0
        /// <summary>
        /// Checks the bindings array and plays the appropriate sound file when a Channel Points reward is redeemed.
        /// </summary>
        private void OnRewardRedeemed(object sender, OnRewardRedeemedArgs e)
        {
#if DEBUG
            Debug.WriteLine("Reward Redeemed:");
            Debug.WriteLine("\tTitle:" + e.RewardTitle + "|");
            Debug.WriteLine("\tPrompt:" + e.RewardPrompt + "|");
            Debug.WriteLine("\tUser:"******"|");
            Debug.WriteLine("\tStatus:" + e.Status + "|");
            Debug.WriteLine("----------------");
#endif
            if (bindings.ContainsKey(e.RewardTitle) && e.Status != "ACTION_TAKEN")
            {
                bindings.TryGetValue(e.RewardTitle, out string output);
#if DEBUG
                Debug.WriteLine(output);
#endif
                PlaySound(output);
            }
        }
예제 #17
0
파일: PubSubBot.cs 프로젝트: AzatKzn/CarBot
 private async void CheckReward(OnRewardRedeemedArgs e)
 {
     await Task.Run(() =>
     {
         try
         {
             if (e.RewardTitle.Contains("10к опыта в игре") || e.RewardId.ToString().ToLower() == "b2a275fe-b37e-4d69-bde4-9d59f0c39b7e")
             {
                 Upgrade(e, true, 10000);
             }
             else if (e.RewardTitle.Contains("30к опыта в игре") || e.RewardId.ToString().ToLower() == "36827cd8-001d-4735-9b1e-7dbaf9604b2f")
             {
                 Upgrade(e, true, 30000);
             }
             else if (e.RewardTitle.Contains("70к опыта в игре") || e.RewardId.ToString().ToLower() == "8fd25e79-1f1d-4d01-9096-df0e372e9cc1")
             {
                 Upgrade(e, true, 70000);
             }
             else if (e.RewardTitle.Contains("10к денег в игре") || e.RewardId.ToString().ToLower() == "30db925c-97dc-4a8b-b9ab-570888095aef")
             {
                 Upgrade(e, false, 10000);
             }
             else if (e.RewardTitle.Contains("30к денег в игре") || e.RewardId.ToString().ToLower() == "918d3bb0-7dc1-4e20-92d2-f5ee9a2c1c3e")
             {
                 Upgrade(e, false, 30000);
             }
             else if (e.RewardTitle.Contains("70к денег в игре") || e.RewardId.ToString().ToLower() == "fe8df898-1f48-474c-bce4-334c707f9e72")
             {
                 Upgrade(e, false, 70000);
             }
             else if (e.RewardCost >= 10000)
             {
                 LogInfo(e);
             }
         }
         catch (Exception ex)
         {
             Logger.LogRewardError(ex);
             LogInfo(e);
         }
     });
 }
        public RewardRequest Create(SupportedReward reward, OnRewardRedeemedArgs args)
        {
            if (reward.RewardType == RewardType.ReplayId && !string.IsNullOrWhiteSpace(args.Message) && int.TryParse(args.Message.Trim(), out int replayId))
            {
                return(new RewardRequest(args.Login, args.RedemptionId, reward.Title, replayId, rank: null, reward.Map, reward.Mode));
            }
            else
            {
                if (reward.RewardType.HasFlag(RewardType.Rank) && Enum.TryParse(args.Message, ignoreCase: true, out GameRank rank))
                {
                    return(new RewardRequest(args.Login, args.RedemptionId, reward.Title, replayId: null, rank: rank, reward.Map, reward.Mode));
                }
                else
                {
                    return(new RewardRequest(args.Login, args.RedemptionId, reward.Title, replayId: null, rank: null, reward.Map, reward.Mode));
                }
            }

            throw new NotSupportedException();
        }
예제 #19
0
        public void Execute(SupportedReward reward, OnRewardRedeemedArgs args)
        {
            Task.Factory.StartNew(async() =>
            {
                try
                {
                    logger.LogInformation($"{args.Login} has redeemed {args.RewardTitle}");

                    RewardResponse response = await queue.EnqueueItemAsync(rewardRequestFactory.Create(reward, args));

                    if (settings.Twitch.EnableChatBot)
                    {
                        twitchClient.SendMessage(settings.Twitch.Channel, $"{args.DisplayName}, {response.Message}", dryRun: settings.Twitch.DryRunMode);
                    }
                }
                catch (Exception e)
                {
                    logger.LogError(e, $"Could not queue reward: {reward.Title}");
                }
            }, TaskCreationOptions.LongRunning);
        }
 public void Handle(OnRewardRedeemedArgs args)
 {
     if (rewards.TryGetReward(args, out SupportedReward reward))
     {
         foreach (var handler in handlers.Where(handler => handler.Supports.Contains(reward.RewardType)))
         {
             try
             {
                 handler.Execute(reward, args);
             }
             catch (Exception e) when(handler != null)
             {
                 logger.LogError(e, $"Could not execute handler: {handler.GetType().Name}");
             }
         }
     }
     else
     {
         logger.LogWarning($"Could not handle reward '{args.RewardTitle}' because it was not found");
     }
 }
예제 #21
0
        public void OnRewardRedeemedEvent(OnRewardRedeemedArgs args)
        {
            this.OnRewardRedeemed?.Invoke(this, args);

            if (!this.events.ContainsKey(EventType.Redeem))
            {
                return;
            }

            var tokenReplacements = new List <KeyValuePair <string, string> >();

            tokenReplacements.Add(new KeyValuePair <string, string>("{{user}}", args.DisplayName));
            tokenReplacements.Add(new KeyValuePair <string, string>("{{reward}}", args.RewardTitle));
            tokenReplacements.Add(new KeyValuePair <string, string>("{{message}}", args.Message));

            // Filter only redeems with matching title
            foreach (var redeemEvent in this.events[EventType.Redeem].Where(redeem => redeem.Option.ToLowerInvariant() == args.RewardTitle.ToLowerInvariant()))
            {
                SendEventMessageInChat(redeemEvent, tokenReplacements);
            }
        }
예제 #22
0
        public void Execute(SupportedReward reward, OnRewardRedeemedArgs args)
        {
            if (!string.IsNullOrWhiteSpace(args.Message) && int.TryParse(args.Message.Trim(), out int replayId))
            {
                Task.Factory.StartNew(async() =>
                {
                    RewardResponse response = await queue.EnqueueItemAsync(requestFactory.Create(reward, args));

                    if (settings.Twitch.EnableChatBot)
                    {
                        string message = $"{args.DisplayName}, {response.Message}";
                        twitchClient.SendMessage(settings.Twitch.Channel, message, dryRun: settings.Twitch.DryRunMode);
                    }
                }, TaskCreationOptions.LongRunning);
            }
            else
            {
                twitchClient.SendMessage(settings.Twitch.Channel, $"{args.DisplayName}, your request is invalid.", dryRun: settings.Twitch.DryRunMode);
                logger.LogDebug($"{args.TimeStamp}: {args.RewardId} - {args.RewardCost}");
            }
        }
예제 #23
0
        private void PubSub_OnRewardRedeemed(object sender, OnRewardRedeemedArgs e)
        {
            //Statuses can be:
            // "UNFULFILLED": when a user redeemed the reward
            // "FULFILLED": when a broadcaster or moderator marked the reward as complete
            if (e.Status == "UNFULFILLED")
            {
                _logger.Information($"{e.DisplayName} redeemed: {e.RewardTitle}");
                API.Helix.ChannelPoints.UpdateCustomRewardRedemptionStatus(e.ChannelId, e.RewardId.ToString(),
                                                                           new List <string>()
                {
                    e.RedemptionId.ToString()
                }, new UpdateCustomRewardRedemptionStatusRequest()
                {
                    Status = CustomRewardRedemptionStatus.CANCELED
                });
            }

            if (e.Status == "FULFILLED")
            {
                _logger.Information($"Reward from {e.DisplayName} ({e.RewardTitle}) has been marked as complete");
            }
        }
 public RewardRedeemedArgsWrapper(OnRewardRedeemedArgs onRewardRedeemedArgs)
 {
     this.onRewardRedeemedArgs = onRewardRedeemedArgs;
 }
예제 #25
0
 public GrowCommand(OnRewardRedeemedArgs rewardRedeemedArgs)
 {
     RewardRedeemedArgs = rewardRedeemedArgs;
 }
예제 #26
0
 private void onRewardRedeemed(object sender, OnRewardRedeemedArgs e)
 {
     throw new NotImplementedException();
 }
예제 #27
0
 public static IRewardRedemption ToRewardRedemption(this OnRewardRedeemedArgs args)
 {
     return(new RewardRedeemedArgsWrapper(args));
 }
예제 #28
0
파일: PubSubBot.cs 프로젝트: AzatKzn/CarBot
        private void LogInfo(OnRewardRedeemedArgs e)
        {
            var str = CantParseMessage.Format(e.RewardTitle, e.RewardId, e.RewardCost, e.Login, e.DisplayName);

            Logger.LogRewardInfo(str);
        }
예제 #29
0
파일: PubSubBot.cs 프로젝트: AzatKzn/CarBot
 private void OnRewardRedeemed(object sender, OnRewardRedeemedArgs e)
 {
     CheckReward(e);
 }
예제 #30
0
 private void PubSub_OnRewardRedeemed(object sender, OnRewardRedeemedArgs e)
 {
     onRewardHandler.Handle(e);
 }