node.js - Discord.js - 发送消息的计数器,DM给公会的所有成员
问题描述
所以,我有一个代码的工作示例,它将 DM 发送给公会的所有成员。但是,我希望整个事情以一条消息结束,类似于:“成功发送 XX 条消息”。
const sentMessages = 0;
if (!message.member.hasPermission(`ADMINISTRATOR`)) {
message.channel.send(`You don't have permission to use this command!`);
message.client.channels.cache.get(logchannel).send(`${message.author} tried using DMALL! ` + dato.toLocaleTimeString() + dato.toLocaleDateString());
return;
} else {
const delay = (msec) => new Promise((resolve) => setTimeout(resolve, msec));
const sendMessage = args.join(" ");
message.channel.send(`Sending messages, please wait...`);
await delay(1000);
let interval = 500; // how much time should the delay between two iterations be (in milliseconds)?
let promise = Promise.resolve();
message.guild.members.cache.forEach(function (user) {
promise = promise.then(function () {
if (user.id != message.client.user.id) {
user.send(sendMessage);
sentMessages++;
return new Promise(function (resolve) {
setTimeout(resolve, interval);
});
}
});
message.channel.send(`Successfully sent ${sentMessages} messages!`);
});
无论我何时何地放置它,最后的消息(成功...)都会返回 0。如果我写这样一行:message.channel.send(`Sent: ${sentMessages}); 在sentMessages++下面;我得到了一个我期望的递增数字。
我在哪里做错了什么?
解决方案
最后求助于一个比我更擅长编码的朋友。他想出了一种完全不同的到达方式:
if (!message.member.hasPermission(`ADMINISTRATOR`)) {
message.channel.send(`You don't have permission to use this command!`);
message.client.channels.cache.get(logchannel).send(`${message.author} tried using DMALL in **${message.guild.name}**!` + dato.toLocaleTimeString() + dato.toLocaleDateString());
return;
} else {
const delay = (msec) => new Promise((resolve) => setTimeout(resolve, msec));
const sendMessage = args.join(" ");
message.channel.send(`Sending messages, please wait...`);
await delay(1000);
const interval = 500;
let array;
try {
const all = await message.guild.members.fetch();
array = all.array();
} catch {
array = message.guild.members.cache.array();
}
let sentMessages = 0;
for (var i = 0; i < array.length; i++) {
const user = array[i];
if (!user.bot) {
try {
await user.send(sendMessage);
sentMessages++;
await delay(interval);
} catch { }
}
}
message.client.channels.cache.get(logchannel).send(`${message.author} sent a DM to all members of: **${message.guild.name}**!` + dato.toLocaleTimeString() + dato.toLocaleDateString());
message.channel.send(`Finished sending messages to all users, ${sentMessages} messages sent!`);
}
这段代码经过测试,发现效果很好
推荐阅读
- node.js - 来自 HTTPClient 或后端的 API 调用?
- javascript - 使用 ES6 解构简化 javascript 对象创建
- php - 带有oracle客户端11g的php
- angularjs - 视图中的图形不显示 - Chart.js Angularjs
- java - JAVA API 不返回任何结果。在服务器上运行的 SQL 查询确实
- r - 在 R lmer() 中组合多个变量的 BLUP 估计
- character-encoding - 不显示区域 (UTF-8) 字符的可操作消息
- javascript - Firefox 是否可以使用 Google 一键式登录?
- javascript - Callbacks for navigator.geolocation.getCurrentPosition are not firing in firefox
- android - 离子科尔多瓦运行android失败