source: perl/modules/IRC/lib/BarnOwl/Module/IRC.pm @ b10f340

barnowl_perlaimdebianrelease-1.10release-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since b10f340 was b10f340, checked in by Nelson Elhage <nelhage@mit.edu>, 16 years ago
Document the IRC variables
  • Property mode set to 100644
File size: 6.5 KB
Line 
1use strict;
2use warnings;
3
4package BarnOwl::Module::IRC;
5
6=head1 NAME
7
8BarnOwl::Module::IRC
9
10=head1 DESCRIPTION
11
12This module implements IRC support for barnowl.
13
14=cut
15
16use BarnOwl;
17use BarnOwl::Hooks;
18use BarnOwl::Message::IRC;
19use BarnOwl::Module::IRC::Connection qw(is_private);
20
21use Net::IRC;
22use Getopt::Long;
23
24our $VERSION = 0.02;
25
26our $irc;
27
28# Hash alias -> BarnOwl::Module::IRC::Connection object
29our %ircnets;
30
31sub startup {
32    BarnOwl::new_variable_string('irc:nick', {
33        default     => $ENV{USER},
34        summary     => 'The default IRC nickname',
35        description => 'By default, irc-connect will use this nick '  .
36        'when connecting to a new server. See :help irc-connect for ' .
37        'more information.'
38       });
39
40    BarnOwl::new_variable_string('irc:user', {
41        default => $ENV{USER},
42        summary => 'The IRC "username" field'
43       });
44        BarnOwl::new_variable_string('irc:name', {
45        default => "",
46        summary     => 'A short name field for IRC',
47        description => 'A short (maybe 60 or so chars) piece of text, ' .
48        'originally intended to display your real name, which people '  .
49        'often use for pithy quotes and URLs.'
50       });
51   
52    BarnOwl::new_variable_bool('irc:spew', {
53        default     => 0,
54        summary     => 'Show unhandled IRC events',
55        description => 'If set, display all unrecognized IRC events as ' .
56        'admin messages. Intended for debugging and development use only '
57       });
58   
59    register_commands();
60    register_handlers();
61    BarnOwl::filter('irc type ^IRC$');
62}
63
64sub shutdown {
65    for my $conn (values %ircnets) {
66        $conn->disconnect();
67    }
68}
69
70sub mainloop_hook {
71    return unless defined $irc;
72    eval {
73        $irc->do_one_loop();
74    };
75    return;
76}
77
78sub register_handlers {
79    if(!$irc) {
80        $irc = Net::IRC->new;
81        $irc->timeout(0);
82    }
83}
84
85sub register_commands {
86    BarnOwl::new_command('irc-connect' => \&cmd_connect);
87    BarnOwl::new_command('irc-disconnect' => \&cmd_disconnect);
88    BarnOwl::new_command('irc-msg'     => \&cmd_msg);
89    BarnOwl::new_command('irc-join'    => \&cmd_join);
90    BarnOwl::new_command('irc-part'    => \&cmd_part);
91    BarnOwl::new_command('irc-nick'    => \&cmd_nick);
92    BarnOwl::new_command('irc-names'   => \&cmd_names);
93}
94
95$BarnOwl::Hooks::startup->add(\&startup);
96$BarnOwl::Hooks::shutdown->add(\&shutdown);
97$BarnOwl::Hooks::mainLoop->add(\&mainloop_hook);
98
99################################################################################
100######################## Owl command handlers ##################################
101################################################################################
102
103sub cmd_connect {
104    my $cmd = shift;
105
106    my $nick = BarnOwl::getvar('irc:nick');
107    my $username = BarnOwl::getvar('irc:user');
108    my $ircname = BarnOwl::getvar('irc:name');
109    my $host;
110    my $port;
111    my $alias;
112    my $ssl;
113    my $password = undef;
114
115    {
116        local @ARGV = @_;
117        GetOptions(
118            "alias=s"    => \$alias,
119            "ssl"        => \$ssl,
120            "password=s" => \$password,
121            "port=i"     => \$port,
122            "nick=s"     => \$nick,
123        );
124        $host = shift @ARGV or die("Usage: $cmd HOST\n");
125        if(!$alias) {
126            $alias = $1 if $host =~ /^(?:irc[.])?(\w+)[.]\w+$/;
127            $alias ||= $host;
128        }
129        $port ||= 6667;
130        $ssl ||= 0;
131    }
132
133    my $conn = BarnOwl::Module::IRC::Connection->new($irc, $alias,
134        Nick      => $nick,
135        Server    => $host,
136        Port      => $port,
137        Username  => $username,
138        Ircname   => $ircname,
139        Port      => $port,
140        Password  => $password,
141        SSL       => $ssl
142       );
143
144    $ircnets{$alias} = $conn;
145    return;
146}
147
148sub cmd_disconnect {
149    my $cmd = shift;
150    my $conn = get_connection(\@_);
151    $conn->disconnect;
152    delete $ircnets{$conn->alias};
153}
154
155sub cmd_msg {
156    my $cmd = shift;
157    my $conn = get_connection(\@_);
158    my $to = shift or die("Usage: $cmd NICK\n");
159    # handle multiple recipients?
160    if(@_) {
161        process_msg($conn, $to, join(" ", @_));
162    } else {
163        BarnOwl::start_edit_win("/msg $to -a " . $conn->alias, sub {process_msg($conn, $to, @_)});
164    }
165}
166
167sub process_msg {
168    my $conn = shift;
169    my $to = shift;
170    my $body = shift;
171    # Strip whitespace. In the future -- send one message/line?
172    $body =~ tr/\n\r/  /;
173    $conn->privmsg($to, $body);
174    my $msg = BarnOwl::Message->new(
175        type        => 'IRC',
176        direction   => is_private($to) ? 'out' : 'in',
177        server      => $conn->server,
178        network     => $conn->alias,
179        recipient   => $to,
180        body        => $body,
181        sender      => $conn->nick,
182        is_private($to) ?
183          (isprivate  => 'true') : (channel => $to),
184        replycmd    => "irc-msg $to",
185        replysendercmd => "irc-msg $to"
186       );
187    BarnOwl::queue_message($msg);
188}
189
190sub cmd_join {
191    my $cmd = shift;
192    my $conn = get_connection(\@_);
193    my $chan = shift or die("Usage: $cmd channel\n");
194    $conn->join($chan);
195}
196
197sub cmd_part {
198    my $cmd = shift;
199    my $conn = get_connection(\@_);
200    my $chan = get_channel(\@_) || die("Usage: $cmd <channel>");
201    $conn->part($chan);
202}
203
204sub cmd_nick {
205    my $cmd = shift;
206    my $conn = get_connection(\@_);
207    my $nick = shift or die("Usage: $cmd <new nick>");
208    $conn->nick($nick);
209}
210
211sub cmd_names {
212    my $cmd = shift;
213    my $conn = get_connection(\@_);
214    my $chan = get_channel(\@_) || die("Usage: $cmd <channel>");
215    $conn->names($chan);
216}
217
218################################################################################
219########################### Utilities/Helpers ##################################
220################################################################################
221
222sub get_connection {
223    my $args = shift;
224    if(scalar @$args >= 2 && $args->[0] eq '-a') {
225        shift @$args;
226        return get_connection_by_alias(shift @$args);
227    }
228    my $m = BarnOwl::getcurmsg();
229    if($m && $m->type eq 'IRC') {
230        return get_connection_by_alias($m->network);
231    }
232    if(scalar keys %ircnets == 1) {
233        return [values(%ircnets)]->[0];
234    }
235    die("You must specify a network with -a\n");
236}
237
238sub get_channel {
239    my $args = shift;
240    if(scalar @$args) {
241        return shift @$args;
242    }
243    my $m = BarnOwl::getcurmsg();
244    if($m && $m->type eq 'IRC') {
245        return $m->channel if !$m->is_private;
246    }
247    return undef;
248}
249
250sub get_connection_by_alias {
251    my $key = shift;
252    die("No such ircnet: $key\n") unless exists $ircnets{$key};
253    return $ircnets{$key};
254}
255
2561;
Note: See TracBrowser for help on using the repository browser.