我正在使用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数据包v2.2.0
答案 0 :(得分:1)
首先,应该使用built-in commands service而不是当前的方法。但是,这样做无法解决您的问题。
如果您注意到与用户有关的奇怪行为,那么很可能是由于最近的“特权意图”更新造成的。 Discord.NET缓存(下载)用户并使用诸如GuildUserUpdated之类的事件来使此缓存在后台保持最新状态。没有公会成员的意图,Discord.NET无法使用户缓存保持最新状态,从而导致诸如此类的问题。
要解决此问题,请在Discord开发人员门户的bot页面的Bot选项卡上启用“公会成员”特权意图。
如果这不起作用,请使用夜间版本的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频道中提问。