【问题标题】:How to get the client Object in the launchfile?如何在启动文件中获取客户端对象?
【发布时间】:2019-08-14 07:58:25
【问题描述】:

我有一个 Discord Bot,现在需要分片。我创建了一个名为“botlaunch.js”的文件,我从控制台 (pm2 start botlaunch.js) 开始。在这个文件中包含了分片所需的所有内容。

这是我的botlaunch.js 的样子:

const Discord = require('discord.js');
const settings = require('./settings.json');
const chalk = require('chalk');

const shardingManager = new Discord.ShardingManager('./lenoxbot.js',
        {
            token: settings.token
        });


    shardingManager.spawn('auto', 500).then(() => {
        console.log(chalk.green(`[ShardManager] Started ${shardingManager.totalShards} shards`));
    }).catch(error => {
        console.log(error);
    });

我需要在这段代码之后访问客户端对象。我尝试了以下功能,但这也不起作用。没有错误或类似的东西,它只返回 undefined 我要求的一切,没关系:

function exec(script) {
            let requestId = 0;
            const currentRequestId = requestId++;

            process.send({ cmd: 'exec', script: script, reqId: currentRequestId });

            const promiseExec = new Promise(resolve => {
                _promiseQueue[currentRequestId] = resolve;
            });
            const promiseTimer = new Promise((resolve, reject) => {
                setTimeout(() => {
                    reject('Promise timed out before completion @ LenoxBotLauncher/exec');
                }, 60 * 1000);
                _promiseQueue.delete(currentRequestId);
            });

            return Promise.race([promiseExec, promiseTimer]);
        }

你有什么解决方案可以让我在botlaunch.js的代码下使用客户端吗?

【问题讨论】:

  • 您需要/试图对客户做什么?
  • 我什么都需要。所有方法和属性 @PLASMAchicken 。我的网站/仪表板需要客户端

标签: javascript node.js bots discord discord.js


【解决方案1】:

如果你想明显地评估某些东西,你可以使用ShardingManager#broadcastEval(),如果你需要一些属性,请使用ShardingManager#fetchClientValues(),例如:

shardingManager.fetchClientValues('guilds.size')
.then(results => {
    console.log(`${results.reduce((prev, guildCount) => prev + guildCount, 0)} total guilds`);
})
.catch(console.error);

如果你想从 Bot 内部广播Eval/fetchClientValues,你可以使用client.shard.fetchClientValues()/client.shard.broadcastEval()

这里还有一个很好的指南:https://discordjs.guide/sharding/#broadcasteval


另一种方法是使用 2 个客户端而不是 ShardingManager,例如:

const client1 = new Discord.Client({ shardId: 0, shardCount: 2});
const client2 = new Discord.Client({ shardId: 1, shardCount: 2});

这意味着机器人将仅在 1 个进程中运行,这可能会导致性能问题。

【讨论】:

  • 是的,我知道这一点,但 broadcastEval 会在所有我不想要的分片上执行一个脚本,因为这对性能不太友好
  • fetchClientValues() 将是其他选项,否则我添加了另一种方式,但它也不会真正对性能友好。
  • 问题是fetchClientValues()只能获取属性,我也想用方法。
猜你喜欢
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
相关资源
最近更新 更多