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
| GatewayIntents.GuildMembers
| GatewayIntents.GuildPresences
| GatewayIntents.GuildScheduledEvents;
});
services.Configure<CacheSettings>(

View file

@ -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();

View file

@ -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);

View file

@ -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,

View file

@ -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;
}

View file

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

View file

@ -43,7 +43,13 @@ public class GuildLoadedResponder : IResponder<IGuildCreate>
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();

View file

@ -38,12 +38,13 @@ public class GuildMemberJoinedResponder : IResponder<IGuildMemberAdd>
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);

View file

@ -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<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);
if (data is null)
{
@ -123,10 +115,8 @@ public sealed class GuildDataService : IHostedService
jsonSettings ?? new JsonObject(), settingsPath,
await events ?? new Dictionary<ulong, ScheduledEventData>(), 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<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()