From 0538cbb16445f368e3fb9262579798b25a3b6bbc Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Fri, 2 Jun 2023 17:08:55 +0500 Subject: [PATCH] Save important data about scheduled events to disk Signed-off-by: Octol1ttle --- Data/GuildData.cs | 13 ++++++++++++- Data/ScheduledEventData.cs | 12 ++++++++++++ Data/Services/GuildDataService.cs | 25 +++++++++++++++++++------ 3 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 Data/ScheduledEventData.cs diff --git a/Data/GuildData.cs b/Data/GuildData.cs index fcacfd8..0b5495a 100644 --- a/Data/GuildData.cs +++ b/Data/GuildData.cs @@ -1,11 +1,22 @@ +using System.Globalization; + namespace Boyfriend.Data; public class GuildData { public readonly GuildConfiguration Configuration; public readonly string ConfigurationPath; - public GuildData(GuildConfiguration configuration, string configurationPath) { + public readonly Dictionary ScheduledEvents; + public readonly string ScheduledEventsPath; + + public GuildData( + GuildConfiguration configuration, string configurationPath, + Dictionary scheduledEvents, string scheduledEventsPath) { Configuration = configuration; ConfigurationPath = configurationPath; + ScheduledEvents = scheduledEvents; + ScheduledEventsPath = scheduledEventsPath; } + + public CultureInfo Culture => Configuration.Culture; } diff --git a/Data/ScheduledEventData.cs b/Data/ScheduledEventData.cs new file mode 100644 index 0000000..5ef9393 --- /dev/null +++ b/Data/ScheduledEventData.cs @@ -0,0 +1,12 @@ +using Remora.Discord.API.Abstractions.Objects; + +namespace Boyfriend.Data; + +public class ScheduledEventData { + public DateTimeOffset? ActualStartTime; + public GuildScheduledEventStatus Status; + + public ScheduledEventData(GuildScheduledEventStatus status) { + Status = status; + } +} diff --git a/Data/Services/GuildDataService.cs b/Data/Services/GuildDataService.cs index da9a54e..cb5bb0e 100644 --- a/Data/Services/GuildDataService.cs +++ b/Data/Services/GuildDataService.cs @@ -14,14 +14,17 @@ public class GuildDataService : IHostedService { public async Task StopAsync(CancellationToken ct) { var tasks = new List(); foreach (var data in _datas.Values) { - await using var stream = File.OpenWrite(data.ConfigurationPath); - tasks.Add(JsonSerializer.SerializeAsync(stream, data.Configuration, cancellationToken: ct)); + await using var configStream = File.OpenWrite(data.ConfigurationPath); + tasks.Add(JsonSerializer.SerializeAsync(configStream, data.Configuration, cancellationToken: ct)); + + await using var eventsStream = File.OpenWrite(data.ScheduledEventsPath); + tasks.Add(JsonSerializer.SerializeAsync(eventsStream, data.ScheduledEvents, cancellationToken: ct)); } await Task.WhenAll(tasks); } - private async Task GetData(Snowflake guildId, CancellationToken ct = default) { + public async Task GetData(Snowflake guildId, CancellationToken ct = default) { return _datas.TryGetValue(guildId, out var data) ? data : await InitializeData(guildId, ct); } @@ -29,16 +32,26 @@ public class GuildDataService : IHostedService { var idString = $"{guildId}"; var memberDataDir = $"{guildId}/MemberData"; var configurationPath = $"{guildId}/Configuration.json"; + var scheduledEventsPath = $"{guildId}/ScheduledEvents.json"; if (!Directory.Exists(idString)) Directory.CreateDirectory(idString); if (!Directory.Exists(memberDataDir)) Directory.CreateDirectory(memberDataDir); if (!File.Exists(configurationPath)) await File.WriteAllTextAsync(configurationPath, "{}", ct); + if (!File.Exists(scheduledEventsPath)) await File.WriteAllTextAsync(scheduledEventsPath, "{}", ct); - await using var stream = File.OpenRead(configurationPath); + await using var configurationStream = File.OpenRead(configurationPath); var configuration = JsonSerializer.DeserializeAsync( - stream, cancellationToken: ct); + configurationStream, cancellationToken: ct); - var data = new GuildData(await configuration ?? new GuildConfiguration(), configurationPath); + await using var eventsStream = File.OpenRead(scheduledEventsPath); + var events + = JsonSerializer.DeserializeAsync>( + eventsStream, cancellationToken: ct); + + var data = new GuildData( + await configuration ?? new GuildConfiguration(), configurationPath, + await events ?? new Dictionary(), + scheduledEventsPath); _datas.Add(guildId, data); return data; }