#---------------------------------------------------------------------# # 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 {
(.*?)
} $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 -- {([[: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";