From: Ralf Ertzinger Date: Tue, 30 Apr 2013 14:38:26 +0000 (+0200) Subject: videosite-irssi: remove unneeded code X-Git-Url: https://git.camperquake.de/gitweb.cgi?p=videosite.git;a=commitdiff_plain;h=eaa22f64e0c03b9683519e2cd1757ec5343131fc videosite-irssi: remove unneeded code --- diff --git a/videosite-irssi.pl b/videosite-irssi.pl index f9d7828..c121257 100644 --- a/videosite-irssi.pl +++ b/videosite-irssi.pl @@ -10,755 +10,7 @@ use strict; use Irssi 20020324 qw (command_bind command_runsub signal_add_first signal_add_last); use vars qw($VERSION %IRSSI); -use Data::Dumper; use File::Spec; -use File::Temp qw(tempfile); - -my @grabbers; -my @getters; -my $getter; -my $conf; -my $xmlconffile = File::Spec->catfile(Irssi::get_irssi_dir(), 'videosite.xml'); -my $conffile = File::Spec->catfile(Irssi::get_irssi_dir(), 'videosite.json'); -my $scriptdir = File::Spec->catfile(Irssi::get_irssi_dir(), 'scripts'); -my $plugindir = File::Spec->catfile($scriptdir, 'videosite'); -my @outputstack = (undef); - -# "message public", SERVER_REC, char *msg, char *nick, char *address, char *target -signal_add_last(_bcs("message public" => sub {check_for_link(@_)})); -# "message own_public", SERVER_REC, char *msg, char *target -signal_add_last(_bcs("message own_public" => sub {check_for_link(@_)})); - -# "message private", SERVER_REC, char *msg, char *nick, char *address -signal_add_last(_bcs("message private" => sub {check_for_link(@_)})); -# "message own_private", SERVER_REC, char *msg, char *target, char *orig_target -signal_add_last(_bcs("message own_private" => sub {check_for_link(@_)})); - -# "message irc action", SERVER_REC, char *msg, char *nick, char *address, char *target -signal_add_last(_bcs("message irc action" => sub {check_for_link(@_)})); -# "message irc own_action", SERVER_REC, char *msg, char *target -signal_add_last(_bcs("message irc own_action" => sub {check_for_link(@_)})); - -# For tab completion -# This does not use BettIrssi (yet) -signal_add_first('complete word', \&sig_complete); - -sub push_output { - unshift(@outputstack, shift); -} - -sub pop_output { - shift(@outputstack); - - @outputstack = (undef) unless (@outputstack); -} - -my $videosite_commands = { - 'save' => sub { - cmd_save(); - }, - - 'set' => sub { - cmd_set(@_); - }, - - 'show' => sub { - cmd_show(@_); - }, - - 'help' => sub { - cmd_help(@_); - }, - - 'getter' => sub { - cmd_getter(@_); - }, - - 'enable' => sub { - cmd_enable(@_); - }, - - 'disable' => sub { - cmd_disable(@_); - }, - - 'reload' => sub { - init_videosite(0); - }, - - 'mode' => sub { - cmd_mode(@_); - }, - - 'connector' => sub { - cmd_connector(@_); - }, - - 'debug' => sub { - $debug = 1; - foreach (@grabbers, @getters) { - $_->setdebug(1); - } - write_irssi('Enabled debugging'); - }, - - 'nodebug' => sub { - $debug = 0; - foreach (@grabbers, @getters) { - $_->setdebug(0); - } - write_irssi('Disabled debugging'); - }, -}; - -sub write_irssi { - my @text = @_; - my $output = $outputstack[0]; - - my $format = "%%mvideosite: %%n" . shift(@text); - - # escape % in parameters from irssi - s/%/%%/g foreach @text; - - if (defined $output) { - $output->(sprintf($format, @text), MSGLEVEL_CLIENTCRAP); - } else { - Irssi::print(sprintf($format, @text)); - } - -} - -sub write_debug { - if ($debug) { - write_irssi(@_); - } -} - -sub expand_url_shortener { - my $s = shift; - my $os = ''; - my @urlshortener = ( - 'is\.gd/[[:alnum:]]+', - 'otf\.me/[[:alnum:]]+', - 'hel\.me/[[:alnum:]]+', - '7ax\.de/[[:alnum:]]+', - 'ow\.ly/[[:alnum:]]+', - 'j\.mp/[[:alnum:]]+', - 'bit\.ly/[[:alnum:]]+', - 'tinyurl\.com/[[:alnum:]]+', - 'pop\.is/[[:alnum:]]+', - 'post\.ly/[[:alnum:]]+', - '1\.ly/[[:alnum:]]+', - '2\.ly/[[:alnum:]]+', - 't\.co/[[:alnum:]]+', - 'shar\.es/[[:alnum:]]+', - 'goo\.gl/[[:alnum:]]+', - ); - my $ua = LWP::UserAgent->new(agent => 'Mozilla', max_redirect => 0, timeout => 5); - my $i = 10; - - OUTER: while (($os ne $s) and ($i > 0)) { - study($s); - $os = $s; - $i--; - - foreach my $pattern (@urlshortener) { - my $p = "https?:\/\/" . $pattern; - - write_debug("Matching %s against %s", $p, $s); - if ($s =~ m|($p)|) { - my $matched = $1; - my $res; - - write_debug("Found %s", $matched); - $res = $ua->head($matched); - if ($res->is_redirect()) { - my $new = $res->headers()->header("Location"); - - write_debug("Replacing %s with %s", $matched, $new); - $s =~ s/$matched/$new/; - next OUTER; - } else { - write_debug("Error resolving %s", $matched); - } - } - } - } - - if ($i == 0) { - write_debug("Loop terminated by counter"); - } - - write_debug("Final string: %s", $s); - - return $s; -} - -sub connectorlist { - my @c; - - foreach (@{$conf->{'videosite'}->{'connectorlist'}}) { - push(@c, $conf->{'videosite'}->{'connectors'}->{$_}); - } - - return @c; -} - - -sub check_for_link { - my $event = shift; - my $message = $event->message(); - my $witem = $event->channel(); - my $g; - my $m; - my $p; - - - # Look if we should ignore this line - if ($message =~ m,(?:\s|^)/nosave(?:\s|$),) { - return; - } - - push_output($event->ewpf); - $message = expand_url_shortener($message); - - study($message); - - # Offer the message to all Grabbers in turn - GRABBER: foreach $g (@grabbers) { - ($m, $p) = $g->get($message); - while (defined($m)) { - write_debug('Metadata: %s', Dumper($m)); - if ('download' eq ($conf->{'videosite'}->{'mode'})) { - write_irssi('%%R>>> %%NSaving %%Y%s%%N %%G%s', $m->{'SOURCE'}, $m->{'TITLE'}); - unless($getter->get($m)) { - write_irssi('%%R>>> FAILED'); - } - } elsif ('display' eq ($conf->{'videosite'}->{'mode'})) { - write_irssi('%%M>>> %%NSaw %%Y%s%%N %%G%s', $m->{'SOURCE'}, $m->{'TITLE'}); - } else { - write_irssi('%%R>>> Invalid operation mode'); - } - - # Remove the matched part from the message and try again (there may be - # more!) - $message =~ s/$p//; - study($message); - last GRABBER if ($message =~ /^\s*$/); - - ($m, $p) = $g->get($message); - } - } - - pop_output(); -} - -sub cmd_save { - - eval { - my ($tempfile, $tempfn) = tempfile("videosite.json.XXXXXX", dir => Irssi::get_irssi_dir()); - print $tempfile JSON->new->pretty->utf8->encode($conf); - close($tempfile); - rename($tempfn, $conffile); - }; - if ($@) { - write_irssi('Could not save config to %s: %s', ($conffile, $@)); - } else { - write_irssi('configuration saved to %s', $conffile); - } -} - -sub cmd_set { - my $target = shift; - my $key = shift; - my $val = shift; - my $p; - - foreach $p (@getters, @grabbers) { - if ($p->{'NAME'} eq $target) { - $p->setval($key, $val); - return; - } - } - write_irssi('No such module'); -} - - -sub cmd_enable { - my $target = shift; - my $p; - - foreach $p (@grabbers) { - if ($p->{'NAME'} eq $target) { - $p->enable(); - return; - } - } - write_irssi('No such module'); -} - - -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] "); - 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 { - 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(); - 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(); -} - -# ================================= -# Reworked code below this line -# ================================= # # Initialize the config subsystem. Called by the core.