Esempio n. 1
0
        public async Task <IActionResult> StreamLive()
        {
            _logger.LogInformation("Fitzy stream live received");
            await _wsMgr.SendAllAsync("LIVE");

            return(NoContent());
        }
Esempio n. 2
0
        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());
        }