【问题标题】:Convert deprecated Perl's Net::IRC codes to AnyEvent::IRC::Client inquiry将不推荐使用的 Perl 的 Net::IRC 代码转换为 AnyEvent::IRC::Client 查询
【发布时间】:2021-02-17 21:34:50
【问题描述】:

由于 Perl 的 Net::IRC 库已被弃用,我需要将一些使用它的旧代码转换为较新的 AnyEvent::IRC::Client。问题在于 MetaCPAN 的 AnyEvent 文档。不显示与 IRC 数字事件代码和 Net::IRC 支持的 add_global_handler() 和 add_handler() 方法的任何等效性。那么,例如,在 AnyEvent::IRC::Client 的语法中,以下 Net::IRC 代码 sn-ps 的等价物是什么?非常感谢任何见解。谢谢!

my $irc = new Net::IRC ;
my $conn = $irc->newconn( Server => ..., Port => ..., Nick => ... ) ;
$conn->add_global_handler( [ 251, 252, 253, 254, 255, 302 ], \&on_init ) ;
$conn->add_global_handler( [ 422, 376 ], \&on_connect ) ;
$conn->add_handler( 'crping', \&on_ping_reply ) ;
$conn->add_handler( 'caction', \&on_action ) ;
...
$irc->start ;

AnyEvent::IRC::Client 的文档(参考:https://metacpan.org/pod/AnyEvent::IRC::Client)仅提供 reg_cb() 方法,没有 IRC 数字代码处理程序,所以以下是我目前所拥有的所有新代码:

my $condVar = AnyEvent->condvar ;
my $conn = AnyEvent::IRC::Client->new() ;
$conn->connect( $server, $port, ... ) ;
$conn->reg_cb( crping => sub { ... } ) ;
$conn->reg_cb( caction => sub { ... } ) ;

my $timer = AnyEvent->timer (
  after => $twoSecs ,
  cb => sub {
    $conn->disconnect ;
    $condVar->send ;
  }#end callback
) ;#end timer
$condVar->recv ;
undef( $timer ) ;

【问题讨论】:

  • 你试过什么?你有什么问题?我们回答具体问题;我们不是软件编写服务。
  • @ikegami,如上所述,我在 AnyEvent::IRC:Client 中找不到任何关于如何处理 IRC 事件数字代码的文档。
  • Thx @toolic,根据示例,看起来我可以使用“irc_”来处理事件数字代码。但仍然不等同于 Net::IRC 的特定 add_global_handler() VS。 add_handler() 方法。

标签: perl irc anyevent


【解决方案1】:

您的帖子缺少明确的问题。事实上,您的问题似乎在 cmets 中,甚至没有被表述为问题。

我在 AnyEvent::IRC:Client 中找不到任何关于如何处理 IRC 事件数字代码的文档

第二个 sn-p 中唯一缺少的部分似乎是以下事实支持这一点:

$conn->add_global_handler( [ 251, 252, 253, 254, 255, 302 ], \&on_init ) ;
$conn->add_global_handler( [ 422, 376 ], \&on_connect ) ;

所以我假设您在询问如何使用 AnyEvent::IRC::Client 处理这些事件。


分发中包含的源代码和示例都建议您可以使用以下内容:

$conn->reg_cb("irc_$_" => \&on_init) for 251..255, 302;
$conn->reg_cb("irc_$_" => \&on_connect) for 376, 422;

如果没有,您可以使用以下方法来发现适当的标识符:

$conn->reg_cb(debug_recv => sub {
   my ($msg) = @_;
   say STDERR "Received irc_" . lc($msg->{command});
});

进一步研究代码后,irc_001irc_376irc_422 导致welcome 事件被触发,因此以下是更好的解决方案:

$conn->reg_cb("irc_$_" => \&on_init) for 251..255, 302;
$conn->reg_cb(welcome => \&on_connect);

还要注意 AnyEvent::IRC::Client 已经处理来自服务器的 ping 消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多