diff options
Diffstat (limited to 'scripts/google.pl')
-rw-r--r-- | scripts/google.pl | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/scripts/google.pl b/scripts/google.pl new file mode 100644 index 0000000..84de848 --- /dev/null +++ b/scripts/google.pl @@ -0,0 +1,224 @@ +# - Google.pl +use Irssi; +use Getopt::Long qw/GetOptionsFromString/; +use IPC::Open3; +use JSON::PP; +use strict; +use vars qw($VERSION %IRSSI); + +$VERSION = '2.01'; +%IRSSI = ( + authors => 'bw1', + contact => 'bw1@aol.at', + name => 'google', + description => 'This script queries google.com with googler and returns the results.', + license => 'Public Domain', + url => 'https://scripts.irssi.org/', + modules => '', + commands=> 'google', + selfcheckcmd=> 'google -check', +); + +my $help = << "END"; +%9Name%9 + $IRSSI{name} +%9Version%9 + $VERSION +%9Usage%9 + /google [-N|-news] [-x|-exact] [-c|-tld TLD] [-l|-lang LANG] + [-n|-count N] [-s|-start] <KEYWORD> + /google {-h|-help} + /google {-p|-say N} + /google -check +%9Description%9 + $IRSSI{description} + first author: Oddbjørn Kvalsund +%9Arguments%9 + -N|-news show results from news section + -x|-exact disable automatic spelling correction + -c|-tld country-specific search with top-level domain + -l|-lang display in language LANG + -n|-count show N results (default 10) + -s|-start start at the Nth result + -h|-help show this help message + -p|-say say the N url in channel + -check self check +%9See also%9 + https://github.com/jarun/googler +END + +my ($copt, $tld, $lang, $count, $start, $chelp, $say, $check); +my %options = ( + 'N'=> sub {$copt .= '--news '}, + 'news'=> sub {$copt .= '--news '}, + 'x'=> sub {$copt .= '--exact '}, + 'exact'=> sub {$copt .= '--exact '}, + 'c=s'=> \$tld, + 'tld=s'=> \$tld, + 'l=s'=> \$lang, + 'lang=s'=> \$lang, + 'n=o' => \$count, + 'count=o' => \$count, + 's=o' => \$start, + 'start=o' => \$start, + 'h' => \$chelp, + 'help' => \$chelp, + 'p=o' => \$say, + 'say=o' => \$say, + 'check' => \$check, +); + +## Usage: +## /google [-p, prints to current window] [-<number>, number of searchresults returned] search-criteria1 search-criteria2 ... +## +## History: +## - Sun May 19 2002 +## Version 0.1 - Initial release +## - 2019-08-04 +## Version 2.0 - Change to googler +## - 2021-01-26 +## Version 2.01 - self check +## ------------------------------- + +my (%readex, $instr, $errstr, @res); + +sub read_exec { + my ($cmd, $rfunc) = @_; + + my ($in, $out, $err); + use Symbol 'gensym'; $err = gensym; + my $pid = open3($in, $out, $err, $cmd); + $readex{$pid}->{pid}=$pid; + $readex{$pid}->{cmd}=$cmd; + $readex{$pid}->{in}=$in; + $readex{$pid}->{out}=$out; + $readex{$pid}->{err}=$err; + $readex{$pid}->{rfunc}=$rfunc; + + Irssi::pidwait_add($pid); +} + +sub sig_read_exec { + my ($pid, $status) = @_; + + if (defined $readex{$pid} ) { + my $out =$readex{$pid}->{out}; + my $err =$readex{$pid}->{err}; + my $rfunc =$readex{$pid}->{rfunc}; + + delete $readex{$pid}; + + my $old = select $out; + local $/; + $instr = <$out>; + select $old; + + my $old = select $err; + local $/; + $errstr = <$err>; + $errstr =~ s/[\n\r]//g; + select $old; + + &$rfunc() if (defined $rfunc); + if ( scalar(keys(%readex)) == 1 && + exists $readex{job}) { + foreach my $j ( @{$readex{job}} ) { + if ( ref( $j) eq 'CODE' ) { + &$j(); + } else { + eval( $j ); + } + } + delete $readex{job}; + } + Irssi::signal_stop(); + } +} + +sub cmd { + my ($args, $server, $witem)=@_; + Getopt::Long::Configure('no_ignore_case'); + my ($ret, $arg) = GetOptionsFromString($args, %options); + if ($ret) { + if (defined $chelp) { + cmd_help($IRSSI{name}, $server, $witem); + } elsif (defined $say) { + if ($say >0 && $say <= scalar(@res)) { + Irssi::active_win()->command("say $res[$say-1]->{url}"); + } + } else { + my $cmd="googler --json "; + $cmd .="--tld $tld " if (defined $tld); + $cmd .="--lang $lang " if (defined $lang); + $cmd .="--count $count " if (defined $count); + $cmd .="--start $start " if (defined $start); + $cmd .="irssi " if (defined $check); + $cmd .="$copt " if (defined $copt); + $cmd .=join(" ",@{$arg}); + Irssi::print(">$cmd<", MSGLEVEL_CLIENTCRAP); + read_exec($cmd ,\&print_all); + } + } + $copt=undef; + $tld=undef; + $lang=undef; + $count=undef; + $start=undef; + $chelp=undef; + $say=undef; +} + +sub self_check { + my @r =@_; + my $s="ok"; + $check=undef; + Irssi::print("Selfcheck: results: ".scalar @r); + Irssi::print("Selfcheck: url: ".$r[0]->{url}); + Irssi::print("Selfcheck: title: ".$r[0]->{title}); + if ( scalar(@r) < 6 ) { + $s="Error: results (".scalar @r.")"; + } elsif ( $r[0]->{url} !~ m/^http/ ) { + $s="Error: url (".$r[0]->{url}.")"; + } elsif ( length($r[0]->{title}) < 4) { + $s="Error: title (".$r[0]->{title}.")"; + } + Irssi::print("Selfcheck: $s"); + my $schs_version = $Irssi::Script::selfcheckhelperscript::VERSION; + Irssi::command("selfcheckhelperscript $s") if ( defined $schs_version ); +} + +sub print_all { + if( length($errstr) <1 ) { + @res= @{decode_json($instr)}; + self_check(@res) if (defined $check); + Irssi::print("/---- google ----", MSGLEVEL_CLIENTCRAP); + my $c=1; + foreach my $r (@res) { + my $s= sprintf("| %3d ",$c) . $r->{title}; + Irssi::print($s, MSGLEVEL_CLIENTCRAP); + $s="| ". $r->{url}; + Irssi::print($s, MSGLEVEL_CLIENTCRAP); + $c++; + } + Irssi::print('\---- google ----', MSGLEVEL_CLIENTCRAP); + } else { + Irssi::print($errstr, MSGLEVEL_CLIENTCRAP); + } +} + +sub cmd_help { + my ($args, $server, $witem)=@_; + $args=~ s/\s+//g; + if ($IRSSI{name} eq $args) { + Irssi::print($help, MSGLEVEL_CLIENTCRAP); + Irssi::signal_stop(); + } +} + +$ENV{PYTHONIOENCODING}='utf8'; +Irssi::signal_add('pidwait', 'sig_read_exec'); + +Irssi::command_bind('google', 'cmd'); +my @opt=map {$_ =~ s/=.*$//, $_ } keys %options; +Irssi::command_set_options($IRSSI{name}, join(" ", @opt)); +Irssi::command_bind('help', \&cmd_help); |