Created
June 28, 2012 20:22
-
-
Save khobbits/3013679 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
setctx lains | |
# <speechles> Scripts are like children. They grow up to take | |
# on lives of their own, along with all their parents time. | |
# <speechles> Bots are so obedient, like a wife you never need to slap. | |
#---------------------------------------------------------------# | |
# UNOFFICIAL incith:google v2.1x # | |
# January 8, 2012 # | |
# performs various methods of Google searches # | |
# tested on: # | |
# eggdrop v1.6.17 GNU/LINUX with Tcl 8.4 # | |
# windrop v1.6.17 CYGWIN_NT with Tcl 8.4 (http.tcl v2.5) # | |
# - http.tcl included - Linux/BSD users should NOT need this # | |
# # | |
# UNOFFICIAL NEWS:............................................. # | |
# # | |
# As of 1.9, I (speechless) have rewritten and added several # | |
# pieces of this script, fixing various regexp's, adding # | |
# more search sites to it, added a gamefaqs upcoming list # | |
# for gamers and much much more. # | |
# See the Egghelp forum for info or help you may need: # | |
# http://forum.egghelp.org/viewtopic.php?t=13586 # | |
# # | |
# OFFICIAL NEWS:............................................... # | |
# # | |
# As of v1.6, I (madwoota) have taken over the development of # | |
# incith:google. If you have any feature req's, bugs, ideas, # | |
# etc, please dont hesitate to send them to me. # | |
# My contact details have replaced incith's, but if you wish # | |
# to approach him directly about anything, I can point you # | |
# in the right direction. # | |
# See the Egghelp forum for inciths handover and all the latest# | |
# info on this script: # | |
# http://forum.egghelp.org/viewtopic.php?t=10175 # | |
# # | |
# BASIC USAGE GUIDE:........................................... # | |
# # | |
# .chanset #channel +google # | |
# !google [.google.country.code] [define:|spell:] # | |
# <search terms> <1+1> <1 cm in ft> <patent ##> # | |
# <weather city|zip> <??? airport> # | |
# !images [.google.country.code] <search terms> # | |
# !groups [.google.country.code] <search terms> # | |
# !news [.google.country.code] <search terms> # | |
# !local [.google.country.code] <what> near <where> # | |
# !book [.google.country.code] <search terms> # | |
# !video [.google.country.code] <search terms> # | |
# !fight <word(s) one> vs <word(s) two> # | |
# !youtube [.google.country.code] <search terms> # | |
# !trans region@region <text> # | |
# !gamespot <search terms> # | |
# !gamefaqs <system> in <region> # | |
# !blog [.google.country.code] <search terms> # | |
# !ebay [.ebay.country.code] <search terms> # | |
# !ebayfight <word(s) one> vs <word(s) two> # | |
# !wikipedia [.2-digit-country-code] <search terms>[#subtag] # | |
# !wikimedia [.www.wikisite.org[/wiki]] <search terms>[#subtag] | |
# !locate <ip or hostmask> # | |
# !review <gamename> [@ <system>] # | |
# !torrent <search terms> # | |
# !best <system> # | |
# !worst <system> # | |
# !dailymotion <search terms> # | |
# !ign <search terms> # | |
# !myspace <search terms> # | |
# !trends [.google.country.code] <YYYY-MM-DD> # | |
# # | |
# CHANGE LOG:.................................................. # | |
# # | |
# 1.0: first public release # | |
# 1.1: improved bolding of search terms, compatible with # | |
# chopped descriptions # | |
# supports 'define: <word>' lookups # | |
# supports calculator. !google (4+3) * 2 - 1 # | |
# - converts, too. !google 1 lb in ounces # | |
# image lookups coded, !images <search> # | |
# 'spell: word1 word2' function added # | |
# - don't rely on this, it's not a dictionary, just # | |
# corrects common typos. # | |
# flood protection added # | |
# 1.2: will wrap long lines (yay, a worthy solution!) # | |
# allowed setting of the seperator instead of a ' | ' by # | |
# default. If you set this to "\n" then you will get # | |
# each result on a seperate line instead of one line # | |
# will display 'did you mean' if no results # | |
# [PDF] links will be parsed/included now # | |
# fixed a bug when no data was returned from google such # | |
# is the case when you search for """""""""""""""""" # | |
# 1.3: can return results in multiple languages now # | |
# fixed quotes being displayed around links # | |
# private messages support added (for /msg !google) # | |
# video.google.com seems impossible, Google Video Viewer # | |
# is required to view videos, etc # | |
# 1.4: bit of a different output, easier to click links now # | |
# local lookups coded, use !local <what> near <where> # | |
# seems google does currency the same way my exchange # | |
# script does (!g 1 usd in cad) # | |
# "patent ##" will return the patent link if it exists # | |
# bugfix in private messages # | |
# sorry to all whom grabbed a borked copy on egghelp :-( # | |
# 1.5: fix for !local returning html on 'Unverified listing's # | |
# "madwoota" has supplied some nice code updates for us! # | |
# - "answer" matches, eg: !g population of japan # | |
# - !g <upc code> # | |
# - google groups (!gg), google news (!gn) # | |
# - movie: review lookups # | |
# - area code lookups (!g 780) # | |
# - print.google lookups (!gp !print) # | |
# reworked binds to fix horrible bug allowing !g !gi !gp # | |
# case insensitive binds (!gi, !GI, !gI, !Gi, etc) # | |
# .1: fix for double triggers/bad binds # | |
# .2: fix involving "can't read link" error # | |
#-madwoota: # | |
# 1.6: fixed google search returning no results # | |
# fixed descriptions getting cut short on 'answers' # | |
# fixed bug where some urls were returned invalid # | |
# fixed google local searches returning no results # | |
# fixed google print searches returning invalid links # | |
# changed 'did you means' to get returned first as well # | |
# added google weather: !g weather <city|zip> # | |
# - note: US weather only (blame google!) # | |
# added travel info, eg: !g sfo airport | !g united 134 # | |
# added config option to send output via /notice # | |
# added initial attempt at parsing google video (!gv) # | |
# 1.7: added option to force all replies as private (req) # | |
# fixed google groups returning no results # | |
# fixed define: errors on no results # | |
# fixed google print errors on no results/typos # | |
# fixed movie review errors on no results/typos # | |
# fixed some characters not usable as command_chars on # | |
# one of regular eggdrop or windrop+cygwin # | |
# fixed occasional weird response for travel info # | |
# updated requirements to http package 2.4 # | |
# loads of other internal changes # | |
# .1: fixed search parameters not being parsed correctly # | |
# - resulted in some bogus "no results" replies. # | |
# .2: fixed main google search returning rubbish results # | |
# - google changed their source again # | |
# changed all methods of parsing the search results to # | |
# *hopefully* cope better with any source changes # | |
# changed output queue to stop the bot from flooding # | |
# .3: fixed some urls being returned with spaces in them # | |
# - makes them unusable in most irc clients # | |
# fixed google groups occasionally returning junk due to # | |
# changes in 1.7.2 (will revisit this later) # | |
# 1.8: added option to turn on "safe" searches # | |
# added channel user level filtering option (+v/+o only) # | |
# added google fight! !gf or !fight <blah> vs <blah> # | |
# - inspired by www.googlefight.com # | |
# added ability to do any custom mode to descs & links # | |
# - i'll just apologise now for this one :) # | |
# removed variable underline_links (superseded by above) # | |
# removed use of 'tcl_endOfWord' to stop windrop breaking# | |
# fixed excess %20's appearing in some results # | |
# fixed "translate this" only returns ? (i think) # | |
# stopped local from returning ad spam on first result # | |
#-speechless # | |
# 1.9: updated various regexp's and regsub's in almost all # | |
# procs to fix non functioning html parsing. # | |
# added !localuk option to display United Kingdom. # | |
# added !youtube for searching videos on youtube. # | |
# added !atomfilms for searching videos on atomfilms. # | |
# added !trans for searching videos on trans. # | |
# added !gamespot for searching games, etc. # | |
# added !gamefaqs, it is able to parse multiple systems # | |
# and regions, still a work in progress, all bugs have # | |
# been squashed. # | |
# added !test proc to help debug and dump html for # | |
# future parsing projects. # | |
# .1: added !blog for searching blogsearch.google # | |
# added !ebay for searching ebay auctions. # | |
# added !ebayfight for amusement, same as googlefight. # | |
# fixed various miscellaneous minor annoyances in parts. # | |
# finally fixed !book (aka print) to work with # | |
# books.google # | |
# added !ign for searching movies, games, etc.. # | |
# .2: added support for total_search to show total results # | |
# or not. :) # | |
# added support for link_only (requested). # | |
# added back complete support for desc/link modes # | |
# they will now affect results properly. # | |
# (note: doesn't affect gamefaqs or locate) # | |
# added !locate for dns location information. # | |
# .3: added !wiki for searching wikipedia for things, very # | |
# much a work-in-progress, don't expect it to be # | |
# perfect.. it just reads very top heading <h*> so # | |
# sometimes it returns next to nothing.. like I said # | |
# it's WIP so don't bitch, thx. # | |
# added !review for searching gamefaqs and pulling a # | |
# games review, ranking, score, etc.. works similarly # | |
# to the way !wiki does, has same problem, so this # | |
# is also WIP.. thx # | |
# .4: fixed a few regexp parsers to correct broken (no # | |
# results returned) messages in some procs. # | |
# changed google populations to return only 1st desc # | |
# this fixes a small bug where excess html was shown. # | |
# ie. !g population japan || !g population of japan # | |
# fixed google define: links with quick regsub hacks. # | |
# problem with recent ign changing to javascripted html # | |
# so removed their advertising.. too bad for them. # | |
# fixed review and wikipedia to almost perfect. # | |
# note: review does not use forms submittal, instead # | |
# I chose to a single query and field matching on the # | |
# first page returned. I may later use forms submital # | |
# at some later time. # | |
# added two gamerankings triggers (!top/!popular) # | |
# added a mininova torrent search parser. # | |
# fixed parser for !blog by removing quotes. "g" -> g # | |
# beefed up the wikipedia parser so can intelligently # | |
# move to html#subtags to display info. # | |
# removed atomfilms trigger because no one was using. # | |
# added dailymotion trigger for searching tv episodes # | |
# since youtube/google seem to remove those too # | |
# often. # | |
# wikipedia now has ability to properly handle internal # | |
# redirects intelligently as well. # | |
# youtube needed its regexp/regsub parsers tweaked a bit # | |
# to handle new html design. # | |
# google changed format and updated search regexp/sub # | |
# accordingly. # | |
# fixed !local lookups, removed !localuk as it was # | |
# redundant since !local covers UK region now. # | |
# corrected !book to actually produce an output again # | |
# i left broken intentionally earlier because of # | |
# lack of interest, but a guy named Zircon sparked # | |
# my interest again. enjoy. # | |
# gamespot injects paid crap into their html design now # | |
# so found a way to scrape around it.. muahah # | |
# requested by a few people that somehow wikipedia is # | |
# multi-lingual so a fast hack is provided at the # | |
# moment which lacks input checking.. will fix later # | |
# requested by a british friend was the ability as well # | |
# for ebay to work from different countries server. # | |
# this also lacks input checking.. will fix later. # | |
# added error catching for erroneous url's in both # | |
# wikipedia and ebay, this way bad user countries # | |
# will be reported with socket errors. thx rosc2112 # | |
# .5: major modification of script to allow for dynamic # | |
# language selection of _all_ google sites. # | |
# (search,image,news,local,video,book,blog) # | |
# google group is still broken, will fix later :P # | |
# added !trans for google translate. enjoy. # | |
# added stock quotes (supplied by madwoota) # | |
# fixed translation to convertto foreign charsets. # | |
# fixes display of russian and arabic languages. # | |
# corrected google area code map results. # | |
# added google zip code map results. # | |
# corrected google movie review lookups, now works! # | |
# search totals was incorrect on some country google # | |
# lookups. it was using elapsed search time as the # | |
# total results, so now a fallback (else) corrects # | |
# it by replace total results with 'google' in # | |
# those instances. # | |
# youtube undergoing major html changing to keep bots # | |
# from indexing, so changed some parsers to work. # | |
# added back !ign trigger for scraping ign's search # | |
# page for results. # | |
# google answers needed fixing to show correct results. # | |
# added !myspace trigger for searching their video # | |
# content. # | |
# corrected zipcode/areacode/airport. # | |
# corrected all google query possibilities by spending a # | |
# few hours fine tuning everything. Most languages # | |
# should work exactly as planned. Some languages # | |
# "may" display incorrectly, but this is by design # | |
# rather than an error, as the script presently uses # | |
# unicode for everything except google translations. # | |
# major work done to !local fixing it for every possible # | |
# query result in almost every language, try it out # | |
# feeding it nonsense and try to find a flaw. # | |
# small bug concerning !google patent ##### .. wasn't # | |
# being caught as results, now all is well again. # | |
# corrected ebay parser with small change to eliminate # | |
# excess html in 'buy-it-now' parsing. # | |
# UPC codes work again.. yay.. how many use this? 1 guy? # | |
# Ebay, Wikipedia and Google needed minor fixes to # | |
# correct remaining bits that were left untranslated # | |
# now all output will be in language chosen. # | |
# Gamespot changed html design of their page layots for # | |
# reviews, so quick fix to !review proc to handle # | |
# their new design :) # | |
# Corrected 'results' message displayed with totals to # | |
# also be displayed in language searched in, makes # | |
# the output look much more professional. r0x hard. # | |
# All Google triggers are now 100% dialect perfect. # | |
# Fixed small problem with wikipedia's 'no result' # | |
# message being longer than neccessary. # | |
# Added multi-language ability to youtube because it # | |
# now supports it, new default variable for setting # | |
# language default for it as well. enjoy. # | |
# Changed myspace parser query making it less prone to # | |
# breaking. # | |
# Added new trigger !trends to get top search results # | |
# for any date (this is limited by google cache, # | |
# not by the script) and also can be given country # | |
# switches. This is new, at present I cannot go # | |
# back beyond May 2007-05-15 .. # | |
# Added dual results to !ebay trigger for price/bids # | |
# to account for the fact buy-it-now allows bids as # | |
# well... # | |
# Fixed the tiny bug in google answers lookup which # | |
# allowed for cruft to be given as 2nd result. # | |
# Fixed the tiny bug in wikipedia articles that left # | |
# parts of tables in the results. # | |
# Added forced subtagging ability to wikipedia results # | |
# using their standard sub-tag #this so you can now # | |
# force certain sections to being your results and # | |
# it must only begin with the term doesn't need to # | |
# be entire term to force a sub-tag redirect. # | |
# .6: Added !mediawiki trigger following same abilities as # | |
# the wikipedia trigger. This is beta at the moment # | |
# and the reason this script has a revision change. # | |
# Corrected small issue regarding parsing original search# | |
# results which makes this now compatabile with # | |
# every mediawiki page. # | |
# Fixed problem parsers; Groups, News, Book # | |
# Problems with some procs sorted, Gamefaqs modified to # | |
# work with new php site design. # | |
# Fixed issues with stubborn always changing google # | |
# based searches. Now hopefully all triggers work # | |
# again. # | |
# Added prepend ability (Requested) so now each of your # | |
# lines, can be prepended with whatever you desire. # | |
# Added 'time in' feature to google search, allows you # | |
# to find out the time in any region, works like # | |
# population and date. # | |
# Added wiki_line option to expand results. # | |
# .7: Added input/output encoding conversion to better # | |
# realize the multi-language side of this script. # | |
# Corrected mistake in input/output encoding handlers. # | |
# Added a triple lookup for youtube to include all # | |
# possible results and not miss any. # | |
# Corrected issue with wikipedia/wikimedia incorrectly # | |
# removing some elements as page markups. # | |
# Added ability for bold to be seen in wikipedia/wikimedia | |
# results again, removed stripcodes. # | |
# .7a: Expanded Wikimedia and Wikipedia for allowing multi- # | |
# language as well as regional dialects. This also # | |
# allows for expanded custom encoding coverage. # | |
# .7b: Corrected google to return useful results once again. # | |
# broken was define, no_search, did_u_mean, and # | |
# weather. # | |
# Ebay now expanded upon to allow 'store' results to # | |
# appear as well as functional 'did you mean' # | |
# messaging. # | |
# .7c: Added remaining onebox results to google results. # | |
# .8: New features corrected longstanding shortcomings: # | |
# * Wikipedia/Wikimedia now fully decode and encode # | |
# on the fly and translate subtags seamlessly. # | |
# * Main encoding routine now includes a smart URL # | |
# encoder for those using language other than # | |
# english. # | |
# Corrected problem with script handling tcl special # | |
# characters as part of user input. # | |
# .8a: All did you mean messages now report from page exactly # | |
# as they appear. All sites that allow this now # | |
# handle this ability if no results are found. # | |
# .8b: Corrected deficiencies in !translate, it should now # | |
# function better regarding encodings and html # | |
# markups. thx perplexa. # | |
# Corrected minor problem regarding wikipedia's recent # | |
# template change. Now uses similar style as # | |
# wikimedia to prevent issues. # | |
# .8c: Corrected google video as well as added the whois # | |
# onebox to regular google searches. # | |
# Corrected way define: links are handled so encodings # | |
# are dealt with properly. # | |
# .8d: Corrects issue with myspace and regional IP bases. # | |
# .8e: Corrects google video to produce results. # | |
# .8f: Added vocabulary aversion. # | |
# Corrected flaw with wikimedia's encoding process, # | |
# improved overall functionality. # | |
# .8g: Added domain detection for wikimedia domain's which # | |
# aren't using the standard subdomain /wiki. # | |
# .8h: Corrected !torrent # | |
# .8i: Corrected google zipcodes and google video. # | |
# .8j: Corrected youtube and google groups. # | |
# .8k: Corrects some urlencoding problems regarding eggdrops # | |
# complete inability to distinguish between utf-8 # | |
# and iso8859-1. Now requires http 2.5 which allows # | |
# setting the -urlencoding flag. # | |
# Corrects entire script which now uses the -urlencoding # | |
# flag in some way to hopefully force eggdrop to # | |
# understand the differences and force proper # | |
# detections. # | |
# * requirements upped, now requries http 2.5 * # | |
# .8l: Corrects google search (calculations, did_you_mean,etc)# | |
# Corrects google book # | |
# -- experimental version -- # | |
# Adds "automagic" detection to google translations # | |
# Possiblity for more automagic detection in the future # | |
# support procedures in place to allow this already. # | |
# .8m: Adds more "automagic" detection and a more robust # | |
# debugging display. # | |
# Corrected minor display problems. # | |
# .8n: Corrects Googles embolding placement within results, # | |
# can now interpret <em> tags as bold. # | |
# .8o: Added correct support for a true utf-8 workaround. # | |
# .8p: Added proper redirect support. # | |
# Corrected Youtube behavior. # | |
# .8q: Corrected Dailymotion, added multilanguage support to # | |
# it and extended it's capabilities. # | |
# .8r: Corrected minor youtube url inconsitancy. # | |
# .8s: Corrected result totals to appear again for all google # | |
# sites, also corrected other google anamolies. # | |
# Corrected local as well to work with custom locations. # | |
# Added mediawiki customized triggers to allow access # | |
# to mediawiki sites without so much input required. # | |
# .8t: Google template changed, <div class=g -> <li class=g # | |
# .8u: Added full support for session cookies as well as # | |
# unlimited redirect support. This allows adding # | |
# the secondary ebay template for their store server # | |
# and allows ebay to function 100% again. # | |
# .8v: Added back support for !game and !review and elaborated# | |
# upon the amount of information displayed. # | |
# .8w: Added new abilities to both !locate and !trans now # | |
# allows much less input from the user and default # | |
# behavior. # | |
# Also correct other slight anomalies. # | |
# .8x: Corrected ebay finally, yay! also added sorry detection# | |
# to google so users experiencing this can tell. Also # | |
# fixed the html cruft in gamespot review replies. # | |
# .8y: Corrected youtube, now more compliant with all templates | |
# returned # | |
# .8z: Corrected video and group functionality. # | |
# Added scholar for parsing scholar.google.* # | |
# .9: Corrected video and youtube to work with website # | |
# re-designs. # | |
# Other minor tweaks here and there. # | |
# .9a: Corrected local, google define and google did-you-mean # | |
# .9b: Corrected more problems with parsing, might still be # | |
# a few. This is just a test version to see if this # | |
# does solve them. # | |
# .9c: Addded a crude work around to allow youtube to remain # | |
# in the language chosen, even tho redirecting is # | |
# occuring. # | |
# .9e: Corrected ability to split lines and now keeps bolding # | |
# and underlining intact perfectly. # | |
# Corrected !news to return results again. # | |
# Modified all procs in some way to allow the split line # | |
# correction noted above, no longer should \017 ever # | |
# be used. # | |
# Corrected !scholar to return accurate results. # | |
# Added short_answers config variable for google results.# | |
# .9e: Corrected !google weather replies. # | |
# Removed !top and !pop, gamerankings removed support. # | |
# Added !best and !worst, gamerankings added support. # | |
# Added support for color splitting and color themes. # | |
# .9f: Corrected split routine for those using \n as seperator# | |
# .9g: Added custom triggers with phrasing. # | |
# .9h: Corrected bug in custom triggers, now works properly. # | |
# Corrected color theme enforcement (not everything was # | |
# following it correctly, now it does) # | |
# .9i: Corrected slight bugs in some procs. # | |
# Corrected !news and !video. # | |
# Combined custom wiki into custom trigger phrases. # | |
# .9j: Corrected google weather. # | |
# Corrected remaining bugs with themes. # | |
# .9k: Corrected !local # | |
# .9l: Corrected !local again.. stop it google :P # | |
# Corrected !torrent no-search results message appears # | |
# along with it's did-you-mean results. # | |
# Corrected issue regarding setting results to zero # | |
# and some commands still triggering. # | |
# Corrected small bug with google weather replies when # | |
# custom themes are in use. # | |
# .9m: Corrected alot of broken things, fixed a few things. # | |
# Basically forgot what these were as this was done # | |
# over the course of several weeks and I didn't # | |
# document any of it.. DOH! # | |
# .9n: Corrected google weather and cruft html elements within# | |
# some google no-results-found messages. # | |
# .9o: Corrected bug within google video display and fixed # | |
# ebay parsing. # | |
# .9p: Added input/output encoding abilities for google # | |
# translations. This appears to corrects accented # | |
# character problem and misdetected encodings. # | |
# .9q: Added HD filter switch for youtube videos. # | |
# Added proxy support for main fetch_html routine. # | |
# Added Gzip support for wikipedia/media. # | |
# Corrected Google define mechanism. # | |
# .9r: Added full support for gzipped downloading of webpages # | |
# this should be sorta faster as well as less to # | |
# download doing all this, enjoy. # | |
# .9s: Added ability to enable/disable gzipped support as this# | |
# breaks functionality (eggdrop's utf-8 bug) for some # | |
# languages. # | |
# Corrected youtube and ebay. # | |
# .9t: Corrected google's zipcode and time queries. # | |
# Corrected utf-8 output, all queries should now appear # | |
# correct and in proper utf-8.. yay! # | |
# .9u: Corrected google results, fight, video, youtube, news # | |
# and some other things I forgot about. # | |
# Corrected short_answers, created new option skip_self # | |
# to deal with google self-injecting results. # | |
# Corrected google did_you_mean and no_results messages # | |
# once again. Stop changing so often google, jeez.. # | |
# .9v: Corrected wikipedia/wikimedia #achor lookup method, it # | |
# it's now more accurate and much faster. # | |
# Corrected minor inconsistancies with some procedures. # | |
# Corrected google weather for multilanguage replies. # | |
# .9w: Corrected google weather yet again! stop changing things | |
# so often google, jeez.. # | |
# Corrected translate to use new templates. yes, google # | |
# was busy updating all their templates :( # | |
# Added new feature to custom trigger phrasing: # | |
# * ability to query by index as well as entire # | |
# sentence.. # | |
# .9x: Corrected google "spell" to always return results or # | |
# did-you-mean. # | |
# Added "special searches" to google searching. # | |
# Corrected population/public_data searches to use new # | |
# template created for these. Is not given as a google | |
# "answer" anymore. # | |
# .9y: Corrected: !news !game !review -- gamespot added # | |
# backslash escape protection to it's ajax replies to# | |
# prevent injection from happening with chars.. # | |
# .9r1: Corrected too many things to list, google went on a # | |
# spree and changed templates on lots of different # | |
# things causing lots of functionality to break. # | |
# suffice to say it's fixed. Most of it. Good show # | |
# google, but it's now your move again. This game of # | |
# chess is certainly fun.. # | |
# .9r2: Corrected Google's oneboxes, specifically time and # | |
# maps. # | |
# .9r3: Corrected !ebay, !dailymotion, !ign, !myspace . # | |
# Deprecated functions: !scholar / !google movie:* # | |
# !scholar will be removed, and changed to something # | |
# else google-y. # | |
# !google movie:* will be re-incorporated later. # | |
# 2.00a: alot corrected, broken regexps, and more.. # | |
# .... : stuff # | |
# 2.1x : more stuff, this version number shall be re-used # | |
# for infinity onward. Keep track of the date of the # | |
# revision below, or the date at top of script to know # | |
# any of that irrelevant stuff. # | |
# # | |
# TODO:........................................................ # | |
# # | |
# Fix broken parsers, this is a never-ending battle! # | |
# -- This is always #1 priority over anything else -- # | |
# # | |
# Correct error detection mechanisms to use exact same as # | |
# "webby". # | |
# # | |
# Solve inconsitancies in some countries total results and # | |
# inaccurate parsing due to differing html templates. # | |
# This includes missing result totals, condense entire # | |
# result grabbing to it's own procedure eventually akin # | |
# to fetch_html but for parsing total results, easier to # | |
# maintain that way then spread out individually amongst # | |
# each procedure. # | |
# # | |
# Once everything above is done we can start on these: # | |
# Clean-up code where obvious hacks were left in, code them # | |
# correctly, remove debugging code from procs which is # | |
# presently commented out. # | |
# Clean-up overly messy code that can be solved by coding # | |
# cleaner modules and not reusing so much code. # | |
# # | |
# For this UNOFFICIAL version please direct any and all # | |
# Suggestions/Thanks/Bugs to the forum link below: # | |
# --> http://forum.egghelp.org/viewtopic.php?t=13586 <-- # | |
# # | |
# LICENSE:..................................................... # | |
# # | |
# This code comes with ABSOLUTELY NO WARRANTY. # | |
# # | |
# This program is free software; you can redistribute it # | |
# and/or modify it under the terms of the GNU General Public # | |
# License as published by the Free Software Foundation; # | |
# either version 2 of the License, or (at your option) any # | |
# later version. # | |
# # | |
# This program is distributed in the hope that it will be # | |
# useful, but WITHOUT ANY WARRANTY; without even the implied # | |
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR # | |
# PURPOSE. See the GNU General Public License for more # | |
# details. (http://www.gnu.org/copyleft/library.txt) # | |
# # | |
# CREDITS:..................................................... # | |
# # | |
# ..Officially: # | |
# Copyright (C) 2005, Jordan (Incith) # | |
# Currently maintained by madwoota # | |
# google@woota.net # | |
# # | |
# ..Unofficially: # | |
# Copyleft (C) 2006-2012, Speechless # | |
# http://ereader.kiczek.com/scripts # | |
# v2.1x - January 28th, 2o12 - speechles <#roms-isos@efnet> # | |
#---------------------------------------------------------------# | |
# EVERYTHING IN THIS SECTION IS USER CUSTOMIZABLE. | |
# BEST SETTINGS ARE DEFAULT, YOU MAY HAVE OTHER IDEAS OF WHAT IS BEST. | |
# | |
# NOTE: some config options won't list how to enable/disable, but | |
# 0 will typically disable an option (turn it off), otherwise a | |
# value 1 or above will enable it (turn it on). | |
# ------ | |
# start of configuration - make your changes in this section | |
# ------ | |
namespace eval incith { | |
namespace eval google { | |
# set this to the command character you want to use for the binds | |
# ------ | |
variable command_char "." | |
# set these to your preferred binds ("one two three etc etc" - space delimited!) | |
# ------ | |
variable google_binds "google goog" | |
variable image_binds "gi image images" | |
variable local_binds "gl local" | |
variable group_binds "gg group groups" | |
variable news_binds "gn news" | |
variable print_binds "gb book books" | |
variable video_binds "gv video" | |
variable scholar_binds "sc scholar" | |
variable fight_binds "fight googlefight" | |
variable youtube_binds "youtube" | |
variable locate_binds "geo loc locate" | |
variable gamespot_binds "game gamespot" | |
variable trans_binds "trans translate" | |
variable daily_binds "daily dailymotion" | |
variable gamefaq_binds "gamefaq gamefaqs" | |
variable blog_binds "blog blogsearch" | |
variable ebay_binds "ebay" | |
variable efight_binds "ebayfight" | |
variable popular_binds "best great bestest" | |
variable rev_binds "review" | |
variable wiki_binds "wikipedia" | |
variable wikimedia_binds "wikim wikimedia" | |
variable recent_binds "worst crap" | |
variable mininova_binds "torrent mininova" | |
variable ign_binds "ign igame" | |
variable myspacevids_binds "myspace myvids" | |
variable trends_binds "trends" | |
variable helpbot_binds "ghelp" | |
# to restrict input queries to Ops (+o), Halfops (+h) or Voiced (+v) users on | |
# any +google channel, use this setting. | |
# set the variable to one of the following to achieve the desired filtering: | |
# at least Op -> 3 (obvious) | |
# at least Halfop -> 2 (will also allow ops) | |
# at least Voice -> 1 (will also allow halfops and ops) | |
# everyone -> 0 (no filtering) | |
# | |
# note: this does NOT apply to private messages, use the below setting for them. | |
# ------ | |
variable chan_user_level 0 | |
# if you want to allow users to search via private /msg, enable this | |
# ------ | |
variable private_messages 1 | |
# as per emailed & forum requests, use the next two variables together | |
# to determine the output type like so: | |
# notice_reply 1 & force_private 1 = private notice reply only (this is as requested) | |
# notice_reply 0 & force_private 1 = private msg reply only | |
# notice_reply 1 & force_private 0 = regular channel OR private NOTICE | |
# notice_reply 0 & force_private 0 = regular channel OR private MSG (default) | |
# set to 1 to enable a /notice reply instead, 0 for normal text | |
# ------ | |
variable notice_reply 0 | |
# set to 1 to force all replies to be private | |
# ------ | |
variable force_private 0 | |
# set this to the language you want results in! use 2 letter form. | |
# "all" is the default/standard google.com search. | |
# see http://www.google.com/advanced_search for a list. You have to use | |
# the 'Language' dropdown box, perform a search, and find a line in the URL | |
# that looks like "&lr=lang_en" (for English). "en" is your language code. | |
# popular Ones: it (italian), da (danish), de (german), es (spanish), fr (french) | |
# please note, this does not 'translate', it searches Google in a | |
# language of choice, which means you can still get English results. | |
# ------ | |
# NOTE: Changing this from "all" will effectively disable some of the | |
# multi-language features of this script, doing so is not advised. | |
# ------ | |
variable language "all" | |
# set this to "on" to let google filter "adult content" from any of your search results | |
# "off" means results will not be filtered at all | |
# note: this is only applicable to !google, !images and !groups | |
# ------ | |
variable safe_search "on" | |
# number of search results/image links to return, 'define:' is always 1 as some defs are huge | |
# ------ | |
variable search_results 2 | |
variable image_results 0 | |
variable local_results 0 | |
variable group_results 0 | |
variable news_results 0 | |
variable print_results 0 | |
variable video_results 0 | |
variable scholar_results 0 | |
variable youtube_results 0 | |
variable locate_results 1 | |
variable gamespot_results 0 | |
variable trans_results 0 | |
variable daily_results 0 | |
variable gamefaq_results 0 | |
variable blog_results 0 | |
variable ebay_results 0 | |
variable popular_results 0 | |
variable rev_results 0 | |
variable wiki_results 1 | |
variable wikimedia_results 1 | |
variable recent_results 0 | |
variable mininova_results 0 | |
variable ign_results 0 | |
variable myspacevids_results 0 | |
variable trends_results 0 | |
variable helpbot_results 1 | |
# This part was requested to be added so now here it is, it has | |
# various prepends you may wish to have preceed each function. | |
# To use this, just change what you see below from nothing to | |
# something...ie, if you want [ GOOGLE ] to prepend google | |
# search results change the search_prepend to "\[GOOGLE\]". You | |
# can do the same with all of the following prepends, they will | |
# start the output for each line. If you don't wish to use this, | |
# leave them as "". Keep in mind tcl special characters MUST be | |
# escaped or will cause tcl errors, and/or crash your bot. This | |
# is your own problem, just be aware. Read about them if possible. | |
# | |
# Note 1: Prepends will increase your line length, and won't be | |
# accommodated for in the max line length setting, so you may | |
# find you need to lower your max line length setting if your | |
# prepends are lengthy or contain lots of escape sequences. If | |
# you don't you may find the bots replys may get cut short or | |
# cut completely by the ircd your using. | |
# | |
# Note 2: To use color, bold, etc.. simply use the proper escape | |
# sequence to generate it here, make sure to properly CLOSE your | |
# sequence (\003 for color, \002 for bold, etc) or you will see | |
# the effect of the prepend bleed thru into your output as well. | |
# ------ | |
variable search_prepend "" | |
variable image_prepend "" | |
variable local_prepend "" | |
variable group_prepend "" | |
variable news_prepend "" | |
variable print_prepend "" | |
variable video_prepend "" | |
variable scholar_prepend "" | |
variable youtube_prepend "" | |
variable locate_prepend "" | |
variable gamespot_prepend "" | |
variable fight_prepend "" | |
variable ebayfight_prepend "" | |
variable trans_prepend "" | |
variable dailymotion_prepend "" | |
variable gamefaqs_prepend "" | |
variable blog_prepend "" | |
variable ebay_prepend "" | |
variable popular_prepend "" | |
variable rev_prepend "" | |
variable wiki_prepend "" | |
variable wikimedia_prepend "" | |
variable recent_prepend "" | |
variable mininova_prepend "" | |
variable ign_prepend "" | |
variable myspacevids_prepend "" | |
variable trends_prepend "" | |
# set this to 0 to turn google fight off (it is a tad slow after all ...) | |
# this also disables or enables ebay fights (it's even slower ...) | |
# ------ | |
variable google_fight 0 | |
# ** this is not an optional setting, if a string is too long to send, it won't be sent! ** | |
# it should be set to the max amount of characters that will be received in a public | |
# message by your IRC server. If you find you aren't receiving results, try lowering this. | |
# ------ | |
variable split_length 400 | |
# trimmed length of returned descriptions, only for standard searches. | |
# ------ | |
variable description_length 80 | |
# amount of lines you want your wiki* results to span, the more lines the more | |
# of the wiki article or section you will see, some get cut short if so raise this. | |
# this affects both wikipedia and wikimedia results. | |
# ------ | |
variable wiki_lines 2 | |
# short answers? when google search encounters an answer this | |
# option will make only it show, no other results. this also skips | |
# showing image/news/etc results from other google sites as results. | |
# ------ | |
variable short_answers 1 | |
# skip links to self? google sometimes uses links to it's own | |
# services within normal google searches. This will skip _any_ google | |
# links from appearing within google search results. For some | |
# queries this will omit obvious replies which is normal. | |
# ------ | |
variable skip_self 1 | |
# replace search terms appearing in the description as bolded words? | |
# -> does not bold entire description, just the matching search words | |
# -> this is ignored if desc_modes contains the Bold mode below. | |
# ------ | |
variable bold_descriptions 1 | |
# set this to 0 to turn off total results appearing with searches. | |
# ------ | |
variable total_results 1 | |
# set this to 1 to remove descriptions and set only links to show | |
# ------ | |
variable link_only 0 | |
# set this to the default country you would like *.wikipedia to use when | |
# no country is specified. default is "en". country is 2-letter wiki code. | |
# http://*.wikipedia.org/ - en, de, it, es, fr, these are examples. | |
# ------ | |
variable wiki_country "en" | |
# set this to the default website you would like wikimedia to use when | |
# no website is specified. | |
# ------ | |
variable wikimedia_site "wiki.gbatemp.net/wiki" | |
# Wikimedia URL detection | |
# remove double entries from urls? would remove a '/wikisite' from this | |
# type of url @ http://yoursite.com/wikisite/wikisite/search_term | |
# if you have issues regarding url capture with wikimedia, enable this. | |
# /wiki/wiki/ problems are naturally averted, a setting of 0 already | |
# stops these type. | |
# -------- | |
variable wiki_domain_detect 1 | |
# Customized Trigger Phrasing? | |
# allow customized triggers to be attached to custom phrasing | |
# Anything other than 0 will enable and will use the list below. | |
variable my_custom 0 | |
# Custom Trigger Phrasing | |
# This is used to customize triggers and for | |
# constructing phrases to pass, format is: | |
# "custom-trigger:trigger-to-associate-with:phrase-to-pass" | |
# within the phrase-to-pass, %search% = the users input.. but, | |
# if this is passed onto another custom trigger it will become | |
# the enitre phrase which was passed from the trigger before it. | |
# hopefully people understand how to use these, and remember | |
# to read the lines below this at least twice before | |
# constructiong your phrasing... | |
# DO NOT USE YOUR COMMAND CHAR IN THESE IT IS ASSUMED. | |
# special tcl characters MUST be escaped for you to acheive greatness. | |
variable my_customs { | |
"ch:g:%search% +site:computerhope.com" | |
"eh:g:%search% +site:egghelp.org" | |
"mi:g:%search% +site:mircscripts.org" | |
"rw:wm:.wiki.roms-isos.com %search%" | |
"gw:wm:.wiki.gbatemp.net/wiki %search%" | |
"ed:wm:.encyclopediadramatica.ch %search%" | |
"un:wm:.uncyclopedia.wikia.com %search%" | |
"wq:wm:.en.wikiquote.org/wiki %search%" | |
"lw:wm:.lyricwiki.org %search%" | |
"wk:wm:.en.wiktionary.org/wiki %search%" | |
"bible:wm:.biblewiki.be/wiki %search%" | |
"znc:wm:.en.znc.in/wiki %search%" | |
"gbr:g:.com.br %search%" | |
"got:g:%search% +ext:torrent" | |
"rs:g:%search% +inurl:rapidshare" | |
"rsmp3 r3 rs3:rs:%search% inurl:mp3" | |
"kiczek:gf:%search% in usa" | |
"mysite:g:+site:%%1%% +ext:%%2%% %%3-end%%" | |
"cg:g:+inurl:%%1%%.craigslist +%%2-end%%" | |
"kt:g:%search% +site:kotaku.com" | |
"gay:f:%search% +ass +gay vs %search% +vagina -gay" | |
"yt:g:%search% site:youtube.com" | |
"ts:g:%search% site:twitter.com" | |
"ft:wm:.futurama.wikia.com %search%" | |
"fg:wm:.familyguy.wikia.com %search%" | |
"ad:wm:.americandad.wikia.com %search%" | |
"sp:wm:.southpark.wikia.com %search%" | |
"sw:wm:.starwars.wikia.com %search%" | |
"st:wm:.malf.wikia.com %search%" | |
"na:wm:.naruto.wikia.com %search%" | |
"in:wm:.inuyasha.wikia.com %search%" | |
"gr:wm:.gremlins.wikia.com %search%" | |
"wow:wm:.wowwiki.com %search%" | |
"smf:wm:.smurfs.wikia.com %search%" | |
"sm:wm:.sailormoon.wikia.com %search%" | |
"pk:wm:.pokemon.wikia.com %search%" | |
"ss:wm:.strawberryshortcake.wikia.com %search%" | |
"mlp:wm:.mlp.wikia.com %search%" | |
"lps:wm:.lps.wikia.com %search%" | |
"ant:wm:.ants.wikia.com %search%" | |
"gm:wm:.gaming.wikia.com %search%" | |
"nt:wm:.nothing.wikia.com %search%" | |
"ff:wm:.finalfantasy.wikia.com %search%" | |
"ok:wm:.openkinect.org/wiki %search%" | |
"bl:wm:.borderlands.wikia.com %search%" | |
"egg:wm:.eggwiki.org %search%" | |
"am amz amazon:g:%%2-end%% site:amazon%%1%%" | |
"nazi:tr:@de %search%" | |
"jew:tr:@pl %search%" | |
"yank:tr:@en %search%" | |
} | |
# this controls custom trigger phrasing query control. | |
# with this you can split the users search into individual | |
# words, and use these with your custom trigger above. | |
# suppose the user types your custom trigger | |
# <user> !rsmp3 tupac mama | |
# you can reference this in your custom trigger as: | |
# %search% to get the entire text: tupac mama | |
# but, suppose you want individual words, tupac and mama | |
# well now you can reference these too as %%1%% and %%2%%. | |
# you can also use ranges %%1-4%% %%1-end%%. Unlike eggdrop | |
# 1 is the starting index of the users input, not 0. | |
# this works in combination with %search%, but for indexes | |
# you _MUST_ reference within %%'s (double percents).. | |
# hopefully you understand how this functions.. ;) | |
# any setting 1 or higher enables, 0 or lower disables | |
# ------ | |
# NOTE: Leaving this enabled is advised if you use any double | |
# percent variables (%%1%% %%etc%%) in your my_customs list above. | |
# ------ | |
variable custom_words 1 | |
# set this to the proxy you wish the main html fetching procedure to | |
# use. set both proxy_host and proxy_port. if you don't wish to use | |
# a proxy. set proxy_host "" | |
# ------ | |
variable proxy_host "" | |
variable proxy_port "" | |
# set this to the default country you would like ebay.* to use when no | |
# country is specified. default is "com". country is ebay extension | |
# http://ebay.*/ - co.uk, de, es, com, com.au, these are examples. | |
# ------ | |
variable ebay_country "com" | |
# set this to the default country you would like *.google.* sites to use when | |
# no country is specified. default is "com". country is google extension. | |
# http://google.*/ - co.uk, de, es, com, com.au, these are examples. | |
# ------ | |
variable google_country "com" | |
# set this to the default country you would like dailymotion to use when | |
# no country is specified. default is "en" for international. | |
# http://dailymotion.com/*/ - en, us, es, fr, nl, pt, da, el, it, pl, ro, sv, tr, ja, ko, zh, these are examples. | |
# ------ | |
variable daily_country "en" | |
# set this to the default country you would like *.youtube to use when | |
# no country is specified. default is "com". country is youtube code. | |
# http://*.youtube.com/ - com, us, ie, fr, it, nl, br, gb, jp, de, es, pl, these are examples. | |
# ------ | |
variable youtube_country "com" | |
# enable this to allow youtube links to lead to higher definition videos | |
# rather than their stream optimized lower quality setting. | |
# to disable use 0, anything else enables. | |
# ------ | |
variable youtube_highquality 1 | |
# set this to the switch you want to use for youtube to filter content | |
# and display only high-definition videos. | |
# ------ | |
variable youtube_highdef "@hd" | |
# set your default translation language here, this is what will be assumed | |
# if the user omits the 'translate to' portion of their input. | |
# en, es, it, nl, de, etc.. these are merely some examples, there are more available. | |
# ------ | |
variable trans "en" | |
# Google translation input/output encodings | |
# set these below to either: | |
# 0 for automatic encoding | |
# 1 for utf-8 | |
# You may use switches to inverse this behavior on-the-fly. Set them | |
# below as well. | |
# ------ | |
variable trans_input 1 | |
variable trans_output 0 | |
variable trans_input_t "--swapi" | |
variable trans_output_t "--swapo" | |
# Channel filter | |
# this is for users who already have a google script running, but would | |
# like to use the other functions of this script. You can filter out google | |
# requests in any of the channels listed below. | |
# default is "". To add them use: "#chan1 #CHAN2 #cHaN3 #EtC", case is irrelevant. | |
# ------ | |
variable filtered "" | |
# COLOR THEME - THESE CAN BE SHARED WITH OTHERS ON EGGHELP! :P | |
# use these settings below to set your preferred color theme. | |
# the following modes apply and you can use any combination of them: (NO SPACES!) | |
# | |
# Bold = \002 | |
# Underline = \037 | |
# Reverse = \026 | |
# Colours: #RGB/Html code: | |
# White = \00300 #FFFFFF | |
# Black = \00301 #000000 | |
# Blue = \00302 #00007F | |
# Green = \00303 #008F00 | |
# Light Red = \00304 #FF0000 | |
# Brown = \00305 #7F0000 | |
# Purple = \00306 #9F009F | |
# Orange = \00307 #FF7F00 | |
# Yellow = \00308 #F0FF00 | |
# Light Green = \00309 #00F700 | |
# Cyan = \00310 #008F8F | |
# Light Cyan = \00311 #00F7FF | |
# Light Blue = \00312 #0000FF | |
# Pink = \00313 #FF00FF | |
# Grey = \00314 #7F7F7F | |
# Light Grey = \00315 #CFCFCF | |
# | |
# this example will do Bold, Underline and Light Blue: "\002\037\00312" | |
# note: this will affect *ALL* descs, links, totals and errors. also | |
# don't forget to use the \ too ! note: abusing this will heavily increase | |
# the number of characters per line, so your output lines will increase accordingly. | |
# | |
# COLOR CODES MUST CONSIST OF 2 DIGITS, IF YOU WISH TO USE 0-9 PREFIX | |
# IT WITH 0 ACCORDINGLY. IE, \00304 for red... | |
# IF YOU WISH TO USE BACKGROUNDS, THIS IS ALLOWED; IE, \00304,02... | |
# TO DEMODE A COLOR YOU MUST USE \00399 RATHER THAN SIMPLY \003 | |
# | |
# use *_modes to enable each color, bold, underline. | |
# use *_demodes to undo this back to plain text. | |
# if you do not use the proper modes/demodes here your color theme will look | |
# horrible... | |
# ------ | |
# description mode/demode | |
variable desc_modes "\00303" | |
variable desc_demodes "\003" | |
# link mode/demode | |
variable link_modes "\00312" | |
variable link_demodes "\003" | |
# totals mode/demode | |
variable total_modes "" | |
variable total_demodes "" | |
# error mode/demode | |
variable error_modes "\00304" | |
variable error_demodes "\003" | |
# break, seperator and split_char need more than modes | |
# you also enter the appropriate character you wish used. | |
variable break " @ " | |
variable seperator " | " | |
# if using "\n" within the seperator above, you may want to change | |
# the below setting to possibly to ", " or "; " | |
variable split_char " | " | |
# number of minute(s) to ignore flooders, 0 to disable flood protection | |
# ------ | |
variable ignore 1 | |
# how many requests in how many seconds is considered flooding? | |
# by default, this allows 3 queries in 10 seconds, the 4th being ignored | |
# and ignoring the flooder for 'variable ignore' minutes | |
# ------ | |
variable flood 4:30 | |
# would you like to use vocabulary aversion? | |
# this will replace swear words with more appropriate words | |
# and the query returned will be aversion free. | |
# 0 disables, anything else enables | |
#---------- | |
variable aversion_vocabulary 0 | |
# set your aversion vocabulary below if desired: | |
# remember to enable, keep the setting above at 1. | |
#---------- | |
variable aversion { | |
cunt:cock | |
cock:cunt | |
anal:internet | |
"hell:a hot place" | |
sex:troll | |
"fred:wasn't he a flintstone?" | |
*fuck*:nice | |
bitches:women | |
bitch:woman | |
"analsex:true love" | |
"supergear:licorice and pancakes" | |
"tecra:I LIKE LARGE POSTERIORS AND I CANNOT PREVARICATE!" | |
{word:"fuck you"} | |
} | |
#---> NOTE: | |
#---> IF YOUR PRIMARY LANGUAGE ISN'T ENGLISH YOU MUST CHANGE THIS SECTION BELOW POSSIBLY | |
# this is the help list generated by the bot to help users become familiar with the script. | |
# you can change these here to affect the language used when help is asked for. | |
# there MUST be 28 entries in this list, the first must be the word for ALL. | |
# this list MUST be kept entirely lowercase. | |
# ------ | |
variable helplist "all google images groups news local book video fight youtube translate gamespot gamefaqs blog ebay ebayfight wikipedia wikimedia locate review torrent top popular dailymotion ign myspace trends scholar" | |
# english words within the help phrases, spacing must be kept as it is below. | |
# ------ | |
variable helpmsg1 "Help is only available for the following:" | |
variable helpmsg2 "is disabled." | |
variable helpmsg3 "with " | |
variable helpmsg4 " results." | |
# the help messages given. | |
# ------ | |
variable help1 "\[.google.country.code\] \[define:|spell:\] <search terms> <1+1> <1 cm in ft> <patent ##> <weather city|zip> <??? airport>" ;#google | |
variable help2 "\[.google.country.code\] <search terms>" ;#images | |
variable help3 "\[.google.country.code\] <search terms>" ;#groups | |
variable help4 "\[.google.country.code\] <search terms>" ;#news | |
variable help5 "\[.google.country.code\] <what> near <where>" ;#local | |
variable help6 "\[.google.country.code\] <search terms>" ;#book | |
variable help7 "\[.google.country.code\] <search terms>" ;#video | |
variable help8 "<word(s) one> vs <word(s) two>" ;#fight | |
variable help9 "\[.youtube.country.code\] <search terms>" ;#youtube | |
variable help10 "region@region <text>" ;#translate | |
variable help11 "<search terms>" ;#gamespot | |
variable help12 "<system> in <region>" ;#gamefaqs | |
variable help13 "\[.google.country.code\] <search terms>" ;#blog | |
variable help14 "\[.ebay.country.code\] <search terms>" ;#ebay | |
variable help15 "<word(s) one> vs <word(s) two>" ;#ebayfight | |
variable help16 "\[.wiki-country-code\] <search terms>\[#subtag\]" ;#wikipedia | |
variable help17 "\[.www.wikisite.org\[/wiki\]\] <search terms>\[#subtag\]" ;#wikimedia | |
variable help18 "<ip or hostmask>" ;#locate | |
variable help19 "<gamename> \[@ <system>\]" ;#review | |
variable help20 "<search terms>" ;#torrent | |
variable help21 "<system>" ;#top | |
variable help22 "<system>" ;#popular | |
variable help23 "<search terms>" ;#dailymotion | |
variable help24 "<search terms>" ;#ign | |
variable help25 "<search terms>" ;#myspace | |
variable help26 "\[.google.country.code\] <YYYY-MM-DD>" ;#trends | |
variable help27 "\[.google.country.code\] <search terms>" ;#scholar | |
#---> END OF NOTE: | |
# enable encoding conversion, set this to 1 to enable. | |
# with this enabled it will follow the format of encoding conversions listed | |
# below. these will affect both input and output and will follow country switch. | |
# ------ | |
variable encoding_conversion_input 0 | |
variable encoding_conversion_output 1 | |
# enable dirty decoding? This attempts to use the regular "dirty" method | |
# of rendering html elements which works well with iso8859-1 and other | |
# latin variants. This does not work well at all with russian, japanese, | |
# and any other non-latin variants. So keep this at 0 if you want a truly | |
# multi-language bot, but keep in mind you may see unrendered &x12345; html | |
# elements. This is because I don't know of a method to transcode these | |
# to proper utf-8 characters yet.. :P | |
# ------ | |
# NOTE: If you bot is properly utf-8 patched, setting this to 1 is recommened. | |
# ------ | |
variable dirty_decode 1 | |
# enable gzip compression for bandwidth savings? Keep in mind | |
# this semi-breaks some of the present utf-8 work-arounds and | |
# eggdrop may mangle encodings when gzip compression that it | |
# doesn't when uncompressed html it used (default). A setting | |
# of 0 defaults to uncompressed html, a 1 or higher gzip. | |
# ------ | |
# NOTE: If you do not have Trf or zlib packages setting this | |
# to 0 is recommened. Leaving it at 1 is fine as well, as the | |
# script will attempt to find these commands or packages every | |
# rehash or restart. But to keep gzip from ever being used it | |
# is best to set the below variable to 0. | |
# NOTE2: If you have Trf or zlib packages present, then this | |
# should always be set to 1. You save enormous bandwidth and | |
# time using this. If your bot is patched and you have Trf/zlib | |
# then you should definitely leave this at 1 and you will never | |
# suffer issues. | |
# ------ | |
variable use_gzip 1 | |
# THIS IS TO BE USED TO DEVELOP A BETTER LIST FOR USE BELOW. | |
# To work-around certain encodings, it is now necessary to allow | |
# the public a way to trouble shoot some parts of the script on | |
# their own. To use these features involves the two settings below. | |
# -- DEBUG INFORMATION GOES BELOW -- | |
# set debug and administrator here | |
# this is used for debugging purposes | |
# ------ | |
variable debug 1 | |
variable debugnick speechles | |
# AUTOMAGIC | |
# with this set to 1, the bottom encode_strings setting will become | |
# irrelevant. This will make the script follow the charset encoding | |
# the site is telling the bot it is. | |
# This DOES NOT affect wiki(media/pedia), it will not encode automatic. | |
# Wiki(media/pedia) still requires using the encode_strings section below. | |
# ------ | |
# NOTE: If your bot is utf-8 pathced, leave this option at 1, the only | |
# time to change this to 0 is if your having rendering problems. | |
# ------ | |
variable automagic 1 | |
# UTF-8 Work-Around (for eggdrop, this helps automagic) | |
# If you use automagic above, you may find that any utf-8 charsets are | |
# being mangled. To keep the ability to use automagic, yet when utf-8 | |
# is the charset defined by automagic, this will make the script instead | |
# follow the settings for that country in the encode_strings section below. | |
# ------ | |
# NOTE: If you bot is utf-8 patched, set this to 0. Everyone else, use 1. | |
# ------ | |
variable utf8workaround 0 | |
# encoding conversion lookups | |
# here is where you can correct language encoding problems by pointing their | |
# abbreviation towards an encoding. if you want more, feel free to add more. | |
# this is a somewhat poor example below, there are possibly hundreds of additions | |
# that need to be added to this section, this is just something to see if this | |
# indeed is a work around, enjoy and merry christmas ;P | |
# ------ | |
# NOTE: If your bot is utf-8 patched, the below list is irrevelevant. | |
# NOTE2: If your bot isn't utf-8 patched and Trf/zlib are found and used, the below | |
# list is used to correct latin encodings, this is how the list starts by default. | |
# NOTE3: If your bot isn't utf-8 patched, and Trf/zlib are NOT found, the below | |
# list is to correct utf-8 encodings, as well as various latin encodings. You | |
# may need to add things to this list possibly to correct rendering problems. | |
# ------ | |
variable encode_strings { | |
} | |
} | |
} | |
# ------ | |
# end of configuration, script begins - changes beyond this section aren't advised. | |
# ------ | |
# *** DO NOT CHANGE THINGS BEYOND THIS POINT UNLESS YOU KNOW WHAT YOUR DOING *** | |
# If you know what your doing, well by all means, change anything and everything, | |
# but do so with the understanding that all modifications are bound by the | |
# GNU General Public license agreement found above regarding credit for authors | |
# and general copyrights. | |
# ------ | |
# requires http package | |
package require http 2.5 | |
# if gzip requested, Trf or zlib required. | |
if {$::incith::google::use_gzip > 0} { | |
if {([lsearch [info commands] zlib] == -1) && ([catch {package require zlib} error] !=0)} { | |
if {([catch {package require Trf} error] == 0) || ([lsearch [info commands] zip] != -1)} { | |
putmainlog "Incith:Google compression test successful, found Trf package! Gzip enabled." | |
set incith_trf 1 | |
set incith_hdr "Accept-Encoding gzip,deflate" | |
} else { | |
putmainlog "Incith:Google unable to find zlib or trf package! Gzip disabled." | |
putmainlog "Incith:Google requires gzip decompression with wikipedia and Wikimedia. As a result, every article will not work for you." | |
set incith_nozlib 1 | |
set incith_hdr "" | |
} | |
} else { | |
putmainlog "Incith:Google compression test successful, found zlib package! Gzip enabled." | |
set incith_hdr "Accept-Encoding gzip,deflate" | |
} | |
} else { | |
set incith_nozlib 1 | |
set incith_hdr "" | |
} | |
# set flag per channel use | |
setudef flag google | |
# initialize | |
namespace eval incith { | |
namespace eval google { | |
variable version "incith:google-2.1x" | |
variable encode_strings [split $encode_strings] | |
} | |
} | |
# bind the public binds | |
bind pubm -|- "*" incith::google::public_message | |
# bind the private message binds, if wanted | |
if {$incith::google::private_messages >= 1} { | |
bind msgm -|- "*" incith::google::private_message | |
} | |
namespace eval incith { | |
namespace eval google { | |
# performs a search on google. | |
# | |
proc google {input} { | |
# local variable initialization | |
set results 0 ; set calc 0 ; set break 0 ; set spell 0 ; set output ""; set match "" | |
set populate 0 ; set titem "" ; set no_search "" ; set did_you_mean "" ; set titen "" | |
# can't be moved to fetch_html since $spell isn't global | |
if {[string match -nocase "*spell:*" $input] == 1} { | |
set spell 1 | |
} | |
# fetch the html | |
set html [fetch_html $input 1] | |
# this isn't global, so we need to keep ctry (country) here | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titen input | |
if {$titen == ""} { | |
set titen "${incith::google::google_country}" | |
} else { | |
set titen [lindex [split $titen /] 0] | |
} | |
# standard fetch_html error catcher | |
if {[string match -nocase "*socketerrorabort*" $html]} { | |
regsub {(.+?)\|} $html {} html | |
return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if {[string match -nocase "*timeouterrorabort*" $html]} { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
regsub -- {<div id=ss-box>.*?</div><div>} $html {} html | |
# strip out 'did you mean?' first | |
# what do we call 'no search results in any language?' | |
if {![regexp -nocase -- {</div><div id=res class=med>(.+?)<p style} $html - no_search]} { | |
if {![regexp -nocase -- {</div><div id=res class=med>(.+?)<p style} $html - no_search]} { | |
if {![regexp -nocase -- {</script><div id=res>(.+?)<br><br>} $html - no_search]} { | |
if {![regexp -nocase -- {<div id=res class=med>.*?<p>(.+?)<p style} $html - no_search]} { | |
if {![regexp -nocase -- { </div><div class=med.*?>(.*?)\.<br><br>} $html - no_search]} { | |
if {![regexp -nocase -- {<p class=sp_cnt>(.*?)<a id} $html - no_search]} { | |
regexp -nocase -- {<div class=med><p style=.*?>(.*?)<a id} $html - no_search | |
} | |
} | |
} | |
} | |
} | |
} | |
if {$no_search != ""} { | |
regsub -- {^.*?</h2>} $no_search "" no_search | |
regsub -- {</a>.*?<div class=med style=.*?>} $no_search "</a>" no_search | |
regexp -- {^(.+?)</td></tr>} $no_search - no_search | |
regsub -- {</a>} $no_search "? " no_search | |
regsub -all -- {<(.+?)>} $no_search { } no_search | |
while {[string match "* *" $no_search]} { | |
regsub -all -- { } $no_search " " no_search | |
} | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $no_search {} no_search | |
} | |
set no_search [string trim $no_search] | |
} | |
# give results an output header with result tally. | |
if {![regexp -- {<div id=prs>.*?</div><p>(.+?)\s\002(.+?)\(\002} $html - titem match]} { | |
if {![regexp -- {<p id=resultStats> (.*?) (.*?)\(\002} $html - titem match]} { | |
if {[regexp -- {<div id=resultStats>(.*?)\(} $html - match]} { | |
set match [split [string trim $match]] | |
set titem [lindex $match end] | |
set match [lindex $match end-1] | |
} else { | |
set match "Google" | |
set titem "" | |
} | |
} | |
} | |
regsub -all -- {<(.+?)>} $match {} match | |
regsub -all -- {<(.+?)>} $titem {} titem | |
# format output according to variables. | |
if {$incith::google::total_results != 0 && $spell == 0} { | |
set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
# parse the html | |
set loopy 0 | |
regsub -nocase {^.+<div id="topstuff">} $html {} html | |
while {$results < $incith::google::search_results} { | |
# the regexp grabs the data and stores them into their variables, while | |
# the regsub removes the data, for the next loop to grab something new. | |
# check if there was an alternate spelling first | |
if {([string match "*<p class=ssp>*" $html] || [string match "*<p class=sp_cnt>*" $html] || [string match "*</div><div id=res class=med><p>*" $html] || [string match "*</div><div id=res class=med>*<li><p>*" $html])&& [string match "define:*" $input] == 0 && [string match "*&nocalc=1\">*" $html] == 0} { | |
if {[regexp -nocase -- {</div><div id=res class=med><p>(.+?)<a href=.*?>(.+?)</a>} $html - titem did_you_mean]} { | |
regsub -all -nocase -- {</div><div id=res class=med><p>(.+?)</a>} $html {} html | |
regexp -- {^(.*?)</h2>} $titem - titem | |
} elseif {[regexp -nocase -- {</div><div id=res class=med><h2 class=hd>.*?<p>(.+?)<a href=.*?>(.+?)</a>} $html - titem did_you_mean]} { | |
regsub -all -nocase -- {</div><div id=res class=med><h2 class=hd>.*?<p>.+?<a href=.*?>.+?</a>} $html {} html | |
} elseif {[regexp -nocase -- {</div><div id=res class=med><!--a--><h2 class.+?>.*?<p>(.*?)<a href=.*?>(.+?)</a>} $html - titem did_you_mean]} { | |
regsub -all -nocase -- {</div><div id=res class=med><!--a--><h2 class.+?>.*?</a>} $html {} html | |
} elseif {[regexp -nocase -- {<td id=rhspad></table><div id=res class=med><p>(.+?)<a href=.*?>(.+?)</a>} $html - titem did_you_mean]} { | |
regsub -all -nocase -- {<td id=rhspad></table><div id=res class=med><p>.+?<a href=.*?>.+?</a>} $html {} html | |
} elseif {[regexp -nocase {<p class=sp_cnt>(.*?)<a href=.*?>(.*?)</a>} $html - titem did_you_mean]} { | |
regsub -all -nocase -- {<p class=sp_cnt>} $html {} html | |
} elseif {[regexp -nocase {<p class=ssp>(.*?)<a href=.*?>(.*?)</a>} $html - titem did_you_mean]} { | |
regsub -all -nocase -- {<p class=ssp>} $html {} html | |
} | |
# sometimes calculator results are mixed into our alternate spelling. | |
# we want to show these like we do our 'did you mean' | |
if {[string match "*<img src=/images/calc_img*" $titem] == 1} { | |
regexp -nocase -- {calc_img.+?nowrap.*?>(.+?)</td></tr>} $titem - titem | |
set desc $titem | |
if {$::incith::google::short_answers > 0 } { | |
regsub -all -- {<(.+?)>} $desc "" desc | |
return "${::incith::google::desc_modes}$desc" | |
} | |
} else { | |
set desc "$::incith::google::total_modes$titem$incith::google::total_demodes$incith::google::desc_modes$did_you_mean$incith::google::desc_demodes" | |
} | |
if {$incith::google::bold_descriptions == 0 && [string match "\002" $incith::google::desc_modes] == 1} { | |
regsub -all -- "\002" $desc {} desc | |
} | |
regexp -- {^(.+?)</td></tr>} $desc - desc | |
regsub -all -- {<(.+?)>} $desc "" desc | |
# did you mean and calculate have no link | |
set link "" | |
### ONEBOX RESULTS ### | |
# answers | |
# } elseif {[string match "*<div id=res class=med role=main><div class=e><h3 class=r><a href=*" $html]} { | |
# if {![regexp -- {<div id=res class=med role=main><div class=e><h3 class=r><a href="http\://www.google.com/url\?q=(.+?)\&ei=.*?">(.*?)</h3><div} $html - link desc]} { | |
# if {![regexp -- {<h3 class=r.*?<a href="(.*?)\&hl=.*?<div style=.*?>(.*?)</div>.*?<cite>(.*?)</cite>} $html - link desc url]} { | |
# if {[regexp -- {<div class=e><h3 class=r><a href="(.*?)".*?>(.*?)</a>} $html - link desc]} { set url "www.google.${titen}" } | |
# } | |
# set link "http://$url$link" | |
# } | |
# regsub -- {<div id=res class=med><div class=e><h3 class=r><a href=.+?</h3><div} $html "" html | |
# if {[info exists desc]} { | |
# regsub -- {<(.+?)>} $desc "" desc | |
# if {$::incith::google::short_answers > 0 } { | |
# if {[info exists link]} { | |
# return "${::incith::google::desc_modes}[descdecode $desc]$incith::google::desc_demodes$::incith::google::break${::incith::google::link_modes}$link${::incith::google::link_demodes}" | |
# } else { | |
# return "${::incith::google::desc_modes}[descdecode $desc]$incith::google::desc_demodes" | |
# } | |
# } | |
# } | |
# more answers | |
} elseif {[string match "*\{google.rrep('answersrep'*" $html]} { | |
regexp -- {<div id=res class=med role=main>.*?<h3 class=r>(.*?)</h3>} $html - desc | |
regsub -all -- {google.rrep\('answersrep'} $html {} html | |
if {$::incith::google::short_answers > 0 } { return "${::incith::google::desc_modes}[descdecode [string map {\002 ""} $desc]]$incith::google::desc_demodes" } | |
# time: | |
} elseif {[string match "*<table cellpadding=0 class=obcontainer>*" $html] == 1} { | |
if {[regexp -nocase -- {<table cellpadding=0 class=obcontainer><tr><td valign=top width=100%><div><table cellspacing=0><tr><td style="font-size:medium">(.*?)</table>} $html - desc]} { | |
regsub -- {<br>} $desc ". " desc | |
regsub -all {<table cellpadding=0 class=obcontainer>} $desc "" desc | |
if {$::incith::google::short_answers > 0 } { return "$::incith::google::desc_modes[descdecode $desc]" } | |
set link "" | |
} | |
# area codes | |
} elseif {[string match "*/images/map_icon2.gif*" $html] == 1} { | |
regexp -- {<div class=e>.+?<a href="(.+?)".+?">(.+?)</a>} $html - link desc | |
regsub -- {/images/map_icon2.gif} $html {} html | |
if {[info exists link] == 1 && $link != ""} { | |
set link [urldecode $link] | |
if {[string match "/url?q=http*" $link] == 1} { | |
regexp -- {/url\?q=(.+?q=.+?)&} $link - link | |
} | |
} | |
if {$::incith::google::short_answers > 0 } { return "$::incith::google::desc_modes[descdecode $desc]$::incith::google::desc_demodes$::incith::google::break${::incith::google::link_modes}$link${::incith::google::link_demodes}" } | |
# zip codes | |
} elseif {[string match "*&oi=geocode_result*" $html] == 1} { | |
if {![regexp -nocase -- {oi=geocode_result.*?">(.*?)</a>.*?<tr valign=.*?><td valign=.*?><a href="(.+?)"} $html - desc link]} { | |
regexp -- {<h3 class=r><a href="(.+?)".*?>(.+?)</a>} $html - link desc | |
} | |
regsub -all {\&oi=geocode_result} $html {} html | |
if {[info exists link] == 1 && $link != ""} { | |
set link "[urldecode $link]" | |
if {[string match "/url?q=http*" $link] == 1} { | |
regexp -- {/url\?q=(.+?q=.+?)&} $link - link | |
} | |
} | |
if {[string equal [string index $link 0] "/"]} { set link "http://maps.google.$titen$link" } | |
if {$::incith::google::short_answers > 0 } { return "$::incith::google::desc_modes[descdecode $desc]$::incith::google::desc_demodes$::incith::google::break${::incith::google::link_modes}$link${::incith::google::link_demodes}" } | |
# music | |
} elseif {[string match "*&oi=music&ct=result*" $html] == 1} { | |
regexp -- {</td><td valign=top><h2 class=r><a href=(.+?musica\?aid=.+?)\&.+?>(.+?)\002(.+?)\002} $html - link desc | |
regsub -- {\&oi=music\&ct=result} $html {} html | |
if {[info exists link] == 1 && $link != ""} { | |
set link "[urldecode $link]" | |
if {[string match "/url?q=http*" $link] == 1} { | |
regexp -- {/url\?q=(.+?q=.+?)&} $link - link | |
} | |
} | |
if {$::incith::google::short_answers > 0} { return "$::incith::google::desc_modes[descdecode $desc]$::incith::google::desc_demodes$::incith::google::break${::incith::google::link_modes}$link${::incith::google::link_demodes}" } | |
# travel info | |
} elseif {[string match "*/images/airplane.gif*" $html] ==1} { | |
regexp -- {<div class=e>.*?/images/airplane.gif.*?<td.+?valign=top.*?>(.*?)<a.+?href="(.+?)"(?:.*?)>(.+?)</a>} $html - d1 link d2 | |
regsub -- {<div class=e>.*?/images/airplane.gif.*?</a>} $html "" html | |
set desc "$d1 $d2" | |
# UPC codes | |
} elseif {[string match "*/images/barcode.gif*" $html] ==1} { | |
regexp -- {<td valign=top><h3 class=r><a href="(.+?)".*?>(.+?)</a>} $html - link desc | |
regsub -- {<div class=e>.*?/images/barcode.gif.*?</a>} $html "" html | |
# weather! | |
} elseif {[string match "*onebox/weather*" $html]} { | |
#regexp -- {<h3 class=r.*?>(.+?)</h3>.*?<div style="font.*?>(.*?)</div><div.*?>(.*?)<.+?>(.*?)<.+?>(.*?)<} $html - w1 w2 w3 w4 w5 | |
if {![regexp -nocase -- {<h3 class=r.*?>(.+?)</h3>.*?<img.*?<td.*?>(.*?)<.*?<td.*?>(.*?)<.*?>(.*?)<.*?>(.*?)<.*?>(.*?)<.*?<img.*?/onebox/weather.*? title="(.*?)".*?<img.*?/onebox/weather.*? title="(.*?)".*?<img.*?/onebox/weather.*? title="(.*?)".*?<img.*?/onebox/weather.*? title="(.*?)".*?<td.*?>(.*?)<.*?<td style.*?>(.*?)<.*?<td style.*?>(.*?)<.*?>(.*?)<td.*?>(.*?)<td.*?>(.*?)<td.*?>(.*?)<.*?>(.*?)<td.*?>(.*?)<td.*?>(.*?)<td.*?>(.*?)<} $html - w1 w2 f1 f4 f7 f10 f2 f5 f8 f11 w3 w4 w5 z1 z2 z3 z4 z5 z6 z7 z8]} { | |
regexp -nocase -- {<h3 class=r.*?>(.+?)</h3>.*?<img.*?<td.*?>(.*?)<.*?<td.*?>(.*?)<.*?>(.*?)<.*?>(.*?)<.*?>(.*?)<.*?<img.*?/onebox/weather.*? title="(.*?)".*?<img.*?/onebox/weather.*? title="(.*?)".*?<img.*?/onebox/weather.*? title="(.*?)".*?<td.*?>(.*?)<.*?<td style.*?>(.*?)<.*?<td style.*?>(.*?)<.*?>(.*?)<td.*?>(.*?)<td.*?>(.*?)<td.*?>(.*?)<.*?>(.*?)<td.*?>(.*?)<td.*?>(.*?)<td.*?>(.*?)<} $html - w1 w2 f1 f4 f7 f10 f2 f5 f8 f11 w4 w5 z1 z2 z3 z4 z5 z6 z7 z8 | |
} | |
#regexp -- {<div align=center style="padding:5px.*?">(.+?)<br>.+?src="/images/weather/.*?gif" alt="(.*?)".*?<nobr>(.+?)</nobr>.+?<div align=center style="padding:.*?\:left">(.+?)<br>.+?src="/images/weather/.*?gif" alt="(.*?)".*?<nobr>(.+?)</nobr>.+?<div align=center style="padding:.*?\:left">(.+?)<br>.+?src="/images/weather/.*?gif" alt="(.*?)".*?<nobr>(.+?)</nobr>} $html - f1 f2 f3 f4 f5 f6 f7 f8 f9 | |
regsub -- {<h3 class=r.*?>(.*?)</table} $html {} html | |
# not all weather stations report 5 results at all times | |
# this make up for when we only get 4, and does it gracefully | |
if {![info exists w3]} { set w3 "" } | |
if {[regexp {[0-9a-zA-Z]} $w3]} { set w3 ", $w3" } | |
if {[regexp {[0-9a-zA-Z]} $w4]} { set w4 ", $w4" } | |
if {![regexp {[0-9a-zA-Z]} $w5]} { | |
set w5 "" | |
} else { | |
set w5 "; $w5" | |
} | |
set desc "$w1\: $w2$w3$w4$w5; $f1: $f2 \($z1/$z2\); $f4: $f5 \($z3/$z4\); $f7: $f8 \($z5/$z6\)" | |
regsub -all -- {°} $desc {°} desc | |
set link "" | |
regsub -all -- {weather} $input {} input | |
if {$::incith::google::short_answers > 0 } { return "$::incith::google::desc_modes[descdecode $desc]" } | |
# public_data: | |
} elseif {[string match "*/publicdata</div></div>*" $html]} { | |
regexp -nocase -- {valign=top><h3 class=r><a href=.*?>(.*?)</a>.*?<tr><td style.*?><a href="(.*?)".*?<td valign=top.*?>(.*?)<br>} $html - tit link des | |
regsub -all {<.*?>} $des "" des | |
regsub -- {/publicdata</div></div>} $html "" html | |
set desc "$tit: $des" | |
if {[info exists link] == 1 && $link != ""} { | |
if {[string match "*\&sa\=X*" $link]} { | |
regexp -- {(^.+?)&sa\=} [urldecode $link] - link | |
} | |
if {[string match "\/url\?q=*" $link]} { | |
regexp -- {\/url\?q=(.*?)$} $link - link | |
} | |
regexp -- {(.+?)\&ei=} $link - link | |
} | |
if {$::incith::google::short_answers > 0 } { | |
return "${::incith::google::desc_modes}[descdecode ${desc}]${::incith::google::desc_demodes}" | |
} | |
# define: | |
} elseif {[string match "*<ul type=*" $html]} { | |
#[string match "*define:*" $input] == 1 | |
set output "" | |
regexp -- {<ul type=.+?<li>(.+?)(?=\s*<li>|<br>).*<a href.*(http.+?)">} $html - desc link | |
regsub -- {<u1 type=.+?><li>(.+?)(?=\s*<li>|<br>)} $html {} html | |
regsub -all -- {\+} $input {%2B} define_input | |
regsub -all -- { } $define_input {+} define_input | |
if {[info exists link] == 1 && $link != ""} { | |
regexp -- {(.+?)\&sig=} $link - link | |
regexp -- {(.+?)\&usg=} $link - link | |
regexp -- {(.+?)\&ei=} $link - link | |
regexp -- {(.+?)\&sa=} $link - link | |
set link "[urldecode $link]" | |
regsub -all " " $link "%20" link | |
append link " ( http://www.google.${titen}/search?q=${define_input} )" | |
} else { | |
if {![regexp -- {</div><div class=med style=".*?"><p>(.+?)\.<br><br>} $html - no_def]} { | |
if {![regexp -- {<div class=med style=".*?"><br>(.+?)<br><br>} $html - no_def]} { | |
if {![regexp -- {<!--z--><p>(.*?)<br>} $html - no_def]} { | |
set no_def "Houston, we have a problem. Aborting lift-off!" | |
} | |
} | |
} | |
regsub -- {</a>} $no_def "." no_def | |
regsub -all -- {<(.+?)>} $no_def "" no_def | |
return "${::incith::google::desc_modes}${no_def}${::incith::google::desc_demodes}" | |
} | |
} elseif {[string match "*oi=define*" $html]} { | |
if {[string match "*oi=spell*" $html]} { | |
regexp -- {</div><div class=med style=.*?><p>(.*?)<p>(.*?)<p>} $html - desc link | |
regsub -- {</a>} $desc "?" desc | |
regsub -all -- {<.*?>} $desc "" desc | |
regsub -all -- {<.*?>} $link "" link | |
return "${::incith::google::desc_modes}${desc} ${link}${::incith::google::desc_demodes}" | |
} | |
regexp -- {<div class=med style=.*?><p>(.*?)<br>.*?<a href=.*?>(.*?)</a>} $html - desc link | |
regsub -- {<div class=med style=.*?><p>.*?<br>.*?<a href=.*?>.*?</a>} $html "" html | |
regsub -all -- {<(.+?)>} [string map {"<li>" " "} $desc] "" desc | |
if {![string match "http*" $link]} { set link "http://$link" } | |
regsub -all -- {\+} $input {%2B} define_input | |
regsub -all -- { } $define_input {+} define_input | |
set link "${link} ( http://www.google.${titen}/search?q=${define_input} )" | |
return "${::incith::google::desc_modes}${desc}${incith::google::break}${link}${::incith::google::desc_demodes}" | |
# finance / stock quotes | |
} elseif {[string match "*<a href=\"/url\?q=http://finance.google.com/finance%3Fclient%3D*" $html] == 1} { | |
# this has to be one of the worst regexps ever written ! | |
regexp -- {<a href="/url\?q=http://finance.google.com/finance%3Fclient%3D.*?">(.*?)</a>(.*?)<.*?<td colspan=3 nowrap>(.+?)</td>.*?Mkt Cap:.*?<td.*?>(.+?)</td>} $html - tick name price mktcap | |
regsub -- {<div class=e><div><a href="/url\?q=http://finance.google.com/finance%3Fclient%3D.*?">(.*?)</a>(.*?)<.*?<td colspan=3 nowrap>(.+?)</td>.*?Mkt Cap:.*?<td.*?>(.+?)</td>} $html {} html | |
if {[info exists tick] == 1 && [info exists name] == 1 && [info exists price] == 1} { | |
set desc "$tick: $name = $$price" | |
set link "http://finance.google.com/finance?q=$tick" | |
regsub -all -- "\002" $link {} link | |
if {[info exists mktcap] == 1} { append desc " Mkt Cap: $mktcap" } | |
unset tick ; unset name ; unset price ; unset mktcap | |
} | |
if {$::incith::google::short_answers > 0 } { return "$::incith::google::desc_modes[descdecode $desc]" } | |
# patents | |
} elseif {[string match "*/images/magnifier.gif*" $html] ==1} { | |
regexp -- {<td valign=top><a href="(http://patft.uspto.gov/.+?)".+?">(.+?)</a>} $html - link desc | |
regsub -- {/images/magnifier.gif} $html {} html | |
# calculator | |
} elseif {[string match "*<img src=/images/calc_img*" $html] || [string match "*<img src=\"/images/icons/onebox/calculator*" $html]} { | |
set calc 1 | |
# remove bold codes from the html, not necessary here. | |
regexp -nocase -- {/calc.*?<h2 class=.*?>(.+?)</h2>} $html - desc | |
regsub -all -- {<(.+?)>} $desc "" desc | |
if {$::incith::google::short_answers > 0 } { return "$::incith::google::desc_modes[descdecode $desc]" } | |
set link "" | |
# conversion | |
} elseif {[string match "*oi=currency_onebox*" $html] == 1} { | |
set calc 1 | |
regexp -nocase -- {<h3 class=r>(.*?)<} $html - desc | |
regsub -nocase -- {oi=currency_onebox} $html {} html | |
if {$::incith::google::short_answers > 0 } { return "$::incith::google::desc_modes[descdecode $desc]" } | |
set link "" | |
# whois | |
} elseif {[string match "*\002Whois\002 record for*" $html] == 1} { | |
if {[regexp -- {<h3 class=r.*?<a href="(.*?)".*?>(.*?)</a>.*?<tr><td>(.*?)<tr>} $html - link desc descwho]} { | |
regsub -- {<h3 class=r.*?<a href=".+?".*?>.+?</a>.*?<tr>.*?<tr>} $html "" html | |
append desc " \(${descwho}\)" | |
} | |
if {[info exists link] == 1 && $link != ""} { | |
if {[string match "*\&sa\=X*" $link]} { | |
regexp -- {(^.+?)&} $link - link | |
} | |
if {[string match "\/url\?q=*" $link]} { | |
regexp -- {\/url\?q=(.*?)$} $link - link | |
} | |
} | |
if {$::incith::google::short_answers > 0 } { return "$::incith::google::desc_modes[descdecode $desc]$::incith::google::desc_demodes$::incith::google::break${::incith::google::link_modes}$link${::incith::google::link_demodes}" } | |
### END ONEBOX ### | |
# spell: # special query - not onebox | |
} elseif {$spell == 1} { | |
if {[regexp {<div id=res class=med><p>(.*?)</a>} $html - titem]} { | |
regsub -all {<.*?>} $titem "" titem | |
set desc "$incith::google::total_modes${titem}$incith::google::total_demodes$incith::google::desc_modes${did_you_mean}$incith::google::desc_demodes" | |
} else { | |
if {$match != "Google"} { | |
return "${::incith::google::total_modes}\002${match}\002 ${titem}" | |
} else { | |
return "$incith::google::total_modes$did_you_mean$incith::google::total_demodes$incith::google::desc_modes$no_search" | |
} | |
} | |
if {[string len $desc] < 2} { | |
set desc "$incith::google::desc_modes$no_search$incith::google::desc_demodes" | |
} | |
set link "" | |
# regular search | |
} else { | |
if {![regexp -- {class=g(?!b).*?<a href="(.+?)".*?>((?!<).+?)</a>} $html - link desc]} { | |
if {[regexp -nocase {class=(?:r|"r")><a\s*href="(.+?)">(.*?)</a>} $html - link desc ]} { | |
regsub -nocase {class=(?:r|"r")><a\s*href=".+?">.*?</a>} $html "" html | |
} | |
} else { | |
regsub -- {class=g(?!b).*?<a href=".+?".*?>.+?</a>} $html "" html | |
} | |
if {[info exists link] == 1} { | |
if {[string match "*\&sa\=X*" $link]} { | |
regexp -- {(^.+?)&} $link - link | |
} | |
} | |
if {[info exists link] == 1} { | |
if {[string match "*http*" $link] == 0} { | |
set link "" | |
} elseif {[string match *.pdf $link] == 1} { | |
set desc "\[PDF\] $desc" | |
} | |
} | |
if {($::incith::google::skip_self > 0) && ([info exists link])} { | |
if {[string match "*.google.*" $link]} { | |
unset link ; unset desc ; set spell 0 ; set calc 0 ; set break 0 | |
continue | |
} | |
} | |
# trim the description | |
if {[info exists desc] == 1 && $incith::google::description_length > 0} { | |
set desc [string range $desc 0 [expr $incith::google::description_length - 1]] | |
} | |
} | |
if {[info exists desc]} { set desc [descdecode $desc] } | |
# make sure we have something to send | |
if {[info exists desc] == 0} { | |
if {$match == "Google"} { | |
if {[string match "*<img src=/images/calc_img*" $titem] == 1} { | |
regexp -nocase -- {calc_img.+?nowrap>(.+?)</} $titem - desc | |
regexp -- {^(.+?)</td></tr>} $desc - desc | |
set reply "${desc}" | |
} else { | |
if {![string length [set reply [string trim "${no_search}"]]]} { set reply "derp." } | |
} | |
return "$incith::google::desc_modes$reply" | |
} | |
return $output | |
} | |
if {[info exists link] == 1} { | |
if {[string match "*http*" $link] == 0} { | |
set link "" | |
} | |
} | |
set desc [string trim $desc] | |
regsub -all "%20" $desc " " desc | |
regsub -all "<br>" $desc " " desc | |
# add the search result | |
if {$calc == 0 && $spell == 0 && $populate == 0} { | |
if {[info exists link] && $link != ""} { | |
if {![string match "*define:*" $input]} { | |
set link [urldecode $link] | |
regsub -all " " $link "%20" link | |
} | |
# added because of recent google changes, needed to clean-up *.google.* links | |
if {[string match "*url\?*" $link]} { | |
regexp -- {url\?q=(.+?)$} $link - link | |
regexp -- {(.+?)\&sig=} $link - link | |
regexp -- {(.+?)\&usg=} $link - link | |
regexp -- {\?url=(.+?)$} $link - link | |
} | |
# quick fix | |
regsub -all {%20class=(.*)$} $link { } link | |
regsub -all {</(.+)>} $desc { } desc | |
regsub -all {<div(.+)$} $desc { } desc | |
regsub -all {</(.*)$} $desc { } desc | |
regsub -all {<a href=(.*)$} $desc { } desc | |
# added because of recent google changes, needed to clean-up *.google.* links | |
#if {[string match "*%20*" $link]} { | |
# regexp -- {(.+?).%20} $link - link | |
#} | |
# top result may be news, at the moment it is too close to regular | |
# search results to cull this out.. so in the meantime, this hack | |
# will at least remove the 10,000 google tags at the end of the url | |
# to keep it from spanning 2 lines of results. | |
if {[string match "http://news.google*" $link]} { | |
regexp -- {^(.+?)&hl=} $link - link | |
} | |
regsub -all "(?:\x93|\x94|"|\")" $link {} link | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" } | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
append output "$desc$::incith::google::break${link}${incith::google::seperator}" | |
} | |
} else { | |
append output "$desc${incith::google::seperator}" | |
} | |
} else { | |
set output "$desc" | |
} | |
# I've hard-coded it to only fetch one result for define lookups, and | |
# spell shouldn't ever have to loop. | |
if {[string match "define:*" $input] == 1 || $spell == 1 || $calc == 1 || $break == 1 } { | |
break | |
} | |
# increase the results, clear the variables for the next loop | |
unset link ; unset desc ; set spell 0 ; set calc 0 ; set break 0 | |
incr results | |
} | |
# make sure we have something to send | |
if {$output == "" && ![string match "*:*" $input] && ![string match "*<img src=/images/calc_img*" $html] } { | |
set reply "${no_search}" | |
return "$::incith::google::desc_modes$reply" | |
} | |
return $output | |
} | |
# IMAGES | |
# fetches a list of links to images from images.google. | |
# | |
proc images {input} { | |
; set results 0 ; set output ""; set match "" ; set titem "" ; set no_search "" ; set did_you_mean "" | |
# fetch the html | |
set html [fetch_html $input 2] | |
# user input causing errors? | |
if {[string match -nocase "*socketerrorabort*" $html]} { | |
regsub {(.+?)\|} $html {} html | |
return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if {[string match -nocase "*timeouterrorabort*" $html]} { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
# strip out 'did you mean?' first | |
# what do we call 'no search results in any language?' | |
if {![regexp -- {--></script><div>(.+?)<br><br>} $html - no_search]} { | |
if {![regexp -- {</a></div><div><p>(.+?)<br><br>} $html - no_search]} { | |
if {![regexp -- {<table border=0 cellpadding=0 cellspacing=0><tr><td class=j><br>(.+?)<br><br>} $html - no_search]} { | |
regexp -- {<div id="res"><div id="ires">(.*?)<br><br>} $html - no_search | |
} | |
} | |
} | |
if {$no_search != ""} { | |
regsub -- {</a>} $no_search "? " no_search | |
regsub -all -- {<(.+?)>} $no_search { } no_search | |
while {[string match "* *" $no_search]} { | |
regsub -all -- { } $no_search " " no_search | |
} | |
set no_search [string trim $no_search] | |
} | |
# give results an output header with result tally. | |
regexp -- {align=right nowrap id=.*?>(.+?)\s\002(.+?)\(} $html - titem match | |
if {![regexp -- {1\002\s-\s\002.+?\002.+?\002(.+?)\002} $match - match]} { | |
set match "Google" | |
set titem "" | |
} | |
regsub -all -- {<(.+?)>} $match {} match | |
# format output according to variables. | |
if {$incith::google::total_results != 0 && $match > 0} { | |
set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
# parse the html | |
while {$results < $incith::google::image_results} { | |
if {[regexp -- {\["/imgres\?imgurl\\x3d(.*?)\\x26imgrefurl\\x3d.*?\\x26h\\x3d(.*?)\\x26w\\x3d(.*?)\\x26sz\\x3d(.*?)\\x26.*?",.*?,.*?,.*?,.*?,.*?,"(.*?)","(.*?)"} $html - link h w size desc d2]} { | |
regsub -- {\["/imgres\?imgurl\\x3d(.+?)\\x26imgrefurl\\x3d.*?\\x26h\\x3d.*?\\x26w\\x3d.*?\\x26sz\\x3d.*?\\x26} $html {} html | |
# google now makes it very hard to parse titles out, this solves the dilemma. | |
if {[string is integer -strict $desc]} { set desc $d2 } | |
if {![string equal $::incithcharset [encoding system]]} { set desc [encoding convertfrom $::incithcharset $desc] } | |
regsub -all -- {\\x([[:xdigit:]]{1,2})} $desc {[format %c [scan "\1" %x]]} desc | |
set desc [descdecode [subst $desc]] | |
if {![string equal $::incithcharset [encoding system]]} { set desc [encoding convertto $::incithcharset $desc] } | |
regsub -all -- {(?:<b>|</b>)} $desc "\002" desc | |
set desc2 " ($h x $w - ${size}k)" | |
} else { | |
if {[regexp -- {<a href="/imgres\?imgurl=(.*?)\&imgrefurl=.*?<br>(.*?)<br>(.*?)<br>} $html - link desc attrib]} { | |
regsub -- {<a href="/imgres\?imgurl=.*?\&imgrefurl=.*?<br>.*?<br>.*?<br>} $html {} html | |
regsub -all -- {(?:<b>|</b>)} [string trim $desc] "\002" desc | |
set desc2 " ([string trim [string map [list "*" "x" " " ""] [join [lrange [split $attrib "-"] 0 1] "-"]]])" | |
} | |
} | |
# if there's no link, return or stop looping, depending | |
if {[info exists link] == 0} { | |
if {$results == 0} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
# prevent duplicate results is mostly useless here, but will at least | |
# ensure that we don't get the exact same picture. | |
if {[string match "*$link*" $output] == 1} { | |
break | |
} | |
if {$incith::google::desc_modes != ""} { set desc "$incith::google::desc_modes${desc}$incith::google::desc_demodes" } | |
if {$incith::google::desc_modes != ""} { set desc "$incith::google::desc_modes${desc2}$incith::google::desc_demodes" } | |
if {$incith::google::link_modes != ""} { set link "$incith::google::link_modes${link}$incith::google::link_demodes" } | |
# add the search result | |
append output "$desc$desc2$::incith::google::break${link}${incith::google::seperator}" | |
# increase the results, clear the variables for the next loop just in case | |
unset link | |
incr results | |
} | |
# make sure we have something to send | |
if {$match == ""} { | |
set reply "${no_search}" | |
return "$::incith:google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
return $output | |
} | |
# LOCAL | |
# fetches a list of address & phone numbers from local.google. | |
# -speechless updated | |
proc local {input} { | |
; set results 0 ; set output ""; set match "" ; set titem "" ; set no_search "" ; set did_you_mean "" ; set titen "" | |
# fetch the html | |
set html [fetch_html $input 3] | |
regsub -all {‎} $html "" html | |
# this isn't global, so we need to keep ctry (country) here | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titen input | |
if {$titen == ""} { | |
set titen "${incith::google::google_country}" | |
} | |
# user input causing errors? | |
if {[string match -nocase "*socketerrorabort*" $html]} { | |
regsub {(.+?)\|} $html {} html | |
return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if {[string match -nocase "*timeouterrorabort*" $html]} { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
# strip out 'did you mean?' first | |
# what do we call 'no search results in any language?' | |
if {![regexp -- {<div class=spacer></div></div></div><br><p>(.+?)</p>} $html - no_search]} { | |
if {[regexp -- {<table cellpadding=0 cellspacing=0><tr valign=top><td>(.+?)<br><br>} $html - no_search]} { | |
set no_search [string map {"<br>" "; "} $no_search] | |
regsub -all -- {<.*?>} $no_search "" no_search | |
set no_search [string trim $no_search "; "] | |
} elseif {[regexp -- {<div class="suggest noprint">(.*?)</a>} $html - no_search]} { | |
regsub -all -- {<.*?>} $no_search "" no_search | |
} elseif {[regexp -- {<div id=refsec class="suggest noprint">(.*?)<div class=ref>(.*?)<div id=bottomads} $html - did extra]} { | |
foreach {- m} [regexp -all -inline {<a href=.*?>(.*?)</a>} $extra] { lappend matches $m } | |
set no_search "$did [join $matches "; "]" | |
} | |
} | |
if {[regexp -- {<div class="noprint res">.*?<p>(.*?)</p>} $html - more]} { | |
append no_search "$more" | |
} | |
# give results an output header with result tally. | |
if {![regexp -- {<form name="qmod".*?<br/>(.+?)\s\002(.+?)</form>} $html - titem match]} { | |
if {![regexp -- {<form name="qmod".*?>(.+?)\s\002(.+?)</form>} $html - titem match]} { | |
if {![regexp -- {<div id=contentpanel>.*?<form name=qmod>(.+?)\s\002(.+?)</form>} $html - match titem]} { | |
if {[regexp -- {<div class="noprint">(.*?)</div>} $html - match]} { | |
regsub -all -- {<.*?>} $match "" match | |
set match [split [string trim $match]] ; set titem [lindex $match end] ; set match [lindex $match end-1] | |
if {![string length [string trim $match]]} { set match "Google" ; set titem "" } | |
} else { | |
set match "Google" | |
set titem "" | |
} | |
} | |
} | |
} | |
regsub -all -- {<(.+?)>} $match {} match | |
# format output according to variables. | |
if {$incith::google::total_results != 0} { | |
set output "${::incith::google::total_modes}[string trim ${match}] [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
# parse the html | |
while {$results < $incith::google::local_results} { | |
if {[regexp -nocase {class="name lname.*?<a.*?>(.*?)</a>.*?href=".*?cid=(.*?)\&q.*?</a></nobr>.*?</div> <div>(.*?)<div>} $html - loc url add1 desc]} { | |
regsub -nocase {class="name lname.*?<a.*?>.*?</a>.*?href=".*?cid=.*?\&q.*?</a></nobr>.*?</div> <div>.*?<div>} $html "" html | |
} elseif {[regexp -nocase {<div class=lname>.*?href=(.*?) .*?">(.*?)</a></div></div><div class=atxt dir=ltr>(.*?)</div>(.*?)<} $html - url loc add1 desc]} { | |
regsub {<div class=lname>.*?href=(.*?) .*?">(.*?)</a></div></div><div class=atxt dir=ltr>(.*?)</div>} $html "" html | |
} | |
#regsub -nocase {<div class="name.*?href=.*?>.*?</a>.*?<div><div>.*?</div>.*?<div align=left>.*?</div>.*?<a class=f href=(.*?)>} $html "" html | |
if {[info exists url]} { | |
if {![string match -nocase "*maps.google*" $url]} { | |
regexp -- {^/local.*?q=(.*?)(?:$| )} $url - url | |
regsub -- {^/maps} $url "http://maps.google.$titen/maps" url | |
regexp -- {^(.*?)&dq=} $url - url | |
} | |
regexp -- {^(.*?) } $url - url | |
} | |
# if there's no link, return or stop looping, depending | |
if {![info exists loc]} { | |
if {$results == 0} { | |
set reply $no_search | |
return "$incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} else { | |
return $output | |
break | |
} | |
} | |
regsub -all -- "<.*?nobr>" $add1 {} add1 | |
regsub -all -- "‎" $add1 {} add1 | |
if {$incith::google::desc_modes != ""} { set loc "$incith::google::desc_modes${loc}$incith::google::desc_demodes" } | |
if {$incith::google::link_modes != ""} { set link "$incith::google::link_modes${add1}$incith::google::link_demodes" } { set link $add1 } | |
# add the search result | |
if {$incith::google::link_only == 1} { | |
append output "${link} ${incith::google::seperator}" | |
} else { | |
append output "[descdecode ${loc}]$::incith::google::break${link}${incith::google::seperator}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset loc ; unset link ; unset desc | |
incr results | |
} | |
return $output | |
} | |
# GROUPS | |
# fetches a list of threads from groups.google. | |
# -speechless updated | |
proc groups {input} { | |
; set results 0 ; set output "" ; set match "" ; set no_search "" ; set titem "" ; set titen "" | |
# this isn't global, so we need to keep ctry (country) here | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titen dummy | |
if {$titen == ""} { | |
set titen "${incith::google::google_country}" | |
} | |
# fetch the html | |
set html [fetch_html $input 4] | |
# user input causing errors? | |
if {[string match -nocase "*socketerrorabort*" $html]} { | |
regsub {(.+?)\|} $html {} html | |
return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if {[string match -nocase "*timeouterrorabort*" $html]} { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
# strip out 'did you mean?' first | |
# what do we call 'no search results in any language?' | |
regexp -- {<div id=res><p>(.+?)</div><div>} $html - no_search | |
if {$no_search != ""} { | |
regsub -- {</a>} $no_search "? " no_search | |
regsub -all -- {<(.+?)>} $no_search { } no_search | |
while {[string match "* *" $no_search]} { | |
regsub -all -- { } $no_search " " no_search | |
} | |
set no_search [string trim $no_search] | |
} | |
# give results an output header with result tally. | |
regexp -- {</td><td align="right".*?>(.+?)\s\002(.+?)(\[|<)} $html - titem match | |
if {![regexp -- {1\002\s-\s.+?\002.+?\002(.+?)\002} $match - match]} { | |
set match "Google" | |
set titem "" | |
} | |
regsub -all -- {<(.+?)>} $match {} match | |
# format output according to variables. | |
if {$incith::google::total_results != 0 && $match > 0} { | |
set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
# parse the html | |
while {$results < $incith::google::group_results} { | |
# this grabs a google group if one exists | |
# this grabs a usenet group if one exists | |
if {[regexp -- {<div class="gdrr"><a\s+href="(.+?)".*?>(.+?)</a>.+?</td></tr></table>} $html {} thread desc]} { | |
regsub -- {<div class="gdrr">(.+?)</td></tr></table>} $html "" html | |
if {[regexp -- {url\?(?:url|q)=(.+?)\&} $thread - thread]} { | |
regexp -- {^(.+?)&(?:sa|ie|ei)=} $thread - thread | |
set thread [urldecode $thread] | |
if {[regexp -- {url\?(?:url|q)=(.+?)\&} $thread - thread]} { | |
regexp -- {^(.+?)&(?:sa|ie|ei)=} $thread - thread | |
set thread [urldecode $thread] | |
} | |
} | |
} elseif {[regexp -- {<div class="g".*?href="(.+?)".*?>(.+?)</a>} $html - thread desc]} { | |
regsub -- {div class="g".*?href=".+?".*?>(.+?)</td></tr>} $html "" html | |
if {[regexp -- {url\?(?:url|q)=(.+?)\&} $thread - thread]} { | |
regexp -- {^(.+?)&(?:sa|ie|ei)=} $thread - thread | |
set thread [urldecode $thread] | |
if {[regexp -- {url\?(?:url|q)=(.+?)\&} $thread - thread]} { | |
regexp -- {^(.+?)&(?:sa|ie|ei)=} $thread - thread | |
set thread [urldecode $thread] | |
} | |
} | |
} | |
# if there's no desc, return or stop looping, depending | |
if {[info exists desc] == 0} { | |
if {$results == 0} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
if {[info exists desc] == 1 && $incith::google::description_length > 0} { | |
set desc [string range $desc 0 [expr $incith::google::description_length - 1]] | |
set desc [string trim $desc] | |
} | |
# make the link valid because we only got a partial href result, not a full url | |
set link $thread | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" } | |
# add the search result | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
append output "[descdecode $desc] $::incith::google::break${link}${incith::google::seperator}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset link; unset desc | |
incr results | |
} | |
# make sure we have something to send | |
if {$match == ""} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
return $output | |
} | |
# NEWS | |
# fetches the news from news.google. | |
# -madwoota supplied, speechless updated | |
# | |
proc news {input} { | |
; set results 0 ; set output ""; set match "" | |
; set no_search "" ; set titem "" | |
# fetch the html | |
set html [fetch_html $input 5] | |
# user input causing errors? | |
if {[string match -nocase "*socketerrorabort*" $html]} { | |
regsub {(.+?)\|} $html {} html | |
return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if {[string match -nocase "*timeouterrorabort*" $html]} { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
# strip out 'did you mean?' first | |
# what do we call 'no search results in any language?' | |
if {![regexp -- {<div class="spelling-correction">(.+?)</p><p>} $html - no_search]} { | |
regexp -- {<div class="no-results">(.+?)</p>} $html - no_search | |
} | |
if {$no_search != ""} { | |
regsub -- {</a>} $no_search "? " no_search | |
regsub -all -- {<(.+?)>} $no_search { } no_search | |
while {[string match "* *" $no_search]} { | |
regsub -all -- { } $no_search " " no_search | |
} | |
set no_search [string trim $no_search] | |
} | |
# give results an output header with result tally. | |
regexp -- {<div class="results-stats">(.+?)\s\002(.+?)\(\002} $html - titem match | |
if {![regexp -- {1\002\s–\s\002.+?\002.+?\002(.+?)\002} $match - match]} { | |
set match "Google" | |
set titem "" | |
} | |
regsub -all -- {<(.+?)>} $match {} match | |
# format output according to variables. | |
if {$incith::google::total_results != 0 && $match > 0} { | |
set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
# parse the html | |
while {$results < $incith::google::news_results} { | |
# somewhat extenuated regexp due to allowing that there *might* be | |
# an image next to the story | |
# <h2 class="title">.*?<a class.*?>.*?<a.*?href="(.+?)".*?>(.+?)</a>.+?<div class="sub-title">(.+?)</div> | |
if {[regexp -- {<h3 class="title">.*?<a target.*?href="(.+?)".*?>(.+?)</a>.+?<div class="sub-title">(.+?)</div>} $html {} link desc time]} { | |
regsub -all -- {<.*?>} $time "" time | |
regsub -- {<h3 class="title">.*?<a.*?href=".+?".*?>.+?</a>.+?<div class="sub-title">.+?</div>} $html {} html | |
} elseif {[regexp -- {<h2 class="esc-lead-article-title">(.*?)<table id=} $html {} entry]} { | |
regexp -- {url="(.*?)"} $entry - link | |
regexp -- {class="titletext">(.*?)</span} $entry - desc | |
regexp -- {class=.esc-.*?-source.>(.*?)</span>} $entry - src | |
regexp -- {class=.esc-.*?-timestamp.>(.*?)</span>} $entry - time | |
regsub -all -- {<.*?>} $time "" time | |
regsub -all -- {‎} $time "" time | |
regsub -- {<h2 class="esc-lead-article-title">.*?<table} $html {} html | |
} | |
# if there's no desc, return or stop looping, depending | |
if {[info exists desc] == 0} { | |
if {$results == 0} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
if {[info exists desc] == 1 && $incith::google::description_length > 0} { | |
set desc [string range $desc 0 [expr $incith::google::description_length - 1]] | |
set desc [descdecode [string trim $desc]] | |
} | |
# prevent duplicate results is mostly useless here, but will at least | |
# ensure that we don't get the exact same article. | |
if {[string match "*$link*" $output] == 1} { | |
break | |
} | |
if {[info exists desc]} { set desc "$incith::google::desc_modes$desc$incith::google::desc_demodes" } | |
if {[info exists src]} { set src "$incith::google::desc_modes$src$incith::google::desc_demodes" } | |
if {[info exists time]} { set time "$incith::google::desc_modes[descdecode [string trim $time]]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" } | |
# add the search result | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
append output "$desc \($src - $time\)$::incith::google::break${link}${incith::google::seperator}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset link; unset desc | |
incr results | |
} | |
# make sure we have something to send | |
if {$match == ""} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
return $output | |
} | |
# fetches book titles from books.google. | |
# -madwoota supplied, -broken- | |
# -speechless updated, fixed no longer using print.google | |
# | |
proc print {input} { | |
; set results 0 ; set output "" ; set titem "" ; set no_search "" ; set did_you_mean "" ; set titen "" | |
; set match "" | |
# this isn't global, so we need to keep ctry (country) here | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titen dummy | |
if {$titen == ""} { | |
set titen "${incith::google::google_country}" | |
} | |
# fetch the html | |
set html [fetch_html $input 6] | |
# user input causing errors? | |
if {[string match -nocase "*socketerrorabort*" $html]} { | |
regsub {(.+?)\|} $html {} html | |
return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if {[string match -nocase "*timeouterrorabort*" $html]} { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
# strip out 'did you mean?' first | |
# what do we call 'no search results in any language?' | |
regexp -- {<td id="main_content">(.*?)</p>} $html - no_search | |
# if we have a no search results message, let's format it for displaying possibly. | |
if {$no_search != ""} { | |
#regsub -all -- {\002\002} $no_search "\002" no_search | |
regsub -- {</a></div>} $no_search "? " no_search | |
regsub -all -- {<(.+?)>} $no_search { } no_search | |
while {[string match "* *" $no_search]} { | |
regsub -all -- { } $no_search " " no_search | |
} | |
set no_search [string trim $no_search] | |
} | |
# give results an output header with result tally. | |
regexp -- {<td align=right>(.+?)\s\002(.+?)\(\002} $html - titem match | |
if {![regexp -- {1\002\s-\s\002.+?\002.+?\002(.+?)\002} $match - match]} { | |
set match "Google" | |
set titem "" | |
} | |
regsub -all -- {<(.+?)>} $match {} match | |
# format output according to variables. | |
if {$incith::google::total_results != 0 && $match > 0} { | |
set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
while {$results < $incith::google::print_results} { | |
if {[regexp -- {<div class=resbdy><h2 class="resbdy">(.*?)</table>} $html - snippet]} { | |
if {![regexp -- {<a.*?href=".+?id=(.+?)&pg=(.*?)&.*?".*?>(.+?)</a></h2>(.+?)<br} $snippet - id page desc author]} { | |
regexp -- {<a.*?href=".+?id=(.+?)&.*?".*?>(.+?)</a></h2>(.+?)<br} $snippet - id desc author | |
} | |
regsub -- {<div class=resbdy><h2 class="resbdy"><a.*?href=(.+?)</table>} $html "" html | |
} | |
# if there's no desc, return or stop looping, depending | |
if {![info exists desc]} { | |
if {$results == 0} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
# this cleans up perhaps bad html cuts | |
if {[info exists desc]} { | |
regsub -all -- {<(.+?)>} $desc "" desc | |
set desc [string trim $desc] | |
} | |
if {[info exists desc]} { | |
regsub -all -- {<(.+?)>} $author "" author | |
set author [string trim $author] | |
} | |
# make link by appending book id | |
if {[info exists page]} { set page "&pg=$page" } { set page "" } | |
set link "http://books.google.${titen}?id=${id}${page}" | |
# prevent duplicate results is mostly useless here, but will at least | |
# ensure that we don't get the exact same article. | |
#if {[string match "*$link*" $output] == 1} { | |
# break | |
#} | |
append desc " (${author})" | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" } | |
# add the search result | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset link ; unset desc ; unset page | |
incr results | |
} | |
# make sure we have something to send | |
if {![info exists output]} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
return $output | |
} | |
# GeoBytes | |
# Fetches IP Location information | |
# -speechless supplied | |
# | |
proc locate {input} { | |
; set results 0 ; set output "" | |
; set city "" ; set region "" ; set country "" | |
; set certainty "" ; set timezone "" ; set population "" | |
; set currency "" ; set proxy "" ; set curr "" ; | |
# fetch the html | |
set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e" | |
set http [::http::config -useragent $ua] | |
set url "http://www.geobytes.com/IpLocator.htm?GetLocation" | |
set query [::http::formatQuery ipaddress $input] | |
set http [::http::geturl $url -query $query -headers $::incith_hdr -timeout [expr 1000 * 10]] | |
upvar #0 $http state | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
set html [charenc [ungzip [::http::data $http] $state(meta)] $state(charset)] | |
::http::cleanup $http | |
# is site broken? if it is, say so | |
if {![string match "*<html>*" $html]} { | |
return "$::incith::google::error_modes\002 GeoBytes Error:\002 Unable to access site. www.geobytes.com seems to be down.$::incith::google::error_demodes" | |
} | |
#strip html tags | |
regsub -all "\t" $html "" html | |
regsub -all "\n" $html "" html | |
regsub -all "\r" $html "" html | |
regsub -all "\v" $html "" html | |
regsub -all "'" $html "'" html | |
#parse html | |
regexp -- {input.+?name="ro-no_bots_pls13".+?value="(.+?)".+?size} $html {} country | |
regexp -- {input.+?name="ro-no_bots_pls15".+?value="(.+?)".+?size} $html {} region | |
regexp -- {input.+?name="ro-no_bots_pls17".+?value="(.+?)".+?size} $html {} city | |
regexp -- {input.+?name="ro-no_bots_pls18".+?value="(.+?)".+?size} $html {} certainty | |
regexp -- {input.+?name="ro-no_bots_pls9".+?value="(.+?)".+?size} $html {} timezone | |
regexp -- {input.+?name="ro-no_bots_pls3".+?value="(.+?)".+?size} $html {} population | |
regexp -- {input.+?name="ro-no_bots_pls1".+?value="(.+?)".+?size} $html {} currency | |
#currency sometimes has a trailing space, let's fix that with a dirty hack. | |
set currency [string trim $currency] | |
regexp -- {input.+?name="ro-no_bots_pls11".+?value="(.+?)".+?size} $html {} proxy | |
regexp -- {input.+?name="ro-no_bots_pls".+?value="(.+?)".+?size} $html {} curr | |
#in case we get blocked, say we did | |
if {[string match "*temporarily blocked*" $html] == 1} { | |
set output "$::incith::google::error_modes\002GeoBytes Error:\002 (${input}) Reasonable usage limit has been exceeded. This bot has been temporarily blocked from accessing services. Please try back again later.$::incith::google::error_demodes" | |
} | |
#if we can't read a country, assume there was nothing to lookup. | |
if {$country == "" && $output == ""} { | |
set output "$::incith::google::error_modes\002GeoBytes Error:\002 (${input}) Undefined IP. Nothing to LookUp.$::incith::google::error_demodes" | |
} elseif {$output == ""} { | |
set output "$::incith::google::total_modes\002GeoBytes Location:\002$::incith::google::total_demodes$::incith::google::desc_modes (${input})$::incith::google::desc_demodes$::incith::google::break$incith::google::link_modes${city}, ${region}, ${country} (${certainty}%) \[\002GMT:\002${timezone}\|\002Proxy:\002${proxy}\|${currency}\|${curr}\]$incith::google::link_demodes" | |
} | |
if {$incith::google::bold_descriptions != 1 && [string match "\002" $incith::google::desc_modes] != 1} { | |
regsub -all -- "\002" $output {} output | |
} | |
return $output | |
} | |
# VIDEO | |
# fetches links to video with search data in it (video.google.com) | |
# -madwoota supplied, speechless updated | |
# | |
proc video {input} { | |
; set results 0 ; set output ""; set match ""; set ded "" | |
; set titen "" ; set titem "" ; set no_search "" ; set did_you_mean "" | |
# this isn't global, so we need to keep ctry (country) here | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titen dummy | |
if {$titen == ""} { | |
set titen "${incith::google::google_country}" | |
} | |
# fetch the html | |
set html [fetch_html $input 7] | |
# user input causing errors? | |
if {[string match -nocase "*socketerrorabort*" $html]} { | |
regsub {(.+?)\|} $html {} html | |
return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if {[string match -nocase "*timeouterrorabort*" $html]} { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
# strip out 'did you mean?' first | |
# what do we call 'no search results in any language?' | |
if {[regexp -- {<div class=med><p style=.*?>(.*?)<p style} $html - no_search]} { | |
#regsub -all -- {(<strong>|</strong>)} $no_search "\002" no_search | |
#regsub -- {</a>} $no_search "? " no_search | |
#regsub -- {</td>} $no_search ". " no_search | |
regsub -all -- {<(.+?)>} $no_search "" no_search | |
set no_search [string trim $no_search] | |
} | |
# give results an output header with result tally. | |
if {![regexp -- {<div id=resultStats>(.+?)<nobr>} $html - match]} { | |
set match "Google" | |
set titem "" | |
} else { | |
regsub -all -- {<(.+?)>} $match {} match | |
regexp -- {([0-9].*?)$} $match - match | |
set match "\002[join [lrange [split $match] 0 end-1]]\002 [lindex [split $match] end]" | |
} | |
# format output according to variables. | |
if {$incith::google::total_results != 0} { | |
set output "${::incith::google::total_modes}[string trim ${match}]${::incith::google::total_demodes}${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
# parse the html | |
while {$results < $incith::google::video_results} { | |
# somewhat extenuated regexp due to allowing that there might be an image next to the title | |
regexp -- {<h3 class=r>.*?href="(.*?)".*?>(.*?)</a>.*?<span class=f>(.*?)</span><br>(.*?)<br>} $html {} link desc ded ded2 | |
regsub -- {<h3 class=r>.*?href=".*?".*?>.*?</a>.*?<span class=f>.*?</span><br>.*?<br>} $html "" html | |
# if there's no desc, return or stop looping, depending | |
if {[info exists desc] == 0} { | |
if {$results == 0} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
set desc [string trim [string range $desc 0 [expr $incith::google::description_length - 1]]] | |
# append narration to description for more detail unless its identical | |
# keep description from becoming too lengthy and clean up trailing spaces | |
regsub -all {<div class=description.+?</div>} $ded "" ded | |
regexp {(.+?)\)--} $ded - ded | |
regsub { -} $ded " - " ded | |
regsub {<span class=rl-domain>} $ded " - " ded | |
regsub -all {<(.*?)>} $ded "" ded | |
if {[string length $ded2]} { | |
set ded2 "\([descdecode [string range $ded2 0 [expr $incith::google::description_length - 1]]]\)" | |
} | |
set desc "[descdecode $desc] $ded2\([descdecode [string trim $ded]]\)" | |
# make the link valid because we were only given a partial href result, not a full url | |
if {[string match [string range $link 0 0] "/"]} { | |
regsub -- {&.+?$} $link "" link | |
set link "http://video.google.${titen}${link}" | |
} | |
# prevent duplicate results is mostly useless here, but will at least | |
# ensure that we don't get the exact same article. | |
if {[string match "*$link*" $output] == 1} { | |
break | |
} | |
# quick and dirty double-space remover | |
while {[string match "* *" $desc]} { | |
regsub -all -- { } $desc " " desc | |
} | |
set desc [string trim $desc] | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" } | |
# add the search result | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset link; unset desc | |
incr results | |
} | |
# make sure we have something to send | |
if {$match == ""} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
return $output | |
} | |
# FIGHT | |
# google fight ! | |
# | |
proc fight {input} { | |
set output ""; set winner 0; set match1 0; set match2 0 | |
if {![regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - country input]} { | |
set country "${incith::google::google_country}" | |
} | |
regexp -nocase -- {^(.+?) vs (.+?)$} $input - word1 word2 | |
if {![regexp -nocase -- {^\.(.+?)\s(.+?)$} $word2 - country2 word2]} { | |
set country2 "${incith::google::google_country}" | |
} | |
# fetch the first result | |
set html [fetch_html ".$country $word1" 8] | |
# parse the html | |
if {![regexp -nocase {<div id=prs>.*?</div><p>(.+?)(?:\(\002|\[)} $html - matches1]} { | |
if {![regexp -- {<div id=resultStats> (.*?) (.*?)\(\002} $html - titem matches1]} { | |
if {[regexp -- {<div id=resultStats>(.*?)\(} $html - match]} { | |
set matches1 [lindex [split [string trim $match]] end-1] | |
} | |
} | |
} | |
if {[info exists matches1]} { | |
regsub -- {(?:\002|\s)1\002 - \0021\002} $matches1 "" matches1 | |
regsub -- {(?:\002|\s)1\002-\0021\002} $matches1 "" matches1 | |
regsub -nocase { of about } $matches1 "" matches1 | |
regsub -nocase -all {<a href.*?>} $matches1 "" matches1 | |
regsub -nocase -all {</a>} $matches1 "" matches1 | |
set match1 $matches1 | |
regsub -all -- {[\., ]} $match1 "" match1 | |
} else { set matches1 "0" } | |
if {![string is digit $match1]} { | |
regexp -- {\002(.+?)\002.*?\002(.+?)\002} $matches1 - dummy match1 | |
if {[string match $match1 $word1]} { | |
regexp -- {\002(.+?)\002} $matches1 - match1 | |
} | |
} | |
# fetch the second result | |
set html [fetch_html ".$country2 $word2" 8] | |
# parse the html | |
if {![regexp -nocase {<div id=prs>.*?</div><p>(.+?)(?:\(\002|\[)} $html - matches2]} { | |
if {![regexp -- {<div id=resultStats> (.*?) (.*?)\(\002} $html - titem matches2]} { | |
if {[regexp -- {<div id=resultStats>(.*?)\(} $html - match]} { | |
set matches2 [lindex [split [string trim $match]] end-1] | |
} | |
} | |
} | |
if {[info exists matches2]} { | |
regsub -- {(?:\002|\s)1\002 - \0021\002} $matches2 "" matches2 | |
regsub -- {(?:\002|\s)1\002-\0021\002} $matches2 "" matches2 | |
regsub -nocase { of about } $matches2 "" matches2 | |
regsub -nocase -all {<a href.*?>} $matches2 "" matches2 | |
regsub -nocase -all {</a>} $matches2 "" matches2 | |
set match2 $matches2 | |
} else { set matches2 "0" } | |
if {![string is digit $match2]} { | |
regexp -- {\002(.+?)\002.*?\002(.+?)\002} $matches2 - dummy match2 | |
if {[string match $match2 $word2]} { | |
regexp -- {\002(.+?)\002} $matches2 - match2 | |
} | |
} | |
if {![string match $country $country2]} { set country "$country and Google.$country2" } | |
if {![info exists match1]} { | |
set match1 "0" | |
set match1expr "0" | |
} else { | |
regsub -all {(?:\.|,| )} $match1 "" match1expr | |
} | |
if {![info exists match2]} { | |
set match2 "0" | |
set match2expr "0" | |
} else { | |
regsub -all {(?:\.|,| )} $match2 "" match2expr | |
} | |
if {[expr $match2expr < $match1expr]} { | |
set winner 1 | |
} elseif {[string match $match2expr $match1expr]} { | |
set winner 3 | |
} else { | |
set winner 2 | |
} | |
if {$incith::google::bold_descriptions > 0 && $incith::google::desc_modes == ""} { | |
set word1 "\002$word1\002"; set word2 "\002$word2\002" | |
set match1 "\002 $matches1\002"; set match2 "\002 $matches2\002" | |
} elseif {$incith::google::desc_modes != ""} { | |
set word1 "\002$word1\002"; set word2 "\002$word2\002" | |
set match1 " $matches1"; set match2 " $matches2" | |
} else { | |
set match1 " $matches1"; set match2 " $matches2" | |
} | |
if {$winner == 1} { | |
set output "${::incith::google::total_modes}By results on Google.$country:$::incith::google::total_demodes$::incith::google::desc_modes $word1 beats $word2 by$match1 to$match2!$::incith::google::desc_demodes" | |
} elseif {$winner == 2} { | |
set output "${::incith::google::total_modes}By results on Google.$country:$::incith::google::total_demodes$::incith::google::desc_modes $word2 beats $word1 by$match2 to$match1!$::incith::google::desc_demodes" | |
} else { | |
set output "${::incith::google::total_modes}Google.$country could not determine the winner.$::incith::google::total_demodes$::incith::google::desc_modes $word2 ties $word1 with$match1 results.$::incith::google::desc_demodes" | |
} | |
# make sure we have something to send | |
if {[info exists output] == 0} { | |
set reply "${::incith::google::desc_modes}Sorry, no search results were found. Something is wrong...$::incith::google::desc_demodes" | |
return $reply | |
} | |
return $output | |
} | |
# YOUTUBE | |
# fetches links to video with search data in it (youtube.com) | |
# -speechless supplied | |
# | |
proc youtube {input} { | |
; set results 0 ; set output "" ; set ded ""; set match "" ; set titem "" ; set titen "" | |
if {[regsub -nocase -all -- "$::incith::google::youtube_highdef" $input "" dummy]} { set hd 1 } | |
# this isn't global, so we need to keep ctry (country) here | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titem dummy | |
if {$titem == ""} { | |
set titem "${incith::google::youtube_country}" | |
} | |
# fetch the html | |
set html [fetch_html $input 9] | |
# user input causing errors? | |
if {[string match -nocase "*socketerrorabort*" $html]} { | |
regsub {(.+?)\|} $html {} html | |
return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if {[string match -nocase "*timeouterrorabort*" $html]} { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
# give results an output header with result tally. | |
if {![regexp -- {<div id="search-num-results" class="name">(.*?)</div} $html - match]} { | |
set match "YouTube" | |
set titen "results" | |
} else { | |
regsub -all {\s+} [string trim $match] " " match | |
set match [split $match] | |
set titen [lindex $match end-6] | |
set match [lindex $match end] | |
} | |
# format output according to variables. | |
if {$incith::google::total_results != 0 && $match != ""} { | |
set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titen]]${::incith::google::total_demodes}${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
if {[regexp -nocase {<div class="marT10">(.+?)(</div></div>|</div><div>|</a></div>|<\!--)} $html - reply]} { | |
regsub -all -nocase {<div class="marT10">.+?(</div></div>|</div><div>|</a></div>|<\!--)} $html "" html | |
regsub -all {<td>} $reply ". " reply | |
regsub -all -- {<.*?>} $reply "" reply | |
} elseif {[regexp -nocase {id="search-no-results-message">(.*?)</div>} $html - reply]} { | |
regsub -all -- {<.*?>} $reply "" reply | |
} elseif {[regexp -nocase {id="results-main-.*?>.*?<img.*?>(.*?)<br>} $html - reply]} { | |
regsub -all -- {<.*?>} $reply "" reply | |
} else { set reply "" } | |
# parse the html | |
while {$results < $incith::google::youtube_results} { | |
# somewhat extenuated regexp due to allowing that there might be an image next to the title | |
if {[regexp -nocase {<span class="video-time">(.*?)</span.*?id="video-long.*?href="/watch\?v=(.+?)".+?title=".+?">(.+?)</a>.*?id="video\-description.*?">(.*?)</p.*?class="video\-date\-added">(.+?)</span.*?class="video\-view\-count">(.+?)</span} $html - ded4 cid desc ded ded2 ded3]} { | |
if {[string match "*</span>*" $desc]} { | |
regexp -nocase {<span class="video-time">(.*?)</span.*?id="video-long.*?href="/watch\?v=(.+?)".+?title="(.*?)">.*?id="video\-description.*?">(.*?)</p.*?class="video\-date\-added">(.+?)</span.*?class="video\-view\-count">(.+?)</span} $html - ded4 cid desc ded ded2 ded3 | |
} | |
regsub -nocase {<span class="video-time">.*?</span.*?class="video\-view\-count">.*?</span} $html "" html | |
} | |
if {[info exists desc] == 0} { | |
if {$results == 0} { | |
append output "[descdecode [string trim $reply]]${incith::google::seperator}" | |
return "$incith::google::desc_modes[descdecode $reply]$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
# keep description from becoming too lengthy and clean up trailing spaces | |
if {[info exists desc]} { | |
set desc [string range $desc 0 [expr $incith::google::description_length - 1]] | |
set desc [descdecode [string trim $desc]] | |
} | |
# append length to description for more detail | |
if {[info exists ded] && [info exists desc]} { | |
if {![string equal "<" [string index $ded 0]]} { | |
set ded " ([descdecode [string trim [string range $ded 0 [expr $incith::google::description_length - 1]]]]) " | |
} else { set ded " " } | |
if {[string match " ($desc) " $ded]} { set ded " " } | |
if {[info exists ded4]} { | |
append desc "${ded}(${ded4}; ${ded2}; ${ded3})" | |
} else { | |
append desc "${ded}" | |
} | |
} | |
# make the link valid because we were only given a partial href result, not a full url | |
if {$titem == "com" } { | |
set link "http://youtube.com/watch?v=${cid}&hl=en" | |
} else { | |
set link "http://${titem}.youtube.com/watch?v=${cid}&hl=${titem}" | |
} | |
# fullscreen window link - http://youtube.com/v/${cid} | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { | |
if {[info exists hd]} { | |
set link [string map {"&hd=1" "&fmt=22"} $link] | |
} elseif {$incith::google::youtube_highquality != 0} { | |
append link "&fmt=18" | |
} | |
set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" | |
} | |
# add the search result | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset link; unset desc ; set ded "" | |
incr results | |
} | |
return $output | |
} | |
# MYSPACEVIDS | |
# fetches links to video with search data in it (videosearch.myspace.com) | |
# -speechless supplied | |
# | |
proc myspacevids {input} { | |
; set results 0 ; set output "" ; set ded ""; set match "" ; set rating "" | |
# fetch the html | |
set html [fetch_html $input 11] | |
# give results an output header with result tally. | |
regexp -nocase -- {class="resultsInfo">.*?1-.*?\s.*?\s(.*?)\s(.*?)\s} $html - match videos | |
# format output according to variables. | |
if {$incith::google::total_results != 0 && $match != ""} { | |
set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $videos]]${::incith::google::total_demodes}${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
# parse the html | |
while {$results < $incith::google::myspacevids_results} { | |
# somewhat extenuated regexp due to allowing that there might be an image next to the title | |
regexp -nocase -- {a class="taggedlink.*?href=.*?videoid=(.*?)\&.*?>(.*?)</a>.*?<a class=.*?>(.*?)</a>.*?<ul class="videoData group">(.*?)</ul>} $html - cid desc ded rating | |
regsub -nocase -- {a class="taggedlink.*?href=.*?videoid=.*?\&.*?>.*?</a>.*?<a class=.*?>.*?</a>.*?<ul class="videoData group">.*?</ul>} $html {} html | |
# if there's no desc, return or stop looping, depending | |
if {![info exists desc]} { | |
if {$results == 0} { | |
if {[regexp -- {class="displayingSummary">(.+?)</div>} $html - reply]} { | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} elseif {[regexp -- {<p id="displaySummary" class="resultsInfo">(.*?)</p>} $html - reply]} { | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
} else { | |
break | |
} | |
} | |
# duplicate link filter, clumsy indeed.. will remove soon and fix properly | |
if {[string match "*${cid}*" $output] == 1} { | |
break | |
} | |
if {[info exists rating]} { | |
regsub -all {</li>} [string map {" " "" "\002" ""} $rating] ";" rating | |
regsub -all {<.*?>} $rating "" rating | |
regsub -all {\s+} $rating " " rating | |
regsub -all { ;} $rating ";" rating | |
} | |
if {[info exists ded]} { | |
regsub -all {<.*?>} [string trim $ded] "" ded | |
if {[string length $ded]} { set ded "(by $ded)" } | |
} | |
# keep description from becoming too lengthy and clean up trailing spaces | |
if {[info exists desc]} { | |
set desc [string trim [string range $desc 0 [expr $incith::google::description_length - 1]]] | |
set desc "${desc} ${ded}([string trim ${rating} "; "])" | |
} | |
# make the link valid because we were only given a partial href result, not a full url | |
set link "http://vids.myspace.com/index.cfm?fuseaction=vids.individual&videoid=${cid}" | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" } | |
# add the search result | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset link; unset desc | |
incr results | |
} | |
# make sure we have something to send | |
if {$match == ""} { | |
regexp -- {class="displayingSummary">(.+?)</div>} $html - reply | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
if {$incith::google::bold_descriptions != 0} { | |
regsub -all -- "(<mark>|</mark>)" $output "\002" output | |
} else { regsub -all -- "(<mark>|</mark>)" $output "" output } | |
return $output | |
} | |
# trans | |
# google translation -(www.google.com\translate_t?) | |
# -speechless supplied | |
# | |
proc trans {input where} { | |
global incithcharset | |
; set results 0 ; set output ""; set match "" ; set titem "" ; set translit "" | |
if {[regsub -nocase -all -- $incith::google::trans_input_t $input "" input]} { set y 0 } | |
if {[regsub -nocase -all -- $incith::google::trans_output_t $input "" input]} { set z 0 } | |
# split up stuff | |
regexp -nocase -- {^(.+?)@(.+?)\s(.+?)$} $input - link desc titem | |
# fetch the html | |
set ua "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3" | |
if {$::incith::google::trans_input > 0} { | |
set http [::http::config -useragent $ua -urlencoding "utf-8"] | |
} else { | |
set http [::http::config -useragent $ua -urlencoding ""] | |
} | |
set url "http://translate.google.com/translate_t?" | |
if {$::incith::google::trans_input > 0} { | |
if {![info exists y]} { | |
set ie "&ie=utf-8" | |
} else { | |
set ie "" | |
} | |
} else { | |
if {![info exists y]} { | |
set ie "" | |
} else { | |
set ie "&ie=utf-8" | |
} | |
} | |
if {$::incith::google::trans_output > 0} { | |
if {![info exists z]} { | |
set oe "&oe=utf-8" | |
} else { | |
set oe "" | |
} | |
} else { | |
if {![info exists z]} { | |
set oe "" | |
} else { | |
set oe "&oe=utf-8" | |
} | |
} | |
if {[regsub -all -- {--p} $titem {} titem]} { set ph 1 } | |
if {![info exists y]} { | |
set query "text=[urlencode $titem 0 "utf-8"]&sl=${link}&tl=${desc}$ie$oe" | |
} else { | |
set query "text=[urlencode $titem 0]&sl=${link}&tl=${desc}$ie$oe" | |
} | |
catch {set http [::http::geturl "$url" -query $query -headers $::incith_hdr -timeout [expr 1000 * 10]]} error | |
# CHECK CHECK | |
upvar #0 $http state | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
if {$incith::google::debug > 0} { | |
putserv "privmsg $incith::google::debugnick :\002url:\002 $url$query \002\037charset:\002\037 [string map -nocase {"iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $incithcharset]" | |
} | |
if {[string match -nocase "*couldn't open socket*" $error]} { | |
return "${::incith::google::error_modes}Socket Error accessing '${url}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if { [::http::status $http] == "timeout" } { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
set html [charenc [ungzip [::http::data $http] $state(meta)] $state(charset)] | |
::http::cleanup $http | |
# DEBUG DEBUG | |
set junk [open "trans.txt" w] | |
puts $junk $html | |
close $junk | |
regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html | |
regsub -all -nocase {<font.+?>} $html "" html | |
regsub -all -nocase {</font>} $html "" html | |
regsub -all -nocase {<input.+?>} $html "" html | |
regsub -all -nocase {(?:<i>|</i>)} $html "" html | |
regsub -all -nocase {<i style.*?>} $html "" html | |
regsub -all "\t" $html " " html | |
regsub -all "\n" $html " " html | |
regsub -all "\r" $html " " html | |
regsub -all "\v" $html " " html | |
regsub -all "</li>" $html ". " html | |
regsub -all ";;>" $html "" html | |
# make sure everything is lowercase. | |
# make sure everything is lowercase. | |
set desc [string tolower $desc] | |
set link [string tolower $link] | |
if {![regexp -- {<h3 id=headingtext.*?>(.+?)</h3>} $html {} detect]} { | |
if {![regexp -- {<div class="goog-inline-block goog-flat-menu-button-caption">(.*?)</div>.*?<div class="goog-inline-block goog-flat-menu-button-caption">(.*?)</div>} $html {} detect1 detect2]} { | |
set detect "" | |
} else { set detect "$detect1 $detect2" } | |
} else { regsub -all {<.*?>} $detect "" detect } | |
if {[regexp -- {</h3>.*?</object></div>(.+?)</div>} $html - match]} { | |
regsub -all {<.*?>} $match "" match | |
} elseif {[regexp -- {onmouseover="this\.style\.backgroundColor='#ebeff9'" onmouseout="this\.style\.backgroundColor='#fff'">(.*?)</span></span>} $html - match]} { | |
regsub -all {<.*?>} $match "" match | |
} elseif {[regexp -- {<textarea id=source.*?>(.*?)</textarea>} $html - match]} { | |
regsub -all {<.*?>} $match "" match | |
} | |
if {[regexp -- {<div id=src-translit class=translit.*?>(.*?)</div>} $html - translit]} { regsub -all {<.*?>} $translit "" translit } | |
if {[string length $match]} { | |
put_output $where "${::incith::google::total_modes}Google\:$::incith::google::total_demodes$::incith::google::desc_modes \(${link}\-\>${desc}\)\ [descdecode $detect]" | |
if {![info exists ph] || ![string length $translit]} { put_output $where [descdecode [descdecode ${match}]] } | |
if {[string length $translit] && [info exists ph]} { put_output $where "Phonetically: [descdecode [descdecode ${translit}]]" } | |
} else { | |
put_output $where "${::incith::google::error_modes}Translation error\:$::incith::google::error_demodes$::incith::google::desc_modes \(${link}\-\>${desc}\)\ [descdecode "$detect."]$::incith::google::desc_demodes" | |
} | |
} | |
# MININOVA TORRENT HUNT | |
# fetches torrent links from mininova. (mininova.com) | |
# -speechless supplied | |
# | |
proc mininova {input} { | |
; set results 0 ; set output ""; set match "" ; set ebcSP "" ; set match2 "" | |
#regsub -all {-} $input { } input | |
# fetch the html | |
set html [fetch_html $input 51] | |
# give results an output header with result tally. | |
regexp -- {<h1>(?!No).*?\((.+?)\s(.+?)\)} $html - match match2 | |
# format output according to variables. | |
if {$incith::google::total_results != 0} { | |
set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $match2]]${::incith::google::total_demodes}${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
regsub {<tr.*?>(.+?)</tr>} $html "" html | |
# parse the html | |
while {$results < $incith::google::mininova_results && $match != ""} { | |
# this could break any second, its cumbersome and long..i know, but for now it works. | |
regexp -nocase {<tr.*?>(.+?)</tr>} $html - htm | |
regsub {<tr.*?>(.+?)</tr>} $html "" html | |
regexp -nocase {<td>(.+?)</td><td><a href="/cat.+?>(.+?)</a>.+?<a href="/get/(.*?)".+?">.+?<a href="/tor.+?">(.+?)</a>} $htm - ebcU ebcI ebcBid ebcPR | |
regexp -nocase {<td align="right">(.+?)</td><td align="right">(.+?)</td><td align="right">(.+?)</td>} $htm - ebcShpNew ebcTim ebcCheck | |
regexp -nocase {title="Tracker URL: (.+?)"} $htm - ebcSP | |
if {$ebcSP != ""} { | |
set ebcSP "\037${ebcSP}\037 " | |
} | |
# keep torrent name from becoming too lengthy | |
if {[info exists ebcPR]} { | |
set ebcPR [string range $ebcPR 0 [expr $incith::google::description_length - 1]] | |
set ebcPR [string trim $ebcPR] | |
} | |
# check results are more than 0, return or stop looping, depending | |
if {$match < 1 } { | |
if {$results == 0} { | |
regexp -nocase {<h1>(.+?)</h1>} $html - reply | |
if {![regexp -nocase {</h1><p>(.+?)</p>} $html - reply2]} { set reply2 "" } { | |
if {![string match *Didn't* $reply2]} { regsub -all -- {<(.+?)>} $reply2 "" reply2 ; set reply2 ". $reply2" } { set reply2 "" } | |
} | |
regsub -all -- {<(.+?)>} $reply "" reply | |
return "$::incith::google::desc_modes$reply$reply2$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
# make the link valid because we were only given a partial href result, not a full url | |
set link "http://mininova.org/get/${ebcBid}" | |
# prevent duplicate results is mostly useless here, but will at least | |
# ensure that we don't get the exact same article. | |
if {[string match "*$link*" $output] == 1} { | |
break | |
} | |
# fix up our variables so the output looks purdy. | |
set desc "${ebcU}/${ebcI} ${ebcSP}\002${ebcPR}\002 (${ebcShpNew}, ${ebcTim}s, ${ebcCheck}p)" | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" } | |
# add the search result | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
append output "$desc$::incith::google::break${link}${incith::google::seperator}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset link ; set ebcCheck "" ; set ebcU "" ; set ebcSP "" | |
incr results | |
} | |
# make sure we have something to send | |
if {$match == ""} { | |
regexp -nocase {<h1>(.+?)</h1>} $html - reply | |
if {![regexp -nocase {</h1><p>(.+?)</p>} $html - reply2]} { set reply2 "" } { | |
if {![string match *Didn't* $reply2]} { regsub -all -- {<(.+?)>} $reply2 "" reply2 ; set reply2 ". $reply2" } { set reply2 "" } | |
} | |
regsub -all -- {<(.+?)>} $reply "" reply | |
return "$::incith::google::desc_modes$reply$reply2$::incith::google::desc_demodes" | |
} | |
regsub -all -- " " $input "+" input | |
append output "www.mininova.org/search/${input}/seeds" | |
#append output "www.mininova.org/search/?search=${input}" | |
return $output | |
} | |
# DAILYMOTION | |
# fetches links to video with search data in it (dailymotion.com) | |
# -speechless supplied | |
# | |
proc dailymotion {input} { | |
; set results 0 ; set output "" ; set titem "" | |
# this isn't global, so we need to keep ctry (country) here | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titem dummy | |
if {$titem == ""} { | |
set titem "${incith::google::daily_country}" | |
} | |
# fetch the html | |
set html [fetch_html $input 14] | |
# user input causing errors? | |
if {[string match -nocase "*socketerrorabort*" $html]} { | |
regsub {(.+?)\|} $html {} html | |
return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if {[string match -nocase "*timeouterrorabort*" $html]} { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
if {[regexp -- {<div class="dmco_text foreground2">(.*?)</div>} $html - nope]} { | |
regsub -all -- {</a>} $nope "." nope | |
regsub -all -- {<br/>} $nope " " nope | |
regsub -all -- {<.*?>} $nope "" nope | |
set reply "${::incith::google::desc_modes}$nope$::incith::google::desc_demodes" | |
return $reply | |
} | |
set output "DailyMotion${incith::google::seperator}" | |
if {$incith::google::bold_descriptions != 0} { | |
set output "$::incith::google::total_modes\002DailyMotion\002$::incith::google::total_demodes${incith::google::seperator}" | |
} | |
# parse the html | |
while {$results < $incith::google::daily_results} { | |
# somewhat extenuated regexp due to allowing that there might be an image next to the title | |
regexp -nocase -- {<div class="dmco_text duration">(.*?)<.*?<a class=.+?href=.*?/video/(.*?)_.*?">(.*?)<.*?<div class="dmpi_video_description foreground.*?>.*?<div>(.*?)<} $html - snatch cid desc vote | |
regsub -nocase -- {<div class="dmco_text duration">.*?<h4 class="dmco_title.*?>.*?<a class=.+?href=.*?/video/.+?_.*?">.*?div class="dmco_date">(.*?)<} $html "" html | |
# if there's no desc, return or stop looping, depending | |
if {[info exists desc] == 0} { | |
if {$results == 0} { | |
set reply "Sorry, no search results were found." | |
return "${::incith::google::desc_modes}$reply$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
set desc [string trim [string range $desc 0 [expr $incith::google::description_length - 1]]] | |
set vote [string trim [string range $vote 0 [expr $incith::google::description_length - 1]]] | |
set desc "${desc} (${snatch}) ([string trim $vote])" | |
# make the link valid because we were only given a partial href result, not a full url | |
set link "http://www.dailymotion.com/${titem}/video/${cid}" | |
# prevent duplicate results is mostly useless here, but will at least | |
# ensure that we don't get the exact same article. | |
if {[string match "*$link*" $output] == 1} { | |
break | |
} | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" } | |
# add the search result | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset link; unset desc ; unset cid | |
incr results | |
} | |
# make sure we have something to send | |
if {[info exists output] == 0} { | |
set reply "Sorry, no search results were found." | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
return $output | |
} | |
# GAMEFAQS | |
# fetches upcoming game list variable by system and region (gamefaqs.com) | |
# this is far better than any gamefaqs procedure you've seen before, this is looooong, but very simple | |
# in it's approach. I learned alot coding it. | |
# -speechless supplied | |
# | |
proc gamefaqs {system region} { | |
; set results 0 ; set output "" ; set html "" ; set match 0 ; set game "" ; set date "" | |
# strip excessive spaces from region and system desired. | |
regsub -all " " $system "" system | |
regsub -all " " $region "" region | |
# this is where most of the work is done | |
# parsing systems and regions to create an output header | |
# and cut the html down to the specified region | |
if {[string match -nocase "nds" $system] == 1} { | |
if {[string match -nocase "usa" $region] == 1} { | |
set html [fetch_html "/region-1" 15] | |
set output "\002NDS North America (USA)\002" | |
} | |
if {[string match -nocase "jap" $region] == 1} { | |
set html [fetch_html "/region-2" 15] | |
set output "\002NDS Asia (JAPAN)\002" | |
} | |
if {[string match -nocase "eur" $region] == 1} { | |
set html [fetch_html "/region-3" 15] | |
set output "\002NDS Europe (UK)\002" | |
} | |
if {[string match -nocase "aus" $region] == 1} { | |
set html [fetch_html "/region-4" 15] | |
set output "\002NDS Australia (AUS)\002" | |
} | |
} | |
if {[string match -nocase "3ds" $system] == 1} { | |
if {[string match -nocase "usa" $region] == 1} { | |
set html [fetch_html "/region-1" 56] | |
set output "\0023DS North America (USA)\002" | |
} | |
if {[string match -nocase "jap" $region] == 1} { | |
set html [fetch_html "/region-2" 56] | |
set output "\0023DS Asia (JAPAN)\002" | |
} | |
if {[string match -nocase "eur" $region] == 1} { | |
set html [fetch_html "/region-3" 56] | |
set output "\0023DS Europe (UK)\002" | |
} | |
if {[string match -nocase "aus" $region] == 1} { | |
set html [fetch_html "/region-4" 56] | |
set output "\002NDS Australia (AUS)\002" | |
} | |
} | |
if {[string match -nocase "iphone" $system] == 1} { | |
if {[string match -nocase "usa" $region] == 1} { | |
set html [fetch_html "/region-1" 16] | |
set output "\002iPhone North America (USA)\002" | |
} | |
if {[string match -nocase "jap" $region] == 1} { | |
set html [fetch_html "/region-2" 16] | |
set output "\002iPhone Asia (JAPAN)\002" | |
} | |
if {[string match -nocase "eur" $region] == 1} { | |
set html [fetch_html "/region-3" 16] | |
set output "\002iPhone Europe (UK)\002" | |
} | |
if {[string match -nocase "aus" $region] == 1} { | |
set html [fetch_html "/region-4" 16] | |
set output "\002iPhone Australia (AUS)\002" | |
} | |
} | |
if {[string match -nocase "psp" $system] == 1} { | |
if {[string match -nocase "usa" $region] == 1} { | |
set html [fetch_html "/region-1" 17] | |
set output "\002PSP North America (USA)\002" | |
} | |
if {[string match -nocase "jap" $region] == 1} { | |
set html [fetch_html "/region-2" 17] | |
set output "\002PSP Asia (JAPAN)\002" | |
} | |
if {[string match -nocase "eur" $region] == 1} { | |
set html [fetch_html "/region-3" 17] | |
set output "\002PSP Europe (UK)\002" | |
} | |
if {[string match -nocase "aus" $region] == 1} { | |
set html [fetch_html "/region-4" 17] | |
set output "\002PSP Australia (AUS)\002" | |
} | |
} | |
if {[string match -nocase "x360" $system] == 1} { | |
if {[string match -nocase "usa" $region] == 1} { | |
set html [fetch_html "/region-1" 18] | |
set output "\002XBOX360 North America (USA)\002" | |
} | |
if {[string match -nocase "jap" $region] == 1} { | |
set html [fetch_html "/region-2" 18] | |
set output "\002XBOX360 Asia (JAPAN)\002" | |
} | |
if {[string match -nocase "eur" $region] == 1} { | |
set html [fetch_html "/region-3" 18] | |
set output "\002XBOX360 Europe (UK)\002" | |
} | |
if {[string match -nocase "aus" $region] == 1} { | |
set html [fetch_html "/region-4" 18] | |
set output "\002XBOX360 Australia (AUS)\002" | |
} | |
} | |
if {[string match -nocase "xbox" $system] == 1} { | |
if {[string match -nocase "usa" $region] == 1} { | |
set html [fetch_html "/region-1" 19] | |
set output "\002XBOX North America (USA)\002" | |
} | |
if {[string match -nocase "jap" $region] == 1} { | |
set html [fetch_html "/region-2" 19] | |
set output "\002XBOX Asia (JAPAN)\002" | |
} | |
if {[string match -nocase "eur" $region] == 1} { | |
set html [fetch_html "/region-3" 19] | |
set output "\002XBOX Europe (UK)\002" | |
} | |
if {[string match -nocase "aus" $region] == 1} { | |
set html [fetch_html "/region-4" 19] | |
set output "\002XBOX Australia (AUS)\002" | |
} | |
} | |
if {[string match -nocase "gc" $system] == 1} { | |
if {[string match -nocase "usa" $region] == 1} { | |
set html [fetch_html "/region-1" 20] | |
set output "\002GAMECUBE North America (USA)\002" | |
} | |
if {[string match -nocase "jap" $region] == 1} { | |
set html [fetch_html "/region-2" 20] | |
set output "\002GAMECUBE Asia (JAPAN)\002" | |
} | |
if {[string match -nocase "eur" $region] == 1} { | |
set html [fetch_html "/region-3" 20] | |
set output "\002GAMECUBE Europe (UK)\002" | |
} | |
if {[string match -nocase "aus" $region] == 1} { | |
set html [fetch_html "/region-4" 20] | |
set output "\002GAMECUBE Australia (AUS)\002" | |
} | |
} | |
if {[string match -nocase "ps2" $system] == 1} { | |
if {[string match -nocase "usa" $region] == 1} { | |
set html [fetch_html "/region-1" 21] | |
set output "\002PS2 North America (USA)\002" | |
} | |
if {[string match -nocase "jap" $region] == 1} { | |
set html [fetch_html "/region-2" 21] | |
set output "\002PS2 Asia (JAPAN)\002" | |
} | |
if {[string match -nocase "eur" $region] == 1} { | |
set html [fetch_html "/region-3" 21] | |
set output "\002PS2 Europe (UK)\002" | |
} | |
if {[string match -nocase "aus" $region] == 1} { | |
set html [fetch_html "/region-4" 21] | |
set output "\002PS2 Australia (AUS)\002" | |
} | |
} | |
if {[string match -nocase "pc" $system] == 1} { | |
if {[string match -nocase "usa" $region] == 1} { | |
set html [fetch_html "/region-1" 22] | |
set output "\002PC North America (USA)\002" | |
} | |
if {[string match -nocase "jap" $region] == 1} { | |
set html [fetch_html "/region-2" 22] | |
set output "\002PC Asia (JAPAN)\002" | |
} | |
if {[string match -nocase "eur" $region] == 1} { | |
set html [fetch_html "/region-3" 22] | |
set output "\002PC Europe (UK)\002" | |
} | |
if {[string match -nocase "aus" $region] == 1} { | |
set html [fetch_html "/region-4" 22] | |
set output "\002PC Australia (AUS)\002" | |
} | |
} | |
if {[string match -nocase "ps3" $system] == 1} { | |
if {[string match -nocase "usa" $region] == 1} { | |
set html [fetch_html "/region-1" 23] | |
set output "\002PS3 North America (USA)\002" | |
} | |
if {[string match -nocase "jap" $region] == 1} { | |
set html [fetch_html "/region-2" 23] | |
set output "\002PS3 Asia (JAPAN)\002" | |
} | |
if {[string match -nocase "eur" $region] == 1} { | |
set html [fetch_html "/region-3" 23] | |
set output "\002PS3 Europe (UK)\002" | |
} | |
if {[string match -nocase "aus" $region] == 1} { | |
set html [fetch_html "/region-4" 23] | |
set output "\002PS3 Australia (AUS)\002" | |
} | |
} | |
if {[string match -nocase "wii" $system] == 1} { | |
if {[string match -nocase "usa" $region] == 1} { | |
set html [fetch_html "/region-1" 28] | |
set output "\002Wii North America (USA)\002" | |
} | |
if {[string match -nocase "jap" $region] == 1} { | |
set html [fetch_html "/region-2" 28] | |
set output "\002Wii Asia (JAPAN)\002" | |
} | |
if {[string match -nocase "eur" $region] == 1} { | |
set html [fetch_html "/region-3" 28] | |
set output "\002Wii Europe (UK)\002" | |
} | |
if {[string match -nocase "aus" $region] == 1} { | |
set html [fetch_html "/region-4" 28] | |
set output "\002Wii Australia (AUS)\002" | |
} | |
} | |
if {[string match -nocase "dc" $system] == 1} { | |
if {[string match -nocase "jap" $region] == 1} { | |
set html [fetch_html "/region-2" 29] | |
set output "\002Dreamcast Asia (JAPAN)\002" | |
} | |
} | |
if {[string match -nocase "mac" $system] == 1} { | |
if {[string match -nocase "usa" $region] == 1} { | |
set html [fetch_html "/region-1" 59] | |
set output "\002MAC America (USA)\002" | |
} | |
if {[string match -nocase "jap" $region] == 1} { | |
set html [fetch_html "/region-2" 59] | |
set output "\002MAC Asia (JAPAN)\002" | |
} | |
if {[string match -nocase "eur" $region] == 1} { | |
set html [fetch_html "/region-3" 59] | |
set output "\002MAC Europe (UK)\002" | |
} | |
if {[string match -nocase "aus" $region] == 1} { | |
set html [fetch_html "/region-4" 59] | |
set output "\002MAC Australia (AUS)\002" | |
} | |
} | |
if {[string length $output]} { | |
set output "$::incith::google::total_modes$output$::incith::google::total_demodes" | |
} | |
# remove the bold if it isn't desired. | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
# parse for results and loop until desired amount of results | |
# is attempted to be reached if possible. | |
while {$results < $incith::google::gamefaq_results && $output != ""} { | |
# grab date and game title and clear future html of it for looping | |
regexp -nocase {<tr.*?td>(.*?)<.+?td>.*?<td><a.+?href.+?title.+?"(.+?)">.+?<.+?a><.+?td>} $html {} date game | |
regsub {<tr.*?td>(.+?)<.+?a><.+?td>} $html "" html | |
# add the search result | |
# if there is a date, add date in bold and game to $output | |
if {[string len $date] > 3} { | |
if {$incith::google::bold_descriptions == 0} { | |
append output "${incith::google::seperator}$::incith::google::desc_modes${date} ${game}$::incith::google::desc_demodes" | |
} else { | |
append output "${incith::google::seperator}$::incith::google::desc_modes\002${date}\002 ${game}$::incith::google::desc_demodes" | |
} | |
# otherwise just add name of game | |
} elseif {[string len $game] > 1} { | |
append output "${incith::google::split_char}$::incith::google::desc_modes${game}$::incith::google::desc_demodes" | |
#append output ",${game}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
incr results | |
; set date "" ; set game "" | |
} | |
# if we have nothing to send, we have no results :( | |
if {$output == ""} { | |
set output "${::incith::google::desc_modes}Sorry, found no results! \[system = 3ds/nds/gc/wii/ps2/psp/ps3/xbox/x360/pc/mac/iphone; region = usa/jap/eur/aus\] usage: !gamefaqs system in region$::incith::google::desc_demodes" | |
} | |
return $output | |
} | |
# BLOGSEARCH | |
# fetches the news from blogsearch.google. | |
# -madwoota supplied (uses news.google engine), speechless updated | |
# | |
proc blog {input} { | |
; set results 0 ; set output "" ; set match "" ; set titem "" ; set no_search "" ; set did_you_mean "" | |
# fetch the html | |
set html [fetch_html $input 24] | |
# user input causing errors? | |
if {[string match -nocase "*socketerrorabort*" $html]} { | |
regsub {(.+?)\|} $html {} html | |
return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if {[string match -nocase "*timeouterrorabort*" $html]} { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
# strip out 'did you mean?' first | |
# what do we call 'no search results in any language?' | |
regexp -- {<p></p></div></div><div id=f>(.+?)<br><br>} $html - no_search | |
if {$no_search != ""} { | |
regsub -- {</a>} $no_search "? " no_search | |
regsub -all -- {<(.+?)>} $no_search { } no_search | |
while {[string match "* *" $no_search]} { | |
regsub -all -- { } $no_search " " no_search | |
} | |
set no_search [string trim $no_search] | |
} | |
# give results an output header with result tally. | |
regexp -- {</td><td align=right class=rsb>(.+?)\s\002(.+?)\(\002} $html - titem match | |
if {![regexp -- {1\002\s-\s\002.+?\002.+?\002(.+?)\002} $match - match]} { | |
set match "Google" | |
set titem "" | |
} | |
regsub -all -- {<(.+?)>} $match {} match | |
# format output according to variables. | |
if {$incith::google::total_results != 0 && $match > 0} { | |
set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
# parse the html | |
while {$results < $incith::google::news_results} { | |
# somewhat extenuated regexp due to allowing that there *might* be | |
# an image next to the story | |
regexp -- {</p><a href="(.+?)".+?id=.+?">(.+?)</a>.+?<td class=j>(.+?)<br>} $html {} link desc time | |
regsub -- {</p><a href=(.+?)</a>} $html {} html | |
# if there's no desc, return or stop looping, depending | |
if {[info exists desc] == 0} { | |
if {$results == 0} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
# clean up desc | |
if {[info exists desc] == 1 && $incith::google::description_length > 0} { | |
set desc [string range $desc 0 [expr $incith::google::description_length - 1]] | |
set desc "[descdecode [string trim $desc]] ([descdecode [string trim $time]])" | |
} | |
# prevent duplicate results is mostly useless here, but will at least | |
# ensure that we don't get the exact same article. | |
if {[string match "*$link*" $output] == 1} { | |
break | |
} | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" } | |
# add the search result | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset link; unset desc | |
incr results | |
} | |
# make sure we have something to send | |
if {$match == ""} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
return $output | |
} | |
# SCHOLAR SEARCH | |
# fetches the news from scholar.google. | |
# -madwoota supplied (uses news.google engine), speechless updated | |
# | |
proc scholar {input} { | |
; set results 0 ; set output "" ; set match "" ; set titem "" ; set no_search "" ; set did_you_mean "" ; set titen "" | |
# this isn't global, so we need to keep ctry (country) here | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titen dummy | |
if {$titen == ""} { | |
set titen "${incith::google::google_country}" | |
} | |
# fetch the html | |
set html [fetch_html $input 10] | |
# user input causing errors? | |
if {[string match -nocase "*socketerrorabort*" $html]} { | |
regsub {(.+?)\|} $html {} html | |
return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if {[string match -nocase "*timeouterrorabort*" $html]} { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
# strip out 'did you mean?' first | |
# what do we call 'no search results in any language?' | |
if {![regexp -- {</script><p>(.+?)\.<br>} $html - no_search]} { | |
regexp -- {</script><br><br>(.+?)<br><br>} $html - no_search | |
} | |
if {$no_search != ""} { | |
regsub -- {</a>} $no_search "? " no_search | |
regsub -all -- {<(.*?)>} $no_search { } no_search | |
while {[string match "* *" $no_search]} { | |
regsub -all -- { } $no_search " " no_search | |
} | |
set no_search [string trim $no_search] | |
} | |
# give results an output header with result tally. | |
regexp -- {align=right nowrap>(.+?)\s\002(.+?)\(\002} $html - titem match | |
if {![regexp -- {1\002\s-\s\002.+?\002.+?\002(.+?)\002} $match - match]} { | |
set match "Google" | |
set titem "" | |
} | |
regsub -all -- {<(.+?)>} $match {} match | |
# format output according to variables. | |
if {$incith::google::total_results != 0 && $match > 0} { | |
set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
# parse the html | |
while {$results < $incith::google::news_results} { | |
# somewhat extenuated regexp due to allowing that there *might* be | |
# an image next to the story | |
if {[regexp -- {<p class=g><h3 class="r">(.+?) } $html - ps]} { | |
regsub -- {<p class=g><h3 class="r">(.+?) } $html {} html | |
if {![regexp -- {<a href="(.+?)" onmousedown} $ps - link]} { set link "none" } { regsub {<a href="(.+?)" onmousedown.*?>} $ps "" ps } | |
if {[regexp -- {(.+?)</h3>.*?<br>(.*?)<br>} $ps - desc time]} { regsub {</a>} $desc "" desc } | |
} | |
# if there's no desc, return or stop looping, depending | |
if {[info exists desc] == 0} { | |
if {$results == 0} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
# clean up desc | |
if {[info exists desc] == 1 && $incith::google::description_length > 0} { | |
set desc [string range $desc 0 [expr $incith::google::description_length - 1]] | |
set desc "[string trim $desc] ([string trim $time])" | |
} | |
# prevent duplicate results is mostly useless here, but will at least | |
# ensure that we don't get the exact same article. | |
if {[string match "*$link*" $output] == 1} { | |
break | |
} | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" } | |
# add the search result | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
if {![string equal $link "none"]} { | |
if {![string match "http*" $link]} { set link "http://scholar.google.${titen}/$link" } | |
append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}" | |
} else { | |
append output "[descdecode $desc]${incith::google::seperator}" | |
} | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset link; unset desc | |
incr results | |
} | |
# make sure we have something to send | |
if {$match == ""} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
return $output | |
} | |
# WIKI | |
# fetches wiki info from *.wikipedia.org | |
# -speechless supplied | |
# | |
proc wiki {input} { | |
global incithcharset | |
; set output "" ; set ded "" ; set match "" ; set redir "" ; set country "" ; set dec "" | |
; set query "" ; set titem "" ; set ebcPR "" ; set results "" ; set tresult "" ; set red 0 | |
; set subtag "" ; set region "" ; set regional "" | |
# make it so people can search their country | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - country input | |
if {$country == ""} { | |
set country "${incith::google::wiki_country}" | |
} | |
regexp -nocase -- {(.*)\@(.*)} $country - country region | |
# this is my input encoding hack, this will convert input before it goes | |
# out to be queried. | |
if {$incith::google::encoding_conversion_input > 0 && $region != ""} { | |
set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "${region}:*"]] :] 1] | |
} elseif {$incith::google::encoding_conversion_input > 0 && $country != ""} { | |
set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "${country}:*"]] :] 1] | |
} else { set encoding_found "" } | |
if {$encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} { | |
set input [encoding convertfrom $encoding_found $input] | |
} | |
regsub -all -- {_} $input { } input | |
regexp -- {^(.+?)\#(.+?)$} $input - input results | |
regsub -all -- {_} $results { } results | |
set input [urlencode $input 0 "utf-8"] | |
set results [string map {.20 _} [urlencode [string trim $results] 1 "utf-8"]] | |
# 1st load of webpage - this is the only part which has error control | |
# this is where we load the search page to find an exact match or most relevant. | |
# we will also be able to detect bad user input in the form of socket errors. | |
# beware, changing the useragent will result in differently formatted html from Google. | |
set query "http://${country}.wikipedia.org/wiki/index.php?title=Special%3ASearch&search=${input}&fulltext=Search" | |
set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e" | |
set http [::http::config -useragent $ua -urlencoding "utf-8"] | |
# stole this bit from rosc2112 on egghelp forums | |
# borrowed is a better term, all procs eventually need this error handler. | |
catch {set http [::http::geturl "$query" -headers $::incith_hdr -timeout [expr 1000 * 5]]} error | |
if {[string match -nocase "*couldn't open socket*" $error]} { | |
return "${::incith::google::error_modes}Socket Error accessing '${country}.wikipedia.org' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if { [::http::status $http] == "timeout" } { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
# CHECK CHECK | |
upvar #0 $http state | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
set html [charenc [ungzip [::http::data $http] $state(meta)] $state(charset)] | |
set redir [::http::ncode $http] | |
# REDIRECT | |
if {[string match "*${redir}*" "302|301" ]} { | |
foreach {name value} $state(meta) { | |
if {[regexp -nocase ^location$ $name]} { | |
catch {set http [::http::geturl "$value" -query "" -headers $::incith_hdr -timeout [expr 1000 * 10]]} error | |
if { $::incith::google::debug > 0 } { putserv "privmsg $::incith::google::debugnick :\002redirected:\002 $query -> $value" } | |
if {[string match -nocase "*couldn't open socket*" $error]} { | |
return "${::incith::google::error_modes}Socket Error accessing '${country}.wikipedia.org' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if { [::http::status $http] == "timeout" } { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
upvar #0 $http state | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
set html [charenc [ungzip [::http::data $http] $state(meta)] $state(charset)] | |
set query $value | |
} | |
} | |
} | |
::http::cleanup $http | |
# generic pre-parsing | |
regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html | |
regsub -all -nocase {<font.+?>} $html "" html | |
regsub -all -nocase {</font>} $html "" html | |
regsub -all -nocase {<input.+?>} $html "" html | |
regsub -all -nocase {(?:<i>|</i>)} $html "" html | |
regsub -all "\t" $html " " html | |
regsub -all "\n" $html " " html | |
regsub -all "\r" $html " " html | |
regsub -all "\v" $html " " html | |
regsub -all "</li>" $html ". " html | |
regsub -all ";;>" $html "" html | |
regsub {<div class="floating_object".*?>.*?</div>} $html "" html | |
if {$html == ""} { return "$::incith::google::error_modes\002Wikipedia Error:\002 No html to parse.$::incith::google::error_demodes" } | |
# see if our direct result is available and if so, lets take it | |
if {![regexp -- {<div id="contentSub"><p>.*?<a href="(.+?)".*?title} $html - match]} { | |
if {![regexp -- {<div class=.searchresults.><p>*?<a href="(.+?)".*?title} $html - match]} { | |
regexp -- {<div class=.searchresults.><p class="mw-search.*?>.*?<a href="(.+?)".*?title} $html - match | |
} | |
} | |
if {[string match -nocase "*action=edit*" $match]} { set match "" } | |
# otherwise we only care about top result | |
if {$match == ""} { | |
if {![regexp -- {<li><a href="((?!http).+?)"} $html - match]} { | |
if {![regexp -- {<li style.*?><a href="(.+?)"} $html - match]} { | |
if {![regexp -- {<div class='searchresults'>.*?<a href="(.*?)".*?class="mw-redirect">} $html - match]} { | |
if {[regexp -- {<li><div class='mw-search-result-heading'>(.*?)</div>} $html - slice]} { | |
if {![regexp -- {<span class='searchalttitle'>.*?<a href="(.*?)"} $slice - match]} { | |
regexp -- {<a href="(.*?)"} $slice - match | |
} | |
} | |
} | |
} | |
} | |
} | |
#if {[string match "http://*" $match]} { set match "" } | |
if {[string match -nocase "*/wiki*" $country]} { | |
regsub -- {/wiki} $country {} country | |
} | |
# DEBUG DEBUG | |
set junk [open "ig-debug.txt" w] | |
puts $junk $html | |
close $junk | |
# at this point we can tell if there was any match, so let's not even bother | |
# going further if there wasn't a match, this pulls the 'no search etc' found. | |
# this can be in any language. | |
if {$match == ""} { | |
# these are for 'no search results' or similar message | |
# these can be in any language. | |
if {[regexp -- {<div class='searchresults'>(.+?)</p>} $html - match]} { | |
regsub -all {(?:<b>|</b>|<em>|</em>)} $match "\002" match | |
regsub -- {<a href="/wiki/Special\:Allpages.*?</a>} $match "." match | |
regsub -all {<div id.*?>} $match "" match | |
regsub -- {</a></div>} $match "?" match | |
regsub -all {</div>} $match "" match | |
regsub -all {\[Index\]} $match "" match | |
regsub -all {<span.*?/span>} $match "" match | |
regsub -all {<script type.*?</script>} $match "" match | |
regsub -all { \(<.*?>\)} $match ". " match | |
if {[string match "*<!--*" $match]} { | |
regexp -- {<li class="normal">.*?</p><p>(.*?)</p>} $html - match | |
} | |
} else { | |
if {[regexp -- {<div id='search results'><p class="mw-search.*?>(.*?)</p>} $html - match]} { | |
regsub -all {(?:<b>|</b>|<em>|</em>)} $match "\002" match | |
} | |
} | |
if {$match == ""} { | |
if {[regexp -nocase -- {<div class='searchresults'>(.*?)<div class="printfooter">} $html - match]} { | |
regsub -all {<p>} $match " " match | |
regsub -all {(?:<b>|</b>|<em>|</em>)} $match "\002" match | |
regsub -- {<a href="/wiki/Special\:Allpages.*?</a>} $match "." match | |
regsub -all {<div id.*?>} $match "" match | |
regsub -- {</a></div>} $match "?" match | |
regsub -all {</div>} $match "" match | |
regsub -all {\[Index\]} $match "" match | |
regsub -all {<span.*?/span>} $match "" match | |
regsub -all {<script type.*?</script>} $match "" match | |
regsub -all { \(<.*?>\)} $match ". " match | |
} | |
} | |
# this is our last error catch, this can grab the | |
# 'wikimedia cannot search at this time' message | |
# this can be in any language. | |
if {[string len $match] < 3} { regexp -- {<center><b>(.+?)</b>} $html - match } | |
if {$match == ""} { | |
regsub -all -- { } $results {_} results | |
if {$results != ""} { set results "#${results}" } | |
return "$::incith::google::error_modes\002Wikimedia Error:\002 Unable to parse for: \002${input}\002 @ ${query}${results}$::incith::google::error_demodes" | |
} | |
# might be tags since we allowed any language here we cut them out | |
regsub -all -- {<(.+?)>} $match {} match | |
if {$region == ""} { | |
return "$::incith::google::desc_modes[utf8encodefix $country [descdecode ${match}]]$::incith::google::desc_demodes" | |
} else { | |
return "$::incith::google::desc_modes[utf8encodefix $region [descdecode ${match}]]$::incith::google::desc_demodes" | |
} | |
} | |
# we assume here we found another page to traverse in our search. | |
if {$region != ""} { | |
regsub -- {/wiki/} $match "/$region/" match | |
} | |
if {![string match http://* $match]} { set query "http://${country}.wikipedia.org${match}" } { set query $match } | |
# 2nd load of webpage - this has no error checking what-so-ever | |
# here is where we pluck the link to the exact match, or the most relevant 'top' link. | |
# or in the case of redirects, to other pages, we will handle that here as well. | |
# beware, changing the useragent will result in differently formatted html from Google. | |
set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e" | |
set http [::http::config -useragent $ua -urlencoding "utf-8"] | |
set http [::http::geturl "$query" -headers $::incith_hdr -timeout [expr 1000 * 5]] | |
upvar #0 $http state | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
# this is the output encoding hack. | |
if {$incith::google::encoding_conversion_output > 0} { | |
if {$region != ""} { | |
set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$region:*"]] :] 1] | |
} else { | |
set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$country:*"]] :] 1] | |
} | |
} | |
set html [charenc [ungzip [::http::data $http] $state(meta)] $state(charset)] | |
if {$incith::google::debug > 0} { | |
putserv "privmsg $incith::google::debugnick :\002url:\002 $query \002charset:\002 [string map -nocase {"iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $incithcharset] \002\037encode_string:\037\002 $encoding_found" | |
} | |
::http::cleanup $http | |
#correct the html, remove shitty tags | |
# generic pre-parsing | |
regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html | |
regsub -all -nocase {<font.+?>} $html "" html | |
regsub -all -nocase {</font>} $html "" html | |
regsub -all -nocase {<input.+?>} $html "" html | |
regsub -all -nocase {(?:<i>|</i>)} $html "" html | |
regsub -all "\t" $html " " html | |
regsub -all "\n" $html " " html | |
regsub -all "\r" $html " " html | |
regsub -all "\v" $html " " html | |
regsub -all "</li>" $html ". " html | |
regsub -all ";;>" $html "" html | |
if {$incith::google::bold_descriptions > 0 && [string match "\002" $incith::google::desc_modes] != 1} { | |
regsub -all -nocase {(?:<b>|</b>)} $html "\002" html | |
} | |
set match "" | |
# are we redirected to another page? if so, let's go there | |
regexp -- {alt="#REDIRECT ".+?<a href="(.+?)" title="} $html - match | |
if {$match != ""} { | |
incr red 1 | |
set query "http://${country}.wikipedia.org${match}" | |
# 3rd load of webpage - this has no error checking what-so-ever | |
# here is our final webpage, this is hopefully what the user was looking for. | |
# beware, changing the useragent will result in differently formatted html from Google. | |
set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e" | |
set http [::http::config -useragent $ua -urlencoding "utf-8"] | |
set http [::http::geturl $query -headers $::incith_hdr -timeout [expr 1000 * 10]] | |
upvar #0 $http state | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
# this is the output encoding hack. | |
if {$incith::google::encoding_conversion_output > 0} { | |
if {$region != ""} { | |
set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$region:*"]] :] 1] | |
} else { | |
set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$country:*"]] :] 1] | |
} | |
} else { set incithcharset "" } | |
set html [charenc [ungzip [::http::data $http] $state(meta)] $state(charset)] | |
if {$incith::google::debug > 0} { | |
putserv "privmsg $incith::google::debugnick :\002url:\002 $query \002charset:\002 [string map -nocase {"iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $incithcharset] \002\037encode_string:\037\002 $encoding_found" | |
} | |
::http::cleanup $http | |
#correct the html, remove shitty tags | |
# generic pre-parsing | |
regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html | |
regsub -all -nocase {<font.+?>} $html "" html | |
regsub -all -nocase {</font>} $html "" html | |
regsub -all -nocase {<input.+?>} $html "" html | |
regsub -all -nocase {(?:<i>|</i>)} $html "" html | |
regsub -all "\t" $html " " html | |
regsub -all "\n" $html " " html | |
regsub -all "\r" $html " " html | |
regsub -all "\v" $html " " html | |
regsub -all "</li>" $html ". " html | |
regsub -all ";;>" $html "" html | |
if {$incith::google::bold_descriptions > 0 && [string match "\002" $incith::google::desc_modes] != 1} { | |
regsub -all -nocase {(?:<b>|</b>)} $html "\002" html | |
} | |
} | |
set match "" | |
# give results an output header with result tally. | |
if {[regexp -- {<title>(.+?)</title>} $html - match]} { regexp -- {(.+?)\s(?:-|-)\s} $match - match } | |
# see if page has a redirect to fragment | |
regexp -- {redirectToFragment\("\#(.*?)"\)} $html - tresult | |
if {[string match "*#*" $query]} { regexp -- {^(.*?)#(.*?)$} $query - query tresult } | |
if {![string match "*<a name=*" $html]} { set walt 1 } | |
# this is my kludge to allow listing table of contents, to make | |
# sub-tag lookups easier to see on irc. | |
if {[string length $results]} { | |
set tresult "" | |
set subtag [string tolower $results] | |
# if the table of contents exists on the page, lets use real world words | |
# instead of ugly subtags... | |
if {[string match "*<table id=\"toc*" $html]} { | |
set ded "\002ToC\002\: " ; set ebcPR "" ; set results "" | |
# set results [regexp -inline -all -- {<li class="toclevel.*?<span class="toctext">(.*?)</span>} $html] | |
set results [regexp -inline -all -- {<li class="toclevel.*?href="#(.*?)"} $html] | |
foreach {junk anchor} $results { lappend anchors $anchor } | |
#if {![info exists anchors]} { set anchors "toc" } | |
if {[string tolower $subtag] == "toc"} { | |
foreach anchor $anchors { lappend new [string map {"_" " "} [subtagDecode $anchor]] } | |
append ded [join $new "; "] | |
set toc 1 | |
} else { | |
set ded "" | |
} | |
} else { | |
# table of contents doesnt exist for the page, so we are manually | |
# going to pull them for the user ourselves. | |
set ded "\002\(ToC)\002: " ; set ebcPR "" | |
if {![info exists walt]} { | |
set results [regexp -inline -all -- {<a name=".*?id="(.+?)"} $html] | |
} else { | |
set results [regexp -inline -all -- {<span class="mw-headline".*?id="(.*?)"} $html] | |
} | |
foreach {junk anchor} $results { lappend anchors $anchor } | |
#if {![info exists anchors]} { set anchors "toc" } | |
if {[string tolower $subtag] == "toc"} { | |
foreach anchor $anchors { lappend new [string map {"_" " "} [subtagDecode $anchor]] } | |
append ded [join $new "; "] | |
set toc 1 | |
} else { | |
set ded "" | |
} | |
} | |
} | |
# this is in case an internal redirectToFragment(# ) was found | |
if {$tresult != ""} { | |
set subtag $tresult | |
incr red 1 | |
if {![info exists walt]} { | |
set redir "<a name=\"${subtag}\".*?>(.*?)(?:<a name|<div class=\"printfooter)" | |
} else { | |
if {[string index $tresult 0] == "#"} { set tresult [string range $tresult 1 end] ; set subtag $tresult } | |
set redir "<span class=\"mw-headline\" id=\"${subtag}\".*?>(.*?)(?:<span class=\"mw-headline|<div class=\"printfooter)" | |
} | |
regexp -nocase "$redir" $html - ded | |
regsub -all -- {\[<(.*?)>\]} $ded {} ded | |
regsub -all -- {\[[[:digit:]]+\]} $ded {} ded | |
regsub -all -- {<th style=.*?</th>} $ded {} ded | |
regsub -all -- {<table.+?</table>} $ded {} ded | |
if {$ded == ""} { | |
return "$::incith::google::error_modes\002Wikipedia Error:\002 redirectToFragment(#${tresult}) not found in body of html @ ${query} . This Wiki Entry is flawed and should be reported for redirect errors.$::incith::google::error_demodes" | |
} | |
} | |
# This is for our manual #sub-tag search.. | |
if {![string equal [string tolower $subtag] "toc"] && [string length $subtag] && ![string length $tresult]} { | |
set subtag [string map {" " "_"} $subtag] | |
# direct match | |
if {[info exists anchors]} { | |
foreach entry $anchors { | |
if {[string match -nocase $entry $subtag] || [string match -nocase [subtagDecode $entry] $subtag]} { | |
set stf "true" | |
incr red 1 | |
set subtag [string map {" " "_"} $entry] | |
break | |
} | |
} | |
if {![info exists stf]} { | |
# starts the anchor | |
foreach entry $anchors { | |
if {[string match -nocase "$subtag*" $entry] || [string match -nocase [subtagDecode "$subtag*"] $entry]} { | |
set stf "true" | |
incr red 1 | |
set subtag [string map {" " "_"} $entry] | |
break | |
} | |
} | |
} | |
if {![info exists stf]} { | |
# anywhere in the anchor | |
foreach entry $anchors { | |
if {[string match -nocase "*$subtag*" $entry] || [string match -nocase [subtagDecode "*$subtag*"] $entry]} { | |
set stf "true" | |
incr red 1 | |
set subtag [string map {" " "_"} $entry] | |
break | |
} | |
} | |
} | |
} | |
if {![info exists stf]} { | |
return "$::incith::google::error_modes\002Wikipedia Error:\002 Manual #anchor (${subtag}) not found in body of html @ ${query} .$::incith::google::error_demodes" | |
} | |
if {![info exists walt]} { | |
set redir "<a name=\"${subtag}\".*?>(.*?)(?:<a name|<div class=\"printfooter)" | |
} else { | |
set redir "<span class=\"mw-headline\" id=\"${subtag}\".*?>(.*?)(?:<span class=\"mw-headline|<div class=\"printfooter)" | |
} | |
regexp -nocase "${redir}" $html - ded | |
regsub -all -- {\[<(.*?)>\]} $ded {} ded | |
regsub -all -- {\[[[:digit:]]+\]} $ded {} ded | |
regsub -all -- {<th style=.*?</th>} $ded {} ded | |
regsub -all -- {<table.+?</table>} $ded {} ded | |
if {$ded == ""} { | |
return "$::incith::google::error_modes\002Wikipedia Error:\002 Unknown problem with (${subtag}) found @ ${query} .$::incith::google::error_demodes" | |
} | |
} | |
# we couldn't chop these earlier because we needed them | |
# to easily pull our #sub-tag finder above, need to remove | |
# them here before we go further, because it might upset our checks. | |
regsub -all -nocase {<span.*?>} $html "" html | |
regsub -all -nocase {</span>} $html "" html | |
# if we have no pre-cut html, let's start the cutting process. | |
if {$ded == ""} { | |
regsub -all {<div id="siteNotice">.*?</p></div>} $html {} html | |
regsub -all {<script type=.*?</script>} $html {} html | |
regsub -all {<th style=.*?</th>} $html {} html | |
regsub -all {//<.*?//]]>} $html {} html | |
### - trying to clear out those damned wikipedia tables -- | |
regsub -all -- {<table.+?</table>} $html {} html | |
regexp -- {<p>(.+?)<h} $html - ded | |
if {[string match "*</table>*" $ded]} { | |
regsub -all -- {.+?</table>} $ded {} ded | |
} elseif {[string match "*<table*" $ded]} { | |
regsub -all -- {<table.*>.+?} $ded {} ded | |
} | |
} | |
# if wiki page is non-standard, then this will attempt | |
# to get at least something from the webpage to display. | |
if {$ded == ""} { | |
if {![regexp -- {<p>(.+?)</p>} $html - ded]} { | |
regexp -- {<p>(.+?)<div class="printfooter">} $html - ded | |
} | |
} | |
#clean up messy parsing. | |
regsub -all -- {<br>|<br/>} $ded {. } desc | |
regsub -all -- {\[<(.*?)>\]} $desc {} desc | |
regsub -all -- {<(.+?)>} $desc {} desc | |
while {[string match "* *" $desc]} { | |
regsub -all -- { } $desc " " desc | |
} | |
regsub -all -- {\[[[:digit:]]+\]} $desc {} desc | |
regsub -all -- { , } $desc ", " desc | |
regsub -all -- { \.} $desc "\." desc | |
set match [string trim $match] | |
# if we have a very short description this will grab more. | |
if {$match != ""} { | |
if {[string len $desc] < 3} { | |
regexp -- {<p>.+?<p>(.+?)<h} $html - ded | |
regsub -all -- {<(.+?)>} $ded { } desc | |
} | |
} | |
# if we still have a tiny description, grab more yet. | |
if {$match != ""} { | |
if {[string len $desc] < 3} { | |
regexp -- {<p>(.+?)<p} $html - ded | |
regsub -all -- {<(.+?)>} $ded { } desc | |
} | |
} | |
# clean up messy parsing. | |
# here we try to sanitize the description | |
# i'm hoping this works with any language, *crosses fingers* | |
set desc [string trim $desc] | |
regsub -all -- {<br>} $desc {. } desc | |
regsub -all -- {\[<(.*?)>\]} $desc {} desc | |
regsub -all -- {<(.+?)>} $desc {} desc | |
while {[string match "* *" $desc]} { | |
regsub -all -- { } $desc " " desc | |
} | |
regsub -all -- {\[[[:digit:]]+\]} $desc {} desc | |
regsub -all -- { , } $desc ", " desc | |
regsub -all -- { \.} $desc "\." desc | |
# regsub -all -- {&#(25(\[6-9\])?|2(\[6-9\])?[\d]|(\[3-9\])?[\d]{2}|[\d]{4,5});} $desc "?" desc | |
# set our variables so formatting settings work | |
if {$subtag != ""} { | |
#regsub -- {" id="top".*?$} $subtag "" subtag | |
set subtag "#${subtag}" | |
} | |
set link $query | |
set desc [descdecode $desc] | |
if {![info exists toc]} { set desc "[string range $desc 0 [expr 360 * $incith::google::wiki_lines]]" } | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim "$link$subtag"]$incith::google::link_demodes" } | |
if {[info exists match]} { set match "$incith::google::total_modes[string trim $match]$incith::google::total_demodes" } | |
# after stripping excessive tags if our description is | |
# reduced to nothing, let's lie and say it was too much to parse :) | |
if {$match != "" && $desc == ""} { | |
regexp -- {<h[0-9].*?>.*?h[0-9]>.*?<ul>(.*?)</ul>} $html - desc | |
set desc [string trim $desc] | |
regsub -all -- {<br>} $desc {. } desc | |
regsub -all -- {\[<(.*?)>\]} $desc {} desc | |
regsub -all -- {<(.+?)>} $desc {} desc | |
while {[string match "* *" $desc]} { | |
regsub -all -- { } $desc " " desc | |
} | |
regsub -all -- {\[[[:digit:]]+\]} $desc {} desc | |
regsub -all -- { , } $desc ", " desc | |
regsub -all -- { \.} $desc "\." desc | |
set desc "${::incith::google::desc_modes}$desc${::incith::google::desc_demodes}" | |
} | |
# if we have no description, then let's decide what to do. | |
if {$desc == ""} { | |
regexp -- {<p>(.+?)</p>} $html - match | |
if {$match != ""} { return "$::incith::google::error_modes\002Wikipedia Error:\002 Unable to parse for: \002${input}\002 @ ${query}${subtag}$::incith::google::error_demodes" } | |
if {$match == ""} { return "$::incith::google::error_modes\002Wikipedia Error:\002 Sorry, no search results found.$::incith::google::error_demodes" } | |
break | |
} | |
# regular output displayed. | |
if {$match != ""} { | |
if {$red > 0} { | |
set output "\002[descdecode ${match}]\002${incith::google::seperator}${desc}$::incith::google::break${link} $::incith::google::total_modes\[${red} Redirect\(s\)\]$incith::google::total_demodes" | |
} else { | |
set output "\002[descdecode ${match}]\002${incith::google::seperator}${desc}$::incith::google::break${link}" | |
} | |
} else { | |
if {$red > 0} { | |
set output "${desc}$::incith::google::break${link} $::incith::google::total_modes\[${red} Redirect\(s\)\]$::incith::google::total_demodes" | |
} else { | |
set output "${desc}$::incith::google::break${link}" | |
} | |
} | |
return $output | |
} | |
# WIKIMEDIA | |
# fetches wiki info from sites other than wikipedia.org | |
# -speechless supplied | |
# | |
proc wikimedia {input} { | |
global incithcharset | |
; set output "" ; set ded "" ; set match "" ; set redir "" ; set country "" ; set dec "" | |
; set query "" ; set titem "" ; set ebcPR "" ; set results "" ; set tresult "" ; set red 0 | |
; set subtag "" ; set no_search "" ; set force 0 ; set fr 0 ; set natch "" ; set region "" | |
; set regional "" | |
# make it so people can search their wiki in proper encoding.... | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - country input | |
if {$country == ""} { | |
set country "${incith::google::wikimedia_site}" | |
} | |
regexp -nocase -- {(.*)\@(.*)} $country - country region | |
# allow full search if desired | |
if {[string match "+" [string range $region 0 0]]} { | |
set region [string range $region 1 end] | |
set regional $region | |
} | |
# this is my input encoding hack, this will convert input before it goes | |
# out to be queried. | |
if {$incith::google::encoding_conversion_input > 0 && $region != ""} { | |
set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "${region}:*"]] :] 1] | |
} elseif {$incith::google::encoding_conversion_input > 0 && $country != ""} { | |
set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "${country}:*"]] :] 1] | |
} else { set encoding_found "" } | |
if {$encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} { | |
set input [encoding convertfrom $encoding_found $input] | |
} | |
regsub -all -- {_} $input { } input | |
regexp -- {^(.+?)\#(.+?)$} $input - input results | |
regsub -all -- { } $results { } results | |
set input [urlencode $input 0 "utf-8"] | |
set results [string map {.20 _} [urlencode [string trim $results] 1 "utf-8"]] | |
# force is for those times you want to MAKE | |
# it directly go to a location, you use force | |
# by making first letter of your search term a . | |
set force [regexp -nocase -- {^\.(.+?)$} $input - input] | |
if {$force == 1} { | |
#set query "http://${country}/index.php?search=${input}&go=Go" | |
set query "http://${country}/index.php/${input}" | |
#set match "/index.php?search=${input}&go=Go" | |
#set match "/index.php/${input}" | |
} else { | |
set query "http://${country}/index.php?title=Special%3ASearch&search=${input}&fulltext=Search" | |
} | |
# pre-load page to get damn redirects out of the way | |
# this is stupid i agree, but let's not think about it. | |
# beware, changing the useragent will result in differently formatted html from Google. | |
set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e" | |
set http [::http::config -useragent $ua -urlencoding "utf-8"] | |
# stole this bit from rosc2112 on egghelp forums | |
# borrowed is a better term, all procs eventually need this error handler. | |
catch {set http [::http::geturl $query -headers $::incith_hdr -timeout [expr 1000 * 5]]} error | |
if {[string match -nocase "*couldn't open socket*" $error]} { | |
return "${::incith::google::error_modes}Socket Error accessing '${query}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if { [::http::status $http] == "timeout" } { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
# CHECK CHECK | |
upvar #0 $http state | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
set html [charenc [ungzip [::http::data $http] $state(meta)] $state(charset)] | |
# REDIRECT | |
if {[string match "*${redir}*" "302|301" ]} { | |
foreach {name value} $state(meta) { | |
if {[regexp -nocase ^location$ $name]} { | |
catch {set http [::http::geturl "$v" -query "" -headers $::incith_hdr -timeout [expr 1000 * 10]]} error | |
if {[string match -nocase "*couldn't open socket*" $error]} { | |
return "${::incith::google::error_modes}Socket Error accessing '${query}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if { [::http::status $http] == "timeout" } { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
upvar #0 $http state | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
set html [charenc [ungzip [::http::data $http] $state(meta)] $state(charset)] | |
set query $value | |
incr red | |
} | |
} | |
} | |
::http::cleanup $http | |
# are we redirected to another page so soon? | |
# usually this is the case, if our original search page wants | |
# to search using another method, so let's accomodate it... | |
regexp -nocase -- {document has moved.+?<a href="(.+?)">} $html - match | |
regexp -nocase -- {Did you mean to type.+?<a href="(.+?)">} $html - match | |
# if we are redirected, then we can modify our url | |
# to include the redirect as our new destination site. | |
if {$match != ""} { | |
incr red 1 ; set fr 1 | |
set query $match | |
regsub -all "&" $query {\&} query | |
regexp -- {http\:\/\/(.+?)/index.php} $match - country | |
} | |
# 1st load of webpage - this is the only part which has error control | |
# this is where we load the search page to find an exact match or most relevant. | |
# we will also be able to detect bad user input in the form of socket errors. | |
# beware, changing the useragent will result in differently formatted html from Google. | |
if {$fr == 1} { | |
set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e" | |
set http [::http::config -useragent $ua -urlencoding "utf-8"] | |
set http [::http::geturl $query -headers $::incith_hdr -timeout [expr 1000 * 15]] | |
upvar #0 $http state | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
set html [charenc [ungzip [::http::data $http] $state(meta)] $state(charset)] | |
::http::cleanup $http | |
} | |
# generic pre-parsing | |
regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html | |
regsub -all -nocase {<font.+?>} $html "" html | |
regsub -all -nocase {</font>} $html "" html | |
regsub -all -nocase {<span.*?>} $html "" html | |
regsub -all -nocase {</span>} $html "" html | |
regsub -all -nocase {<input.+?>} $html "" html | |
regsub -all -nocase {(?:<i>|</i>)} $html "" html | |
regsub -all "\t" $html " " html | |
regsub -all "\n" $html " " html | |
regsub -all "\r" $html " " html | |
regsub -all "\v" $html " " html | |
regsub -all "</li>" $html ". " html | |
regsub -all ";;>" $html "" html | |
regsub {<div class="floating_object".*?>.*?</div>} $html "" html | |
if {$html == ""} { return "$::incith::google::error_modes\002Wikimedia Error:\002 No html to parse.$::incith::google::error_demodes" } | |
# this is my kludge, enjoy it | |
if {$force == 0} { | |
# see if our direct result is available and if so, lets take it | |
if {![regexp -- {<div id="contentSub"><p>.*?<a href="((?!#).+?)".*?title} $html - match]} { | |
regexp -nocase -- {<div class='searchresults'>.*?<a href="(.*?)".*?(class=|title=|style=)} $html - match | |
} | |
if {[string match -nocase "*action=edit*" $match]} { set match "" } | |
# otherwise we only care about top result | |
# this is the _only_ way to parse mediawiki, sorry. | |
if {$match == ""} { | |
regexp -- {<li><a href="(.*?)"} $html - match | |
if {$match == ""} { | |
if {![regexp -- {<li><div class='mw-search.*?'><a href="(.*?)"} $html - match]} { | |
regexp -- {<li style.*?><a href="(.+?)"} $html - match | |
} | |
} | |
} | |
# this will strip double domain entries from our country if it exists | |
# on our anchor. | |
if {$incith::google::wiki_domain_detect != 0} { | |
if {[string match -nocase [lindex [split $country "/"] end] [lindex [split $match "/"] 1]]} { | |
set country [join [lrange [split $country "/"] 0 end-1] "/"] | |
} | |
} elseif {[string match -nocase "*/wiki*" $country]} { | |
regsub -- {/wiki} $country {} country | |
} | |
# at this point we can tell if there was any match, so let's not even bother | |
# going further if there wasn't a match, this pulls the 'no search etc' found. | |
# this can be in any language. | |
if {$match == ""} { | |
# these are for 'no search results' or similar message | |
# these can be in any language. | |
# if {[regexp -- {</form>.*?<p>(.+?)(<p><b>|</p><hr)} $html - match]} { regsub -all -- {<(.+?)>} $match {} match } | |
if {$match == ""} { | |
if {[regexp -- {<div class='searchresults'>(.+?)</p>} $html - match]} { | |
regsub -all {(?:<b>|</b>|<em>|</em>)} $match "\002" match | |
} else { | |
if {[regexp -- {<div id="contentSub">(.+?)<form id=} $html - match]} { | |
regsub -all {(?:<b>|</b>|<em>|</em>)} $match "\002" match | |
regsub -- {<a href="/wiki/Special\:Allpages.*?</a>} $match "." match | |
regsub -- {<div id.*?>} $match "" match | |
regsub -- {</a></div>} $match "?" match | |
regsub -- {</div>} $match "" match | |
regsub -- {\[Index\]} $match "" match | |
regsub -- {<span.*?/span>} $match "" match | |
regsub -- { \(<.*?>\)} $match ". " match | |
if {[string match "*<!--*" $match]} { | |
regexp -- {<li class="normal">.*?</p><p>(.*?)</p>} $html - match | |
} | |
} | |
} | |
} | |
# this is our last error catch, this can grab the | |
# 'wikimedia cannot search at this time' message | |
# this can be in any language. | |
if {[string len $match] < 3} { regexp -- {<center><b>(.+?)</b>} $html - match } | |
if {$match == ""} { | |
regsub -all -- { } $results {_} results | |
if {$results != ""} { set results "#${results}" } | |
return "$::incith::google::error_modes\002Wikimedia Error:\002 Unable to parse for: \002${input}\002 @ ${query}${results}$::incith::google::error_demodes" | |
} | |
# might be tags since we allowed any language here we cut them out | |
regsub -all -- {<(.+?)>} $match "" match | |
if {$region == ""} { | |
return "$::incith::google::desc_modes[utf8encodefix $country [descdecode ${match}]]$::incith::google::desc_demodes" | |
} else { | |
return "$::incith::google::desc_modes[utf8encodefix $region [descdecode ${match}]]$::incith::google::desc_demodes" | |
} | |
} | |
# this lets us easily change our internal sub redirected wiki link. | |
#if {$regional != ""} { | |
# regsub -- {/wiki/} $match "/$region/" match | |
#} | |
# we assume here we found another page to traverse in our search. | |
if {![string match "*http*" $match]} { set query "http://${country}${match}" } { set query $match } | |
# 2nd load of webpage - this has no error checking what-so-ever | |
# here is where we pluck the link to the exact match, or the most relevant 'top' link. | |
# or in the case of redirects, to other pages, we will handle that here as well. | |
# beware, changing the useragent will result in differently formatted html from Google. | |
set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e" | |
set http [::http::config -useragent $ua -urlencoding "utf-8"] | |
set http [::http::geturl $query -headers $::incith_hdr -timeout [expr 1000 * 15]] | |
upvar #0 $http state ; set ncode [http::ncode $http] ; set metas $state(meta) ; set value "" | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
# this is the output encoding hack. | |
#if {$incith::google::encoding_conversion_output > 0} { | |
# if {$region != ""} { | |
# set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$region:*"]] :] 1] | |
# } else { | |
# set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$country:*"]] :] 1] | |
# } | |
#} | |
set html [charenc [ungzip [::http::data $http] $state(meta)] $state(charset)] | |
if {$incith::google::debug > 0} { | |
putserv "privmsg $incith::google::debugnick :\002url:\002 $query \002charset:\002 [string map -nocase {"iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $incithcharset] \002\037encode_string:\037\002 $encoding_found" | |
} | |
::http::cleanup $http | |
#correct the html, remove shitty tags | |
# generic pre-parsing | |
regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html | |
regsub -all -nocase {<font.+?>} $html "" html | |
regsub -all -nocase {</font>} $html "" html | |
regsub -all -nocase {<input.+?>} $html "" html | |
regsub -all -nocase {(?:<i>|</i>)} $html "" html | |
regsub -all "\t" $html " " html | |
regsub -all "\n" $html " " html | |
regsub -all "\r" $html " " html | |
regsub -all "\v" $html " " html | |
regsub -all "</li>" $html ". " html | |
regsub -all ";;>" $html "" html | |
if {$incith::google::bold_descriptions > 0 && [string match "\002" $incith::google::desc_modes] != 1} { | |
regsub -all -nocase {(?:<b>|</b>)} $html "\002" html | |
} | |
set match "" | |
# this is where my kludge ends ;) | |
# this is if there is no text on a special page. | |
} else { | |
if {[regexp -nocase -- {<div class="noarticletext">(.+?)</div>} $html - no_search]} { | |
regsub -all -- {<(.+?)>} $no_search {} no_search | |
while {[string match "* *" $no_search]} { | |
regsub -all -- { } $no_search " " no_search | |
} | |
return "$::incith::google::desc_modes$no_search$::incith::google::desc_demodes" | |
} | |
} | |
if {[string match 30* $ncode]} { | |
foreach {name value} $metas { | |
if {[regexp -nocase ^location$ $name]} { | |
set go $value | |
} | |
} | |
} | |
# are we redirected to another page? if so, let's go there | |
if {[regexp -- {alt="#REDIRECT ".+?<a href="(.+?)" title="} $html - match] || [info exists go]} { | |
if {$match != ""} { | |
incr red 1 | |
set query "http://${country}${match}" | |
} else { set query $go } | |
# 3rd load of webpage - this has no error checking what-so-ever | |
# here is our final webpage, this is hopefully what the user was looking for. | |
# beware, changing the useragent will result in differently formatted html from Google. | |
set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e" | |
set http [::http::config -useragent $ua -urlencoding "utf-8"] | |
set http [::http::geturl $query -headers $::incith_hdr -timeout [expr 1000 * 15]] | |
upvar #0 $http state | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
# this is the output encoding hack. | |
#if {$incith::google::encoding_conversion_output > 0} { | |
# if {$region != ""} { | |
# set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$region:*"]] :] 1] | |
# } else { | |
# set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$country:*"]] :] 1] | |
# } | |
#} | |
set html [charenc [ungzip [::http::data $http] $state(meta)] $state(charset)] | |
if {$incith::google::debug > 0} { | |
putserv "privmsg $incith::google::debugnick :\002url:\002 $query \002charset:\002 [string map -nocase {"iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $incithcharset] \002\037encode_string:\037\002 $encoding_found" | |
} | |
::http::cleanup $http | |
#correct the html, remove shitty tags | |
# generic pre-parsing | |
regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html | |
regsub -all -nocase {<font.+?>} $html "" html | |
regsub -all -nocase {</font>} $html "" html | |
regsub -all -nocase {<input.+?>} $html "" html | |
regsub -all -nocase {(?:<i>|</i>)} $html "" html | |
regsub -all "\t" $html " " html | |
regsub -all "\n" $html " " html | |
regsub -all "\r" $html " " html | |
regsub -all "\v" $html " " html | |
regsub -all "</li>" $html ". " html | |
regsub -all ";;>" $html "" html | |
if {$incith::google::bold_descriptions > 0 && [string match "\002" $incith::google::desc_modes] != 1} { | |
regsub -all -nocase {(?:<b>|</b>)} $html "\002" html | |
} | |
} | |
set match "" | |
# give results an output header with result tally. | |
regexp -- {<title>(.+?)\s\-\s.+?</title>} $html - match | |
# see if page has a redirect to fragment | |
if {![string length $results]} { regexp -- {redirectToFragment\("(\#.+?)"\)} $html - tresult } | |
if {![string match "*<a name=*" $html]} { set walt 1 } | |
# this is my kludge to allow listing table of contents, to make | |
# sub-tag lookups easier to see on irc. | |
if {[string length $results] || [string length $tresult]} { | |
if {[string length $results]} { set tresult "" } | |
set subtag [string tolower $results] | |
# if the table of contents exists on the page, lets use real world words | |
# instead of ugly subtags... | |
if {[string match "*<table id=\"toc*" $html]} { | |
set ded [encoding convertto "utf-8" "\002ToC\002\: "] ; set ebcPR "" ; set results "" | |
# set results [regexp -inline -all -- {<li class="toclevel.*?<span class="toc.*?">(.*?)</span>} $html] | |
set results [regexp -inline -all -- {<li class="toclevel.*?href="#(.*?)"} $html] | |
set anchors [list "toc"] | |
foreach {junk anchor} $results { lappend anchors $anchor } | |
if {[string tolower $subtag] == "toc"} { | |
foreach anchor $anchors { lappend new [string map {"_" " "} [subtagDecode $anchor]] } | |
append ded [join $new "; "] | |
set toc 1 ; set loop 1 | |
} else { | |
set ded "" | |
} | |
} else { | |
# table of contents doesnt exist for the page, so we are manually | |
# going to pull them for the user ourselves. | |
set ded [encoding convertto "utf-8" "\002\(ToC)\002: "] ; set ebcPR "" | |
if {![info exists walt]} { | |
set results [regexp -inline -all -- {<a name=".*?id="(.+?)"} $html] | |
} else { | |
set results [regexp -inline -all -- {<span class="mw-headline".*?id="(.*?)"} $html] | |
} | |
set anchors [list] | |
foreach {junk anchor} $results { lappend anchors $anchor } | |
if {[string tolower $subtag] == "toc"} { | |
foreach anchor $anchors { lappend new [string map {"_" " "} [subtagDecode $anchor]] } | |
append ded [join $new "; "] | |
set toc 1 ; set loop 1 | |
} else { | |
set ded "" | |
} | |
} | |
} | |
# this is in case an internal redirectToFragment(# ) was found | |
if {$tresult != ""} { | |
#set subtag $tresult | |
incr red 1 | |
if {![info exists walt]} { | |
set redir "name=\"${tresult}\".*?>(.+?)(<a name|</table>|\<\!\-)" | |
} else { | |
set tresult [string range $tresult 1 end] | |
set redir "<span class=\"mw-headline\" id=\"${tresult}.*?>(.+?)(<span|</table>|\<\!\-)" | |
} | |
regexp -nocase "$redir" $html - ded | |
regsub -all -- {\[<(.*?)>\]} $ded {} ded | |
regsub -all -- {\[[[:digit:]]+\]} $ded {} ded | |
regsub -all -- {<table.+?</table>} $ded {} ded | |
if {$ded == ""} { | |
return "$::incith::google::error_modes\002Wikimedia Error:\002 redirectToFragment(#${tresult}) not found in body of html @ ${query} . This Wiki Entry is flawed and should be reported for redirect errors.$::incith::google::error_demodes" | |
} | |
} | |
# This is for our manual #sub-tag search.. | |
if {![string equal [string tolower $subtag] "toc"] && [string length $subtag]} { | |
set subtag [string map {" " "_"} $subtag] | |
# direct match | |
if {[info exists anchors]} { | |
foreach entry $anchors { | |
if {[string match -nocase $entry $subtag] || [string match -nocase [subtagDecode $entry] $subtag]} { | |
set stf "true" | |
incr red 1 | |
set subtag [string map {" " "_"} $entry] | |
break | |
} | |
} | |
if {![info exists stf]} { | |
# starts the anchor | |
foreach entry $anchors { | |
if {[string match -nocase "$subtag*" $entry] || [string match -nocase [subtagDecode "$entry*"] $subtag]} { | |
set stf "true" | |
incr red 1 | |
set subtag [string map {" " "_"} $entry] | |
break | |
} | |
} | |
} | |
if {![info exists stf]} { | |
# anywhere in the anchor | |
foreach entry $anchors { | |
if {[string match -nocase "*$subtag*" $entry] || [string match -nocase [subtagDecode "*$subtag*"] $entry]} { | |
set stf "true" | |
incr red 1 | |
set subtag [string map {" " "_"} $entry] | |
break | |
} | |
} | |
} | |
} | |
if {![info exists stf]} { | |
return "$::incith::google::error_modes\002Wikimedia Error:\002 Manual #anchor (${subtag}) not found in body of html @ ${query} .$::incith::google::error_demodes" | |
} | |
if {![info exists walt]} { | |
set redir "name=\"${subtag}\".*?>(.*?)(?:<a name|<div class=\"printfooter)" | |
} else { | |
set redir "<span class=\"mw-headline\" id=\"${subtag}\".*?>(.*?)(?:<span class=\"mw-headline|<div class=\"printfooter)" | |
} | |
regexp -nocase "${redir}" $html - ded | |
regsub -all -- {\[<(.*?)>\]} $ded {} ded | |
regsub -all -- {\[[[:digit:]]+\]} $ded {} ded | |
regsub -all -- {<th style=.*?</th>} $ded {} ded | |
regsub -all -- {<table.+?</table>} $ded {} ded | |
if {$ded == ""} { | |
return "$::incith::google::error_modes\002Wikimedia Error:\002 Unknown problem with (${subtag}) found @ ${query} .$::incith::google::error_demodes" | |
} | |
} | |
# we couldn't chop these earlier because we needed them | |
# to easily pull our #sub-tag finder above, need to remove | |
# them here before we go further, because it might upset our checks. | |
regsub -all -nocase {<span.*?>} $html "" html | |
regsub -all -nocase {</span>} $html "" html | |
# if we have no pre-cut html, let's start the cutting process. | |
if {$ded == ""} { | |
regexp -- {<h1.*?>.*?<p>(.+?)<h} $html - ded | |
### - trying to clear out those damned wikipedia tables -- | |
regsub -all -- {<table.+?</table>} $ded {} ded | |
if {[string match "*</table>*" $ded]} { | |
regsub -all -- {.+?</table>} $ded {} ded | |
} elseif {[string match "*<table*" $ded]} { | |
regsub -all -- {<table.*>.+?} $ded {} ded | |
} | |
} | |
# if wiki page is non-standard, then this will attempt | |
# to get at least something from the webpage to display. | |
if {$ded == ""} { | |
regexp -- {<p>(.+?)<div class="printfooter">} $html - ded | |
} | |
#clean up messy parsing. | |
regsub -all -- {<br>|<br/>} $ded {. } desc | |
#regsub -all -- {">:alpha:\]} $desc {} desc | |
regsub -all -- {\[<(.*?)>\]} $desc {} desc | |
regsub -all -- {<(.+?)>} $desc {} desc | |
while {[string match "* *" $desc]} { | |
regsub -all -- { } $desc " " desc | |
} | |
regsub -all -- {\[[[:digit:]]+\]} $desc {} desc | |
regsub -all -- { , } $desc ", " desc | |
regsub -all -- { \.} $desc "\." desc | |
regsub -all -- {&#(25(\[6-9\])?|2(\[6-9\])?[\d]|(\[3-9\])?[\d]{2}|[\d]{4,5});} $desc "?" desc | |
set match [string trim $match] | |
# if we have a very short description this will grab more. | |
if {[string len $desc] < 3} { | |
if {[regexp -- {<p>.+?<p>(.+?)<h} $html - desc]} { set desc [cleans $desc] } | |
} | |
if {[string len $desc] < 3} { | |
if {[regexp -- {<p>(.+?)<p} $html - desc]} { set desc [cleans $desc] } | |
} | |
#if {[string length $tresult]} { set subtag $tresult } | |
# set our variables so formatting settings work | |
if {$subtag != ""} { | |
regsub -- {" id="top".*?$} $subtag "" subtag | |
set subtag "#${subtag}" | |
} | |
set link $query | |
set desc [descdecode $desc] | |
if {![info exists loop]} { set desc "[string range $desc 0 [expr 360 * $incith::google::wiki_lines]]" } | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists match]} { set match "$incith::google::total_modes[string trim $match]$incith::google::total_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim "$link$subtag"]$incith::google::link_demodes" } | |
# after stripping excessive tags if our description is | |
# reduced to nothing, let's lie and say it was too much to parse :) | |
# if we have no description, then let's decide what to do. | |
if {$desc == ""} { | |
regexp -- {<p>(.+?)</p>} $html - match | |
if {$match != ""} { return "$::incith::google::error_modes\002Wikimedia Error:\002 Unable to parse for: \002${input}\002 @ ${query}${subtag}$::incith::google::error_demodes" } | |
if {$match == ""} { return "$::incith::google::error_modes\002Wikimedia Error:\002 Sorry, no search results found.$::incith::google::error_demodes" } | |
break | |
} | |
# regular output displayed. | |
if {$match != ""} { | |
if {$red > 0} { | |
set output "\002[descdecode ${match}]\002${incith::google::seperator}${desc}$incith::google::break${link} $incith::google::total_modes\[${red} Redirect\(s\)\]$::incith::google::total_demodes" | |
} else { | |
set output "\002[descdecode ${match}]\002${incith::google::seperator}[descdecode ${desc}]$::incith::google::break${link}" | |
} | |
} else { | |
if {$red > 0} { | |
set output "${desc}$::incith::google::break${link} $::incith::google::total_modes\[${red} Redirect\(s\)\]$::incith::google::total_demodes" | |
} else { | |
set output "${desc}$::incith::google::break${link}" | |
} | |
} | |
return $output | |
} | |
# wikipedia/wikimedia support | |
# CLEANS | |
# | |
proc cleans {input} { | |
# clean up messy parsing. | |
# here we try to sanitize the description | |
# i'm hoping this works with any language, *crosses fingers* | |
set desc [string trim $input] | |
regsub -all -- {<br>} $desc {. } desc | |
regsub -all -- {\[<(.*?)>\]} $desc {} desc | |
regsub -all -- {<(.+?)>} $desc {} desc | |
while {[string match "* *" $desc]} { | |
regsub -all -- { } $desc " " desc | |
} | |
regsub -all -- {\[[[:digit:]]+\]} $desc {} desc | |
regsub -all -- { , } $desc ", " desc | |
regsub -all -- { \.} $desc "\." desc | |
regsub -all -- {&#(25(\[6-9\])?|2(\[6-9\])?[\d]|(\[3-9\])?[\d]{2}|[\d]{4,5});} $desc "?" desc | |
return $desc | |
} | |
# EBAY | |
# fetches search results from ebay for auctions closest to completion. | |
# -speechless supplied | |
# | |
proc ebay {input} { | |
# lots of variables, keeping them clean is important. | |
; set results 0 ; set output "" ; set titem "" ; set tresult "" ; set ebcSP "" | |
; set ebcU "" ; set ebcI "" ; set ebcBid "" ; set ebcPR "" ; set ebcTim "" ; set ebcShpNew "" | |
; set ebcCheck "" ; set no_search "" ; set auctions "" ; set ebcBid2 "" ; set ebcStr "" | |
# this isn't global, so we need to keep ctry (country) here | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titem dummy | |
if {$titem == ""} { | |
set titem "${incith::google::ebay_country}" | |
} | |
# fetch the html | |
set html [fetch_html $input 25] | |
if {$html == ""} { | |
return "$::incith::google::error_modes\002Ebay Error: No html to parse.$::incith::google::error_demodes" | |
} | |
# user input causing errors? | |
if {[string match -nocase "*socketerrorabort*" $html]} { | |
regsub {(.+?)\|} $html {} html | |
return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if {[string match -nocase "*timeouterrorabort*" $html]} { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
# set up an ebay results header for results to be appended to as $output | |
if {![regexp -- {class="sectiontitle">([0-9 .,]+)\002.*?<h2 class="standard ens} $html - tresult]} { | |
if {![regexp -- {<div class="count">([0-9 .,]+) } $html - tresult]} { | |
if {![regexp -- {var.*?getCustomAdConfig.*?,"items=(.+?)"} $html - tresult]} { | |
if {![regexp -nocase {<div id="v.*?" class="fpcc"><div><h1 class="smuy">(.*?)\s(.*?)\s(.*?)\s} $html - tresult auctions]} { | |
if {![regexp -nocase {<div id="v.*?" class="fpcc"><div>(.*?)\s(.*?)\s(.*?)\s} $html - tresult auctions]} { | |
regexp -nocase {<div id="v.*?" class="fpcc">.*?\s(.+?)\s.*?\:\s*(.+?)\s} $html - auctions tresult | |
set tresult "[join [scan $tresult "%d%d"] ""]" | |
} | |
} | |
} | |
} | |
} | |
# no_results line in any language. | |
if {[regexp -- {<div class="msg msg-alert">(.+?)</div>} $html - no_search]} { | |
if {[regexp -- {div class="msg msg-alert.+?</div>.+?"msg msg-alert">(.+?)</div>} $html - more]} { | |
append no_search " $more" | |
} | |
regsub -all {<(.+?)>} $no_search "" no_search | |
} else { | |
if {![regexp -- {class="sectiontitle">(.+?)</h2><h2 class="standard ens"> } $html - no_search]} { | |
if {![regexp -- {<div class="count">(.+?)(?:</script>|</div>)} $html - no_search]} { | |
if {![regexp -- {<div class="toplne"><div class="msg">(.+?)</div>} $html - no_search]} { | |
regexp -- {<div class="cnt">(.*?)</div>} $html - no_search | |
} | |
} | |
} | |
} | |
# santize our no_search results found error message | |
# may need to use it very shortly if we have no results | |
if {$no_search != ""} { | |
#if {[regexp -- {<div class="suggestions".+?<ul><li><div>(.+?)</li>} $html - ebcStr]} { | |
# regsub -all -- {<(.+?)>} $ebcStr {} ebcStr | |
# set ebcStr "${ebcStr}. " | |
#} | |
#regexp {(^.+?)document.write} $no_search - no_search | |
#regsub -all -- {<(.+?)>} $no_search {} no_search | |
#set no_search "${ebcStr}[string trim $no_search]" | |
} else { | |
if {$tresult == 0 && $no_search == ""} { | |
set no_search "eBay error." | |
} | |
} | |
# bids in any language | |
if {![regexp -- {<td class="ebcBid">(.+?)</td>} $html {} ebcSP]} {set ebcsp ""} | |
# format output according to variables. | |
if {$incith::google::total_results != 0} { | |
regexp -- {<option value="1" selected="selected">(.+?)</option>} $html - auctions | |
set output "$::incith::google::total_modes\002[string trim ${tresult}]\002 [string trim $auctions]$::incith::google::total_demodes${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
# parse the html | |
while {$results < $incith::google::ebay_results} { | |
# these CANNOT be tied together, some results appear in different | |
# order, so always leave these spread out in a mess... | |
if {![regexp -nocase {<td class="dtl"><div class="ttl">(.*?)</a></td>} $html - line]} { | |
if {![regexp -nocase {<table class="lview nol">.*?class="details.*?">(.+?)</table>} $html - line]} { | |
if {![regexp -nocase {<table class="nol">.*?class="details.*?">(.+?)</table>} $html - line]} { | |
if {![regexp -nocase {<h3 class="ens fontnormal">(.+?)class="ebRight"} $html - line]} { | |
if {![regexp -nocase {<td class="details">(.*?)</a></td>} $html - line]} { | |
set line "" | |
} else { regsub -nocase {<td class="details">.*?</a></td>} $html {} html } | |
} else { regsub {<h3 class="ens fontnormal">.+?class="ebRight"} $html {} html } | |
} else { regsub {<table class="nol">.+?</table>} $html {} html } | |
} else { regsub {<table class="lview nol">.+?</table>} $html {} html } | |
} else { regsub -nocase {<td class="dtl"><div class="ttl">.*?</a></td>} $html {} html } | |
# name & url | |
if {![regexp -nocase {href=".*?ebay.*?/.*?/(.*?)\?pt.*?>(.*?)</a>} $line - ebcU ebcI]} { | |
if {![regexp -nocase {<a href=".+?QQitem(.+?)QQ.+?">.+?<a href=".*?">(.+?)</a>} $line - ebcU ebcI]} { | |
regexp -nocase {<a href="http://cgi.ebay.*?/.*?/(.*?)\?cmd=.*?>(.*?)</a>} $line - ebcU ebcI | |
} | |
} | |
# bid | |
if {[regexp -nocase {class="bids.*?">(.+?)</td>} $line - ebcBid]} { | |
if {[regexp {<div.*?>(.+?)</div><img src=".*?title="(.+?)"} $ebcBid - ebcBid ebcBid2]} { | |
set ebcBid "${ebcBid}/${ebcBid2}" | |
} | |
if {[string match *<img* $ebcBid]} { regexp {<img src=".*?title="(.+?)"} $ebcBid - ebcBid } | |
} else { | |
regexp -nocase {class="ebcBid">(.*?)</td} $line - ebcBid | |
# trying to parse out the phrase "buy-it-now" in any language | |
# this isn't elegant at all, we are chopping 'massive' html tags out | |
# it works effectively, but isn't quick at all. We also have to account | |
# for multiple bid/buy-it-now possibilities.... | |
regexp -- {(^[0-9\-]{1,})<} $ebcBid {} ebcBid2 | |
if {![regexp -- {title="(.+?)"} $ebcBid {} ebcBid]} { | |
if {![regexp -- {alt="(.+?)(?:\":\:|-)} $ebcBid {} ebcBid]} { | |
regsub -all -- {<(.+?)>} $ebcBid "" ebcBid | |
if {$ebcBid == "-"} { set ebcBid "0" } | |
if {$ebcBid != ""} { | |
regsub -all -- {<(.+?)>} $ebcSP "" ebcSP | |
append ebcBid " ${ebcSP}" | |
} | |
if {$ebcBid == ""} { set ebcBid "??" } | |
} | |
} | |
# if our buy-it-now has a bid too, prepend bid to it. | |
if {![string match "*${ebcBid2}*" $ebcBid]} { | |
if {$ebcBid2 == "-"} { set ebcBid2 "0" } | |
regsub -all -- {<(.+?)>} $ebcSP "" ebcSP | |
set ebcBid "${ebcBid2} ${ebcSP}/[string trim $ebcBid]" | |
} | |
} | |
regsub -nocase {</div><div class=.*?>} $ebcBid "/" ebcBid | |
regsub -all {<.*?>} $ebcBid "" ebcBid | |
# prices | |
if {[regexp -nocase {<td class="prc.*?">(.*?)</td} $line - ebcPR]} { | |
regsub -- {</div><div>} $ebcPR "/" ebcPR | |
regexp -- {^(.+)</div>(.*?)$} $ebcPR - ebcPR ebcShpNew | |
regsub -all {<.*?>} $ebcPR "" ebcPR | |
} | |
# shipping | |
if {![string length $ebcShpNew]} { | |
if {[regexp -nocase {td class=".*?(?:ship|fshp).*?">(.+?)</td>} $line - ebcShpNew]} { | |
if {[string match "<" [string index $ebcShpNew 0]]} { set ebcShpNew "Calculate" } | |
} else { | |
regexp -nocase {class="ebcShpNew">(.+?)<} $line - ebcShpNew | |
if {[info exists ebcShpNew]} { | |
regexp -- {;;">(.+?)} $ebcShpNew {} ebcCheck | |
if {$ebcCheck == ""} { | |
regexp -- {$(.+?)<} $ebcShpNew {} ebcShpNew | |
if {$ebcShpNew == ""} { | |
set ebcTim "store" | |
regexp -nocase {class="ebcStr">.+?http://stores.ebay.com/.+?">(.+?)</a>} $html - ebcStr | |
} | |
} else { | |
if {![regexp -- {(.*?)<div class="tfsp">(.*?)</div>} $ebcPR - ebcPR ebcShpNew]} { | |
set ebcShpNew "Calculate" | |
} | |
} | |
} | |
# remove pesky trailing spaces | |
regsub -all -- {<(.+?)>} $ebcShpNew {} ebcShpNew | |
regsub -all " " $ebcShpNew "" ebcShpNew | |
} | |
} | |
# time left | |
if {![regexp -nocase {td class="time.*?rt">(.+?)</td>} $line - ebcTim]} { | |
if {![regexp -nocase {class="ebcTim">(.+?)<} $line - ebcTim]} { | |
regexp -nocase {class="hidlb">(.+?)<} $line - ebcTim | |
} | |
} | |
if {[info exists ebcTim]} { | |
regsub -all -- {<.*?>} [string map {\002 ""} $ebcTim] {} ebcTim | |
if {[string match *:* $ebcTim]} { set ebcTim [join [lrange [split $ebcTim :] 1 end]] } | |
} | |
# keep ebay Item from becoming too lengthy | |
if {[info exists ebcI]} { | |
#ebay has these odd tags, removing them cleans up results. | |
regsub -all -nocase "<wbr>" $ebcI "" ebcI | |
set ebcI [string range $ebcI 0 [expr $incith::google::description_length - 1]] | |
set ebcI [string trim $ebcI] | |
} | |
# check results are more than 0, return or stop looping, depending | |
if {$tresult < 1 } { | |
if {$results == 0} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
# make the link valid because we were only given a partial href result, not a full url | |
set link "http://cgi.ebay.${titem}/_W0QQItemZ[lindex [split ${ebcU} "/"] end]" | |
# fix up our variables so the output looks purdy. | |
if {$ebcPR == ""} { set ebcPR "--" } | |
if {$ebcTim == ""} { | |
set ebcTim "--" | |
} elseif {$ebcTim == "store"} { | |
set desc "\037${ebcStr}\037 ${ebcI}, ${ebcPR}(${ebcShpNew}), ${ebcBid}" | |
} elseif {$ebcI != ""} { | |
set desc "${ebcI}, ${ebcPR}(${ebcShpNew}), ${ebcBid}, ${ebcTim}" | |
} else { | |
set link "" ; set desc "" | |
} | |
# add the search result | |
if {$link != ""} { | |
if {[info exists desc] == 1 && $ebcI != ""} { | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" } | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
append output [descdecode "${desc}$::incith::google::break${link}${incith::google::seperator}"] | |
} | |
} | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset link ; set ebcCheck "" ; set ebcU "" ; set ebcBid2 "" | |
set ebcI "" ; set ebcPR "" ; set ebcShpNew "" | |
incr results | |
} | |
# make sure we have something to send | |
if {$tresult < 1} { | |
set reply $no_search | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
return $output | |
} | |
# EBAYFIGHT | |
# ebay fight ! | |
# | |
proc ebayfight {input} { | |
set output ""; set winner 0 ; set match1 0; set match2 0 | |
regexp -nocase -- {^(.+?) vs (.+?)$} $input - word1 word2 | |
# fetch the first result | |
set html [fetch_html $word1 25] | |
if {![regexp -- {class="sectiontitle">([0-9 .,]+)\002.*?<h2 class="standard ens} $html - match1]} { | |
if {![regexp -- {<div class="count">([0-9 .,]+) } $html - match1]} { | |
if {![regexp -- {var.*?getCustomAdConfig.*?,"items=(.+?)"} $html - match1]} { | |
if {![regexp -nocase {<div id="v.*?" class="fpcc"><div><h1 class="smuy">(.*?)\s(.*?)\s} $html - match1]} { | |
if {![regexp -nocase {<div id="v.*?" class="fpcc"><div>(.*?)\s(.*?)\s} $html - match1]} { | |
regexp -nocase {<div id="v.*?" class="fpcc">.*?\s.+?\s.*?\:\s*(.+?)\s} $html - auctions match1 | |
set match1 "[join [scan $match1 "%d%d"] ""]" | |
} | |
} | |
} | |
} | |
} | |
# fetch the second result | |
set html [fetch_html $word2 25] | |
regexp -- {<div id="v.*?" class="fpcc">(.+?)\s} $html - match2 | |
if {![regexp -- {class="sectiontitle">([0-9 .,]+)\002.*?<h2 class="standard ens} $html - match2]} { | |
if {![regexp -- {<div class="count">([0-9 .,]+) } $html - match2]} { | |
if {![regexp -- {var.*?getCustomAdConfig.*?,"items=(.+?)"} $html - match2]} { | |
if {![regexp -nocase {<div id="v.*?" class="fpcc"><div><h1 class="smuy">(.*?)\s(.*?)\s} $html - match2]} { | |
if {![regexp -nocase {<div id="v.*?" class="fpcc"><div>(.*?)\s(.*?)\s} $html - match2]} { | |
regexp -nocase {<div id="v.*?" class="fpcc">.*?\s.+?\s.*?\:\s*(.+?)\s} $html - auctions match2 | |
set match2 "[join [scan $match2 "%d%d"] ""]" | |
} | |
} | |
} | |
} | |
} | |
# clean up our matches, so it looks all tidy and neat. | |
regsub -all "\002" $match1 " " match1 | |
regsub -all "\002" $match2 " " match2 | |
if {![info exists match1]} { | |
set match1 "0" | |
set match1expr "0" | |
} else { | |
regsub -all {,} $match1 {} match1expr | |
} | |
if {![info exists match2]} { | |
set match2 "0" | |
set match2expr "0" | |
} else { | |
regsub -all {,} $match2 {} match2expr | |
} | |
if {[expr $match2expr < $match1expr]} { | |
set winner 1 | |
} else { | |
set winner 2 | |
} | |
if {[expr $match2expr == $match1expr]} { | |
set winner 1 | |
set troll1 { | |
Pissing Shitting SpillingPez DrippingCum Trolling | |
} | |
set troll2 { | |
YourFace YourSister YourMama | |
} | |
set match1 "[lindex $troll1 [rand [llength $troll1]]]" | |
set match2 "[lindex $troll2 [rand [llength $troll2]]]" | |
} | |
if {$incith::google::bold_descriptions > 0 && $incith::google::desc_modes == ""} { | |
set word1 "\002$word1\002"; set word2 "\002$word2\002" | |
set match1 "\002 $match1\002"; set match2 "\002 $match2\002" | |
} elseif {$incith::google::desc_modes != ""} { | |
set word1 "$incith::google::desc_modes$word1$incith::google::desc_demodes"; set word2 "$incith::google::desc_modes$word2$incith::google::desc_demodes" | |
set match1 " $incith::google::desc_modes$match1$incith::google::desc_demodes"; set match2 " $incith::google::desc_modes$match2$incith::google::desc_demodes" | |
} else { | |
set match1 " $match1"; set match2 " $match2" | |
} | |
regsub -all " " $match1 "" match1 | |
regsub -all " " $match2 "" match2 | |
if {$winner == 1} { | |
set output "${::incith::google::total_modes}By results on ebay:$::incith::google::total_demodes$incith::google::desc_modes $word1 beats $word2 by $match1 to $match2!$::incith::google::desc_demodes" | |
} elseif {$winner == 2} { | |
set output "${::incith::google::total_modes}By results on ebay:$::incith::google::total_demodes$incith::google::desc_modes $word2 beats $word1 by $match2 to $match1!$::incith::google::desc_demodes" | |
} else { | |
set output "${::incith::google::total_modes}Could not determine the winner." | |
} | |
# make sure we have something to send | |
if {[info exists output] == 0} { | |
set reply "Sorry, no search results were found." | |
if {[info exists did_you_mean] == 1} { | |
append reply " Did you mean: ${did_you_mean}?" | |
} | |
return "$incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
return $output | |
} | |
# Popular | |
# fetches games results from gamerankings. | |
# -speechless supplied | |
# | |
proc popular {input} { | |
# lots of variables, keeping them clean is important. | |
# borrowed mostly from my ebay proc above. | |
; set results 0 ; set output "" ; set tresult "" | |
; set ebcU "" ; set ebcI "" ; set ebcBid "" ; set ebcPR "" | |
; set ebcCheck "" ; set html "" | |
# redundant and messy, yes i know.. but it works, k | |
# parses the query and reads html according to system desired. | |
if {[string match -nocase "gc" $input] == 1} { | |
set html [fetch_html "0" 30] | |
set output "\002GameRankings BEST GameCube\002" | |
} | |
if {[string match -nocase "pc" $input] == 1} { | |
set html [fetch_html "0" 31] | |
set output "\002GameRankings BEST PC\002" | |
} | |
if {[string match -nocase "ps2" $input] == 1} { | |
set html [fetch_html "0" 32] | |
set output "\002GameRankings BEST PlayStation2\002" | |
} | |
if {[string match -nocase "ps3" $input] == 1} { | |
set html [fetch_html "0" 33] | |
set output "\002GameRankings BEST PlayStation3\002" | |
} | |
if {[string match -nocase "wii" $input] == 1} { | |
set html [fetch_html "0" 34] | |
set output "\002GameRankings BEST Wii\002" | |
} | |
if {[string match -nocase "xbox" $input] == 1} { | |
set html [fetch_html "0" 35] | |
set output "\002GameRankings BEST Xbox\002" | |
} | |
if {[string match -nocase "x360" $input] == 1} { | |
set html [fetch_html "0" 36] | |
set output "\002GameRankings BEST Xbox360\002" | |
} | |
if {[string match -nocase "ds" $input] == 1} { | |
set html [fetch_html "0" 37] | |
set output "\002GameRankings BEST NDS\002" | |
} | |
if {[string match -nocase "gba" $input] == 1} { | |
set html [fetch_html "0" 38] | |
set output "\002GameRankings BEST GBA\002" | |
} | |
if {[string match -nocase "psp" $input] == 1} { | |
set html [fetch_html "0" 39] | |
set output "\002GameRankings BEST PSP\002" | |
} | |
if {[string match -nocase "mobile" $input] == 1} { | |
set html [fetch_html "0" 40] | |
set output "\002GameRankings BEST Mobile\002" | |
} | |
if {[string match -nocase "ngage" $input] == 1} { | |
set html [fetch_html "0" 41] | |
set output "\002GameRankings BEST N-Gage\002" | |
} | |
if {[string match -nocase "3do" $input] == 1} { | |
set html [fetch_html "0" 42] | |
set output "\002GameRankings BEST 3DO\002" | |
} | |
if {[string match -nocase "dc" $input] == 1} { | |
set html [fetch_html "0" 43] | |
set output "\002GameRankings BEST Dreamcast\002" | |
} | |
if {[string match -nocase "gen" $input] == 1} { | |
set html [fetch_html "0" 44] | |
set output "\002GameRankings BEST Genesis\002" | |
} | |
if {[string match -nocase "jag" $input] == 1} { | |
set html [fetch_html "0" 45] | |
set output "\002GameRankings BEST Jaguar\002" | |
} | |
if {[string match -nocase "n64" $input] == 1} { | |
set html [fetch_html "0" 46] | |
set output "\002GameRankings BEST N64\002" | |
} | |
if {[string match -nocase "neo" $input] == 1} { | |
set html [fetch_html "0" 47] | |
set output "\002GameRankings BEST Neo-Geo\002" | |
} | |
if {[string match -nocase "ps1" $input] == 1} { | |
set html [fetch_html "0" 48] | |
set output "\002GameRankings BEST Playstation\002" | |
} | |
if {[string match -nocase "sat" $input] == 1} { | |
set html [fetch_html "0" 49] | |
set output "\002GameRankings BEST Saturn\002" | |
} | |
if {[string match -nocase "snes" $input] == 1} { | |
set html [fetch_html "0" 50] | |
set output "\002GameRankings BEST Snes\002" | |
} | |
if {[string match -nocase "segacd" $input] == 1} { | |
set html [fetch_html "0" 52] | |
set output "\002GameRankings BEST Sega-CD\002" | |
} | |
if {[string match -nocase "gameboy" $input] == 1} { | |
set html [fetch_html "0" 53] | |
set output "\002GameRankings BEST GameBoy\002" | |
} | |
if {[string match -nocase "gbc" $input] == 1} { | |
set html [fetch_html "0" 54] | |
set output "\002GameRankings BEST GameBoy Color\002" | |
} | |
if {[string match -nocase "all" $input] == 1} { | |
set html [fetch_html "0" 55] | |
set output "\002GameRankings BEST -ALL-\002" | |
} | |
if {[string match -nocase "3ds" $input] == 1} { | |
set html [fetch_html "0" 57] | |
set output "\002GameRankings BEST 3DS\002" | |
} | |
if {[string match -nocase "mac" $input] == 1} { | |
set html [fetch_html "1" 58] | |
set output "\002GameRankings WORST MAC\002" | |
} | |
if {[string match -nocase "*http://www.gamespot.com/gamerankings/offline.html*" $html]} { | |
append output "${incith::google::seperator}${::incith::google::error_modes}We're sorry, we are temporarily offline. We'll be back as soon as possible." | |
return $output | |
} | |
if {[string match -nocase "*Temporarily Unavailable*" $html]} { | |
append output "${incith::google::seperator}${::incith::google::error_modes}GameRankings is Temporarily Unavailable." | |
return $output | |
} | |
if {$output == ""} { | |
return "${::incith::google::desc_modes}Sorry, that system is not supported! \[system = gc/pc/mac/ps2/ps3/wii/xbox/x360/3ds/ds/gba/psp/mobile/ngage/3d0/dc/gen/jag/n64/neo/ps1/sat/snes\] usage: $::lastbind system" | |
} else { set output "$::incith::google::total_modes$output$::incith::google::total_demodes" } | |
regsub -all "(?:\t|\n|\r|\v)" $html "" html | |
# remove the bold if it isn't desired. | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
# parse for results and loop until desired amount of results | |
# is attempted to be reached if possible. | |
while {$results < $incith::google::popular_results && $output != ""} { | |
# grab date and game title and clear future html of it for looping | |
if {[regexp -- {<col class="game" />.*?<tr.+?<td>.*?<td>(.*?)</td>.*?<a href=.+?">(.+?)</a>.*?<br />(.+?)</td><td>(.+?)<} $html - sys game pub date]} { | |
regsub -- {><tr.*?<td>.*?</td></tr} $html "" html | |
regsub -- {<nobr>} $date "" date | |
} | |
# if there's no desc, return or stop looping, depending | |
if {![info exists game]} { | |
if {$results == 0} { | |
set reply "Sorry, no search results were found." | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
# add the search result | |
# add game to output if there is one | |
if {[info exists game]} { | |
if {[string match -nocase "all" $input] == 1} { | |
append output "${incith::google::seperator}$::incith::google::desc_modes\002${game}\002 ($sys) by $pub (${date})$::incith::google::desc_demodes" | |
} else { | |
append output "${incith::google::seperator}$::incith::google::desc_modes\002${game}\002 by $pub (${date})$::incith::google::desc_demodes" | |
} | |
unset game; unset date | |
} | |
# increase the results, clear the variables for the next loop just in case | |
incr results | |
} | |
# if we have nothing to send, we have no results :( | |
if {$output == ""} { | |
set output "${::incith::google::desc_modes}Sorry, found no results! \[system = gc/pc/ps2/ps3/wii/xbox/x360/ds/gba/psp/mobile/ngage/3do/dc/gen/jag/n64/neo/ps1/sat/snes\] usage: !popular system" | |
} | |
return $output | |
} | |
# Recent Games | |
# fetches games results from Gamerankings. | |
# -speechless supplied | |
# | |
proc recent {input} { | |
# lots of variables, keeping them clean is important. | |
# borrowed mostly from my ebay proc above. | |
; set results 0 ; set output "" ; set tresult "" | |
; set ebcU "" ; set ebcI "" ; set ebcBid "" ; set ebcPR "" | |
; set ebcCheck "" ; set html "" | |
# redundant and messy, yes i know.. but it works, k | |
# parses the query and reads html according to system desired. | |
if {[string match -nocase "gc" $input] == 1} { | |
set html [fetch_html "1" 30] | |
set output "\002GameRankings WORST GameCube\002" | |
} | |
if {[string match -nocase "pc" $input] == 1} { | |
set html [fetch_html "1" 31] | |
set output "\002GameRankings WORST PC\002" | |
} | |
if {[string match -nocase "ps2" $input] == 1} { | |
set html [fetch_html "1" 32] | |
set output "\002GameRankings WORST PlayStation2\002" | |
} | |
if {[string match -nocase "ps3" $input] == 1} { | |
set html [fetch_html "1" 33] | |
set output "\002GameRankings WORST PlayStation3\002" | |
} | |
if {[string match -nocase "wii" $input] == 1} { | |
set html [fetch_html "1" 34] | |
set output "\002GameRankings WORST Wii\002" | |
} | |
if {[string match -nocase "xbox" $input] == 1} { | |
set html [fetch_html "1" 35] | |
set output "\002GameRankings WORST Xbox\002" | |
} | |
if {[string match -nocase "x360" $input] == 1} { | |
set html [fetch_html "1" 36] | |
set output "\002GameRankings WORST Xbox360\002" | |
} | |
if {[string match -nocase "ds" $input] == 1} { | |
set html [fetch_html "1" 37] | |
set output "\002GameRankings WORST NDS\002" | |
} | |
if {[string match -nocase "gba" $input] == 1} { | |
set html [fetch_html "1" 38] | |
set output "\002GameRankings WORST GBA\002" | |
} | |
if {[string match -nocase "psp" $input] == 1} { | |
set html [fetch_html "1" 39] | |
set output "\002GameRankings WORST PSP\002" | |
} | |
if {[string match -nocase "mobile" $input] == 1} { | |
set html [fetch_html "1" 40] | |
set output "\002GameRankings WORST Mobile\002" | |
} | |
if {[string match -nocase "ngage" $input] == 1} { | |
set html [fetch_html "1" 41] | |
set output "\002GameRankings WORST N-Gage\002" | |
} | |
if {[string match -nocase "3do" $input] == 1} { | |
set html [fetch_html "1" 42] | |
set output "\002GameRankings WORST 3D0\002" | |
} | |
if {[string match -nocase "dc" $input] == 1} { | |
set html [fetch_html "1" 43] | |
set output "\002GameRankings WORST Dreamcast\002" | |
} | |
if {[string match -nocase "gen" $input] == 1} { | |
set html [fetch_html "1" 44] | |
set output "\002GameRankings WORST Genesis\002" | |
} | |
if {[string match -nocase "jag" $input] == 1} { | |
set html [fetch_html "1" 45] | |
set output "\002GameRankings WORST Jaguar\002" | |
} | |
if {[string match -nocase "n64" $input] == 1} { | |
set html [fetch_html "1" 46] | |
set output "\002GameRankings WORST N64\002" | |
} | |
if {[string match -nocase "neo" $input] == 1} { | |
set html [fetch_html "1" 47] | |
set output "\002GameRankings WORST Neo-Geo\002" | |
} | |
if {[string match -nocase "ps1" $input] == 1} { | |
set html [fetch_html "1" 48] | |
set output "\002GameRankings WORST Playstation\002" | |
} | |
if {[string match -nocase "sat" $input] == 1} { | |
set html [fetch_html "1" 49] | |
set output "\002GameRankings WORST Saturn\002" | |
} | |
if {[string match -nocase "snes" $input] == 1} { | |
set html [fetch_html "1" 50] | |
set output "\002GameRankings WORST Snes\002" | |
} | |
if {[string match -nocase "segacd" $input] == 1} { | |
set html [fetch_html "1" 52] | |
set output "\002GameRankings WORST Sega-CD\002" | |
} | |
if {[string match -nocase "gameboy" $input] == 1} { | |
set html [fetch_html "1" 53] | |
set output "\002GameRankings WORST GameBoy\002" | |
} | |
if {[string match -nocase "gbc" $input] == 1} { | |
set html [fetch_html "1" 54] | |
set output "\002GameRankings WORST GameBoy Color\002" | |
} | |
if {[string match -nocase "all" $input] == 1} { | |
set html [fetch_html "1" 55] | |
set output "\002GameRankings WORST -ALL-\002" | |
} | |
if {[string match -nocase "3ds" $input] == 1} { | |
set html [fetch_html "1" 57] | |
set output "\002GameRankings WORST 3DS\002" | |
} | |
if {[string match -nocase "mac" $input] == 1} { | |
set html [fetch_html "1" 58] | |
set output "\002GameRankings WORST MAC\002" | |
} | |
if {[string match -nocase "*http://www.gamespot.com/gamerankings/offline.html*" $html]} { | |
append output "${incith::google::seperator}${::incith::google::error_modes}We're sorry, we are temporarily offline. We'll be back as soon as possible." | |
return $output | |
} | |
if {[string match -nocase "*Temporarily Unavailable*" $html]} { | |
append output "${incith::google::seperator}${::incith::google::error_modes}GameRankings is Temporarily Unavailable." | |
return $output | |
} | |
if {$output == ""} { | |
return "${::incith::google::desc_modes}Sorry, that system is not supported! \[system = gc/pc/mac/ps2/ps3/wii/xbox/x360/3ds/ds/gba/psp/mobile/ngage/3do/dc/gen/jag/n64/neo/ps1/sat/snes\] usage: $::lastbind system" | |
} else { set output "$::incith::google::total_modes$output$::incith::google::total_demodes" } | |
regsub -all "(?:\t|\n|\r|\v)" $html "" html | |
# remove the bold if it isn't desired. | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
# parse for results and loop until desired amount of results | |
# is attempted to be reached if possible. | |
while {$results < $incith::google::popular_results && $output != ""} { | |
# grab date and game title and clear future html of it for looping | |
if {[regexp -- {<col class="game" />.*?<tr.+?<td>.*?<td>(.*?)</td>.*?<a href=.+?">(.+?)</a>.*?<br />(.+?)</td><td>(.+?)<} $html - sys game pub date]} { | |
regsub -- {><tr.*?<td>.*?</td></tr} $html "" html | |
regsub -- {<nobr>} $date "" date | |
} | |
# if there's no desc, return or stop looping, depending | |
if {![info exists game]} { | |
if {$results == 0} { | |
set reply "Sorry, no search results were found." | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_modes" | |
} else { | |
break | |
} | |
} | |
# add the search result | |
# add game to output if there is one | |
if {[info exists game]} { | |
if {[string match -nocase "all" $input] == 1} { | |
append output "${incith::google::seperator}$::incith::google::desc_modes\002${game}\002 ($sys) by $pub (${date})$::incith::google::desc_demodes" | |
} else { | |
append output "${incith::google::seperator}$::incith::google::desc_modes\002${game}\002 by $pub (${date})$::incith::google::desc_demodes" | |
} | |
unset game; unset date | |
} | |
# increase the results, clear the variables for the next loop just in case | |
incr results | |
} | |
# if we have nothing to send, we have no results :( | |
if {$output == ""} { | |
set output "${::incith::google::desc_modes}Sorry, found no results! \[system = gc/pc/ps2/ps3/wii/xbox/x360/ds/gba/psp/mobile/ngage/3d0/dc/gen/jag/n64/neo/ps1/sat/snes\] usage: !top system" | |
} | |
return "$output" | |
} | |
# Google Trends | |
# fetches top search terms from google | |
# -speechless supplied | |
# | |
proc trends {input} { | |
# lots of variables, keeping them clean is important. | |
; set results 0 ; set output "" ; set tresult "" ; set no_results "" ; set no_search "" | |
set html [fetch_html $input 13] | |
# user input causing errors? | |
if {[string match -nocase "*socketerrorabort*" $html]} { | |
regsub {(.+?)\|} $html {} html | |
return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" | |
} | |
if {[string match -nocase "*timeouterrorabort*" $html]} { | |
return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" | |
} | |
# give location results we are displaying. | |
regexp -- {<table width=100% cellpadding=2 cellspacing=0 bgcolor=#E5ECF9><tr><td>(.+?)</td>} $html - tresult | |
if {$tresult != ""} { set output "$::incith::google::total_modes${tresult}$::incith::google::total_demodes${incith::google::seperator}" } | |
# get what we call the no_search for any language. | |
if {[string match "*system_down.html*" $html]} { | |
set no_search "$::incith::google::error_modes\002Trends Error:\002 System appears to be down, try again later.$::incith::google::error_demodes" | |
} else { | |
if {[regexp -- {<br><br>(.+?)</p>} $html - no_search]} { | |
regsub -- {<p>} $no_search { } no_search | |
} else { | |
if {![regexp -- {<ul><li>(.+?)</ul>} $html - no_search]} { | |
regexp -- {</table><p>(.+?)</p>} $html - no_search | |
} | |
} | |
} | |
# remove the bold if it isn't desired. | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
# parse for results and loop until desired amount of results | |
# is attempted to be reached if possible. | |
while {$results < $incith::google::trends_results} { | |
set link "$::incith::google::total_modes\002[expr $results + 1]\002$::incith::google::total_demodes" | |
# grab our trend and cut it out | |
regexp -- {<td class=num>.+?<a href=.+?>(.+?)</a>} $html {} desc | |
regsub -- {<td class=num>.+?<a href=.+?>(.+?)</a>} $html "" html | |
if {[info exists desc]} { | |
append link " $incith::google::desc_modes$desc$::incith::google::desc_demodes" | |
} else { | |
if {$results == 0} { | |
set reply "${no_search}" | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
# add the search result | |
# add game to output if there is one | |
if {[info exists desc]} { | |
append output "${link}${incith::google::split_char}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset desc; unset link | |
incr results | |
} | |
# if we have nothing to send, we have no results :( | |
if {$output == ""} { | |
set output "$::incith::google::desc_modes${no_search}$::incith::google::desc_demodes" | |
} | |
return [string trim $output $incith::google::split_char] | |
} | |
# Gamespot Game Review | |
# fetches review results from gamespot searches. | |
# -speechless supplied | |
# | |
proc rev {input} { | |
global incithcookie | |
# lots of variables, keeping them clean is important.. | |
; set results "" ; set output "" ; set tresult ""; set inputb "" | |
; set ebcU "" ; set ebcI "" ; set ebcPR "" ; set review "" | |
; set us "?" ; set them "?" ; set you "?" ; set stats "" ; set vid "" | |
regexp -nocase -- {^(.+?) @ (.+?)$} $input - input inputb | |
# fetch the html | |
set html [fetch_html $input 12] | |
regsub -all {\\n} $html "" html | |
if {[string match "*NO RESULTS RETURNED*" $html]} { | |
set reply "${::incith::google::desc_modes}Sorry, no search results were found." | |
return $reply | |
} | |
if {$inputb != ""} { | |
while {$results == ""} { | |
# this could break any second, its cumbersome and long..i know, but for now it works. | |
regexp -- {<div class=\\"result_title\\">.*?<a href=\\"(.+?)\?tag=result.*?\\">(.+?)<\\/a>} $html - ebcU ebcI | |
set ebcU [string map {"\\" ""} $ebcU] | |
if {[string match -nocase "*\(${inputb}\)*" $ebcI] == 1} { set results "true" } | |
if {$ebcU == $ebcPR} { | |
regsub -all { } $input {%20} input | |
return "${::incith::google::desc_modes}Sorry, game does not appear for that console when searching first page results. See for yourself @ http://www.gamespot.com/pages/search/index.php?qs=${input}#game" | |
} | |
regsub -- {<div class=\\"result_title\\">.*?<a href=\\".+?\\">.+?<\\/a>} $html "" html | |
set ebcPR $ebcU | |
} | |
} | |
# get url snippet where game review can be pulled | |
if {$inputb == ""} { | |
if {[regexp -- {<div class=\\"result_title\\">.*?<a href=\\"(.+?)\?tag=result.*?\\">(.+?)<\\/a>} $html - ebcU ebcI]} { | |
set ebcU [string map {"\\" ""} $ebcU] | |
} | |
} | |
# if no snippet there is nothing more to do | |
if {$ebcU == "" } { return "${::incith::google::desc_modes}Sorry, no search results were found." } | |
# grab game review | |
set query "${ebcU}" | |
set ebcU ""; set ebcI ""; set ebcPR "" | |
regexp -- {(.+?)&q=} $query {} query | |
regexp -- {(.+?)\?q=} $query {} query | |
if {![string match "*http*" $query]} { | |
set query "http://www.gamespot.com${query}" | |
} | |
# beware, changing the useragent will result in differently formatted html from Google. | |
set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e" | |
set http [::http::config -useragent $ua] | |
set http [::http::geturl $query -headers $::incith_hdr -timeout [expr 1000 * 10]] | |
if {$::incith::google::debug > 0 } { | |
putserv "privmsg $incith::google::debugnick :\002url \(<--[::http::ncode $http]\):\002 $query" | |
} | |
set redir [::http::ncode $http] | |
upvar #0 $http state | |
# iterate through the meta array | |
foreach {name value} $state(meta) { | |
# do we have cookies? | |
if {[string equal -nocase $name "Set-Cookie"]} { | |
# yes, add them to cookie list | |
lappend reviewCookies [lindex [split $value {;}] 0] | |
} | |
} | |
if {[string match "*${redir}*" "307|303|302|301" ]} { | |
foreach {name value} $state(meta) { | |
if {[regexp -nocase ^location$ $name]} { | |
putserv "privmsg $incith::google::debugnick :$::incith_hdr Cookie [join $reviewCookies {;}] Referer $query" | |
set http [::http::geturl "http://www.gamespot.com$value" -headers "$::incith_hdr Cookie [join $reviewCookies {;}] Referer $query" -timeout [expr 1000 * 10]] | |
putserv "privmsg $incith::google::debugnick :\002url \(-->[::http::ncode $http]\):\002 http://www.gamespot.com$value" | |
set redir [::http::ncode $http] | |
upvar #0 $http state | |
} | |
} | |
} | |
set html [::http::data $http] | |
::http::cleanup $http | |
# strip the html down | |
#regsub -all "\t" $html "" html | |
#regsub -all "\n" $html "" html | |
#regsub -all "\r" $html "" html | |
#regsub -all "\v" $html "" html | |
#regsub -all "<script.*?>.*?</script>" $html "" html | |
# DEBUG DEBUG | |
set junk [open "ig-debug-5.txt" w] | |
puts $junk $html | |
close $junk | |
if {![regexp -- {<h2 class="prodTitle">(.*?)</h2>} $html - name]} { | |
regexp -- {<title>(.+?) \- } $html {} name | |
# sometimes our game and system cut isn't pretty this cleans it up | |
regexp -- {(.+?)<.+?title} $name - name | |
set name [string trim $name] | |
} else { | |
regsub -- {</h1>} $name " " name | |
regsub -all -- {<.*?>} $name "" name | |
} | |
if {[regexp -- {\&tag=scoresummary%3Bgs-score">(.+?)<} $html - us]} { | |
regsub -- {<.*?>} $us "" us | |
} | |
if {[regexp -- {\&tag=scoresummary%3Bcritic-score">(.+?)<} $html - them]} { | |
regsub -- {<.*?>} $them "" them | |
} | |
regexp -- {\?tag=scoresummary%3Buser-score">(.+?)<} $html - you | |
if {[regexp -- {<ul class="stats">(.+?)<div class="actions">} $html - stats]} { | |
regsub {<div class="label">Top 5 User Tags\:.+?</ol>} $stats "" stats | |
regsub {<div class="desc">.+?</ul>} $stats "" stats | |
regsub {<li class="stat universe">.+?</ul>} $stats "" stats | |
regsub -all {<.+?>} $stats "" stats | |
while {[string match "* *" $stats]} { | |
regsub -all -- { } $stats " " stats | |
} | |
regsub {More Info Game Stats} $stats "» «" stats | |
regsub {Tracking\:.+?Wish It»} $stats "» «" stats | |
regsub -all {»} $stats "» «" stats | |
regsub -all {/\s»} $stats "»" stats | |
regsub -all {«\s/} $stats "«" stats | |
} | |
if {[regexp {<p class="review deck".*?>(.+?)</p>} $html - review]} { | |
regsub -all -- {<.*?>} $review "" review | |
set review " « $review »" | |
} elseif {[regexp {<p class="product deck".*?>(.+?)</p>} $html - review]} { | |
regsub -all -- {<.*?>} $review "" review | |
set review " « $review »" | |
} | |
if {[regexp -- {<ul class="videos">.+?<a href="(.+?)".*?">(.+?)</a>} $html - vurl vid]} { | |
if {[regexp -nocase -- {a href=""} $vid]} { | |
if {[regexp -- {<div class="module videos">.*?<div class="head">.*?href="(.*?)">(.*?)</a>} $html - vurl vid]} { | |
set vurl "http://www.gamespot.com$vurl" | |
} | |
} else { | |
regexp -- {^(.+?)?tag=;} $vurl - vurl | |
} | |
if {[string match "/" [string index $vurl 0]]} { set vurl "http://www.gamespot.com$vurl" } | |
set vid "$incith::google::desc_modes ... \002Video:\002 $vid$::incith::google::desc_demodes$::incith::google::break$::incith::google::link_modes$vurl$::incith::google::link_demodes" | |
} | |
set desc "[descdecode "${name} \(us\002$us\002 them\002$them\002 you\002$you\002\) «$stats»$review"]" | |
# make sure we have something to send | |
set output "$::incith::google::desc_modes${desc}$::incith::google::desc_demodes$::incith::google::break$::incith::google::link_modes${query}$::incith::google::link_demodes$vid" | |
return $output | |
} | |
# IGN | |
# fetches games results from ign searches. | |
# -speechless supplied | |
# | |
proc ign {input} { | |
# lots of variables, keeping them clean is important. | |
# borrowed mostly from my ebay proc above. | |
; set results 0 ; set output "" ; set tresult "" | |
; set ebcU "" ; set ebcI "" ; set ebcBid "" ; set ebcPR "" | |
; set ebcCheck "" ; set match "" | |
# fetch the html | |
set html [fetch_html $input 26] | |
if {$html == ""} { return "${::incith::google::error_modes}IGN search page appears to be blank... No results maybe?!" } | |
# give results an output header with result tally. | |
# regexp -- {All Products \(([,0-9]{1,})\)<br/>} $html - match | |
set match "iGN" | |
# format output according to variables. | |
if {$match != ""} { | |
set output "$::incith::google::total_modes\002${match}\002 results$::incith::google::total_demodes${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} else { | |
regexp -- {<p.*?class="searchResultTitle">(.+?)</p>} $html - match | |
set output "${match}$::incith::google::seperator" | |
} | |
if {[regexp -- {<p class="searchResultTitle".+?<strong>(.+?)<br} $html - no_search]} { | |
return $no_search | |
} | |
# parse the html | |
while {$results < $incith::google::ign_results} { | |
# this could break any second, its cumbersome and long..i know, but for now it works. | |
regexp -- {<h3 class="game-title"><a href="(.*?)">(.*?)</h3>} $html - ebcU ebcI | |
if {![regexp -- {class="publisherLink">(.*?)</a>(.*?)</p>} $html - ebcBid desc]} { | |
regexp -- {<div id="articleType"><strong>(.+?)</strong>} $html - ebcBid | |
set desc "" | |
} else { | |
set desc [string trim $desc "- "] | |
regsub -all -- {\s+} $desc " " desc | |
if {[string length $desc]} { | |
set desc " - $desc" | |
} | |
} | |
regsub -- {<h3 class="game-title">(.+?)</div>} $html "" html | |
# check results are more than 0, return or stop looping, depending | |
if {![string length $ebcU]} { | |
if {$results == 0} { | |
regexp -nocase -- {<p class="searchFail">(.*?)</p>} $html - reply | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
# this needs to be done for user formatting of links and descriptions. | |
set link "${ebcU}" | |
# prevent duplicate results is mostly useless here, but will at least | |
# ensure that we don't get the exact same article. | |
if {[string match "*$link*" $output] == 1} { | |
break | |
} | |
# ign clutters with excess spacing to make parsing hard | |
# this is a quick and dirty way to get through the mud. | |
#clean up messy parsing. | |
regsub -all {<script type=.+?script>} $ebcBid {} ebcBid | |
regsub -all -- {<(.+?)>} $ebcBid {} ebcBid | |
while {[string match "* *" $ebcBid]} { | |
regsub -all -- { } $ebcBid " " ebcBid | |
} | |
set ebcBid [string trim $ebcBid] | |
regexp -- {^(.*?)</a>(.*?)$} $ebcI - ebcI plat | |
regexp -- {<span class="platform default">(.*?)</span>} $ebcI - plat | |
regexp -- {^(.*?)</a>} $ebcI - ebcI | |
regsub -all -- {\s+} $plat { } plat | |
# set formatting. | |
set desc "${ebcI} ([string totitle $plat] by ${ebcBid})$desc" | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" } | |
# add the search result | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
append output "[descdecode ${desc}]$::incith::google::break${link}${incith::google::seperator}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset link ; set ebcCheck "" | |
incr results | |
} | |
# make sure we have something to send | |
if {[info exists output] == 0} { | |
set reply "Sorry, no search results were found." | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
return $output | |
} | |
# GameSpot | |
# fetches games results from gamespot searches. | |
# -speechless supplied | |
# | |
proc gamespot {input} { | |
# lots of variables, keeping them clean is important. | |
# borrowed mostly from my ebay proc above. | |
; set results 0 ; set output "" ; set tresult "" | |
; set type "" ; set name "" | |
; set details "" ; set deck "" | |
# fetch the html | |
set html [fetch_html $input 12] | |
regsub -all {\\n} $html "" html | |
# set up gamespot results header so results can be appended to it. | |
regexp -- {,"num_results"\:"(.+?)"} $html {} tresult | |
set tresult [string trim $tresult] | |
# format output according to variables. | |
if {$incith::google::total_results != 0} { | |
set output "$::incith::google::total_modes\002[string trim ${tresult}]\002 games$::incith::google::total_demodes${incith::google::seperator}" | |
if {$incith::google::bold_descriptions == 0} { | |
regsub -all -- "\002" $output {} output | |
} | |
} | |
# parse the html | |
while {$results < $incith::google::gamespot_results} { | |
# this could break any second, its cumbersome and long..i know, but for now it works. | |
if {[regexp -- {<div class=\\"result_title\\">(.*?)<a href=\\"(.+?)\\">(.*?)<\\/a>.*?<div class=\\"details\\">(.*?)<\\/div>.+?<div class=\\"deck\\">(.*?)<\\/div>} $html - type link name details deck]} { | |
regexp -- {^(.+?)\?tag=result} $link - link | |
if {[string length $deck] > 0} {set deck " - [string trim $deck]"} | |
regsub -- {<div class=\\"result_title\\">.+?<div class=\\"deck\\">.+?<\\/div>} $html "" html | |
set details [string map {" | " "/"} $details] | |
set link [string map {"\\" ""} $link] | |
set desc "\002[string trim $type] [string trim $name]\002 \([string trim $details]\)$deck" | |
} | |
# check results are more than 0, return or stop looping, depending | |
if {![info exists link]} { | |
if {$results == 0} { | |
set reply "Sorry, no search results were found." | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} else { | |
break | |
} | |
} | |
regsub -all {<.+?>} $desc "" desc | |
# prevent duplicate results is mostly useless here, but will at least | |
# ensure that we don't get the exact same article. | |
if {[string match "*$link*" $output] == 1} { | |
break | |
} | |
if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" } | |
if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" } | |
# add the search result | |
if {$incith::google::link_only == 1} { | |
append output "${link}${incith::google::seperator}" | |
} else { | |
append output "${desc}$::incith::google::break${link}${incith::google::seperator}" | |
} | |
# increase the results, clear the variables for the next loop just in case | |
unset link ; set name "" ; set deck "" ; set type "" ; set details "" | |
incr results | |
} | |
# make sure we have something to send | |
if {[info exists output] == 0} { | |
set reply "Sorry, no search results were found." | |
return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes" | |
} | |
return $output | |
} | |
# TriggerBot | |
# Displays all the triggers this scripts is capable of | |
# explaining syntax, and also will let user know if trigger | |
# is disabled or how many results are available. | |
# -speechless supplied | |
# | |
proc helpbot {nick input} { | |
set temp "" ; set output "" ; set num 0 ; set all 0 | |
set item "" ; set found "" | |
if {[string tolower $input] == [lindex [split $incith::google::helplist " "] 0]} { set all 1 ; set found "all" } | |
if {$all == 0} { | |
foreach item [split $incith::google::helplist] { | |
if {[string tolower $input] == $item} { set found $item } | |
} | |
if {$found == ""} { | |
foreach item [split $incith::google::helplist " "] { | |
append temp "${item}," | |
} | |
set temp [string trimright $temp ","] | |
return "${incith::google::helpmsg1} ${temp}" | |
} | |
} | |
puthelp "NOTICE $nick :--> Bot triggers available:" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 1]} { | |
foreach trig [split $incith::google::google_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::search_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::search_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help1} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 2]} { | |
foreach trig [split $incith::google::image_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::image_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::image_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help2} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 3]} { | |
foreach trig [split $incith::google::group_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::group_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::group_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help3} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 4]} { | |
foreach trig [split $incith::google::news_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::news_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::news_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help4} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 5]} { | |
foreach trig [split $incith::google::local_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::local_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::local_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help5} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 6]} { | |
foreach trig [split $incith::google::print_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::print_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::print_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help6} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 7]} { | |
foreach trig [split $incith::google::video_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::video_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::video_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help7} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 8]} { | |
foreach trig [split $incith::google::fight_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::google_fight > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::google_fight}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help8} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 9]} { | |
foreach trig [split $incith::google::youtube_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::youtube_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::youtube_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help9} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 10]} { | |
foreach trig [split $incith::google::trans_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::trans_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::trans_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help10} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 11]} { | |
foreach trig [split $incith::google::gamespot_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::gamespot_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::gamespot_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help11} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 12]} { | |
foreach trig [split $incith::google::gamefaq_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::gamefaq_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::gamefaq_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help12} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 13]} { | |
foreach trig [split $incith::google::blog_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::blog_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::blog_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help13} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 14]} { | |
foreach trig [split $incith::google::ebay_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::ebay_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::ebay_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help14} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 15]} { | |
foreach trig [split $incith::google::efight_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::google_fight > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::google_fight}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help15} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 16]} { | |
foreach trig [split $incith::google::wiki_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::wiki_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::wiki_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help16} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 17]} { | |
foreach trig [split $incith::google::wikimedia_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::wikimedia_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::wikimedia_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help17} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 18]} { | |
foreach trig [split $incith::google::locate_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::locate_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::locate_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help18} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 19]} { | |
foreach trig [split $incith::google::rev_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::rev_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::rev_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help19} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 20]} { | |
foreach trig [split $incith::google::mininova_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::mininova_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::mininova_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help20} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 21]} { | |
foreach trig [split $incith::google::recent_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::recent_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::recent_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help21} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 22]} { | |
foreach trig [split $incith::google::popular_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::popular_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::popular_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help22} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 23]} { | |
foreach trig [split $incith::google::daily_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::daily_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::daily_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help23} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 24]} { | |
foreach trig [split $incith::google::ign_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::ign_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::ign_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help24} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 25]} { | |
foreach trig [split $incith::google::myspacevids_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::myspacevids_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::myspacevids_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help25} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 26]} { | |
foreach trig [split $incith::google::trends_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::trends_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::trends_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help26} ${item}" | |
} | |
set temp "" | |
if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 27]} { | |
foreach trig [split $incith::google::scholar_binds " "] { | |
append temp "${incith::google::command_char}${trig}," | |
} | |
set temp [string trimright $temp ","] | |
if {$incith::google::scholar_results > 0} { | |
set item "${incith::google::helpmsg3}${incith::google::image_results}${incith::google::helpmsg4}" | |
} else { | |
set item "${incith::google::helpmsg2}" | |
} | |
puthelp "NOTICE $nick :${temp} ${incith::google::help27} ${item}" | |
} | |
} | |
# FETCH_HTML | |
# fetches html for the various *.google.com sites | |
# | |
proc fetch_html {input switch} { | |
global incithcharset | |
global incithcookie | |
set country "" | |
#--> # Begin urlencoding kludge | |
if {($switch < 15) || ($switch > 23) && ($switch != 28) && ($switch !=29) && ($switch !=56) && ($switch !=58) && ($switch !=59)} { | |
set helps $input | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - country input | |
# this is my input encoding hack, this will convert input before it goes | |
# out to be queried. | |
if {$incith::google::encoding_conversion_input > 0 && $country != "" } { | |
set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$country:*"]] :] 1] | |
if {$encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} { set input [encoding convertfrom $encoding_found $input] } | |
} else { set encoding_found "" } | |
set input [urlencode $input 0 "utf-8"] | |
set country "" ;#reset country and input | |
} | |
#<-- # End urlencoding kludge | |
if {$switch == 1} { | |
# make it so people can search their country | |
set country "" | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
set country "${incith::google::google_country}" | |
set flavor "search" | |
} else { | |
if {[string match */* $country]} { | |
if {![string length [set flavor [join [lrange [split $country /] 1 end] /]]]} { | |
set flavor "search" | |
} | |
set country [lindex [split $country /] 0] | |
} else { set flavor "search" } | |
} | |
if {[string equal -nocase "intl" [lindex [split $flavor /] 0]]} { | |
set lng [lindex [split $flavor /] 1] | |
set uselang 1 | |
} | |
# we don't want 'define:+<search>', so we'll just remove the space if there is one. | |
regsub -nocase -- {^define:\s*} $input {define:} input | |
# spell after define so 'spell: define: foo' doesn't turn into a define lookup | |
if {[string match -nocase "spell%3a*" $input] == 1} { | |
regsub -nocase -- {^spell%3a\s*} $input {} input | |
set spell "&spell=1" | |
} else { | |
set spell "" | |
} | |
if {[info exists uselang]} { | |
set query "http://www.google.${country}/search?hl=${lng}&q=${input}&safe=${incith::google::safe_search}&lr=lang_${incith::google::language}&ie=utf-8${spell}&nfpr=1" | |
} else { | |
set query "http://www.google.${country}/${flavor}?q=${input}&safe=${incith::google::safe_search}&lr=lang_${incith::google::language}&ie=utf-8${spell}&nfpr=1" | |
} | |
# IMAGES | |
} elseif {$switch == 2} { | |
# make it so people can search their country | |
set country "" | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
set country "${incith::google::google_country}" | |
} | |
set query "http://images.google.${country}/images?q=${input}&safe=${incith::google::safe_search}&btnG=Search+Images&ie=utf-8&sout=1&nfpr=1" | |
# LOCAL | |
} elseif {$switch == 3} { | |
# make it so people can search their country | |
set country "" | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
set country "${incith::google::google_country}" | |
set dummy $helps | |
} | |
#regexp -nocase -- {^(.+?) near (.+?)$} $dummy - search location | |
#set query "http://maps.google.${country}/maps?f=q&q=${search}&near=${location}&ie=UTF8&filter=0&oi=lwp_thresh&sa=X&view=text&ct=clnk&cd=1&nfpr=1" | |
set query "http://maps.google.${country}/maps?f=q&q=${input}&ie=utf-8&filter=0&oi=lwp_thresh&sa=X&view=text&ct=clnk&cd=1&nfpr=1" | |
} elseif {$switch == 4} { | |
# make it so people can search their country | |
set country "" | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
set country "${incith::google::google_country}" | |
} | |
set query "http://groups.google.${country}/groups/search?ie=UTF-8&q=${input}&qt_s=Search&safe=${incith::google::safe_search}&ie=utf-8&nfpr=1" | |
} elseif {$switch == 5} { | |
# make it so people can search their country | |
set country "" | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
set country "${incith::google::google_country}" | |
} | |
set query "http://news.google.${country}/news?q=${input}&ie=utf-8&nfpr=1" | |
} elseif {$switch == 6} { | |
# make it so people can search their country | |
set country "" | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
set country "${incith::google::google_country}" | |
} | |
set query "http://books.google.${country}/books?q=${input}&btnG=Search+Books&ie=utf-8&nfpr=1" | |
} elseif {$switch == 7} { | |
# make it so people can search their country | |
set country "" | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
set country "${incith::google::google_country}" | |
} | |
set query "http://www.google.${country}/search?q=${input}&tbs=vid:1&nfpr=1" | |
#set query "http://video.google.${country}/videosearch?q=${input}&btnG=Search+Video&ie=utf-8" | |
} elseif {$switch == 8} { | |
# make it so people can search their country | |
set country "" | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
set country "${incith::google::google_country}" | |
} | |
set query "http://www.google.${country}/search?hl=&q=${input}&safe=off&btnG=Search&lr=lang_all&num=1&ie=utf-8" | |
} elseif {$switch == 9} { | |
# make it so people can search their country | |
set country "" ; set hd "" | |
if {[regsub -nocase -all -- "[urlencode $::incith::google::youtube_highdef 0]" $input "" input]} { | |
set hd "&high_definition=1" | |
} | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
set country "${incith::google::youtube_country}" | |
} | |
if {$country == "com"} { | |
set query "http://www.youtube.com/results?search_query=${input}&hl=en&ie=utf-8$hd" | |
} else { | |
set query "http://${country}.youtube.com/results?search_query=${input}&hl=${country}&ie=utf-8$hd" | |
} | |
} elseif {$switch == 10} { | |
# make it so people can search their country | |
set country "" | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
set country "${incith::google::google_country}" | |
} | |
set query "http://scholar.google.${country}/scholar?hl=all&lr=&safe=${incith::google::safe_search}&q=${input}&btnG=Search&ie=utf-8" | |
} elseif {$switch == 11} { | |
#set query "http://vidsearch.myspace.com/index.cfm?fuseaction=vids.fullsearch&searchText=${input}&fullSearch=Search%20Videos" | |
#set query "http://vids.myspace.com/index.cfm?SearchBoxID=SplashHeader&fuseaction=vids.search&q=${input}&t=tvid" | |
set query "http://searchservice.myspace.com/index.cfm?fuseaction=sitesearch.results&orig=search_Header&origpfc=VidsSplash&type=MySpaceTV&qry=${input}&submit=Search" | |
} elseif {$switch == 12} { | |
#set query "http://www.gamespot.com/search.html?qs=${input}&x=0&y=0" | |
#set query "http://www.gamespot.com/pages/search/index.php?qs=${input}&sub=g" | |
set query "http://www.gamespot.com/pages/search/search_ajax.php?q=${input}&type=game&offset=0&tags_only=false&sort=rank" | |
#set query "http://www.gamespot.com/search.html?tag=search%3Bbutton&om_act=convert&om_clk=search&qs=${input}" | |
#set query "http://www.gamespot.com/pages/search/index.php?qs=${input}#game" | |
#set query "http://www.gamespot.com/search.html?qs=${input}" | |
#set query "http://www.gamespot.com/pages/tags/index.php?type=game&tags=${input}" | |
} elseif {$switch == 13} { | |
# make it so people can search their country | |
set country "" | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
set country "${incith::google::google_country}" | |
} | |
set query "http://www.google.${country}/trends/hottrends?date=${input}&sa=x&ctab=0&hl=en" | |
} elseif {$switch == 14} { | |
# make it so people can search their country | |
set country "" | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
set country "${incith::google::daily_country}" | |
} | |
if {$country == "en"} { | |
set query "http://www.dailymotion.com/relevance/search/${input}" | |
} else { | |
set query "http://www.dailymotion.com/${country}/relevance/search/${input}" | |
} | |
} elseif {$switch == 15} { | |
set query "http://www.gamefaqs.com/ds/releases${input}" | |
} elseif {$switch == 16} { | |
set query "http://www.gamefaqs.com/iphone/releases${input}" | |
} elseif {$switch == 17} { | |
set query "http://www.gamefaqs.com/psp/releases${input}" | |
} elseif {$switch == 18} { | |
set query "http://www.gamefaqs.com/xbox360/releases${input}" | |
} elseif {$switch == 19} { | |
set query "http://www.gamefaqs.com/xbox/releases${input}" | |
} elseif {$switch == 20} { | |
set query "http://www.gamefaqs.com/gamecube/releases${input}" | |
} elseif {$switch == 21} { | |
set query "http://www.gamefaqs.com/ps2/releases${input}" | |
} elseif {$switch == 22} { | |
set query "http://www.gamefaqs.com/pc/releases${input}" | |
} elseif {$switch == 23} { | |
set query "http://www.gamefaqs.com/ps3/releases${input}" | |
} elseif {$switch == 24} { | |
# make it so people can search their country | |
set country "" | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
set country "${incith::google::google_country}" | |
} | |
regsub -all -- {-} $input "%2d" input | |
set query "http://blogsearch.google.${country}/blogsearch?q=${input}&lr=&sa=N&tab=gn&ie=utf-8" | |
} elseif {$switch == 25} { | |
# make it so people can search their country | |
set country "" ; set shop "" | |
regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy | |
if {$country == ""} { | |
if {![regexp -nocase -- {^\@(.+?)\s(.+?)$} $helps - shop input]} { | |
set country $::incith::google::ebay_country | |
} | |
} | |
regsub -all -- {-} $input "%2d" input | |
regsub -all -- { } $input "-" input | |
#set query "http://search.ebay.com/search/search.dll?sofocus=unknown&sbrftog=1&from=R10&_trksid=m37&satitle=${input}&sacat=-1%26catref%3DC6&sargn=-1%26saslc%3D2&sadis=200&fpos=95482&sabfmts=1&saobfmts=insif&ftrt=1&ftrv=1&saprclo=&saprchi=&fsop=1%26fsoo%3D1&coaction=compare&copagenum=1&coentrypage=search" | |
#set query "http://search.ebay.${country}/${input}" | |
#set query "http://shop.ebay.${country}/items/_W0QQ_nkwZ${input}QQ_armrsZ1QQ_fromZQQ_mdoZ" | |
#set query "http://shop.ebay.${country}/${input}" | |
#set query "http://shop.ebay.${country}/items/_W0QQ_nkwZ${input}QQ_armrsZ1QQ_fromZQQ_mdoZ" | |
if {![string length $shop]} { | |
set query "http://shop.ebay.${country}/i.html?_nkw=${input}&_armrs=1&_from=&_ipg=&_dmd=1" | |
} else { | |
set query "http://$shop.shop.ebay.com/?_nkw=${input}&_armrs=1&_from=&_ipg=&_dmd=1" | |
} | |
#set query "http://search.ebay.${country}/${input}_W0QQpqryZ${input}" | |
} elseif {$switch == 26} { | |
set query "http://search.ign.com/products?sort=relevance&query=${input}&so=exact&objtName=all&origin=&startat=0&nc=false&ns=false" | |
#set query "http://search.ign.com/products?query=${input}" | |
} elseif {$switch == 27} { | |
# place holder for wikipedia | |
# eventually it will get put back into fetch_html | |
} elseif {$switch == 28} { | |
set query "http://www.gamefaqs.com/wii/releases${input}" | |
} elseif {$switch == 29} { | |
set query "http://www.gamefaqs.com/dreamcast/releases${input}" | |
} elseif {$switch == 30} { | |
set query "http://www.gamerankings.com/browse.html?site=gamecube&cat=0&year=2&numrev=0&sort=${input}&search=" | |
} elseif {$switch == 31} { | |
set query "http://www.gamerankings.com/browse.html?site=pc&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 32} { | |
set query "http://www.gamerankings.com/browse.html?site=ps2&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 33} { | |
set query "http://www.gamerankings.com/browse.html?site=ps3&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 34} { | |
set query "http://www.gamerankings.com/browse.html?site=wii&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 35} { | |
set query "http://www.gamerankings.com/browse.html?site=xbox&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 36} { | |
set query "http://www.gamerankings.com/browse.html?site=xbox360&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 37} { | |
set query "http://www.gamerankings.com/browse.html?site=ds&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 38} { | |
set query "http://www.gamerankings.com/browse.html?site=gba&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 39} { | |
set query "http://www.gamerankings.com/browse.html?site=psp&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 40} { | |
set query "http://www.gamerankings.com/browse.html?site=mobile&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 41} { | |
set query "http://www.gamerankings.com/browse.html?site=ngage&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 42} { | |
set query "http://www.gamerankings.com/browse.html?site=3do&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 43} { | |
set query "http://www.gamerankings.com/browse.html?site=dreamcast&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 44} { | |
set query "http://www.gamerankings.com/browse.html?site=genesis&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 45} { | |
set query "http://www.gamerankings.com/browse.html?site=jaguar&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 46} { | |
set query "http://www.gamerankings.com/browse.html?site=n64&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 47} { | |
set query "http://www.gamerankings.com/browse.html?site=neo&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 48} { | |
set query "http://www.gamerankings.com/browse.html?site=ps&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 49} { | |
set query "http://www.gamerankings.com/browse.html?site=saturn&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 50} { | |
set query "http://www.gamerankings.com/browse.html?site=snes&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 51} { | |
set query "http://www.mininova.org/search/${input}/seeds" | |
} elseif {$switch == 52} { | |
set query "http://www.gamerankings.com/browse.html?site=segacd&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 53} { | |
set query "http://www.gamerankings.com/browse.html?site=gameboy&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 54} { | |
set query "http://www.gamerankings.com/browse.html?site=gbc&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 55} { | |
set query "http://www.gamerankings.com/browse.html?site=&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 56} { | |
set query "http://www.gamefaqs.com/3ds/releases${input}" | |
} elseif {$switch == 57} { | |
set query "http://www.gamerankings.com/browse.html?site=3ds&cat=0&year=0&numrev=3&sort=${input}&search=" | |
} elseif {$switch == 58} { | |
set query "http://www.gamerankings.com/browse.html?site=mac&cat=0&year=0&numrev=2&sort=${input}&search=" | |
} elseif {$switch == 59} { | |
set query "http://www.gamefaqs.com/mac/releases${input}" | |
} | |
# didnt have this before, this is needed for google parsers to correctly | |
# encode the 'do not include' tag, aka the hyphen.. hehe | |
if {$switch < 9} { | |
regsub -nocase -- {-} $input "%2d" input | |
} | |
regsub -all -- {\+} $query {%2B} query | |
regsub -all -- {\"} $query {%22} query | |
if {$switch != 25} { | |
regsub -all -- { } $query {+} query | |
} | |
if {$switch == 12} { | |
# grab the ajax data | |
set http [::http::geturl $query -headers "X-Requested-With XMLHttpRequest X-Request JSON Referer $query $::incith_hdr" -timeout [expr 1000 * 10]] | |
upvar #0 $http state | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
set html [charenc [ungzip [string map {"\\n" "" "\\" ""} [::http::data $http]] $state(meta)] $state(charset)] | |
set redir [::http::ncode $http] | |
set cookies [list] | |
} else { | |
# beware, changing the useragent will result in differently formatted html from Google. | |
set ua "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3" | |
#set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e" | |
# enable proxy | |
if {![string length $::incith::google::proxy_host]} { | |
set http [::http::config -useragent $ua] | |
} else { | |
set http [::http::config -useragent $ua -proxyhost $::incith::google::proxy_host -proxyport $::incith::google::proxy_port] | |
} | |
# stole this bit from rosc2112 on egghelp forums | |
# borrowed is a better term, all procs eventually need this error handler. | |
catch {set http [::http::geturl "$query" -headers $::incith_hdr -timeout [expr 1000 * 12]]} error | |
if {[string match -nocase "*couldn't open socket*" $error]} { | |
return "socketerrorabort|${query}" | |
} | |
if { [::http::status $http] == "timeout" } { | |
return "timeouterrorabort" | |
} | |
upvar #0 $http state | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
set html [charenc [ungzip [::http::data $http] $state(meta)] $state(charset)] | |
set redir [::http::ncode $http] | |
# CHECK CHECK | |
upvar #0 $http state | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
# Are there cookies? | |
set cookies [list] | |
foreach {name value} $state(meta) { | |
# do we have cookies? | |
if {[string equal -nocase $name "Set-Cookie"]} { | |
# yes, add them to cookie list | |
lappend webCookies [lindex [split $value {;}] 0] | |
} | |
} | |
if {[info exists webCookies] && [llength $webCookies]} { | |
set cookies "[string trim [join $webCookies {;}] {;}]" | |
} else { | |
set cookies "" | |
} | |
# REDIRECT | |
while {[string match "*${redir}*" "303|302|301" ]} { | |
foreach {name value} $state(meta) { | |
if {[regexp -nocase ^location$ $name]} { | |
if {![string match "http*" $value]} { | |
if {![string match "/" [string index $value 0]]} { | |
set value "[join [lrange [split $query "/"] 0 2] "/"]/$value" | |
} else { | |
set value "[join [lrange [split $query "/"] 0 2] "/"]$value" | |
} | |
} | |
if {[string length $cookies]} { | |
set http [::http::geturl "[string map {" " "%20"} $value]" -headers "$::incith_hdr Referer $query Cookie $cookies" -timeout [expr 1000 * 10]] | |
} else { | |
set http [::http::geturl "[string map {" " "%20"} $value]" -headers "$::incith_hdr Referer $query" -timeout [expr 1000 * 10]] | |
} | |
if { $::incith::google::debug > 0 } { putserv "privmsg $::incith::google::debugnick :\002redirected \($redir\):\002 $query -> $value :: \002Cookie:\002 [join $cookies]" } | |
if {[string match -nocase "*couldn't open socket*" $error]} { | |
return "socketerrorabort|${value}" | |
} | |
if { [::http::status $http] == "timeout" } { | |
return "timeouterrorabort" | |
} | |
upvar #0 $http state | |
# Are there cookies? | |
foreach {nam val} $state(meta) { | |
# do we have cookies? | |
if {[string equal -nocase $nam "Set-Cookie"]} { | |
if {![info exists flagme]} { | |
set flagme 0 | |
set cookies [list] | |
} | |
# yes, add them to cookie list | |
lappend webCookies [lindex [split $val {;}] 0] | |
} | |
} | |
if {[info exists webCookies] && [llength $webCookies]} { | |
set cookies "[string trim [join $webCookies {;}] {;}]" | |
} else { | |
set cookies "" | |
} | |
set redir [::http::ncode $http] | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
set query [string map {" " "%20"} $value] | |
} | |
} | |
} | |
} | |
set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)] | |
set html [charenc [ungzip [::http::data $http] $state(meta)] $state(charset)] | |
::http::cleanup $http | |
# ---- step 1 | |
# Determine which encoding to use | |
# | |
set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$country:*"]] :] 1] | |
if {$incith::google::encoding_conversion_output > 0} { | |
if {$incith::google::automagic > 0} { | |
if {[string match -nocase "utf-8" $incithcharset] && $incith::google::utf8workaround > 0 && $encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} { | |
set new_encoding $encoding_found | |
} else { | |
set new_encoding $incithcharset | |
} | |
} else { | |
if {$encoding_found != "" } { | |
set new_encoding $encoding_found | |
} else { | |
set new_encoding "NONE" | |
} | |
} | |
} else { | |
set new_encoding "DISABLED" | |
} | |
# ---- step 2 | |
# Report the conclusion to debugnick | |
# | |
if {$incith::google::debug > 0} { | |
if {[string match -nocase $new_encoding $incithcharset]} { | |
if {[lsearch -exact [encoding names] $incithcharset] != -1} { | |
putserv "privmsg $incith::google::debugnick :\002url \($redir\):\002 $query \002\037charset:\037\002 $incithcharset \002encode_string:\002 $encoding_found :: \002Cookie:\002 $cookies" | |
} else { | |
putserv "privmsg $incith::google::debugnick :\002url \($redir\):\002 $query \002\037charset:\037\002 $incithcharset \037<--ERROR: Unknown\037 \002encode_string:\002 $encoding_found :: \002Cookie:\002 $cookies" | |
} | |
} elseif {[string match -nocase $new_encoding $encoding_found]} { | |
if {$encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} { | |
putserv "privmsg $incith::google::debugnick :\002url \($redir\):\002 $query \002charset:\002 $incithcharset \037\002encode_string:\002\037 $encoding_found :: \002Cookie:\002 $cookies" | |
} else { | |
putserv "privmsg $incith::google::debugnick :\002url \($redir\):\002 $query \002charset:\002 $incithcharset \002\037encode_string:\037\002 $encoding_found \037<--ERROR: Unknown\037 :: \002Cookie:\002 $cookies" | |
} | |
} elseif {[string match -nocase "DISABLED" $new_encoding]} { | |
putserv "privmsg $incith::google::debugnick :\002url \($redir\):\002 $query \002charset:\002 $incithcharset \002encode_string:\002 $encoding_found \037DISABLED:\037 Using default charset. :: \002Cookie:\002 $cookies" | |
} else { | |
putserv "privmsg $incith::google::debugnick :\002url \($redir\):\002 $query \002charset:\002 $incithcharset \002encode_string:\002 $encoding_found \037UNKNOWN ERROR:\037 Using default charset. :: \002Cookie:\002 $cookies" | |
} | |
} | |
# ---- step 3 | |
# Apply the encoding | |
# | |
#if {![string match *$new_encoding* "utf-8"] && ![string equal "DISABLED" $new_encoding]} { | |
# set incithcharset $new_encoding | |
# set html [incithencode $html] | |
#} | |
# generic pre-parsing | |
regsub -all "\n" $html "" html | |
regsub -all "(?:\x91|\x92|')" $html {'} html | |
regsub -all "(?:\x93|\x94|")" $html {"} html | |
regsub -all "&" $html {\&} html | |
regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html | |
if {![string match $switch "4"] && ![string match $switch "26"]} { | |
regsub -all -nocase {<font.+?>} $html "" html | |
regsub -all -nocase {</font>} $html "" html | |
regsub -all -nocase {<script type=.*?script>} $html "" html | |
} | |
if {![string match *$switch* "|9|7|5|"]} { | |
regsub -all -nocase {<span.*?>} $html "" html | |
regsub -all -nocase {</span>} $html "" html | |
} | |
regsub -all -nocase {<input.+?>} $html "" html | |
regsub -all -nocase {(?:<i>|</i>)} $html "" html | |
regsub -all "×" $html {*} html | |
regsub -all " " $html { } html | |
regsub -all -nocase "×" $html "x" html | |
regsub -all -nocase "<" $html "<" html | |
regsub -all -nocase ">" $html ">" html | |
regsub -all {\x000f} $html "" html | |
# ' | |
# regexps that should remain seperate go here | |
# google specific regexps | |
if {$switch == 1} { | |
# regexp the rest of the html for a much easier result to parse | |
regsub -all -nocase {<b>\[PDF\]</b>\s*} $html "" html | |
regsub {<p class=g style="margin-top:0">(.+?)</p>} $html "" html | |
} elseif {$switch == 2} { | |
# these %2520 codes, I have no idea. But they're supposed to be %20's | |
regsub -all {%2520} $html {%20} html | |
} elseif {$switch == 3} { | |
regsub -all -nocase { - <nobr>Unverified listing</nobr>} $html "" html | |
regsub -all -- { } $html { } html | |
} elseif {$switch == 4} { | |
} elseif {$switch == 5} { | |
} elseif {$switch == 6} { | |
} elseif {$switch == 7} { | |
} elseif {$switch == 8} { | |
} elseif {$switch == 9} { | |
regsub -all "\t" $html "" html | |
regsub -all "\n" $html "" html | |
regsub -all "\r" $html "" html | |
regsub -all "\v" $html "" html | |
} elseif {$switch == 10} { | |
regsub -all -nocase { - <nobr>Unverified listing</nobr>} $html "" html | |
regsub -all -- { } $html { } html | |
} elseif {$switch == 25} { | |
regsub -all {<script.*?>.+?</script>} $html "" html | |
regsub -all "\t" $html "" html | |
regsub -all "\n" $html "" html | |
regsub -all "\r" $html "" html | |
regsub -all "\v" $html "" html | |
regsub -all "<wbr/>" $html "" html | |
} elseif {$switch > 11 && $switch < 31 || $switch == 56 || $switch == 58 || $switch == 59} { | |
regsub -all "\t" $html "" html | |
regsub -all "\n" $html "" html | |
regsub -all "\r" $html "" html | |
regsub -all "\v" $html "" html | |
regsub -all "'" $html "'" html | |
} elseif {$switch == 51} { | |
regsub -all "<strong>|</strong>" $html "\002" html | |
} | |
# no point having it so many times | |
if {$incith::google::bold_descriptions > 0 && [string match "\002" $incith::google::desc_modes] != 1} { | |
regsub -all -nocase {(?:<b>|</b>|<em>|</em>|<strong>|</strong>)} $html "\002" html | |
} else { | |
regsub -all -nocase {(<b>|</b>|<em>|</em>|<strong>|</strong>)} $html "" html | |
} | |
# DEBUG DEBUG | |
set junk [open "ig-debug.txt" w] | |
puts $junk $html | |
close $junk | |
return $html | |
} | |
# PUBLIC_MESSAGE | |
# decides what to do with binds that get triggered | |
# | |
proc public_message {nick uhand hand chan input} { | |
if {[lsearch -exact [channel info $chan] "google"] != -1} { | |
if {$incith::google::chan_user_level == 3} { | |
if {[isop $nick $chan] == 0} { | |
return | |
} | |
} elseif {$incith::google::chan_user_level == 2} { | |
if {[ishalfop $nick $chan] == 0 && [isop $nick $chan] == 0} { | |
return | |
} | |
} elseif {$incith::google::chan_user_level == 1} { | |
if {[isvoice $nick $chan] == 0 && [ishalfop $nick $chan] == 0 && [isop $nick $chan] == 0} { | |
return | |
} | |
} | |
send_output "$input" "$chan" "$nick" "$uhand" | |
} | |
} | |
# PRIVATE_MESSAGE | |
# decides what to do with binds that get triggered | |
# | |
proc private_message {nick uhand hand input} { | |
if {$incith::google::private_messages >= 1} { | |
send_output $input $nick $nick $uhand | |
} | |
} | |
# SEND_OUTPUT | |
# no point having two copies of this in public/private_message{} | |
# | |
proc send_output {input where nick uhand} { | |
# this is my input encoding hack, this will convert input before it goes | |
# out to be queried. | |
if {$incith::google::encoding_conversion_input > 0} { | |
if {[encoding system] != "identity" && [lsearch [encoding names] "utf-8"]} { | |
set command_char [encoding convertfrom "utf-8" ${incith::google::command_char}] | |
set input [encoding convertfrom "utf-8" $input] | |
} elseif {[encoding system] == "identity"} { | |
set command_char [encoding convertfrom identity ${incith::google::command_char}] | |
set input [encoding convertfrom identity $input] | |
} else { | |
set command_char ${incith::google::command_char} | |
} | |
} else { | |
set command_char ${incith::google::command_char} | |
} | |
#Specifically retrieve only ONE (ascii) character, then check that matches the command_char first | |
set trigger_char [string index $input 0] | |
if {[encoding system] == "identity"} { | |
set trigger_char [encoding convertfrom identity $trigger_char] | |
} | |
#Sanity check 1 - If no match, stop right here. No need to match every (first word) of | |
# every line of channel data against every bind if the command_char doesnt even match. | |
if {$trigger_char != $command_char} { | |
return | |
} | |
set trigger [string range [lindex [split $input] 0] 1 end] | |
#Sanity check 2 - Stop if theres nothing to search for (quiet) | |
if {$incith::google::aversion_vocabulary > 0} { | |
set search [vocabaversion [string trim [string range $input [string wordend $input 1] end]]] | |
} else { | |
set search [string trim [string range $input [string wordend $input 1] end]] | |
} | |
if {$search == ""} { return } | |
if {$incith::google::force_private == 1} { set where $nick } | |
# check for !google | |
if {$incith::google::search_results > 0} { | |
foreach bind [split $incith::google::google_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# channel filter check | |
foreach c [split $incith::google::filtered " "] { | |
if {[string match -nocase $where $c] == 1} { | |
return | |
} | |
} | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call google | |
foreach line [incith::google::parse_output [google $search]] { | |
put_output $where "$incith::google::search_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !images | |
if {$incith::google::image_results > 0} { | |
foreach bind [split $incith::google::image_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call images | |
foreach line [incith::google::parse_output [images $search]] { | |
put_output $where "$incith::google::image_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !local | |
if {$incith::google::local_results > 0} { | |
foreach bind [split $incith::google::local_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# local requires splitting of the search | |
regexp -nocase -- {^(.+?) near (.+?)$} $search - what location | |
if {![info exists what] || ![info exists location]} { | |
put_output $where "Local searches should be the format of 'pizza near footown, bar'" | |
return | |
} | |
foreach line [incith::google::parse_output [local $search]] { | |
put_output $where "$incith::google::local_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !groups | |
if {$incith::google::group_results > 0} { | |
foreach bind [split $incith::google::group_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call groups | |
foreach line [incith::google::parse_output [groups $search]] { | |
put_output $where "$incith::google::group_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !news | |
if {$incith::google::news_results > 0} { | |
foreach bind [split $incith::google::news_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call news | |
foreach line [incith::google::parse_output [news $search]] { | |
put_output $where "$incith::google::news_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !print | |
if {$incith::google::print_results > 0} { | |
foreach bind [split $incith::google::print_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call print | |
foreach line [incith::google::parse_output [print $search]] { | |
put_output $where "$incith::google::print_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !video | |
if {$incith::google::video_results > 0} { | |
foreach bind [split $incith::google::video_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call video | |
foreach line [incith::google::parse_output [video $search]] { | |
put_output $where "$incith::google::video_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !scholar | |
if {$incith::google::scholar_results > 0} { | |
foreach bind [split $incith::google::scholar_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call video | |
foreach line [incith::google::parse_output [scholar $search]] { | |
put_output $where "$incith::google::scholar_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !fight | |
if {$incith::google::google_fight > 0} { | |
foreach bind [split $incith::google::fight_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# fight requires splitting of the search | |
regexp -nocase -- {^(.+?) vs (.+?)$} $search - word1 word2 | |
if {![info exists word1] || ![info exists word2]} { | |
put_output $where "Google fights should be the format of 'word(s) one vs word(s) two'" | |
return | |
} | |
# call fight | |
foreach line [incith::google::parse_output [fight $search]] { | |
put_output $where "$incith::google::fight_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !ebayfight | |
if {$incith::google::google_fight > 0} { | |
foreach bind [split $incith::google::efight_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# fight requires splitting of the search | |
regexp -nocase -- {^(.+?) vs (.+?)$} $search - word1 word2 | |
if {![info exists word1] || ![info exists word2]} { | |
put_output $where "Ebay fights should be the format of 'word(s) one vs word(s) two'" | |
return | |
} | |
# call ebayfight | |
foreach line [incith::google::parse_output [ebayfight $search]] { | |
put_output $where "$incith::google::ebayfight_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !youtube | |
if {$incith::google::youtube_results > 0} { | |
foreach bind [split $incith::google::youtube_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call youtube | |
foreach line [incith::google::parse_output [youtube $search]] { | |
put_output $where "$incith::google::youtube_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !helpbot | |
if {$incith::google::helpbot_results > 0} { | |
foreach bind [split $incith::google::helpbot_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call helpbot | |
foreach line [incith::google::parse_output [helpbot $nick $search]] { | |
put_output $where $line | |
} | |
break | |
} | |
} | |
} | |
# check for !myspacevids | |
if {$incith::google::myspacevids_results > 0} { | |
foreach bind [split $incith::google::myspacevids_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call myspacevids | |
foreach line [incith::google::parse_output [myspacevids $search]] { | |
put_output $where "$incith::google::myspacevids_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !mininova | |
if {$incith::google::mininova_results > 0} { | |
foreach bind [split $incith::google::mininova_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call mininova | |
foreach line [incith::google::parse_output [mininova $search]] { | |
put_output $where "$incith::google::mininova_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !recent | |
if {$incith::google::recent_results > 0} { | |
foreach bind [split $incith::google::recent_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call recent game lookup | |
foreach line [incith::google::parse_output [recent $search]] { | |
put_output $where "$incith::google::recent_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !wiki | |
if {$incith::google::wiki_results > 0} { | |
foreach bind [split $incith::google::wiki_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call wiki | |
foreach line [incith::google::parse_output [wiki $search]] { | |
put_output $where "$incith::google::wiki_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !wikimedia | |
if {$incith::google::wikimedia_results > 0} { | |
foreach bind [split $incith::google::wikimedia_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call wiki | |
foreach line [incith::google::parse_output [wikimedia $search]] { | |
put_output $where "$incith::google::wikimedia_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !review | |
if {$incith::google::rev_results > 0} { | |
foreach bind [split $incith::google::rev_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call review | |
foreach line [incith::google::parse_output [rev $search]] { | |
put_output $where "$incith::google::rev_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !ign | |
if {$incith::google::ign_results > 0} { | |
foreach bind [split $incith::google::ign_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call ign | |
foreach line [incith::google::parse_output [ign $search]] { | |
put_output $where "$incith::google::ign_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !trends | |
if {$incith::google::trends_results > 0} { | |
foreach bind [split $incith::google::trends_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call trends | |
foreach line [incith::google::parse_output [trends $search]] { | |
put_output $where "$incith::google::trends_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !gamespot | |
if {$incith::google::gamespot_results > 0} { | |
foreach bind [split $incith::google::gamespot_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call gamespot | |
foreach line [incith::google::parse_output [gamespot $search]] { | |
put_output $where "$incith::google::gamespot_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !trans | |
if {$incith::google::trans_results > 0} { | |
foreach bind [split $incith::google::trans_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# translation requires splitting of the search | |
if {![regexp -nocase -- {^(.+?)@(.+?)\s(.+?)$} $search - word1 word2 word3]} { | |
if {[regexp -nocase -- {^@(.+?)\s(.+?)$} $search - word2 word3]} { | |
set search [join [lrange [split $search] 1 end]] | |
} else { | |
regexp -nocase -- {^(.+?)@\s(.+?)$} $search - word1 word3 | |
} | |
} | |
if {[info exists word2]} { | |
if {[string equal [string index $word2 0] " "]} { | |
regexp -nocase -- {^(.+?)@\s(.+?)$} $search - word1 word3 | |
set word2 $::incith::google::trans | |
} | |
} | |
if {![info exists word1]} { set word1 "auto" } | |
if {![info exists word2]} { set word2 $::incith::google::trans } | |
if {![info exists word3]} { set word3 $search } | |
set search "$word1@$word2 $word3" | |
# call translate | |
trans $search $where | |
} | |
} | |
} | |
# check for !dailymotion | |
if {$incith::google::daily_results > 0} { | |
foreach bind [split $incith::google::daily_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call dailymotion | |
foreach line [incith::google::parse_output [dailymotion $search]] { | |
put_output $where "$incith::google::dailymotion_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !gamefaqs | |
if {$incith::google::gamefaq_results > 0} { | |
foreach bind [split $incith::google::gamefaq_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# gamefaqs requires splitting of the search | |
regexp -nocase -- {^(.+?) in (.+?)$} $search - system region | |
if {![info exists system] || ![info exists region]} { | |
put_output $where "Error! Correct usage: !gamefaqs system in region \[system = nds/gba/gc/wii/ps2/psp/ps3/xbox/x360/pc; region = usa/jap/eur/aus\]" | |
return | |
} | |
# call gamefaqs | |
foreach line [incith::google::parse_output [gamefaqs $system $region]] { | |
put_output $where "$incith::google::gamefaqs_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !locate | |
if {$incith::google::locate_results > 0} { | |
foreach bind [split $incith::google::locate_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call locate | |
if {![string match "*.*" $search]} { | |
set nsearch [lindex [split [getchanhost $search $where] @] 1] | |
if {[string length $nsearch]} { set search $nsearch } | |
} | |
foreach line [incith::google::parse_output [locate $search]] { | |
put_output $where "$incith::google::locate_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !blog | |
if {$incith::google::blog_results > 0} { | |
foreach bind [split $incith::google::blog_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call blogsearch.google | |
foreach line [incith::google::parse_output [blog $search]] { | |
put_output $where "$incith::google::blog_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !ebay | |
if {$incith::google::ebay_results > 0} { | |
foreach bind [split $incith::google::ebay_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call ebay | |
foreach line [incith::google::parse_output [ebay $search]] { | |
put_output $where "$incith::google::ebay_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for !popular | |
if {$incith::google::popular_results > 0} { | |
foreach bind [split $incith::google::popular_binds " "] { | |
if {[string match -nocase $bind $trigger] == 1} { | |
# flood protection check | |
if {[flood $nick $uhand]} { | |
return | |
} | |
# call popular | |
foreach line [incith::google::parse_output [popular $search]] { | |
put_output $where "$incith::google::popular_prepend$line" | |
} | |
break | |
} | |
} | |
} | |
# check for customized any triggers | |
if {$incith::google::my_custom > 0} { | |
foreach bind $incith::google::my_customs { | |
foreach sbind [split [lindex [split $bind :] 0]] { | |
if {[string match -nocase $sbind $trigger] == 1} { | |
# invoke customized trigger with phrase | |
# no need to flood protect this, if we do | |
# it may trigger erroneously | |
set text [join [lrange [split $bind :] 2 end] :] | |
if {$::incith::google::custom_words > 0} { | |
set remaps [regexp -inline -all {%%((?:end|[0-9]{1,2}|[0-9]{1,2}-(?:[0-9]{1,2}|end)))%%} $text] | |
foreach {junk remap} $remaps { | |
if {[regexp -nocase {^((?:end|[0-9]{1,2}))$} $remap - rnum]} { | |
if {[string equal -nocase "end" $rnum]} { | |
set real [llength [split $search]] | |
} else { | |
set real [expr {$remap -1}] | |
} | |
regsub -all "$junk" $text "[lindex [split $search] $real]" text | |
} elseif {[regexp -nocase {^([0-9]{1,2})-((?:[0-9]{1,2}|end))$} $remap - rstart rend]} { | |
if {![string equal -nocase "end" $rend]} { set real [expr {$rend -1}] } else { set real [llength [split $search]] } | |
regsub -all "$junk" $text "[join [lrange [split $search] [expr {${rstart}-1}] $real]]" text | |
} | |
} | |
} | |
regsub -all -- {%search%} $text "$search" text | |
send_output "$::incith::google::command_char[lindex [split $bind :] 1] $text" $where $nick $uhand | |
} | |
} | |
} | |
} | |
} | |
# PUT_OUTPUT | |
# actually sends the output to the server | |
proc put_output {where line} { | |
if {$incith::google::notice_reply == 1} { | |
putserv "NOTICE $where :$line" | |
} else { | |
putserv "PRIVMSG $where :$line" | |
} | |
} | |
# PARSE_OUTPUT | |
# prepares output for sending to a channel/user, calls line_wrap | |
# | |
proc parse_output {input} { | |
set parsed_output [list] ; set parsed_current [list] | |
if {[string match "*\n*" $incith::google::seperator] == 1} { | |
set lastline "" | |
foreach newline [split $input "\n"] { | |
foreach line [incith::google::line_wrap $newline] { | |
set fix "" | |
# bold | |
if {[expr {[regexp -all {\002} $lastline] & 1 }]} { | |
append fix "\002" | |
} | |
# underline | |
if {[expr {[regexp -all {\037} $lastline] & 1 }]} { | |
append fix "\037" | |
} | |
# color | |
if {[expr {[regexp -all {\003} $lastline] & 1 }]} { | |
if {[set i [string last "\003" $lastline]] != -1} { | |
set lc [string range $lastline [expr {$i + 1}] [expr {$i + 5}]] | |
if {![regexp {^[0-9]+\,[0-9+]$} $lc]} { | |
if {[regexp {^[0-9]+$} [string range $lc 0 1]]} { | |
append fix "\003[string range $lc 0 1]" | |
} | |
} else { | |
append fix "\003$lc" | |
} | |
} | |
} | |
# add fix+line to output | |
if {[string length [string map {" " ""} [stripcodes bcruag $line]]]} { | |
lappend parsed_output "$fix$line" | |
} | |
set lastline "$fix$line" | |
} | |
} | |
} else { | |
set input [string trimright $input $incith::google::seperator] | |
set lastline "" | |
foreach line [incith::google::line_wrap $input] { | |
# initialize fix each iteration | |
set fix "" | |
# add bold | |
if {[expr {[regexp -all {\002} $lastline] & 1 }]} { | |
append fix "\002" | |
} | |
# add underline | |
if {[expr {[regexp -all {\037} $lastline] & 1 }]} { | |
append fix "\037" | |
} | |
# add color | |
if {[expr {[regexp -all {\003} $lastline] & 1 }]} { | |
if {[set i [string last "\003" $lastline]] != -1} { | |
set lc [string range $lastline [expr {$i + 1}] [expr {$i + 5}]] | |
if {![regexp {^[0-9]{1,2}\,[0-9]{1,2}$} $lc]} { | |
if {[regexp {^[0-9]{1,2}} [string range $lc 0 1]]} { | |
append fix "\003[string range $lc 0 1]" | |
} | |
} else { | |
append fix "\003$lc" | |
} | |
} | |
} | |
# add fix+line to output | |
if {[string length [string map {" " ""} [stripcodes bcruag $line]]]} { | |
lappend parsed_output "$fix$line" | |
} | |
set lastline "$fix$line" | |
} | |
} | |
return $parsed_output | |
} | |
# LINE_WRAP | |
# takes a long line in, and chops it before the specified length | |
# http://forum.egghelp.org/viewtopic.php?t=6690 | |
# | |
proc line_wrap {str {splitChr { }}} { | |
set out [set cur {}] | |
set i 0 | |
set len $incith::google::split_length | |
#regsub -all "\002" $str "<ZQ" str | |
#regsub -all "\037" $str "<ZX" str | |
#regsub -all "\003" $str "<ZJ" str | |
foreach word [split [set str][set str ""] $splitChr] { | |
if {[incr i [string len $word]] > $len} { | |
#regsub -all "<ZQ" $cur "\002" cur | |
#regsub -all "<ZX" $cur "\037" cur | |
#regsub -all "<ZJ" $cur "\003" cur | |
lappend out [join $cur $splitChr] | |
set cur [list $word] | |
set i [string len $word] | |
} else { | |
lappend cur $word | |
} | |
incr i | |
} | |
#regsub -all "<ZQ" $cur "\002" cur | |
#regsub -all "<ZX" $cur "\037" cur | |
#regsub -all "<ZJ" $cur "\003" cur | |
lappend out [join $cur $splitChr] | |
} | |
# CHARENC (aka, character encode) | |
# based upon webby, yes, webby r0x! | |
# | |
proc charenc {html encoding} { | |
global incithcharset | |
if {[regexp -nocase {"Content-Type" content=".*?; charset=(.*?)".*?>} $html - char]} { | |
set char [string trim [string trim $char "\"' /"] {;}] | |
regexp {^(.*?)"} $char - char | |
if {![string length $char]} { set char "None Given" ; set char2 "None Given" } | |
set char2 [string tolower [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $char]] | |
} else { | |
if {[regexp -nocase {<meta content=".*?; charset=(.*?)".*?>} $html - char]} { | |
set char [string trim $char "\"' /"] | |
regexp {^(.*?)"} $char - char | |
set mset $char | |
if {![string length $char]} { set char "None Given" ; set char2 "None Given" } | |
set char2 [string tolower [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $char]] | |
} else { | |
set char "None Given" ; set char2 "None Given" ; set mset "None Given" | |
} | |
} | |
set char3 [string tolower [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $encoding]] | |
if {[string equal $char $encoding] && [string equal $char $char2] && ![string equal -nocase "none given" $char]} { | |
set char [string trim $encoding {;}] | |
set incithcharset $encoding | |
} else { | |
if {![string equal -nocase $char2 $char3] && ![string equal -nocase "none given" $char2]} { | |
set html [incithConflict $html $char2] | |
set char [string trim $char2 {;}] | |
set incithcharset "utf-8" | |
} else { | |
if {[catch {package present http 2.7}]} { | |
# assume http package 2.5.3 | |
if {[string equal -nocase "utf-8" [encoding system]]} { | |
if {![string equal -nocase "utf-8" $char3]} { | |
set html [encoding convertfrom $char3 $html] | |
set incithcharset $char3 | |
} else { | |
#set html [encoding convertto $char3 $html] | |
set incithcharset $char3 | |
} | |
} elseif {![string equal -nocase "utf-8" [encoding system]]} { | |
if {[string equal "utf-8" $char3]} { | |
if {![string length $::incith_hdr]} { set html [encoding convertto $char3 $html] ; set incithcharset "utf-8" } | |
} else { | |
set html [encoding convertto "utf-8" [encoding convertfrom $char3 $html]] | |
set incithcharset "utf-8" | |
} | |
} | |
} else { | |
# we have http package 2.7 | |
if {![string equal -nocase "utf-8" [encoding system]]} { | |
set html [encoding convertto $char3 $html] | |
set incithcharset $char3 | |
} | |
} | |
} | |
} | |
return $html | |
} | |
# INCITH_CONFLICT | |
# resolves conflicts during encodings between header charset and meta charset | |
proc incithConflict {html out} { | |
set html [encoding convertfrom $out $html] | |
if {![string equal -nocase "utf-8" [encoding system]]} { set html [encoding convertto utf-8 $html] } | |
return $html | |
} | |
# FLOOD_INIT | |
# modified from bseen | |
# | |
variable flood_data | |
variable flood_array | |
proc flood_init {} { | |
if {$incith::google::ignore < 1} { | |
return 0 | |
} | |
if {![string match *:* $incith::google::flood]} { | |
putmainlog "$incith::google::version: variable flood not set correctly." | |
return 1 | |
} | |
set incith::google::flood_data(flood_num) [lindex [split $incith::google::flood :] 0] | |
set incith::google::flood_data(flood_time) [lindex [split $incith::google::flood :] 1] | |
set i [expr $incith::google::flood_data(flood_num) - 1] | |
while {$i >= 0} { | |
set incith::google::flood_array($i) 0 | |
incr i -1 | |
} | |
} | |
; flood_init | |
# FLOOD | |
# updates and returns a users flood status | |
# | |
proc flood {nick uhand} { | |
if {$incith::google::ignore < 1} { | |
return 0 | |
} | |
if {$incith::google::flood_data(flood_num) == 0} { | |
return 0 | |
} | |
set i [expr ${incith::google::flood_data(flood_num)} - 1] | |
while {$i >= 1} { | |
set incith::google::flood_array($i) $incith::google::flood_array([expr $i - 1]) | |
incr i -1 | |
} | |
set incith::google::flood_array(0) [unixtime] | |
if {[expr [unixtime] - $incith::google::flood_array([expr ${incith::google::flood_data(flood_num)} - 1])] <= ${incith::google::flood_data(flood_time)}} { | |
putmainlog "$incith::google::version: flood detected from ${nick}." | |
return 1 | |
} else { | |
return 0 | |
} | |
} | |
# AUTOMAGIC CHARSET ENCODING SUPPORT | |
# on the fly encoding support | |
# | |
proc incithdecode {text} { | |
global incithcharset | |
if {[lsearch -exact [encoding names] $incithcharset] != -1} { | |
set text [encoding convertfrom $incithcharset $text] | |
} | |
return $text | |
} | |
proc incithencode {text} { | |
global incithcharset | |
if {[lsearch -exact [encoding names] $incithcharset] != -1} { | |
set text [encoding convertto $incithcharset $text] | |
} | |
return $text | |
} | |
# utf-8 sucks for displaying any language using extended ascii, this helps alleviate that. | |
# correct utf-8 problems before they even appear. | |
proc utf8encodefix {country input} { | |
if {[lsearch -exact [encoding names] [set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "${country}:*"]] :] 1]]]} { | |
if {![string match "" $encoding_found]} { set input [encoding convertto $encoding_found $input] } | |
} | |
return $input | |
} | |
# Wikipedia/Wikimedia subtag-decoder... | |
# decodes those silly subtags | |
# | |
proc subtagDecode {text} { | |
set url "" ; set ::incithcharset "utf-8" | |
#if {![string equal $::incithcharset [encoding system]]} { set text [encoding convertfrom $::incithcharset $text] } | |
regsub -all {\.([0-9a-fA-F][0-9a-fA-F])} $text {[format %c 0x\1]} text | |
set text [subst $text] | |
#if {![string equal $::incithcharset [encoding system]]} { set text [encoding convertto $::incithcharset $text] } | |
regsub -all "\r\n" $text "\n" text | |
foreach byte [split $text ""] { | |
scan $byte %c i | |
if { $i < 33 } { | |
append url [format %%%02X $i] | |
} else { | |
append url $byte | |
} | |
} | |
return [string map {% .} $url] | |
} | |
# Vocabulary Aversion | |
# This converts swear words into appropriate words for IRC | |
# this is rather rudementary, is probably a better way to do this but meh.. | |
# | |
proc vocabaversion {text} { | |
set newtext "" | |
foreach element [split $text] { | |
set violation 0 | |
foreach vocabulary $incith::google::aversion { | |
set swear [lindex [split $vocabulary :] 0] | |
set avert [join [lrange [split $vocabulary :] 1 end]] | |
if {[string match -nocase "$swear" $element] && $avert != ""} { | |
append newtext "$avert " | |
set violation 1 | |
break | |
} | |
} | |
if {$violation == 0} { append newtext "$element " } | |
} | |
return [string trim $newtext] | |
} | |
# Description Decode | |
# convert html codes into characters - credit perplexa (urban dictionary) | |
# | |
proc descdecode {text} { | |
global incithcharset | |
# code below is neccessary to prevent numerous html markups | |
# from appearing in the output (ie, ", ᘧ, etc) | |
# stolen (borrowed is a better term) from tcllib's htmlparse ;) | |
# works unpatched utf-8 or not, unlike htmlparse::mapEscapes | |
# which will only work properly patched.... | |
if {[string match *&* $text]} { | |
set escapes { | |
\xa0 ¡ \xa1 ¢ \xa2 £ \xa3 ¤ \xa4 | |
¥ \xa5 ¦ \xa6 § \xa7 ¨ \xa8 © \xa9 | |
ª \xaa « \xab ¬ \xac ­ \xad ® \xae | |
¯ \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 ƒ \u192 Α \u391 Β \u392 Γ \u393 Δ \u394 | |
Ε \u395 Ζ \u396 Η \u397 Θ \u398 Ι \u399 | |
Κ \u39A Λ \u39B Μ \u39C Ν \u39D Ξ \u39E | |
Ο \u39F Π \u3A0 Ρ \u3A1 Σ \u3A3 Τ \u3A4 | |
Υ \u3A5 Φ \u3A6 Χ \u3A7 Ψ \u3A8 Ω \u3A9 | |
α \u3B1 β \u3B2 γ \u3B3 δ \u3B4 ε \u3B5 | |
ζ \u3B6 η \u3B7 θ \u3B8 ι \u3B9 κ \u3BA | |
λ \u3BB μ \u3BC ν \u3BD ξ \u3BE ο \u3BF | |
π \u3C0 ρ \u3C1 ς \u3C2 σ \u3C3 τ \u3C4 | |
υ \u3C5 φ \u3C6 χ \u3C7 ψ \u3C8 ω \u3C9 | |
ϑ \u3D1 ϒ \u3D2 ϖ \u3D6 • \u2022 | |
… \u2026 ′ \u2032 ″ \u2033 ‾ \u203E | |
⁄ \u2044 ℘ \u2118 ℑ \u2111 ℜ \u211C | |
™ \u2122 ℵ \u2135 ← \u2190 ↑ \u2191 | |
→ \u2192 ↓ \u2193 ↔ \u2194 ↵ \u21B5 | |
⇐ \u21D0 ⇑ \u21D1 ⇒ \u21D2 ⇓ \u21D3 ⇔ \u21D4 | |
∀ \u2200 ∂ \u2202 ∃ \u2203 ∅ \u2205 | |
∇ \u2207 ∈ \u2208 ∉ \u2209 ∋ \u220B ∏ \u220F | |
∑ \u2211 − \u2212 ∗ \u2217 √ \u221A | |
∝ \u221D ∞ \u221E ∠ \u2220 ∧ \u2227 ∨ \u2228 | |
∩ \u2229 ∪ \u222A ∫ \u222B ∴ \u2234 ∼ \u223C | |
≅ \u2245 ≈ \u2248 ≠ \u2260 ≡ \u2261 ≤ \u2264 | |
≥ \u2265 ⊂ \u2282 ⊃ \u2283 ⊄ \u2284 ⊆ \u2286 | |
⊇ \u2287 ⊕ \u2295 ⊗ \u2297 ⊥ \u22A5 | |
⋅ \u22C5 ⌈ \u2308 ⌉ \u2309 ⌊ \u230A | |
⌋ \u230B ⟨ \u2329 ⟩ \u232A ◊ \u25CA | |
♠ \u2660 ♣ \u2663 ♥ \u2665 ♦ \u2666 | |
" \x22 & \x26 < \x3C > \x3E O&Elig; \u152 œ \u153 | |
Š \u160 š \u161 Ÿ \u178 ˆ \u2C6 | |
˜ \u2DC   \u2002   \u2003   \u2009 | |
‌ \u200C ‍ \u200D ‎ \u200E ‏ \u200F – \u2013 | |
— \u2014 ‘ \u2018 ’ \u2019 ‚ \u201A | |
“ \u201C ” \u201D „ \u201E † \u2020 | |
‡ \u2021 ‰ \u2030 ‹ \u2039 › \u203A | |
€ \u20AC ' \u0027 ‎ "" ‏ "" ‬ "" ‭ "" | |
‮ "" — \u2014 | |
} | |
# enable transcoding html elements? | |
if {$::incith::google::dirty_decode > 0} { | |
if {![string equal $incithcharset [encoding system]]} { set text [encoding convertfrom $incithcharset $text] } | |
set text [string map [list "\]" "\\\]" "\[" "\\\[" "\$" "\\\$" "\\" "\\\\"] [string map $escapes $text]] | |
regsub -all -- {&#([[:digit:]]{1,5});} $text {[format %c [string trimleft "\1" "0"]]} text | |
regsub -all -- {&#x([[:xdigit:]]{1,4});} $text {[format %c [scan "\1" %x]]} text | |
regsub -all -- {\\x([[:xdigit:]]{1,2})} $text {[format %c [scan "\1" %x]]} text | |
set text [subst "$text"] | |
if {![string equal $incithcharset [encoding system]]} { set text [encoding convertto $incithcharset $text] } | |
} | |
} | |
# correct possible bleedover of bold or underline | |
set fix "" ; | |
if {[expr {[regexp -all {\002} $text] & 1 }]} { | |
append fix "\002" | |
} | |
if {[expr {[regexp -all {\037} $text] & 1 }]} { | |
append fix "\037" | |
} | |
if {[string length $fix]} { set text "$text$fix" } | |
return $text | |
} | |
# URL Decode | |
# Decodes all of the %00 strings in a url and returns it | |
# | |
proc urldecode {text} { | |
set url "" | |
# tcl filter required because we are using SUBST command below | |
# this will escape any sequence which could potentially trigger | |
# the interpreter.. | |
regsub -all -- \\\\ $text \\\\\\\\ text | |
regsub -all -- \\\[ $text \\\\\[ text | |
regsub -all -- \\\] $text \\\\\] text | |
regsub -all -- \\\} $text \\\\\} text | |
regsub -all -- \\\{ $text \\\\\{ text | |
regsub -all -- \\\" $text \\\\\" text | |
regsub -all -- \\\$ $text \\\\\$ text | |
# end tcl filter | |
regsub -all {\%([0-9a-fA-F][0-9a-fA-F])} $text {[format %c 0x\1]} text | |
set text [subst $text] | |
foreach byte [split $text ""] { | |
scan $byte %c i | |
if { $i < 33 || $i > 127 } { | |
append url [format %%%02X $i] | |
} else { | |
append url $byte | |
} | |
} | |
return $url | |
} | |
# Un Gzip | |
# Unzips those silly g-zipped wikis | |
# | |
proc ungzip {html metas} { | |
if {$::incith::google::use_gzip > 0} { | |
if {![info exists ::incith_nozlib]} { | |
foreach {name value} $metas { | |
if {[regexp -nocase ^Content-Encoding$ $name]} { | |
if {[string equal -nocase "gzip" $value]} { | |
if {![info exists ::incith_trf]} { | |
if {[catch {set html [zlib inflate [string range $html 10 [expr { [string length $html] - 8 } ]]]} error]} { return $html } | |
} else { | |
set html [zip -mode decompress -nowrap 1 [string range $html 10 [expr { [string length $html] - 8 } ]]] | |
} | |
break | |
} | |
} | |
} | |
} | |
} | |
return $html | |
} | |
# URL Encode | |
# Encodes anything not a-zA-Z0-9 into %00 strings... | |
# | |
proc urlencode {text type {enc ""}} { | |
if {[string length $enc]} { | |
set text [encoding convertto $enc $text] | |
} | |
set url "" | |
foreach byte [split $text ""] { | |
scan $byte %c i | |
if {$i < 65 || $i > 122} { | |
append url [format %%%02X $i] | |
} else { | |
append url $byte | |
} | |
} | |
if {$type == 1} { | |
return [string map {%25 . %3A : %2D - %2F / %2E . %30 0 %31 1 %32 2 %33 3 %34 4 %35 5 %36 6 %37 7 %38 8 %39 9 %80 _ % .} $url] | |
} else { | |
return [string map {%2D - %30 0 %31 1 %32 2 %33 3 %34 4 %35 5 %36 6 %37 7 %38 8 %39 9 \[ %5B \\ %5C \] %5D \^ %5E \_ %5F \` %60} $url] | |
} | |
} | |
} | |
} | |
# EOF | |
return "This long and contrived google lookup/search script is loaded" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment