rendered paste body#---------------------------------------------------------------------#
# TechJoose:WordoftheDay v1.0 #
# Based on perpleXa's Urban Dictionary Script #
# Original script Copyright (C) 2006-2007 perpleXa #
# http://perplexa.ugug.org / #perpleXa on QuakeNet #
# #
# Grabs the word of the day from Urban Dictionary #
# #
# Usage: #
# !wordoftheday [id] (1=today, 2=yesterday, etc up to 100) #
# #
# ChangeLog: #
# 1.0 - Modified perpleXa's original script, released #
# #
# TODO: #
# - Ideas? Email me. #
# #
# http://www.techjoose.net #
# macbrando@gmail.com #
# BeBoo @ irc.techjoose.net / #bar #
#---------------------------------------------------------------------#
#---------------------------------------------------------------------#
# Redistribution, with or without modification, are permitted provided#
# that redistributions retain the above copyright notice, this #
# condition and the following disclaimer. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without #
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A #
# PARTICULAR PURPOSE. #
#---------------------------------------------------------------------#
# fsck is available at http://perplexa.ugug.co.uk
package require fsck 1.10;
package require http;
namespace eval urbandict_wotd {
variable version 1.0;
variable encoding "utf-8";
variable client "Mozilla/5.0 (compatible; Y!J; for robot study; keyoshid)";
bind pub -|- "!word" [namespace current]::pub;
namespace export pub;
}
proc urbandict_wotd::getdefinition {url} {
variable client;
http::config -useragent $client;
if {[catch {http::geturl $url -timeout 20000} token]} {
return [list 0 "Warning: Couldn't connect to \[$url\]"];
}
upvar 0 $token state;
if {![string equal -nocase $state(status) "ok"]} {
return [list 0 "Warning: Couldn't connect to \[$url\] (connection $state(status))."];
}
set data [http::data $token];
http::cleanup $token;
set matches [regexp -all -inline {<td class=\"def_word\" nowrap><span.*?>(.*?)</span>.*?<td class=\"def_word\"><a.*?>(.*?)</a></td>.*?<div class=\"def_p\">.*?<p>(.*?)</p>} $data];
set list [list];
foreach {null date word definition} $matches {
regsub -all {<[^>]*?>} [decode $definition] "" definition;
regsub -all {[\r\n\s\t]+} $definition " " definition;
regsub -all {<[^>]*?>} [decode $word] "" word;
regsub -all {[\r\n\s\t]+} $word " " word;
lappend list "\002\037${date}\037, ${word}\002 - ${definition}";
}
return [concat [llength $list] $list];
}
proc urbandict_wotd::urlencode {i} {
variable encoding
set index 0;
set i [encoding convertto $encoding $i]
set length [string length $i]
set n ""
while {$index < $length} {
set activechar [string index $i $index]
incr index 1
if {![regexp {^[a-zA-Z0-9]$} $activechar]} {
append n %[format "%02X" [scan $activechar %c]]
} else {
append n $activechar
}
}
return $n
}
proc urbandict_wotd::pub {nick host hand chan argv} {
set id [lindex $argv 0];
if {$id eq ""} {
set id 1;
} elseif {$id eq 0} {
set id 1;
}
if {$id < 11} {
set url "http://www.urbandictionary.com/daily.php?page=1";
} elseif {$id < 21} {
set id [expr ${id}-10]
set url "http://www.urbandictionary.com/daily.php?page=2";
} elseif {$id < 31} {
set id [expr ${id}-20]
set url "http://www.urbandictionary.com/daily.php?page=3";
} elseif {$id < 41} {
set id [expr ${id}-30]
set url "http://www.urbandictionary.com/daily.php?page=4";
} elseif {$id < 51} {
set id [expr ${id}-40]
set url "http://www.urbandictionary.com/daily.php?page=5";
} elseif {$id < 61} {
set id [expr ${id}-50]
set url "http://www.urbandictionary.com/daily.php?page=6";
} elseif {$id < 71} {
set id [expr ${id}-60]
set url "http://www.urbandictionary.com/daily.php?page=7";
} elseif {$id < 81} {
set id [expr ${id}-70]
set url "http://www.urbandictionary.com/daily.php?page=8";
} elseif {$id < 91} {
set id [expr ${id}-80]
set url "http://www.urbandictionary.com/daily.php?page=9";
} elseif {$id < 101} {
set id [expr ${id}-90]
set url "http://www.urbandictionary.com/daily.php?page=10";
} else {
puthelp "PRIVMSG $chan :\002\00305\[\003 UrbanDict's Word of the Day\003 \00305\]\003\002 Too far back, sorry.";
return 1;
}
set definition [getdefinition $url];
set count [lindex $definition 0];
if {!$count} {
puthelp "PRIVMSG $chan :\002\00305\[\003 UrbanDict's Word of the Day\003 \00305\]\003\002 Nothing found for the word of the day.";
return 1;
}
set definition [lindex $definition $id];
if {[string length $definition] <= 400} {
puthelp "PRIVMSG $chan :\002\00305\[\003 UrbanDict's Word of the Day\003 \00305\]\003\002 $definition";
return 0;
}
set skip 0;
set definition [splitmsg $definition];
set required_lines [llength $definition];
foreach line $definition {
puthelp "PRIVMSG $chan :\002\00305\[\003 UrbanDict's Word of the Day\003 \00305\]\003\002 $line";
if {[incr skip] == 3 && $required_lines != 3} {
puthelp "PRIVMSG $chan :\002\00305\[\003 UrbanDict's Word of the Day\003 \00305\]\003\002 Truncated output to 3 of $required_lines lines.";
break;
}
}
return 0;
}
proc urbandict_wotd::decode {content} {
if {![string match *&* $content]} {
return $content;
}
set escapes {
\x20 " \x22 & \x26 ' \x27 – \x2D
< \x3C > \x3E ˜ \x7E € \x80 ¡ \xA1
¢ \xA2 £ \xA3 ¤ \xA4 ¥ \xA5 ¦ \xA6
§ \xA7 ¨ \xA8 © \xA9 ª \xAA « \xAB
¬ \xAC ­ \xAD ® \xAE &hibar; \xAF ° \xB0
± \xB1 ² \xB2 ³ \xB3 ´ \xB4 µ \xB5
¶ \xB6 · \xB7 ¸ \xB8 ¹ \xB9 º \xBA
» \xBB ¼ \xBC ½ \xBD ¾ \xBE ¿ \xBF
À \xC0 Á \xC1 Â \xC2 Ã \xC3 Ä \xC4
Å \xC5 Æ \xC6 Ç \xC7 È \xC8 É \xC9
Ê \xCA Ë \xCB Ì \xCC Í \xCD Î \xCE
Ï \xCF Ð \xD0 Ñ \xD1 Ò \xD2 Ó \xD3
Ô \xD4 Õ \xD5 Ö \xD6 × \xD7 Ø \xD8
Ù \xD9 Ú \xDA Û \xDB Ü \xDC Ý \xDD
Þ \xDE ß \xDF à \xE0 á \xE1 â \xE2
ã \xE3 ä \xE4 å \xE5 æ \xE6 ç \xE7
è \xE8 é \xE9 ê \xEA ë \xEB ì \xEC
í \xED î \xEE ï \xEF ð \xF0 ñ \xF1
ò \xF2 ó \xF3 ô \xF4 õ \xF5 ö \xF6
÷ \xF7 ø \xF8 ù \xF9 ú \xFA û \xFB
ü \xFC ý \xFD þ \xFE ÿ \xFF
};
set content [string map $escapes $content];
set content [string map [list "\]" "\\\]" "\[" "\\\[" "\$" "\\\$" "\\" "\\\\"] $content];
regsub -all -- {&#([[:digit:]]{1,5});} $content {[format %c [string trimleft "\1" "0"]]} content;
regsub -all -- {&#x([[:xdigit:]]{1,4});} $content {[format %c [scan "\1" %x]]} content;
regsub -all -- {&#?[[:alnum:]]{2,7};} $content "?" content;
return [subst $content];
}
putlog " - Urban Dictionary: Word of the Day v$urbandict_wotd::version by BeBoo";