3
0
mirror of https://github.com/pragma-/pbot.git synced 2024-11-02 10:09:32 +01:00
pbot/PBot/EventDispatcher.pm
Pragmatic Software d1e7abc175 Add event dispatcher module to allow modules to dispatch events and
to register handlers to listen for events.

Update IRCHandlers module to use new event dispatcher to dispatch
irc.events.  Update several modules to register with dispatcher
to listen for irc.events.

Improve handling of reconnection upon unexpected disconnection.

Todo: update more things to use new event dispatcher logic.
2014-11-01 00:15:21 +00:00

49 lines
1.0 KiB
Perl

package PBot::EventDispatcher;
use warnings;
use strict;
use IO::Select;
use Carp ();
sub new {
Carp::croak("Options to " . __FILE__ . " should be key/value pairs, not hash reference") if ref($_[1]) eq 'HASH';
my ($class, %conf) = @_;
my $self = bless {}, $class;
$self->initialize(%conf);
return $self;
}
sub initialize {
my ($self, %conf) = @_;
$self->{pbot} = delete $conf{pbot} // Carp::croak("Missing pbot reference in " . __FILE__);
$self->{handlers} = { any => [] };
}
sub register_handler {
my ($self, $event_type, $sub) = @_;
push @{$self->{handlers}->{$event_type}}, $sub;
}
sub dispatch_event {
my ($self, $event_type, $event_data) = @_;
my $ret = undef;
if (exists $self->{handlers}->{$event_type}) {
foreach my $handler (@{$self->{handlers}->{$event_type}}) {
$ret = $handler->($event_type, $event_data);
return $ret if $ret;
}
}
foreach my $handler (@{$self->{handlers}->{any}}) {
$ret = $handler->($event_type, $event_data);
return $ret if $ret;
}
return $ret;
}
1;