public async Task <Result> RespondAsync(IMessageReactionAdd ev, CancellationToken ct = default)
    {
        if (ev.ChannelID.Value != _discordSettings.FeedbackChannelId ||
            !ev.GuildID.HasValue ||
            !ev.Member.HasValue ||
            ev.Member.Value.User.HasValue && ev.Member.Value.User.Value.IsBot.HasValue &&
            ev.Member.Value.User.Value.IsBot.Value ||
            !ev.Emoji.Name.HasValue ||
            ev.Emoji.Name.Value is null ||
            !_protectedEmojis.Contains(ev.Emoji.Name.Value)
            )
        {
            return(Result.FromSuccess());
        }

        var getChannelResult = await _channelApi.GetChannelAsync(ev.ChannelID, ct);

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

        var getGuildRolesResult = await _guildApi.GetGuildRolesAsync(ev.GuildID.Value, ct);

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

        var channel      = getChannelResult.Entity;
        var guildRoles   = getGuildRolesResult.Entity;
        var everyoneRole = guildRoles.FirstOrDefault(r => r.ID == ev.GuildID.Value);

        if (everyoneRole is null)
        {
            return(new NotFoundError("No @everyone role found."));
        }

        var memberRoles         = guildRoles.Where(r => ev.Member.Value.Roles.Contains(r.ID)).ToList();
        var computedPermissions = channel.PermissionOverwrites.HasValue
            ? DiscordPermissionSet.ComputePermissions(ev.UserID, everyoneRole, memberRoles,
                                                      channel.PermissionOverwrites.Value)
            : DiscordPermissionSet.ComputePermissions(ev.UserID, everyoneRole, memberRoles);

        return(computedPermissions.HasPermission(DiscordPermission.Administrator) ||
               computedPermissions.HasPermission(DiscordPermission.BanMembers)
            ? Result.FromSuccess()
            : await _channelApi.DeleteUserReactionAsync(ev.ChannelID, ev.MessageID, ev.Emoji.Name.Value, ev.UserID,
                                                        ct));
    }