source: perl/modules/AIM/lib/BarnOwl/Module/AIM.pm @ 7d63a6c

barnowl_perlaim
Last change on this file since 7d63a6c was 7d63a6c, checked in by Geoffrey Thomas <geofft@mit.edu>, 13 years ago
Supports outgoing messages. I think this all works, but I got rate-limited near the end so I can't promise anything.
  • Property mode set to 100644
File size: 3.4 KB
Line 
1use warnings;
2use strict;
3
4=head1 NAME
5
6BarnOwl::Module::AIM
7
8=head1 DESCRIPTION
9
10BarnOwl module implementing AIM support via Net::OSCAR
11
12=cut
13
14package BarnOwl::Module::AIM; 
15
16use Net::OSCAR;
17
18our @oscars;
19
20sub on_im_in {
21    my ($oscar, $sender, $message, $is_away) = @_;
22    my $msg = BarnOwl::Message->new(
23            type => 'AIM',
24            direction => 'in',
25            sender => $sender,
26            origbody => $message,
27            away => $is_away,
28            body => zformat($message, $is_away),
29            recipient => get_screenname($oscar),
30            replycmd =>
31                "aimwrite -a '" . get_screenname($oscar) . "' $sender",
32            replysendercmd =>
33                "aimwrite -a '" . get_screenname($oscar) . "' $sender",
34            );
35    BarnOwl::queue_message($msg);
36}
37
38sub cmd_aimlogin { 
39=comment
40    my ($cmd, $user, $pass) = @_;
41    if (!defined $user) {
42        BarnOwl::start_question('Username: ', sub {
43                cmd_aimlogin($cmd, @_);
44                });
45    } elsif (!defined $pass) {
46        BarnOwl::start_password('Password: ', sub {
47                cmd_aimlogin($cmd, $user, @_);
48                });
49    } else {
50=cut
51    {
52        my $oscar = Net::OSCAR->new();
53        my ($user, $pass) = ('...', '...');
54        $oscar->set_callback_im_in(\&on_im_in);
55        $oscar->set_callback_signon_done(sub ($) {
56                BarnOwl::admin_message('AIM',
57                    'Logged in to AIM as ' . shift->screenname);
58        });
59        $oscar->signon(
60                screenname => $user,
61                password => $pass
62                );
63        push @oscars, $oscar;
64    }
65}
66
67sub cmd_aimwrite {
68    my ($cmd, $recipient) = @_;
69    BarnOwl::start_edit_win(join(' ', @_), sub {
70            my ($body) = @_;
71            my $oscar = get_oscar();
72            my $sender = get_screenname($oscar);
73            $oscar->send_im($recipient, $body);
74            BarnOwl::queue_message(BarnOwl::Message->new(
75                    type => 'AIM',
76                    direction => 'in',
77                    sender => $sender,
78                    origbody => $body,
79                    away => 0,
80                    body => zformat($body, 0),
81                    recipient => $recipient,
82                    replycmd =>
83                        "aimwrite -a '" . get_screenname($oscar) . "' $sender",
84                    replysendercmd =>
85                        "aimwrite -a '" . get_screenname($oscar) . "' $sender",
86            ));
87    });
88}
89
90BarnOwl::new_command(aimlogin => \&cmd_aimlogin, {});
91BarnOwl::new_command(aimwrite => \&cmd_aimwrite, {});
92
93sub main_loop() {
94    for my $oscar (@oscars) {
95        $oscar->do_one_loop();
96    }
97}
98$BarnOwl::Hooks::mainLoop->add(\&main_loop);
99
100### helpers ###
101
102sub zformat($$) {
103    # TODO subclass HTML::Parser
104    my ($message, $is_away) = @_;
105    if ($is_away) {
106        return BarnOwl::boldify('[away]') . " $message";
107    } else {
108        return $message;
109    }
110}
111
112sub get_oscar() {
113    if (scalar @oscars == 0) {
114        die "You are not logged in to AIM."
115    } elsif (scalar @oscars == 1) {
116        return $oscars[0];
117    } else {
118        my $m = BarnOwl::getcurmsg();
119        if ($m && $m->type eq 'AIM') {
120            for my $oscar (@oscars) {
121                return $oscar if ($oscar->screenname eq $m->recipient);
122            }
123        }
124    }
125    die('You must specify an account with -a');
126}
127
128sub get_screenname($) {
129# TODO qualify realm
130    return shift->screenname;
131}
132
1331;
134
135# vim: set sw=4 et cin:
Note: See TracBrowser for help on using the repository browser.