Как мне проверить, аутентифицирован ли пользователь с помощью NickServ, используя POE::Component::IRC::State в Perl?

StackOverflow https://stackoverflow.com/questions/1897335

  •  19-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь проверить, зарегистрирован ли пользователь на 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top