首页 > 解决方案 > discord bot 分片和处理来自数组结果的对象

问题描述

所以我已经阅读了有关 broadcastEval 等的文档(https://discordjs.guide/sharding/extended.html#using-functions-continued

我正在尝试学习如何对我的机器人进行分片,不幸的是,搜索并没有那么富有成效。我的问题:


async function serverLookup(client, { sID, authNm }) {
    console.log(`serverID is: ${sID}`);
    console.log(`authNm is: ${JSON.stringify(authNm)}`);

    const svrInfo = await client.guilds.fetch(sID);
    ...
}

await bot.shard.broadcastEval(serverLookup, { context: { sID: serverID, authNm: msgAuthor } })
     .then(async (server) => {
        dispName = server;
        ...
    })

我知道“服务器”将是一组对象,它们已经失去了原来的真实对象表示。文档说“这意味着通常提供给您的便利方法都不可用。如果这对您来说是个问题,您将需要在 broadcastEval 中处理该项目”

所以在这个例子中有一个被调用的辅助函数,这意味着这个函数内部的调用将具有对象属性范围。我上面的代码有 2 个片段,第一个是辅助函数。client.guilds.fetch也返回一个数组而不是一个对象。我应该“构造”一个​​新的公会对象来访问我想要的方法,还是有更好的方法来处理这个?

最终,我试图从一个消息对象开始,然后进入服务器的用户列表,以访问昵称。

蒂亚!

标签: node.jsdiscord.js

解决方案


async function getAuthDispNameFromShardMgr(msg) {
    const bot = msg.client;
    let dispName = '';

    dispName = await bot.shard.broadcastEval(async (client, { guildId, authId }) => {
        if(client.guilds.cache.has(guildId)) {
            // this is the shard that has this guild
            const guild = await client.guilds.cache.get(guildId);

            // now we have the guild, get the member.
            const member = await guild.members.fetch(authId);
            // console.log(`member is: ${member.nickname}`);
            return member.nickname;
        }
    }, { context: { guildId: msg.guild.id, authId: msg.author.id } })
        .catch(err => console.error(err));

    return dispName.find(res => !!res) || null;
}

推荐阅读