参考 : discord.jsのフレームワークKlasaが強すぎる
合わせて読んでください。
準備
- 環境
- Win10
- Node.js 12.13.0
- npm 6.12.0
適当にプロジェクトフォルダを作成し discord.js と Klasa をインストール
npm install --save discordjs/discord.js dirigeants/klasa
コーディング
最初の一歩
app.js
を作成
const secret = require('./secret.js'); // BOTトークンはここに記述
const token = secret.token;
const {Client} = require('klasa');
new Client({
prefix: '!!', // ボットのPrefix
language: 'ja-JP', // 言語コード
}).login(token);
この状態で一度 node app.js
から起動し、危険なログが出てなければとりあず成功。
コマンドの作成
commands/general
配下に以下のソースを作成。Klasaはファイル名がそのままコマンド名になる。
ディレクトリ名はヘルプのカテゴリ名になる。
なお、下のソースに書かれている usage
は単なる説明文ではなく引数のマッチャを参照するための記述なので注意。(これで30分ぐらい潰した……)
const {Command} = require('klasa');
module.exports = class extends Command {
/**
* @constructor
* @param {...any} args
*/
constructor(...args) {
// コマンドのオプション: https://klasa.js.org/#/docs/klasa/master/typedef/CommandOptions
super(...args, {
description: '挨拶を返す',
usage: '<name:string>', // <>は必須引数、[]はオプション引数、<名前:型>のように書く
});
}
/**
* @param {*} message
*/
async run(message,[name]) {
return message.sendMessage(`${name}さんこんにちは!`);
}
};
参考 :
Klasa : CreatingArguments
Klasa : CreatingCommands
BOTの反応はこんなかんじ
で、このときの message
にはどうやら KlasaMessage
という型が渡されている模様。ドキュメント見つからないけど。とりあえず
message.author.sendMessage('hogahoga');
とかすればその人にDMを送ることができたりする。
引数が複数あるコマンドの作成
Klasa公式の ADVANCED COMMANDS Commands I: Argumentsをななめ読みするだけだと「usageに複数の引数を指定すれば複数の引数を指定できる」となんとなく読み取れるが、それは間違いである。よく見ると「Repeating Arguments」の項に
you may want the user to write in multiple arguments, more likely with
,
asusageDelim
to separate them.
と書いてある。この usageDelim
パラメータを指定しないと引数を複数取ることができないので注意する。
const {Command} = require('klasa');
module.exports = class extends Command {
/**
* @constructor
* @param {...any} args
*/
constructor(...args) {
// コマンドのオプション: https://klasa.js.org/#/docs/klasa/master/typedef/CommandOptions
super(...args, {
description: 'n番のカードを対象に公開する、aなら全体に公開する。(opc)',
usage: '<target:number|a> <n:number> [...]',
usageDelim: ' ', /** これ! **/
runIn: ['text', 'group'],
aliases: ['opc'],
});
this.game = this.client.providers.get('ganparaGame');
}
/**
* @param {Message} message
*/
async run(message, [target, ...ns]) {
/** 中略 **/
return;
}
};
データストアの作成
providers
ディレクトリにプロバイダを作成する。公式を見るとなんか適当に書いてよさそうだったので適当に書いてみる。
const {Provider} = require('klasa');
module.exports = class extends Provider {
/**
* @constructor
* @param {...any} args
*/
constructor(...args) {
super(...args, {name: 'datas'});
this.counter = 0;
}
/**
* init
*/
init() {
this.counter=1;
}
/**
* countup
* @return {Number} count
*/
countup() {
this.counter++;
return this.counter;
}
};
hello.js
から動作確認してみる。
const {Command} = require('klasa');
module.exports = class extends Command {
/**
* @constructor
* @param {...any} args
*/
constructor(...args) {
// コマンドのオプション: https://klasa.js.org/#/docs/klasa/master/typedef/CommandOptions
super(...args, {
description: '挨拶を返す',
usage: '<name:string>',
});
this.data = this.client.providers.get('datas');
}
/**
* @param {*} message
*/
async run(message, [name]) {
return message.sendMessage(`${name}さんこんにちは!${this.data.countup()}回めの挨拶ですね!`);
}
};
本当に適当に動いてしまった。