其实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);
});