如何从所有分片中获取 users.cache 并将它们放入集合中,就像集合 client.user.cache 返回一样?

Posted

技术标签:

【中文标题】如何从所有分片中获取 users.cache 并将它们放入集合中,就像集合 client.user.cache 返回一样?【英文标题】:How do I get users.cache from all of the shards and put them into a collection just like the collection client.user.cache returns? 【发布时间】:2021-07-03 08:04:14 【问题描述】:

我有一个不和谐的机器人,它使用:

client.users.cache

这将返回一个 Collection[Map],其中包含机器人缓存的所有用户。 我添加了分片,我也想做同样的事情,所以我将其替换为:

client.shard.fetchClientValues('users.cache');

但这会返回一个数组,我需要一个与从以下位置返回的相同的 Collection[Map]:

client.users.cache

有谁知道如何将 Collection[Map] 中的数组转换为与从以下返回的数组相同的数组:

client.users.cache

或如何从所有分片中获取与返回的分片相同的 Collection[Map]:

client.users.cache

【问题讨论】:

【参考方案1】:

我认为您可以创建一个新的Collection,遍历数组,并使用set() 方法插入/设置新元素。只需确保键是用户 ID,数据是用户对象:

let results = await client.shard.fetchClientValues('users.cache');
let collection = new Discord.Collection();

results.forEach((users) => 
  users.forEach((user) => 
    collection.set(user.id, new Discord.User(client, user));
  );
);

console.log(collection);

CollectionMap 非常相似,因此它也有可能使用可迭代的双元素数组构造,其中第一个元素是键,第二个是值:

let results = await client.shard.fetchClientValues('users.cache');
let collection = new Discord.Collection();

results.forEach((users) => 
  let userCollection = new Discord.Collection(users.map((user) => [user.id, new Discord.User(client, user)]));
  collection = collection.concat(userCollection);
);

console.log(collection);

【讨论】:

感谢您的回答,但我用它对所有用户执行 forEach,您提供的代码实际上并不能正常工作,因为集合 dosnet 已将每个用户标记为用户,所以我不能这样做对于集合中的每个用户,也许您可​​以更新代码来做到这一点(我一生中没有太多关于集合和地图的工作) 我刚刚更新了它,完全忘记你收到了来自fetchClientValues的数组数组。 您好,感谢您的更新,但代码仍然适用于 dosnet。我的代码获取所有用户并根据他们的 id 从文件和其他东西中过滤他们,如果他们是机器人等等,如果他们通过所有 if 语句,他们会得到一个 dm,并且这段代码只是说 user.send 是不是函数。你能不能也帮我解决这个问题(我以前没有使用过分片和集合) 您可以将users.map((user) => [user.id, user]) 更改为users.map((user) => [user.id, new Discord.User(client, user)])。我刚刚更新了上面的代码。 (也许您也可以为此使用broadcastEval,但我不太确定:))

以上是关于如何从所有分片中获取 users.cache 并将它们放入集合中,就像集合 client.user.cache 返回一样?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 firestore 两个集合中获取数据并将所有数据合并在一起

如何从 Firestore 集合中获取所有文档并将它们返回到数组列表中? [复制]

如何从PHP中的URL获取多个同名参数并将所有记录插入表中

从公共记录类型中获取所有记录并将其保存到设备

如何从“活动”中的“编辑”文本中获取值并将其用于片段?

向成员发送消息 (discord.js)