diff --git a/src/Octobot.cs b/src/Octobot.cs index 5cffd70..2648338 100644 --- a/src/Octobot.cs +++ b/src/Octobot.cs @@ -24,12 +24,12 @@ namespace Octobot; public sealed class Octobot { - public static readonly AllowedMentions NoMentions = new( - Array.Empty<MentionType>(), Array.Empty<Snowflake>(), Array.Empty<Snowflake>()); - public const string RepositoryUrl = "https://github.com/LabsDevelopment/Octobot"; public const string IssuesUrl = $"{RepositoryUrl}/issues"; + public static readonly AllowedMentions NoMentions = new( + Array.Empty<MentionType>(), Array.Empty<Snowflake>(), Array.Empty<Snowflake>()); + public static async Task Main(string[] args) { var host = CreateHostBuilder(args).UseConsoleLifetime().Build(); @@ -86,12 +86,12 @@ public sealed class Octobot .AddPreparationErrorEvent<LoggingPreparationErrorEvent>() .AddPostExecutionEvent<ErrorLoggingPostExecutionEvent>() // Services - .AddSingleton<GuildDataService>() .AddSingleton<Utility>() + .AddSingleton<GuildDataService>() + .AddHostedService<GuildDataService>(provider => provider.GetRequiredService<GuildDataService>()) .AddHostedService<MemberUpdateService>() .AddHostedService<ScheduledEventUpdateService>() .AddHostedService<SongUpdateService>() - .AddHostedService<BackgroundGuildDataSaverService>() // Slash commands .AddCommandTree() .WithCommandGroup<AboutCommandGroup>() diff --git a/src/Services/BackgroundGuildDataSaverService.cs b/src/Services/BackgroundGuildDataSaverService.cs deleted file mode 100644 index 766ffe0..0000000 --- a/src/Services/BackgroundGuildDataSaverService.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.Extensions.Hosting; - -namespace Octobot.Services; - -public sealed class BackgroundGuildDataSaverService : BackgroundService -{ - private readonly GuildDataService _guildData; - - public BackgroundGuildDataSaverService(GuildDataService guildData) - { - _guildData = guildData; - } - - protected override async Task ExecuteAsync(CancellationToken ct) - { - using var timer = new PeriodicTimer(TimeSpan.FromMinutes(5)); - - while (await timer.WaitForNextTickAsync(ct)) - { - await _guildData.SaveAsync(ct); - } - } -} diff --git a/src/Services/GuildDataService.cs b/src/Services/GuildDataService.cs index 961c8f9..c9458a0 100644 --- a/src/Services/GuildDataService.cs +++ b/src/Services/GuildDataService.cs @@ -11,25 +11,23 @@ namespace Octobot.Services; /// <summary> /// Handles saving, loading, initializing and providing <see cref="GuildData" />. /// </summary> -public sealed class GuildDataService +public sealed class GuildDataService : BackgroundService { private readonly ConcurrentDictionary<Snowflake, GuildData> _datas = new(); private readonly ILogger<GuildDataService> _logger; - // https://github.com/dotnet/aspnetcore/issues/39139 - public GuildDataService( - IHostApplicationLifetime lifetime, ILogger<GuildDataService> logger) + public GuildDataService(ILogger<GuildDataService> logger) { _logger = logger; - lifetime.ApplicationStopping.Register(ApplicationStopping); } - private void ApplicationStopping() + public override Task StopAsync(CancellationToken ct) { - SaveAsync(CancellationToken.None).GetAwaiter().GetResult(); + base.StopAsync(ct); + return SaveAsync(ct); } - public Task SaveAsync(CancellationToken ct) + private Task SaveAsync(CancellationToken ct) { var tasks = new List<Task>(); var datas = _datas.Values.ToArray(); @@ -58,6 +56,16 @@ public sealed class GuildDataService File.Delete(tempFilePath); } + protected override async Task ExecuteAsync(CancellationToken ct) + { + using var timer = new PeriodicTimer(TimeSpan.FromMinutes(5)); + + while (await timer.WaitForNextTickAsync(ct)) + { + await SaveAsync(ct); + } + } + public async Task<GuildData> GetData(Snowflake guildId, CancellationToken ct = default) { return _datas.TryGetValue(guildId, out var data) ? data : await InitializeData(guildId, ct);