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

Discord.Net开发:如何获取服务器用户的游戏活动信息?

解决Discord机器人获取用户游戏状态的问题

首先,你的问题出在Discord.NET版本的API变更以及对Activity类型的错误判断上:

  • 新版本Discord.NET中,user.Game属性已被移除,取而代之的是user.Activities集合(存储用户的所有活动,包括游戏、自定义状态、流媒体等)
  • 你判断的CustomStatusGame是自定义状态,并非真正的游戏活动,应该筛选GameActivity类型

以下是修正后的完整代码:

[Command("playing")]
[Alias("p")]
public async Task GetUsersPlaying()
{
    var guildUsers = Context.Guild.Users;
    var embedBuilder = new EmbedBuilder
    {
        Title = "当前正在玩游戏的成员",
        Color = Color.Blue
    };

    bool hasPlayingUsers = false;

    foreach (var user in guildUsers)
    {
        // 筛选出用户的游戏活动,同时排除离线用户(可选)
        var gameActivity = user.Activities.FirstOrDefault(a => a is GameActivity && user.Status != UserStatus.Offline);
        if (gameActivity != null)
        {
            hasPlayingUsers = true;
            var game = (GameActivity)gameActivity;
            // 用inline参数让字段左右对齐
            embedBuilder.AddField($"成员", user.Mention, true);
            embedBuilder.AddField($"游戏", game.Name, true);
            // 添加空字段分隔,优化排版
            embedBuilder.AddField("\u200B", "\u200B", false);
        }
    }

    if (!hasPlayingUsers)
    {
        embedBuilder.Description = "目前没有成员在玩游戏哦";
    }

    await ReplyAsync(embed: embedBuilder.Build());
}

关键说明:

  • user.Activities:存储用户的所有活动,需从中筛选GameActivity类型的项
  • GameActivity:代表用户正在游玩的游戏,其Name属性即为游戏名称
  • 可选过滤user.Status != UserStatus.Offline:避免显示离线用户的历史游戏记录
  • 空状态处理:当无用户玩游戏时添加提示描述,防止发送空Embed

另外需确保:你的Discord.NET是最新稳定版,且机器人在Discord开发者门户的机器人设置中开启了GuildMembersIntent权限,否则可能无法获取完整的用户活动信息。

内容的提问来源于stack exchange,提问作者DefinitivVair0

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 01:36:34