如何通过Discord.net获取程序已连接的Guild(服务器)数量?
如何通过Discord.NET获取已连接的服务器(Guild)数量?
嘿,这个问题很常见,用Discord.NET获取已连接服务器的数量其实超简单,我给你捋清楚步骤和代码示例!
核心思路
当你的Discord.NET客户端(不管是DiscordSocketClient还是用于大型机器人的DiscordShardedClient)成功登录并完成初始化后,它会自动维护一个已加入服务器的集合。我们只需要获取这个集合的长度,就能得到当前连接的服务器数量。
简易代码示例
情况1:使用普通DiscordSocketClient(适合小型机器人)
这是最基础的场景,直接通过客户端的Guilds属性获取集合长度即可:
using Discord; using Discord.WebSocket; using System; using System.Threading.Tasks; class BotProgram { private DiscordSocketClient _discordClient; static async Task Main(string[] args) { var bot = new BotProgram(); await bot.StartBotAsync(); } public async Task StartBotAsync() { _discordClient = new DiscordSocketClient(); // 替换成你的机器人Token string botToken = "YOUR_BOT_TOKEN"; // 监听Ready事件——客户端初始化完成后触发 _discordClient.Ready += OnClientReady; await _discordClient.LoginAsync(TokenType.Bot, botToken); await _discordClient.StartAsync(); // 让程序保持运行 await Task.Delay(Timeout.Infinite); } private async Task OnClientReady() { // 获取已连接的服务器数量 int guildCount = _discordClient.Guilds.Count; Console.WriteLine($"✅ 机器人已就绪,当前连接到 {guildCount} 个服务器!"); } }
情况2:使用DiscordShardedClient(适合大型机器人,分片部署)
如果你的机器人用了分片,每个分片会维护自己的服务器集合,需要汇总所有分片的数量:
using Discord; using Discord.WebSocket; using System; using System.Linq; using System.Threading.Tasks; class ShardedBotProgram { private DiscordShardedClient _shardedClient; static async Task Main(string[] args) { var bot = new ShardedBotProgram(); await bot.StartShardedBotAsync(); } public async Task StartShardedBotAsync() { _shardedClient = new DiscordShardedClient(); string botToken = "YOUR_BOT_TOKEN"; // 监听单个分片就绪事件 _shardedClient.ShardReady += OnShardReady; // 监听所有分片全部就绪事件 _shardedClient.Ready += OnAllShardsReady; await _shardedClient.LoginAsync(TokenType.Bot, botToken); await _shardedClient.StartAsync(); await Task.Delay(Timeout.Infinite); } private async Task OnShardReady(DiscordSocketClient shard) { int shardGuildCount = shard.Guilds.Count; Console.WriteLine($"🔹 分片 {shard.ShardId} 就绪,连接到 {shardGuildCount} 个服务器"); } private async Task OnAllShardsReady() { // 汇总所有分片的服务器数量 int totalGuildCount = _shardedClient.Shards.Sum(shard => shard.Guilds.Count); Console.WriteLine($"🎉 所有分片就绪!总共连接到 {totalGuildCount} 个服务器!"); } }
额外小技巧:在命令中获取服务器数量
如果想通过机器人命令让用户查询数量,可以直接在命令方法里访问上下文客户端的属性:
using Discord.Commands; using System.Threading.Tasks; public class InfoCommands : ModuleBase<SocketCommandContext> { [Command("guildcount")] [Summary("查询机器人当前所在的服务器数量")] public async Task GetGuildCount() { int count = Context.Client.Guilds.Count; await ReplyAsync($"🤖 我当前在 {count} 个服务器中服务哦!"); } }
注意事项
- 一定要等
Ready(或ShardReady)事件触发后再获取数量,否则Guilds集合可能还没完全加载,得到的结果会不准确。 - 机器人不需要额外的特殊权限,只要能正常加入服务器,就能获取这个集合。
内容的提问来源于stack exchange,提问作者Lewis Clark
相关产品推荐
相关产品推荐

