1
0
Fork 1
mirror of https://github.com/TeamOctolings/Octobot.git synced 2025-04-20 00:43:36 +03:00

Backfill Member Data when a guild is loaded or when a new member joins a guild

Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>
This commit is contained in:
Octol1ttle 2023-08-03 12:59:56 +05:00
parent d34463ae48
commit 5e4087aa3f
Signed by: Octol1ttle
GPG key ID: B77C34313AEE1FFF
9 changed files with 22 additions and 24 deletions

View file

@ -63,6 +63,7 @@ public sealed class Boyfriend
{ {
options.Intents |= GatewayIntents.MessageContents options.Intents |= GatewayIntents.MessageContents
| GatewayIntents.GuildMembers | GatewayIntents.GuildMembers
| GatewayIntents.GuildPresences
| GatewayIntents.GuildScheduledEvents; | GatewayIntents.GuildScheduledEvents;
}); });
services.Configure<CacheSettings>( services.Configure<CacheSettings>(

View file

@ -171,7 +171,7 @@ public class BanCommandGroup : CommandGroup
return Result.FromError(banResult.Error); return Result.FromError(banResult.Error);
} }
var memberData = data.GetMemberData(target.ID); var memberData = data.GetOrCreateMemberData(target.ID);
memberData.BannedUntil memberData.BannedUntil
= duration is not null ? DateTimeOffset.UtcNow.Add(duration.Value) : DateTimeOffset.MaxValue; = duration is not null ? DateTimeOffset.UtcNow.Add(duration.Value) : DateTimeOffset.MaxValue;
memberData.Roles.Clear(); memberData.Roles.Clear();

View file

@ -153,7 +153,7 @@ public class KickCommandGroup : CommandGroup
return Result.FromError(kickResult.Error); 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 title = string.Format(Messages.UserKicked, target.GetTag());
var description = string.Format(Messages.DescriptionActionReason, reason); var description = string.Format(Messages.DescriptionActionReason, reason);

View file

@ -77,7 +77,7 @@ public class RemindCommandGroup : CommandGroup
{ {
var remindAt = DateTimeOffset.UtcNow.Add(@in); var remindAt = DateTimeOffset.UtcNow.Add(@in);
data.GetMemberData(user.ID).Reminders.Add( data.GetOrCreateMemberData(user.ID).Reminders.Add(
new Reminder new Reminder
{ {
At = remindAt, At = remindAt,

View file

@ -30,14 +30,14 @@ public sealed class GuildData
MemberDataPath = memberDataPath; MemberDataPath = memberDataPath;
} }
public MemberData GetMemberData(Snowflake userId) public MemberData GetOrCreateMemberData(Snowflake userId)
{ {
if (MemberData.TryGetValue(userId.Value, out var existing)) if (MemberData.TryGetValue(userId.Value, out var existing))
{ {
return existing; return existing;
} }
var newData = new MemberData(userId.Value, null); var newData = new MemberData(userId.Value);
MemberData.Add(userId.Value, newData); MemberData.Add(userId.Value, newData);
return newData; return newData;
} }

View file

@ -5,7 +5,7 @@ namespace Boyfriend.Data;
/// </summary> /// </summary>
public sealed class MemberData public sealed class MemberData
{ {
public MemberData(ulong id, DateTimeOffset? bannedUntil) public MemberData(ulong id, DateTimeOffset? bannedUntil = null)
{ {
Id = id; Id = id;
BannedUntil = bannedUntil; BannedUntil = bannedUntil;

View file

@ -43,7 +43,13 @@ public class GuildLoadedResponder : IResponder<IGuildCreate>
var guild = gatewayEvent.Guild.AsT0; var guild = gatewayEvent.Guild.AsT0;
_logger.LogInformation("Joined guild \"{Name}\"", guild.Name); _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)) if (!GuildSettings.ReceiveStartupMessages.Get(cfg))
{ {
return Result.FromSuccess(); return Result.FromSuccess();

View file

@ -38,12 +38,13 @@ public class GuildMemberJoinedResponder : IResponder<IGuildMemberAdd>
var data = await _guildData.GetData(gatewayEvent.GuildID, ct); var data = await _guildData.GetData(gatewayEvent.GuildID, ct);
var cfg = data.Settings; var cfg = data.Settings;
var memberData = data.GetOrCreateMemberData(user.ID);
if (GuildSettings.ReturnRolesOnRejoin.Get(cfg)) if (GuildSettings.ReturnRolesOnRejoin.Get(cfg))
{ {
var result = await _guildApi.ModifyGuildMemberAsync( var result = await _guildApi.ModifyGuildMemberAsync(
gatewayEvent.GuildID, user.ID, 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) if (!result.IsSuccess)
{ {
return Result.FromError(result.Error); return Result.FromError(result.Error);

View file

@ -71,15 +71,7 @@ public sealed class GuildDataService : IHostedService
var memberDataPath = $"{guildId}/MemberData"; var memberDataPath = $"{guildId}/MemberData";
var settingsPath = $"{guildId}/Settings.json"; var settingsPath = $"{guildId}/Settings.json";
var scheduledEventsPath = $"{guildId}/ScheduledEvents.json"; var scheduledEventsPath = $"{guildId}/ScheduledEvents.json";
if (!Directory.Exists(idString)) Directory.CreateDirectory(idString);
{
Directory.CreateDirectory(idString);
}
if (!Directory.Exists(memberDataPath))
{
Directory.CreateDirectory(memberDataPath);
}
if (!File.Exists(settingsPath)) if (!File.Exists(settingsPath))
{ {
@ -101,9 +93,9 @@ public sealed class GuildDataService : IHostedService
eventsStream, cancellationToken: ct); eventsStream, cancellationToken: ct);
var memberData = new Dictionary<ulong, MemberData>(); var memberData = new Dictionary<ulong, MemberData>();
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<MemberData>(dataStream, cancellationToken: ct); var data = await JsonSerializer.DeserializeAsync<MemberData>(dataStream, cancellationToken: ct);
if (data is null) if (data is null)
{ {
@ -123,10 +115,8 @@ public sealed class GuildDataService : IHostedService
jsonSettings ?? new JsonObject(), settingsPath, jsonSettings ?? new JsonObject(), settingsPath,
await events ?? new Dictionary<ulong, ScheduledEventData>(), scheduledEventsPath, await events ?? new Dictionary<ulong, ScheduledEventData>(), scheduledEventsPath,
memberData, memberDataPath); memberData, memberDataPath);
while (!_datas.ContainsKey(guildId))
{ _datas.TryAdd(guildId, finalData);
_datas.TryAdd(guildId, finalData);
}
return finalData; return finalData;
} }
@ -138,7 +128,7 @@ public sealed class GuildDataService : IHostedService
public async Task<MemberData> GetMemberData(Snowflake guildId, Snowflake userId, CancellationToken ct = default) public async Task<MemberData> GetMemberData(Snowflake guildId, Snowflake userId, CancellationToken ct = default)
{ {
return (await GetData(guildId, ct)).GetMemberData(userId); return (await GetData(guildId, ct)).GetOrCreateMemberData(userId);
} }
public ICollection<Snowflake> GetGuildIds() public ICollection<Snowflake> GetGuildIds()