【发布时间】:2020-08-28 03:24:28
【问题描述】:
如您所见,如果您删除了发布代码的位置,当用户点击反应时,它会被计分并以用户名的形式作为响应出现。因为我在程序中编写了这个方法并添加了遗留的 ModuleBase 它是有限的,我将不得不返回 null,我总是将这个问题像素化,只是 dobavlyu 在所需类的参数中,但现在我不能添加超过 3 个类因为字段 ReactionAdded 需要 3 个参数,对于反应,告诉我方法内部如何获取类 SocketGuild、SocketGuildUser 和 Yes 角色变量返回 Null 因为 ModuleBase
[Command("react")]
public async Task HandleReaction()
{
RestUserMessage message = await Context.Channel.SendMessageAsync("react");
Program.MessageId = message.Id;
}
internal static ulong MessageId { get; set; }
public ITextChannel textChannel;
public SocketGuildUser user;
private async Task OnReactionAdd(Cacheable<IUserMessage, ulong> cache, ISocketMessageChannel channel, SocketReaction reaction)
{
if (reaction.MessageId == Program.MessageId)
{
if (reaction.Emote.Name == "????")
{
ulong roleid = 747992707351183541;
var role = textChannel.Guild.GetRole(roleid); //System.NullReferenceException: "Object reference not set to an instance of an object."
await user.AddRoleAsync(role);
await channel.SendMessageAsync(reaction.User.Value.Username);
}
}
}
【问题讨论】:
-
能否请您改写您的问题。我不确定您是否使用了翻译器或其他工具,但您的问题不是很清楚,而且有点难以理解。根据代码,我可以说您不能在命令模块内使用添加的反应事件处理程序,它应该在一个单独的服务类中。您可以通过将 ISocketMessageChannel 转换为文本通道来获取公会。并且可以从 SocketReaction 中获取用户。
-
@Anu6is 我有一个变量角色 ModuleBase
返回null,要修复这个错误,我需要在方法参数中添加SocketGuild arg,这样写 var role = arg.GetRole(roleId ) 但我无法将 SocketGuild 添加到方法参数,因为我将 OnReactionAdd 方法分配给了 ReactionAdded 字段,所以我写了 _client. ReactionAdded += OnReactionAdd; ReactionAdded 字段有 3 个参数,你可以在 OnReactionAdd 方法中看到,希望这次我解释清楚了 -
I need to add SocketGuild arg to the method parameters您不能将自己的参数添加到事件处理程序签名中。这就是为什么我说你可以通过将ISocketMessageChannel转换为ITextChannel并访问它的Guild属性来获得公会......另外,I have a variable role ModuleBase<T> returns null这对我来说仍然没有意义,因为你不能在继承自模块库的类中使用事件处理程序。 -
@Anu6is 我添加了 public itextchannel textChannel 字段;并像这样编写我的代码并且仍然在角色空变量中如果我用 ITextChannel 替换 ISocketMessageChannel,_client.ReactionAdded += OnReactionAdd 对我不起作用;
ulong roleid = 747992707351183541; var txt = textChannel; var role = txt.Guild.GetRole(roleid); await ((SocketGuildUser)Context.User).AddRoleAsync(role); -
您似乎仍然在继承模块库的类中执行此操作。那根本行不通。上下文在实际命令之外无效。也就是说,您没有展示如何将 ISocketMessageChannel 转换为 ITextChannel。我从来没有说过要用另一个替换。
标签: c# discord.net