如何让不和谐机器人为其加入的每台服务器创建邀请?

Posted

技术标签:

【中文标题】如何让不和谐机器人为其加入的每台服务器创建邀请?【英文标题】:How to make a discord bot create an invite for every server it joins? 【发布时间】:2021-09-13 07:03:39 【问题描述】:

所以,我写了this 让机器人发送有关它加入到 webhook 的服务器的信息,例如服务器名称和所有者 ID 等等,但我想在嵌入中添加一个字段,让机器人附加一个服务器邀请到它刚刚加入的服务器,如果它有权限并且如果不只是将其替换为:“缺少权限”,我搜索了我该怎么做,但我没有找到太多,我无法弄清楚,我在命令表单中也有此代码,我在其中键入服务器 ID,机器人直接发送相同的嵌入,因此,无论谁回答这个问题,请记住,每当我执行命令时,我都需要机器人生成新的邀请,而不是使用任何以前的邀请,为此我需要邀请的有效期为 7 天,谢谢。

片段:

  /**
   * Starts checking...
   * @param object client The Discord Client instance
   */
  init(client) 
    client.on("guildCreate", (guild) => 
      let channel = new Discord.WebhookClient(
        client.config.webhook.id,
        client.config.webhook.token
      );
      const embed = new Discord.MessageEmbed()
        .setColor(client.config.embed.color)
        .setThumbnail(guild.iconURL( dynamic: true ))
        .setTitle("New Server!")
        .addField("Server Name", guild.name, true)
        .addField("Server ID", guild.id, true)
        .addField("Owner ID", guild.ownerID, true)
        .addField("Owner Mention", `<@$guild.ownerID>`, true)
        .addField("Member Count", guild.memberCount, true)
        .setFooter(client.user.username, client.config.embed.thumbnail);

      channel.send(embed);
    );

【问题讨论】:

【参考方案1】:

其实invites are not for the server, but for the channel。

您服务器中的每个频道都有自己的 Instant Invite 链接,您从哪个频道中提取链接是用户每次尝试访问时将登陆您服务器的位置。 例如,如果您从#rules 频道向 Glados 发送邀请链接,那么每次她访问您的服务器时,#rules 聊天频道将是她看到的第一个频道。

此代码显示了如何创建对机器人找到的第一个频道(不一定是频道列表中的第一个)的邀请:

guild.channels.cache.first()
.createInvite() //you can add options if you want
.then(invite => embed.addField("Invite link", invite.url, true)) // if promise is accepted
.catch(() => embed.addField("Invite link", "Missing permissions")) // if promise is rejected (90% because you don't have permissions, 10% because of server lag etc., either way you don't get the link)

由于创建邀请可能比发送嵌入要长,我建议添加一些异步操作。 整体解决方案:

client.on("guildCreate", async (guild) => 
    let channel = new Discord.WebhookClient(
        client.config.webhook.id,
        client.config.webhook.token
    );
    const embed = new Discord.MessageEmbed()
        .setColor(client.config.embed.color)
        .setThumbnail(guild.iconURL( dynamic: true ))
        .setTitle("New Server!")
        .addField("Server Name", guild.name, true)
        .addField("Server ID", guild.id, true)
        .addField("Owner ID", guild.ownerID, true)
        .addField("Owner Mention", `<@$guild.ownerID>`, true)
        .addField("Member Count", guild.memberCount, true)
        .setFooter(client.user.username, client.config.embed.thumbnail);

        await guild.channels.cache
        .first()
        .createInvite()
        .then((invite) => embed.addField("Invite link", invite.url, true))
        .catch(() => embed.addField("Invite link", "Missing permissions", true));

    channel.send(embed);
);

最后提示:

您无需检查所有者 ID,因为通过他的提及可以轻松访问它。

编辑:

回复您的评论,我自己进行了一些调试,但一直收到UKNOWN CHANNEL 错误。出于某种奇怪的原因,创建到category 频道的邀请链接不起作用(尽管documentation 另有声明)。

新代码sn-p:

client.on("guildCreate", async (guild) => 
    let channel = new Discord.WebhookClient(
        client.config.webhook.id,
        client.config.webhook.token
    );
    const embed = new Discord.MessageEmbed()
        .setColor(client.config.embed.color)
        .setThumbnail(guild.iconURL( dynamic: true ))
        .setTitle("New Server!")
        .addField("Server Name", guild.name, true)
        .addField("Server ID", guild.id, true)
        .addField("Owner ID", guild.ownerID, true)
        .addField("Owner Mention", `<@$guild.ownerID>`, true)
        .addField("Member Count", guild.memberCount, true)
        .setFooter(client.user.username, client.config.embed.thumbnail);

        await guild.channels.cache
        .filter(channel => channel.type === "text") //added this line, should work like a charm
        .first()
        .createInvite()
        .then((invite) => embed.addField("Invite link", invite.url, true))
        .catch(() => embed.addField("Invite link", "Missing permissions", true));

    channel.send(embed);
);

【讨论】:

首先,非常感谢您,但是,我将代码编辑为您所写的内容,但是无论我的邀请具有什么权限整数,嵌入总是显示“缺少权限”,我编辑了邀请权限整数到 8,所以它有管理员,但嵌入字段仍然显示“缺少权限”。 @KarimWalid 我已经解决了这个问题,结帐编辑的答案。

以上是关于如何让不和谐机器人为其加入的每台服务器创建邀请?的主要内容,如果未能解决你的问题,请参考以下文章

如何让不和谐机器人在命令上创建频道

如何让不和谐的机器人踢出 Java 中的成员?

如何让不和谐的机器人获取昵称而不是用户名?

让不和谐机器人每 10 秒改变一次播放状态

让机器人为它所在的每个公会创建邀请

一种让不和谐机器人在设定的时间发送私人消息的方法?