結論
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してきてもいいんですが、こっちのが楽だと思います。