#!/usr/bin/perl $VERSION = "0.05"; %IRSSI = ( authors => "Alexander Schier & Robert Weidlich", contact => "", name => "YaCy Script", description => "A script to monitor and control YaCy", license => "GPL", url => "http://www.yacy-websuche.de", changed => "Wed Apr 05 2006" ); #use Irssi; use strict; use XML::Simple; use LWP::Simple; use Data::Dumper; use vars qw($VERSION %IRSSI); my $help = "/yacy show ppm|peer|version|network\n". " set host|port|user|pass value\n". " get host|port|user|pass\n". " help"; our %cmds = ( show => ["ppm","peer","version","network", "stats"], set => ["user","pass","host","port"], help => [] ); my $prog; if ( defined(&Xchat::print) ) { $prog = "xchat"; Xchat::register($IRSSI{'name'},$VERSION,$IRSSI{'description'}); } elsif ( defined(&Irssi::print) ) { $prog = "irssi"; } sub setting_init() { if ($prog eq "irssi") { Irssi::settings_add_str("yacy_script.pl", "yacy_host", "localhost"); Irssi::settings_add_int("yacy_script.pl", "yacy_port", 8080); Irssi::settings_add_str("yacy_script.pl", "yacy_user", "admin"); Irssi::settings_add_str("yacy_script.pl", "yacy_pass", ""); Irssi::settings_add_int("yacy_script.pl", "yacy_statusbarupdate_interval", 60); } elsif ($prog eq "xchat") { if ( ! -e Xchat::get_info('xchatdir')."/yacy.xml" ) { my $data = { host => "localhost", port => "8080", user => "admin", pass => "" }; XMLout($data, NoAttr => 1, OutputFile => Xchat::get_info('xchatdir')."/yacy.xml"); } } } sub setting_set($$) { if ($prog eq "xchat") { my $data = XMLin(Xchat::get_info('xchatdir')."/yacy.xml"); $data->{$_[0]} = $_[1]; open my $fh, '>', Xchat::get_info('xchatdir')."/yacy.xml"; XMLout($data, NoAttr => 1, OutputFile => $fh); close $fh; } elsif ($prog eq "irssi") { Irssi::settings_set_str("yacy_".$_[0],$_[1]); } } sub setting_get($) { if ($prog eq "xchat") { my $data = XMLin(Xchat::get_info('xchatdir')."/yacy.xml"); return $data->{$_[0]}; } elsif ($prog eq "irssi") { return Irssi::settings_get_str("yacy_".$_[0]); } } sub get_network { my $host = setting_get("host"); my $port = setting_get("port"); my $user = setting_get("user"); my $pass = setting_get("pass"); my $doc=get('http://'.$user.':'.$pass.'@'.$host.':'.$port.'/Network.xml'); if($doc){ return XMLin($doc); } return 0; } sub yacy($$$) { my ($cmd, $arg, $arg2, $prnt, $output); if ($prog eq "irssi") { ($cmd,$arg,$arg2)=split / /, shift; } elsif ($prog eq "xchat") { $cmd = $_[0][1]; $arg = $_[0][2]; $arg2 = $_[0][3]; } if ($cmd eq "show") { my $data=get_network(); if ( ! $data ) { $prnt = "Peer is not running."; } else { if ($arg eq "ppm") { $output = "is now crawling with YaCy at $data->{'your'}->{'ppm'} pages per minute."; } elsif ($arg eq "peer") { $output = "operates the $data->{'your'}->{'type'} YaCy peer $data->{'your'}->{'name'}, which is running $data->{'your'}->{'uptime'}"; } elsif ($arg eq "version") { $output = "uses YaCy version $data->{'your'}->{'version'}"; } elsif ($arg eq "network") { $output = "'s peer currently knows $data->{'active'}->{'count'} senior and $data->{'potential'}->{'count'} junior peers"; } elsif ($arg eq "stats") { $output = "'s peer stores $data->{'your'}->{'links'} links and $data->{'your'}->{'words'} words"; } else { $prnt="Unknown argument: \"$arg\"\n$help"; } } } elsif ($cmd eq "set") { if ($arg) { if ($arg2) { setting_set($arg,$arg2); } else { $prnt = "$arg is currently set to \"".setting_get($arg)."\""; } } else { $prnt = "Argument required\n$help"; } } elsif ($cmd eq "help") { $prnt=$help; } else { $prnt="Unknown command: \"$cmd\"\n$help"; } if ( $prog eq "irssi" ) { Irssi::active_win->command("/me $output") if ($output); Irssi::active_win->print($prnt) if ($prnt); } elsif ( $prog eq "xchat" ) { Xchat::print($prnt) if ($prnt); Xchat::command("me $output") if ($output); return 3; } } sub cmd_help() { my ($arg) = @_; if ( $arg =~ /(yacy)/ ) { Irssi::print($help); Irssi::signal_stop(); } } sub signal_complete_word { my ($list, $window, $word, $linestart, $want_space) = @_; if($linestart =~ /\/yacy/){ Irssi::signal_stop(); my @words=split(/ /, $linestart); if(@words == 1){ my @cmds2=keys(%cmds); foreach (@cmds2){ if($_ =~/^$word/i){ push(@$list, $_); } } }elsif(@words == 2){ my @cmds2=$cmds{@words[1]}; for my $i (0 .. $#{$cmds2[0]} ) { if($cmds2[0][$i] =~/^$word/i){ push(@$list, $cmds2[0][$i]); } } } } } # this is a irssi only section # my ($irssi_links, $irssi_words, $irssi_ppm)=(0,0,0);; sub irssi_init_statusbar { my $updateinterval = setting_get("statusbarupdate_interval"); #XXX: this does not work, if the option isn't set manually?! if( $updateinterval > 0 && get_network()){ #only, if Network.xml can be loaded and the interval is not zero Irssi::statusbar_item_register("yacyLinks", undef, "irssi_statusbar_yacyLinks"); Irssi::statusbar_item_register("yacyWords", undef, "irssi_statusbar_yacyWords"); Irssi::statusbar_item_register("yacyPPM", undef, "irssi_statusbar_yacyPPM"); Irssi::timeout_add($updateinterval * 1000, "irssi_update_statusbar", undef); irssi_update_statusbar(); #initial update #TODO: Some way to add this to the statusbar (or create a own one), without #beeing obstrusive. } } sub irssi_update_statusbar { $data=get_network(); if($data){ $irssi_links=$data->{'your'}->{'links'}; Irssi::statusbar_items_redraw('yacyLinks'); $irssi_words=$data->{'your'}->{'words'}; Irssi::statusbar_items_redraw('yacyWords'); $irssi_ppm=$data->{'your'}->{'ppm'}; Irssi::statusbar_items_redraw('yacyPPM'); } } # redraw handlers # sub irssi_statusbar_yacyLinks { my ($item, $get_size_only) = @_; $item->default_handler($get_size_only, " ".$irssi_links, undef, 1); } sub irssi_statusbar_yacyWords { my ($item, $get_size_only) = @_; $item->default_handler($get_size_only, " ".$irssi_words, undef, 1); } sub irssi_statusbar_yacyPPM { my ($item, $get_size_only) = @_; $item->default_handler($get_size_only, " ".$irssi_ppm, undef, 1); } # end irssi only # setting_init(); if ( $prog eq "irssi" ) { Irssi::command_bind("help","cmd_help", "Irssi commands"); Irssi::command_bind('yacy', \&yacy); Irssi::signal_add('complete word', 'signal_complete_word'); #irssi only irssi_init_statusbar(); } elsif ( $prog eq "xchat") { Xchat::hook_command("yacy","yacy",{help_text => $help}); }