discord.jsのフレームワークKlasaが強すぎる 

# Klasaは廃止されました

**この記事を見て、Klasaを使ったDiscordボットを開発しようとしている方はKlasaを使用しないで、別のフレームワークの使用を考えてください。**

**また現在Klasaを使用している方は、今すぐ移行を開始することを推奨します。**

-----------

# Klasaとは何なのか

[Klasa](https://klasa.js.org/#/)とは[discord.js](https://discord.js.org/#/)ライブラリ上に構築された「プラグ・アンド・プレイ」フレームワークです。
100%カスタマイズ可能でしかも扱いやすいdiscord.jsを使用している人なら誰でも「これを求めていた！」となる位凄いです。
なのにまだ日本ではあまり知られていない・まだ知名度も低いなので皆さんに知ってもらおうと記事を書いてみました！

# ざっくりこんな感じ

- 面倒な作業が不要
- メンテナンスしやすい
- 多言語対応が簡単にできちゃう！
- コマンドの使用権限を細く設定できる。
- 自分の好きなようにKlasa、discord.jsを拡張できる。
- 色付きで見やすいログ
- VS Code用の拡張機能もある
- 特定のデータベースをサポートしている。（MongoDB, Firestore, LevelDB などなど[これ以外にも](https://github.com/dirigeants/klasa-pieces/tree/master/providers)）自分でカスタマイズして追加することも可能

ボットの規模が大きくなり、複雑化してきているならKlasaに移動してみるといいかも！

# 前提

discord.jsは半分位理解しておくとKlasaはかなり扱いやすいと思います。

まず[Node.js](https://nodejs.org/ja/)のv12.0.0以上を使用して下さい。
次にdiscord.jsとKlasaのインストールを行います。

```bash:npm
npm install --save discord.js dirigeants/klasa#v1.0.0-alpha
```

## 注意
Stableバージョンは現在サポートされていない状態です。最新のv1.0.0-alphaブランチを使うようにしてください。

# ボットを起動してみる。
このようにコードを書くだけで起動できます。

```js:index.js
const { Client } = require('klasa');

// Klasaのクライアントオプション: https://klasa.js.org/#/docs/klasa/master/typedef/KlasaClientOptions
new Client({
    prefix: '!!', // ボットのPrefix
}).login('token'); // ここにボットのトークン
```

そして保存し以下のコマンドを実行して下さい。

```bash:node
node index.js
```
色付きのコンソールメッセージに完了の文字が出たら起動成功です！

## デフォルトで実装されているコマンド

- help **コマンド一覧をDMに送信する。**
- invite **ボットの招待URLを送信する。（ボットに必要な権限も自動で設定してくれるので使用する側も導入する時とても安心）**
- info **ボットの紹介メッセージを送信する。（デフォルトではKlasaの紹介文が送信されます。言語ファイルから変更可能です。）**
- ping **ボットの応答速度を計測する。**
- stats **ボットの統計情報を送信する。（使用メモリ、起動時間などなど）**
- userconf **ユーザー（自分）の設定を変更したり、確認できるコマンド**
- conf **サーバーの設定を変更したり、確認できるコマンド（サーバーの管理者権限を持っている人のみ使用できるコマンド）**
- reload **編集されたファイルを再読み込みする。（プログラムを一々終了しなくてもいいので結構便利、アプリケーションの管理者のみ利用できる。）**
- reboot **プログラムを再起動する。（使用にはforeverやpm2などが必要、アプリケーションの管理者のみ利用できる。）**
- eval **JavaScriptのコードを実行できるコマンド（アプリケーションの管理者のみ利用できる。）**
- blacklist **サーバーやユーザーをブラックリストに登録したりできるコマンド（アプリケーションの管理者のみ利用できる。）**
- disable **コマンド、イベント、モニターなどを再度無効にするか、一時的に無効化するためのコマンド（再起動で初期の状態に戻る、無効化したピースは`enable`コマンドを使うことで有効化できる。アプリケーションの管理者のみ利用できる。）**
- enable **コマンド、イベント、モニターなどを再度有効にするか、一時的に有効化するためのコマンド（再起動で初期の状態に戻る、有効化したピースは`disable`コマンドを使うことで無効化できる。アプリケーションの管理者のみ利用できる。）**
- unload **ピースをアンロードできる。（アプリケーションの管理者のみ利用できる。）**
- load **ピースをロードできる。（アプリケーションの管理者のみ利用できる。）**
- transfer **コアピースをそれぞれのフォルダに転送する。（？？？、アプリケーションの管理者のみ利用できる。）**

ざっくりとこんな感じです。さらに詳しく知りたい場合は`help`コマンドを実行するか、GitHubの[ソース](https://github.com/dirigeants/klasa/tree/master/src/commands)を見てください。

これらのコマンドを全て無効にしたい場合は[KlasaClientOptions](https://klasa.js.org/#/docs/klasa/master/typedef/KlasaClientOptions)にある`disabledCorePieces`に`["commands"]`と書いておくことで無効化できます。

## 生成されるフォルダー

- arguments
- commands
- extendables
- finalizers
- languages
- monitors
- providers
- serializers
- tasks
- events  

# コマンドを作ってみよう

`commands`フォルダーの中に`General`という名前のフォルダーを作ってその中に`hello.js`を作ってみましょう。
hello.jsにはこのように書いてみましょうか。

```js:hello.js
const { Command } = require('klasa');

module.exports = class extends Command {

    constructor(...args) {
        // コマンドのオプション: https://klasa.js.org/#/docs/klasa/master/typedef/CommandOptions
        super(...args, {
            description: '世界に挨拶をする。',
        });
    }

    async run(message) {
        return message.sendMessage('こんにちは、世界！')
    }
};
```

これでコマンドの実装は終わりです。Klasaを使用するとファイルの名前がコマンド名になります。`hello.js`の`hello`がコマンドの名前です。
他のコマンドを追加するときは、別の名前のJSファイルを作って同じように書いていくだけです。

ちなみに`General`というフォルダはコマンドのカテゴリになり、ヘルプコマンドで整理されて表示されます。これをうまく使うとよりよいボットが作れるでしょう。

そしてdiscord.jsを使用していて、一つのファイルを複雑にせずに済みますね。
Klasaは[公式ガイド](https://discordjs.guide)に記載されているような、コマンドハンドラーの実装部分を無くすことができ、簡単にコマンドを実装することができます。

# プラグイン

Klasaにはプラグインを追加できたりもできます。すげー

```js:index.js
const { Client } = require('klasa');

Client.use(require('plugin-name'));
```

これでプラグインを使うことができます。

## Klasaのプラグイン（公式）

- [klasa-member-gateway - Simple plugin to manage an efficient per-member settings gateway.](https://github.com/dirigeants/klasa-member-gateway)
- [klasa-dashboard-hooks - Simple plugin to expose an api from a klasa bot. Lets you build an external dashboard in one of several frameworks such as Vue.js.](https://github.com/dirigeants/klasa-dashboard-hooks)

## Klasaのプラグイン（非公式）

非公式ですが、このようなものもあります。

- [no-mention-spam - A klasa plugin to seamlessly replicate no-mention-spam behavior in klasa bots](https://github.com/KlasaCommunityPlugins/no-mention-spam)
- [tags - A simple klasa plugin to add tags functionality](https://github.com/KlasaCommunityPlugins/tags)
- [functions - Simple plugin that adds reloadable functions to your Klasa Bot.](https://github.com/KlasaCommunityPlugins/functions)
- [channels-gateway - A simple Klasa plugin which adds settings to all your channels](https://github.com/KlasaCommunityPlugins/channels-gateway)
- [raw-events - Simple plugin to handle raw events with ease.](https://github.com/KlasaCommunityPlugins/raw-events)
- [points - A simple plugin which adds points to your bot](https://github.com/KlasaCommunityPlugins/points)
- [arguments - A plugin which adds a Tags store to allow for the easy use of TagBuilder](https://github.com/KlasaCommunityPlugins/arguments)
- [statistics - A plugin which adds 2 statistics oriented stores](https://github.com/KlasaCommunityPlugins/statistics)
- [Starboard](https://github.com/KlasaCommunityPlugins/starboard)

# 多言語対応

もっと利用してくれるユーザーを増やしたい、そんな人もいるかもしれません。その手段の一つとしてKlasaには多言語にも対応できるようになっています。

## 日本語に対応する。

### GitHubから言語ファイルを落とす。

[klasa-pieces](https://github.com/dirigeants/klasa-pieces/blob/master/languages/ja-JP.js)に日本語の言語ファイルがあるので全部コピーして`languages`フォルダに`ja-JP.js`というファイルを作りペーストして保存するだけで、OKです。

### ボットのデフォルト言語を日本語にする。

とても簡単です。Clientオプションからデフォルトの言語を指定できます。

```js:index.js
const { Client } = require('klasa');

// Klasaのクライアントオプション: https://klasa.js.org/#/docs/klasa/master/typedef/KlasaClientOptions
new Client({
    prefix: '!!', // ボットのPrefix
    language: 'ja-JP', // 言語コード
}).login('token'); // ここにボットのトークン
```

おわり

## コマンドから言語を変更するには？

`conf`コマンドで変更できます。

```bash:conf
<prefix>conf set language ja-JP

or

<prefix>conf set language en-US
```

# Klasa botの開発を助けるVS Codeの拡張機能

公式が[klasa-vscode](https://marketplace.visualstudio.com/items?itemName=bdistin.klasa-vscode)というVS Code向けの拡張機能を出しています。便利なSnippetや簡単にピースをダウンロードできる機能もあります。

# TypeScriptを使いたい人向け

TypeScriptも使えますが、開発環境ではts-nodeのようなツールは使うことができないし、いちいちコンパイルしてリロードか再起動する必要があります。
[こちら](https://github.com/kyranet/klasa-ts-template)のテンプレートリポジトリが参考になると思います。

# 参考にしたサイト
- [Klasa](https://klasa.js.org/#/) - Klasaのドキュメントサイト