【问题标题】:Discord.js Get common servers between two usersDiscord.js 获取两个用户之间的公共服务器
【发布时间】:2020-10-30 19:11:16
【问题描述】:

我正在寻找两个不和谐Users 之间的公共服务器。目前,我的机器人能够访问它所属的公会,但是给定一个向它发送消息的用户,它无法访问该用户的任何公会。我知道不和谐会限制您查看共享的公会/服务器,但我什至找不到任何方法来访问它们。

任何帮助将不胜感激。

上下文:DM

guild = message.client.guilds.cache.find(clientGuild=>message.author.????)

我想要类似的东西:

guild = message.client.guilds.cache.find(clientGuild=>message.author.guilds.includes(clientGuild)

【问题讨论】:

  • 除非你的机器人在指定的公会中,否则你不能这样做。幸运的是,您可以使用称为“公会”的 OAuth2 范围。这将允许您查看用户的所有公会,但为此,您需要一个 Web 服务器。

标签: javascript discord.js


【解决方案1】:

这不适用于分片。我还没有分片的经验,所以我会把它留给有经验的人。

获取公会当前用户和发送消息的用户

您可以尝试使用缓存的成员(并祈祷用户被缓存,如果用户发送消息但不能保证会出现这种情况)或获取成员。

使用缓存的幼稚方式:

公会对象有一个member 方法从用户那里获取成员对象。您可以简单地检查它是否未定义以查看用户是否在公会中并且被缓存

client.guilds.cache.filter(guild => !!guild.member(message.author));

使用 fetch 的更长方法

这将获取成员,因此具有高公会数量的机器人可能会达到速率限制(查看文档here)。

var guilds = Promise.all(
    client.guilds.cache.map(async guild => [
        guild.id,
        await guild.members.fetch(message.author).catch(() => null))
    ])
).then(guilds => guilds.filter(g => g[1]).map(guild => client.guilds.resolve(guild[0]));

它的工作原理是尝试从机器人所在的每个公会中获取成员(fetch 可能会失败,因此有一个只返回 null 的捕获),然后根据结果过滤公会。 collection 类上没有异步过滤器,因此我映射到异步谓词,然后使用 Promise.all 等待它们。

分片

如果你需要分片,应该可以使用broadcastEval做同样的事情,但是我还没有足够的信心来写它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多