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()); }
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()); }