You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:13:52