コンテンツにスキップ

ReasonFilter

ReasonFilter は、EventReason に基づいてイベントをフィルタリングする EventHandler ラッパーです。指定した理由に一致するイベントのみを内部のハンドラに渡します。

追加インストールは不要です。mixi2-js に同梱されています。

// ESM
import { ReasonFilter } from 'mixi2-js/helpers';
// CJS
const { ReasonFilter } = require('mixi2-js/helpers');

イベントハンドラ内で毎回 eventReasonList をチェックするのは冗長です:

// ❌ 毎回理由をチェック
router.on(EventType.POST_CREATED, async (event) => {
const reasons = event.postCreatedEvent?.eventReasonList || [];
if (!reasons.includes(EventReason.POST_REPLY) && !reasons.includes(EventReason.POST_MENTIONED)) {
return; // スキップ
}
// 処理...
});

ReasonFilter を使えばフィルタリングをハンドラの外に分離できます:

// ✅ フィルタリングを分離
const filter = new ReasonFilter(router, [EventReason.POST_REPLY, EventReason.POST_MENTIONED]);
await watcher.watch(filter);
import { EventType, EventReason, StreamWatcher } from 'mixi2-js';
import { EventRouter, ReasonFilter } from 'mixi2-js/helpers';
const router = new EventRouter();
router.on(EventType.POST_CREATED, async (event) => {
// リプライとメンションのみがここに到達する
const post = event.postCreatedEvent?.post;
console.log("リプライ/メンション:", post?.text);
});
// リプライとメンションのみを通すフィルター
const filter = new ReasonFilter(router, [EventReason.POST_REPLY, EventReason.POST_MENTIONED]);
const watcher = new StreamWatcher({ streamAddress, authenticator });
await watcher.watch(filter);
const filter = new ReasonFilter(handler, [EventReason.DIRECT_MESSAGE_RECEIVED]);
await watcher.watch(filter);
const filter = new ReasonFilter(handler, [EventReason.POST_QUOTED]);
await watcher.watch(filter);
  • 理由リストがあるイベント: eventReasonList 内のいずれかの理由が許可リストに含まれていれば通過
  • 理由リストがないイベント: Ping など理由を持たないイベントはそのまま通過
  • 複数の理由: イベントが複数の理由を持つ場合、いずれか 1 つが一致すれば通過
new ReasonFilter(handler: EventHandler, reasons: EventReason[])
引数 型 説明
handler EventHandler フィルター通過後にイベントを渡すハンドラ
reasons EventReason[] 許可する EventReason のリスト
メソッド 戻り値 説明
handle(event) Promise<void> イベントをフィルタリングし、一致すれば内部ハンドラに渡す
名前 値 説明
PING 1 接続確認
POST_REPLY 2 ポストに返信された
POST_MENTIONED 3 ポストでメンションされた
POST_QUOTED 4 ポストが引用された
POST_COMMUNITY 5 コミュニティにポストされた (Plugin のみ)
COMMUNITY_MEMBER_JOINED 6 コミュニティにメンバーが参加した (Plugin のみ)
COMMUNITY_MEMBER_LEFT 7 コミュニティからメンバーが退出した (Plugin のみ)
DIRECT_MESSAGE_RECEIVED 8 DM を受信した
COMMUNITY_PLUGIN_INSTALLED 9 Plugin がインストールされた (Plugin のみ)
COMMUNITY_PLUGIN_UNINSTALLED 10 Plugin がアンインストールされた (Plugin のみ)

すべてのイベントの eventReasonList を判定に使います。理由を持たないイベント (PING など) はそのまま通過します。