サーバー用の簡単な見積もりボットを作成しましたが、管理者はmod +の人だけがスパムを避けるために見積もりを追加できるようにしたいと考えています。ドキュメントに行ってすべてを行いましたが、これを機能させることができません。ここに私が持っているものがあります:
//other code
else if (command === "addquote" && arg) {
let adminRole = message.guild.roles.find("name", "Admin");
let modRole = message.guild.roles.find("name", "Mod");
if(message.member.roles.has(adminRole) || message.member.roles.has(modRole)){
const hasArr = arr.some((el) => {
return el.toLowerCase().replace(/\s/g, '') === arg.toLowerCase().replace(/\s/g, '');
});
if(hasArr){
message.channel.send(arg.replace(/\s+/g,' ').trim() + " is already a Quote");
} else {
fs.appendFileSync('./Quotes.txt', '\r\n' + arg);
message.channel.send("Quote added: " + arg);
arr.Push(arg);
}
}
}
それは非常に気難しいです。場合によっては、ユーザーがmodロールを持っている場合に機能しますが、ほとんどの場合は機能しません。私が行った場合
console.log(message.memeber.roles.has(adminRole));
console.log(message.memeber.roles.has(modRole));
どちらもfalseに出力されますが、機能しますか?正直なところ、現時点ではわかりません。
Discord.js APIが更新され、.exists()
が廃止されたため、より良い方法があります。
if (message.member.roles.some(role => role.name === 'Whatever')) {}
.find()
はロールオブジェクト(または未定義)を返し、それがブール値に変換されるため、これは.find()
よりも優れています。 .some()
メソッドは、デフォルトでブール値を返します。
message.member.roles
はコレクションです。役割オブジェクトを取得してから探すのではなく、コレクションで直接役割を探します。これを試して:
else if (command === "addquote" && arg) {
if(message.member.roles.find(r => r.name === "Admin") || message.member.roles.find(r => rname === "Mod")){
//Rest of your code
}
注、ロール名は、絵文字がロール名に含まれている場合は、その絵文字を含めて、検索で入力した名前でなければなりません。
Map.has メソッドは値ではなくキーをチェックするため、代わりにロールのIDを使用する必要があります。
message.member.roles.has(adminRole.id)
message.member.roles.has(modRole.id)
if(message.guild.roles.find(role => role.name === "VIP"))