html/chansearch.pl


   1 #!/usr/bin/perl
   2 #
   3 # by Stefan 'tommie' Tomanek <stefan@pico.ruhr.de>
   4 
   5 use strict;
   6 
   7 use vars qw($VERSION %IRSSI);
   8 $VERSION = '20021019';
   9 %IRSSI = (
  10     authors     => 'Stefan \'tommie\' Tomanek',
  11     contact     => 'stefan@pico.ruhr.de',
  12     name        => 'ChanSearch',
  13     description => 'searches for specific channels',
  14     license     => 'GPLv2',
  15     url         => 'http://scripts.irssi.org/',
  16     changed     => $VERSION,
  17     modules     => 'Data::Dumper LWP::UserAgent POSIX',
  18 );
  19 
  20 use Irssi 20020324;
  21 use LWP::UserAgent;
  22 use Data::Dumper;
  23 use POSIX;
  24 
  25 use vars qw($forked);
  26 
  27 $forked = 0;
  28 
  29 sub draw_box ($$$$) {
  30     my ($title, $text, $footer, $colour) = @_;
  31     my $box = '';
  32     $box .= '%R,--[%n%9%U'.$title.'%U%9%R]%n'."\n";
  33     foreach (split(/\n/, $text)) {
  34         $box .= '%R|%n '.$_."\n";
  35     }
  36     $box .= '%R`--<%n'.$footer.'%R>->%n';
  37     $box =~ s/%.//g unless $colour;
  38     return $box;
  39 }
  40 
  41 sub fork_search ($) {
  42     my ($query) = @_;
  43     my ($rh, $wh);
  44     pipe($rh, $wh);
  45     return if $forked;
  46     my $pid = fork();
  47     $forked = 1;
  48     if ($pid > 0) {
  49 	close($wh);
  50 	Irssi::pidwait_add($pid);
  51 	my $pipetag;
  52 	my @args = ($rh, \$pipetag);
  53 	$pipetag = Irssi::input_add(fileno($rh), INPUT_READ, \&pipe_input, \@args);
  54 	print CLIENTCRAP "%R>>%n Please wait...";
  55     } else {
  56 	my %result;
  57 	$result{query} = $query;
  58 	$result{result} = search_channels($query);
  59 	my $dumper = Data::Dumper->new([\%result]);
  60 	$dumper->Purity(1)->Deepcopy(1);
  61 	my $data = $dumper->Dump;
  62 	print($wh $data);
  63 	close($wh);
  64 	POSIX::_exit(1);
  65    }
  66 }
  67 
  68 sub pipe_input ($$) {
  69     my ($rh, $pipetag) = @{$_[0]};
  70     my $data;
  71     $data .= $_ foreach (<$rh>);
  72     close($rh);
  73     Irssi::input_remove($$pipetag);
  74     return unless($data);
  75     no strict;
  76     my %result = %{ eval "$data" };
  77     my $text;
  78     foreach (sort keys %{ $result{result} }) {
  79         $text .= '%9'.$_.'%9, '.$result{result}{$_}->{nicks}." nicks\n";
  80         $text .= '   "'.$result{result}{$_}->{topic}.'"'."\n" if $result{result}{$_}->{topic};
  81     }
  82     $forked = 0;
  83     print CLIENTCRAP draw_box('ChanSearch', $text, $result{query}, 1);
  84 }
  85 
  86 sub search_channels ($) {
  87     my ($query) = @_;
  88     my $ua = LWP::UserAgent->new(env_proxy => 1,keep_alive => 1,timeout => 30);
  89     $ua->agent('Irssi Chansearch');
  90     my $page = 'http://www.ludd.luth.se/irc/bin/csearch.cgi';
  91     my %form = ( topic => "channels",
  92                  hits => "all",
  93                  min  => 2,
  94 		 max  => "infinite",
  95 		 sort => "in alphabetic order.",
  96 		 pattern => $query
  97 		);
  98     my $result = $ua->post($page, \%form);
  99     return undef unless $result->is_success();
 100     my %channels;
 101     foreach ( split(/\n/, $result->content()) ) {
 102 	if (/^<LI><STRONG>(.*?)<\/STRONG> <I>(\d+)<\/I><BR>(.*).$/) {
 103 	    $channels{$1} = { topic => $3, nicks => $2 };
 104 	}
 105     }
 106     return \%channels;
 107 }
 108 
 109 sub cmd_chansearch ($$$) {
 110     my ($args, $server, $witem) = @_;
 111     fork_search($args);
 112 }
 113 
 114 Irssi::command_bind('chansearch', \&cmd_chansearch);
 115 
 116 print CLIENTCRAP '%B>>%n '.$IRSSI{name}.' '.$VERSION.' loaded';