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. 新しいユーザー定義フィルタを追加する

サンプルと同様に、「テスト」という文字列を変換するユーザー定義フィルタを追加してみます。

  1. サンプルのfilters\housou_kinshi_sample.jsonをコピーしてfilters\test.jsonを作成します。
  2. filters\test.jsonをメモ帳などで開きます。
  3. 以下のように編集します。
     {
       "type": "string",
       "pattern": "テスト",
       "replace_to": "h)変換された文字列y)"
     }
    
  4. 上書き保存してメモ帳を閉じます。
  5. Nurseryをボイスチャンネルに入室させた状態で、以下のコマンドを使ってユーザー定義フィルタを再読み込みします。(※bot名は各自で読み替えてください。)
    @nursery-bot udfreload
    
  6. 新しいユーザー定義フィルタ設定が反映されているか確認します。
    これはテストです。
    

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"
  ]
}

上の例では、以下の順番でユーザー定義フィルタが適用されます。

  1. ichiban.json
  2. niban.json
  3. 1,2,4,5以外のすべてのユーザー定義フィルタ(順番は気にしない)
  4. ushiro_kara_niban.json
  5. ichiban_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. プラグインの無効化

  1. plugins\plugins.jsonをメモ帳などで開きます。
  2. Nursery.UserDefinedFilterPlugin.で始まる行を削除します。
  3. 上書き保存してメモ帳を閉じます。
  4. 次回の起動時から、UserDefinedFilterプラグインが無効になります。