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
相关产品推荐
相关产品推荐

