javascript - 用户 DM 中的 awaitMessages() 问题
问题描述
我正在为我的机器人创建一个报告功能,这样当被调用时,它将向用户发送 DM 请求报告,当用户提供报告时,它将获取报告并将其嵌入服务器内的预定义通道中。
message.author.send("Please send your report here in a single message below 1000 characters in length. Provide the tag of the User, Reason and Evidence(optional). This instance shall expire in 120 seconds")
.then((rMsg) => {
rMsg.channel.awaitMessages(res => res.content, {
max: 1,
time: 120000,
errors: ['time']
})
.then((report) => {
console.log(report);
let dmrEmbed = new discord.RichEmbed()
.setColor('#8E5BC5')
.setTitle('User Report (Type: DM)')
.addField('Reporter :', `<@${message.author.id}> ID: ${message.author.id}`)
.addField('Report Content:', `${report.content}`)
.setFooter(message.createdAt);
rMsg.channel.send('Your report has been received. You may be contacted for further information.');
rChannel.send(dmrEmbed);
}).catch(() => {
rMsg.channel.send('This instance has expired.');
});
});
return;
这段代码有两个主要问题。它应该在 DM 中接受用户的输入,但是当它向用户发送第一条要求报告的消息时,它会立即发布“您的报告已收到”消息。当我在控制台登录时report
,我可以看到机器人已将它自己的第一条消息作为回复。
第二个问题是,即使报告有一个包含消息的内容元素,也会report.content
返回。undefined
解决方案
有一些小问题,让我们回顾一下:
问题 1: DMChannel#awaitMessages参数为:
因此,您需要添加适当的过滤器以仅接受来自记者的消息,例如:
rMsg.channel.awaitMessages(res => res.content && res.author.id == , {
这将确保仅捕获带有内容和来自报告者的消息。
问题 2:DMChannel#awaitMessages返回一个集合。
所以而不是
.then((report) => {
利用
.then((collected) => {
const report = collected.first(); // This will return the proper message object.
推荐阅读
- java - 检索分号前的单词
- algorithm - 有什么公式可以在没有循环的情况下在 Bresenham 的 2D 线中获得点?
- c# - Selenium ChromeDriver C# - 如何向浏览器发送快捷键
- asp.net - 发布新复选框列表时不会覆盖复选框列表
- python - 使用 mysql 数据库通过电子邮件进行 django 身份验证
- google-compute-engine - Cloud shell 找不到 Windows 实例
- python-3.x - python - 如何防止类生成具有早期实例化中使用的属性的对象,但不停止代码
- leaflet - 传单:如何在左侧/右侧创建窗格而不是弹出窗口
- c - 分数与下一个5的倍数之间的差值小于3,然后将分数四舍五入到下一个5的倍数。低于50的分数将不会升级
- reactjs - 无法在反应应用程序中使用 Ant design 的抽屉