/// <inheritdoc />
    public async Task <Result> RespondAsync(IMessageReactionRemoveAll gatewayEvent, CancellationToken ct = default)
    {
        if (!gatewayEvent.GuildID.IsDefined(out var guildID))
        {
            return(Result.FromSuccess());
        }

        var autoroles = await _autoroles.GetAutorolesAsync
                        (
            guildID,
            q => q
            .Where(a => a.IsEnabled)
            .Where
            (
                a => a.Conditions.Any
                (
                    c =>
                    c is ReactionCondition &&
                    ((ReactionCondition)c).MessageID == gatewayEvent.MessageID &&
                    ((ReactionCondition)c).ChannelID == gatewayEvent.ChannelID
                )
            ),
            ct
                        );

        var users = new List <Snowflake>();
        Optional <Snowflake> after = default;

        while (true)
        {
            var listMembers = await _guildAPI.ListGuildMembersAsync(guildID, after : after, ct : ct);

            if (!listMembers.IsSuccess)
            {
                return(Result.FromError(listMembers));
            }

            var members = listMembers.Entity;
            if (members.Count == 0)
            {
                break;
            }

            users.AddRange
            (
                listMembers.Entity
                .Where(m => !m.User.Value.IsBot.HasValue || !m.User.Value.IsBot.Value)
                .Select(m => m.User.Value.ID)
            );

            after = users.Last();
        }

        foreach (var autorole in autoroles)
        {
            foreach (var user in users)
            {
                using var transaction = TransactionFactory.Create();

                var updateAutorole = await _autoroleUpdates.UpdateAutoroleForUserAsync(autorole, guildID, user, ct);

                if (!updateAutorole.IsSuccess)
                {
                    return(Result.FromError(updateAutorole));
                }

                transaction.Complete();
            }
        }

        return(Result.FromSuccess());
    }