mirror of
https://github.com/TeamOctolings/Octobot.git
synced 2025-01-31 17:19:00 +03:00
Octol1ttle
f260681b39
GuildUpdateService is a service that contains way too many responsibilities with everything strictly coupled to each other. The code is buggy, hard to refactor and swallows errors. This prompted me to make this PR, which splits it into three independant services: - SongUpdateService (responsible for changing songs presence); - MemberUpdateService (responsible for updating member datas: unbanning users, adding the default role, sending reminders, filtering nicknames); - ScheduledEventUpdateService (responsible for updating scheduled events: sending notifications, automatically starting events). All of these services and their methods use Results to push errors all the way up in the stack, making sure no error is missed. To make logging and debugging easier, an extension method for `ILogger` was created - `LogResult`. The method checks if the result was successful or if its failure was caused by a user or environment error before logging anything - providing cleaner code and logs. `ExceptionError`s will also have their exception stacktrace and type logged (except in Remora code). This PR also fixes an issue that prevented banned users from being unbanned when their punishment was over. --------- Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>
66 lines
2.4 KiB
C#
66 lines
2.4 KiB
C#
using Microsoft.Extensions.Hosting;
|
|
using Remora.Discord.API.Abstractions.Objects;
|
|
using Remora.Discord.API.Gateway.Commands;
|
|
using Remora.Discord.API.Objects;
|
|
using Remora.Discord.Gateway;
|
|
|
|
namespace Boyfriend.Services.Update;
|
|
|
|
public sealed class SongUpdateService : BackgroundService
|
|
{
|
|
private static readonly (string Name, TimeSpan Duration)[] SongList =
|
|
{
|
|
("UNDEAD CORPORATION - The Empress", new TimeSpan(0, 4, 34)),
|
|
("UNDEAD CORPORATION - Everything will freeze", new TimeSpan(0, 3, 17)),
|
|
("Splatoon 3 - Rockagilly Blues (Yoko & the Gold Bazookas)", new TimeSpan(0, 3, 37)),
|
|
("Splatoon 3 - Seep and Destroy", new TimeSpan(0, 2, 42)),
|
|
("IA - A Tale of Six Trillion Years and a Night", new TimeSpan(0, 3, 40)),
|
|
("Manuel - Gas Gas Gas", new TimeSpan(0, 3, 17)),
|
|
("Camellia - Flamewall", new TimeSpan(0, 6, 50)),
|
|
("Jukio Kallio, Daniel Hagström - Fall 'n' Roll", new TimeSpan(0, 3, 14)),
|
|
("SCATTLE - Hypertension", new TimeSpan(0, 3, 18)),
|
|
("KEYGEN CHURCH - Tenebre Rosso Sangue", new TimeSpan(0, 3, 53)),
|
|
("Chipzel - Swing Me Another 6", new TimeSpan(0, 5, 32)),
|
|
("Noisecream - Mist of Rage", new TimeSpan(0, 2, 25))
|
|
};
|
|
|
|
private readonly List<Activity> _activityList = new(1)
|
|
{
|
|
new Activity("with Remora.Discord", ActivityType.Game)
|
|
};
|
|
|
|
private readonly DiscordGatewayClient _client;
|
|
private readonly GuildDataService _guildData;
|
|
|
|
private uint _nextSongIndex;
|
|
|
|
public SongUpdateService(DiscordGatewayClient client, GuildDataService guildData)
|
|
{
|
|
_client = client;
|
|
_guildData = guildData;
|
|
}
|
|
|
|
protected override async Task ExecuteAsync(CancellationToken ct)
|
|
{
|
|
while (_guildData.GetGuildIds().Count is 0)
|
|
{
|
|
await Task.Delay(TimeSpan.FromSeconds(5), ct);
|
|
}
|
|
|
|
while (!ct.IsCancellationRequested)
|
|
{
|
|
var nextSong = SongList[_nextSongIndex];
|
|
_activityList[0] = new Activity(nextSong.Name, ActivityType.Listening);
|
|
_client.SubmitCommand(
|
|
new UpdatePresence(
|
|
UserStatus.Online, false, DateTimeOffset.UtcNow, _activityList));
|
|
_nextSongIndex++;
|
|
if (_nextSongIndex >= SongList.Length)
|
|
{
|
|
_nextSongIndex = 0;
|
|
}
|
|
|
|
await Task.Delay(nextSong.Duration, ct);
|
|
}
|
|
}
|
|
}
|