ひぃの雑多書き

日記からお役立ち情報まで色んなことを書きます。

【discordjs v14】新しく作成したロールを任意の上位ロールに設定する

結論

  const highest_role = await guild.roles.highest
  const new_role_position = highest_role.rawPosition - position

  const role = await guild.roles.create({ name: role_name, hoist: true });
  role.setPosition(new_role_position);

やりたいこと

discord.jsで作成したロールを上から任意の数値の場所に設定したい。

一般ユーザ向けの『member』ロールがある。
discord.jsで作成したロールメンバーをmemberより上に表示されるようにしたい。

ロールメンバーを別に表示する

DiscordのGUIで言う所の『オンラインメンバーとは別にロールメンバーを表示する』がONになってる状態です。

ロール作成時のプロパティで『hoist: true』に設定するとONにできます。

https://discord.js.org/#/docs/discord.js/main/class/Role?scrollTo=hoist

作成したロールを上から○番目に移動する

同じくRoleクラスのsetPositionを使うと実装できます。

https://discord.js.org/#/docs/discord.js/main/class/Role?scrollTo=setPosition

……が、ここで設定する数値は『現在の位置から○個上に移動する』という仕様のようです。
SetRolePositionOptionsのrelativeをtrueにしたらそういう挙動をするもんだと思ったんですが、明示的にfalseに設定してもダメでした。
もしかしたらただのバグで、そのうちrole.setPosition(4)とかで良くなるかも。

https://discord.js.org/#/docs/discord.js/main/typedef/SetRolePositionOptions

guild.roles.highestを使うことで、そのサーバの一番上に設定されてるロールの情報を取得することができます。
rawPositionに権限レベルが設定されているので、あとはその数値から任意の数を引いてあげれば、『上から○番目』の数値が得られます。

おまけ:ギルドクラスの取得方法

message.guildとか、interaction.guildで取得できます。
もちろん普通にclientからcache.getやfetchしてきてもいいんですが、こっちのが楽だと思います。