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
|
options.Intents |= GatewayIntents.MessageContents
|
||||||
| GatewayIntents.GuildMembers
|
| GatewayIntents.GuildMembers
|
||||||
|
| GatewayIntents.GuildPresences
|
||||||
| GatewayIntents.GuildScheduledEvents;
|
| GatewayIntents.GuildScheduledEvents;
|
||||||
});
|
});
|
||||||
services.Configure<CacheSettings>(
|
services.Configure<CacheSettings>(
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Add table
Reference in a new issue