public async Task <IActionResult> StreamLive() { _logger.LogInformation("Fitzy stream live received"); await _wsMgr.SendAllAsync("LIVE"); return(NoContent()); }
public async Task <IActionResult> HandleWebhook([FromQuery] string username, [FromQuery] string userId) { _logger.LogInformation($"Received Twitch webhook for {username}"); var bytes = await Request.GetBodyAsBytesAsync(); if (!Request.Headers.TryGetValue("X-Hub-Signature", out var signature)) { _logger.LogWarning("No X-Hub-Signature header found"); return(BadRequest()); } if (!TwitchSignatureVerifier.Verify(_twitchConfig.WebhookSecret, signature.ToString(), bytes)) { _logger.LogWarning("X-Hub-Signature is invalid"); return(BadRequest()); } Request.Headers.TryGetValue("Twitch-Notification-Id", out var notificationId); _logger.LogInformation($"The notification's ID is: {notificationId}"); if (_cache.TryGetValue(notificationId, out _)) { _logger.LogInformation("Notification ID already being tracked, webhook ignored."); return(NoContent()); } _cache.Set(notificationId, "", TimeSpan.FromDays(3)); var bodyString = Encoding.UTF8.GetString(bytes); var payload = JsonSerializer.Deserialize <StreamChangedPayload>(bodyString); var notificationMsg = new StreamChangedNotificationMessage(username, userId, payload.Data); var msgBody = JsonSerializer.Serialize(notificationMsg); _logger.LogInformation($"Stream status changed for channel {username}"); await _wsMgr.SendAllAsync(msgBody); if (string.Equals(username, "fitzyhere", StringComparison.OrdinalIgnoreCase)) { await _fitzyWsMgr.SendAllAsync(msgBody); } _context.TwitchWebhookNotifications.Add(new TwitchWebhookNotification { Id = notificationId, ReceivedAt = DateTimeOffset.UtcNow, UserId = userId, Username = username, GameId = payload.Data?[0]?.GameId, Title = payload.Data?[0]?.Title, StartedAt = payload.Data?[0]?.StartedAt }); await _context.SaveChangesAsync(); return(NoContent()); }