ひぃの雑多書き

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

【discordjs v14】スラッシュコマンドでスレッドを作成する

結論

    // スレッドを作成
    const thread = await sent.channel.threads.create({
      name: `${option_thread_name}`,
      autoArchiveDuration: 60,
      reason: 'スレッド作成の理由',
    });

    // コマンド実行者は最初からスレッドに追加する
    thread.members.add(interaction.user.id);

やりたいこと

discord.jsでスラッシュコマンド実行時にスレッドを作成したい。
コマンド実行者は最初からスレッドに追加しておきたい。

チャンネルを拾ってきてスレッドを作る

TextChannelクラスを手に入れれば、そこからthreads.create()で作れます。

自分はスラッシュコマンドの処理(返信)をした後にそのチャンネルでスレッドを作りたかったので、interaction.replyをsentに入れてます。

試してないけど、スラッシュコマンドを実行したチャンネルでスレッドを作りたいだけならinteraction.channel.threads.create()でも動くはず。
もちろん、スラッシュコマンドとして何らかの応答は別途してあげる必要があります。

どこのチャンネルでスラッシュコマンドを実行しても、特定のチャンネルでスレッドを作るなんてことも可能です。
事前に定数でチャンネルIDを持って、チャンネルをfetch()で取得してから.threads.create()でいけると思います。

ちなみに、作成時のreason(理由)はぱっと見た感じではどこかに書かれたりしてなさそうだったので、何でもいいと思います。
てっきりトピックとかに記載されるもんだと思ったんですけどね。

参加者を追加する

thread.members.addでできます。

誰がコマンドを実行しても管理人は初期で追加したい場合は、定数でユーザIDを持っておけばOK。

逆に、スレッドからメンバーを削除したい場合はremoveで。

userクラスを先に持っている場合はjoin/leaveが使えるみたいだけど、試してないのでやりたい方は参考文献を読んでください。

おまけ:スレッドの取得方法

    // 名前でスレッドを取得
    const thread = message.channel.threads.cache.find(x => x.name === `${option_thread_name}`);

    // IDでスレッドを取得
    // ※IDはthread.idで取得できる
    const thread = await message.channel.threads.fetch(thread_id);

名前でスレッドを取得する場合、同名のスレッドがあると意図した挙動にならないので注意。
パッと試した感じ、一番最初に作られたスレッドがヒットしているっぽい?

用が済んだらスレッドを削除するなら名前検索でも問題なさそうだが、アーカイブ化して残しておく場合は大人しくIDをDBに保存しておいてIDでスレッドを取得した方が良さそう。

おまけ:スレッドのアーカイブ化、削除

    // スレッドをアーカイブする
    thread.setArchived(true);
    thread.setLocked(true);

    // スレッドを削除する
    thread.delete();

setArchivedとsetLockedの違いは権限です。
Archivedでアーカイブしたスレッドは誰でも解除できるのに対し、Lockedでアーカイブしたスレッドは権限を持つ人しか解除できないらしい。

身内鯖なら取り敢えずsetArchivedで良さそう。

autoArchiveDuration

多分これのことです。

わかってないこと

autoArchiveDurationの指定でdiscordjs側で用意している定数があるっぽい?

ThreadAutoArchiveDuration.TIME_1_HOUR

があるようだが、ThreadAutoArchiveDurationがどこにいるかわかっていない。
少なくとも、「Discord.ThreadChannel.ThreadAutoArchiveDuration」はundefinedだった。

文献

discordjs.guide

old.discordjs.dev