X-Git-Url: https://git.camperquake.de/gitweb.cgi?p=xmlrtorrent.git;a=blobdiff_plain;f=xmlrtorrent.pl;h=3e13500abb79e3b3b27c9088dd02778c7c259bd5;hp=d3e4f81463b700dcd724673382b592090f5f96de;hb=fe5880e8642621d70d46f142378054d06f031f3e;hpb=a0d7b7dea026944eb3671eebfbc078474598cbf0 diff --git a/xmlrtorrent.pl b/xmlrtorrent.pl index d3e4f81..3e13500 100644 --- a/xmlrtorrent.pl +++ b/xmlrtorrent.pl @@ -13,9 +13,12 @@ use File::Spec; use List::Util qw(max); use xmlrtorrent; +my @talkers; +my $talker; my $conf; my $conffile = File::Spec->catfile(Irssi::get_irssi_dir(), 'xmlrtorrent.xml'); my $scriptdir = File::Spec->catfile(Irssi::get_irssi_dir(), 'scripts'); +my $plugindir = File::Spec->catfile($scriptdir, 'xmlrtorrent'); my %torrentlist = (); my $torrentindex = 1; my $rtorrent; @@ -30,7 +33,7 @@ my $PARAMS = { }; # activate debug here -my $debug = 0; +my $debug = 1; # "message public", SERVER_REC, char *msg, char *nick, char *address, char *target signal_add_last("message public" => sub {check_for_link(\@_,1,4,2,0);}); @@ -75,6 +78,10 @@ my $xmlrtorrent_commands = { cmd_remote(@_); }, + 'talker' => sub { + cmd_talker(@_); + }, + 'debug' => sub { $debug = 1; write_irssi('Enabled debugging'); @@ -202,7 +209,7 @@ sub cmd_queue { $u = $torrentlist{$id}->{'URL'}; write_debug('Sending %s to rtorrent', $u); - unless(defined($rtorrent->load_start($u))) { + unless(defined($rtorrent->load_start($talker, $u))) { write_irssi('%%RError sending URL %s: %s', $u, $rtorrent->errstr()); } else { write_irssi('%s enqueued', $u); @@ -237,7 +244,7 @@ sub cmd_remote { my $rqueue; if (('list' eq $subcmd) or !defined($subcmd)) { - unless(defined($rqueue = $rtorrent->download_list())) { + unless(defined($rqueue = $rtorrent->download_list($talker))) { write_irssi('Error getting list of downloads: %s', $rtorrent->errstr()); return; } @@ -286,45 +293,83 @@ sub cmd_set { my $target = shift; my $key = shift; my $val = shift; + my $p; - if ('global' eq $target) { - if(exists($PARAMS->{$key})) { - $conf->{'xmlrtorrent'}->{$key} = $val; - if ('XMLURL' eq $key) { - unless(defined($rtorrent = xmlrtorrent->new( - 'XMLURL' => $conf->{'xmlrtorrent'}->{'XMLURL'}, - 'USERNAME' => $conf->{'xmlrtorrent'}->{'USERNAME'}, - 'USERNAME' => $conf->{'xmlrtorrent'}->{'PASSWORD'}))) { - write_irssi('Could not initialize XMLRPC instance'); - return; - } - } - } else { - write_irssi('Key %s does not exist', $key); + foreach $p (@talkers) { + if ($p->{'NAME'} eq $target) { + $p->setval($key, $val); + return; } } + write_irssi(undef, 'No such module'); } - sub cmd_show { my $target = shift; my $p; my $e; + + if (defined($target)) { + foreach $p (@talkers) { + if ($p->{'NAME'} eq $target) { + write_irssi($p->getconfstr()); + return; + } + } + write_irssi('No such module'); + } else { + write_irssi('Loaded talkers:'); + foreach $p (@talkers) { + write_irssi(' %s', $p->{'NAME'}); + }; + } } sub cmd_help { my $target = shift; my $p; - write_irssi(<<'EOT'); + if (defined($target)) { + foreach $p (@talkers) { + 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: Display this help + 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 + talker [modulename]: display or set the talker to use debug: enable debugging messages nodebug: disable debugging messages EOT +; + } } +sub cmd_talker { + my $target = shift; + my $p; + + if (defined($target)) { + foreach $p (@talkers) { + if (($p->{'NAME'} eq $target) && ($p->{'TYPE'} eq 'talker')) { + $talker = $p; + $conf->{'videosite'}->{'talker'} = $target; + return; + } + } + write_irssi('No such talker'); + } else { + write_irssi('Current talker: %s', $conf->{'videosite'}->{'talker'}); + } +} + + # save on unload sub sig_command_script_unload { @@ -334,6 +379,64 @@ sub sig_command_script_unload { } } +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 %s:', $p); + $p =~ s/\.pm$//; + eval qq{ require xmlrtorrent::$p; }; + if ($@) { + write_irssi('Failed to load plugin: %s', "$@"); + next; + } + + $g = eval qq{ xmlrtorrent::$p->new(); }; + if ($@) { + write_irssi('Failed to instanciate: %s', "$@"); + delete($INC{$p}); + next; + } + + write_debug('found %s %s', $g->{'TYPE'}, $g->{'NAME'}); + if ($type eq $g->{'TYPE'}) { + push(@g, $g); + $g->setio(sub {Irssi::print(shift)}); + } 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{$_}); + } + } + @talkers = ploader($path, '.*Talker\.pm$', 'talker'); +} + sub init_xmlrtorrent { my $bindings = shift; @@ -350,15 +453,29 @@ sub init_xmlrtorrent { } } + _load_modules($plugindir); + + unless (defined(@talkers)) { + write_irssi('No talkers found, can not proceed.'); + return; + } + + $talker = $talkers[0]; + foreach $p (@talkers) { + if ($conf->{'xmlrtorrent'}->{'talker'} eq $p->{'NAME'}) { + $talker = $p; + } + } + write_debug(undef, 'Selected %s as talker', $talker->{'NAME'}); + $conf->{'videosite'}->{'talker'} = $talker->{'NAME'}; + + # Restore the queue %torrentlist = %{$conf->{'xmlrtorrent'}->{'_QUEUE'}}; %torrentlist = map { my $a = substr($_, 1); ("$a" => $torrentlist{$_}) } keys(%torrentlist); $torrentindex = max(keys(%torrentlist)) + 1; - unless(defined($rtorrent = xmlrtorrent->new( - 'XMLURL' => $conf->{'xmlrtorrent'}->{'XMLURL'}, - 'USERNAME' => $conf->{'xmlrtorrent'}->{'USERNAME'}, - 'USERNAME' => $conf->{'xmlrtorrent'}->{'PASSWORD'}))) { + unless(defined($rtorrent = xmlrtorrent->new())) { write_irssi('Could not initialize XMLRPC instance'); return; }