リアクションを使って簡単にページネーションを作成する Discord.js 専用のパッケージ
https://gyazo.com/91924cf5eb3442bfc0ca95540d2a3658
InkoHX InkoHX.icon が作成した Discord.js Reaction Controller を使用することで、上のGIFのようなものを簡単に実装することができます。
TypeScript で書き直したため、GitHub のリポジトリからダウンロードして使用する方法は使えなくなりました。
npm からダウンロードして使用する必要があります。
今後もアップデートすると思うので、更新したらなるべく早くここに書こうと思います。
Discord.js v13にはまだ対応していません。
gx1285.iconアーカイブされたが、対応する予定はあるのだろうか
InkoHX.iconありません
必要とするもの
Node.js v12
Discord.js v12.2.0
インストール
NPM npm i discord.js-reaction-controller
Yarn yarn add discord.js-reaction-controller
v2.x.x系の変更点
現在の最新バージョン
v1.x.x との違い
nextPage prevPage sendToメソッドが追加されました
currentPageプロパティが追加されました
sendメソッドが非推奨に
ReactionContoller
コンストラクタ
currentPage
getter
現在のページを数値で返します。
ただし0を1ページとする
メソッド
nextPage
次のページにメッセージを編集します
1ページならば、2ページにします
スローするかもしれないエラー
CollectorError
sendToでCollectorを作成していない、またはCollectorが終了されている場合に発生します
PageNotFoundError
次のページが存在しない場合に発生します
prevPage
前のページにメッセージを編集します
2ページならば、1ページにします
スローするかもしれないエラー
CollectorError
sendToでCollectorを作成していない、またはCollectorが終了されている場合に発生します
PageNotFoundError
前のページが存在しない場合に発生します
send
v2.xからは非推奨のメソッドとなり、使用すると警告が表示されます
内部ではthis.sendTo(message.channel, message.author)を実行しています
sendTo
第一引数にはTextBasedChannelを入れてください
TextChannelクラスやDMChannelクラスが該当します
第二引数(オプション)
UserクラスまたはGuildMemberクラスを入れると、そのユーザーのみがページを操作できます
配列にUserクラスまたはGuildMemberクラスを入れて渡すとそれらのユーザーのみがページを操作できるようにします
入力しない場合全てのユーザーがページを操作できます
Promiseを用いて遅延読み込みを実装する
Promise<MessageEmbed>を返す関数をaddPagesやaddPageに渡すことで利用可能になります
渡された関数はユーザーがページをめくった時に実行され、Promise<MessageEmbed>を解決、キャッシュしユーザーに表示されます
どのような場合に使えばいい?
ファイルアクセスや、ネットワークを通じた外部への通信、Node.jsの暗号化モジュールなどを利用するページが多い場合
使用例
code:js
const { Client, MessageEmbed } = require('discord.js')
const { ReactionController } = require('discord.js-reaction-controller')
const { getBasicInfo } = require('ytdl-core')
const client = new Client()
const fetchYouTubeVideoInfo = videoUrl => async () => {
const { videoDetails } = await getBasicInfo(videoUrl)
return new MessageEmbed()
.setColor('RED')
.setTitle(videoDetails.title)
.setURL(videoDetails.video_url)
.setImage(videoDetails.thumbnailsvideoDetails.thumbnails.length - 1.url)
.setTimestamp(Date.parse(videoDetails.publishDate))
.setFooter('Uploaded on')
.setAuthor(videoDetails.author.name, videoDetails.author.thumbnails0.url, videoDetails.author.channel_url)
}
const videos = [
'https://youtu.be/sWbD5q769Ms',
'https://youtu.be/0-zJNiSvz8Q',
'https://youtu.be/1x2izJEN9p0',
'https://youtu.be/gNp4VNr44hg',
'https://youtu.be/Vi_asBY5UX8',
'https://youtu.be/plqoPcKQnyE',
'https://youtu.be/308I91ljCWg'
]
client.on('message', message => {
if (message.content.startsWith('>pagination')) {
const controller = new ReactionController(client)
controller
.addReactionHandler('🤔', (reaction) => {
reaction.message.channel.send('thinking')
.catch(console.error)
})
controller.addPages(videos.map(url => fetchYouTubeVideoInfo(url)))
controller.sendTo(message.channel, message.author)
.catch(console.error)
}
})
client.login()
使用方法(v1.x.x)
ReactionControllerクラス
コンストラクタ
client
Clientクラスのインスタンスを入れてください。
options
ReactionCollectorOptions を入れることができます。(CollectorOptions を入れることもできます)
オプションなので必要なときに入力してください。
プロパティ
client
コンストラクタで渡された Clientクラスのインスタンスが入っています。
options
コンストラクタで渡された ReactionCollectorOptions が入っています。
オプションなので渡されたなかった場合は undefined
pages
addPage, addPages メソッドを使用して追加されたページが Collection<number, MessageEmbed> という感じで Collection に格納されています。
handlers
addReactionHandler メソッドを使用して追加したリアクションハンドラーは Collection<string, ReactionHandlerFunction> という感じで Collection に格納されています。
メソッド
send
ページを送信する際に使用するメソッドです。
第一引数にはMessageクラスを入れてください。
返り値 Promise<Array<MessageReaction | undefined>>
ページは addPage または addPages メソッドを使用し、必ず一つ追加してください。
ページがない場合はエラーが発生します。
addReactionHandler
追加でハンドリングするリアクションを追加して、自身で処理を追加できます。
第一引数には絵文字またはカスタム絵文字のID、GuildEmoji、ReactionEmoji をのどれかを入れてください。
第二引数には第一引数で入れた絵文字がリアクションで追加された際に実行する処理を関数で入れてください。
addReactionHandler(絵文字, (reaction, user) => { /* code */ })
reaction は MessageReactionクラス
user は Userクラス
返り値は ReactionControllerクラス のインスタンスを返します。
addPage
ページを一つ追加します。
第一引数には MessageEmbed を入れてください。
返り値は ReactionControllerクラス のインスタンスを返します。
addPages
複数のページを追加するときに役立ちます。
第一引数には配列に MessageEmbed を入れたものを入れてください。
返り値は ReactionControllerクラス のインスタンスを返します。
今後実装したいものとか
なんかあったら書いてクレメンス InkoHX.icon