videosite: add connectors support
authorRalf Ertzinger <ralf@skytale.net>
Sun, 4 Sep 2011 13:06:27 +0000 (15:06 +0200)
committerRalf Ertzinger <ralf@skytale.net>
Sun, 4 Sep 2011 13:06:27 +0000 (15:06 +0200)
 - add new subcommand '/videosite connector' to manage connectors

videosite.pl

index d87b598..a5123bc 100644 (file)
@@ -37,7 +37,9 @@ my @outputstack = (undef);
 
 my $PARAMS = {
     'getter' => '',
-    'mode' => 'download'
+    'mode' => 'download',
+    'connectorlist' => ['direct'],
+    'connectors' => {},
 };
 
 
@@ -110,6 +112,10 @@ my $videosite_commands = {
         cmd_mode(@_);
     },
 
+    'connector' => sub {
+        cmd_connector(@_);
+    },
+
     'debug' => sub {
         $debug = 1;
         foreach (@grabbers, @getters) {
@@ -210,6 +216,16 @@ sub expand_url_shortener {
     return $s;
 }
 
+sub connectorlist {
+    my @c;
+
+    foreach (@{$conf->{'videosite'}->{'connectorlist'}}) {
+        push(@c, $conf->{'videosite'}->{'connectors'}->{$_});
+    }
+
+    return @c;
+}
+
 
 sub check_for_link {
     my $event = shift;
@@ -264,7 +280,7 @@ sub cmd_save {
 
     eval {
         my ($tempfile, $tempfn) = tempfile("videosite.xml.XXXXXX", dir => Irssi::get_irssi_dir());
-        print $tempfile XML::Simple::XMLout($conf, KeepRoot => 1, KeyAttr => {'config' => 'module', 'option' => 'key'});
+        print $tempfile XML::Simple::XMLout($conf, KeepRoot => 1, KeyAttr => {'connector' => '+name', 'config' => 'module', 'option' => 'key'});
         close($tempfile);
         rename($tempfn, $conffile);
     };
@@ -411,6 +427,170 @@ sub cmd_mode {
     }
 }
 
+sub cmd_connector {
+    my $subcmd = shift;
+    my $connconf = $conf->{'videosite'}->{'connectors'};
+
+    unless(defined($subcmd)) {
+        write_irssi('No subcommand given');
+        return;
+    }
+
+    $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);
+
+        if ($name eq 'direct') {
+            write_irssi("Cannot remove direct connector");
+            return;
+        }
+
+        unless (exists($connconf->{$_})) {
+            write_irssi("Connector does not exist");
+            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 ($conn eq 'direct') {
+            write_irssi("Connector is not modifiable");
+            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 ($conn eq 'direct') {
+            write_irssi("Connector is not modifiable");
+            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 = @_;
+
+        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 {
@@ -454,6 +634,7 @@ sub ploader {
         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});
@@ -485,7 +666,7 @@ sub init_videosite {
     my $bindings = shift;
     my $p;
 
-    unless(-r $conffile && defined($conf = XML::Simple::XMLin($conffile, ForceArray => ['config', 'option'], KeepRoot => 1, KeyAttr => {'config' => 'module', 'option' => 'key'}))) {
+    unless(-r $conffile && defined($conf = XML::Simple::XMLin($conffile, ForceArray => ['config', 'option', 'connectorlist'], KeepRoot => 1, KeyAttr => {'connector' => '+name', 'config' => 'module', 'option' => 'key'}))) {
         # No config, start with an empty one
         write_debug('No config found, using defaults');
         $conf = { 'videosite' => { }};
@@ -496,6 +677,15 @@ sub init_videosite {
         }
     }
 
+    # Make sure there is a connector called 'direct', which defines no
+    # proxies
+    unless (exists($conf->{'videosite'}->{'connectors'}->{'direct'})) {
+        $conf->{'videosite'}->{'connectors'}->{'direct'} = {
+                'name' => 'direct',
+                'schemas' => {},
+        };
+    }
+
     _load_modules($plugindir);
 
     unless (defined(@grabbers) && defined(@getters)) {