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. コマンド
3-1. @nursery-bot udfreload
ユーザー定義フィルタを再読み込みするコマンドです。
通常、ユーザー定義フィルタはNursery起動時に自動で読み込まれるので、このコマンドを使用する必要はありません。ただし、Nursery起動中に設定を変更した場合、変更した分は自動で再読み込みされません。その場合にこのコマンドを使って再読み込みします。
4. ユーザー定義フィルタ全体の設定
filters\filters.jsonは、ユーザー定義フィルタ全体の設定です。
{
"filters": [
"*"
],
"disabled": [
]
}
filters: 適用するユーザー定義フィルタのリストです。disabled: 無効化するユーザー定義フィルタのリストです。
4-1. filters
- 適用するユーザー定義フィルタのリストを記述します。
- ユーザー定義フィルタは、ここに書かれた順番で適用されます。
"*"は特殊なパターンで、「すべてのユーザー定義フィルタ」を意味します。
{
"filters": [
"ichiban",
"niban",
"*",
"ushiro_kara_niban",
"ichiban_ushiro"
]
}
上の例では、以下の順番でユーザー定義フィルタが適用されます。
ichiban.jsonniban.json- 1,2,4,5以外のすべてのユーザー定義フィルタ(順番は気にしない)
ushiro_kara_niban.jsonichiban_ushiro.json
4-2. disabled
- 無効化するユーザー定義フィルタのリストを記述します。
- 無効化されたユーザー定義フィルタは、
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プラグインが無効になります。