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

Discord.Net技术问询:如何获取命令响应并将其用作参数

实现Discord.Net交互式命令:收集用户回复作为参数

嘿,这个需求其实用Discord.Net的消息收集器就能轻松搞定!我之前做类似功能的时候踩过一些小坑,给你整理了完整的实现方案,直接就能用:

1. 先搭好基础命令框架

首先你需要一个命令模块类,用来承载你的/say命令:

using Discord;
using Discord.Commands;
using Discord.WebSocket;
using System;
using System.Threading.Tasks;

public class InteractiveCommands : ModuleBase<SocketCommandContext>
{
    // 这里就是我们的/say命令
    [Command("say")]
    [Summary("让机器人重复你之后输入的内容")]
    public async Task SayCommand()
    {
        // 后面的逻辑会写在这里
    }
}

2. 添加询问与回复收集逻辑

在SayCommand方法里,我们先给用户发询问消息,然后创建一个消息收集器,专门监听这个用户的回复,最后把回复内容输出出来:

[Command("say")]
[Summary("让机器人重复你之后输入的内容")]
public async Task SayCommand()
{
    // 第一步:发送询问消息
    await ReplyAsync("你想让我说什么?");

    // 第二步:创建消息收集器
    // 过滤条件:只收集发起命令的用户的消息,并且排除机器人消息
    // 设置30秒超时,避免收集器一直占用资源
    var messageCollector = Context.Channel.CreateMessageCollector(
        filter: msg => msg.Author.Id == Context.User.Id && !msg.Author.IsBot,
        timeOut: TimeSpan.FromSeconds(30)
    );

    // 第三步:监听收集到消息的事件
    messageCollector.MessageReceived += async (sender, args) =>
    {
        // 收集到消息后立刻停止收集器,避免重复触发
        messageCollector.Stop();

        // 输出用户回复的内容
        await ReplyAsync(args.Message.Content);
    };

    // 第四步:监听超时事件(可选但很实用)
    messageCollector.Stopped += async (sender, args) =>
    {
        if (args.Reason == CollectorStoppedReason.TimedOut)
        {
            await ReplyAsync("超时啦!如果你还需要我重复内容,请重新发送/say命令哦~");
        }
    };
}

3. 一些可选的优化建议

  • 如果想让交互在私信里进行(避免频道刷屏),可以把Context.Channel换成await Context.User.CreateDMChannelAsync();
  • 可以添加权限判断,比如只有管理员能使用这个命令,只需要在命令上加上[RequireUserPermission(GuildPermission.Administrator)]特性;
  • 如果需要支持多行内容或者带附件的回复,可以在处理消息的时候加上对args.Message.Attachments的判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:58:01