如何从所有分片中获取 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);
Collection
与Map
非常相似,因此它也有可能使用可迭代的双元素数组构造,其中第一个元素是键,第二个是值:
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 两个集合中获取数据并将所有数据合并在一起