1

ユーザーがFreeNodeに登録されているかどうかをテストしようとしています。nick_info()はこれに関する情報を返さないようです。そのため、$ irc-> yield(whois => $ nick);を使用します。次に、irc_whoisイベントの応答を取得します。問題は、このイベントが発生するまで待ちたいので、グローバル変数$ whois_resultを作成し、次のようなサブを作成しました。

sub whois {
    my $nick = $_[0];
    $whois_result = 0;
    $irc->yield(whois => $nick);
    while($whois_result == 0) { }
    return $whois_result;
}

irc_whoisハンドラーは次のようになります。

sub on_whois {
    $whois_result = $_[ARG0];
    print "DEBUG: irc_whois fired.\n";
}

残念ながら、ループの実行中はイベントを発生させることができないため、これはハングします。これを行うためのより良い方法があると確信していますが、私はこの種のプログラミングについて十分に理解していません。どんな助けでも大歓迎です。

4

3 に答える 3

2

POEの状態のサブで...別の状態でそれを譲るまたは呼び出す必要があります。

また、IRCコマンドからのデータがある場合は、別の状態に譲って処理します。

_start-タイマーなどを起動します。timer-yieldon_whois

on_whois-実行するwhois-データの設定-次のタイマーへの譲歩

_stop-タイマーを強制終了します-データをフラッシュします

于 2015-12-31T16:40:25.630 に答える
1

Freenodeでボットを実行し、Nickservに次のコマンドを実行して問題を解決しました: ACC [nick] *

Nickservは、次の形式の通知で返信します:[ニックネーム]->[登録されたニックネーム]ACC[レベル]

レベル3は、ユーザーがnickservに識別されることを意味します。

于 2009-12-13T21:55:48.853 に答える
0

以下は、少なくともFreeNode(またはidentify-msg機能をサポートするサーバー)に適用されます。

ユーザーからのメッセージ(、、、または)に反応している場合はirc_msgirc_publicイベントハンドラーに提供さirc_ctcp_actionれた3番目の引数()を調べることで、ユーザーがNickServを識別したかどうかを確認できます。$_[ARG3]ユーザーが識別した場合はtrueになり、そうでない場合はfalseになります。

于 2010-05-23T05:25:26.863 に答える