#!/usr/bin/perl # # wp -- snag a summary from wikipedia via DNS # # Created by Tamara Temple on 2011/10/08. # Copyright (c) 2011 Tamara Temple Web Development. # License: GPLv3 # use lib $ENV{'HOME'}."/perl5/lib/perl5"; use strict; use Irssi; use URI::Escape; use Data::Dumper::Names; use Text::Wrap qw(wrap $columns); use Net::DNS; use vars qw($VERSION %IRSSI); my $res = Net::DNS::Resolver->new; my $prefix = "Wikipedia says: "; my $empty_re = qr{^\s*$}; $VERSION = "20111008"; %IRSSI = ( authors => 'Tamara Temple', contact => 'tamara@tamaratemple.com', name => 'wp', description => 'snag something from wikipedia via dig', license => 'GPLv3', ); my $debug=0; sub dbg ($) { my $msg = shift; return if (!$debug); return if ($msg =~ /$empty_re/); irssi_print("%RDEBUG%n ".irssi_safe($msg)); } sub irssi_safe($) { my $s = shift; $s =~ s/%/%%/g; return $s; } sub irssi_print { my $s = shift; return if ($s =~ /$empty_re/); Irssi::active_win()->print("%Y[$IRSSI{name}]%n $s"); } sub say { my ($server, $target, $msg, $command) = @_; return if !$server; return if ($msg =~ /$empty_re/); $command = ($command =~ m/^\s*$/) ? 'msg' : $command; $columns=250; my @lines=wrap("","",$msg); map {$server->command("$command $target $_") => $_ } @lines; } sub cmd_setdebug { my ($data, $server, $witem) = @_; my @words = split(/\s+/, $data); # get first bit off $data $_ = $data; SWITCH: { /^on$/i && do { $debug = 1; last SWITCH;}; /^off$/i && do { $debug = 0; last SWITCH;}; # don't bother if it's anything else } irssi_print("debug is ".($debug?'ON':'OFF')); } Irssi::command_bind($IRSSI{'name'}.'debug', 'cmd_setdebug'); sub sig_publicmsg { my ($server, $msg, $nick, $address, $target) = @_; $target = $nick if $target eq ""; my @words = split(/\s+/,$msg); my $sygil = $words[0]; shift @words; dbg("(sig_publicmsg) sygil=$sygil"); dbg("(sig_publicmsg) #words=$#words"); dbg("(sig_publicmsg) no sygil") if $sygil !~ /^!wp/i; return if $sygil !~ /^!wp/i; dbg("(sig_publicmsg) no words") if $#words < 0; return if $#words < 0; $msg=join(' ',@words); dbg("(sig_publicmsg) msg=$msg"); do_wp($server, $msg, $target); } Irssi::signal_add_last("message public", "sig_publicmsg"); Irssi::signal_add_last("message private", "sig_publicmsg"); Irssi::signal_add_last("message own_public", "sig_publicmsg"); Irssi::signal_add_last("message own_private", "sig_publicmsg"); sub do_wp { my ($server, $msg, $target) = @_; return if ($msg =~ /$empty_re/); my $lookup = uri_escape($msg); $lookup =~ s/%20/_/g; my $result = wikipedia($lookup); $result = ($result =~ m/^\s*$/) ? 'nothing.' : $result; $result =~ s/"//g; $result =~ s/\s\s+/ /g; dbg("(do_wp) result=$result"); say($server, $target, $prefix.$result,"action"); } sub wikipedia { my($name) = @_; return if ($name =~ /$empty_re/); my $q = $res->query("$name.wp.dg.cx", "TXT"); if($q) { for my $rr($q->answer) { next unless $rr->type eq "TXT"; return join "", $rr->char_str_list; } } return; } Irssi::active_win()->print($IRSSI{name} . ' ' . $VERSION . ' loaded.');