Initial commit
[BettIrssi.git] / BettIrssi.pm
1 package BettIrssi;
2
3 @ISA = qw(Exporter);
4 @EXPORT_OK = qw(_bcb _bcs);
5
6 use strict;
7
8 delete($INC{'BettIrssiEvent.pm'});
9 use BettIrssiEvent;
10 use Irssi;
11 require Exporter;
12
13 sub _cmd_callback {
14     my $callback = shift;
15     my ($cmdline, $server, $witem) = @_;
16     my $data;
17
18     $data = BettIrssiEvent->new(
19         SIGNAL => undef,
20         SERVER => $server,
21         EVWITEM => $witem,
22         MESSAGE => $cmdline,
23         SENDER => undef,
24     );
25
26     $callback->($data);
27 }
28
29 sub _sig_callback {
30     my $callback = shift;
31     my $signal = shift;
32     my ($server, $msg, $nick, $userhost, $channel) = @_;
33     my $data;
34     my $evwitem;
35
36     # Change all attributes into Irssi classes
37     $evwitem = $server->window_item_find($channel);
38
39     if (defined($nick)) {
40         foreach ($evwitem->nicks()) {
41             if ($_->{'nick'} eq $nick) {
42                 $nick = $_;
43                 last;
44             }
45         }
46     } else {
47         $nick = $channel->{'ownnick'};
48     }
49
50     $data = BettIrssiEvent->new(
51         SIGNAL => $signal,
52         SERVER => $server,
53         EVWITEM => $evwitem,
54         MESSAGE => $msg,
55         SENDER => $nick,
56     );
57
58     $callback->($data);
59 }
60
61 sub _bcb {
62     my $cmd = shift;
63     my $callback = shift;
64
65     return ($cmd, sub { _cmd_callback($callback, @_) });
66 }
67
68 sub _bcs {
69     my $signal = lc(shift);
70     my $callback = shift;
71
72     if ($signal eq 'message public') {
73         # messages to a channel by someone not us.
74         return ($signal, sub { _sig_callback($callback, $signal, @_) });
75
76     } elsif ($signal eq 'message own_public') {
77         # messages to a channel by us.
78         return ($signal, sub { _sig_callback($callback, $signal, $_[0], $_[1], undef, undef, $_[2]) });
79
80     } elsif ($signal eq 'message private') {
81         # messages in a query by someone not us
82         return ($signal, sub { _sig_callback($callback, $signal, $_[0], $_[1], $_[2], $_[3], $_[2]) });
83
84     } elsif ($signal eq 'message own_private') {
85         # messages in a query by us
86         return ($signal, sub { _sig_callback($callback, $signal, $_[0], $_[1], undef, undef, $_[2]) });
87
88     } elsif ($signal eq 'message irc action') {
89         return ($signal, sub { _sig_callback($callback, $signal, @_) });
90
91     } elsif ($signal eq 'message irc own_action') {
92         return ($signal, sub { _sig_callback($callback, $signal, $_[0], $_[1], undef, undef, $_[2]) });
93
94     } else {
95         Irssi::print("%mBettIrssi:%n %RUnknown signal%n %y$signal%n%R. Please bug the BettIrssi author about this.");
96         return ($signal, sub { Irssi::print("%mBettIrssi:%n %RSignal not handled") });
97     }
98 }
99
100 1;