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:
parent
d34463ae48
commit
5e4087aa3f
9 changed files with 22 additions and 24 deletions
|
@ -63,6 +63,7 @@ public sealed class Boyfriend
|
|||
{
|
||||
options.Intents |= GatewayIntents.MessageContents
|
||||
| GatewayIntents.GuildMembers
|
||||
| GatewayIntents.GuildPresences
|
||||
| GatewayIntents.GuildScheduledEvents;
|
||||
});
|
||||
services.Configure<CacheSettings>(
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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()
|
||||
|
|
Loading…
Add table
Reference in a new issue