【问题标题】:Discord bot not Assigning roles (C# Discord.net)Discord bot 未分配角色 (C# Discord.net)
【发布时间】:2021-03-13 16:26:44
【问题描述】:

所以我正在构建一个机器人,当用户 dms 机器人“!Accept”时分配一个角色,问题是当我尝试对此进行测试时收到此错误

MessageReceived 处理程序引发了未处理的异常。: System.NullReferenceException:对象引用未设置为对象的实例。 在 Discord.Commands.SocketCommandContext..ctor(DiscordSocketClient 客户端,SocketUserMessage 消息) 在 C:\Users\sarah\source\repos\UBot_CodeV2\UBot_CodeV2\Program.cs:line 70 中的 UBot_CodeV2.Program.d__9.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Discord.EventExtensions.d__1`1.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 Discord.WebSocket.DiscordSocketClient.d__132.MoveNext() 对象引用未设置为对象的实例。

    [Command("Accept")]
    public async Task Accepted()
    {
            var role = Context.Guild.GetRole(780162818729050114);
        if ((Context.Guild.GetUser(Context.User.Id).Roles.Contains(role))) return;
            await ((SocketGuildUser)Context.User).AddRoleAsync(role);
            await Context.User.SendMessageAsync("Welcome! Your next step is to open a ticket with !ticket open Verification");
        
    }

这是我目前的任务代码

【问题讨论】:

  • 如果用户通过 DM 执行此操作,则 Context.Guild 将为空。由于用户在 DM 中而不是公会中,因此上下文中没有公会。
  • 所以不能通过dms?
  • 如果这是一个私人机器人,你可以先使用Context.Client.GetGuild(guildId)获得公会,然后再使用.GetRole。但如果这应该是公共机器人,您需要先映射guilduser。但在此之后事情会变得更加复杂。
  • 它似乎不喜欢 Context.User 至少在手动设置公会之后错误仍然存​​在

标签: c# discord discord.net


【解决方案1】:

我尝试了您正在使用的类似代码,我的工作正常。这里是结果,我在代码中添加了一些注释供您调试。我会在代码之后解释更多。

[Command("test")]
public async Task TestAsyync()
{
    var guild = Context.Client.GetGuild(759016895390154754); // Debug if it's not null
    var role = guild.GetRole(776340732075573310); // Debug if it's not null
    var user = Context.Guild.GetUser(Context.User.Id); // Debug if it's not null

    if (!user.Roles.Contains(role))
    {
        await user.AddRoleAsync(role);
        LogUtils.Info("Add role");
    } else
    {
        LogUtils.Info("User already have role");
    }
}

案例

  • 如果 guild 为 null 可能您的机器人无法访问公会
  • 如果 roleuser 为 null,则可能存在与您的机器人意图有关的问题 (Why can't my bot dm users a welcome message? (Discord.net C#))
  • 如果await user.AddRoleAsync(role);返回禁止,您需要将您的机器人角色设置在其他角色之上

红色方块是我的机器人角色,紫色方块是我要授予的角色

实际上我今天才了解这个角色层次结构 (Discord.NET assigning roles)

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 2020-07-17
    • 2020-09-07
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2020-08-16
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多