사용자가 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;
}
을 불행히도, 루프가 실행되는 동안 이벤트가 발생하지 않아서 이것이 중지됩니다. 이 작업을 수행하는 더 좋은 방법이있을 것이라고 확신하지만이 종류의 프로그래밍에 익숙하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다.
감사합니다. 그러나 주된 문제는 IRC 끝이 아니므로 POE 쪽입니다. 나는 사용자가 등록되어 있는지 물어보고 대답을 얻을 때까지 아무 것도하지 않습니다. 내가 겪고있는 문제는이 모든 것이 이벤트 중심이며 요청과 응답은 별도의 이벤트라는 것입니다. 즉, 요청을 보내야하고 그 후에 봇이 잠시 동안 그 일을 처리하도록하고 그 다음 응답이 발생할 때마다 처리해야합니다. 위의 해결 방법은 응답 처리기에서 전역 변수를 설정하고 해당 변수를 폴링하는 것이지만 실패했습니다. – Troy
좋아, 나는 해결책을 찾아 냈다. 내가 한 것은 글로벌 대기열을 만들었습니다. 매번 whois 호출을 할 때마다 결과 정보를 처리 할 대기열에 익명 함수를 이동합니다.내 WHOIS 응답 처리기는 다음과 같습니다. sub on_whois { my $ function = pop (@whois_queue); $ function -> ($ _ [ARG0]); } – Troy