userdefinedfilter_ja - noonworks/Nursery GitHub Wiki
UserDefinedFilterプラグイン
UserDefinedFilterプラグインは、ユーザーが自分でパターンを定義して文字の置換およびBotからのメッセージ送信を行えるプラグインです。
1. プラグインの有効化
標準で有効化されています。特に操作は必要ありません。
2. ユーザー定義フィルタのサンプルを試す
2-1. ユーザー定義フィルタのサンプル
標準で、サンプルとして1つのユーザー定義フィルタがインストールされています。このサンプルは「放送禁止用語サンプル」という文字列に反応します。
Nurseryを起動し、ボイスチャンネルに入室させてから、以下のテキストを読み上げさせてみてください。
これは放送禁止用語サンプルです。
「放送禁止用語サンプル」の部分が変換されて読み上げられます。
2-2. サンプルの解説
サンプルのファイルはfilters\housou_kinshi_sample.json
です。
{
"type": "string",
"pattern": "放送禁止用語サンプル",
"replace_to": "音程(200)ホニャニャニャニャニャニャ音程(100)"
}
この設定で、メッセージ内の「放送禁止用語サンプル」という文字列を「音程(200)ホニャニャニャニャニャニャ音程(100)」に変換しています。「音程(200)」と「音程(100)」は棒読みちゃんのコマンドです。
2-3. 新しいユーザー定義フィルタを追加する
サンプルと同様に、「テスト」という文字列を変換するユーザー定義フィルタを追加してみます。
- サンプルの
filters\housou_kinshi_sample.json
をコピーしてfilters\test.json
を作成します。 filters\test.json
をメモ帳などで開きます。- 以下のように編集します。
{ "type": "string", "pattern": "テスト", "replace_to": "h)変換された文字列y)" }
- 上書き保存してメモ帳を閉じます。
- Nurseryをボイスチャンネルに入室させた状態で、以下のコマンドを使ってユーザー定義フィルタを再読み込みします。(※bot名は各自で読み替えてください。)
@nursery-bot udfreload
- 新しいユーザー定義フィルタ設定が反映されているか確認します。
これはテストです。
3. コマンド
@nursery-bot udfreload
3-1. ユーザー定義フィルタを再読み込みするコマンドです。
通常、ユーザー定義フィルタはNursery起動時に自動で読み込まれるので、このコマンドを使用する必要はありません。ただし、Nursery起動中に設定を変更した場合、変更した分は自動で再読み込みされません。その場合にこのコマンドを使って再読み込みします。
4. ユーザー定義フィルタ全体の設定
filters\filters.json
は、ユーザー定義フィルタ全体の設定です。
{
"filters": [
"*"
],
"disabled": [
]
}
filters
: 適用するユーザー定義フィルタのリストです。disabled
: 無効化するユーザー定義フィルタのリストです。
filters
4-1. - 適用するユーザー定義フィルタのリストを記述します。
- ユーザー定義フィルタは、ここに書かれた順番で適用されます。
"*"
は特殊なパターンで、「すべてのユーザー定義フィルタ」を意味します。
{
"filters": [
"ichiban",
"niban",
"*",
"ushiro_kara_niban",
"ichiban_ushiro"
]
}
上の例では、以下の順番でユーザー定義フィルタが適用されます。
ichiban.json
niban.json
- 1,2,4,5以外のすべてのユーザー定義フィルタ(順番は気にしない)
ushiro_kara_niban.json
ichiban_ushiro.json
disabled
4-2. - 無効化するユーザー定義フィルタのリストを記述します。
- 無効化されたユーザー定義フィルタは、
filters
に指定してあっても、実行されません。(disabled
の設定が優先されます。)
5. ユーザー定義フィルタ設定詳細
- 設定ファイルはJSON形式です。
- 必要に応じて
"
や\
などはJSON形式のエスケープをしてください。 - フィルタのタイプには以下の3種類があります。
- stringタイプ
- regexタイプ
- functionタイプ
5-1. stringタイプ
文字列で指定するユーザー定義フィルタ設定です。
{
"type": "string",
"pattern": "pattern-string",
"replace_to": "replace-string",
"send_message": "send_message-string"
}
type
:"string"
を指定します。pattern
: 置換する文字列を指定します。replace_to
:pattern
にマッチした文字列を、ここで指定した文字列に置き換えて読み上げます。""
を指定すると文字の削除になります。
send_message
:pattern
にマッチした場合、ここで指定した文字列をBotからDiscordに送信します。- メッセージには特殊書式が使用できます。
""
を指定した場合、メッセージは送信されません。
5-2. regexタイプ(上級者向け)
正規表現で指定するユーザー定義フィルタ設定です。
{
"type": "regex",
"pattern": "regex-string",
"replace_to": "replace-string",
"send_message": "send_message-string"
}
type
:"regex"
を指定します。pattern
: 置換する正規表現を指定します。例えば、/[0-9]/
にマッチさせたい場合は[0-9]
と記述します。使用できる正規表現は.NET の正規表現に準拠します。replace_to
:pattern
にマッチした文字列を、ここで指定した文字列に置き換えて読み上げます。""
を指定すると文字の削除になります。- 正規表現での置換に準拠した置換要素を使用することができます。
send_message
:pattern
にマッチした場合、ここで指定した文字列をBotからDiscordに送信します。
5-3. functionタイプ(上級者向け)
JavaScriptの関数で指定するユーザー定義フィルタ設定です。
- 関数は
pattern
もしくはfunction_file
のどちらかで指定します。 - 関数が長い場合、
function_file
を使った方が管理が楽になります。
{
"type": "function",
"pattern": "function-string",
"function_file": "function-file-path",
"function_name": "function-name"
}
type
:"function"
を指定します。pattern
: JavaScriptコードを文字列で指定します。エスケープを忘れないよう注意してください。関数の仕様は後述します。function_file
が指定されていた場合、pattern
は無視されます。function_file
: JavaScriptコードの記述されたファイルのパスを文字列で指定します。関数の仕様は後述します。function_name
: 関数名を文字列で指定します。pattern
もしくはfunction_file
で指定したJavaScriptコードのうち、ここで指定した関数が呼ばれます。
function function_name(obj) {
// ...
return "some_text";
}
- 関数は、
IJSArgument
型の引数1つを受け取り、string
もしくはstring[2]
の結果を返します。string
を返した場合、元のメッセージ全体が、返された文字列に置き換えられます。string[2]
をを返した場合、- 元のメッセージ全体が、返された配列の1つ目の文字列に置き換えられます。
- 返された配列の2つ目の文字列を、BotからDiscordに送信します。メッセージには特殊書式が使用できます。
- nullを返すと「マッチしなかった」扱いとなります。
IJSArgument
型およびそのメンバの型についてはJavaScriptから使用可能なインターフェースを参照してください。
JavaScript関数の例
設定ファイルと関数ファイルのセットをfilters
フォルダに保存します。
- 設定ファイル
nenasai.json
{
"type": "function",
"function_file": "nenasai.js",
"function_name": "nenasai"
}
- 関数ファイル
nenasai.js
// 田中さんと山田さんに対する「寝なさい」「寝ろ」といった文章を含むメッセージを、ロボットの声で再生するよう変換する関数
function nenasai(obj) {
if (/((田中)|(山田)).*[ね寝](ろ|(なさい))/.test(obj.Message.Content)) {
return '-- g)エコー)' + obj.Message.Content
}
return null;
}
- 関数ファイル
nenasai.js
の別バージョン
// 鈴木さんに対する「寝なさい」「寝ろ」といった文章を含むメッセージに、Botが同調する
function nenasai(obj) {
if (/鈴木.*[ね寝](ろ|(なさい))/.test(obj.Message.Content)) {
return [obj.Message.Content, '${reply} 私もそう思います。'];
}
return null;
}
6. プラグインの無効化
plugins\plugins.json
をメモ帳などで開きます。Nursery.UserDefinedFilterPlugin.
で始まる行を削除します。- 上書き保存してメモ帳を閉じます。
- 次回の起動時から、UserDefinedFilterプラグインが無効になります。