Ignore:
Timestamp:
Jan 8, 2008, 11:24:09 PM (17 years ago)
Author:
Geoffrey Thomas <geofft@mit.edu>
Branches:
master, barnowl_perlaim, debian, release-1.10, release-1.4, release-1.5, release-1.6, release-1.7, release-1.8, release-1.9
Children:
0e52069
Parents:
c0f9e30
Message:
Added support for channels in IRC. After you :irc-connect to a server, you can
:irc-join #channel, and then :irc-msg either a user or a #channel. Replies,
isprivate, and context should work vaguely as expected.
Location:
perl/modules/IRC/lib/BarnOwl/Module
Files:
2 edited

Legend:

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

    rb38b0b2 r2c40dc0  
    66=head1 NAME
    77
    8 BarnOwl::Module::Jabber
     8BarnOwl::Module::IRC
    99
    1010=head1 DESCRIPTION
    1111
    12 This module implements Jabber support for barnowl.
     12This module implements IRC support for barnowl.
    1313
    1414=cut
     
    2222use Getopt::Long;
    2323
    24 our $VERSION = 0.01;
     24our $VERSION = 0.02;
    2525
    2626our $irc;
     
    3030
    3131sub startup {
    32     BarnOwl::new_variable_string(ircnick => {default => $ENV{USER}});
    33     BarnOwl::new_variable_string(ircuser => {default => $ENV{USER}});
    34     BarnOwl::new_variable_string(ircname => {default => ""});
     32    BarnOwl::new_variable_string('irc:nick', {default => $ENV{USER}});
     33    BarnOwl::new_variable_string('irc:user', {default => $ENV{USER}});
     34    BarnOwl::new_variable_string('irc:name', {default => ""});
     35    BarnOwl::new_variable_bool('irc:spew', {default => 0});
    3536    register_commands();
    3637    register_handlers();
     
    4041sub shutdown {
    4142    for my $conn (values %ircnets) {
    42         $conn->disconnect;
     43        $conn->disconnect();
    4344    }
    4445}
     
    6364    BarnOwl::new_command('irc-disconnect' => \&cmd_disconnect);
    6465    BarnOwl::new_command('irc-msg'     => \&cmd_msg);
     66    BarnOwl::new_command('irc-join' => \&cmd_join);
    6567}
    6668
     
    7678    my $cmd = shift;
    7779
    78     my $nick = BarnOwl::getvar('ircnick');
    79     my $username = BarnOwl::getvar('ircuser');
    80     my $ircname = BarnOwl::getvar('ircname');
     80    my $nick = BarnOwl::getvar('irc:nick');
     81    my $username = BarnOwl::getvar('irc:user');
     82    my $ircname = BarnOwl::getvar('irc:name');
    8183    my $host;
    8284    my $port;
     
    9092            "alias=s"    => \$alias,
    9193            "ssl"        => \$ssl,
    92             "password=s" => \$password);
     94            "password=s" => \$password,
     95            "port=i"     => \$port,
     96        );
    9397        $host = shift @ARGV or die("Usage: $cmd HOST\n");
    9498        if(!$alias) {
     
    126130    my $conn = get_connection(\@_);
    127131    my $to = shift or die("Usage: $cmd NICK\n");
     132    # handle multiple recipients?
    128133    if(@_) {
    129134        process_msg($conn, $to, join(" ", @_));
     
    148153        body        => $body,
    149154        sender      => $conn->nick,
    150         isprivate   => 'true',
     155        is_private($to) ?
     156          (isprivate  => 'true') : (),
    151157        replycmd    => "irc-msg $to",
    152         replysendercmd => "irc-msg " . $conn->nick
     158        replysendercmd => "irc-msg $to"
    153159       );
    154160    BarnOwl::queue_message($msg);
    155161}
    156162
     163sub cmd_join {
     164    my $cmd = shift;
     165    my $conn = get_connection(\@_);
     166    my $chan = shift or die("Usage: $cmd channel\n");
     167    $conn->join($chan);
     168}
    157169
    158170################################################################################
     
    177189
    178190sub get_connection_by_alias {
    179     die("No such ircnet: $alias\n") unless exists $ircnets{$key};
     191    my $key = shift;
     192    die("No such ircnet: $key\n") unless exists $ircnets{$key};
    180193    return $ircnets{$key};
    181194}
    182195
     196# Determines if the given message recipient is a username, as opposed to
     197# a channel that starts with # or &.
     198sub is_private {
     199    return shift !~ /^[\#\&]/;
     200}
     201
    1832021;
  • perl/modules/IRC/lib/BarnOwl/Module/IRC/Connection.pm

    rb38b0b2 r2c40dc0  
    1515=cut
    1616
    17 use base qw(Net::IRC::Connection Class::Accessor);
     17use base qw(Net::IRC::Connection Class::Accessor Exporter);
    1818__PACKAGE__->mk_accessors(qw(alias channels));
     19our @EXPORT_OK = qw(&is_private);
    1920
    2021use BarnOwl;
     
    3031    bless($self, $class);
    3132
    32     $self->add_global_handler(endofmotd => sub { goto &on_connect });
    33     $self->add_global_handler(msg => sub { goto &on_msg });
    34     $self->add_global_handler(notice => sub { goto &on_msg });
     33    $self->add_global_handler(376 => sub { goto &on_connect });
     34    $self->add_global_handler(['msg', 'notice', 'public', 'caction'],
     35            sub { goto &on_msg });
     36    $self->add_global_handler(cping => sub { goto &on_ping });
    3537    $self->add_default_handler(sub { goto &on_event; });
    3638
     
    4951sub on_msg {
    5052    my ($self, $evt) = @_;
    51     my $replycmd = "irc-msg " . $evt->nick;
     53    my ($recipient) = $evt->to;
     54    my $body = strip_irc_formatting([$evt->args]->[0]);
     55    $body = BarnOwl::Style::boldify($evt->nick.' '.$body) if $evt->type eq 'caction';
    5256    my $msg = BarnOwl::Message->new(
    5357        type        => 'IRC',
     
    5559        server      => $self->server,
    5660        network     => $self->alias,
    57         recipient   => $self->nick,
    58         body        => strip_irc_formatting([$evt->args]->[0]),
     61        recipient   => $recipient,
     62        body        => $body,
    5963        sender      => $evt->nick,
    6064        hostname    => $evt->host,
    6165        from        => $evt->from,
    62         notice      => $evt->type eq 'notice' ? 'true' : '',
    63         isprivate   => 'true',
    64         replycmd    => $replycmd,
    65         replysendercmd => $replycmd
     66        $evt->type eq 'notice' ?
     67          (notice     => 'true') : (),
     68        is_private($recipient) ?
     69          (isprivate  => 'true') : (),
     70        replycmd    => 'irc-msg ' .
     71            (is_private($recipient) ? $evt->nick : $recipient),
     72        replysendercmd => 'irc-msg ' . $evt->nick,
    6673       );
    6774    BarnOwl::queue_message($msg);
     75}
     76
     77sub on_ping {
     78    my ($self, $evt) = @_;
     79    $self->ctcp_reply($evt->nick, join (' ', ($evt->args)));
     80}
     81
     82sub on_event {
     83    my ($self, $evt) = @_;
     84    BarnOwl::admin_message("IRC",
     85            "Unhandled IRC event of type " . $evt->type . ":\n"
     86            . strip_irc_formatting(join("\n", $evt->args)))
     87        if BarnOwl::getvar('irc:spew') eq 'on';
    6888}
    6989
     
    83103}
    84104
     105# Determines if the given message recipient is a username, as opposed to
     106# a channel that starts with # or &.
     107sub is_private {
     108    return shift !~ /^[\#\&]/;
     109}
    85110
    861111;
Note: See TracChangeset for help on using the changeset viewer.