Jelajahi Sumber

Merge branch 'master' of github.com:horgh/eggdrop-scripts

Will Storey 15 tahun lalu
induk
melakukan
0aeb57a24a
3 mengubah file dengan 72 tambahan dan 20 penghapusan
  1. 5 0
      README
  2. 2 0
      google.tcl
  3. 65 20
      slang.tcl

+ 5 - 0
README

@@ -10,3 +10,8 @@ wiki.tcl - wikipedia.org synopsis fetcher
 
 Edited versions of scripts written by others:
 imdb.tcl - IMDB.org query script. Written by B0unTy, modified by OV2
+
+
+Licenses:
+All scripts written by me in this repository are Public domain. Those
+not written by me are under whatever license specified by their authors.

+ 2 - 0
google.tcl

@@ -17,6 +17,8 @@
 #
 # Created Feb 28 2010
 #
+# License: Public domain
+#
 # Requires Tcl 8.5+
 # Requires tcllib for json
 #

+ 65 - 20
slang.tcl

@@ -31,6 +31,9 @@ namespace eval ud {
 
 	variable client "Mozilla/5.0 (compatible; Y!J; for robot study; keyoshid)"
 	variable url http://www.urbandictionary.com/define.php
+	variable url_random http://www.urbandictionary.com/random.php
+
+	variable word_regexp {<td class='word'>(.*?)</td>}
 	variable list_regexp {<td class='text'.*? id='entry_.*?'>.*?</td>}
 	variable def_regexp {id='entry_(.*?)'>.*?<div class="definition">(.*?)</div>}
 
@@ -52,20 +55,31 @@ proc ud::handler {nick uhost hand chan argv} {
 		set number 1
 	}
 
-	if {$query == ""} {
-		$ud::output_cmd "PRIVMSG $chan :Usage: $ud::trigger \[#\] <definition to look up>"
+	if {[llength $argv] == 1 && [string is digit [lindex $argv 0]]} {
+		$ud::output_cmd "PRIVMSG $chan :Usage: slang \[#\] <query> (or just slang for random definition)"
 		return
 	}
 
-	if {[catch {ud::fetch $query $number} result]} {
-		$ud::output_cmd "PRIVMSG $chan :Error: $result"
-		return
+	if {$query == ""} {
+		if {[catch {ud::get_random} result]} {
+			$ud::output_cmd "PRIVMSG $chan :Error: $result"
+			return
+		}
+		ud::output $chan $result
+	} else {
+		if {[catch {ud::get_def $query $number} result]} {
+			$ud::output_cmd "PRIVMSG $chan :Error: $result"
+			return
+		}
+		ud::output $chan $result
 	}
+}
 
-	foreach line [ud::split_line $ud::line_length [dict get $result definition]] {
+proc ud::output {chan def_dict} {
+	foreach line [ud::split_line $ud::line_length [dict get $def_dict definition]] {
 		if {[incr output] > $ud::max_lines} {
 			if {$ud::show_truncate} {
-				$ud::output_cmd "PRIVMSG $chan :Output truncated. [ud::def_url $query $result]"
+				$ud::output_cmd "PRIVMSG $chan :Output truncated. [ud::def_url $def_dict]"
 			}
 			break
 		}
@@ -73,31 +87,60 @@ proc ud::handler {nick uhost hand chan argv} {
 	}
 }
 
-proc ud::fetch {query number} {
-	http::config -useragent $ud::client
+proc ud::get_random {} {
+	set result [ud::http_fetch $ud::url_random ""]
+	set word [dict get $result word]
+	set defs_html [dict get $result definitions]
+
+	if {[llength $defs_html] < 1} {
+		error "Failure finding random definition."
+	}
+
+	return [ud::parse $word [lindex $defs_html 0]]
+}
+
+proc ud::get_def {query number} {
 	set page [expr {int(ceil($number / 7.0))}]
 	set number [expr {$number - (($page - 1) * 7)}]
 
 	set http_query [http::formatQuery term $query page $page]
 
-	set token [http::geturl $ud::url -timeout 20000 -query $http_query]
+	set result [ud::http_fetch $ud::url $http_query]
+	set word [dict get $result word]
+	set defs_html [dict get $result definitions]
+
+	if {[llength $defs_html] < $number} {
+		error "[llength $defs_html] definitions found."
+	}
+
+	return [ud::parse $word [lindex $defs_html [expr {$number - 1}]]]
+}
+
+proc ud::http_fetch {url http_query} {
+	http::config -useragent $ud::client
+
+	set token [http::geturl $url -timeout 20000 -query $http_query]
 	set data [http::data $token]
 	set ncode [http::ncode $token]
+	set meta [http::meta $token]
 	http::cleanup $token
 
+	# Follow redirects
+	if {[regexp -- {30[01237]} $ncode]} {
+		set new_url [dict get $meta Location]
+		return [ud::http_fetch $new_url $http_query]
+	}
+
 	if {$ncode != 200} {
 		error "HTTP fetch error. Code: $ncode"
 	}
-
+	regexp -- $ud::word_regexp $data -> word
+	set word [string trim $word]
 	set definitions [regexp -all -inline -- $ud::list_regexp $data]
-	if {[llength $definitions] < $number} {
-		error "[llength $definitions] definitions found."
-	}
-
-	return [ud::parse $query [lindex $definitions [expr {$number - 1}]]]
+	return [list word $word definitions $definitions]
 }
 
-proc ud::parse {query raw_definition} {
+proc ud::parse {word raw_definition} {
 	if {![regexp $ud::def_regexp $raw_definition -> number definition]} {
 		error "Could not parse HTML"
 	}
@@ -105,11 +148,13 @@ proc ud::parse {query raw_definition} {
 	set definition [regsub -all -- {<.*?>} $definition ""]
 	set definition [regsub -all -- {\n+} $definition " "]
 	set definition [string tolower $definition]
-	return [list number $number definition "$query is $definition"]
+	return [list number $number word $word definition "$word is $definition"]
 }
 
-proc ud::def_url {query result} {
-	set raw_url ${ud::url}?[http::formatQuery term $query defid [dict get $result number]]
+proc ud::def_url {def_dict} {
+	set word [dict get $def_dict word]
+	set number [dict get $def_dict number]
+	set raw_url ${ud::url}?[http::formatQuery term $word defid $number]
 	if {$ud::isgd_disabled} {
 		return $raw_url
 	} else {