diff --git a/src/Boyfriend.cs b/src/Boyfriend.cs index a1b6fbd..b4e9a63 100644 --- a/src/Boyfriend.cs +++ b/src/Boyfriend.cs @@ -63,6 +63,7 @@ public sealed class Boyfriend { options.Intents |= GatewayIntents.MessageContents | GatewayIntents.GuildMembers + | GatewayIntents.GuildPresences | GatewayIntents.GuildScheduledEvents; }); services.Configure( diff --git a/src/Commands/BanCommandGroup.cs b/src/Commands/BanCommandGroup.cs index ea03009..df1d18f 100644 --- a/src/Commands/BanCommandGroup.cs +++ b/src/Commands/BanCommandGroup.cs @@ -171,7 +171,7 @@ public class BanCommandGroup : CommandGroup return Result.FromError(banResult.Error); } - var memberData = data.GetMemberData(target.ID); + var memberData = data.GetOrCreateMemberData(target.ID); memberData.BannedUntil = duration is not null ? DateTimeOffset.UtcNow.Add(duration.Value) : DateTimeOffset.MaxValue; memberData.Roles.Clear(); diff --git a/src/Commands/KickCommandGroup.cs b/src/Commands/KickCommandGroup.cs index 45da191..88d746f 100644 --- a/src/Commands/KickCommandGroup.cs +++ b/src/Commands/KickCommandGroup.cs @@ -153,7 +153,7 @@ public class KickCommandGroup : CommandGroup return Result.FromError(kickResult.Error); } - data.GetMemberData(target.ID).Roles.Clear(); + data.GetOrCreateMemberData(target.ID).Roles.Clear(); var title = string.Format(Messages.UserKicked, target.GetTag()); var description = string.Format(Messages.DescriptionActionReason, reason); diff --git a/src/Commands/RemindCommandGroup.cs b/src/Commands/RemindCommandGroup.cs index 3f588aa..cabbbeb 100644 --- a/src/Commands/RemindCommandGroup.cs +++ b/src/Commands/RemindCommandGroup.cs @@ -77,7 +77,7 @@ public class RemindCommandGroup : CommandGroup { var remindAt = DateTimeOffset.UtcNow.Add(@in); - data.GetMemberData(user.ID).Reminders.Add( + data.GetOrCreateMemberData(user.ID).Reminders.Add( new Reminder { At = remindAt, diff --git a/src/Data/GuildData.cs b/src/Data/GuildData.cs index 5adb869..2e14e17 100644 --- a/src/Data/GuildData.cs +++ b/src/Data/GuildData.cs @@ -30,14 +30,14 @@ public sealed class GuildData MemberDataPath = memberDataPath; } - public MemberData GetMemberData(Snowflake userId) + public MemberData GetOrCreateMemberData(Snowflake userId) { if (MemberData.TryGetValue(userId.Value, out var existing)) { return existing; } - var newData = new MemberData(userId.Value, null); + var newData = new MemberData(userId.Value); MemberData.Add(userId.Value, newData); return newData; } diff --git a/src/Data/MemberData.cs b/src/Data/MemberData.cs index f028938..1ff2bc0 100644 --- a/src/Data/MemberData.cs +++ b/src/Data/MemberData.cs @@ -5,7 +5,7 @@ namespace Boyfriend.Data; /// public sealed class MemberData { - public MemberData(ulong id, DateTimeOffset? bannedUntil) + public MemberData(ulong id, DateTimeOffset? bannedUntil = null) { Id = id; BannedUntil = bannedUntil; diff --git a/src/Responders/GuildLoadedResponder.cs b/src/Responders/GuildLoadedResponder.cs index 547e5ac..9dd2f97 100644 --- a/src/Responders/GuildLoadedResponder.cs +++ b/src/Responders/GuildLoadedResponder.cs @@ -43,7 +43,13 @@ public class GuildLoadedResponder : IResponder var guild = gatewayEvent.Guild.AsT0; _logger.LogInformation("Joined guild \"{Name}\"", guild.Name); - var cfg = await _guildData.GetSettings(guild.ID, ct); + var data = await _guildData.GetData(guild.ID, ct); + var cfg = data.Settings; + foreach (var member in guild.Members.Where(m => m.User.HasValue)) + { + data.GetOrCreateMemberData(member.User.Value.ID); + } + if (!GuildSettings.ReceiveStartupMessages.Get(cfg)) { return Result.FromSuccess(); diff --git a/src/Responders/GuildMemberJoinedResponder.cs b/src/Responders/GuildMemberJoinedResponder.cs index b2069bf..5699008 100644 --- a/src/Responders/GuildMemberJoinedResponder.cs +++ b/src/Responders/GuildMemberJoinedResponder.cs @@ -38,12 +38,13 @@ public class GuildMemberJoinedResponder : IResponder var data = await _guildData.GetData(gatewayEvent.GuildID, ct); var cfg = data.Settings; + var memberData = data.GetOrCreateMemberData(user.ID); if (GuildSettings.ReturnRolesOnRejoin.Get(cfg)) { var result = await _guildApi.ModifyGuildMemberAsync( gatewayEvent.GuildID, user.ID, - roles: data.GetMemberData(user.ID).Roles.ConvertAll(r => r.ToSnowflake()), ct: ct); + roles: memberData.Roles.ConvertAll(r => r.ToSnowflake()), ct: ct); if (!result.IsSuccess) { return Result.FromError(result.Error); diff --git a/src/Services/GuildDataService.cs b/src/Services/GuildDataService.cs index fac1b0a..0ded110 100644 --- a/src/Services/GuildDataService.cs +++ b/src/Services/GuildDataService.cs @@ -71,15 +71,7 @@ public sealed class GuildDataService : IHostedService var memberDataPath = $"{guildId}/MemberData"; var settingsPath = $"{guildId}/Settings.json"; var scheduledEventsPath = $"{guildId}/ScheduledEvents.json"; - if (!Directory.Exists(idString)) - { - Directory.CreateDirectory(idString); - } - - if (!Directory.Exists(memberDataPath)) - { - Directory.CreateDirectory(memberDataPath); - } + Directory.CreateDirectory(idString); if (!File.Exists(settingsPath)) { @@ -101,9 +93,9 @@ public sealed class GuildDataService : IHostedService eventsStream, cancellationToken: ct); var memberData = new Dictionary(); - foreach (var dataPath in Directory.GetFiles(memberDataPath)) + foreach (var dataFileInfo in Directory.CreateDirectory(memberDataPath).GetFiles()) { - await using var dataStream = File.OpenRead(dataPath); + await using var dataStream = dataFileInfo.OpenRead(); var data = await JsonSerializer.DeserializeAsync(dataStream, cancellationToken: ct); if (data is null) { @@ -123,10 +115,8 @@ public sealed class GuildDataService : IHostedService jsonSettings ?? new JsonObject(), settingsPath, await events ?? new Dictionary(), scheduledEventsPath, memberData, memberDataPath); - while (!_datas.ContainsKey(guildId)) - { - _datas.TryAdd(guildId, finalData); - } + + _datas.TryAdd(guildId, finalData); return finalData; } @@ -138,7 +128,7 @@ public sealed class GuildDataService : IHostedService public async Task GetMemberData(Snowflake guildId, Snowflake userId, CancellationToken ct = default) { - return (await GetData(guildId, ct)).GetMemberData(userId); + return (await GetData(guildId, ct)).GetOrCreateMemberData(userId); } public ICollection GetGuildIds()