2009-12-13 78 views
1

我想測試用戶是否在FreeNode上註冊。 nick_info()似乎沒有返回關於此的信息,所以我想使用$ irc-> yield(whois => $ nick);然後抓取irc_whois事件的回覆。問題是,我想等到這個事件被激發,所以我創建了一個全局變量$ whois_result並寫了這樣子:如何在Perl中使用POE :: Component :: IRC :: State來檢查用戶是否使用NickServ進行身份驗證?

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"; 
} 

不幸的是,當循環運行時事件不能觸發,所以這個掛起。我相信有更好的方法來做到這一點,但我對這種編程知之甚少。任何幫助將不勝感激。

回答

0

以下內容至少適用於FreeNode(或任何支持identify-msg功能的服務器)。

如果你反應來自用戶的信息(irc_msgirc_public,或irc_ctcp_action),你可以告訴他是否已經通過查看提供給事件處理程序的第三個參數($_[ARG3])鑑定NickServ。如果用戶已經識別,則爲true,否則爲false。

1

我運行Freenode的一個機器人,並通過詢問Nickserv命令解決了這個問題: ACC [尼克] *

然後Nickserv將與格式的通知回覆: [暱稱] - > [註冊的nickservname] ACC [級別]

級別3意味着用戶被識別爲nickserv。

+0

謝謝,但我的主要問題是不在IRC端,它在POE端。我想詢問用戶是否已註冊,並且在我得到答案之前不做任何其他事情。我遇到的問題是這些東西都是事件驅動的,而請求和響應是單獨的事件。這意味着我必須發送請求,然後讓機器人做一段時間,然後每當出現響應時,我就會處理它。 我上面的解決方案是讓響應處理程序設置一個全局變量並輪詢該變量,但失敗。 – Troy 2009-12-13 22:04:14

+0

好的,我想出了一個解決方案。我所做的是我創建了一個全局隊列。每次我進行whois呼叫時,我都會將一個匿名函數轉移到處理結果信息的隊列中。我的whois響應處理程序看起來像這樣: sub on_whois {$} function = pop(@whois_queue); $ function - >($ _ [ARG0]); } – Troy 2009-12-14 03:02:55

2

在POE中的狀態子...您必須在另一個狀態下產出或調用它。

此外,當您有來自IRC命令的數據時,屈服於另一個狀態來處理它。

_start - 啓動定時器等 定時器 - 產量on_whois

on_whois - 運行誰是 - 設置數據 - 產下一個定時器

_stop - 殺定時器 - 刷新數據

相關問題