如何在模块中填充集合以在事件/命令中使用

Posted

技术标签:

【中文标题】如何在模块中填充集合以在事件/命令中使用【英文标题】:How to have collections populated in a module for use inside events/commands 【发布时间】:2019-09-28 00:04:28 【问题描述】:

我知道要填充诸如公会和频道之类的集合,机器人必须已经登录,即它可以在命令文件和内部事件中使用。我所拥有的是一个模块,它将在我的控制不和谐服务器中显示我的日志,我希望能够在我的事件以及我的命令中引用这个模块。

我已经尝试在事件中导入模块,以及其他有意义的选项。

这是我模块中的代码

const Discord = require('discord.js')
const bot = new Discord.Client()
const CC = '../settings/control-center.json'
const CCFile = require(CC)
const GUILD = bot.guilds.get(CCFile.GUILD)
const STARTUP = bot.channels.get(CCFile.STARTUP)
const INFO = bot.channels.get(CCFile.INFO)
const ERRORS = bot.channels.get(CCFile.ERRORS)
const RESTART = bot.channels.get(CCFile.RESTART)
const EXECUTABLES = bot.channels.get(CCFile.EXECUTABLES)

class Control 
    /**
     * Implement control center logging
     * @param string message - What to send to the startup channel
     * @return string The final product being sent to the startup channel
     */
    STARTUP(message) 
        return STARTUP.send(`$message`)
    


module.exports = Control

我希望能够全局使用这个模块/里面的函数,这样我的代码可以更紧凑。那么我怎样才能让这个代码只在机器人登录后加载呢?

【问题讨论】:

【参考方案1】:

在您的模块代码中,您正在创建一个新的 Discord 客户端实例,并且从不调用 login 方法。 更好的方法是在您的方法中传递 bot 对象

模块文件

const CC = '../settings/control-center.json';
const CCFile = require(CC);
const GUILD = CCFile.GUILD;
const STARTUP = CCFile.STARTUP;
const INFO = CCFile.INFO;
const ERRORS = CCFile.ERRORS;
const RESTART = CCFile.RESTART;
const EXECUTABLES = CCFile.EXECUTABLES;

class Control 

  startup(bot, message) 
    return bot.channels.get(STARTUP).send(message);
  



module.exports = Control

应用文件

// Use the bot here
const Discord = require('discord.js')
const bot = new Discord.Client() 
const control = require('path/to/control.js');

[...]

// to send a message when ready, try something like this
bot.on('ready', () => 
  control.startup(bot, 'bot is ready');
);

// don't forget to login
bot.login('YOUR-TOKEN-HERE');

【讨论】:

完全按预期工作,很好的解释,谢谢。

以上是关于如何在模块中填充集合以在事件/命令中使用的主要内容,如果未能解决你的问题,请参考以下文章

如何创建集合扩展以在具有属性的集合中查找唯一对象?

如何在 Vue.js 中创建 Date(now) 以在计算属性中使用?

如何在 afterSubmit 事件中添加 180 天以在 suiteflow 中进行转换?

如何在全局范围内声明管道以在不同模块中使用?

如何从另一个模块访问测试类以在 junit 测试中使用?

如何获得填充以在Firefox和Chrome中显示相同内容?