【问题标题】:Auto role when someone is playing?有人在玩时自动扮演角色?
【发布时间】:2019-11-06 02:36:22
【问题描述】:

我正在尝试让我的机器人在某人开始游戏时自动将其添加到角色中,并在他们离开游戏时将其从该角色中删除。

我已经尝试了几件事,但没有成功:

其他一些机器人更改活动,但我不希望将我服务器的其他机器人添加到角色中,所以我这样做了(而且它似乎有效):

let roleid = "ROLE BOT ID" 

if (newMember.roles.has(roleid)) {}
else {console.log("my code here")}    

我的印象是 discord.js “聚集”了玩游戏的人(在桌面上)和连接到移动设备的人。所以我尝试像那样将它们分开,但“!=”似乎不起作用:

if (newMember.presence.clientStatus = 'desktop') {console.log("my code here")}

最后一个问题是当我离开游戏时,我的机器人将我添加到角色中

这是我的全部代码

client.on('presenceUpdate', (oldMember, newMember) => {
let guildChannels = newMember.guild;
let roleid = "ROLE BOT ID" 

if (newMember.roles.has(roleid)) {}
else {
 if (newMember.presence.clientStatus = 'desktop') {
  if (newMember.presence.ActivityType = 'PLAYING') {
   newMember.addRole(newMember.guild.roles.find (x => x.id == 'PLAYING ROLE ID'))
  console.log(newMember.user.tag + ' -> "ROLE PLAYING NAME"')
}
else {newMember.removeRole(newMember.guild.roles.find (x => x.id ==     'PLAYING ROLE ID'))
    console.log(newMember.user.tag + ' / "ROLE PLAYING NAME"')
   }
  }
 }

});

我希望我的机器人添加所有扮演角色的人,并在他们完成后删除他们

我没有错误消息,只是我的机器人没有按照我的意愿做事,我没有解释

【问题讨论】:

    标签: javascript discord.js


    【解决方案1】:
    if (newMember.presence.clientStatus = 'desktop') {console.log("my code here")}
    
    if (newMember.presence.ActivityType = 'PLAYING') {
    

    这些代码不起作用的原因是因为您使用的是assignment operator=,而不是comparison operator,如=====。本质上,代码是设置属性而不是比较它们。

    使用比较运算符来检查属性的值,而不是赋值运算符。


    Presence.ActivityType 不是Presence 的有效属性。

    检查用户的游戏 (Presence.game) 看看他们是否在玩什么游戏。


    其他一些机器人更改活动,但我不希望将我服务器的其他机器人添加到角色中...

    检查User 是否是具有User.bot 属性的机器人。


    如果用户改变了他们的状态(即在线 --> 免打扰)或开始听音乐、观看流媒体等,即使他们的游戏没有改变,您的代码也会被执行。

    您需要检查旧状态并将其与新状态进行比较,以确保用户开始或停止玩游戏。


    您没有发现任何被拒绝的Promises

    使用try...catch 语句或将catch() 方法附加到Promises。


    代码

    client.on('presenceUpdate', (oldMember, newMember) => {
      const guild = newMember.guild;
      const playingRole = guild.roles.find(role => role.id === 'PLAYING ROLE ID');
    
      if (newMember.user.bot || newMember.presence.clientStatus === 'mobile' || oldMember.presence.status !== newMember.presence.status) return;
    
      const oldGame = oldMember.presence.game && [0, 1].includes(oldMember.presence.game.type) ? true : false;
      const newGame = newMember.presence.game && [0, 1].includes(newMember.presence.game.type) ? true : false;
    
      if (!oldGame && newGame) {         // Started playing.
        newMember.addRole(playingRole)
          .then(() => console.log(`${playingRole.name} added to ${newMember.user.tag}.`))
          .catch(console.error);
      } else if (oldGame && !newGame) {  // Stopped playing.
        newMember.removeRole(playingRole)
          .then(() => console.log(`${playingRole.name} removed from ${newMember.user.tag}.`))
          .catch(console.error);
      }
    });
    

    【讨论】:

    • 非常感谢!有太多的错误需要纠正……但作为一个“初学者”,我每天都会学到更多:)
    • 学习就是一切。没有错误就无法学习。我很高兴能帮上忙。
    • 哦,我还有一个小问题.. 在Spotify上听音乐或正在观看流的用户也包括在内 我试过这个:if (newMember.user.bot || newMember.presence.clientStatus === 'mobile' || newMember.presence.game == null) return; if (newMember.presence.game.type == '0') {my code} 但是当用户突然离开他们的游戏时,存在被计为'null' 并且不应用其余代码
    • 查看编辑后的代码。它正在检查Gametype 属性,以确保它们正在播放或流式传输。
    • 对不起,我不明白。我忘了指定当用户不再做任何事情时,“.type”将返回一个“null”,这会使机器人崩溃
    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 2020-08-19
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多