コード例 #1
0
        public async Task <IActionResult> OnChannelPointsRedeemed([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "twitch/points/OnChannelPointsRedeemed")] HttpRequest req,
                                                                  [SignalR(HubName = "channelPoints")] IAsyncCollector <SignalRMessage> obsMessages
                                                                  )
        {
            var requestBody = await new StreamReader(req.Body).ReadToEndAsync();

            req.Body.Position = 0;

            var message = await _twitchAuthenticator.AuthenticateMessage(req);

            if (!message.Success)
            {
                return(new BadRequestObjectResult(new { Message = "Signature not valid" }));
            }

            if (req.Headers.ContainsKey("Twitch-Eventsub-Message-Type") && req.Headers["Twitch-Eventsub-Message-Type"] == "webhook_callback_verification")
            {
                // return challenge value from payload
                var jdoc      = JsonDocument.Parse(requestBody);
                var challenge = jdoc.RootElement.GetProperty("challenge").GetString();
                _log.LogInformation($"Returning challenge: {challenge}");
                return(new ContentResult()
                {
                    Content = challenge,
                    ContentType = "text/plain",
                    StatusCode = 200
                });
            }

            var redemption = JsonSerializer.Deserialize <EventSubscription <ChannelPointsRedeemedEvent> >(message.Value.Message, _ignoreNullJsonOptions);

            switch (redemption.Subscription.Type)
            {
            case "channel.channel_points_custom_reward_redemption.add":
                // parse to type
                _log.LogInformation($"{redemption.Event.UserName} redeemed {redemption.Event.Reward.Cost} points for {redemption.Event.Reward.Title}");
                await obsMessages.AddAsync(new SignalRMessage()
                {
                    Target = "Redeemed", Arguments = new[] { redemption.Event.Reward.Title }
                });

                break;

            default:
                _log.LogInformation(redemption.Subscription.Type);
                break;
            }

            return(new OkResult());
        }
コード例 #2
0
ファイル: StreamStatusHook.cs プロジェクト: 425show/425bot
        public async Task <IActionResult> OnStreamStarted([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = "twitch/status/OnStreamStarted")] HttpRequest req,
                                                          [Table("ChannelStatus")] IAsyncCollector <ChannelStatus> table
                                                          )
        {
            var requestBody = await new StreamReader(req.Body).ReadToEndAsync();

            req.Body.Position = 0;

            var message = await _twitchAuthenticator.AuthenticateMessage(req);

            if (!message.Success)
            {
                return(new BadRequestObjectResult(new { Message = "Signature not valid" }));
            }

            if (req.Headers.ContainsKey("Twitch-Eventsub-Message-Type") && req.Headers["Twitch-Eventsub-Message-Type"] == "webhook_callback_verification")
            {
                // return challenge value from payload
                var jdoc      = JsonDocument.Parse(requestBody);
                var challenge = jdoc.RootElement.GetProperty("challenge").GetString();
                _log.LogInformation($"Returning challenge: {challenge}");
                return(new ContentResult()
                {
                    Content = challenge,
                    ContentType = "text/plain",
                    StatusCode = 200
                });
            }

            var eventMessage = JsonSerializer.Deserialize <EventSubscription <StreamStartEvent> >(message.Value.Message, _ignoreNullJsonOptions);

            _log.LogInformation($"Received event: {eventMessage.Subscription.Type}");
            switch (eventMessage.Subscription.Type)
            {
            case "stream.online":
                await table.AddAsync(new ChannelStatus(eventMessage.Event));

                break;

            case "stream.offline":
                break;
            }

            return(new OkResult());
        }