html/scriptinfo.pl


   1 use strict;
   2 use vars qw($VERSION %IRSSI);
   3 
   4 # This script assumes all windows have the same width, which will
   5 # practically always be true.
   6 
   7 use Irssi qw(active_win command_bind);
   8 $VERSION = '1.20';
   9 %IRSSI = (
  10     authors	=> 'Juerd',
  11     contact	=> 'juerd@juerd.nl',
  12     name	=> 'Script Information',
  13     description	=> 'Access script information',
  14     license	=> 'Public Domain',
  15     url		=> 'http://juerd.nl/irssi/',
  16     changed	=> 'Tue Mar 19 11:00 CET 2002',
  17 );
  18 
  19 sub iprint {
  20     Irssi::print(join('', @_), MSGLEVEL_CRAP);
  21 }
  22 
  23 command_bind 'script info' => sub {
  24     my ($data, $server) = @_;
  25     if ($data !~ /\S/) {
  26         iprint 'Usage: /script info <scriptname>';
  27         return;    
  28     }
  29 
  30     no strict 'refs';
  31     iprint "\c_== Script info for $data ==";
  32 
  33     if (not exists $Irssi::Script::{ "${data}::" }) {
  34         iprint 'Script is not loaded.';
  35         return;
  36     }
  37 	
  38     my %info = %{ "Irssi::Script::${data}::IRSSI" };
  39     $info{version} = ${ "Irssi::Script::${data}::VERSION" };
  40 	
  41     if (join('', values %info) eq '') {
  42 	iprint 'Script has no $VERSION and no %IRSSI. ',
  43 	       'Please ask the author to read ',
  44 	       'http://juerd.nl/irssi/proposal.txt';
  45 
  46 	return;
  47     }
  48     my $max = 0;
  49     length > $max and $max = length for keys %info;
  50     my $width = active_win->{width} - 14 - $max;
  51     s/([^\n]{$width})/$1\n/g      for values %info;
  52     s/(?<=\n)/' ' x ($max + 2)/eg for values %info;
  53     for (qw/name version description authors contact/) {
  54         if (exists $info{$_}) {
  55     	    iprint"\cC5$_\cC", ' ' x (2 + $max - length $_), $info{$_};
  56     	    delete $info{$_};
  57         }
  58     }
  59     for (sort keys %info) {
  60         iprint "\cC5$_\cC", ' ' x (2 + $max - length $_), $info{$_};
  61     }
  62 };
  63 
  64 command_bind 'script sv' => sub {
  65     my ($data, $server) = @_;
  66     if ($data !~ /\S/) {
  67 	iprint 'Usage: /script sv <scriptname>';
  68         return;
  69     }
  70 
  71     no strict 'refs';
  72     if (not exists $Irssi::Script::{ "${data}::" }) {
  73         iprint 'Module is not loaded.';
  74         return;
  75     }
  76 
  77     my $name    = ${ "Irssi::Script::${data}::IRSSI" }{name};
  78     my $url     = ${ "Irssi::Script::${data}::IRSSI" }{url};
  79     my $version = ${ "Irssi::Script::${data}::VERSION" };
  80 
  81     my $text = "$name $version";
  82     $text .= " - $url" if $url;
  83 
  84     if ($text !~ /\S/) {
  85         iprint 'Script has no information.';
  86         return;
  87     }
  88 
  89     active_win->command("say $text");
  90 };
  91 
  92 command_bind 'script versions' => sub {
  93     # Actually, upgrading them would be quite easy :)
  94     # Update: Actually, it's possible now! use scriptadmin.pl :)
  95     my ($data, $server) = @_;
  96 
  97     no strict 'refs';
  98     my @modules;
  99     for (sort grep s/::$//, keys %Irssi::Script::) {
 100         my $name    = ${ "Irssi::Script::${_}::IRSSI" }{name};
 101 	my $version = ${ "Irssi::Script::${_}::VERSION" };
 102 	push @modules, [$_, $name, $version] if $name && $version;
 103     }
 104     my @max;
 105     for (@modules) {
 106 	my $i = -1;;
 107 	length > $max[++$i] and $max[$i] = length for @$_; 
 108     }
 109     my $i;
 110     my $text = join "\n", map {
 111         $i = 0 ||
 112         join ' ', map {
 113 	    $_ . ' ' x ($max[$i++] - length)
 114 	} @$_
 115     } @modules;
 116     iprint $text;
 117 };    
 118