summaryrefslogtreecommitdiffstats
path: root/scripts/chansearch.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/chansearch.pl')
-rw-r--r--scripts/chansearch.pl116
1 files changed, 116 insertions, 0 deletions
diff --git a/scripts/chansearch.pl b/scripts/chansearch.pl
new file mode 100644
index 0000000..20b6d9f
--- /dev/null
+++ b/scripts/chansearch.pl
@@ -0,0 +1,116 @@
+#!/usr/bin/perl
+#
+# by Stefan 'tommie' Tomanek <stefan@pico.ruhr.de>
+
+use strict;
+
+use vars qw($VERSION %IRSSI);
+$VERSION = '20021019';
+%IRSSI = (
+ authors => 'Stefan \'tommie\' Tomanek',
+ contact => 'stefan@pico.ruhr.de',
+ name => 'ChanSearch',
+ description => 'searches for specific channels',
+ license => 'GPLv2',
+ url => 'http://scripts.irssi.org/',
+ changed => $VERSION,
+ modules => 'Data::Dumper LWP::UserAgent POSIX',
+);
+
+use Irssi 20020324;
+use LWP::UserAgent;
+use Data::Dumper;
+use POSIX;
+
+use vars qw($forked);
+
+$forked = 0;
+
+sub draw_box ($$$$) {
+ my ($title, $text, $footer, $colour) = @_;
+ my $box = '';
+ $box .= '%R,--[%n%9%U'.$title.'%U%9%R]%n'."\n";
+ foreach (split(/\n/, $text)) {
+ $box .= '%R|%n '.$_."\n";
+ }
+ $box .= '%R`--<%n'.$footer.'%R>->%n';
+ $box =~ s/%.//g unless $colour;
+ return $box;
+}
+
+sub fork_search ($) {
+ my ($query) = @_;
+ my ($rh, $wh);
+ pipe($rh, $wh);
+ return if $forked;
+ my $pid = fork();
+ $forked = 1;
+ if ($pid > 0) {
+ close($wh);
+ Irssi::pidwait_add($pid);
+ my $pipetag;
+ my @args = ($rh, \$pipetag);
+ $pipetag = Irssi::input_add(fileno($rh), INPUT_READ, \&pipe_input, \@args);
+ print CLIENTCRAP "%R>>%n Please wait...";
+ } else {
+ my %result;
+ $result{query} = $query;
+ $result{result} = search_channels($query);
+ my $dumper = Data::Dumper->new([\%result]);
+ $dumper->Purity(1)->Deepcopy(1);
+ my $data = $dumper->Dump;
+ print($wh $data);
+ close($wh);
+ POSIX::_exit(1);
+ }
+}
+
+sub pipe_input ($$) {
+ my ($rh, $pipetag) = @{$_[0]};
+ my $data;
+ $data .= $_ foreach (<$rh>);
+ close($rh);
+ Irssi::input_remove($$pipetag);
+ return unless($data);
+ no strict;
+ my %result = %{ eval "$data" };
+ my $text;
+ foreach (sort keys %{ $result{result} }) {
+ $text .= '%9'.$_.'%9, '.$result{result}{$_}->{nicks}." nicks\n";
+ $text .= ' "'.$result{result}{$_}->{topic}.'"'."\n" if $result{result}{$_}->{topic};
+ }
+ $forked = 0;
+ print CLIENTCRAP draw_box('ChanSearch', $text, $result{query}, 1);
+}
+
+sub search_channels ($) {
+ my ($query) = @_;
+ my $ua = LWP::UserAgent->new(env_proxy => 1,keep_alive => 1,timeout => 30);
+ $ua->agent('Irssi Chansearch');
+ my $page = 'http://www.ludd.luth.se/irc/bin/csearch.cgi';
+ my %form = ( topic => "channels",
+ hits => "all",
+ min => 2,
+ max => "infinite",
+ sort => "in alphabetic order.",
+ pattern => $query
+ );
+ my $result = $ua->post($page, \%form);
+ return undef unless $result->is_success();
+ my %channels;
+ foreach ( split(/\n/, $result->content()) ) {
+ if (/^<LI><STRONG>(.*?)<\/STRONG> <I>(\d+)<\/I><BR>(.*).$/) {
+ $channels{$1} = { topic => $3, nicks => $2 };
+ }
+ }
+ return \%channels;
+}
+
+sub cmd_chansearch ($$$) {
+ my ($args, $server, $witem) = @_;
+ fork_search($args);
+}
+
+Irssi::command_bind('chansearch', \&cmd_chansearch);
+
+print CLIENTCRAP '%B>>%n '.$IRSSI{name}.' '.$VERSION.' loaded';