1

POE::Component::IRC を使用した単純な IRC ボットがあります。シグナルハンドラの一部であろうと、通常の終了する。

次のようなセッションを作成したとしましょう。

POE::Session->create(
        inline_states => {
                irc_disconnected => \&bot_reconnect,
                irc_error => \&bot_reconnect,
                irc_socketerr => \&bot_reconnect,
                接続 => \&bot_reconnect,
.
.
.
        }、
);

bot_reconnect何か問題が発生した場合は、IRC に接続し直します。

サブ bot_reconnect
{
        my ($kernel, $heap) = @_[KERNEL, HEAP];

        if (1 == $heap->{shutting_down}) {
                $heap->{irc}->yield(shutdown => '何とか');
        } そうしないと {
                some_log_func("60 秒後に再接続");
                $kernel-delay(connect => 60);
        }
}

コードのどこかでshutting_down1 に設定して終了するように指示した場合 (例 $irc->yield(quit => "bye!"))、IRC をすぐに終了し、終了メッセージ (「クライアント終了」、ircd が表示されます) を表示しないか、「リモート ホストが接続を閉じました」を表示します。

次に、何もしないように見える上に移動するirc_disconnectedイベントを 受け取ります。実際、その後明示的に行わないと 、プロセスは IRC に接続できなくなり、宙に浮いたままになります。bot_reconnectshutdownexit 0shutdown

それは起こるべきことですか?

私が見つけた:

http://search.cpan.org/~bingos/POE-Component-IRC-6.79/lib/POE/Component/IRC/Cookbook/Disconnecting.pod

使用すると言われていますshutdown。ご覧のとおり、私はそれを試しましたが、うまくいかないようです。

別の質問でこれのサンプルコードも見つけました:

Bot::BasicBot ボット (POE::Component::IRC に基づく) を正しくシャットダウンするにはどうすればよいですか?

ただし、それは私が現在持っているものと非常によく似ており、動作も異なるようには見えません。

のパッケージ バージョンlibpoe-component-irc-perlは 6.78+dfsg-1 であるため、上記の URL にあるように 6.50 以上である必要があります。

何か案は?

4

1 に答える 1

0

これがircdの「欠陥」であることが判明しました。

また、これをバグとして POE::Component::IRC のリクエスト トラッカーに報告したところ、Hinrik から応答があり、Freenode でこれをやろうとしていたのかどうか尋ねられました。Freenode の ircd には、長時間接続していない場合に終了メッセージを無視する機能があります。

Freenode でやろうとしていたわけではありませんが、私が行っていたネットワークではこれが行われていることがわかりました。彼らはCharybdisを使用しています:

https://github.com/atheme/charybdis/blob/master/modules/core/m_quit.c#L75

于 2012-10-15T18:10:33.293 に答える