2009-12-13 3 views
1

사용자가 FreeNode에 등록되어 있는지 테스트하려고합니다. nick_info()는 이것에 대한 정보를 반환하지 않는 것 같습니다. 따라서 $ irc-> yield (whois => $ nick)를 사용하고 싶습니다. 그런 다음 irc_whois 이벤트의 응답을 가져옵니다. 문제는 내가이 이벤트가 발생할 때까지 기다려야 할 것입니다, 그래서 전역 변수 $ whois_result를 생성하고이 같은 하위 썼다 :Perl에서 POE :: Component :: IRC :: State를 사용하여 NickServ로 사용자가 인증되었는지 어떻게 확인합니까?

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

다음 irc_whois 핸들러처럼 찾고

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

을 불행히도, 루프가 실행되는 동안 이벤트가 발생하지 않아서 이것이 중지됩니다. 이 작업을 수행하는 더 좋은 방법이있을 것이라고 확신하지만이 종류의 프로그래밍에 익숙하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

0

다음은 FreeNode 이상 (또는 identify-msg 기능을 지원하는 서버)에 적용됩니다. 당신이 사용자로부터 메시지 (irc_msg, irc_public, 또는 irc_ctcp_action)에 반응하는 경우

, 당신은 그가 이벤트 핸들러에 제공되는 세 번째 인수 ($_[ARG3])을보고 NickServ에 확인 여부를 알 수 있습니다. 사용자가 식별하면 true이고 그렇지 않으면 false입니다.

1

나는 Freenode의에 봇을 실행하고 Nickserv에게 명령을 요청하여 문제를 해결 : ACC [닉] *을

Nickserv는 다음 형식으로 통지 응답 할 것이다 : [별명] -> [ registerd nickservname] ACC [레벨]

여기서 레벨 3은 사용자가 nickserv로 식별됨을 의미합니다.

+0

감사합니다. 그러나 주된 문제는 IRC 끝이 아니므로 POE 쪽입니다. 나는 사용자가 등록되어 있는지 물어보고 대답을 얻을 때까지 아무 것도하지 않습니다. 내가 겪고있는 문제는이 모든 것이 이벤트 중심이며 요청과 응답은 별도의 이벤트라는 것입니다. 즉, 요청을 보내야하고 그 후에 봇이 잠시 동안 그 일을 처리하도록하고 그 다음 응답이 발생할 때마다 처리해야합니다. 위의 해결 방법은 응답 처리기에서 전역 변수를 설정하고 해당 변수를 폴링하는 것이지만 실패했습니다. – Troy

+0

좋아, 나는 해결책을 찾아 냈다. 내가 한 것은 글로벌 대기열을 만들었습니다. 매번 whois 호출을 할 때마다 결과 정보를 처리 할 대기열에 익명 함수를 이동합니다.내 WHOIS 응답 처리기는 다음과 같습니다. sub on_whois { my $ function = pop (@whois_queue); $ function -> ($ _ [ARG0]); } – Troy

2

POE의 상태에 대한 하위에서 ... 다른 상태에서 값을 산출하거나 호출해야합니다.

또한 IRC 명령의 데이터가있을 때 처리하기 위해 다른 상태로 만듭니다. _start

- 다음 타이머

_stop 항복 - - 수율 on_whois

on_whois - - 누가 실행 - 설정 데이터 등등 타이머, 타이머 을 시작합니다 죽여 타이머 - 데이터 플러시