あるチャンネルから自分以外のメンバーがいなくなった場合に、partとjoinを繰り返して、チャンネルオペレータ権限を復活させるためのスクリプト。まずは自分以外のメンバーがいなくなったかどうかをチェックするために、partメッセージのシグナルをハンドルしてみる。
sub event_message_part { Irssi::print('event message part'); return; } Irssi::signal_add('message part', 'event_message_part');
- irssi signal - Google 検索
- Irssi - The client of the future
- message part signal_add - Google 検索
- html/tracknick.pl
- "irssi::print" - Google 検索
- Irssi - The client of the future
ここまでを保存して読み込む。
/RUN recoverop.pl
すると(sratus)ウィンドウで以下のような感じになる。
19:12:49 -!- Irssi: Loaded script recoverop 19:23:15 -!- Irssi: event message part
しばらく観察していると、チャンネルから人がいなくなったのにこれをハンドルできていないことがわかる。それはpartをハンドルしているからで、不意の接続断はハンドルしていないからだ。じゃぁ不意の接続断の場合はどんなシグナルが発行されるかをチェックしてみる。そのためにパケットキャプチャツールのngrepを使う。
# ngrep -d any -W byline port 6667
partされた場合は以下のような感じ
:hoge!-hoge@XXX.XXX.XXX.XXX PART #hoge :.
不意の切断の場合は以下のような感じ
:hoge!-hoge@XXX.XXX.XXX.XXX QUIT :Ping timeout.
- ngrep - Google 検索
- ngrep - network grep
- HTTP アプリケーションのデバッグにつかうツール2選 - TokuLog 改めB日記
- @IT:Security Tips > Network Grepで手軽なパケットキャプチャ
重要なのは、PART とか QUIT とかのコマンド部分。
チャンネルからいなくなる場合をハンドルするには、それぞれに対応したシグナルをハンドルする。つまり、以下のようになる。
sub event_message_quit { Irssi::print('event message quit'); return; } Irssi::signal_add('message quit', 'event_message_quit'); sub event_message_part { Irssi::print('event message part'); return; } Irssi::signal_add('message part', 'event_message_part');
スクリプトを読み込んむと以下のような出力を得る。partもquitも正しくハンドリングされていることがわかる。
20:16:05 -!- Irssi: Loaded script recoverop 20:16:51 -!- Irssi: event message quit 20:22:24 -!- Irssi: event message part