X-Git-Url: https://git.camperquake.de/gitweb.cgi?p=xmlrtorrent.git;a=blobdiff_plain;f=xmlrtorrent.pl;h=fae32f70fa8507027a561e1d09aa3dafce711c8a;hp=c2d823c5ee343f64cdcd32148bf69f47d1293628;hb=HEAD;hpb=6f01f49f67344b3315da3eae52dabf30dee6ea26 diff --git a/xmlrtorrent.pl b/xmlrtorrent.pl index c2d823c..fae32f7 100644 --- a/xmlrtorrent.pl +++ b/xmlrtorrent.pl @@ -11,7 +11,6 @@ use XML::Simple; use Data::Dumper; use File::Spec; use List::Util qw(max); -use xmlrtorrent; my @talkers; my $talker; @@ -21,16 +20,23 @@ my $scriptdir = File::Spec->catfile(Irssi::get_irssi_dir(), 'scripts'); my $plugindir = File::Spec->catfile($scriptdir, 'xmlrtorrent'); my %torrentlist = (); my $torrentindex = 1; -my $rtorrent; my @outputstack = (undef); my $PARAMS = { '_QUEUE' => {}, + '_AUTOSAVE' => 1, }; +# Handle module unload/irssi shutdown +sub UNLOAD { + if ($conf->{'xmlrtorrent'}->{'_AUTOSAVE'}) { + cmd_save(); + } +} + # activate debug here -my $debug = 1; +my $debug = 0; # "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);}); @@ -88,8 +94,45 @@ my $xmlrtorrent_commands = { $debug = 0; write_irssi('Disabled debugging'); }, + + 'autosave' => sub { + $conf->{'xmlrtorrent'}->{'_AUTOSAVE'} = 1; + write_irssi('Autosave enabled'); + }, + + 'noautosave' => sub { + $conf->{'xmlrtorrent'}->{'_AUTOSAVE'} = 0; + write_irssi('Autosave disabled'); + }, }; +# This is shamelessly stolen from pythons urlgrabber +sub format_number { + my $number = shift; + my $SI = shift || 0; + my @symbols = ('', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'); + my $step = $SI?1000:1024; + my $thresh = 999; + my $depth = 0; + my $max_depth = $#symbols; + my $format; + + while (($number > $thresh) and ($depth < $max_depth)) { + $depth += 1; + $number /= $step; + } + + if ($number =~ /^[+-]?\d+$/) { + # Integer. + $format = '%i%s'; + } elsif ($number < 9.95) { + $format = '%.1f%s'; + } else { + $format = '%.0f%s'; + } + return sprintf($format, $number, $symbols[$depth]); +} + sub write_irssi { my @text = @_; my $output = $outputstack[0]; @@ -171,8 +214,8 @@ sub cmd_queue { $u = $torrentlist{$id}->{'URL'}; write_debug('Sending %s to rtorrent', $u); - unless(defined($rtorrent->load_start($talker, $u))) { - write_irssi('%%RError sending URL %s: %s', $u, $rtorrent->errstr()); + unless(defined($talker->load_start($u))) { + write_irssi('%%RError sending URL %s: %s', $u, $talker->errstr()); } else { write_irssi('%s enqueued', $u); delete($torrentlist{$id}); @@ -206,8 +249,8 @@ sub cmd_remote { my $rqueue; if (('list' eq $subcmd) or !defined($subcmd)) { - unless(defined($rqueue = $rtorrent->download_list($talker))) { - write_irssi('Error getting list of downloads: %s', $rtorrent->errstr()); + unless(defined($rqueue = $talker->download_list())) { + write_irssi('Error getting list of downloads: %s', $talker->errstr()); return; } @@ -217,12 +260,13 @@ sub cmd_remote { } else { foreach (@{$rqueue}) { write_irssi(' %s%s: %sB/%sB done (%d%%), %sB/s up, %sB/s down', - $_->{'ACTIVE'}?'*':' ', - $_->{'NAME'}, - $_->{'BYTES_DONE'}, - $_->{'SIZE_BYTES'}, - $_->{'UP_RATE'}, - $_->{'DOWN_RATE'}); + $_->{'ACTIVE'}?'*':' ', + $_->{'NAME'}, + format_number($_->{'BYTES_DONE'}), + format_number($_->{'SIZE_BYTES'}), + $_->{'BYTES_DONE'}*100/$_->{'SIZE_BYTES'}, + format_number($_->{'UP_RATE'}), + format_number($_->{'DOWN_RATE'})); } } } @@ -262,7 +306,7 @@ sub cmd_set { return; } } - write_irssi(undef, 'No such module'); + write_irssi('No such module'); } sub cmd_show { @@ -320,13 +364,13 @@ sub cmd_talker { foreach $p (@talkers) { if (($p->{'NAME'} eq $target) && ($p->{'TYPE'} eq 'talker')) { $talker = $p; - $conf->{'videosite'}->{'talker'} = $target; + $conf->{'xmlrtorrent'}->{'talker'} = $target; return; } } write_irssi('No such talker'); } else { - write_irssi('Current talker: %s', $conf->{'videosite'}->{'talker'}); + write_irssi('Current talker: %s', $conf->{'xmlrtorrent'}->{'talker'}); } } @@ -427,20 +471,19 @@ sub init_xmlrtorrent { $talker = $p; } } - write_debug(undef, 'Selected %s as talker', $talker->{'NAME'}); - $conf->{'videosite'}->{'talker'} = $talker->{'NAME'}; + write_debug('Selected %s as talker', $talker->{'NAME'}); + $conf->{'xmlrtorrent'}->{'talker'} = $talker->{'NAME'}; + # Loop through all plugins and load the config + foreach $p (@talkers) { + $conf->{'xmlrtorrent'}->{'config'}->{$p->{'NAME'}} = $p->mergeconfig($conf->{'xmlrtorrent'}->{'config'}->{$p->{'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())) { - write_irssi('Could not initialize XMLRPC instance'); - return; - } - if ($bindings) { Irssi::signal_add_first('command script load', 'sig_command_script_unload');