首页 > 解决方案 > 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++下面;我得到了一个我期望的递增数字。

我在哪里做错了什么?

标签: node.jsforeachpromisediscord.jsincrement

解决方案


最后求助于一个比我更擅长编码的朋友。他想出了一种完全不同的到达方式:

        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!`);
        }

这段代码经过测试,发现效果很好


推荐阅读