分页: 1 / 1

irc bot

发表于 : 2010-09-22 21:59
tusooa

代码: 全选

tlcr: 0 庚寅年八月十六日 07:07:53 ~
● ds ib-IrcBot.perl 
#!/usr/bin/env perl
# vim : ft=perl

use 5.010;
use Net::IRC;
use LWP::UserAgent;
#use utf8;
#use encoding 'utf8';
use Encode;
#use URI::Title qw/title/;

$cnick = '__bot__';
$cserver = 'irc.freenode.net';
$cport = 8001;
$cname = 'It is a bot.';

$room = $ARGV[0] // '#ubuntu-cn';

# Irc 设置
sub on_connect
{
    my $self = shift;

    say "正在进入 $room...";
    $self->join ($room);
    say "Done.";
    #$self->privmsg ($room, 'Hello World');
}

@botFunc = (
    ['-h', 'echo "-h 帮助 -w 天气"'],
    ['-w', '/home/tusooa/应用/脚本/wg-天气.perl'],
    #['-g', ''],
);

sub getHtmlTitle
{
    my $url = shift;
    my $resp = LWP::UserAgent->new(max_size => 1024)->get($url);
    return (encode ('utf-8', $resp->decoded_content) ) =~ m{<title[^>]*>(.+?)</title} ? $1 : undef;
}

sub on_msg
{
    my ($self, $event) = @_;
    my ($nick) = $event->nick; # Message Sender
    my ($arg) = ($event->args); # Message Text
    my $host=$event->host;
    
    my ($cmd, $word) = split (/\s/, $arg);

    if ($cmd =~ /^$mynick[:,]?$/)
    {
        (undef, $cmd, $word) = split (/\s/, $arg);
    }

    for (0 .. $#botFunc)
    {
        if ($botFunc[$_][0] eq $cmd)
        {
            my $ret = `$botFunc[$_][1] $word 2>&1`;
            for $i (split /\n+/, $ret)
            {
                $self->privmsg ($nick, "$i\n");
            }
        }
    }


}

sub on_public
{
    my ($self, $event) = @_;
    my @to = $event->to;
    my ($nick , $mynick) = ($event->nick, $self->nick);
    my $host = $event->host;
    my ($arg) = ($event->args);


    #sleep 5;

    #return if $nick == 'gebjgd';

#=item 防止干坏事的。
    #say $self->who('O_O00');
    #if ($self->who('O_O00') == 11)
    #{
    for (split /\s/, $arg)
    {
        if (m@^https??://[a-z0-9\.]+@i)
        {
            #my $cmd = "w3m -dump_extra \"$_\" | head -c1024 | grep -i title | head -n1 | sed -e \"s/.*<title>//;s@</title>.*@@\"";
            #say $cmd;
            #my $ret = `$cmd`;
            #my $title = (grep /<title>/i, $ret)[0];
            #$title =~ s@.*<title>@@i;
            #$title =~ s@</title>.*@@i;
            #my $title = title $_;
            #my $title = `$cmd`;
            my $title = getHtmlTitle ($_);
            $self->privmsg ($room, "● 标题:$title\n");
        }
    }
    #}
#=cut
    my ($cmd, $word) = split (/\s/, $arg);

    if ($cmd =~ /^$mynick[:,]?$/)
    {
        (undef, $cmd, $word) = split (/\s/, $arg);
    }

    for (0 .. $#botFunc)
    {
        if ($botFunc[$_][0] eq $cmd)
        {
            my $ret = `$botFunc[$_][1] $word 2>&1`;
            for $i (split /\n+/, $ret)
            {
                $self->privmsg ($room, "$nick: $i\n");
            }
            #$self->privmsg ($nick, "注意了,使用机器人要私聊。\n");
        }
    }
    say $nick;
    if ($nick eq 'tusooa')
    {
        given ($cmd)
        {
            # <restart> <quit>
            when ('<restart>')
            {
                say "Now restart myself.";
                exec $0, $room;
            }
            when ('<quit>')
            {
                die "用户中断。\n";
            }
        }
    }

    given ($arg)
    {
        when(/有人(不|吗|么|没)/) { $self->privmsg ($room, "$nick: 有\n");}
        when(/(bot|机器人)/ and /(出来|干活)/) { $self->privmsg ($room, "$nick: 来了\n");}
    }
    say "<$nick> $arg";
}

$irc = new Net::IRC;
$connect = $irc->newconn(
    Nick => $cnick,
    Server => $cserver,
    Port => int ($cport),
    Username => 'ib-perl@pl',
    Ircname => $cname
);
$connect->add_global_handler(376, \&on_connect);
$connect->add_handler('public', \&on_public);
$connect->add_handler('msg', \&on_msg);

$irc->start();

tlcr: 0 庚寅年八月十六日 07:14:38 ~
●

Re: irc bot

发表于 : 2010-09-22 22:03
ChenFengyuan
抢maskray沙发 :em04

Re: irc bot

发表于 : 2010-09-22 22:03
MaskRay
“when(/有人(不|吗|没)/) { $self->privmsg ($room, "$nick: 有\n");}
when(/(bot|机器人)/ and /(出来|干活)/) { $self->privmsg ($room, "$nick: 来了\n");}”
这个相当有趣啊

Re: irc bot

发表于 : 2010-09-22 22:05
delectate
:em11

Re: irc bot

发表于 : 2010-09-22 23:14
eexpress
咋又折腾这。

Re: irc bot

发表于 : 2010-09-23 7:17
tusooa
exp.exp,昨天晚上,还irc上看到的。
讨论转#tusooa了。

Re: irc bot

发表于 : 2010-09-23 8:21
^k^
路过. 真巧.

Re: irc bot

发表于 : 2011-03-05 22:24
Drdi
ls ID…… 似乎刚刚在IRC里看到了

难道……