Как мне проверить, аутентифицирован ли пользователь с помощью NickServ, используя POE::Component::IRC::State в Perl?
Вопрос
Я пытаюсь проверить, зарегистрирован ли пользователь на 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";
}
К сожалению, событие не может сработать во время выполнения цикла, поэтому оно зависает.Я уверен, что есть лучший способ сделать это, но я недостаточно знаком с такого рода программированием, чтобы знать.Мы были бы очень признательны за любую помощь.
Решение
Следующее относится, по крайней мере, к FreeNode (или любому серверу, поддерживающему функцию identify-msg).
Если вы реагируете на сообщение (irc_msg
, irc_public
, или irc_ctcp_action
) от пользователя вы можете определить, идентифицировался ли он с NickServ, посмотрев на третий аргумент ($_[ARG3]
) предоставляется обработчику события.Это будет true, если пользователь идентифицировал себя, false в противном случае.
Другие советы
На подмене для состояний в POE...Вы должны уступить или вызвать это в другом состоянии.
Кроме того, когда у вас есть данные из команды IRC, перейдите в другое состояние для их обработки.
_start - Запустить таймер и т.д.таймер - выход на_whois
on_whois - запустить who is - Установить данные - перейти к следующему таймеру
_ остановить - Отключить таймер - очистить данные
Я запустил бота на Freenode и решил проблему, запросив у Nickserv команду:АКК [ник] *
Затем Nickserv ответит уведомлением в формате:[ник] -> [имя сервера регистрационных ников] Учетная запись [уровень]
Где уровень 3 означает, что пользователь идентифицирован с nickserv.