有没有办法在不加入公会的情况下从提及中获取用户的 ID?
Posted
技术标签:
【中文标题】有没有办法在不加入公会的情况下从提及中获取用户的 ID?【英文标题】:Is there a way to get a user's ID from a mention without them being in the guild? 【发布时间】:2021-09-21 04:54:36 【问题描述】:我正在尝试通过提及来发出取消禁令命令。如果有一种方法可以通过提及获取用户 ID 而无需他们在我正在执行命令的实际行会中,那就太好了。
尝试执行时,我收到一条错误消息,告诉我它无法读取未定义的属性“id”。但是当我在用户在公会时这样做时,它可以很好地阅读它。
我的代码:
const Discord = require("discord.js");
module.exports =
name: "unban",
aliases: [],
usage: "prefixunban <user>",
category: "moderation",
desc: "Unban a banned user.",
run: async (client, message, args) =>
let unbanned1 = message.mentions.users.first().id || args[0];
let unbanned = await client.users.fetch(unbanned1);
let ban = await message.guild.fetchBans();
// MESSAGES
if (!args[0])
return message.channel.send('❌ - Please specify a user to unban.')
if (!unbanned)
return message.channel.send(`❌ - User not found.`)
if (!ban.get(unbanned.id))
return message.channel.send("❌ - This user hasn't been banned.")
// No author permissions
if (!message.member.hasPermission("BAN_MEMBERS"))
return channel.send("❌ You do not have permissions to ban members.")
// No bot permissions
if (!message.guild.me.hasPermission("BAN_MEMBERS"))
return channel.send("❌ I do not have permissions to ban members. Please contact a staff member")
var user = ban.get(unbanned1);
message.guild.members.unban(unbanned1);
const embed = new Discord.MessageEmbed()
.setColor("GREEN")
.setAuthor(user.user.username, user.user.displayAvatarURL( dynamic: true ))
.setDescription(`$user.user.tag got unbanned:`)
.setTitle("User Unbanned Successfully")
.addField(`By:`, `$message.author.tag`, true)
.setThumbnail(user.user.displayAvatarURL( dynamic: false ))
.setFooter(message.member.displayName, message.author.avatarURL( dynamic: true ))
.setTimestamp()
message.channel.send(embed);
,
;
提前谢谢你。
【问题讨论】:
【参考方案1】:您可以使用正则表达式从用户提及模式中匹配和捕获用户的 ID,如下所示:/<@!?(\d17,19)>/
<@ - matches these characters literally
!? - optional "!"
(...) - captures everything inside for later use
\d - any digit
17-19 - 17 to 19 of the preceding character (\d)
> - matches this character literally
您可以使用以下代码执行匹配:
const match = args[0].match(/<@!?(\d17,19)>/);
如果没有找到,这将返回null
。否则,它将返回具有此结构的数组:
[
'<@!id_here>',
'id_here',
index: 0,
input: '<@!id_here>',
groups: undefined
]
因此,要获取 ID,只需获取第二个元素(在索引 1 处)
// I'm using the optional chaining operator (?.) in the below
// example, which requires node 14.0.0
// if you do not have this version, just separate the `match()` result
// into a separate variable
// and validate it exists before accessing match[1]
let unbanned1 = args[0].match(/<@!?(\d17,19)>/)?.[1] || args[0];
【讨论】:
【参考方案2】:如果用户不在公会中,我认为不可能从提及中获取用户的 ID。因为它们不是GuildMember
s,所以你不能提及它们。 (是的,有一种方法可以通过使用他们的 id 来提及不在公会中的用户,但我认为 discord.js
不认为这是一个有效的提及。)
很好的解决方法是使用BanInfo
,因为它包含User
对象。从那里获取id
。如果要通过用户名解禁用户,可以将BanInfo
中User
的username
属性与发送解禁命令的人指定的用户名进行比较。
但请注意,用户名不是唯一的,因此最好也使用 User
的 discriminator
属性。
【讨论】:
以上是关于有没有办法在不加入公会的情况下从提及中获取用户的 ID?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在不创建视频标签的情况下从 URL 获取 MediaStream
有没有办法在不实际 ping 用户的情况下提及用户(蓝色突出显示)?
有啥方法可以在不使用 Nest.js 中的 async/await 的情况下从数据库中获取数据?
有没有办法在不知道深度 Z 的情况下从现实世界物体的运动中找到光流速度?