Приглашает командного бота ответить, отправив сообщение несколько раз

#javascript #discord.js #bots

Вопрос:

Я использую трекер приглашений из учебников WOK, и хотя код работает отлично, и я использую обработчик команд, у которого 0 проблем, по какой-то причине бот отвечает несколькими сообщениями вместо 1, как показано на этом изображении:

введите описание изображения здесь

Вот код, который я использовал для команды invites:

 const Discord = require("discord.js")

module.exports = {
    commands: 'invites',
    callback: (message) => {
        const { guild } = message
        guild.fetchInvites().then((invites) => {
            const inviteCounter = {}

            invites.forEach((invite) => {
                const { uses, inviter } = invite
                const { username, discriminator } = inviter

                const name = `${username}#${discriminator}`

                inviteCounter[name] = (inviteCounter[name] || 0)   uses
            })

            let replyText = ''

            const sortedInvites = Object.keys(inviteCounter).sort((a, b) => inviteCounter[b] - inviteCounter[a])

            for (const invite of sortedInvites) {
                const count = inviteCounter[invite]
                replyText  = `n${invite} has invited ${count} member(s)!`

                const embed = new Discord.MessageEmbed()
                embed.setTitle('Invites: ')
                embed.setDescription(replyText)
                message.reply(embed)
            }
        })
    }
}
 

К вашему сведению, в прошлый раз, когда я опубликовал это, я забыл опубликовать код, так что да, это было глупо с моей стороны.

Ответ №1:

Это потому, что вы попали message.reply в for...of петлю.

 for (const invite of sortedInvites) {
                const count = inviteCounter[invite]
                replyText  = `n${invite} has invited ${count} member(s)!`

                const embed = new Discord.MessageEmbed()
                embed.setTitle('Invites: ')
                embed.setDescription(replyText)
                message.reply(embed) //here
            }
 

Вероятно, вы хотели вывести его за пределы цикла, чтобы он отправлял результирующее встраивание после всех итераций.