コンテンツにスキップ

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[])
引数説明
handlerEventHandlerフィルター通過後にイベントを渡すハンドラ
reasonsEventReason[]許可する EventReason のリスト
メソッド戻り値説明
handle(event)Promise<void>イベントをフィルタリングし、一致すれば内部ハンドラに渡す
名前説明
PING1接続確認
POST_REPLY2ポストに返信された
POST_MENTIONED3ポストでメンションされた
POST_QUOTED4ポストが引用された
DIRECT_MESSAGE_RECEIVED8DM を受信した