mirror of
https://github.com/pragma-/pbot.git
synced 2024-12-24 11:42:35 +01:00
0d7f0bf184
These are different from the loadable factoid modules. The factoid modules are external executable shell commands that take stdin as arguments and print to stdout as a return value. As such, they are not integrated into the bot and cannot make use of the bot's internal subroutines. These plugins are loaded internally and integrated into the bot such that they can interface with the bot's internal subroutines and state. All files in the Pluggable directory not beginning with an underscore will be automatically loaded at bot start-up. Plugins (including those starting with an underscore) can be manually loaded or unloaded with the `plug` and `unplug` commands. Use `pluglist` to list loaded plugins.
73 lines
1.6 KiB
Perl
73 lines
1.6 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}) {
|
|
for (my $i = 0; $i < @{$self->{handlers}->{$event_type}}; $i++) {
|
|
my $handler = @{$self->{handlers}->{$event_type}}[$i];
|
|
|
|
eval {
|
|
$ret = $handler->($event_type, $event_data);
|
|
};
|
|
|
|
if ($@) {
|
|
chomp $@;
|
|
$self->{pbot}->{logger}->log("Error in event handler: $@\n");
|
|
$self->{pbot}->{logger}->log("Removing handler.\n");
|
|
splice @{$self->{handlers}->{$event_type}}, $i--, 1;
|
|
}
|
|
|
|
return $ret if $ret;
|
|
}
|
|
}
|
|
|
|
for (my $i = 0; $i < @{$self->{handlers}->{any}}; $i++) {
|
|
my $handler = @{$self->{handlers}->{any}}[$i];
|
|
|
|
eval {
|
|
$ret = $handler->($event_type, $event_data);
|
|
};
|
|
|
|
if ($@) {
|
|
chomp $@;
|
|
$self->{pbot}->{logger}->log("Error in event handler: $@\n");
|
|
$self->{pbot}->{logger}->log("Removing handler.\n");
|
|
splice @{$self->{handlers}->{any}}, $i--, 1;
|
|
}
|
|
|
|
return $ret if $ret;
|
|
}
|
|
|
|
return $ret;
|
|
}
|
|
|
|
1;
|