mirror of
https://github.com/TeamOctolings/Octobot.git
synced 2025-05-01 03:29:54 +03:00
Check interactions in MemberUpdateService before operating on members (#177)
This PR fixes an issue that caused REST errors to occur in MemberUpdateService if the bot tries to interact with a member it can't interact with. The issue is fixed by returning from TickMemberDataAsync early if the member cannot be interacted with. An error message was planned, but it requires adding a lot of services and severely increasing the complexity. Contributors may feel free to add one if they deem so necessary.
This commit is contained in:
parent
5f0d806213
commit
f12d6d13c5
3 changed files with 80 additions and 39 deletions
|
@ -29,14 +29,16 @@ public sealed partial class MemberUpdateService : BackgroundService
|
|||
private readonly IDiscordRestGuildAPI _guildApi;
|
||||
private readonly GuildDataService _guildData;
|
||||
private readonly ILogger<MemberUpdateService> _logger;
|
||||
private readonly UtilityService _utility;
|
||||
|
||||
public MemberUpdateService(IDiscordRestChannelAPI channelApi, IDiscordRestGuildAPI guildApi,
|
||||
GuildDataService guildData, ILogger<MemberUpdateService> logger)
|
||||
GuildDataService guildData, ILogger<MemberUpdateService> logger, UtilityService utility)
|
||||
{
|
||||
_channelApi = channelApi;
|
||||
_guildApi = guildApi;
|
||||
_guildData = guildData;
|
||||
_logger = logger;
|
||||
_utility = utility;
|
||||
}
|
||||
|
||||
protected override async Task ExecuteAsync(CancellationToken ct)
|
||||
|
@ -90,21 +92,20 @@ public sealed partial class MemberUpdateService : BackgroundService
|
|||
return failedResults.AggregateErrors();
|
||||
}
|
||||
|
||||
var interactionResult
|
||||
= await _utility.CheckInteractionsAsync(guildId, null, id, "Update", ct);
|
||||
if (!interactionResult.IsSuccess)
|
||||
{
|
||||
return Result.FromError(interactionResult);
|
||||
}
|
||||
|
||||
var canInteract = interactionResult.Entity is null;
|
||||
|
||||
if (data.MutedUntil is null)
|
||||
{
|
||||
data.Roles = guildMember.Roles.ToList().ConvertAll(r => r.Value);
|
||||
}
|
||||
|
||||
var autoUnmuteResult = await TryAutoUnmuteAsync(guildId, id, data, ct);
|
||||
failedResults.AddIfFailed(autoUnmuteResult);
|
||||
|
||||
if (!defaultRole.Empty() && !data.Roles.Contains(defaultRole.Value))
|
||||
{
|
||||
var addResult = await _guildApi.AddGuildMemberRoleAsync(
|
||||
guildId, id, defaultRole, ct: ct);
|
||||
failedResults.AddIfFailed(addResult);
|
||||
}
|
||||
|
||||
if (!guildMember.User.IsDefined(out var user))
|
||||
{
|
||||
failedResults.AddIfFailed(new ArgumentNullError(nameof(guildMember.User)));
|
||||
|
@ -117,6 +118,21 @@ public sealed partial class MemberUpdateService : BackgroundService
|
|||
failedResults.AddIfFailed(reminderTickResult);
|
||||
}
|
||||
|
||||
if (!canInteract)
|
||||
{
|
||||
return Result.FromSuccess();
|
||||
}
|
||||
|
||||
var autoUnmuteResult = await TryAutoUnmuteAsync(guildId, id, data, ct);
|
||||
failedResults.AddIfFailed(autoUnmuteResult);
|
||||
|
||||
if (!defaultRole.Empty() && !data.Roles.Contains(defaultRole.Value))
|
||||
{
|
||||
var addResult = await _guildApi.AddGuildMemberRoleAsync(
|
||||
guildId, id, defaultRole, ct: ct);
|
||||
failedResults.AddIfFailed(addResult);
|
||||
}
|
||||
|
||||
if (GuildSettings.RenameHoistedUsers.Get(guildData.Settings))
|
||||
{
|
||||
var filterResult = await FilterNicknameAsync(guildId, user, guildMember, ct);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue