x0x wrote:Now !imdb matrix does not work but !imdb Matrix does. Same with the other fix mentioned above by adding A-Z to the already a-z0-9
Anyone a solution?
The issue here is the fellow was running into issues with characters in the url path. He wasn't using http packages handy http::formatQuery option. Instead he was mapping spaces to + and trying to sanitize input. This reduces the complexity and completeness of the search, crippling it.
Here is a new version, works with all characters (yes, even those special characters 
}{$"), even foreign languages although the script is written in english output only. All credit to doggo. If you find yourself using this script, consider it beerware. Put quite simple, you owe doggo a beer. If you can't afford to buy him a beer via paypal there is an optional means of payment: Take a picture of yourself drinking a beer. The background of this picture should be a monitor displaying your irc channel with this scripts output among what is displayed. Put a short personal message to doggo and we have proper payment. Enjoy the script everyone 
 
Note: Uses the version Spike^^ provided so includes any code fixes he made as well...
Code: Select all
# 13/02/2013
# by doggo #omgwtfnzbs @ EFNET
# drop in and try this script ;) all feedback is welcome
# to add channels, do:  .chanset #somechan +imdbapi
setudef flag imdbapi
namespace eval imdb  {
	namespace eval api {
		#time limit between cmds
		variable flood_set "10"
		#trigger to search by ttid
		variable info_tttrig "-tt"
		#title search trigger
		variable info_strig "-imdb"
		variable ttsearch_url "http://www.omdbapi.com/?i"
		variable titlesearch_url "http://www.omdbapi.com/?t"
		variable info_htrig "??imdb"
	}
	bind pub -|- $imdb::api::info_tttrig imdb::imdb_evaluate::evaluate_imdb
	bind pub -|- $imdb::api::info_strig imdb::imdb_evaluate_search::search_evaluate_imdb
	bind pub -|- $imdb::api::info_htrig imdb::imdb_helper::helper_imdb
	# get info from ttid proc
	namespace eval imdb_evaluate {
		proc evaluate_imdb {nick hand host chan titleid} {
			if {![channel get $chan "imdbapi"]} {  return 0  }
			set imdb_pub "PRIVMSG $chan"
			#flood protection, borrowed from http://forum.egghelp.org/viewtopic.php?t=17078 :D
			variable imdb_flood
			if {[info exists imdb_flood(lasttime,$chan)] && [expr { $imdb_flood(lasttime,$chan) + $imdb::api::flood_set }] > [clock seconds]} {
				puthelp "$imdb_pub :You can use only 1 command in $imdb::api::flood_set seconds. Wait [expr { $imdb::api::flood_set + $imdb_flood(lasttime,$chan) - [clock seconds] }] seconds and try again."
				return
			}
			set titleid [split [stripcodes bcruag $titleid]]
			if {![string length [set ttid [lindex $titleid 0]]]} {
				putquick "$imdb_pub :Usage: $imdb::api::info_tttrig tt1899353"
				return
			}
			set action [lindex $titleid 1]
			if {![regexp {^tt([0-9]+)$} $ttid match imdbid] } {
				putquick "$imdb_pub :Error: not a valid ttid."
				return
			}
			if {![catch { ::http::geturl $imdb::api::ttsearch_url=tt$imdbid -timeout 15000 } token]} {
				set information [::http::data $token]
				::http::cleanup $token
				if {![regexp -nocase {response"\:"(.*?)"} $information match response]} {
					putquick "$imdb_pub :$imdb::api::ttsearch_url=tt$imdbid timed out.. try again in a bit "
					return
				} elseif {![string match "True" $response]} {
					putquick "$imdb_pub :Error: Unknown IMDb ID"
					return
				}
				::imdb::imdb_trigger::trigger_imdb $information $action $chan
			} else {
				putquick "$imdb_pub :Error: $token"
				return
			}
			set imdb_flood(lasttime,$chan) [clock seconds]
		}
	}
	# get info from title search proc
	namespace eval imdb_evaluate_search {
		proc search_evaluate_imdb {nick hand host chan imdbsearch} {
			if {![channel get $chan "imdbapi"]} {  return 0  }
			set imdb_pub "PRIVMSG $chan"
			#flood protection, borrowed from http://forum.egghelp.org/viewtopic.php?t=17078 :D
			variable imdb_flood
			if {[info exists imdb_flood(lasttime,$chan)] && [expr { $imdb_flood(lasttime,$chan) + $imdb::api::flood_set } ] > [clock seconds]} {
				puthelp "$imdb_pub :You can use only 1 command in $imdb::api::flood_set seconds. Wait [expr { $imdb::api::flood_set + $imdb_flood(lasttime,$chan) - [clock seconds] } ] seconds and try again."
				return
			}
			if {![llength [set imdbsearch [split [stripcodes bcruag $imdbsearch]]]]} {
				putquick "$imdb_pub :Usage: $imdb::api::info_strig Mission Impossible"
				return
			}
			if {[string index [set imdbswitch [lindex $imdbsearch end]] 0] == "-"} {
				set imdbsearch [join [lrange $imdbsearch 0 end-1]] 
				set imdbswitch [string range $imdbswitch 1 end]
			} else {
				set imdbswitch ""
				set imdbsearch [join $imdbsearch] 
			}
			if {![catch { ::http::geturl $imdb::api::titlesearch_url=[http::formatQuery $imdbsearch] -timeout 15000 } token]} {
				set information [::http::data $token]
				::http::cleanup $token
				regexp -nocase {response"\:"(.*?)"} $information match response
				if {![info exists response]} {
					putquick "$imdb_pub :Error: $imdb::api::titlesearch_url=[http::formatQuery $imdbsearch] timed out.. try again in a bit "
					return
				} elseif {![string match "True" $response]} {
					putquick "$imdb_pub :Error: 0 Results for $imdbsearch"
					return
				}
				::imdb::imdb_trigger::trigger_imdb $information $imdbswitch $chan
			} else {
				putquick "$imdb_pub :Error: $token"
				return
			}
			set imdb_flood(lasttime,$chan) [clock seconds]
		}
	}
	# parse the returned json proc
	namespace eval imdb_trigger {
		proc trigger_imdb {information action chan} {
			regexp -nocase {title"\:"(.*?)"} $information match title
			regexp -nocase {year"\:"(.*?)"} $information match year
			regexp -nocase {rated"\:"(.*?)"} $information match rated
			regexp -nocase {released"\:"(.*?)"} $information match released
			regexp -nocase {genre"\:"(.*?)"} $information match genre
			regexp -nocase {director"\:"(.*?)"} $information match director
			regexp -nocase {writer"\:"(.*?)"} $information match writer
			regexp -nocase {actors"\:"(.*?)"} $information match actors
			regexp -nocase {plot"\:"(.*?)"} $information match plot
			regexp -nocase {poster"\:"(.*?)"} $information match poster
			regexp -nocase {runtime"\:"(.*?)"} $information match runtime
			regexp -nocase {rating"\:"(.*?)"} $information match rating
			regexp -nocase {votes"\:"(.*?)"} $information match votes
			regexp -nocase {ID"\:"(.*?)"} $information match id
			set imdb_pub "PRIVMSG $chan"
			switch -exact -- [string tolower $action] {
				"title" {  putquick "$imdb_pub :\00308\[IMDB Title\]\017 $title" }
				"year" {  putquick "$imdb_pub :\00308\[IMDB Year\]\017 $year" }
				"rated" {  putquick "$imdb_pub :\00308\[IMDB Rated\]\017 $rated" }
				"released" {  putquick "$imdb_pub :\00308\[IMDB Released\]\017 $released" }
				"genre" {  putquick "$imdb_pub :\00308\[IMDB Genre\]\017 $genre" }
				"director" {  putquick "$imdb_pub :\00308\[IMDB Directed By\]\017 $director" }
				"writer" {  putquick "$imdb_pub :\00308\[IMDB Written By\]\017 $writer" }
				"cast" {  putquick "$imdb_pub :\00308\[IMDB Cast\]\017 $actors" }
				"plot" {  putquick "$imdb_pub :\00308\[IMDB Plot\]\017 $plot" }
				"poster" {  putquick "$imdb_pub :\00308\[IMDB Poster\]\017 $poster" }
				"runtime" {  putquick "$imdb_pub :\00308\[IMDB Runtime\]\017 $runtime" }
				"rating" {  putquick "$imdb_pub :\00308\[IMDB Rating\]\017 $rating" }
				"votes" {  putquick "$imdb_pub :\00308\[IMDB Votes\]\017 $votes" }
				"link" {  putquick "$imdb_pub :\00308\[Link\]\017 http://www.imdb.com/title/$id/" }
				default {
					putquick "$imdb_pub :\00308\[Title\]\017 $title \00308\[Year\]\017 $year \00308\[Genre\]\017 $genre"
					putquick "$imdb_pub :\00308\[Directed By\]\017 $director \00308\[Writen By\]\017 $writer"
					putquick "$imdb_pub :\00308\[Released\]\017 $released \00308\[Rated\]\017 $rated"
					putquick "$imdb_pub :\00308\[Cast\]\017 $actors"
					putquick "$imdb_pub :\00308\[Plot\]\017 $plot"
					putquick "$imdb_pub :\00308\[Poster\]\017 $poster"
					putquick "$imdb_pub :\00308\[Runtime\]\017 $runtime \00308\[Rating\]\017 $rating \00308\[Votes\]\017 $votes"
					putquick "$imdb_pub :\00308\[Link\]\017 http://www.imdb.com/title/$id/"
				}
			}
		}
	}
	# usage helper proc
	namespace eval imdb_helper {
		proc helper_imdb {nick hand host chan text} {
			if {![channel get $chan "imdbapi"]} {  return  }
			set imdb_pub "PRIVMSG $chan"
			putquick "$imdb_pub :\00308\[IMDB Search Help\]\017"
			putquick "$imdb_pub :\00308\[Search IMDB Id\]\017 $imdb::api::info_tttrig tt0234215 | or | $imdb::api::info_tttrig tt0234215 switch"
			putquick "$imdb_pub :\00308\[Search Titles\]\017 $imdb::api::info_strig the matrix reloaded | or | $imdb::api::info_strig the matrix reloaded --switch"
			putquick "$imdb_pub :\00308\[Search Switches\]\017 title year rated released genre director writer cast plot poster runtime rating votes link | no switch = spam :D"
		}
	}
}
#eof