+package BettIrssi;
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(_bcb _bcs);
+
+use strict;
+
+delete($INC{'BettIrssiEvent.pm'});
+use BettIrssiEvent;
+use Irssi;
+require Exporter;
+
+sub _cmd_callback {
+ my $callback = shift;
+ my ($cmdline, $server, $witem) = @_;
+ my $data;
+
+ $data = BettIrssiEvent->new(
+ SIGNAL => undef,
+ SERVER => $server,
+ EVWITEM => $witem,
+ MESSAGE => $cmdline,
+ SENDER => undef,
+ );
+
+ $callback->($data);
+}
+
+sub _sig_callback {
+ my $callback = shift;
+ my $signal = shift;
+ my ($server, $msg, $nick, $userhost, $channel) = @_;
+ my $data;
+ my $evwitem;
+
+ # Change all attributes into Irssi classes
+ $evwitem = $server->window_item_find($channel);
+
+ if (defined($nick)) {
+ foreach ($evwitem->nicks()) {
+ if ($_->{'nick'} eq $nick) {
+ $nick = $_;
+ last;
+ }
+ }
+ } else {
+ $nick = $channel->{'ownnick'};
+ }
+
+ $data = BettIrssiEvent->new(
+ SIGNAL => $signal,
+ SERVER => $server,
+ EVWITEM => $evwitem,
+ MESSAGE => $msg,
+ SENDER => $nick,
+ );
+
+ $callback->($data);
+}
+
+sub _bcb {
+ my $cmd = shift;
+ my $callback = shift;
+
+ return ($cmd, sub { _cmd_callback($callback, @_) });
+}
+
+sub _bcs {
+ my $signal = lc(shift);
+ my $callback = shift;
+
+ if ($signal eq 'message public') {
+ # messages to a channel by someone not us.
+ return ($signal, sub { _sig_callback($callback, $signal, @_) });
+
+ } elsif ($signal eq 'message own_public') {
+ # messages to a channel by us.
+ return ($signal, sub { _sig_callback($callback, $signal, $_[0], $_[1], undef, undef, $_[2]) });
+
+ } elsif ($signal eq 'message private') {
+ # messages in a query by someone not us
+ return ($signal, sub { _sig_callback($callback, $signal, $_[0], $_[1], $_[2], $_[3], $_[2]) });
+
+ } elsif ($signal eq 'message own_private') {
+ # messages in a query by us
+ return ($signal, sub { _sig_callback($callback, $signal, $_[0], $_[1], undef, undef, $_[2]) });
+
+ } elsif ($signal eq 'message irc action') {
+ return ($signal, sub { _sig_callback($callback, $signal, @_) });
+
+ } elsif ($signal eq 'message irc own_action') {
+ return ($signal, sub { _sig_callback($callback, $signal, $_[0], $_[1], undef, undef, $_[2]) });
+
+ } else {
+ Irssi::print("%mBettIrssi:%n %RUnknown signal%n %y$signal%n%R. Please bug the BettIrssi author about this.");
+ return ($signal, sub { Irssi::print("%mBettIrssi:%n %RSignal not handled") });
+ }
+}
+
+1;