【问题标题】:Check if user has role Discord.net检查用户是否有角色 Discord.net
【发布时间】:2021-02-24 00:19:42
【问题描述】:

我正在玩 Discord.net,但我无法让这段代码工作......

我的代码

using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Discord;
using Discord.WebSocket;

namespace NetflixManager
{
    class Program
    {
        private readonly DiscordSocketClient _client;

        static void Main(string[] args)
        {
            new Program().MainAsync().GetAwaiter().GetResult();
        }

        public Program()
        {
            _client = new DiscordSocketClient();

            _client.Log += LogAsync;
            _client.Ready += ReadyAsync;
            _client.MessageReceived += MessageReceivedAsync;
        }

        public async Task MainAsync()
        {
            await _client.LoginAsync(TokenType.Bot, File.ReadAllText("Token.txt"));
            await _client.StartAsync();

            await Task.Delay(-1);
        }

        private Task LogAsync(LogMessage log)
        {
            Console.WriteLine(log.ToString());
            return Task.CompletedTask;
        }

        private Task ReadyAsync()
        {
            Console.WriteLine($"{_client.CurrentUser} is connected!");

            return Task.CompletedTask;
        }

        private async Task MessageReceivedAsync(SocketMessage message)
        {
            // The bot should never respond to itself.
            if (message.Author.Id == _client.CurrentUser.Id)
                return;
            // The bot should not reply to private messages
            if (message.Channel.Name.StartsWith("@"))
                return;
            // The bot should not reply to bots
            if (message.Author.IsBot)
                return;
            // The bot should not reply to a webhook
            if (message.Author.IsWebhook)
                return;
            // Commands
            if (message.Content.StartsWith("!create"))
            {
                if (message.Author is SocketGuildUser socketUser)
                {
                    SocketGuild socketGuild = socketUser.Guild;
                    SocketRole socketRole = socketGuild.GetRole(772788208500211724);
                    if (socketUser.Roles.Any(r => r.Id == socketRole.Id))
                    {
                        await message.Channel.SendMessageAsync("The user '" + socketUser.Username + "' already has the role '" + socketRole.Name + "'!");
                    }
                    else
                    {
                        await socketUser.AddRoleAsync(socketRole);
                        await message.Channel.SendMessageAsync("Added Role '" + socketRole.Name + "' to '" + socketUser.Username + "'!");
                    }
                }
            }

            if (message.Content == "!ping")
                await message.Channel.SendMessageAsync("pong!");
        }
    }
}

我的目标

我想监控是否有人在公会的任何聊天中写“!create”,然后检查发送消息的人是否具有名为“游戏通知”的角色(ID:772788208500211724)。 如果此人确实具有该角色,则应将其输出到发送原始消息的通道:

"The user '<Username>' already has the role '<RoleName>'!"

如果此人没有该角色,则应将其赋予该角色并将其输出到发送原始消息的通道:

"Added Role '<RoleName>' to '<Username>'!"

我的问题

如果我在没有角色启动机器人并且我写了!创建一个聊天,它成功给了我角色 .当我第二次执行该命令时,它又给了我这个角色。并不是说我已经有了这个角色。

反之亦然: 如果我在启动机器人时拥有角色并正确执行命令表示我拥有角色。当我现在手动删除角色再次执行命令时,它仍然说我拥有角色

任何想法如何解决这个问题?

使用 Discord.net Nu-Get Packet v2.2.0

【问题讨论】:

    标签: c# roles discord.net


    【解决方案1】:

    首先,您应该使用built-in commands service,而不是您当前的方法。但是,这样做并不能解决您的问题。

    如果您注意到与用户相关的奇怪行为(您就是这样),那么很可能是由于最近的 Privileged Intents 更新所致。 Discord.NET 缓存(下载)用户并使用 GuildUserUpdated 等事件在后台保持此缓存最新。如果没有 Guild Members 意图,Discord.NET 无法保持其用户缓存为最新,从而导致诸如此类的问题。

    要解决此问题,请在 Discord 开发者门户上您的机器人页面的机器人选项卡上启用公会成员特权意图。

    如果这不起作用,请使用 Discord.NET 的夜间版本并在 DiscordSocketConfig 中指定您需要的所有意图。要使用夜间版本,请在 NuGet 包管理器上添加 https://www.myget.org/F/discord-net/api/v3/index.json 作为包源。

    这是我的 DiscordSocketConfig,它指定了网关意图(仅在夜间可用):

    new DiscordSocketConfig 
    {
        TotalShards = _totalShards,
        MessageCacheSize = 0,
        ExclusiveBulkDelete = true,
        AlwaysDownloadUsers = _config.FillUserCache,
        LogLevel = Discord.LogSeverity.Info,
    
        GatewayIntents = 
            GatewayIntents.Guilds |
            GatewayIntents.GuildMembers |
            GatewayIntents.GuildMessageReactions | 
            GatewayIntents.GuildMessages | 
            GatewayIntents.GuildVoiceStates
    });
    

    如果您需要更多帮助,我建议您加入 Unofficial Discord API server 并在 #dotnet-discord-net 频道中提问。

    【讨论】:

    • 非常感谢!我完全忽略了不和谐开发者门户中的选项!谢谢你的努力善良的陌生人!
    • 没问题@SebiAi :)。问题很努力,答案也很努力。
    猜你喜欢
    • 2018-06-10
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2021-07-06
    • 2019-06-16
    • 2021-03-16
    相关资源
    最近更新 更多