gpt4 book ai didi

c# - 检查用户是否具有角色 Discord.net

转载 作者:行者123 更新时间:2023-12-04 15:13:18 24 4
gpt4 key购买 nike

我正在玩 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!");
}
}
}

我的目标

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

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

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

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

我的问题

如果我在没有角色启动机器人并且我写了!create one chat它成功给我角色 .当我第二次执行该命令时,它再次为我提供了角色。它并没有说我已经担任该角色。

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

有什么办法解决这个问题吗?

Using Discord.net Nu-Get Packet v2.2.0

最佳答案

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

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

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

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

这是我的 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 channel 中提问。

关于c# - 检查用户是否具有角色 Discord.net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64796387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com