从DM DiscordJS中查找用户角色



我目前正在研究一个机器人,我需要与用户一起进入DM,回答问题并更新服务器中的角色。

我目前的问题是,它给角色很好,但在用户被赋予角色后,机器人不更新它的内存中的角色。

因此,在用户被赋予第一个角色后,他需要在服务器中发送消息,让bot知道他的新角色,我想避免这种情况。

示例:在服务器中发送消息->机器人DM,回答问题,机器人给出角色并发送第二个问题->用户回答了新问题,但bot看不到用户的新角色。

function restart(msg, member, memberRole1){
if(msg.content == "!start"){
msg.author.send("Riddle1" )
member.roles.add(memberRole1)
}
}
function test(msg, memberRole,memberRole2,memberRole3,memberRole4, member){
console.log(client.guilds.cache.get('ServerID').members.cache.get(msg.author.id).roles)
if (client.guilds.cache.get('ServerID').members.cache.get(msg.author.id).roles.cache.some(role => role.name === 'Role1')){
try {
if(msg.channel.type == 'DM'){
if(msg.content == 'Answer1'){
member.roles.add(memberRole)
msg.author.send("Riddle2")
}

}
} catch (error) {
console.log(error)
}
}
else if(client.guilds.cache.get('ServerID').members.cache.get(msg.author.id).roles.cache.some(role => role.name === 'Role2')){
try {
if(msg.channel.type == 'DM'){
if(msg.content == 'Answer2'){
member.roles.add(memberRole2)
msg.author.send("Riddle3")

}
}

} catch (error) {
console.log(error)
}
}
else if(client.guilds.cache.get('ServerID').members.cache.get(msg.author.id).roles.cache.some(role => role.name === 'Role3')){
try {
if(msg.channel.type == 'DM'){
if(msg.content == 'Answer3'){
member.roles.add(memberRole3)
msg.author.send("Riddle4")
}
}

} catch (error) {
console.log(error)
}
}
else if(client.guilds.cache.get('ServerID').members.cache.get(msg.author.id).roles.cache.some(role => role.name === 'Role4')){
try {
if(msg.channel.type == 'DM'){
if(msg.content == 'Answer4'){
member.roles.add(memberRole4)
}
}

} catch (error) {
console.log(error)
}
}
}
client.on('messageCreate', (msg) => {
let server = client.guilds.cache.get('ServerID')
let memberRole1= server.roles.cache.find(role => role.name === "role1")
let memberRole= server.roles.cache.find(role => role.name === "role2")
let memberRole2= server.roles.cache.find(role => role.name === "role3")
let memberRole3= server.roles.cache.find(role => role.name === "role4")
let memberRole4= server.roles.cache.find(role => role.name === "FinalRole")


let member = server.members.cache.get(msg.author.id)
restart(msg, member, memberRole1)
test(msg, memberRole,memberRole2,memberRole3,memberRole4, member)
}

);

我已经尝试使用在IF中使用的相同功能,但如上所述,bot不更新它的信息,直到用户在服务器中发送消息。

谢谢你的帮助。

你总是可以强制更新成员:

member.fetch(true);

https://discord.js.org//docs/主/稳定/类/成员? scrollTo =获取

我不建议经常这样做相反,如果您不知道用户所处的谜题,您可能应该为每个用户执行一次此操作,然后在对象中本地存储他们所处谜题的状态。例如:

const userToRiddleNum = {};
const roleToRiddleNum = {
role1: 1,
role2: 2,
role3: 3,
'final role': 4,
};
// Later, in test() or 'messageCreate' or what not
if (!(member.user.id in userToRiddleNum)) {
// Make sure roles are up to date
await member.fetch(true);
// Set the user's riddle num to the highest
// riddle num of all their roles
userToRiddleNum[member.user.id] = Math.max(
...member.roles.cache.map((role) => roleToRiddleNum[role.name] || 0),
);
}
// Later
userToRiddleNum[member.user.id] // Up to date!
// Now the user solved a riddle:
userToRiddleNum[member.user.id]++

正如您提到的,您使用角色作为指示用户当前所处问题的方式,我建议您做一些"更容易"的事情,即使用quick.db

有了这个,你就可以跟踪人们的问题,例如:

db.set(`${message.member.id}.question`, 1);

然后检查

里面是什么问题
if(`${message.member.id}.question`) == 1){
//They are on question 1 do stuff -->
db.set(`${message.member.id}.question`, 2);
}

您可以熟悉quick.db文档和它一起玩。

最新更新