如何在Perl中实现简单的IRC客户端?

mpe*_*ers 5 irc perl cpan

我正在研究一种需要将IRC消息发送到内部IRC通道的工具.这不是一个不断运行的程序,而是一个偶尔会调用的工具,并且需要能够在调用时通过一些消息通知该通道.

我看了看网:: IRC,但它已经死了自2004年以来于是我看着它列出的替代品(博特:: BasicBotPOE ::零组件:: IRC),但是这两个都需要下运行POE及其事件循环.Net :: Async :: IRC之类的问题也出现了同样的问题,因为它需要在IO :: Async事件循环中运行.

我不是在写一个需要与任何东西进行交互的完整机器人,我只想登录到irc服务器,加入频道,发布一些快速消息然后离开.我不想重新编写整个程序以适应一些框架的事件循环只是为了做到这一点.

那么,对于一个简单的IRC客户端库的任何建议都不会让我重写我的整个应用程序?

MkV*_*MkV 7

使用AnyEvent :: IRC :: Client,当它使用AnyEvent'事件循环'时,你不必重写你的应用程序来使用它,你可以这样做:

use AnyEvent;
use AnyEvent::IRC::Client;
Run Code Online (Sandbox Code Playgroud)

与你的模块的其余部分一起使用线; 和这样的事情

sub do_irc {
    my $log_chan = '#foobar';
    my $timer; 
    my $c = AnyEvent->condvar;
    my $con = new AnyEvent::IRC::Client;

    $con->reg_cb( join => sub {
        my ($con, $nick, $channel, $is_myself) = @_; 
        if ($is_myself && $channel eq $log_chan) {
           $con->send_chan( $channel, PRIVMSG => ($channel, 'my information') );
           $timer = AnyEvent->timer ( 
                after => 1,
                cb => sub {
                    undef $timer;
                    $con->disconnect('done');
                });
        }
    });

    $con->connect($irc_serv, 6667, { nick => $your_nick } );
    $con->send_srv( JOIN => ($log_chan) );
    $c->wait;
    $con->disconnect;

}
Run Code Online (Sandbox Code Playgroud)

要进行连接,它只会在完成后返回(为简洁而省略错误处理).您的应用中的任何其他内容都不需要使用AnyEvent.


zig*_*don 5

Net :: IRC仍然是完全可用的,如果你想做的只是你描述的那么简单,我认为它会做得很好.

也就是说,习惯POE并不是一个坏主意,特别是因为IRC机器人随着时间的推移往往会增加功能:)