2017-07-23 50 views
1

所以我創建一個使用Node.JS/Discord.JS的機器人,我有一個問題。Discord <@!userid> vs <@userid>

在某些服務器上,當您提到用戶時,它將在控制檯中作爲<@!userid>返回,而在另一臺服務器上則返回爲<@userid>。 我的機器人有一個簡單的點/級別系統,它保存在<@!userid>這樣的JSON文件中,所以在某些服務器上,當試圖通過提及它們來查看用戶點時會起作用,而在另一些服務器上則不會。

有沒有人有任何想法如何解決這個問題?我試着多次找到答案,並且我不希望將它保存兩次,一次爲<@!userid>,然後是<@userid>。如果這是解決問題的唯一方法,那麼我明白。

感謝您的幫助!

+0

請添加最小代碼示例,以重現您嘗試解決的錯誤。 – MedAli

回答

2

<@!userID>中的感嘆號表示它們在該服務器中設置了別名。因爲它可以在任何地方工作,所以沒有感嘆號使用它更可靠。此外,你應該保存用戶的ID,而不是整個提及(「< @userid>」)。使用正則表達式解析出額外的符號。

var user = "<@!123456789>" //Just assuming that's their user id. 
var userID = user.replace(/[<@!>]/g, ''); 

這會給我們123456789。他們的用戶ID。當然,你可以很容易地獲取用戶對象(你很可能會得到他們的用戶名)兩種方式,如果他們的服務器是哪裏的,你所用的命令,你可以

var member = message.guild.member(userID); 

OR如果它們不在服務器中,並且您仍然想要訪問其用戶對象,那麼;

client.fetchUser(userID) 
    .then(user => { 
     //Do some stuff with the user object. 
    }, rejection => { 
     //Handle the error in case one happens (that is, it could not find the user.) 
    }); 

可以ALSO只需訪問成員對象直接形成標籤(如果他們在郵件中標記它們)。

var member = message.mentions.members.first(); 

就這樣,沒有任何正則表達式,你可以得到完整的成員對象。並保存他們的ID。

var memberID = member.id;