From 225c1fd55274369afe9aa75f8798ee91c0aeac60 Mon Sep 17 00:00:00 2001 From: Ralf Ertzinger Date: Sun, 4 Sep 2011 15:06:27 +0200 Subject: [PATCH] videosite: add connectors support - add new subcommand '/videosite connector' to manage connectors --- videosite.pl | 196 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 193 insertions(+), 3 deletions(-) diff --git a/videosite.pl b/videosite.pl index d87b598..a5123bc 100644 --- a/videosite.pl +++ b/videosite.pl @@ -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] "); + write_irssi(" help: Show this help"); + write_irssi(" list: List the defined connectors"); + write_irssi(" add : Add a connector with name "); + write_irssi(" del : Delete the connector with name "); + write_irssi(" addschema : Add proxy to connector for the given schema"); + write_irssi(" delschema : Remove the schema from the connector"); + write_irssi(" select [...]: 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)) { -- 1.8.3.1