diff --git a/src/Octobot.cs b/src/Octobot.cs index 8e60caf..662d1bf 100644 --- a/src/Octobot.cs +++ b/src/Octobot.cs @@ -89,7 +89,6 @@ public sealed class Octobot // Services .AddSingleton() .AddSingleton() - .AddHostedService() .AddHostedService() .AddHostedService() .AddHostedService() diff --git a/src/Responders/GuildUnloadedResponder.cs b/src/Responders/GuildUnloadedResponder.cs new file mode 100644 index 0000000..de72628 --- /dev/null +++ b/src/Responders/GuildUnloadedResponder.cs @@ -0,0 +1,37 @@ +using JetBrains.Annotations; +using Microsoft.Extensions.Logging; +using Octobot.Data; +using Octobot.Services; +using Remora.Discord.API.Abstractions.Gateway.Events; +using Remora.Discord.API.Gateway.Events; +using Remora.Discord.Gateway.Responders; +using Remora.Results; + +namespace Octobot.Responders; + +/// +/// Handles sending a message to a guild that has just initialized if that guild +/// has enabled +/// +[UsedImplicitly] +public class GuildUnloadedResponder : IResponder +{ + private readonly GuildDataService _guildData; + private readonly ILogger _logger; + + public GuildUnloadedResponder( + GuildDataService guildData, ILogger logger) + { + _guildData = guildData; + _logger = logger; + } + + public async Task RespondAsync(IGuildDelete gatewayEvent, CancellationToken ct = default) + { + var guildId = gatewayEvent.ID; + await _guildData.RemoveGuildId(guildId); + _logger.LogInformation("Left guild {guildId}", guildId); + + return Result.FromSuccess(); + } +} diff --git a/src/Services/Update/GuildUpdateService.cs b/src/Services/Update/GuildUpdateService.cs deleted file mode 100644 index d13423b..0000000 --- a/src/Services/Update/GuildUpdateService.cs +++ /dev/null @@ -1,51 +0,0 @@ -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; -using Remora.Discord.API.Abstractions.Rest; -using Remora.Rest.Core; -using Remora.Results; - -namespace Octobot.Services.Update; - -public sealed class GuildUpdateService : BackgroundService -{ - private readonly IDiscordRestGuildAPI _guildApi; - private readonly GuildDataService _guildData; - private readonly ILogger _logger; - - public GuildUpdateService(IDiscordRestGuildAPI guildApi, - GuildDataService guildData, ILogger logger) - { - _guildApi = guildApi; - _guildData = guildData; - _logger = logger; - } - - protected override async Task ExecuteAsync(CancellationToken ct) - { - using var timer = new PeriodicTimer(TimeSpan.FromSeconds(1)); - - while (await timer.WaitForNextTickAsync(ct)) - { - var guildIds = _guildData.GetGuildIds(); - foreach (var id in guildIds) - { - var tickResult = await TickGuildsAsync(id, ct); - _logger.LogResult(tickResult, $"Error in guild update for guild {id}."); - } - } - } - - private async Task TickGuildsAsync(Snowflake guildId, CancellationToken ct) - { - var getGuildResult = await _guildApi.GetGuildAsync(guildId, ct: ct); - if (getGuildResult.IsSuccess) - { - return Result.FromSuccess(); - } - - await _guildData.RemoveGuildId(guildId); - _logger.LogInformation("Left guild {guildId}", guildId); - - return Result.FromSuccess(); - } -}