-sub cmd_disable {
- my $target = shift;
- my $p;
-
- foreach $p (@grabbers) {
- if ($p->{'NAME'} eq $target) {
- $p->disable();
- return;
- }
- }
- write_irssi('No such module');
-}
-
-
-sub cmd_show {
- my $target = shift;
- my $p;
- my $e;
-
- if (defined($target)) {
- foreach $p (@getters, @grabbers) {
- if ($p->{'NAME'} eq $target) {
- write_irssi($p->getconfstr());
- return;
- }
- }
- write_irssi('No such module');
- } else {
- write_irssi('Loaded grabbers (* denotes enabled modules):');
- foreach $p (@grabbers) {
- $e = $p->_getval('enabled');
- write_irssi(' %s%s', $p->{'NAME'}, $e?'*':'');
- };
-
- write_irssi('Loaded getters:');
- foreach $p (@getters) {
- write_irssi(' %s', $p->{'NAME'});
- };
- }
-}
-
-sub cmd_help {
- my $target = shift;
- my $p;
-
- if (defined($target)) {
- foreach $p (@getters, @grabbers) {
- if ($p->{'NAME'} eq $target) {
- write_irssi($p->gethelpstr());
- return;
- }
- }
- write_irssi('No such module');
- } else {
- write_irssi(<<'EOT');
-Supported commands:
- save: save the current configuration
- help [modulename]: display this help, or module specific help
- show [modulename]: show loaded modules, or the current parameters of a module
- set modulename parameter value: set a module parameter to a new value
- getter [modulename]: display or set the getter to use
- enable [modulename]: enable the usage of this module (grabbers only)
- disable [modulename]: disable the usage of this module (grabbers only)
- reload: reload all modules (this is somewhat experimental)
- mode [modename]: display or set the operation mode (download/display)
- connector [subcommand]: manage connectors (proxies)
- debug: enable debugging messages
- nodebug: disable debugging messages
-EOT
- }
-}
-
-sub cmd_getter {
- my $target = shift;
- my $p;
-
- if (defined($target)) {
- foreach $p (@getters) {
- if ($p->{'NAME'} eq $target) {
- $getter = $p;
- $conf->{'videosite'}->{'getter'} = $target;
- write_irssi("Getter changed to %s", $target);
- return;
- }
- }
- write_irssi('No such getter');
- } else {
- write_irssi('Current getter: %s', $conf->{'videosite'}->{'getter'});
- }
-}
-
-sub cmd_mode {
- my $mode = shift;
-
- if (defined($mode)) {
- $mode = lc($mode);
- if (('download' eq $mode) or ('display' eq $mode)) {
- $conf->{'videosite'}->{'mode'} = $mode;
- write_irssi('Now using %s mode', $mode);
- } else {
- write_irssi('Invalid mode: %s', $mode);
- }
- } else {
- write_irssi('Current mode: %s', $conf->{'videosite'}->{'mode'});
- }
-}
-
-sub cmd_connector {
- my $subcmd = shift;
- my $connconf = $conf->{'videosite'}->{'connectors'};
-
- unless(defined($subcmd)) {
- $subcmd = "help";
- }
-
- $subcmd = lc($subcmd);
-
- if ($subcmd eq 'list') {
- write_irssi("Defined connectors");
- foreach (keys(%{$connconf})) {
- write_irssi($_);
- my $schemas = $connconf->{$_}->{'schemas'};
- if (scalar(keys(%{$schemas})) == 0) {
- write_irssi(" No schemas defined");
- } else {
- foreach (keys(%{$schemas})) {
- write_irssi(' %s: %s', $_, $schemas->{$_});
- }
- }
- }
-
- write_irssi();
- write_irssi("Selected connectors: %s", join(", ", @{$conf->{'videosite'}->{'connectorlist'}}));
- } elsif ($subcmd eq 'add') {
- my ($name) = @_;
-
- unless(defined($name)) {
- write_irssi("No name given");
- return;
- }
-
- $name = lc($name);
-
- if (exists($connconf->{$_})) {
- write_irssi("Connector already exists");
- return;
- }
-
- $connconf->{$name} = {'name' => $name, 'schemas' => {}};
- } elsif ($subcmd eq 'del') {
- my ($name) = @_;
-
- unless(defined($name)) {
- write_irssi("No name given");
- return;
- }
-
- $name = lc($name);
-
- unless (exists($connconf->{$name})) {
- write_irssi("Connector does not exist");
- return;
- }
-
- if (exists($connconf->{$name}->{'_immutable'})) {
- write_irssi("Connector cannot be removed");
- return;
- }
-
- delete($connconf->{$name});
-
- # Remove from list of active connectors
- $conf->{'videosite'}->{'connectorlist'} =
- [ grep { $_ ne $name } @{$conf->{'videosite'}->{'connectorlist'}} ];
-
- if (scalar(@{$conf->{'videosite'}->{'connectorlist'}}) == 0) {
- write_irssi("List of selected connectors is empty, resetting to direct");
- $conf->{'videosite'}->{'connectorlist'} = [ 'direct' ];
- }
- } elsif ($subcmd eq 'addschema') {
- my ($conn, $schema, $proxy) = @_;
-
- unless(defined($conn)) {
- write_irssi("No connector name given");
- return;
- }
-
- $conn = lc($conn);
-
- if (exists($connconf->{$conn}->{'_immutable'})) {
- write_irssi("Connector cannot be modified");
- return;
- }
-
- unless(defined($schema)) {
- write_irssi("No schema given");
- return;
- }
-
- $schema = lc($schema);
-
- unless(defined($proxy)) {
- write_irssi("No proxy given");
- return;
- }
-
- unless(exists($connconf->{$conn})) {
- write_irssi("Connector does not exist");
- return;
- }
-
- $connconf->{$conn}->{'schemas'}->{$schema} = $proxy;
- } elsif ($subcmd eq 'delschema') {
- my ($conn, $schema) = @_;
-
- unless(defined($conn)) {
- write_irssi("No connector name given");
- return;
- }
-
- $conn = lc($conn);
-
- if (exists($connconf->{$conn}->{'_immutable'})) {
- write_irssi("Connector cannot be modified");
- return;
- }
-
- unless(defined($schema)) {
- write_irssi("No schema given");
- return;
- }
-
- $schema = lc($schema);
-
- unless(exists($connconf->{$conn})) {
- write_irssi("Connector does not exist");
- return;
- }
-
- delete($connconf->{$conn}->{'schemas'}->{$schema});
- } elsif ($subcmd eq 'select') {
- my @connlist = map { lc } @_;
-
- if (scalar(@connlist) == 0) {
- write_irssi("No connectors given");
- return;
- }
-
- foreach (@connlist) {
- unless(exists($connconf->{$_})) {
- write_irssi("Connector %s does not exist", $_);
- return;
- }
- }
-
- $conf->{'videosite'}->{'connectorlist'} = [ @connlist ];
- } else {
- write_irssi("connector [list|add|del|addschema|delschema|help] <options>");
- write_irssi(" help: Show this help");
- write_irssi(" list: List the defined connectors");
- write_irssi(" add <name>: Add a connector with name <name>");
- write_irssi(" del <name>: Delete the connector with name <name>");
- write_irssi(" addschema <name> <schema> <proxy>: Add proxy to connector for the given schema");
- write_irssi(" delschema <name> <schema>: Remove the schema from the connector");
- write_irssi(" select <name> [<name>...]: Select the connectors to use");
- }
-}
-
-
-
-
-# save on unload
-sub sig_command_script_unload {
- my $script = shift;
- if ($script =~ /(.*\/)?videosite(\.pl)?$/) {
- cmd_save();
- }
-}
-
-sub ploader {
-
- my $dir = shift;
- my $pattern = shift;
- my $type = shift;
- my @list;
- my $p;
- my $g;
- my @g = ();
-
- opendir(D, $dir) || return ();
- @list = grep {/$pattern/ && -f File::Spec->catfile($dir, $_) } readdir(D);
- closedir(D);
-
- foreach $p (@list) {
- write_debug("Trying to load $p:");
- $p =~ s/\.pm$//;
- eval qq{ require videosite::$p; };
- if ($@) {
- write_irssi("Failed to load plugin: $@");
- next;
- }
-
- $g = eval qq{ videosite::$p->new(); };
- if ($@) {
- write_irssi("Failed to instanciate: $@");
- delete($INC{$p});
- next;
- }
-
- write_debug("found $g->{'TYPE'} $g->{'NAME'}");
- if ($type eq $g->{'TYPE'}) {
- push(@g, $g);
- $g->setio(\&write_irssi);
- $g->setconn(\&connectorlist);
- } else {
- write_irssi('%s has wrong type (got %s, expected %s)', $p, $g->{'TYPE'}, $type);
- delete($INC{$p});
- }
- }
-
- write_debug("Loaded %d plugins", $#g+1);
-
- return @g;
-}
-
-sub _load_modules($) {
-
- my $path = shift;
-
- foreach (keys(%INC)) {
- if ($INC{$_} =~ m|^$path|) {
- write_debug("Removing %s from \$INC", $_);
- delete($INC{$_});
- }
- }
- @grabbers = ploader($path, '.*Grabber\.pm$', 'grabber');
- @getters = ploader($path, '.*Getter\.pm$', 'getter');
-}
-
-
-sub init_videosite {
-
- my $bindings = shift;
- my $p;
-
- if (-r $conffile) {
- write_debug("Attempting JSON config load from %s", $conffile);
- eval {
- local $/;
- open(CONF, '<', $conffile);
- $conf = JSON->new->utf8->decode(<CONF>);
- close(CONF);
- };
- } elsif (-r $xmlconffile) {
- write_debug("Attempting XML config load from %s", $xmlconffile);
- $conf = XML::Simple::XMLin($xmlconffile, ForceArray => ['config', 'option', 'connectorlist'], KeepRoot => 1, KeyAttr => {'connector' => '+name', 'config' => 'module', 'option' => 'key'});
- }
-
- unless(defined($conf)) {
- # No config, start with an empty one
- write_debug('No config found, using defaults');
- $conf = { 'videosite' => { }};
- }
-
- foreach (keys(%{$PARAMS})) {
- unless (exists($conf->{'videosite'}->{$_})) {
- $conf->{'videosite'}->{$_} = $PARAMS->{$_};
- }
- }
-
- # Make sure there is a connector called 'direct', which defines no
- # proxies
- unless (exists($conf->{'videosite'}->{'connectors'}->{'direct'})) {
- $conf->{'videosite'}->{'connectors'}->{'direct'} = {
- 'name' => 'direct',
- '_immutable' => '1',
- 'schemas' => {},
- };
- }
-
- _load_modules($plugindir);
-
- unless (defined(@grabbers) && defined(@getters)) {
- write_irssi('No grabbers or no getters found, can not proceed.');
- return;
- }
-
- $getter = $getters[0];
- foreach $p (@getters) {
- if ($conf->{'videosite'}->{'getter'} eq $p->{'NAME'}) {
- $getter = $p;
- }
- }
- write_debug('Selected %s as getter', $getter->{'NAME'});
- $conf->{'videosite'}->{'getter'} = $getter->{'NAME'};
-
- # Loop through all plugins and load the config
- foreach $p (@grabbers, @getters) {
- $conf->{'videosite'}->{'config'}->{$p->{'NAME'}} = $p->mergeconfig($conf->{'videosite'}->{'config'}->{$p->{'NAME'}});
- }
-
- if ($bindings) {
-
- Irssi::signal_add_first('command script load', 'sig_command_script_unload');
- Irssi::signal_add_first('command script unload', 'sig_command_script_unload');
- Irssi::signal_add('setup saved', 'cmd_save');
-
-
- Irssi::command_bind(_bcb('videosite' => \&cmdhandler));
- }
-
- write_irssi('initialized successfully');
-}
-
-sub sig_complete {
- my ($complist, $window, $word, $linestart, $want_space) = @_;
- my @matches;
-
- if ($linestart !~ m|^/videosite\b|) {
- return;
- }
-
- if ('/videosite' eq $linestart) {
- # No command enterd so far. Produce a list of possible follow-ups
- @matches = grep {/^$word/} keys (%{$videosite_commands});
- } elsif ('/videosite set' eq $linestart) {
- # 'set' command entered. Produce a list of modules
- foreach (@grabbers, @getters) {
- push(@matches, $_->{'NAME'}) if $_->{'NAME'} =~ m|^$word|;
- };
- } elsif ($linestart =~ m|^/videosite set (\w+)$|) {
- my $module = $1;
-
- foreach my $p (@getters, @grabbers) {
- if ($p->{'NAME'} eq $module) {
- @matches = $p->getparamlist($word);
- last;
- }
- }
- } elsif ($linestart =~ m|/videosite set (\w+) (\w+)$|) {
- my $module = $1;
- my $param = $2;
-
- foreach my $p (@getters, @grabbers) {
- if ($p->{'NAME'} eq $module) {
- @matches = $p->getparamvalues($param, $word);
- last;
- }
- }
- }
-
-
- push(@{$complist}, sort @matches);
- ${$want_space} = 0;
-
- Irssi::signal_stop();
-}