diff --git a/src/StevesBot.sln b/src/StevesBot.sln index 927b98f..5d88949 100644 --- a/src/StevesBot.sln +++ b/src/StevesBot.sln @@ -15,6 +15,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StevesBot.Worker.Tests", "t EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StevesBot.Webhook.Tests", "tests\StevesBot.Webhook.Tests\StevesBot.Webhook.Tests.csproj", "{3875E45D-8400-46D9-89CE-485BADED0736}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StevesBot.Library", "src\StevesBot.Library\StevesBot.Library.csproj", "{07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StevesBot.Library.Tests", "tests\StevesBot.Library.Tests\StevesBot.Library.Tests.csproj", "{F67829A2-3600-4DD9-B324-18DDF4A0809B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -73,6 +77,30 @@ Global {3875E45D-8400-46D9-89CE-485BADED0736}.Release|x64.Build.0 = Release|Any CPU {3875E45D-8400-46D9-89CE-485BADED0736}.Release|x86.ActiveCfg = Release|Any CPU {3875E45D-8400-46D9-89CE-485BADED0736}.Release|x86.Build.0 = Release|Any CPU + {07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81}.Debug|x64.ActiveCfg = Debug|Any CPU + {07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81}.Debug|x64.Build.0 = Debug|Any CPU + {07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81}.Debug|x86.ActiveCfg = Debug|Any CPU + {07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81}.Debug|x86.Build.0 = Debug|Any CPU + {07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81}.Release|Any CPU.Build.0 = Release|Any CPU + {07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81}.Release|x64.ActiveCfg = Release|Any CPU + {07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81}.Release|x64.Build.0 = Release|Any CPU + {07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81}.Release|x86.ActiveCfg = Release|Any CPU + {07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81}.Release|x86.Build.0 = Release|Any CPU + {F67829A2-3600-4DD9-B324-18DDF4A0809B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F67829A2-3600-4DD9-B324-18DDF4A0809B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F67829A2-3600-4DD9-B324-18DDF4A0809B}.Debug|x64.ActiveCfg = Debug|Any CPU + {F67829A2-3600-4DD9-B324-18DDF4A0809B}.Debug|x64.Build.0 = Debug|Any CPU + {F67829A2-3600-4DD9-B324-18DDF4A0809B}.Debug|x86.ActiveCfg = Debug|Any CPU + {F67829A2-3600-4DD9-B324-18DDF4A0809B}.Debug|x86.Build.0 = Debug|Any CPU + {F67829A2-3600-4DD9-B324-18DDF4A0809B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F67829A2-3600-4DD9-B324-18DDF4A0809B}.Release|Any CPU.Build.0 = Release|Any CPU + {F67829A2-3600-4DD9-B324-18DDF4A0809B}.Release|x64.ActiveCfg = Release|Any CPU + {F67829A2-3600-4DD9-B324-18DDF4A0809B}.Release|x64.Build.0 = Release|Any CPU + {F67829A2-3600-4DD9-B324-18DDF4A0809B}.Release|x86.ActiveCfg = Release|Any CPU + {F67829A2-3600-4DD9-B324-18DDF4A0809B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -82,5 +110,7 @@ Global {7C243CA8-55A0-4D73-9FF6-F5E801B7146D} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} {388EAD53-CCA4-4532-8DEC-5E9177776117} = {0AB3BF05-4346-4AA6-1389-037BE0695223} {3875E45D-8400-46D9-89CE-485BADED0736} = {0AB3BF05-4346-4AA6-1389-037BE0695223} + {07B3FA35-02B7-46E6-BEDC-D64C5D0FBE81} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B} + {F67829A2-3600-4DD9-B324-18DDF4A0809B} = {0AB3BF05-4346-4AA6-1389-037BE0695223} EndGlobalSection EndGlobal diff --git a/src/src/StevesBot.Library/.editorconfig b/src/src/StevesBot.Library/.editorconfig new file mode 100644 index 0000000..738ea45 --- /dev/null +++ b/src/src/StevesBot.Library/.editorconfig @@ -0,0 +1,3 @@ +[*.cs] +dotnet_diagnostic.CA1056.severity = none +dotnet_diagnostic.CA1054.severity = none diff --git a/src/src/StevesBot.Worker/Discord/Shared/DiscordClientOptions.cs b/src/src/StevesBot.Library/Discord/Common/DiscordClientOptions.cs similarity index 63% rename from src/src/StevesBot.Worker/Discord/Shared/DiscordClientOptions.cs rename to src/src/StevesBot.Library/Discord/Common/DiscordClientOptions.cs index 38547a0..ddfbca3 100644 --- a/src/src/StevesBot.Worker/Discord/Shared/DiscordClientOptions.cs +++ b/src/src/StevesBot.Library/Discord/Common/DiscordClientOptions.cs @@ -1,6 +1,6 @@ -namespace StevesBot.Worker.Discord.Shared; +namespace StevesBot.Library.Discord.Common; -internal sealed class DiscordClientOptions +public sealed class DiscordClientOptions { public string ApiUrl { get; init; } = string.Empty; public string AppToken { get; init; } = string.Empty; diff --git a/src/src/StevesBot.Worker/Discord/Shared/DiscordMessage.cs b/src/src/StevesBot.Library/Discord/Common/DiscordMessage.cs similarity index 78% rename from src/src/StevesBot.Worker/Discord/Shared/DiscordMessage.cs rename to src/src/StevesBot.Library/Discord/Common/DiscordMessage.cs index e29088f..bf286ef 100644 --- a/src/src/StevesBot.Worker/Discord/Shared/DiscordMessage.cs +++ b/src/src/StevesBot.Library/Discord/Common/DiscordMessage.cs @@ -1,6 +1,8 @@ -namespace StevesBot.Worker.Discord.Shared; +using System.Text.Json.Serialization; -internal sealed record DiscordMessage +namespace StevesBot.Library.Discord.Common; + +public sealed record DiscordMessage { [JsonPropertyName("id")] public string Id { get; init; } = string.Empty; diff --git a/src/src/StevesBot.Worker/Discord/Shared/DiscordMessageReference.cs b/src/src/StevesBot.Library/Discord/Common/DiscordMessageReference.cs similarity index 70% rename from src/src/StevesBot.Worker/Discord/Shared/DiscordMessageReference.cs rename to src/src/StevesBot.Library/Discord/Common/DiscordMessageReference.cs index a950137..a2c9416 100644 --- a/src/src/StevesBot.Worker/Discord/Shared/DiscordMessageReference.cs +++ b/src/src/StevesBot.Library/Discord/Common/DiscordMessageReference.cs @@ -1,6 +1,8 @@ -namespace StevesBot.Worker.Discord.Shared; +using System.Text.Json.Serialization; -internal sealed record DiscordMessageReference( +namespace StevesBot.Library.Discord.Common; + +public sealed record DiscordMessageReference( [property: JsonPropertyName("type")] int Type, [property: JsonPropertyName("message_id")] string MessageId, [property: JsonPropertyName("channel_id")] string ChannelId, diff --git a/src/src/StevesBot.Library/Discord/Common/DiscordMessageReferenceTypes.cs b/src/src/StevesBot.Library/Discord/Common/DiscordMessageReferenceTypes.cs new file mode 100644 index 0000000..7c66727 --- /dev/null +++ b/src/src/StevesBot.Library/Discord/Common/DiscordMessageReferenceTypes.cs @@ -0,0 +1,7 @@ +namespace StevesBot.Library.Discord.Common; + +public static class DiscordMessageReferenceTypes +{ + public const int Default = 0; + public const int Forward = 1; +} \ No newline at end of file diff --git a/src/src/StevesBot.Library/Discord/Common/DiscordUser.cs b/src/src/StevesBot.Library/Discord/Common/DiscordUser.cs new file mode 100644 index 0000000..13a8393 --- /dev/null +++ b/src/src/StevesBot.Library/Discord/Common/DiscordUser.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace StevesBot.Library.Discord.Common; + +public sealed record DiscordUser +{ + [JsonPropertyName("id")] + public string Id { get; init; } = string.Empty; +} \ No newline at end of file diff --git a/src/src/StevesBot.Worker/Discord/Rest/DiscordRestClient.cs b/src/src/StevesBot.Library/Discord/Rest/DiscordRestClient.cs similarity index 87% rename from src/src/StevesBot.Worker/Discord/Rest/DiscordRestClient.cs rename to src/src/StevesBot.Library/Discord/Rest/DiscordRestClient.cs index 45b2ecd..4e251e6 100644 --- a/src/src/StevesBot.Worker/Discord/Rest/DiscordRestClient.cs +++ b/src/src/StevesBot.Library/Discord/Rest/DiscordRestClient.cs @@ -1,6 +1,14 @@ -namespace StevesBot.Worker.Discord.Rest; +using System.Net.Http.Json; -internal sealed class DiscordRestClient : IDiscordRestClient +using Microsoft.Extensions.Logging; + +using StevesBot.Library.Discord.Rest.Requests; +using StevesBot.Library.Discord.Rest.Responses; +using StevesBot.Library.Discord.Common; + +namespace StevesBot.Library.Discord.Rest; + +public sealed class DiscordRestClient : IDiscordRestClient { private readonly ILogger _logger; private readonly HttpClient _httpClient; diff --git a/src/src/StevesBot.Worker/Discord/Rest/DiscordRestClientException.cs b/src/src/StevesBot.Library/Discord/Rest/DiscordRestClientException.cs similarity index 70% rename from src/src/StevesBot.Worker/Discord/Rest/DiscordRestClientException.cs rename to src/src/StevesBot.Library/Discord/Rest/DiscordRestClientException.cs index 9e8e4b5..6f27517 100644 --- a/src/src/StevesBot.Worker/Discord/Rest/DiscordRestClientException.cs +++ b/src/src/StevesBot.Library/Discord/Rest/DiscordRestClientException.cs @@ -1,6 +1,6 @@ -namespace StevesBot.Worker.Discord.Rest; +namespace StevesBot.Library.Discord.Rest; -internal sealed class DiscordRestClientException : Exception +public sealed class DiscordRestClientException : Exception { public DiscordRestClientException() { diff --git a/src/src/StevesBot.Worker/Discord/Rest/IDiscordRestClient.cs b/src/src/StevesBot.Library/Discord/Rest/IDiscordRestClient.cs similarity index 57% rename from src/src/StevesBot.Worker/Discord/Rest/IDiscordRestClient.cs rename to src/src/StevesBot.Library/Discord/Rest/IDiscordRestClient.cs index a1f1f0b..dd057ef 100644 --- a/src/src/StevesBot.Worker/Discord/Rest/IDiscordRestClient.cs +++ b/src/src/StevesBot.Library/Discord/Rest/IDiscordRestClient.cs @@ -1,6 +1,9 @@ -namespace StevesBot.Worker.Discord.Rest; +using StevesBot.Library.Discord.Rest.Requests; +using StevesBot.Library.Discord.Common; -internal interface IDiscordRestClient +namespace StevesBot.Library.Discord.Rest; + +public interface IDiscordRestClient { Task GetGatewayUrlAsync(CancellationToken cancellationToken = default); Task CreateMessageAsync(string channelId, CreateMessageRequest request, CancellationToken cancellationToken = default); diff --git a/src/src/StevesBot.Library/Discord/Rest/Requests/CreateMessageRequest.cs b/src/src/StevesBot.Library/Discord/Rest/Requests/CreateMessageRequest.cs new file mode 100644 index 0000000..abe91a6 --- /dev/null +++ b/src/src/StevesBot.Library/Discord/Rest/Requests/CreateMessageRequest.cs @@ -0,0 +1,10 @@ +using System.Text.Json.Serialization; + +using StevesBot.Library.Discord.Common; + +namespace StevesBot.Library.Discord.Rest.Requests; + +public sealed record CreateMessageRequest( + [property: JsonPropertyName("content")] string Content, + [property: JsonPropertyName("message_reference")] DiscordMessageReference? MessageReference +); \ No newline at end of file diff --git a/src/src/StevesBot.Library/Discord/Rest/Responses/GatewayResponse.cs b/src/src/StevesBot.Library/Discord/Rest/Responses/GatewayResponse.cs new file mode 100644 index 0000000..cc810d3 --- /dev/null +++ b/src/src/StevesBot.Library/Discord/Rest/Responses/GatewayResponse.cs @@ -0,0 +1,7 @@ +using System.Text.Json.Serialization; + +namespace StevesBot.Library.Discord.Rest.Responses; + +public sealed record GatewayResponse( + [property: JsonPropertyName("url")] string Url +); \ No newline at end of file diff --git a/src/src/StevesBot.Library/Discord/ServicesExtensions.cs b/src/src/StevesBot.Library/Discord/ServicesExtensions.cs new file mode 100644 index 0000000..d8089e7 --- /dev/null +++ b/src/src/StevesBot.Library/Discord/ServicesExtensions.cs @@ -0,0 +1,28 @@ +using Microsoft.Extensions.DependencyInjection; + +using StevesBot.Library.Discord.Common; +using StevesBot.Library.Discord.Rest; +using StevesBot.Library.Telemetry; + +namespace StevesBot.Library.Discord; + +public static class ServicesExtensions +{ + public static IServiceCollection AddDiscordRestClient(this IServiceCollection services) + { + services + .AddHttpClient(static (sp, c) => + { + var discordOptions = sp.GetRequiredService(); + c.BaseAddress = new Uri(discordOptions.ApiUrl); + c.DefaultRequestHeaders.Authorization = new("Bot", discordOptions.AppToken); + + var userAgentString = $"DiscordBot (https://github.com/StevanFreeborn/steves-bot, {StevesBotInstrumentation.SourceVersion})"; + c.DefaultRequestHeaders.Add("User-Agent", userAgentString); + }) + .AddStandardResilienceHandler(); + + return services; + } + +} \ No newline at end of file diff --git a/src/src/StevesBot.Library/StevesBot.Library.csproj b/src/src/StevesBot.Library/StevesBot.Library.csproj new file mode 100644 index 0000000..fc1f3b1 --- /dev/null +++ b/src/src/StevesBot.Library/StevesBot.Library.csproj @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/src/src/StevesBot.Worker/Telemetry/Extensions.cs b/src/src/StevesBot.Library/Telemetry/HostExtensions.cs similarity index 63% rename from src/src/StevesBot.Worker/Telemetry/Extensions.cs rename to src/src/StevesBot.Library/Telemetry/HostExtensions.cs index 0e264a1..8d88139 100644 --- a/src/src/StevesBot.Worker/Telemetry/Extensions.cs +++ b/src/src/StevesBot.Library/Telemetry/HostExtensions.cs @@ -1,10 +1,21 @@ -namespace StevesBot.Worker.Telemetry; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; -internal static class Extensions +using OpenTelemetry.Exporter; +using OpenTelemetry.Logs; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; + +namespace StevesBot.Library.Telemetry; + +public static class HostExtensions { public static HostApplicationBuilder AddTelemetry(this HostApplicationBuilder builder) { - builder.Services.AddSingleton(); + ArgumentNullException.ThrowIfNull(builder); + + builder.Services.AddSingleton(); var seq = new SeqOptions(); builder.Configuration.GetSection(nameof(SeqOptions)).Bind(seq); @@ -17,11 +28,11 @@ internal static class Extensions builder.Services.AddOpenTelemetry() .ConfigureResource(resource => { - resource.AddService(Instrumentation.SourceName, Instrumentation.SourceVersion); + resource.AddService(StevesBotInstrumentation.SourceName, StevesBotInstrumentation.SourceVersion); resource.AddAttributes(new Dictionary { - ["service.name"] = Instrumentation.SourceName, - ["service.version"] = Instrumentation.SourceVersion, + ["service.name"] = StevesBotInstrumentation.SourceName, + ["service.version"] = StevesBotInstrumentation.SourceVersion, ["service.instance.id"] = Environment.MachineName, ["service.namespace"] = "stevesbot", ["service.environment"] = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT") ?? "production", @@ -38,7 +49,7 @@ internal static class Extensions }) .WithTracing(tb => { - tb.AddSource(Instrumentation.SourceName); + tb.AddSource(StevesBotInstrumentation.SourceName); tb.AddAspNetCoreInstrumentation(); tb.AddHttpClientInstrumentation(); tb.AddOtlpExporter(o => diff --git a/src/src/StevesBot.Worker/Telemetry/SeqOptions.cs b/src/src/StevesBot.Library/Telemetry/SeqOptions.cs similarity index 93% rename from src/src/StevesBot.Worker/Telemetry/SeqOptions.cs rename to src/src/StevesBot.Library/Telemetry/SeqOptions.cs index cf5b801..8c2ea69 100644 --- a/src/src/StevesBot.Worker/Telemetry/SeqOptions.cs +++ b/src/src/StevesBot.Library/Telemetry/SeqOptions.cs @@ -1,4 +1,4 @@ -namespace StevesBot.Worker.Telemetry; +namespace StevesBot.Library.Telemetry; internal sealed class SeqOptions { diff --git a/src/src/StevesBot.Library/Telemetry/StevesBotInstrumentation.cs b/src/src/StevesBot.Library/Telemetry/StevesBotInstrumentation.cs new file mode 100644 index 0000000..f08b327 --- /dev/null +++ b/src/src/StevesBot.Library/Telemetry/StevesBotInstrumentation.cs @@ -0,0 +1,15 @@ +using System.Diagnostics; + +namespace StevesBot.Library.Telemetry; + +public sealed class StevesBotInstrumentation : IDisposable +{ + public const string SourceName = "StevesBot.Worker"; + public const string SourceVersion = "0.0.0"; + public ActivitySource Source { get; } = new(SourceName, SourceVersion); + + public void Dispose() + { + Source.Dispose(); + } +} \ No newline at end of file diff --git a/src/src/StevesBot.Webhook/Handlers/NotificationHandler.cs b/src/src/StevesBot.Webhook/Handlers/NotificationHandler.cs index ba1cb5a..00a86e4 100644 --- a/src/src/StevesBot.Webhook/Handlers/NotificationHandler.cs +++ b/src/src/StevesBot.Webhook/Handlers/NotificationHandler.cs @@ -1,3 +1,6 @@ +using StevesBot.Library.Discord.Rest; +using StevesBot.Library.Discord.Rest.Requests; + namespace StevesBot.Webhook.Handlers; // TODO: Implement logic to do the following: @@ -7,11 +10,13 @@ internal static class NotificationHandler public static async Task HandleAsync( HttpContext context, [FromServices] ILogger logger, - [FromServices] IYouTubeDataApiClient youTubeDataApiClient + [FromServices] IYouTubeDataApiClient youTubeDataApiClient, + [FromServices] IDiscordRestClient discordRestClient, + CancellationToken cancellationToken ) { using StreamReader stream = new(context.Request.Body); - var body = await stream.ReadToEndAsync(); + var body = await stream.ReadToEndAsync(cancellationToken); var videoIdRegex = VideoIdRegex.Regex(); var match = videoIdRegex.Match(body); @@ -24,7 +29,7 @@ internal static class NotificationHandler var videoId = match.Groups[1].Value; var parts = new string[] { "liveStreamingDetails", "snippet" }; - var video = await youTubeDataApiClient.GetVideoByIdAsync(videoId, parts); + var video = await youTubeDataApiClient.GetVideoByIdAsync(videoId, parts, cancellationToken); if (video is null) { @@ -40,6 +45,16 @@ internal static class NotificationHandler logger.LogInformation("Video ID {VideoId} is a live stream.", videoId); + await discordRestClient.CreateMessageAsync( + channelId: "1372680179121524778", + request: new CreateMessageRequest( + Content: "@everyone Stevan is trying to be a streamer again! " + + $"Check out the stream here: https://www.youtube.com/watch?v={videoId}", + MessageReference: null + ), + cancellationToken: cancellationToken + ); + return Results.Ok(); } } diff --git a/src/src/StevesBot.Webhook/Program.cs b/src/src/StevesBot.Webhook/Program.cs index c768d10..9fbc310 100644 --- a/src/src/StevesBot.Webhook/Program.cs +++ b/src/src/StevesBot.Webhook/Program.cs @@ -1,3 +1,5 @@ +using StevesBot.Library.Discord.Common; + var builder = WebApplication.CreateBuilder(args); builder.Services @@ -41,6 +43,21 @@ builder.Services.AddSingleton(TimeProvider.System); builder.Services.AddSingleton>(); builder.Services.AddHostedService(); +// TODO: This probably should be +// moved into the AddDiscordRestClient extension method. +// and we should probably just take the dependency +// on IOptions in DiscordRestClient +builder.Services.AddOptions() + .BindConfiguration(nameof(DiscordClientOptions)); + +builder.Services.AddSingleton(static sp => +{ + var options = sp.GetRequiredService>().Value; + return options; +}); + +builder.Services.AddDiscordRestClient(); + var app = builder.Build(); if (app.Environment.IsDevelopment()) diff --git a/src/src/StevesBot.Webhook/StevesBot.Webhook.csproj b/src/src/StevesBot.Webhook/StevesBot.Webhook.csproj index b26a484..79c3094 100644 --- a/src/src/StevesBot.Webhook/StevesBot.Webhook.csproj +++ b/src/src/StevesBot.Webhook/StevesBot.Webhook.csproj @@ -1,15 +1,13 @@ - - net9.0 - enable - enable - - + + + + diff --git a/src/src/StevesBot.Webhook/Usings.cs b/src/src/StevesBot.Webhook/Usings.cs index 0346b11..5f3aeea 100644 --- a/src/src/StevesBot.Webhook/Usings.cs +++ b/src/src/StevesBot.Webhook/Usings.cs @@ -6,6 +6,7 @@ global using System.Text.RegularExpressions; global using Microsoft.AspNetCore.Mvc; global using Microsoft.Extensions.Options; +global using StevesBot.Library.Discord; global using StevesBot.Webhook.Handlers; global using StevesBot.Webhook.YouTube; global using StevesBot.Webhook.YouTube.Data; diff --git a/src/src/StevesBot.Worker/Discord/Extensions.cs b/src/src/StevesBot.Worker/Discord/Extensions.cs index 5271625..0bf3be6 100644 --- a/src/src/StevesBot.Worker/Discord/Extensions.cs +++ b/src/src/StevesBot.Worker/Discord/Extensions.cs @@ -2,21 +2,6 @@ namespace StevesBot.Worker.Discord; internal static class Extensions { - public static IServiceCollection AddDiscordRestClient(this IServiceCollection services) - { - services - .AddHttpClient(static (sp, c) => - { - var discordOptions = sp.GetRequiredService(); - c.BaseAddress = new Uri(discordOptions.ApiUrl); - c.DefaultRequestHeaders.Authorization = new("Bot", discordOptions.AppToken); - c.DefaultRequestHeaders.Add("User-Agent", $"DiscordBot (https://github.com/StevanFreeborn/steves-bot, {Instrumentation.SourceVersion})"); - }) - .AddStandardResilienceHandler(); - - return services; - } - public static IServiceCollection AddDiscordGatewayClient(this IServiceCollection services, Action? configure = null) { services.AddSingleton(sp => diff --git a/src/src/StevesBot.Worker/Discord/Rest/Requests/CreateMessageRequest.cs b/src/src/StevesBot.Worker/Discord/Rest/Requests/CreateMessageRequest.cs deleted file mode 100644 index cf96e12..0000000 --- a/src/src/StevesBot.Worker/Discord/Rest/Requests/CreateMessageRequest.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace StevesBot.Worker.Discord.Rest.Requests; - -internal sealed record CreateMessageRequest( - [property: JsonPropertyName("content")] string Content, - [property: JsonPropertyName("message_reference")] DiscordMessageReference? MessageReference -); \ No newline at end of file diff --git a/src/src/StevesBot.Worker/Discord/Rest/Responses/GatewayResponse.cs b/src/src/StevesBot.Worker/Discord/Rest/Responses/GatewayResponse.cs deleted file mode 100644 index e8f7a69..0000000 --- a/src/src/StevesBot.Worker/Discord/Rest/Responses/GatewayResponse.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace StevesBot.Worker.Discord.Rest.Responses; - -internal sealed record GatewayResponse( - [property: JsonPropertyName("url")] string Url -); \ No newline at end of file diff --git a/src/src/StevesBot.Worker/Discord/Shared/DiscordMessageReferenceTypes.cs b/src/src/StevesBot.Worker/Discord/Shared/DiscordMessageReferenceTypes.cs deleted file mode 100644 index 8d43052..0000000 --- a/src/src/StevesBot.Worker/Discord/Shared/DiscordMessageReferenceTypes.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace StevesBot.Worker.Discord.Shared; - -internal static class DiscordMessageReferenceTypes -{ - public const int Default = 0; - public const int Forward = 1; -} \ No newline at end of file diff --git a/src/src/StevesBot.Worker/Discord/Shared/DiscordUser.cs b/src/src/StevesBot.Worker/Discord/Shared/DiscordUser.cs deleted file mode 100644 index eba9acf..0000000 --- a/src/src/StevesBot.Worker/Discord/Shared/DiscordUser.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace StevesBot.Worker.Discord.Shared; - -internal sealed record DiscordUser -{ - [JsonPropertyName("id")] - public string Id { get; init; } = string.Empty; -} \ No newline at end of file diff --git a/src/src/StevesBot.Worker/StevesBot.Worker.csproj b/src/src/StevesBot.Worker/StevesBot.Worker.csproj index f66917c..026278e 100644 --- a/src/src/StevesBot.Worker/StevesBot.Worker.csproj +++ b/src/src/StevesBot.Worker/StevesBot.Worker.csproj @@ -8,15 +8,9 @@ - - - - - - - + diff --git a/src/src/StevesBot.Worker/Telemetry/Instrumentation.cs b/src/src/StevesBot.Worker/Telemetry/Instrumentation.cs deleted file mode 100644 index 9843dc0..0000000 --- a/src/src/StevesBot.Worker/Telemetry/Instrumentation.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace StevesBot.Worker.Telemetry; - -internal sealed class Instrumentation : IDisposable -{ - public const string SourceName = "StevesBot.Worker"; - public const string SourceVersion = "0.0.0"; - public readonly ActivitySource Source = new(SourceName, SourceVersion); - - public void Dispose() - { - Source.Dispose(); - } -} \ No newline at end of file diff --git a/src/src/StevesBot.Worker/Usings.cs b/src/src/StevesBot.Worker/Usings.cs index 2466a9e..11b7725 100644 --- a/src/src/StevesBot.Worker/Usings.cs +++ b/src/src/StevesBot.Worker/Usings.cs @@ -1,5 +1,3 @@ -global using System.Diagnostics; -global using System.Net.Http.Json; global using System.Net.WebSockets; global using System.Reflection; global using System.Text; @@ -8,21 +6,17 @@ global using System.Text.Json.Serialization; global using Microsoft.Extensions.Options; -global using OpenTelemetry.Exporter; -global using OpenTelemetry.Logs; -global using OpenTelemetry.Resources; -global using OpenTelemetry.Trace; +global using StevesBot.Library.Discord; +global using StevesBot.Library.Telemetry; global using StevesBot.Worker; global using StevesBot.Worker.Discord; global using StevesBot.Worker.Discord.Gateway; global using StevesBot.Worker.Discord.Gateway.Events; global using StevesBot.Worker.Discord.Gateway.Events.Data; -global using StevesBot.Worker.Discord.Rest; -global using StevesBot.Worker.Discord.Rest.Requests; -global using StevesBot.Worker.Discord.Rest.Responses; -global using StevesBot.Worker.Discord.Shared; +global using StevesBot.Library.Discord.Rest; +global using StevesBot.Library.Discord.Rest.Requests; +global using StevesBot.Library.Discord.Common; global using StevesBot.Worker.Handlers; -global using StevesBot.Worker.Telemetry; global using StevesBot.Worker.Threading; global using StevesBot.Worker.WebSockets; \ No newline at end of file diff --git a/src/tests/StevesBot.Library.Tests/StevesBot.Library.Tests.csproj b/src/tests/StevesBot.Library.Tests/StevesBot.Library.Tests.csproj new file mode 100644 index 0000000..7694b4b --- /dev/null +++ b/src/tests/StevesBot.Library.Tests/StevesBot.Library.Tests.csproj @@ -0,0 +1,35 @@ + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + + + + true + ./TestResults/Coverage/ + cobertura + [StevesBot.Lib]* + + + + + + + diff --git a/src/tests/StevesBot.Webhook.Tests/UnitTest1.cs b/src/tests/StevesBot.Webhook.Tests/UnitTest1.cs deleted file mode 100644 index 33fdda7..0000000 --- a/src/tests/StevesBot.Webhook.Tests/UnitTest1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace StevesBot.Webhook.Tests; - -public class UnitTest1 -{ - [Fact] - public void Test1() - { - - } -} \ No newline at end of file diff --git a/src/tests/StevesBot.Worker.Tests/Usings.cs b/src/tests/StevesBot.Worker.Tests/Usings.cs index 3e07822..eeafbcc 100644 --- a/src/tests/StevesBot.Worker.Tests/Usings.cs +++ b/src/tests/StevesBot.Worker.Tests/Usings.cs @@ -16,13 +16,14 @@ global using Moq; global using RichardSzalay.MockHttp; +global using StevesBot.Library.Discord; +global using StevesBot.Library.Discord.Common; +global using StevesBot.Library.Discord.Rest; +global using StevesBot.Library.Discord.Rest.Requests; global using StevesBot.Worker.Discord; global using StevesBot.Worker.Discord.Gateway; global using StevesBot.Worker.Discord.Gateway.Events; global using StevesBot.Worker.Discord.Gateway.Events.Data; -global using StevesBot.Worker.Discord.Rest; -global using StevesBot.Worker.Discord.Rest.Requests; -global using StevesBot.Worker.Discord.Shared; global using StevesBot.Worker.Tests.Integration.Infrastructure; global using StevesBot.Worker.Threading; global using StevesBot.Worker.WebSockets; \ No newline at end of file