Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • perl/modules/IRC/lib/BarnOwl/Module/IRC.pm

    r5c6d661 r9620c8d  
    2020use BarnOwl::Module::IRC::Completion;
    2121
    22 use AnyEvent::IRC;
     22use Net::IRC;
    2323use Getopt::Long;
    2424use Encode;
     
    3030# Hash alias -> BarnOwl::Module::IRC::Connection object
    3131our %ircnets;
     32our %channels;
     33our %reconnect;
    3234
    3335sub startup {
     
    6870
    6971    register_commands();
     72    register_handlers();
    7073    BarnOwl::filter(qw{irc type ^IRC$ or ( type ^admin$ and adminheader ^IRC$ )});
    7174}
     
    7376sub shutdown {
    7477    for my $conn (values %ircnets) {
    75         $conn->conn->disconnect('Quitting');
     78        $conn->conn->disconnect();
    7679    }
    7780}
     
    9598        $list .= "\n";
    9699
    97         for my $chan (keys %{$conn->conn->{channel_list}}) {
     100        for my $chan (keys %channels) {
     101            next unless grep $_ eq $conn, @{$channels{$chan}};
    98102            $list .= "  $chan\n";
    99103        }
     
    101105
    102106    return $list;
     107}
     108
     109#sub mainloop_hook {
     110#    return unless defined $irc;
     111#    eval {
     112#        $irc->do_one_loop();
     113#    };
     114#    return;
     115#}
     116
     117sub OwlProcess {
     118    return unless defined $irc;
     119    eval {
     120        $irc->do_one_loop();
     121    };
     122    return;
     123}
     124
     125
     126sub register_handlers {
     127    if(!$irc) {
     128        $irc = Net::IRC->new;
     129        $irc->timeout(0);
     130    }
    103131}
    104132
     
    378406    }
    379407
    380     my $conn = BarnOwl::Module::IRC::Connection->new($alias, $host, $port, {
    381         nick      => $nick,
    382         user      => $username,
    383         real      => $ircname,
    384         password  => $password,
    385         SSL       => $ssl,
    386         timeout   => sub {0}
    387        });
    388     $ircnets{$alias} = $conn;
     408    my $conn = BarnOwl::Module::IRC::Connection->new($irc, $alias,
     409        Nick      => $nick,
     410        Server    => $host,
     411        Port      => $port,
     412        Username  => $username,
     413        Ircname   => $ircname,
     414        Port      => $port,
     415        Password  => $password,
     416        SSL       => $ssl
     417       );
     418
     419    if ($conn->conn->connected) {
     420        $conn->connected("Connected to $alias as $nick");
     421    } else {
     422        die("IRC::Connection->connect failed: $!");
     423    }
     424
    389425    return;
    390426}
     
    393429    my $cmd = shift;
    394430    my $conn = shift;
    395     if ($conn->conn->{socket}) {
    396         $conn->did_quit(1);
    397         $conn->conn->disconnect("Goodbye!");
    398     } elsif ($conn->{reconnect_timer}) {
     431    if ($conn->conn->connected) {
     432        $conn->conn->disconnect;
     433    } elsif ($reconnect{$conn->alias}) {
    399434        BarnOwl::admin_message('IRC',
    400435                               "[" . $conn->alias . "] Reconnect cancelled");
    401436        $conn->cancel_reconnect;
    402         delete $ircnets{$conn->alias};
    403437    }
    404438}
     
    429463    for my $body (@msgs) {
    430464        if ($body =~ /^\/me (.*)/) {
    431             $conn->me($to, Encode::encode('utf-8', $1));
     465            $conn->conn->me($to, Encode::encode('utf-8', $1));
    432466            $body = '* '.$conn->nick.' '.$1;
    433467        } else {
    434             $conn->conn->send_msg('privmsg', $to, Encode::encode('utf-8', $body));
     468            $conn->conn->privmsg($to, Encode::encode('utf-8', $body));
    435469        }
    436470        my $msg = BarnOwl::Message->new(
     
    457491    my $target = shift;
    458492    $target ||= shift;
    459     $conn->conn->send_msg(mode => $target, @_);
     493    $conn->conn->mode($target, @_);
    460494    return;
    461495}
     
    465499    my $conn = shift;
    466500    my $chan = shift or die("Usage: $cmd channel\n");
    467     $conn->conn->send_msg(join => $chan, @_);
     501    $channels{$chan} ||= [];
     502    push @{$channels{$chan}}, $conn;
     503    $conn->conn->join($chan, @_);
    468504    return;
    469505}
     
    473509    my $conn = shift;
    474510    my $chan = shift;
    475     $conn->conn->send_msg(part => $chan);
     511    $channels{$chan} = [grep {$_ ne $conn} @{$channels{$chan} || []}];
     512    $conn->conn->part($chan);
    476513    return;
    477514}
     
    481518    my $conn = shift;
    482519    my $nick = shift or die("Usage: $cmd <new nick>\n");
    483     $conn->conn->send_msg(nick => $nick);
     520    $conn->conn->nick($nick);
    484521    return;
    485522}
     
    490527    my $chan = shift;
    491528    $conn->names_tmp([]);
    492     $conn->conn->send_msg(names => $chan);
     529    $conn->conn->names($chan);
    493530    return;
    494531}
     
    498535    my $conn = shift;
    499536    my $who = shift || die("Usage: $cmd <user>\n");
    500     $conn->conn->send_msg(whois => $who);
     537    $conn->conn->whois($who);
    501538    return;
    502539}
     
    505542    my $cmd = shift;
    506543    my $conn = shift;
    507     $conn->conn->send_msg('motd');
     544    $conn->conn->motd;
    508545    return;
    509546}
     
    523560    my $conn = shift;
    524561    my $who = shift || die("Usage: $cmd <user>\n");
    525     $conn->conn->send_msg(who => $who);
     562    BarnOwl::error("WHO $cmd $conn $who");
     563    $conn->conn->who($who);
    526564    return;
    527565}
     
    531569    my $conn = shift;
    532570    my $type = shift || die("Usage: $cmd <chiklmouy> [server] \n");
    533     $conn->conn->send_msg(stats => $type, @_);
     571    $conn->conn->stats($type, @_);
    534572    return;
    535573}
     
    539577    my $conn = shift;
    540578    my $chan = shift;
    541     $conn->conn->send_msg(topic => $chan, @_ ? join(" ", @_) : undef);
     579    $conn->conn->topic($chan, @_ ? join(" ", @_) : undef);
    542580    return;
    543581}
     
    546584    my $cmd = shift;
    547585    my $conn = shift;
    548     $conn->conn->send_msg(@_);
     586    $conn->conn->sl(join(" ", @_));
    549587    return;
    550588}
     
    553591########################### Utilities/Helpers ##################################
    554592################################################################################
    555 
    556 sub find_channel {
    557     my $channel = shift;
    558     my @found;
    559     for my $conn (values %ircnets) {
    560         if($conn->conn->{channel_list}{lc $channel}) {
    561             push @found, $conn;
    562         }
    563     }
    564     return $found[0] if(scalar @found == 1);
    565 }
    566593
    567594sub mk_irc_command {
     
    587614            $channel = $ARGV[0];
    588615            if(defined($channel) && $channel =~ /^#/) {
    589                 if(my $c = find_channel($channel)) {
     616                if($channels{$channel} && @{$channels{$channel}} == 1) {
    590617                    shift @ARGV;
    591                     $conn ||= $c;
     618                    $conn = $channels{$channel}[0] unless $conn;
    592619                }
    593620            } elsif ($m && $m->type eq 'IRC' && !$m->is_private) {
     
    627654    my $allow_disconnected = shift;
    628655
    629     my $conn = $ircnets{$key};
    630     die("No such ircnet: $key\n") unless $conn;
    631     if ($conn->conn->{registered} || $allow_disconnected) {
    632         return $conn;
    633     }
    634     die("[@{[$conn->alias]}] Not currently connected.");
     656    return $ircnets{$key} if exists $ircnets{$key};
     657    return $reconnect{$key} if $allow_disconnected && exists $reconnect{$key};
     658    die("No such ircnet: $key\n")
    635659}
    636660
Note: See TracChangeset for help on using the changeset viewer.