From 0b42739cbb8f2e8fafa760a4f63237c97038f968 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Mon, 26 May 2025 12:38:04 -0500 Subject: [PATCH] feat: implement verification of subscription request --- src/src/StevesBot.Webhook/Program.cs | 35 ++++++++++++++++++- .../StevesBot.Webhook/SubscriptionWorker.cs | 2 +- .../YouTube/SubscriptionOptions.cs | 2 +- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/src/StevesBot.Webhook/Program.cs b/src/src/StevesBot.Webhook/Program.cs index 16fa3cd..115485d 100644 --- a/src/src/StevesBot.Webhook/Program.cs +++ b/src/src/StevesBot.Webhook/Program.cs @@ -1,3 +1,5 @@ +using Microsoft.AspNetCore.Mvc; + var builder = WebApplication.CreateBuilder(args); builder.Services @@ -6,7 +8,9 @@ builder.Services .ValidateDataAnnotations(); builder.Services - .AddHttpClient() + .AddHttpClient( + static c => c.BaseAddress = new("https://pubsubhubbub.appspot.com") + ) .AddStandardResilienceHandler(); builder.Services.AddOpenApi(); @@ -22,4 +26,33 @@ if (app.Environment.IsDevelopment()) app.UseHttpsRedirection(); +const string ytCallback = "yt-callback"; + +app.MapGet( + ytCallback, + static ( + [FromQuery(Name = "hub.mode")] string mode, + [FromQuery(Name = "hub.topic")] string topic, + [FromQuery(Name = "hub.challenge")] string challenge, + [FromServices] IOptions subOptions, + [FromServices] ILogger logger + ) => + { + if (topic != subOptions.Value.TopicUrl) + { + logger.LogInformation("Received verification request for wrong topic: {Topic}", topic); + return Results.NotFound(); + } + + return Results.Text(challenge); + } +); + +// TODO: Implement logic to do the following: +// - extract video id from notification +// - identify video as a stream or not +// - if is stream create discord message +// - if not then just log a message +app.MapPost(ytCallback, static () => "hello"); + app.Run(); \ No newline at end of file diff --git a/src/src/StevesBot.Webhook/SubscriptionWorker.cs b/src/src/StevesBot.Webhook/SubscriptionWorker.cs index 436ab1e..f4bc64b 100644 --- a/src/src/StevesBot.Webhook/SubscriptionWorker.cs +++ b/src/src/StevesBot.Webhook/SubscriptionWorker.cs @@ -25,7 +25,7 @@ internal sealed class SubscriptionWorker( _logger.LogInformation("Subscribing to notifications"); await _pubSubClient.SubscribeAsync( - _options.CallbackBaseUrl, + _options.CallbackUrl, _options.TopicUrl, cancellationToken ); diff --git a/src/src/StevesBot.Webhook/YouTube/SubscriptionOptions.cs b/src/src/StevesBot.Webhook/YouTube/SubscriptionOptions.cs index da8e9f1..f64cb56 100644 --- a/src/src/StevesBot.Webhook/YouTube/SubscriptionOptions.cs +++ b/src/src/StevesBot.Webhook/YouTube/SubscriptionOptions.cs @@ -3,7 +3,7 @@ namespace StevesBot.Webhook.YouTube; internal sealed record SubscriptionOptions { [Required] - public string CallbackBaseUrl { get; init; } = string.Empty; + public string CallbackUrl { get; init; } = string.Empty; [Required] public string TopicUrl { get; init; } = string.Empty;