Discord.JS 宣布命令问题

Posted

技术标签:

【中文标题】Discord.JS 宣布命令问题【英文标题】:Discord.JS Announce Command Issue 【发布时间】:2020-01-14 21:46:30 【问题描述】:

我正在尝试使用丰富的嵌入为我的机器人构建一个宣布命令。

这是我的announce.js 文件:

const Discord = require('discord.js');

module.exports = 
    name: 'announce',
    description: 'Send an announcement.',
    guildOnly: true,
    execute(message, args) 
        console.log("embedding")


        const embed = new Discord.RichEmbed()
            .setTitle("Announcement")
            .setDescription("A Staff member has sent an announcement")
            .setColor(0x00AE86)
            .setFooter("Guardian", "https://raw.githubusercontent.com/phantomdev-github/Resources/master/Discord%20Bots/Guardian/src/avatar.png")
            .setThumbnail("https://raw.githubusercontent.com/phantomdev-github/Resources/master/Discord%20Bots/Guardian/src/avatar.png")
            .setTimestamp()
            .setURL("https://github.com/phantomdev-github/Resources/tree/master/Discord%20Bots/Guardian")
            .addBlankField(true)
            .addField("Announcement", "message contents here", false))
        message.channel.send( embed );
    
;

自发布以来我对其进行了重建,并花了一段时间才回到这篇文章。我正在尝试将我的所有消息从我的机器人重建为丰富的嵌入。因此不同的代码。我还简化了我的 fs 命令和事件处理程序。

indexjs

const fs = require('fs');
const Discord = require('discord.js');
const client = new Discord.Client();
const  token  = require('./token.json');

client.commands = new Discord.Collection();

const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js'));

for (const file of commandFiles) 
    const command = require(`./commands/$file`);
    client.commands.set(command.name, command);
    console.log(file,command)


fs.readdir('./events/', (err, files) => 
    if (err) return console.error(err);
    files.forEach(file => 
        if(!file.endsWith('.js')) return;
        const eventFunction = require(`./events/$file`);
        console.log(eventFunction)
        eventFunction.execute(client)
    );
);

client.login(token);

message.js

const  prefix  = require('./prefix.json');

module.exports = 
    name: 'message',
    description: 'client message event.',
    execute:function(client) 
        client.on('message',message => 
    if (!message.content.startsWith(prefix) || message.author.bot) return;

    const args = message.content.slice(prefix.length).split(/ +/);
    const command = args.shift().toLowerCase();
        if (!client.commands.has(command)) return;

        try 
            client.commands.get(command).execute(message, args);
             catch (error) 
                console.error(error);
                message.reply('there was an error trying to execute that command!');
                
)

;

基本上,我需要知道为"message contents here" 输入什么内容才能将键入的消息发布到#announcements 频道。

我的问题是如何将公告消息放入richEmbed 的.addField 部分?

会是这样的吗?

const Discord = require('discord.js');

module.exports = 
    name: 'announce',
    description: 'Send an announcement to the specified channel.',
    guildOnly: true,
    execute(message, args) 
        console.log("embedding")
    enter code here
        if(args.length < 2) return /* error message */;


    let channel = message.mentions.channels.first();
    if(!channel) return ;

    let announcement = args.slice(1).join(" ");

            const embed = new Discord.RichEmbed()
            .setTitle("Notice!")
            .setDescription("Announcememnt from PhantomDEV Staff!")
            .setColor(0x00AE86)
            .setFooter("Guardian", "https://raw.githubusercontent.com/phantomdev-github/Resources/master/Discord%20Bots/Guardian/src/avatar.png")
            .setThumbnail("https://raw.githubusercontent.com/phantomdev-github/Resources/master/Discord%20Bots/Guardian/src/avatar.png")
            .setTimestamp()    
            .setURL("https://github.com/phantomdev-github/Resources/tree/master/Discord%20Bots/Guardian")
            .addBlankField(true)
            .addField("Message", "", false);

        message.channel.send( embed );
        .catch(console.error);
;

【问题讨论】:

module.exports.execute() 不使用commandargs 参数,并且这些变量未在函数中的任何位置定义。 message.mentions.channels() 也不是方法; message.mentions.channels 是一个返回集合的属性,所以也许你的意思是 message.mentions.channels.first()。考虑一下Discord.js documentation 的概述,以帮助您入门。 我已经看到的第一个问题是我的不使用module.exports.execute。它只需要module.exports = 任何使用不同格式的尝试都会破坏命令。所以我必须使它与module.exports = 一起工作,我的命令和args 变量也通过我的index.js 文件调用。它设置为使用fs 调用该部分,以缩短命令本身使用的代码。 execute 被定义为module.exports 的属性,因此可以表示为module.exports.execute 【参考方案1】:

在您的message 事件结束时,使用此行调用命令的执行...

command.execute(message, args);

定义您的execute 函数以使用您需要的args 参数。此外,Collection.first() 是您在声明 channel 时要查找的方法。你的函数应该是这样的......

execute: function(message, args) 
  if (args.length < 2) return /* error message */;

  // Careful using this; if just an announcement is provided
  // and it mentions a channel, that channel will be used.
  let channel = message.mentions.channels.first();
  if (!channel) return /* error message */;

  let announcement = args.slice(1).join(" ");

  channel.send(announcement)
    .catch(console.error);

没有必要在执行函数中检查该命令是否为“announce”,因为它只会被调用。

【讨论】:

太棒了,这正是我所需要的!谢谢。 哟,我的机器人结构已经更新,命令需要再次修复 xD。任何帮助将不胜感激。 @JoshuaVL1988 概念保持不变。 execute 函数内部的代码应该保持非常相似。您需要哪些方面的帮助? 我不知道如何让它将消息放入嵌入中。 我更新了这里的原始帖子,以展示我拥有什么、我正在尝试什么以及我想从中得到什么。但基本上我希望announce.js 在我的不和谐中向#announcements 频道发布丰富的嵌入内容,其中包含键入 的消息,而无需指定频道。

以上是关于Discord.JS 宣布命令问题的主要内容,如果未能解决你的问题,请参考以下文章

Discord 仅识别 discord.js 中的“ping”命令

使用 Discord 按钮的建议命令 Discord.JS

Discord bot 更改前缀命令出错 (discord.js)

Discord.js - Discord 机器人停止响应命令

Discord.JS Purge.js 命令问题

Discord.js重启命令[关闭]