Bot-Cobalt
view release on metacpan or search on metacpan
lib/Bot/Cobalt/Plugin/PluginMgr.pm view on Meta::CPAN
broadcast( 'message', $msg->context, $msg->channel,
core->rpl( q{RPL_PLUGIN_UNLOAD_ERR},
plugin => $alias,
err => 'No such plugin found, is it loaded?'
)
);
return
} elsif (core()->State->{NonReloadable}->{$alias}) {
broadcast( 'message', $msg->context, $msg->channel,
core->rpl( q{RPL_PLUGIN_UNLOAD_ERR},
plugin => $alias,
err => "Plugin $alias is marked as non-reloadable",
)
);
return
}
## call _unload and send any response from there
my $unload_resp = $self->_unload($alias);
broadcast( 'message', $msg->context, $msg->channel, $unload_resp );
my $pkgisa = ref $plug_obj;
return $self->_load($alias, $pkgisa);
}
sub _unload {
my ($self, $alias) = @_;
my $resp;
my $plug_obj = core()->plugin_get($alias);
my $plugisa = ref $plug_obj || return "_unload broken? no PLUGISA";
return "Bad syntax; no plugin alias specified"
unless defined $alias;
return core->rpl( q{RPL_PLUGIN_UNLOAD_ERR},
plugin => $alias,
err => 'No such plugin found, is it loaded?'
) unless $plug_obj;
return core->rpl( q{RPL_PLUGIN_UNLOAD_ERR},
plugin => $alias,
err => "Plugin $alias is marked as non-reloadable",
) unless Bot::Cobalt::Core::Loader->is_reloadable($plug_obj);
logger->info("Attempting to unload $alias ($plugisa) per request");
if ( core()->plugin_del($alias) ) {
delete core()->PluginObjects->{$plug_obj};
Bot::Cobalt::Core::Loader->unload($plugisa);
## and timers:
core()->timer_del_alias($alias);
return core->rpl( q{RPL_PLUGIN_UNLOAD},
plugin => $alias
)
} else {
return core->rpl( q{RPL_PLUGIN_UNLOAD_ERR},
plugin => $alias,
err => 'Unknown core->plugin_del failure'
)
}
return
}
sub _load {
my ($self, $alias, $module) = @_;
## Called for !load / !reload
## Return string for IRC
return "Bad syntax; usage: load <alias> [module]"
unless defined $alias;
return "Plugin already loaded: $alias"
if grep { $_ eq $alias } keys %{ core()->plugin_list };
return $self->_load_module($alias, $module)
if defined $module;
my $plugin_cfg;
## No module specified; do we know this alias?
unless ( $plugin_cfg = core()->cfg->plugins->plugin($alias) ) {
return core->rpl( q{RPL_PLUGIN_ERR},
plugin => $alias,
err => "Plugin '$alias' not found in plugins conf",
)
}
return $self->_load_module(
$alias,
$plugin_cfg->module
)
}
sub _load_module {
## _load_module( 'Auth', 'Bot::Cobalt::Plugin::Auth' ) f.ex
## load to Core
## returns a response string for irc
my ($self, $alias, $module) = @_;
my ($err, $obj);
try {
$obj = Bot::Cobalt::Core::Loader->load($module);
} catch {
$err = $_
};
if ($err) {
logger->warn("Plugin load failure; $err");
( run in 0.659 second using v1.01-cache-2.11-cpan-437f7b0c052 )