irc bot

sh/bash/dash/ksh/zsh等Shell脚本
回复
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

irc bot

#1

帖子 tusooa » 2010-09-22 21:59

代码: 全选

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 ~
●
上次由 tusooa 在 2010-09-23 7:19,总共编辑 2 次。

代码: 全选

] ls -ld //
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

Re: irc bot

#2

帖子 ChenFengyuan » 2010-09-22 22:03

抢maskray沙发 :em04
MaskRay
帖子: 61
注册时间: 2010-04-29 22:00
系统: Gentoo Linux ~amd64
联系:

Re: irc bot

#3

帖子 MaskRay » 2010-09-22 22:03

“when(/有人(不|吗|没)/) { $self->privmsg ($room, "$nick: 有\n");}
when(/(bot|机器人)/ and /(出来|干活)/) { $self->privmsg ($room, "$nick: 来了\n");}”
这个相当有趣啊
delectate
帖子: 18311
注册时间: 2008-01-09 22:41

Re: irc bot

#4

帖子 delectate » 2010-09-22 22:05

:em11
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: irc bot

#5

帖子 eexpress » 2010-09-22 23:14

咋又折腾这。
● 鸣学
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

Re: irc bot

#6

帖子 tusooa » 2010-09-23 7:17

exp.exp,昨天晚上,还irc上看到的。
讨论转#tusooa了。

代码: 全选

] ls -ld //
^k^
帖子: 4
注册时间: 2010-09-03 7:57

Re: irc bot

#7

帖子 ^k^ » 2010-09-23 8:21

路过. 真巧.
头像
Drdi
帖子: 257
注册时间: 2009-10-02 15:47

Re: irc bot

#8

帖子 Drdi » 2011-03-05 22:24

ls ID…… 似乎刚刚在IRC里看到了

难道……
爱Linux 也爱Ubuntu
简洁美观的桌面
更爱高效稳定的系统
不是不折腾难受夫斯基不想浪费时间
我和大多数人一样 我是菜菜
我要有菜菜的觉悟
我是Drdi
回复