View difference between Paste ID: nReKnSkT and
SHOW: | | - or go back to the newest paste.
1-
1+
2
# <speechles> Scripts are like children. They grow up to take
3
# on lives of their own, along with all their parents time.
4
5
# <speechles> Bots are so obedient, like a wife you never need to slap.
6
 
7
#---------------------------------------------------------------#
8
# UNOFFICIAL incith:google                              v2.0.0c #
9
#                                                               #
10
# performs various methods of Google searches                   #
11
# tested on:                                                    #
12
#   eggdrop v1.6.17 GNU/LINUX with Tcl 8.4                      #
13
#   windrop v1.6.17 CYGWIN_NT with Tcl 8.4 (http.tcl v2.5)      #
14
#    - http.tcl included - Linux/BSD users should NOT need this #
15
#                                                               #
16
# UNOFFICIAL NEWS:............................................. #
17
#                                                               #
18
#  As of 1.9, I (speechless) have rewritten and added several   #
19
#    pieces of this script, fixing various regexp's, adding     #
20
#    more search sites to it, added a gamefaqs upcoming list    #
21
#    for gamers and much much more.                             #
22
#  See the Egghelp forum for info or help you may need:         #
23
#      http://forum.egghelp.org/viewtopic.php?t=13586           #
24
#                                                               #
25
# OFFICIAL NEWS:............................................... #
26
#                                                               #
27
#  As of v1.6, I (madwoota) have taken over the development of  #
28
#    incith:google. If you have any feature req's, bugs, ideas, #
29
#    etc, please dont hesitate to send them to me.              #
30
#  My contact details have replaced incith's, but if you wish   #
31
#    to approach him directly about anything, I can point you   #
32
#    in the right direction.                                    #
33
#  See the Egghelp forum for inciths handover and all the latest#
34
#    info on this script:                                       #
35
#    http://forum.egghelp.org/viewtopic.php?t=10175             #
36
#                                                               #
37
# BASIC USAGE GUIDE:........................................... #
38
#                                                               #
39
#   .chanset #channel +google                                   #
40
#   !google [.google.country.code] [define:|spell:]             #
41
#      <search terms> <1+1> <1 cm in ft> <patent ##>            #
42
#      <weather city|zip> <??? airport>                         #
43
#   !images [.google.country.code] <search terms>               #
44
#   !groups [.google.country.code] <search terms>               #
45
#   !news [.google.country.code] <search terms>                 #
46
#   !local [.google.country.code] <what> near <where>           #
47
#   !book [.google.country.code] <search terms>                 #
48
#   !video [.google.country.code] <search terms>                #
49
#   !fight <word(s) one> vs <word(s) two>                       #
50
#   !youtube [.google.country.code] <search terms>              #
51
#   !trans region@region <text>                                 #
52
#   !gamespot <search terms>                                    #
53
#   !gamefaqs <system> in <region>                              #
54
#   !blog [.google.country.code] <search terms>                 #
55
#   !ebay [.ebay.country.code] <search terms>                   #
56
#   !ebayfight <word(s) one> vs <word(s) two>                   #
57
#   !wikipedia [.2-digit-country-code] <search terms>[#subtag]  #
58
#   !wikimedia [.www.wikisite.org[/wiki]] <search terms>[#subtag]
59
#   !locate <ip or hostmask>                                    #
60
#   !review <gamename> [@ <system>]                             #
61
#   !torrent <search terms>                                     #
62
#   !best <system>                                              #
63
#   !worst <system>                                             #
64
#   !dailymotion <search terms>                                 #
65
#   !ign <search terms>                                         #
66
#   !myspace <search terms>                                     #
67
#   !trends [.google.country.code] <YYYY-MM-DD>                 #
68
#                                                               #
69
# CHANGE LOG:.................................................. #
70
#                                                               #
71
#   1.0: first public release                                   #
72
#   1.1: improved bolding of search terms, compatible with      #
73
#          chopped descriptions                                 #
74
#        supports 'define: <word>' lookups                      #
75
#        supports calculator. !google (4+3) * 2 - 1             #
76
#          - converts, too. !google 1 lb in ounces              #
77
#        image lookups coded, !images <search>                  #
78
#        'spell: word1 word2' function added                    #
79
#          - don't rely on this, it's not a dictionary, just    #
80
#            corrects common typos.                             #
81
#        flood protection added                                 #
82
#   1.2: will wrap long lines (yay, a worthy solution!)         #
83
#        allowed setting of the seperator instead of a ' | ' by #
84
#          default. If you set this to "\n" then you will get   #
85
#          each result on a seperate line instead of one line   #
86
#        will display 'did you mean' if no results              #
87
#        [PDF] links will be parsed/included now                #
88
#        fixed a bug when no data was returned from google such #
89
#          is the case when you search for """"""""""""""""""   #
90
#   1.3: can return results in multiple languages now           #
91
#        fixed quotes being displayed around links              #
92
#        private messages support added (for /msg !google)      #
93
#        video.google.com seems impossible, Google Video Viewer #
94
#          is required to view videos, etc                      #
95
#   1.4: bit of a different output, easier to click links now   #
96
#        local lookups coded, use !local <what> near <where>    #
97
#        seems google does currency the same way my exchange    #
98
#          script does (!g 1 usd in cad)                        #
99
#        "patent ##" will return the patent link if it exists   #
100
#        bugfix in private messages                             #
101
#        sorry to all whom grabbed a borked copy on egghelp :-( #
102
#   1.5: fix for !local returning html on 'Unverified listing's #
103
#        "madwoota" has supplied some nice code updates for us! #
104
#          - "answer" matches, eg: !g population of japan       #
105
#            - !g <upc code>                                    #
106
#          - google groups (!gg), google news (!gn)             #
107
#          - movie: review lookups                              #
108
#          - area code lookups (!g 780)                         #
109
#          - print.google lookups (!gp !print)                  #
110
#        reworked binds to fix horrible bug allowing !g !gi !gp #
111
#        case insensitive binds (!gi, !GI, !gI, !Gi, etc)       #
112
#    .1: fix for double triggers/bad binds                      #
113
#    .2: fix involving "can't read link" error                  #
114
#-madwoota:                                                     #
115
#   1.6: fixed google search returning no results               #
116
#        fixed descriptions getting cut short on 'answers'      #
117
#        fixed bug where some urls were returned invalid        #
118
#        fixed google local searches returning no results       #
119
#        fixed google print searches returning invalid links    #
120
#        changed 'did you means' to get returned first as well  #
121
#        added google weather: !g weather <city|zip>            #
122
#          - note: US weather only (blame google!)              #
123
#        added travel info, eg: !g sfo airport | !g united 134  #
124
#        added config option to send output via /notice         #
125
#        added initial attempt at parsing google video (!gv)    #
126
#   1.7: added option to force all replies as private (req)     #
127
#        fixed google groups returning no results               #
128
#        fixed define: errors on no results                     #
129
#        fixed google print errors on no results/typos          #
130
#        fixed movie review errors on no results/typos          #
131
#        fixed some characters not usable as command_chars on   #
132
#          one of regular eggdrop or windrop+cygwin             #
133
#        fixed occasional weird response for travel info        #
134
#        updated requirements to http package 2.4               #
135
#        loads of other internal changes                        #
136
#    .1: fixed search parameters not being parsed correctly     #
137
#          - resulted in some bogus "no results" replies.       #
138
#    .2: fixed main google search returning rubbish results     #
139
#          - google changed their source again                  #
140
#        changed all methods of parsing the search results to   #
141
#          *hopefully* cope better with any source changes      #
142
#        changed output queue to stop the bot from flooding     #
143
#    .3: fixed some urls being returned with spaces in them     #
144
#          - makes them unusable in most irc clients            #
145
#        fixed google groups occasionally returning junk due to #
146
#          changes in 1.7.2 (will revisit this later)           #
147
#   1.8: added option to turn on "safe" searches                #
148
#        added channel user level filtering option (+v/+o only) #
149
#        added google fight! !gf or !fight <blah> vs <blah>     #
150
#         - inspired by www.googlefight.com                     #
151
#        added ability to do any custom mode to descs & links   #
152
#         - i'll just apologise now for this one :)             #
153
#        removed variable underline_links (superseded by above) #
154
#        removed use of 'tcl_endOfWord' to stop windrop breaking#
155
#        fixed excess %20's appearing in some results           #
156
#        fixed "translate this" only returns ? (i think)        #
157
#        stopped local from returning ad spam on first result   #
158
#-speechless                                                    #
159
#   1.9: updated various regexp's and regsub's in almost all    #
160
#          procs to fix non functioning html parsing.           #
161
#        added !localuk option to display United Kingdom.       #
162
#        added !youtube for searching videos on youtube.        #
163
#        added !atomfilms for searching videos on atomfilms.    #
164
#        added !trans for searching videos on trans.            #
165
#        added !gamespot for searching games, etc.              #
166
#        added !gamefaqs, it is able to parse multiple systems  #
167
#          and regions, still a work in progress, all bugs have #
168
#          been squashed.                                       #
169
#        added !test proc to help debug and dump html for       #
170
#          future parsing projects.                             #
171
#    .1: added !blog for searching blogsearch.google            #
172
#        added !ebay for searching ebay auctions.               #
173
#        added !ebayfight for amusement, same as googlefight.   #
174
#        fixed various miscellaneous minor annoyances in parts. #
175
#        finally fixed !book (aka print) to work with           #
176
#          books.google                                         #
177
#        added !ign for searching movies, games, etc..          #
178
#    .2: added support for total_search to show total results   #
179
#          or not. :)                                           #
180
#        added support for link_only (requested).               #
181
#        added back complete support for desc/link modes        #
182
#          they will now affect results properly.               #
183
#          (note: doesn't affect gamefaqs or locate)            #
184
#        added !locate for dns location information.            #
185
#    .3: added !wiki for searching wikipedia for things, very   #
186
#          much a work-in-progress, don't expect it to be       #
187
#          perfect.. it just reads very top heading <h*> so     #
188
#          sometimes it returns next to nothing.. like I said   #
189
#          it's WIP so don't bitch, thx.                        #    
190
#        added !review for searching gamefaqs and pulling a     #
191
#          games review, ranking, score, etc.. works similarly  #
192
#          to the way !wiki does, has same problem, so this     #
193
#          is also WIP.. thx                                    #
194
#    .4: fixed a few regexp parsers to correct broken (no       #
195
#          results returned) messages in some procs.            #
196
#        changed google populations to return only 1st desc     #
197
#          this fixes a small bug where excess html was shown.  #
198
#          ie. !g population japan || !g population of japan    #
199
#        fixed google define: links with quick regsub hacks.    #
200
#        problem with recent ign changing to javascripted html  #
201
#            so removed their advertising.. too bad for them.   #
202
#        fixed review and wikipedia to almost perfect.          #
203
#           note: review does not use forms submittal, instead  #
204
#           I chose to a single query and field matching on the #
205
#           first page returned. I may later use forms submital #
206
#           at some later time.                                 #
207
#        added two gamerankings triggers (!top/!popular)        #
208
#        added a mininova torrent search parser.                #
209
#        fixed parser for !blog by removing quotes. "g" -> g    #
210
#        beefed up the wikipedia parser so can intelligently    #
211
#            move to html#subtags to display info.              #
212
#        removed atomfilms trigger because no one was using.    #
213
#        added dailymotion trigger for searching tv episodes    #
214
#            since youtube/google seem to remove those too      #
215
#            often.                                             #
216
#        wikipedia now has ability to properly handle internal  #
217
#            redirects intelligently as well.                   #
218
#        youtube needed its regexp/regsub parsers tweaked a bit #
219
#            to handle new html design.                         #
220
#        google changed format and updated search regexp/sub    #
221
#            accordingly.                                       #
222
#        fixed !local lookups, removed !localuk as it was       #
223
#            redundant since !local covers UK region now.       #
224
#        corrected !book to actually produce an output again    #
225
#            i left broken intentionally earlier because of     #
226
#            lack of interest, but a guy named Zircon sparked   #
227
#            my interest again. enjoy.                          #
228
#        gamespot injects paid crap into their html design now  #
229
#            so found a way to scrape around it.. muahah        #
230
#        requested by a few people that somehow wikipedia is    #
231
#            multi-lingual so a fast hack is provided at the    #
232
#            moment which lacks input checking.. will fix later #
233
#        requested by a british friend was the ability as well  #
234
#            for ebay to work from different countries server.  #
235
#            this also lacks input checking.. will fix later.   #
236
#        added error catching for erroneous url's in both       #
237
#            wikipedia and ebay, this way bad user countries    #
238
#            will be reported with socket errors. thx rosc2112  #
239
#    .5: major modification of script to allow for dynamic      #
240
#            language selection of _all_ google sites.          #
241
#            (search,image,news,local,video,book,blog)          #
242
#            google group is still broken, will fix later :P    #
243
#        added !trans for google translate. enjoy.              #
244
#        added stock quotes (supplied by madwoota)              #
245
#        fixed translation to convertto foreign charsets.       #
246
#            fixes display of russian and arabic languages.     #
247
#        corrected google area code map results.                #
248
#        added google zip code map results.                     #
249
#        corrected google movie review lookups, now works!      #
250
#        search totals was incorrect on some country google     #
251
#            lookups. it was using elapsed search time as the   #
252
#            total results, so now a fallback (else) corrects   #
253
#            it by replace total results with 'google' in       #
254
#            those instances.                                   #
255
#        youtube undergoing major html changing to keep bots    #
256
#            from indexing, so changed some parsers to work.    #
257
#        added back !ign trigger for scraping ign's search      #
258
#            page for results.                                  #
259
#        google answers needed fixing to show correct results.  #
260
#        added !myspace trigger for searching their video       #
261
#            content.                                           #
262
#        corrected zipcode/areacode/airport.                    #
263
#        corrected all google query possibilities by spending a #
264
#            few hours fine tuning everything. Most languages   #
265
#            should work exactly as planned. Some languages     #
266
#            "may" display incorrectly, but this is by design   #
267
#            rather than an error, as the script presently uses #
268
#            unicode for everything except google translations. #
269
#        major work done to !local fixing it for every possible #
270
#            query result in almost every language, try it out  #
271
#            feeding it nonsense and try to find a flaw.        #
272
#        small bug concerning !google patent ##### .. wasn't    #
273
#            being caught as results, now all is well again.    #
274
#        corrected ebay parser with small change to eliminate   #
275
#            excess html in 'buy-it-now' parsing.               #
276
#        UPC codes work again.. yay.. how many use this? 1 guy? #
277
#        Ebay, Wikipedia and Google needed minor fixes to       #
278
#            correct remaining bits that were left untranslated #
279
#            now all output will be in language chosen.         #
280
#        Gamespot changed html design of their page layots for  #
281
#            reviews, so quick fix to !review proc to handle    #
282
#            their new design :)                                #
283
#        Corrected 'results' message displayed with totals to   #
284
#            also be displayed in language searched in, makes   #
285
#            the output look much more professional. r0x hard.  #
286
#            All Google triggers are now 100% dialect perfect.  #
287
#        Fixed small problem with wikipedia's 'no result'       #
288
#            message being longer than neccessary.              #
289
#        Added multi-language ability to youtube because it     #
290
#            now supports it, new default variable for setting  #
291
#            language default for it as well. enjoy.            #
292
#        Changed myspace parser query making it less prone to   #
293
#            breaking.                                          #
294
#        Added new trigger !trends to get top search results    #
295
#            for any date (this is limited by google cache,     #
296
#            not by the script) and also can be given country   #
297
#            switches. This is new, at present I cannot go      #
298
#            back beyond May 2007-05-15 ..                      #
299
#        Added dual results to !ebay trigger for price/bids     #
300
#            to account for the fact buy-it-now allows bids as  #
301
#            well...                                            #
302
#        Fixed the tiny bug in google answers lookup which      #
303
#            allowed for cruft to be given as 2nd result.       #
304
#        Fixed the tiny bug in wikipedia articles that left     #
305
#            parts of tables in the results.                    #
306
#        Added forced subtagging ability to wikipedia results   #
307
#            using their standard sub-tag #this so you can now  #
308
#            force certain sections to being your results and   #
309
#            it must only begin with the term doesn't need to   #
310
#            be entire term to force a sub-tag redirect.        #
311
#    .6: Added !mediawiki trigger following same abilities as   #
312
#            the wikipedia trigger.  This is beta at the moment #
313
#            and the reason this script has a revision change.  #
314
#        Corrected small issue regarding parsing original search#
315
#            results which makes this now compatabile with      #
316
#            every mediawiki page.                              #
317
#        Fixed problem parsers; Groups, News, Book              #
318
#        Problems with some procs sorted, Gamefaqs modified to  #
319
#            work with new php site design.                     #
320
#        Fixed issues with stubborn always changing google      #
321
#            based searches.  Now hopefully all triggers work   #
322
#            again.                                             #
323
#        Added prepend ability (Requested) so now each of your  #
324
#            lines, can be prepended with whatever you desire.  #
325
#        Added 'time in' feature to google search, allows you   #
326
#            to find out the time in any region, works like     #
327
#            population and date.                               #
328
#        Added wiki_line option to expand results.              #
329
#    .7: Added input/output encoding conversion to better       #
330
#            realize the multi-language side of this script.    #
331
#        Corrected mistake in input/output encoding handlers.   #
332
#        Added a triple lookup for youtube to include all       #
333
#            possible results and not miss any.                 #
334
#        Corrected issue with wikipedia/wikimedia incorrectly   #
335
#            removing some elements as page markups.            #
336
#        Added ability for bold to be seen in wikipedia/wikimedia
337
#            results again, removed stripcodes.                 #
338
#   .7a: Expanded Wikimedia and Wikipedia for allowing multi-   #
339
#            language as well as regional dialects. This also   #
340
#            allows for expanded custom encoding coverage.      #
341
#   .7b: Corrected google to return useful results once again.  #
342
#            broken was define, no_search, did_u_mean, and      #
343
#            weather.                                           #
344
#        Ebay now expanded upon to allow 'store' results to     #
345
#            appear as well as functional 'did you mean'        #
346
#            messaging.                                         #
347
#   .7c: Added remaining onebox results to google results.      #
348
#    .8: New features corrected longstanding shortcomings:      #
349
#         * Wikipedia/Wikimedia now fully decode and encode     #
350
#            on the fly and translate subtags seamlessly.       #
351
#         * Main encoding routine now includes a smart URL      #
352
#            encoder for those using language other than        #
353
#            english.                                           #
354
#        Corrected problem with script handling tcl special     #
355
#            characters as part of user input.                  #
356
#   .8a: All did you mean messages now report from page exactly #
357
#            as they appear. All sites that allow this now      #
358
#            handle this ability if no results are found.       #
359
#   .8b: Corrected deficiencies in !translate, it should now    #
360
#            function better regarding encodings and html       #
361
#            markups.  thx perplexa.                            #
362
#        Corrected minor problem regarding wikipedia's recent   #
363
#            template change. Now uses similar style as         #
364
#            wikimedia to prevent issues.                       #
365
#   .8c: Corrected google video as well as added the whois      #
366
#            onebox to regular google searches.                 #
367
#        Corrected way define: links are handled so encodings   #
368
#            are dealt with properly.                           #
369
#   .8d: Corrects issue with myspace and regional IP bases.     #
370
#   .8e: Corrects google video to produce results.              #
371
#   .8f: Added vocabulary aversion.                             #
372
#        Corrected flaw with wikimedia's encoding process,      #
373
#             improved overall functionality.                   #
374
#   .8g: Added domain detection for wikimedia domain's which    #
375
#             aren't using the standard subdomain /wiki.        #
376
#   .8h: Corrected !torrent                                     #
377
#   .8i: Corrected google zipcodes and google video.            #
378
#   .8j: Corrected youtube and google groups.                   #
379
#   .8k: Corrects some urlencoding problems regarding eggdrops  #
380
#             complete inability to distinguish between utf-8   #
381
#             and iso8859-1. Now requires http 2.5 which allows #
382
#             setting the -urlencoding flag.                    #
383
#        Corrects entire script which now uses the -urlencoding #
384
#             flag in some way to hopefully force eggdrop to    #
385
#             understand the differences and force proper       #
386
#             detections.                                       #
387
#         * requirements upped, now requries http 2.5 *         #
388
#   .8l: Corrects google search (calculations, did_you_mean,etc)#
389
#        Corrects google book                                   #
390
#        -- experimental version --                             #
391
#        Adds "automagic" detection to google translations      #
392
#        Possiblity for more automagic detection in the future  #
393
#          support procedures in place to allow this already.   #
394
#   .8m: Adds more "automagic" detection and a more robust      #
395
#          debugging display.                                   #
396
#        Corrected minor display problems.                      #
397
#   .8n: Corrects Googles embolding placement within results,   #
398
#           can now interpret <em> tags as bold.                #
399
#   .8o: Added correct support for a true utf-8 workaround.     #
400
#   .8p: Added proper redirect support.                         #
401
#        Corrected Youtube behavior.                            #
402
#   .8q: Corrected Dailymotion, added multilanguage support to  #
403
#           it and extended it's capabilities.                  #
404
#   .8r: Corrected minor youtube url inconsitancy.              #
405
#   .8s: Corrected result totals to appear again for all google #
406
#           sites, also corrected other google anamolies.       #
407
#        Corrected local as well to work with custom locations. #
408
#        Added mediawiki customized triggers to allow access    #
409
#           to mediawiki sites without so much input required.  #
410
#   .8t: Google template changed, <div class=g -> <li class=g   #
411
#   .8u: Added full support for session cookies as well as      #
412
#           unlimited redirect support. This allows adding      #
413
#           the secondary ebay template for their store server  #
414
#           and allows ebay to function 100% again.             #
415
#   .8v: Added back support for !game and !review and elaborated#
416
#           upon the amount of information displayed.           #
417
#   .8w: Added new abilities to both !locate and !trans now     #
418
#           allows much less input from the user and default    #
419
#           behavior.                                           #
420
#        Also correct other slight anomalies.                   #
421
#   .8x: Corrected ebay finally, yay! also added sorry detection#
422
#           to google so users experiencing this can tell. Also #
423
#           fixed the html cruft in gamespot review replies.    #
424
#   .8y: Corrected youtube, now more compliant with all templates
425
#           returned                                            #
426
#   .8z: Corrected video and group functionality.               #
427
#        Added scholar for parsing scholar.google.*             #
428
#    .9: Corrected video and youtube to work with website       #
429
#           re-designs.                                         #   
430
#        Other minor tweaks here and there.                     #
431
#   .9a: Corrected local, google define and google did-you-mean #
432
#   .9b: Corrected more problems with parsing, might still be   #
433
#           a few. This is just a test version to see if this   #
434
#           does solve them.                                    #
435
#   .9c: Addded a crude work around to allow youtube to remain  #
436
#           in the language chosen, even tho redirecting is     #
437
#           occuring.                                           #
438
#   .9e: Corrected ability to split lines and now keeps bolding #
439
#           and underlining intact perfectly.                   #
440
#        Corrected !news to return results again.               #
441
#        Modified all procs in some way to allow the split line #
442
#           correction noted above, no longer should \017 ever  #
443
#           be used.                                            #
444
#        Corrected !scholar to return accurate results.         #
445
#        Added short_answers config variable for google results.#
446
#   .9e: Corrected !google weather replies.                     #
447
#        Removed !top and !pop, gamerankings removed support.   #
448
#        Added !best and !worst, gamerankings added support.    #
449
#        Added support for color splitting and color themes.    #
450
#   .9f: Corrected split routine for those using \n as seperator#
451
#   .9g: Added custom triggers with phrasing.                   #
452
#   .9h: Corrected bug in custom triggers, now works properly.  #
453
#        Corrected color theme enforcement (not everything was  #
454
#          following it correctly, now it does)                 #
455
#   .9i: Corrected slight bugs in some procs.                   #
456
#        Corrected !news and !video.                            #
457
#        Combined custom wiki into custom trigger phrases.      #
458
#   .9j: Corrected google weather.                              #
459
#        Corrected remaining bugs with themes.                  #
460
#   .9k: Corrected !local                                       #
461
#   .9l: Corrected !local again.. stop it google :P             #
462
#        Corrected !torrent no-search results message appears   #
463
#          along with it's did-you-mean results.                #
464
#        Corrected issue regarding setting results to zero      #
465
#          and some commands still triggering.                  #
466
#        Corrected small bug with google weather replies when   #
467
#          custom themes are in use.                            #
468
#   .9m: Corrected alot of broken things, fixed a few things.   #
469
#          Basically forgot what these were as this was done    #
470
#          over the course of several weeks and I didn't        #
471
#          document any of it.. DOH!                            #
472
#   .9n: Corrected google weather and cruft html elements within#
473
#          some google no-results-found messages.               #
474
#   .9o: Corrected bug within google video display and fixed    #
475
#          ebay parsing.                                        #
476
#   .9p: Added input/output encoding abilities for google       #
477
#          translations. This appears to corrects accented      # 
478
#          character problem and misdetected encodings.         #
479
#   .9q: Added HD filter switch for youtube videos.             #
480
#        Added proxy support for main fetch_html routine.       #
481
#        Added Gzip support for wikipedia/media.                #
482
#        Corrected Google define mechanism.                     #
483
#   .9r: Added full support for gzipped downloading of webpages #
484
#           this should be sorta faster as well as less to      #
485
#           download doing all this, enjoy.                     #
486
#   .9s: Added ability to enable/disable gzipped support as this#
487
#           breaks functionality (eggdrop's utf-8 bug) for some #
488
#           languages.                                          #
489
#        Corrected youtube and ebay.                            #
490
#   .9t: Corrected google's zipcode and time queries.           #
491
#        Corrected utf-8 output, all queries should now appear  #
492
#            correct and in proper utf-8.. yay!                 #
493
#   .9u: Corrected google results, fight, video, youtube, news  #
494
#            and some other things I forgot about.              #
495
#        Corrected short_answers, created new option skip_self  #
496
#            to deal with google self-injecting results.        #
497
#        Corrected google did_you_mean and no_results messages  #
498
#            once again. Stop changing so often google, jeez..  #
499
#   .9v: Corrected wikipedia/wikimedia #achor lookup method, it # 
500
#            it's now more accurate and much faster.            #
501
#        Corrected minor inconsistancies with some procedures.  #
502
#        Corrected google weather for multilanguage replies.    #
503
#   .9w: Corrected google weather yet again! stop changing things
504
#            so often google, jeez..                            #
505
#        Corrected translate to use new templates. yes, google  #
506
#            was busy updating all their templates :(           #
507
#        Added new feature to custom trigger phrasing:          #
508
#            * ability to query by index as well as entire      #
509
#              sentence..                                       #
510
#   .9x: Corrected google "spell" to always return results or   #
511
#            did-you-mean.                                      #
512
#        Added "special searches" to google searching.          #
513
#        Corrected population/public_data searches to use new   #
514
#            template created for these. Is not given as a google
515
#            "answer" anymore.                                  #
516
#   .9y: Corrected: !news !game !review -- gamespot added       #
517
#            backslash escape protection to it's ajax replies to#
518
#            prevent injection from happening with chars..      #
519
#  .9r1: Corrected too many things to list, google went on a    #
520
#            spree and changed templates on lots of different   #
521
#            things causing lots of functionality to break.     #
522
#            suffice to say it's fixed. Most of it. Good show   #
523
#            google, but it's now your move again. This game of #
524
#            chess is certainly fun..                           #
525
#  .9r2: Corrected Google's oneboxes, specifically time and     #
526
#            maps.                                              #
527
#  .9r3: Corrected !ebay, !dailymotion, !ign, !myspace .        #
528
#            Deprecated functions: !scholar / !google movie:*   #
529
#            !scholar will be removed, and changed to something #
530
#            else google-y.                                     #
531
#            !google movie:* will be re-incorporated later.     #
532
#  2.00a: alot corrected, broken regexps, and more..            #
533
#                                                               #
534
# TODO:........................................................ #
535
#                                                               #
536
#   Fix broken parsers, this is a never-ending battle!          #
537
#   -- This is always #1 priority over anything else --         #
538
#                                                               #
539
#   Correct error detection mechanisms to use exact same as     #
540
#      "webby".                                                 #
541
#                                                               #
542
#   Solve inconsitancies in some countries total results and    #
543
#      inaccurate parsing due to differing html templates.      #
544
#      This includes missing result totals, condense entire     #
545
#      result grabbing to it's own procedure eventually akin    #
546
#      to fetch_html but for parsing total results, easier to   #
547
#      maintain that way then spread out individually amongst   #
548
#      each procedure.                                          #
549
#                                                               #
550
#   Once everything above is done we can start on these:        #
551
#     Clean-up code where obvious hacks were left in, code them #
552
#       correctly, remove debugging code from procs which is    #
553
#       presently commented out.                                #
554
#     Clean-up overly messy code that can be solved by coding   #
555
#       cleaner modules and not reusing so much code.           #
556
#                                                               #
557
#     For this UNOFFICIAL version please direct any and all     #
558
#        Suggestions/Thanks/Bugs to the forum link below:       #
559
#    -->  http://forum.egghelp.org/viewtopic.php?t=13586  <--   #           
560
#                                                               #
561
# LICENSE:..................................................... #
562
#                                                               #
563
#   This code comes with ABSOLUTELY NO WARRANTY.                #
564
#                                                               #
565
#   This program is free software; you can redistribute it      #
566
#   and/or modify it under the terms of the GNU General Public  #
567
#   License as published by the Free Software Foundation;       #
568
#   either version 2 of the License, or (at your option) any    #
569
#   later version.                                              #
570
#                                                               #
571
#   This program is distributed in the hope that it will be     #
572
#   useful, but WITHOUT ANY WARRANTY; without even the implied  #
573
#   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR     #
574
#   PURPOSE.  See the GNU General Public License for more       #
575
#   details. (http://www.gnu.org/copyleft/library.txt)          #
576
#                                                               #
577
# CREDITS:..................................................... #
578
#                                                               #
579
# ..Officially:                                                 #
580
# Copyright (C) 2005, Jordan (Incith)                           #
581
# Currently maintained by madwoota                              #
582
# google@woota.net                                              #
583
#                                                               #
584
# ..Unofficially:                                               #
585
# Copyleft (C) 2006-2010, Speechless                            #
586
# http://ereader.kiczek.com/scripts                             #
587
# v2.0.0c - September 9th, 2o11 - speechles <#roms-isos@efnet>  #
588
#---------------------------------------------------------------#
589
590
# EVERYTHING IN THIS SECTION IS USER CUSTOMIZABLE.
591
# BEST SETTINGS ARE DEFAULT, YOU MAY HAVE OTHER IDEAS OF WHAT IS BEST.
592
#
593
# NOTE: some config options won't list how to enable/disable, but
594
# 0 will typically disable an option (turn it off), otherwise a
595
# value 1 or above will enable it (turn it on).
596
# ------
597
# start of configuration - make your changes in this section
598
# ------
599
namespace eval incith {
600
  namespace eval google {
601
    # set this to the command character you want to use for the binds
602
    # ------
603
    variable command_char "!"
604
605
    # set these to your preferred binds ("one two three etc etc" - space delimited!)
606
    # ------
607
    variable google_binds "g google goog"
608
    variable image_binds "i gi image images"
609
    variable local_binds "l gl local"
610
    variable group_binds "gg group groups"
611
    variable news_binds "n gn news"
612
    variable print_binds "gb book books"
613
    variable video_binds "v gv video"
614
    variable scholar_binds "s sc scholar"
615
    variable fight_binds "f fight googlefight"
616
    variable youtube_binds "y youtube"
617
    variable locate_binds "geo loc locate"
618
    variable gamespot_binds "gs game gamespot"
619
    variable trans_binds "tr trans translate"
620
    variable daily_binds "dm daily dailymotion"
621
    variable gamefaq_binds "gf gamefaq gamefaqs"
622
    variable blog_binds "b blog blogsearch"
623
    variable ebay_binds "e ebay"
624
    variable efight_binds "ef ebayfight"
625
    variable popular_binds "best great bestest"
626
    variable rev_binds "r review"
627
    variable wiki_binds "w wiki wikipedia"
628
    variable wikimedia_binds "wm wikim wikimedia"
629
    variable recent_binds "worst crap"
630
    variable mininova_binds "t torrent mininova"
631
    variable ign_binds "ign igame"
632
    variable myspacevids_binds "m myspace myvids"
633
    variable trends_binds "gtr trends"
634
    variable helpbot_binds "help bot"
635
636
    # to restrict input queries to Ops (+o), Halfops (+h) or Voiced (+v) users on
637
    # any +google channel, use this setting.
638
    # set the variable to one of the following to achieve the desired filtering:
639
    #   at least Op -> 3      (obvious)
640
    #   at least Halfop -> 2  (will also allow ops)
641
    #   at least Voice -> 1   (will also allow halfops and ops)
642
    #   everyone -> 0         (no filtering)
643
    #
644
    # note: this does NOT apply to private messages, use the below setting for them.
645
    # ------
646
    variable chan_user_level 0
647
648
    # if you want to allow users to search via private /msg, enable this
649
    # ------
650
    variable private_messages 1
651
652
    # as per emailed & forum requests, use the next two variables together
653
    # to determine the output type like so:
654
    #  notice_reply 1 & force_private 1 = private notice reply only (this is as requested)
655
    #  notice_reply 0 & force_private 1 = private msg reply only
656
    #  notice_reply 1 & force_private 0 = regular channel OR private NOTICE
657
    #  notice_reply 0 & force_private 0 = regular channel OR private MSG (default)
658
    # set to 1 to enable a /notice reply instead, 0 for normal text
659
    # ------
660
    variable notice_reply 0
661
662
    # set to 1 to force all replies to be private
663
    # ------
664
    variable force_private 0
665
666
    # set this to the language you want results in! use 2 letter form.
667
    # "all" is the default/standard google.com search.
668
    # see http://www.google.com/advanced_search for a list.  You have to use
669
    # the 'Language' dropdown box, perform a search, and find a line in the URL
670
    # that looks like "&lr=lang_en" (for English). "en" is your language code.
671
    # popular Ones: it (italian), da (danish), de (german), es (spanish), fr (french)
672
    # please note, this does not 'translate', it searches Google in a
673
    # language of choice, which means you can still get English results.
674
    # ------
675
    # NOTE: Changing this from "all" will effectively disable some of the
676
    # multi-language features of this script, doing so is not advised.
677
    # ------
678
    variable language "all"
679
680
    # set this to "on" to let google filter "adult content" from any of your search results
681
    # "off" means results will not be filtered at all
682
    # note: this is only applicable to !google, !images and !groups
683
    # ------
684
    variable safe_search "off"
685
686
    # number of search results/image links to return, 'define:' is always 1 as some defs are huge
687
    # ------
688
    variable search_results 3
689
    variable image_results 4
690
    variable local_results 4
691
    variable group_results 3
692
    variable news_results 3
693
    variable print_results 3
694
    variable video_results 4
695
    variable scholar_results 4
696
    variable youtube_results 0
697
    variable locate_results 1
698
    variable gamespot_results 3
699
    variable trans_results 1
700
    variable daily_results 4  
701
    variable gamefaq_results 20
702
    variable blog_results 3
703
    variable ebay_results 3
704
    variable popular_results 10
705
    variable rev_results 1
706
    variable wiki_results 1
707
    variable wikimedia_results 1
708
    variable recent_results 10
709
    variable mininova_results 3
710
    variable ign_results 3
711
    variable myspacevids_results 3
712
    variable trends_results 25
713
    variable helpbot_results 1
714
715
    # This part was requested to be added so now here it is, it has
716
    # various prepends you may wish to have preceed each function.
717
    # To use this, just change what you see below from nothing to
718
    # something...ie, if you want [ GOOGLE ] to prepend google
719
    # search results change the search_prepend to "\[GOOGLE\]". You
720
    # can do the same with all of the following prepends, they will
721
    # start the output for each line. If you don't wish to use this,
722
    # leave them as "". Keep in mind tcl special characters MUST be
723
    # escaped or will cause tcl errors, and/or crash your bot. This
724
    # is your own problem, just be aware. Read about them if possible.
725
    #
726
    # Note 1: Prepends will increase your line length, and won't be
727
    # accommodated for in the max line length setting, so you may
728
    # find you need to lower your max line length setting if your
729
    # prepends are lengthy or contain lots of escape sequences. If
730
    # you don't you  may find the bots replys may get cut short or
731
    # cut completely by the ircd your using.
732
    #
733
    # Note 2: To use color, bold, etc.. simply use the proper escape
734
    # sequence to generate it here, make sure to properly CLOSE your
735
    # sequence (\003 for color, \002 for bold, etc) or you will see
736
    # the effect of the prepend bleed thru into your output as well.
737
    # ------
738
    variable search_prepend ""
739
    variable image_prepend ""
740
    variable local_prepend ""
741
    variable group_prepend ""
742
    variable news_prepend ""
743
    variable print_prepend ""
744
    variable video_prepend ""
745
    variable scholar_prepend ""
746
    variable youtube_prepend ""
747
    variable locate_prepend ""
748
    variable gamespot_prepend ""
749
    variable fight_prepend ""
750
    variable ebayfight_prepend ""
751
    variable trans_prepend ""
752
    variable dailymotion_prepend ""
753
    variable gamefaqs_prepend ""
754
    variable blog_prepend ""
755
    variable ebay_prepend ""
756
    variable popular_prepend ""
757
    variable rev_prepend ""
758
    variable wiki_prepend ""
759
    variable wikimedia_prepend ""
760
    variable recent_prepend ""
761
    variable mininova_prepend ""
762
    variable ign_prepend ""
763
    variable myspacevids_prepend ""
764
    variable trends_prepend ""
765
766
    # set this to 0 to turn google fight off (it is a tad slow after all ...)
767
    # this also disables or enables ebay fights (it's even slower ...)
768
    # ------
769
    variable google_fight 1
770
771
    # ** this is not an optional setting, if a string is too long to send, it won't be sent! **
772
    # it should be set to the max amount of characters that will be received in a public
773
    # message by your IRC server.  If you find you aren't receiving results, try lowering this.
774
    # ------
775
    variable split_length 410
776
777
    # trimmed length of returned descriptions, only for standard searches.
778
    # ------
779
    variable description_length 80
780
781
    # amount of lines you want your wiki* results to span, the more lines the more
782
    # of the wiki article or section you will see, some get cut short if so raise this.
783
    # this affects both wikipedia and wikimedia results.
784
    # ------
785
    variable wiki_lines 2
786
787
    # short answers? when google search encounters an answer this
788
    # option will make only it show, no other results. this also skips
789
    # showing image/news/etc results from other google sites as results.
790
    # ------
791
    variable short_answers 1
792
793
    # skip links to self? google sometimes uses links to it's own
794
    # services within normal google searches. This will skip _any_ google
795
    # links from appearing within google search results. For some
796
    # queries this will omit obvious replies which is normal.
797
    # ------
798
    variable skip_self 0
799
800
    # replace search terms appearing in the description as bolded words?
801
    # -> does not bold entire description, just the matching search words
802
    # -> this is ignored if desc_modes contains the Bold mode below.
803
    # ------
804
    variable bold_descriptions 1
805
806
    # set this to 0 to turn off total results appearing with searches.
807
    # ------
808
    variable total_results 1
809
810
    # set this to 1 to remove descriptions and set only links to show
811
    # ------
812
    variable link_only 0
813
814
    # set this to the default country you would like *.wikipedia to use when
815
    # no country is specified. default is "en". country is 2-letter wiki code.
816
    # http://*.wikipedia.org/ - en, de, it, es, fr, these are examples.
817
    # ------
818
    variable wiki_country "en"
819
820
    # set this to the default website you would like wikimedia to use when
821
    # no website is specified.
822
    # ------
823
    variable wikimedia_site "wiki.gbatemp.net/wiki"
824
825
    # Wikimedia URL detection
826
    # remove double entries from urls? would remove a '/wikisite' from this
827
    # type of url @ http://yoursite.com/wikisite/wikisite/search_term
828
    # if you have issues regarding url capture with wikimedia, enable this.
829
    # /wiki/wiki/ problems are naturally averted, a setting of 0 already
830
    # stops these type.
831
    # --------
832
    variable wiki_domain_detect 1
833
834
    # Customized Trigger Phrasing?
835
    # allow customized triggers to be attached to custom phrasing
836
    # Anything other than 0 will enable and will use the list below.
837
    variable my_custom 1
838
839
    # Custom Trigger Phrasing
840
    # This is used to customize triggers and for
841
    # constructing phrases to pass, format is:
842
    # "custom-trigger:trigger-to-associate-with:phrase-to-pass"
843
    # within the phrase-to-pass, %search% = the users input.. but,
844
    # if this is passed onto another custom trigger it will become
845
    # the enitre phrase which was passed from the trigger before it.
846
    # hopefully people understand how to use these, and remember
847
    # to read the lines below this at least twice before
848
    # constructiong your phrasing...
849
    # DO NOT USE YOUR COMMAND CHAR IN THESE IT IS ASSUMED.
850
    # special tcl characters MUST be escaped for you to acheive greatness.
851
    variable my_customs {
852
      "ch:g:%search% +site:computerhope.com"
853
      "eh:g:%search% +site:egghelp.org"
854
      "mi:g:%search% +site:mircscripts.org"
855
      "rw:wm:.wiki.roms-isos.com %search%"
856
      "gw:wm:.wiki.gbatemp.net/wiki %search%"
857
      "ed:wm:.encyclopediadramatica.ch %search%"
858
      "un:wm:.uncyclopedia.wikia.com %search%"
859
      "wq:wm:.en.wikiquote.org/wiki %search%"
860
      "lw:wm:.lyricwiki.org %search%"
861
      "wk:wm:.en.wiktionary.org/wiki %search%"
862
      "bible:wm:.biblewiki.be/wiki %search%"
863
      "znc:wm:.en.znc.in/wiki %search%"
864
      "gbr:g:.com.br %search%"
865
      "got:g:%search% +ext:torrent"
866
      "rs:g:%search% +inurl:rapidshare"
867
      "rsmp3 r3 rs3:rs:%search% inurl:mp3"
868
      "kiczek:gf:%search% in usa"
869
      "mysite:g:+site:%%1%% +ext:%%2%% %%3-end%%"
870
      "cg:g:+inurl:%%1%%.craigslist +%%2-end%%"
871
      "kt:g:%search% +site:kotaku.com"
872
      "gay:f:%search% +ass +gay vs %search% +vagina -gay"
873
      "yt:g:%search% site:youtube.com"
874
      "ts:g:%search% site:twitter.com"
875
	"ft:wm:.futurama.wikia.com %search%"
876
      "fg:wm:.familyguy.wikia.com %search%"
877
      "ad:wm:.americandad.wikia.com %search%"
878
      "sp:wm:.southpark.wikia.com %search%"
879
      "sw:wm:.starwars.wikia.com %search%"
880
      "na:wm:.naruto.wikia.com %search%"
881
      "in:wm:.inuyasha.wikia.com %search%"
882
      "gr:wm:.gremlins.wikia.com %search%"
883
      "wow:wm:.wowwiki.com %search%"
884
      "smf:wm:.smurfs.wikia.com %search%"
885
      "sm:wm:.sailormoon.wikia.com %search%"
886
      "pk:wm:.pokemon.wikia.com %search%"
887
      "ss:wm:.strawberryshortcake.wikia.com %search%"
888
      "mlp:wm:.mlp.wikia.com %search%"
889
      "lps:wm:.lps.wikia.com %search%"
890
      "ant:wm:.ants.wikia.com %search%"
891
      "gm:wm:.gaming.wikia.com %search%"
892
      "nt:wm:.nothing.wikia.com %search%"
893
      "ff:wm:.finalfantasy.wikia.com %search%"
894
      "ok:wm:.openkinect.org/wiki %search%"
895
      "bl:wm:.borderlands.wikia.com %search%"
896
    }
897
898
    # this controls custom trigger phrasing query control.
899
    # with this you can split the users search into individual
900
    # words, and use these with your custom trigger above.
901
    # suppose the user types your custom trigger
902
    # <user> !rsmp3 tupac mama
903
    # you can reference this in your custom trigger as:
904
    # %search% to get the entire text: tupac mama
905
    # but, suppose you want individual words, tupac and mama
906
    # well now you can reference these too as %%1%% and %%2%%.
907
    # you can also use ranges %%1-4%% %%1-end%%. Unlike eggdrop
908
    # 1 is the starting index of the users input, not 0.
909
    # this works in combination with %search%, but for indexes
910
    # you _MUST_ reference within %%'s (double percents)..
911
    # hopefully you understand how this functions.. ;)
912
    # any setting 1 or higher enables, 0 or lower disables
913
    # ------
914
    # NOTE: Leaving this enabled is advised if you use any double
915
    # percent variables (%%1%% %%etc%%) in your my_customs list above.
916
    # ------
917
    variable custom_words 1
918
919
    # set this to the proxy you wish the main html fetching procedure to
920
    # use. set both proxy_host and proxy_port. if you don't wish to use
921
    # a proxy. set proxy_host ""
922
    # ------
923
    variable proxy_host ""
924
    variable proxy_port ""
925
926
    # set this to the default country you would like ebay.* to use when no
927
    # country is specified. default is "com". country is ebay extension
928
    # http://ebay.*/ - co.uk, de, es, com, com.au, these are examples.
929
    # ------
930
    variable ebay_country "com" 
931
932
    # set this to the default country you would like *.google.* sites to use when
933
    # no country is specified. default is "com". country is google extension.
934
    # http://google.*/ - co.uk, de, es, com, com.au, these are examples.
935
    # ------
936
    variable google_country "com" 
937
938
    # set this to the default country you would like dailymotion to use when
939
    # no country is specified. default is "en" for international.
940
    # http://dailymotion.com/*/ - en, us, es, fr, nl, pt, da, el, it, pl, ro, sv, tr, ja, ko, zh, these are examples.
941
    # ------
942
    variable daily_country "en" 
943
944
    # set this to the default country you would like *.youtube to use when
945
    # no country is specified. default is "com". country is youtube code.
946
    # http://*.youtube.com/ - com, us, ie, fr, it, nl, br, gb, jp, de, es, pl, these are examples.
947
    # ------
948
    variable youtube_country "com" 
949
950
    # enable this to allow youtube links to lead to higher definition videos
951
    # rather than their stream optimized lower quality setting.
952
    # to disable use 0, anything else enables.
953
    # ------
954
    variable youtube_highquality 1
955
956
    # set this to the switch you want to use for youtube to filter content
957
    # and display only high-definition videos.
958
    # ------
959
    variable youtube_highdef "@hd"
960
961
    # set your default translation language here, this is what will be assumed
962
    # if the user omits the 'translate to' portion of their input.
963
    # en, es, it, nl, de, etc.. these are merely some examples, there are more available.
964
    # ------
965
    variable trans "en"
966
967
    # Google translation input/output encodings
968
    # set these below to either:
969
    # 0 for automatic encoding
970
    # 1 for utf-8
971
    # You may use switches to inverse this behavior on-the-fly. Set them
972
    # below as well.
973
    # ------
974
    variable trans_input 1
975
    variable trans_output 0
976
    variable trans_input_t "--swapi"
977
    variable trans_output_t "--swapo"
978
979
    # Channel filter
980
    # this is for users who already have a google script running, but would
981
    # like to use the other functions of this script. You can filter out google
982
    # requests in any of the channels listed below.
983
    # default is "". To add them use: "#chan1 #CHAN2 #cHaN3 #EtC", case is irrelevant.
984
    # ------
985
    variable filtered ""
986
    
987
    # COLOR THEME - THESE CAN BE SHARED WITH OTHERS ON EGGHELP! :P
988
    # use these settings below to set your preferred color theme.
989
    # the following modes apply and you can use any combination of them: (NO SPACES!)
990
    #
991
    #  Bold = \002
992
    #  Underline = \037
993
    #  Reverse = \026
994
    #  Colours:                 #RGB/Html code:
995
    #   White = \00300          #FFFFFF
996
    #   Black = \00301          #000000
997
    #   Blue = \00302           #00007F
998
    #   Green = \00303          #008F00
999
    #   Light Red = \00304      #FF0000
1000
    #   Brown = \00305          #7F0000
1001
    #   Purple = \00306         #9F009F
1002
    #   Orange = \00307         #FF7F00
1003
    #   Yellow = \00308         #F0FF00
1004
    #   Light Green = \00309    #00F700
1005
    #   Cyan = \00310           #008F8F
1006
    #   Light Cyan = \00311     #00F7FF
1007
    #   Light Blue = \00312     #0000FF
1008
    #   Pink = \00313           #FF00FF
1009
    #   Grey = \00314           #7F7F7F
1010
    #   Light Grey = \00315     #CFCFCF
1011
    #
1012
    # this example will do Bold, Underline and Light Blue: "\002\037\00312"
1013
    # note: this will affect *ALL* descs, links, totals and errors. also
1014
    # don't forget to use the \ too ! note: abusing this will heavily increase
1015
    # the number of characters per line, so your output lines will increase accordingly.
1016
    #
1017
    # COLOR CODES MUST CONSIST OF 2 DIGITS, IF YOU WISH TO USE 0-9 PREFIX
1018
    # IT WITH 0 ACCORDINGLY. IE, \00304 for red...
1019
    # IF YOU WISH TO USE BACKGROUNDS, THIS IS ALLOWED; IE, \00304,02...
1020
    # TO DEMODE A COLOR YOU MUST USE \00399 RATHER THAN SIMPLY \003
1021
    #
1022
    # use *_modes to enable each color, bold, underline.
1023
    # use *_demodes to undo this back to plain text.
1024
    # if you do not use the proper modes/demodes here your color theme will look
1025
    # horrible... 
1026
    # ------
1027
    # description mode/demode
1028
    variable desc_modes ""
1029
    variable desc_demodes ""
1030
    # link mode/demode
1031
    variable link_modes ""
1032
    variable link_demodes ""
1033
    # totals mode/demode
1034
    variable total_modes ""
1035
    variable total_demodes ""
1036
    # error mode/demode
1037
    variable error_modes ""
1038
    variable error_demodes ""
1039
1040
    # break, seperator and split_char need more than modes
1041
    # you also enter the appropriate character you wish used.
1042
    variable break " @ "
1043
    variable seperator " | "
1044
    # if using "\n" within the seperator above, you may want to change
1045
    # the below setting to possibly to ", " or "; "
1046
    variable split_char " | "
1047
1048
    # number of minute(s) to ignore flooders, 0 to disable flood protection
1049
    # ------
1050
    variable ignore 1
1051
1052
    # how many requests in how many seconds is considered flooding?
1053
    # by default, this allows 3 queries in 10 seconds, the 4th being ignored
1054
    # and ignoring the flooder for 'variable ignore' minutes
1055
    # ------
1056
    variable flood 4:10
1057
1058
    # would you like to use vocabulary aversion?
1059
    # this will replace swear words with more appropriate words
1060
    # and the query returned will be aversion free.
1061
    # 0 disables, anything else enables
1062
    #----------
1063
    variable aversion_vocabulary 0
1064
    
1065
    # set your aversion vocabulary below if desired:
1066
    # remember to enable, keep the setting above at 1.
1067
    #----------
1068
    variable aversion {
1069
      cunt:cock
1070
      cock:cunt
1071
      anal:internet
1072
      "hell:a hot place"
1073
      sex:troll
1074
      "fred:wasn't he a flintstone?"
1075
      *fuck*:nice
1076
      bitches:women
1077
      bitch:woman
1078
      "analsex:true love"
1079
      "supergear:licorice and pancakes"
1080
	"tecra:I LIKE LARGE POSTERIORS AND I CANNOT PREVARICATE!"
1081
	{word:"fuck you"}
1082
    }
1083
1084
#---> NOTE:
1085
#---> IF YOUR PRIMARY LANGUAGE ISN'T ENGLISH YOU MUST CHANGE THIS SECTION BELOW POSSIBLY
1086
    # this is the help list generated by the bot to help users become familiar with the script.
1087
    # you can change these here to affect the language used when help is asked for.
1088
    # there MUST be 28 entries in this list, the first must be the word for ALL.
1089
    # this list MUST be kept entirely lowercase.
1090
    # ------
1091
    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"
1092
1093
    # english words within the help phrases, spacing must be kept as it is below.
1094
    # ------
1095
    variable helpmsg1 "Help is only available for the following:"
1096
    variable helpmsg2 "is disabled."
1097
    variable helpmsg3 "with "
1098
    variable helpmsg4 " results."
1099
1100
    # the help messages given. 
1101
    # ------
1102
    variable help1 "\[.google.country.code\] \[define:|spell:\] <search terms> <1+1> <1 cm in ft> <patent ##> <weather city|zip> <??? airport>" ;#google
1103
    variable help2 "\[.google.country.code\] <search terms>" ;#images
1104
    variable help3 "\[.google.country.code\] <search terms>" ;#groups
1105
    variable help4 "\[.google.country.code\] <search terms>" ;#news
1106
    variable help5 "\[.google.country.code\] <what> near <where>" ;#local
1107
    variable help6 "\[.google.country.code\] <search terms>" ;#book
1108
    variable help7 "\[.google.country.code\] <search terms>" ;#video
1109
    variable help8 "<word(s) one> vs <word(s) two>" ;#fight
1110
    variable help9 "\[.youtube.country.code\] <search terms>" ;#youtube
1111
    variable help10 "region@region <text>" ;#translate
1112
    variable help11 "<search terms>" ;#gamespot
1113
    variable help12 "<system> in <region>" ;#gamefaqs
1114
    variable help13 "\[.google.country.code\] <search terms>" ;#blog
1115
    variable help14 "\[.ebay.country.code\] <search terms>" ;#ebay
1116
    variable help15 "<word(s) one> vs <word(s) two>" ;#ebayfight
1117
    variable help16 "\[.wiki-country-code\] <search terms>\[#subtag\]" ;#wikipedia
1118
    variable help17 "\[.www.wikisite.org\[/wiki\]\] <search terms>\[#subtag\]" ;#wikimedia
1119
    variable help18 "<ip or hostmask>" ;#locate
1120
    variable help19 "<gamename> \[@ <system>\]" ;#review
1121
    variable help20 "<search terms>" ;#torrent
1122
    variable help21 "<system>" ;#top
1123
    variable help22 "<system>" ;#popular
1124
    variable help23 "<search terms>" ;#dailymotion
1125
    variable help24 "<search terms>" ;#ign
1126
    variable help25 "<search terms>" ;#myspace
1127
    variable help26 "\[.google.country.code\] <YYYY-MM-DD>" ;#trends
1128
    variable help27 "\[.google.country.code\] <search terms>" ;#scholar
1129
#---> END OF NOTE:
1130
1131
    # enable encoding conversion, set this to 1 to enable.
1132
    # with this enabled it will follow the format of encoding conversions listed
1133
    # below. these will affect both input and output and will follow country switch.
1134
    # ------
1135
    variable encoding_conversion_input 0
1136
    variable encoding_conversion_output 1
1137
1138
    # enable dirty decoding? This attempts to use the regular "dirty" method
1139
    # of rendering html elements which works well with iso8859-1 and other
1140
    # latin variants. This does not work well at all with russian, japanese,
1141
    # and any other non-latin variants. So keep this at 0 if you want a truly
1142
    # multi-language bot, but keep in mind you may see unrendered &x12345; html
1143
    # elements. This is because I don't know of a method to transcode these
1144
    # to proper utf-8 characters yet.. :P
1145
    # ------
1146
    # NOTE: If you bot is properly utf-8 patched, setting this to 1 is recommened.
1147
    # ------
1148
    variable dirty_decode 1
1149
1150
    # enable gzip compression for bandwidth savings? Keep in mind
1151
    # this semi-breaks some of the present utf-8 work-arounds and
1152
    # eggdrop may mangle encodings when gzip compression that it 
1153
    # doesn't when uncompressed html it used (default). A setting
1154
    # of 0 defaults to uncompressed html, a 1 or higher gzip.
1155
    # ------
1156
    # NOTE: If you do not have Trf or zlib packages setting this
1157
    # to 0 is recommened. Leaving it at 1 is fine as well, as the
1158
    # script will attempt to find these commands or packages every
1159
    # rehash or restart. But to keep gzip from ever being used it
1160
    # is best to set the below variable to 0.
1161
    # NOTE2: If you have Trf or zlib packages present, then this
1162
    # should always be set to 1. You save enormous bandwidth and
1163
    # time using this. If your bot is patched and you have Trf/zlib
1164
    # then you should definitely leave this at 1 and you will never
1165
    # suffer issues.
1166
    # ------
1167
    variable use_gzip 0
1168
1169
    # THIS IS TO BE USED TO DEVELOP A BETTER LIST FOR USE BELOW.
1170
    # To work-around certain encodings, it is now necessary to allow
1171
    # the public a way to trouble shoot some parts of the script on
1172
    # their own. To use these features involves the two settings below.
1173
    # -- DEBUG INFORMATION GOES BELOW --
1174
    # set debug and administrator here
1175
    # this is used for debugging purposes
1176
    # ------
1177
    variable debug 1
1178
    variable debugnick speechles
1179
1180
    # AUTOMAGIC
1181
    # with this set to 1, the bottom encode_strings setting will become
1182
    # irrelevant. This will make the script follow the charset encoding
1183
    # the site is telling the bot it is. 
1184
    # This DOES NOT affect wiki(media/pedia), it will not encode automatic.
1185
    # Wiki(media/pedia) still requires using the encode_strings section below.
1186
    # ------
1187
    # NOTE: If your bot is utf-8 pathced, leave this option at 1, the only
1188
    # time to change this to 0 is if your having rendering problems.
1189
    # ------
1190
    variable automagic 1
1191
1192
    # UTF-8 Work-Around (for eggdrop, this helps automagic)
1193
    # If you use automagic above, you may find that any utf-8 charsets are
1194
    # being mangled. To keep the ability to use automagic, yet when utf-8
1195
    # is the charset defined by automagic, this will make the script instead
1196
    # follow the settings for that country in the encode_strings section below.
1197
    # ------
1198
    # NOTE: If you bot is utf-8 patched, set this to 0. Everyone else, use 1.
1199
    # ------
1200
    variable utf8workaround 1
1201
1202
    # encoding conversion lookups
1203
    # here is where you can correct language encoding problems by pointing their
1204
    # abbreviation towards an encoding. if you want more, feel free to add more.
1205
    # this is a somewhat poor example below, there are possibly hundreds of additions
1206
    # that need to be added to this section, this is just something to see if this
1207
    # indeed is a work around, enjoy and merry christmas ;P
1208
    # ------
1209
    # NOTE: If your bot is utf-8 patched, the below list is irrevelevant.
1210
    # NOTE2: If your bot isn't utf-8 patched and Trf/zlib are found and used, the below
1211
    # list is used to correct latin encodings, this is how the list starts by default.
1212
    # NOTE3: If your bot isn't utf-8 patched, and Trf/zlib are NOT found, the below
1213
    # list is to correct utf-8 encodings, as well as various latin encodings. You
1214
    # may need to add things to this list possibly to correct rendering problems.
1215
    # ------
1216
    variable encode_strings {
1217
1218
    }
1219
  }
1220
}
1221
1222
# ------
1223
# end of configuration, script begins - changes beyond this section aren't advised.
1224
# ------
1225
# *** DO NOT CHANGE THINGS BEYOND THIS POINT UNLESS YOU KNOW WHAT YOUR DOING ***
1226
# If you know what your doing, well by all means, change anything and everything,
1227
# but do so with the understanding that all modifications are bound by the
1228
# GNU General Public license agreement found above regarding credit for authors
1229
# and general copyrights.
1230
# ------
1231
1232
# requires http package
1233
package require http 2.5
1234
1235
# if gzip requested, Trf or zlib required.
1236
if {$::incith::google::use_gzip > 0} {
1237
  if {([lsearch [info commands] zlib] == -1) && ([catch {package require zlib} error] !=0)} {
1238
    if {([catch {package require Trf} error] == 0) || ([lsearch [info commands] zip] != -1)} {
1239
      putlog "Incith:Google compression test successful, found Trf package! Gzip enabled."
1240
      set incith_trf 1
1241
      set incith_hdr "Accept-Encoding gzip,deflate"
1242
    } else {
1243
      putlog "Incith:Google unable to find zlib or trf package! Gzip disabled."
1244
      putlog "Incith:Google requires gzip decompression with wikipedia and Wikimedia. As a result, every article will not work for you."
1245
      set incith_nozlib 1
1246
      set incith_hdr ""
1247
    }
1248
  } else {
1249
    putlog "Incith:Google compression test successful, found zlib package! Gzip enabled."
1250
    set incith_hdr "Accept-Encoding gzip,deflate"
1251
  }
1252
} else {
1253
  set incith_nozlib 1
1254
  set incith_hdr ""
1255
}
1256
1257
# set flag per channel use
1258
setudef flag google
1259
1260
# initialize
1261
namespace eval incith {
1262
  namespace eval google {
1263
    variable version "incith:google-2.0.0c"
1264
    variable encode_strings [split $encode_strings]
1265
  }
1266
}
1267
1268
# bind the public binds
1269
bind pubm -|- "*" incith::google::public_message
1270
1271
# bind the private message binds, if wanted
1272
if {$incith::google::private_messages >= 1} {
1273
  bind msgm -|- "*" incith::google::private_message
1274
}
1275
1276
namespace eval incith {
1277
  namespace eval google {
1278
    # GOOGLE
1279
    # performs a search on google.
1280
    #
1281
    proc google {input} {
1282
      # local variable initialization
1283
      set results 0 ; set calc 0 ; set break 0 ; set spell 0 ; set output ""; set match ""
1284
      set populate 0 ; set titem "" ; set no_search "" ; set did_you_mean "" ; set titen ""
1285
1286
      # can't be moved to fetch_html since $spell isn't global
1287
      if {[string match -nocase "*spell:*" $input] == 1} {
1288
        set spell 1
1289
      }
1290
1291
      # fetch the html
1292
      set html [fetch_html $input 1]
1293
1294
      # this isn't global, so we need to keep ctry (country) here
1295
      regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titen input
1296
      if {$titen == ""} {
1297
        set titen "${incith::google::google_country}" 
1298
      } else {
1299
        set titen [lindex [split $titen /] 0]
1300
      }
1301
1302
      # standard fetch_html error catcher
1303
	if {[string match -nocase "*socketerrorabort*" $html]} {
1304
            regsub {(.+?)\|} $html {} html
1305
            return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" 
1306
	}
1307
	if {[string match -nocase "*timeouterrorabort*" $html]} {
1308
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
1309
	}
1310
1311
      regsub -- {<div id=ss-box>.*?</div><div>} $html {} html
1312
      # strip out 'did you mean?' first
1313
      # what do we call 'no search results in any language?'
1314
      if {![regexp -nocase -- {</div><div id=res class=med>(.+?)<p style} $html - no_search]} {
1315
        if {![regexp -nocase -- {</div><div id=res class=med>(.+?)<p style} $html - no_search]} {
1316
          if {![regexp -nocase -- {</script><div id=res>(.+?)<br><br>} $html - no_search]} {
1317
            if {![regexp -nocase -- {<div id=res class=med>.*?<p>(.+?)<p style} $html - no_search]} {
1318
              if {![regexp -nocase -- { </div><div class=med.*?>(.*?)\.<br><br>} $html - no_search]} {
1319
                if {![regexp -nocase -- {<p class=sp_cnt>(.*?)<a id} $html - no_search]} {
1320
		      regexp -nocase -- {<div class=med><p style=.*?>(.*?)<a id} $html - no_search
1321
                }
1322
              }
1323
            }
1324
          }
1325
        }
1326
      }
1327
      if {$no_search != ""} {
1328
        regsub -- {^.*?</h2>} $no_search "" no_search
1329
        regsub -- {</a>.*?<div class=med style=.*?>} $no_search "</a>" no_search
1330
        regexp -- {^(.+?)</td></tr>} $no_search - no_search
1331
        regsub -- {</a>} $no_search "? " no_search
1332
        regsub -all -- {<(.+?)>} $no_search { } no_search
1333
        while {[string match "*  *" $no_search]} {
1334
          regsub -all -- {  } $no_search " " no_search
1335
        }
1336
        if {$incith::google::bold_descriptions == 0} {
1337
          regsub -all -- "\002" $no_search {} no_search
1338
        }
1339
        set no_search [string trim $no_search]
1340
      }
1341
1342
      # give results an output header with result tally.
1343
      if {![regexp -- {<div id=prs>.*?</div><p>(.+?)\s\002(.+?)\(\002} $html - titem match]} {
1344
        if {![regexp -- {<p id=resultStats> (.*?) (.*?)\(\002} $html - titem match]} {
1345
          if {[regexp -- {<div id=resultStats>(.*?)\(} $html - match]} {
1346
            set match [split [string trim $match]]
1347
            set titem [lindex $match end]
1348
            set match [lindex $match end-1]
1349
          } else {
1350
            set match "Google"
1351
            set titem ""
1352
          }
1353
        }
1354
      }
1355
      regsub -all -- {<(.+?)>} $match {} match
1356
      regsub -all -- {<(.+?)>} $titem {} titem
1357
      # format output according to variables.
1358
      if {$incith::google::total_results != 0 && $spell == 0} {
1359
        set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}"
1360
        if {$incith::google::bold_descriptions == 0} {
1361
          regsub -all -- "\002" $output {} output
1362
        }
1363
      } 
1364
1365
      # parse the html
1366
      while {$results < $incith::google::search_results} {
1367
        # the regexp grabs the data and stores them into their variables, while
1368
        # the regsub removes the data, for the next loop to grab something new.
1369
1370
        # check if there was an alternate spelling first
1371
        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} {
1372
          if {[regexp -nocase -- {</div><div id=res class=med><p>(.+?)<a href=.*?>(.+?)</a>} $html - titem did_you_mean]} {
1373
            regsub -all -nocase -- {</div><div id=res class=med><p>(.+?)</a>} $html {} html
1374
            regexp -- {^(.*?)</h2>} $titem - titem
1375
          } elseif {[regexp -nocase -- {</div><div id=res class=med><h2 class=hd>.*?<p>(.+?)<a href=.*?>(.+?)</a>} $html - titem did_you_mean]} {
1376
            regsub -all -nocase -- {</div><div id=res class=med><h2 class=hd>.*?<p>.+?<a href=.*?>.+?</a>} $html {} html
1377
          } elseif {[regexp -nocase -- {</div><div id=res class=med><!--a--><h2 class.+?>.*?<p>(.*?)<a href=.*?>(.+?)</a>} $html - titem did_you_mean]} {
1378
            regsub -all -nocase -- {</div><div id=res class=med><!--a--><h2 class.+?>.*?</a>} $html {} html
1379
          } elseif {[regexp -nocase -- {<td id=rhspad></table><div id=res class=med><p>(.+?)<a href=.*?>(.+?)</a>} $html - titem did_you_mean]} {
1380
            regsub -all -nocase -- {<td id=rhspad></table><div id=res class=med><p>.+?<a href=.*?>.+?</a>} $html {} html
1381
          } elseif {[regexp -nocase {<p class=sp_cnt>(.*?)<a href=.*?>(.*?)</a>} $html - titem did_you_mean]} {
1382
            regsub -all -nocase -- {<p class=sp_cnt>} $html {} html
1383
          } elseif {[regexp -nocase {<p class=ssp>(.*?)<a href=.*?>(.*?)</a>} $html - titem did_you_mean]} {
1384
            regsub -all -nocase -- {<p class=ssp>} $html {} html
1385
          }
1386
          # sometimes calculator results are mixed into our alternate spelling.
1387
          # we want to show these like we do our 'did you mean'
1388
          if {[string match "*<img src=/images/calc_img*" $titem] == 1} {
1389
            regexp -nocase -- {calc_img.+?nowrap.*?>(.+?)</td></tr>} $titem - titem
1390
            set desc $titem
1391
            if {$::incith::google::short_answers > 0 } {
1392
              regsub -all -- {<(.+?)>} $desc "" desc
1393
              return "${::incith::google::desc_modes}$desc"
1394
            }
1395
          } else {
1396
            set desc "$::incith::google::total_modes$titem$incith::google::total_demodes$incith::google::desc_modes$did_you_mean$incith::google::desc_demodes"
1397
          }
1398
	    if {$incith::google::bold_descriptions == 0 && [string match "\002" $incith::google::desc_modes] == 1} {
1399
            regsub -all -- "\002" $desc {} desc
1400
          }
1401
          regexp -- {^(.+?)</td></tr>} $desc - desc
1402
          regsub -all -- {<(.+?)>} $desc "" desc
1403
          # did you mean and calculate have no link
1404
          set link ""
1405
1406
### ONEBOX RESULTS ###
1407
1408
        # answers
1409
        # } elseif {[string match "*<div id=res class=med role=main><div class=e><h3 class=r><a href=*" $html]} {
1410
          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]} {
1411
            if {![regexp -- {<h3 class=r.*?<a href="(.*?)\&hl=.*?<div style=.*?>(.*?)</div>.*?<cite>(.*?)</cite>} $html - link desc url]} {
1412
              if {[regexp -- {<div class=e><h3 class=r><a href="(.*?)".*?>(.*?)</a>} $html - link desc]} { set url "www.google.${titen}" }
1413
            }
1414
            set link "http://$url$link"
1415
          }
1416
          regsub -- {<div id=res class=med><div class=e><h3 class=r><a href=.+?</h3><div} $html "" html
1417
          if {[info exists desc]} {
1418
            regsub -- {<(.+?)>} $desc "" desc
1419
            if {$::incith::google::short_answers > 0 } { 
1420
              if {[info exists link]} {
1421
                return "${::incith::google::desc_modes}[descdecode $desc]$incith::google::desc_demodes$::incith::google::break${::incith::google::link_modes}$link${::incith::google::link_demodes}"
1422
              } else {
1423
                return "${::incith::google::desc_modes}[descdecode $desc]$incith::google::desc_demodes"
1424
              }
1425
            }
1426
          }
1427
        # more answers
1428
        } elseif {[string match "*\{google.rrep('answersrep'*" $html]} {
1429
          regexp -- {<div id=res class=med role=main>.*?<h3 class=r>(.*?)</h3>} $html - desc
1430
          regsub -all -- {google.rrep\('answersrep'} $html {} html
1431
          if {$::incith::google::short_answers > 0 } { return "${::incith::google::desc_modes}[descdecode [string map {\002 ""} $desc]]$incith::google::desc_demodes" }
1432
        # area codes
1433
        } elseif {[string match "*/images/map_icon2.gif*" $html] == 1} {
1434
          regexp -- {<div class=e>.+?<a href="(.+?)".+?">(.+?)</a>} $html - link desc
1435
          regsub -- {/images/map_icon2.gif} $html {} html
1436
          if {[info exists link] == 1 && $link != ""} {
1437
        	set link [urldecode $link]
1438
        	if {[string match "/url?q=http*" $link] == 1} {
1439
	        regexp -- {/url\?q=(.+?q=.+?)&} $link - link
1440
            }
1441
          }
1442
          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}" }
1443
        # zip codes
1444
        } elseif {[string match "*&oi=geocode_result*" $html] == 1} {
1445
          if {![regexp -nocase -- {oi=geocode_result.*?">(.*?)</a>.*?<tr valign=.*?><td valign=.*?><a href="(.+?)"} $html - desc link]} {
1446
            regexp -- {<h3 class=r><a href="(.+?)".*?>(.+?)</a>} $html - link desc
1447
          }
1448
          regsub -all {\&oi=geocode_result} $html {} html
1449
          if {[info exists link] == 1 && $link != ""} {
1450
            set link "[urldecode $link]"
1451
            if {[string match "/url?q=http*" $link] == 1} {
1452
	        regexp -- {/url\?q=(.+?q=.+?)&} $link - link
1453
            }
1454
          }
1455
          if {[string equal [string index $link 0] "/"]} { set link "http://maps.google.$titen$link" }
1456
          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}" }
1457
        # music
1458
        } elseif {[string match "*&oi=music&ct=result*" $html] == 1} {
1459
          regexp -- {</td><td valign=top><h2 class=r><a href=(.+?musica\?aid=.+?)\&.+?>(.+?)\002(.+?)\002} $html - link desc
1460
          regsub -- {\&oi=music\&ct=result} $html {} html
1461
          if {[info exists link] == 1 && $link != ""} {
1462
            set link "[urldecode $link]"
1463
            if {[string match "/url?q=http*" $link] == 1} {
1464
	        regexp -- {/url\?q=(.+?q=.+?)&} $link - link
1465
            }
1466
          }
1467
          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}" }
1468
        # travel info
1469
        } elseif {[string match "*/images/airplane.gif*" $html] ==1} {
1470
          regexp -- {<div class=e>.*?/images/airplane.gif.*?<td.+?valign=top.*?>(.*?)<a.+?href="(.+?)"(?:.*?)>(.+?)</a>} $html - d1 link d2
1471
          regsub -- {<div class=e>.*?/images/airplane.gif.*?</a>} $html "" html
1472
          set desc "$d1 $d2"
1473
        # UPC codes
1474
        } elseif {[string match "*/images/barcode.gif*" $html] ==1} {
1475
          regexp -- {<td valign=top><h3 class=r><a href="(.+?)".*?>(.+?)</a>} $html - link desc
1476
          regsub -- {<div class=e>.*?/images/barcode.gif.*?</a>} $html "" html
1477
        # time
1478
        } elseif {[regexp -- {<h3 class=r></h3><tr><td valign=top width=100%><div><table cellspacing=0><tr><td style="font-size:medium">(.*?)</table>} $html - desc]} {
1479
          regsub -- {<h3 class=r></h3><tr><td valign=top width=100%><div><table cellspacing=0><tr><td style="font-size:medium">.*?</table>} $html "" html
1480
          regsub -all -- {<tr><td>} [string trim $desc] "; " desc
1481
          regsub -all -- {<.*?>} [string trim $desc] "" desc
1482
          if {$::incith::google::short_answers > 0} {
1483
            return "$::incith::google::desc_modes[descdecode $desc]$::incith::google::desc_demodes"
1484
          }
1485
        # weather!
1486
        } elseif {[string match "*/onebox/weather*" $html] == 1} {
1487
          regexp -- {<h3 class=r>(.+?)</h3>.+?<table.+?<td.*?rowspan=2>(.+?)<td.+?<tr.+?<tr.+?<td.*?>(.+?)<td.+?<tr.*?><td.*?>(.+?)<td.+?<tr.*?><td.*?>(.+?)<td} $html - w1 w2 w3 w4 w5
1488
          regexp -- {%<td.*?>(.+?)<.+?>(.+?)<.+?>(.+?)<.+?>(.+?)<.+?>(.+?)<.+?>(.+?)<.+?>(.+?)<.+?>(.+?)</table>} $html - f1 f2 f3 f4 f5 f6 f7 f8
1489
          regsub -- {<h3 class=r>(.*?)</table} $html {} html
1490
          # not all weather stations report 5 results at all times
1491
          # this make up for when we only get 4, and does it gracefully
1492
          if {[regexp {[0-9a-zA-Z]} $w3]} { set w3 ", $w3" }
1493
          if {[regexp {[0-9a-zA-Z]} $w4]} { set w4 ", $w4" }
1494
          if {![regexp {[0-9a-zA-Z]} $w5]} {
1495
            set w5 ""
1496
          } else {
1497
            set w5 "; $w5"
1498
          }
1499
          #Take our F temp and turn to C. Does this always start as F without a cookie? Could be bad in metric countries
1500
#          regexp -- {([0-9]+)} $w2 {} far
1501
#          set cel "%.1f"
1502
#          set cel [format $cel [expr {0.5556 * ($far-32)}]]
1503
#          set desc "$w1\: $w2/$cel°C; Current: $w3; $w4; $w5"
1504
          set desc "$w1\: $w2$w3$w4$w5; $f1/$f2 $f3/$f4 $f5/$f6 $f7/$f8"
1505
          regsub -all -- {&deg;} $desc {°} desc
1506
          set link ""
1507
          regsub -all -- {weather} $input {} input
1508
          if {$::incith::google::short_answers > 0 } { return "$::incith::google::desc_modes[descdecode $desc]" }
1509
        # time:
1510
        } elseif {[string match "*src=\"http://www.google.com/chart*chc=localtime*" $html] == 1} { 
1511
          regexp -nocase -- {src="http://www.google.com/chart\?chs=.*?chc=localtime.*?><td valign=[a-z]+>(.+?)</table>} $html - desc
1512
          regsub -- {<br>} $desc ". " desc
1513
          regsub -all {<.*?>} $desc "" desc
1514
          regsub -- {chc=localtime} $html {} html
1515
          if {$::incith::google::short_answers > 0 } { return "$::incith::google::desc_modes[descdecode $desc]" }
1516
          set link ""
1517
        # public_data:
1518
        } elseif {[string match "*/publicdata</div></div>*" $html]} {
1519
          regexp -nocase -- {valign=top><h3 class=r><a href=.*?>(.*?)</a>.*?<tr><td style.*?><a href="(.*?)".*?<td valign=top.*?>(.*?)<br>} $html - tit link des
1520
          regsub -all {<.*?>} $des "" des
1521
          regsub -- {/publicdata</div></div>} $html "" html
1522
          set desc "$tit: $des"
1523
          if {[info exists link] == 1 && $link != ""} {
1524
            if {[string match "*\&sa\=X*" $link]} {
1525
              regexp -- {(^.+?)&sa\=} [urldecode $link] - link
1526
            }
1527
            if {[string match "\/url\?q=*" $link]} {
1528
              regexp -- {\/url\?q=(.*?)$} $link - link
1529
            }
1530
            regexp -- {(.+?)\&ei=} $link - link
1531
          }
1532
          if {$::incith::google::short_answers > 0 } {
1533
            return "${::incith::google::desc_modes}[descdecode ${desc}]${::incith::google::desc_demodes}"
1534
          }
1535
        # define:
1536
        } elseif {[string match "*<ul type=*" $html]} { 
1537
          #[string match "*define:*" $input] == 1
1538
          set output "" 
1539
          regexp -- {<ul type=.+?<li>(.+?)(?=\s*<li>|<br>).*<a href.*(http.+?)">} $html - desc link
1540
          regsub -- {<u1 type=.+?><li>(.+?)(?=\s*<li>|<br>)} $html {} html
1541
          regsub -all -- {\+} $input {%2B} define_input
1542
          regsub -all -- { } $define_input {+} define_input
1543
          if {[info exists link] == 1 && $link != ""} {
1544
            regexp -- {(.+?)\&sig=} $link - link
1545
            regexp -- {(.+?)\&usg=} $link - link
1546
            regexp -- {(.+?)\&ei=} $link - link
1547
            regexp -- {(.+?)\&sa=} $link - link
1548
            set link "[urldecode $link]"
1549
            regsub -all " " $link "%20" link
1550
            append link " ( http://www.google.${titen}/search?q=${define_input} )"
1551
          } else {
1552
            if {![regexp -- {</div><div class=med style=".*?"><p>(.+?)\.<br><br>} $html - no_def]} {
1553
              if {![regexp -- {<div class=med style=".*?"><br>(.+?)<br><br>} $html - no_def]} {
1554
                if {![regexp -- {<!--z--><p>(.*?)<br>} $html - no_def]} {
1555
                  set no_def "Houston, we have a problem. Aborting lift-off!"
1556
                }
1557
              }
1558
            }
1559
            regsub -- {</a>} $no_def "." no_def
1560
            regsub -all -- {<(.+?)>} $no_def "" no_def
1561
            return "${::incith::google::desc_modes}${no_def}${::incith::google::desc_demodes}"
1562
          }
1563
        } elseif {[string match "*oi=define*" $html]} {
1564
          if {[string match "*oi=spell*" $html]} {
1565
            regexp -- {</div><div class=med style=.*?><p>(.*?)<p>(.*?)<p>} $html - desc link
1566
            regsub -- {</a>} $desc "?" desc
1567
            regsub -all -- {<.*?>} $desc "" desc
1568
            regsub -all -- {<.*?>} $link "" link
1569
            return "${::incith::google::desc_modes}${desc} ${link}${::incith::google::desc_demodes}"
1570
          }
1571
          regexp -- {<div class=med style=.*?><p>(.*?)<br>.*?<a href=.*?>(.*?)</a>} $html - desc link
1572
          regsub -- {<div class=med style=.*?><p>.*?<br>.*?<a href=.*?>.*?</a>} $html "" html 
1573
          regsub -all -- {<(.+?)>} [string map {"<li>" " "} $desc] "" desc
1574
          if {![string match "http*" $link]} { set link "http://$link" }
1575
          regsub -all -- {\+} $input {%2B} define_input
1576
          regsub -all -- { } $define_input {+} define_input
1577
          set link "${link} ( http://www.google.${titen}/search?q=${define_input} )"
1578
          return "${::incith::google::desc_modes}${desc}${incith::google::break}${link}${::incith::google::desc_demodes}"
1579
        # finance / stock quotes
1580
        } elseif {[string match "*<a href=\"/url\?q=http://finance.google.com/finance%3Fclient%3D*" $html] == 1} {
1581
          # this has to be one of the worst regexps ever written ! 
1582
          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
1583
          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
1584
          if {[info exists tick] == 1 && [info exists name] == 1 && [info exists price] == 1} {
1585
            set desc "$tick: $name = $$price"
1586
          	set link "http://finance.google.com/finance?q=$tick"
1587
		regsub -all -- "\002" $link {} link
1588
          	if {[info exists mktcap] == 1} { append desc " Mkt Cap: $mktcap" }
1589
          	unset tick ; unset name ; unset price ; unset mktcap
1590
          }
1591
          if {$::incith::google::short_answers > 0 } { return "$::incith::google::desc_modes[descdecode $desc]" }
1592
        # patents
1593
        } elseif {[string match "*/images/magnifier.gif*" $html] ==1} {
1594
          regexp -- {<td valign=top><a href="(http://patft.uspto.gov/.+?)".+?">(.+?)</a>} $html - link desc
1595
          regsub -- {/images/magnifier.gif} $html {} html
1596
        # calculator
1597
        } elseif {[string match "*<img src=/images/calc_img*" $html] || [string match "*<img src=\"/images/icons/onebox/calculator*" $html]} {
1598
          set calc 1
1599
          # remove bold codes from the html, not necessary here.
1600
          regexp -nocase -- {/calc.*?<h2 class=.*?>(.+?)</h2>} $html - desc
1601
          regsub -all -- {<(.+?)>} $desc "" desc
1602
          if {$::incith::google::short_answers > 0 } { return "$::incith::google::desc_modes[descdecode $desc]" }
1603
          set link ""
1604
        # conversion
1605
        } elseif {[string match "*oi=currency_onebox*" $html] == 1} {
1606
          set calc 1
1607
          regexp -nocase -- {<h3 class=r>(.*?)<} $html - desc
1608
          regsub -nocase -- {oi=currency_onebox} $html {} html
1609
          if {$::incith::google::short_answers > 0 } { return "$::incith::google::desc_modes[descdecode $desc]" }
1610
          set link ""
1611
        # whois
1612
        } elseif {[string match "*\002Whois\002 record for*" $html] == 1} {
1613
          if {[regexp -- {<h3 class=r.*?<a href="(.*?)".*?>(.*?)</a>.*?<tr><td>(.*?)<tr>} $html - link desc descwho]} {
1614
            regsub -- {<h3 class=r.*?<a href=".+?".*?>.+?</a>.*?<tr>.*?<tr>} $html "" html 
1615
            append desc " \(${descwho}\)"
1616
          }
1617
          if {[info exists link] == 1 && $link != ""} {
1618
            if {[string match "*\&sa\=X*" $link]} {
1619
              regexp -- {(^.+?)&} $link - link
1620
            }
1621
            if {[string match "\/url\?q=*" $link]} {
1622
              regexp -- {\/url\?q=(.*?)$} $link - link
1623
            }
1624
          }
1625
          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}" }
1626
### END ONEBOX ###
1627
1628
        # spell: # special query - not onebox
1629
        } elseif {$spell == 1} {
1630
          if {[regexp {<div id=res class=med><p>(.*?)</a>} $html - titem]} {
1631
            regsub -all {<.*?>} $titem "" titem
1632
            set desc "$incith::google::total_modes${titem}$incith::google::total_demodes$incith::google::desc_modes${did_you_mean}$incith::google::desc_demodes"
1633
          } else {
1634
            if {$match != "Google"} {
1635
              return "${::incith::google::total_modes}\002${match}\002 ${titem}"
1636
            } else {
1637
              return "$incith::google::total_modes$did_you_mean$incith::google::total_demodes$incith::google::desc_modes$no_search"
1638
            }
1639
          }
1640
          if {[string len $desc] < 2} {
1641
            set desc "$incith::google::desc_modes$no_search$incith::google::desc_demodes"
1642
          }
1643
          set link ""
1644
        # regular search
1645
        } else {
1646
          if {![regexp -- {class=g(?!b).*?<a href="(.+?)".*?>((?!<).+?)</a>} $html - link desc]} {
1647
            if {[regexp -- {class=r.*?<a href="(.+?)".*?>((?!<).+?)</a>} $html - link desc ]} {
1648
              regsub -- {class=r.*?<a href=".+?".*?>(?!<).+?</a>} $html "" html
1649
            }
1650
          } else {
1651
            regsub -- {class=g(?!b).*?<a href=".+?".*?>.+?</a>} $html "" html
1652
          }
1653
 
1654
          if {[info exists link] == 1} {
1655
            if {[string match "*\&sa\=X*" $link]} {
1656
              regexp -- {(^.+?)&} $link - link
1657
            }
1658
          }
1659
          if {[info exists link] == 1} { 
1660
            if {[string match "*http*" $link] == 0} {
1661
              set link ""
1662
            } elseif {[string match *.pdf $link] == 1} {
1663
              set desc "\[PDF\] $desc"
1664
            }
1665
          }
1666
          if {($::incith::google::skip_self > 0) && ([info exists link])} {
1667
            if {[string match "*.google.*" $link]} { 
1668
              unset link ; unset desc ; set spell 0 ; set calc 0 ; set break 0
1669
              continue
1670
            }
1671
          }
1672
          # trim the description
1673
          if {[info exists desc] == 1 && $incith::google::description_length > 0} {
1674
            set desc [string range $desc 0 [expr $incith::google::description_length - 1]]
1675
          }
1676
        }
1677
1678
        # make sure we have something to send
1679
        if {[info exists desc] == 0} {
1680
          if {$match == "Google"} {
1681
            if {[string match "*<img src=/images/calc_img*" $titem] == 1} {
1682
              regexp -nocase -- {calc_img.+?nowrap>(.+?)</} $titem - desc
1683
              regexp -- {^(.+?)</td></tr>} $desc - desc
1684
              set reply "${desc}"
1685
            } else {
1686
              set reply "${no_search}"
1687
            }
1688
            return "$incith::google::desc_modes$reply"
1689
          }
1690
          return $output
1691
        }
1692
1693
        if {[info exists link] == 1} {
1694
          if {[string match "*http*" $link] == 0} {
1695
            set link ""
1696
          }
1697
        }
1698
        set desc [string trim $desc]
1699
        regsub -all "%20" $desc " " desc
1700
        regsub -all "<br>" $desc " " desc
1701
1702
        # add the search result
1703
        if {$calc == 0 && $spell == 0 && $populate == 0} {
1704
          if {[info exists link] && $link != ""} {
1705
            if {![string match "*define:*" $input]} {
1706
              set link [urldecode $link]
1707
              regsub -all " " $link "%20" link
1708
            }
1709
            # added because of recent google changes, needed to clean-up *.google.* links
1710
            if {[string match "*url\?*" $link]} {
1711
              regexp -- {url\?q=(.+?)$} $link - link
1712
              regexp -- {(.+?)\&sig=} $link - link
1713
              regexp -- {(.+?)\&usg=} $link - link
1714
              regexp -- {\?url=(.+?)$} $link - link
1715
            }
1716
            # top result may be news, at the moment it is too close to regular
1717
            # search results to cull this out.. so in the meantime, this hack
1718
            # will at least remove the 10,000 google tags at the end of the url
1719
            # to keep it from spanning 2 lines of results.
1720
            if {[string match "http://news.google*" $link]} {
1721
               regexp -- {^(.+?)&hl=} $link - link
1722
            }
1723
            regsub -all "(?:\x93|\x94|&quot;|\")" $link {} link
1724
            if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
1725
            if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" }
1726
            if {$incith::google::link_only == 1} { 
1727
              append output "${link}${incith::google::seperator}"
1728
            } else {
1729
              append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}"
1730
            }
1731
          } else {
1732
            append output "[descdecode $desc]${incith::google::seperator}"
1733
          }
1734
        } else {
1735
          set output "[descdecode $desc]"
1736
        }
1737
1738
        # I've hard-coded it to only fetch one result for define lookups, and
1739
        #   spell shouldn't ever have to loop.
1740
        if {[string match "define:*" $input] == 1 || $spell == 1 || $calc == 1 || $break == 1 } {
1741
          break
1742
        }
1743
1744
        # increase the results, clear the variables for the next loop
1745
        unset link ; unset desc ; set spell 0 ; set calc 0 ; set break 0
1746
        incr results
1747
      }
1748
1749
      # make sure we have something to send
1750
      if {$output == "" && ![string match "*:*" $input] && ![string match "*<img src=/images/calc_img*" $html] } {
1751
        set reply "${no_search}"
1752
        return "$::incith::google::desc_modes$reply"
1753
      }
1754
      return $output
1755
    }
1756
1757
    # IMAGES
1758
    # fetches a list of links to images from images.google.
1759
    #
1760
    proc images {input} {
1761
      ; set results 0 ; set output ""; set match "" ; set titem "" ; set no_search "" ; set did_you_mean ""
1762
1763
      # fetch the html
1764
      set html [fetch_html $input 2]
1765
1766
      # user input causing errors?
1767
	if {[string match -nocase "*socketerrorabort*" $html]} {
1768
            regsub {(.+?)\|} $html {} html
1769
            return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" 
1770
	}
1771
	if {[string match -nocase "*timeouterrorabort*" $html]} {
1772
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
1773
	}
1774
1775
      # strip out 'did you mean?' first
1776
      # what do we call 'no search results in any language?'
1777
      if {![regexp -- {--></script><div>(.+?)<br><br>} $html - no_search]} {
1778
        if {![regexp -- {</a></div><div><p>(.+?)<br><br>} $html - no_search]} {
1779
          regexp -- {<table border=0 cellpadding=0 cellspacing=0><tr><td class=j><br>(.+?)<br><br>} $html - no_search
1780
        }
1781
      }
1782
      if {$no_search != ""} {
1783
        regsub -- {</a>} $no_search "? " no_search
1784
        regsub -all -- {<(.+?)>} $no_search { } no_search
1785
        while {[string match "*  *" $no_search]} {
1786
          regsub -all -- {  } $no_search " " no_search
1787
        }
1788
        set no_search [string trim $no_search]
1789
      }
1790
1791
      # give results an output header with result tally.
1792
      regexp -- {align=right nowrap id=.*?>(.+?)\s\002(.+?)\(} $html - titem match
1793
      if {![regexp -- {1\002\s-\s\002.+?\002.+?\002(.+?)\002} $match - match]} {
1794
         set match "Google"
1795
         set titem ""
1796
      }
1797
      regsub -all -- {<(.+?)>} $match {} match
1798
      # format output according to variables.
1799
      if {$incith::google::total_results != 0 && $match > 0} {
1800
        set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}"
1801
        if {$incith::google::bold_descriptions == 0} {
1802
          regsub -all -- "\002" $output {} output
1803
        }
1804
      } 
1805
1806
      # parse the html
1807
      while {$results < $incith::google::image_results} {
1808
        if {[regexp -- {\["/imgres\?imgurl\\x3d(.*?)\\x26imgrefurl\\x3d.*?\\x26h\\x3d(.*?)\\x26w\\x3d(.*?)\\x26sz\\x3d(.*?)\\x26.*?",.*?,.*?,.*?,.*?,.*?,"(.*?)","(.*?)"} $html - link h w size desc d2]} {
1809
          regsub -- {\["/imgres\?imgurl\\x3d(.+?)\\x26imgrefurl\\x3d.*?\\x26h\\x3d.*?\\x26w\\x3d.*?\\x26sz\\x3d.*?\\x26} $html {} html
1810
          # google now makes it very hard to parse titles out, this solves the dilemma.
1811
          if {[string is integer -strict $desc]} { set desc $d2 }
1812
          #set desc [string map [list "\]" "\\\]" "\[" "\\\[" "\$" "\\\$" "\\" "\\\\"] $desc]
1813
          regsub -all -- {\\x([[:xdigit:]]{1,2})} $desc {[format %c [scan "\1" %x]]} desc
1814
          set desc [descdecode [subst $desc]]
1815
          regsub -all -- {(?:<b>|</b>)} $desc "\002" desc
1816
        }
1817
        # if there's no link, return or stop looping, depending
1818
        if {[info exists link] == 0} {
1819
          if {$results == 0} {
1820
            set reply $no_search
1821
            return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
1822
          } else {
1823
            break
1824
          }
1825
        }
1826
1827
        # prevent duplicate results is mostly useless here, but will at least
1828
        #   ensure that we don't get the exact same picture.
1829
        if {[string match "*$link*" $output] == 1} {
1830
          break
1831
        }
1832
        append desc " ($h x $w - ${size}k)" 
1833
        if {$incith::google::desc_modes != ""} { set desc "$incith::google::desc_modes${desc}$incith::google::desc_demodes" }
1834
        if {$incith::google::link_modes != ""} { set link "$incith::google::link_modes${link}$incith::google::link_demodes" }
1835
1836
        # add the search result
1837
        append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}"
1838
1839
        # increase the results, clear the variables for the next loop just in case
1840
        unset link
1841
        incr results
1842
      }
1843
1844
      # make sure we have something to send
1845
      if {$match == ""} {
1846
        set reply "${no_search}"
1847
        return "$::incith:google::desc_modes$reply$::incith::google::desc_demodes"
1848
      }
1849
      return $output
1850
    }
1851
1852
    # LOCAL
1853
    # fetches a list of address & phone numbers from local.google.
1854
    # -speechless updated
1855
    proc local {input} {
1856
      ; set results 0 ; set output ""; set match "" ; set titem "" ; set no_search "" ; set did_you_mean "" ; set titen ""
1857
1858
      # fetch the html
1859
      set html [fetch_html $input 3]
1860
      regsub -all {&#8206;} $html "" html
1861
1862
      # this isn't global, so we need to keep ctry (country) here
1863
      regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titen input
1864
      if {$titen == ""} {
1865
        set titen "${incith::google::google_country}" 
1866
      }
1867
1868
      # user input causing errors?
1869
	if {[string match -nocase "*socketerrorabort*" $html]} {
1870
            regsub {(.+?)\|} $html {} html
1871
            return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" 
1872
	}
1873
	if {[string match -nocase "*timeouterrorabort*" $html]} {
1874
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
1875
	}
1876
1877
      # strip out 'did you mean?' first
1878
      # what do we call 'no search results in any language?'
1879
      if {![regexp -- {<div class=spacer></div></div></div><br><p>(.+?)</p>} $html - no_search]} {
1880
        if {[regexp -- {<table cellpadding=0 cellspacing=0><tr valign=top><td>(.+?)<br><br>} $html - no_search]} {
1881
          set no_search [string map {"<br>" "; "} $no_search]
1882
          regsub -all -- {<.*?>} $no_search "" no_search
1883
          set no_search [string trim $no_search "; "]
1884
        } elseif {[regexp -- {<div class="suggest noprint">(.*?)</a>} $html - no_search]} {
1885
          regsub -all -- {<.*?>} $no_search "" no_search
1886
        } elseif {[regexp -- {<div id=refsec class="suggest noprint">(.*?)<div class=ref>(.*?)<div id=bottomads} $html - did extra]} {
1887
          foreach {- m} [regexp -all -inline {<a href=.*?>(.*?)</a>} $extra] { lappend matches $m }
1888
          set no_search "$did [join $matches "; "]"
1889
        } 
1890
      }
1891
      if {[regexp -- {<div class="noprint res">.*?<p>(.*?)</p>} $html - more]} {
1892
        append no_search "$more"
1893
      }
1894
1895
      # give results an output header with result tally.
1896
      if {![regexp -- {<form name="qmod".*?<br/>(.+?)\s\002(.+?)</form>} $html - titem match]} {
1897
        if {![regexp -- {<form name="qmod".*?>(.+?)\s\002(.+?)</form>} $html - titem match]} {
1898
          if {![regexp -- {<div id=contentpanel>.*?<form name=qmod>(.+?)\s\002(.+?)</form>} $html - match titem]} {
1899
            if {[regexp -- {<div class="noprint">(.*?)</div>} $html - match]} {
1900
              regsub -all -- {<.*?>} $match "" match
1901
              set match [split [string trim $match]] ; set titem [lindex $match end] ; set match [lindex $match end-1]
1902
              if {![string length [string trim $match]]} { set match "Google" ; set titem "" }
1903
            } else {
1904
              set match "Google"
1905
              set titem ""
1906
            }
1907
          }
1908
        }
1909
      }
1910
      regsub -all -- {<(.+?)>} $match {} match
1911
      # format output according to variables.
1912
      if {$incith::google::total_results != 0} {
1913
        set output "${::incith::google::total_modes}[string trim ${match}] [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}"
1914
        if {$incith::google::bold_descriptions == 0} {
1915
          regsub -all -- "\002" $output {} output
1916
        }
1917
      }
1918
      # parse the html
1919
      while {$results < $incith::google::local_results} {
1920
        if {[regexp -nocase {class="name lname.*?<a.*?>(.*?)</a>.*?href=".*?cid=(.*?)\&q.*?</a></nobr>.*?</div> <div>(.*?)<div>} $html - loc url add1 desc]} {
1921
          regsub -nocase {class="name lname.*?<a.*?>.*?</a>.*?href=".*?cid=.*?\&q.*?</a></nobr>.*?</div> <div>.*?<div>} $html "" html
1922
        } elseif {[regexp -nocase {<div class=lname>.*?href=(.*?) .*?">(.*?)</a></div></div><div class=atxt dir=ltr>(.*?)</div>(.*?)<} $html - url loc add1 desc]} {
1923
          regsub {<div class=lname>.*?href=(.*?) .*?">(.*?)</a></div></div><div class=atxt dir=ltr>(.*?)</div>} $html "" html
1924
        }
1925
        #regsub -nocase {<div class="name.*?href=.*?>.*?</a>.*?<div><div>.*?</div>.*?<div align=left>.*?</div>.*?<a class=f href=(.*?)>} $html "" html
1926
        if {[info exists url]} {
1927
          if {![string match -nocase "*maps.google*" $url]} {
1928
            regexp -- {^/local.*?q=(.*?)(?:$| )} $url - url
1929
            regsub -- {^/maps} $url "http://maps.google.$titen/maps" url
1930
            regexp -- {^(.*?)&dq=} $url - url
1931
          }
1932
          regexp -- {^(.*?) } $url - url
1933
        }
1934
        # if there's no link, return or stop looping, depending
1935
        if {![info exists loc]} {
1936
          if {$results == 0} {
1937
            set reply $no_search
1938
            return "$incith::google::desc_modes$reply$::incith::google::desc_demodes"
1939
          } else {
1940
            return $output
1941
            break
1942
          }
1943
        }
1944
        regsub -all -- "<.*?nobr>" $add1 {} add1
1945
        regsub -all -- "&lrm;" $add1 {} add1
1946
        if {$incith::google::desc_modes != ""} { set loc "$incith::google::desc_modes${loc}$incith::google::desc_demodes" }
1947
        if {$incith::google::link_modes != ""} { set link "$incith::google::link_modes${add1}$incith::google::link_demodes" } { set link $add1 }
1948
        
1949
        # add the search result
1950
        if {$incith::google::link_only == 1} { 
1951
          append output "${link} ${incith::google::seperator}"
1952
        } else {
1953
          append output "[descdecode ${loc}]$::incith::google::break${link}${incith::google::seperator}"
1954
        }
1955
1956
        # increase the results, clear the variables for the next loop just in case
1957
        unset loc ; unset link ; unset desc
1958
        incr results
1959
      }
1960
      return $output
1961
    }
1962
1963
    # GROUPS
1964
    # fetches a list of threads from groups.google.
1965
    # -speechless updated
1966
 
1967
    proc groups {input} {
1968
      ; set results 0 ; set output "" ; set match "" ; set no_search "" ; set titem "" ; set titen ""
1969
1970
      # this isn't global, so we need to keep ctry (country) here
1971
      regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titen dummy
1972
      if {$titen == ""} {
1973
        set titen "${incith::google::google_country}" 
1974
      }
1975
1976
      # fetch the html
1977
      set html [fetch_html $input 4]
1978
1979
      # user input causing errors?
1980
	if {[string match -nocase "*socketerrorabort*" $html]} {
1981
            regsub {(.+?)\|} $html {} html
1982
            return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" 
1983
	}
1984
	if {[string match -nocase "*timeouterrorabort*" $html]} {
1985
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
1986
	}
1987
1988
      # strip out 'did you mean?' first
1989
      # what do we call 'no search results in any language?'
1990
      regexp -- {<div id=res><p>(.+?)</div><div>} $html - no_search
1991
      if {$no_search != ""} {
1992
        regsub -- {</a>} $no_search "? " no_search
1993
        regsub -all -- {<(.+?)>} $no_search { } no_search
1994
        while {[string match "*  *" $no_search]} {
1995
          regsub -all -- {  } $no_search " " no_search
1996
        }
1997
        set no_search [string trim $no_search]
1998
      }
1999
2000
      # give results an output header with result tally.
2001
      regexp -- {</td><td align="right".*?>(.+?)\s\002(.+?)(\[|<)} $html - titem match
2002
      if {![regexp -- {1\002\s-\s.+?\002.+?\002(.+?)\002} $match - match]} {
2003
         set match "Google"
2004
         set titem ""
2005
      }
2006
      regsub -all -- {<(.+?)>} $match {} match
2007
      # format output according to variables.
2008
      if {$incith::google::total_results != 0 && $match > 0} {
2009
        set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}"
2010
        if {$incith::google::bold_descriptions == 0} {
2011
          regsub -all -- "\002" $output {} output
2012
        }
2013
      } 
2014
2015
      # parse the html
2016
      while {$results < $incith::google::group_results} {
2017
        # this grabs a google group if one exists
2018
        # this grabs a usenet group if one exists
2019
        if {[regexp -- {<div class="gdrr"><a\s+href="(.+?)".*?>(.+?)</a>.+?</td></tr></table>} $html {} thread desc]} {
2020
          regsub -- {<div class="gdrr">(.+?)</td></tr></table>} $html "" html
2021
          if {[regexp -- {url\?(?:url|q)=(.+?)\&} $thread - thread]} {
2022
            regexp -- {^(.+?)&(?:sa|ie|ei)=} $thread - thread
2023
            set thread [urldecode $thread]
2024
            if {[regexp -- {url\?(?:url|q)=(.+?)\&} $thread - thread]} {
2025
              regexp -- {^(.+?)&(?:sa|ie|ei)=} $thread - thread
2026
              set thread [urldecode $thread]
2027
            }
2028
          }
2029
        } elseif {[regexp -- {<div class="g".*?href="(.+?)".*?>(.+?)</a>} $html - thread desc]} {
2030
          regsub -- {div class="g".*?href=".+?".*?>(.+?)</td></tr>} $html "" html
2031
          if {[regexp -- {url\?(?:url|q)=(.+?)\&} $thread - thread]} {
2032
            regexp -- {^(.+?)&(?:sa|ie|ei)=} $thread - thread
2033
            set thread [urldecode $thread]
2034
            if {[regexp -- {url\?(?:url|q)=(.+?)\&} $thread - thread]} {
2035
              regexp -- {^(.+?)&(?:sa|ie|ei)=} $thread - thread
2036
              set thread [urldecode $thread]
2037
            }
2038
          }
2039
        }
2040
2041
        # if there's no desc, return or stop looping, depending
2042
        if {[info exists desc] == 0} {
2043
          if {$results == 0} {
2044
            set reply $no_search
2045
            return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
2046
          } else {
2047
            break
2048
          }
2049
        }
2050
2051
        if {[info exists desc] == 1 && $incith::google::description_length > 0} {
2052
          set desc [string range $desc 0 [expr $incith::google::description_length - 1]]
2053
          set desc [string trim $desc]
2054
        }
2055
2056
        # make the link valid because we only got a partial href result, not a full url
2057
        set link $thread
2058
2059
        if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
2060
        if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" }
2061
2062
        # add the search result
2063
        if {$incith::google::link_only == 1} { 
2064
          append output "${link}${incith::google::seperator}"
2065
        } else {
2066
          append output "[descdecode $desc] $::incith::google::break${link}${incith::google::seperator}"
2067
        }
2068
2069
        # increase the results, clear the variables for the next loop just in case
2070
        unset link; unset desc
2071
        incr results
2072
      }
2073
2074
      # make sure we have something to send
2075
      if {$match == ""} {
2076
        set reply $no_search
2077
        return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
2078
      }
2079
      return $output
2080
    }
2081
2082
    # NEWS
2083
    # fetches the news from news.google.
2084
    # -madwoota supplied, speechless updated
2085
    #
2086
    proc news {input} {
2087
      ; set results 0 ; set output ""; set match ""
2088
      ; set no_search "" ; set titem ""
2089
 
2090
      # fetch the html
2091
      set html [fetch_html $input 5]
2092
2093
      # user input causing errors?
2094
	if {[string match -nocase "*socketerrorabort*" $html]} {
2095
            regsub {(.+?)\|} $html {} html
2096
            return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" 
2097
	}
2098
	if {[string match -nocase "*timeouterrorabort*" $html]} {
2099
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
2100
	}
2101
      # strip out 'did you mean?' first
2102
      # what do we call 'no search results in any language?'
2103
      if {![regexp -- {<div class="spelling-correction">(.+?)</p><p>} $html - no_search]} {
2104
        regexp -- {<div class="no-results">(.+?)</p>} $html - no_search
2105
      }
2106
      if {$no_search != ""} {
2107
        regsub -- {</a>} $no_search "? " no_search
2108
        regsub -all -- {<(.+?)>} $no_search { } no_search
2109
        while {[string match "*  *" $no_search]} {
2110
          regsub -all -- {  } $no_search " " no_search
2111
        }
2112
        set no_search [string trim $no_search]
2113
      }
2114
2115
      # give results an output header with result tally.
2116
      regexp -- {<div class="results-stats">(.+?)\s\002(.+?)\(\002} $html - titem match
2117
      if {![regexp -- {1\002\s&ndash;\s\002.+?\002.+?\002(.+?)\002} $match - match]} {
2118
         set match "Google"
2119
         set titem ""
2120
      }
2121
      regsub -all -- {<(.+?)>} $match {} match
2122
      # format output according to variables.
2123
      if {$incith::google::total_results != 0 && $match > 0} {
2124
        set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}"
2125
        if {$incith::google::bold_descriptions == 0} {
2126
          regsub -all -- "\002" $output {} output
2127
        }
2128
      }
2129
2130
      # We have to do a single regsub first to get down to the rough area in the html we need because
2131
      # its just *not* very elegant attempting doing this in a single regexp. (Read: unreliable)
2132
      #regsub -- {<html>(.+?)</div>} $html {} html
2133
2134
      # parse the html
2135
      while {$results < $incith::google::news_results} {
2136
        # somewhat extenuated regexp due to allowing that there *might* be
2137
        # an image next to the story
2138
	  # <h2 class="title">.*?<a class.*?>.*?<a.*?href="(.+?)".*?>(.+?)</a>.+?<div class="sub-title">(.+?)</div>
2139
        if {[regexp -- {<h2 class="title">.*?<a target.*?href="(.+?)".*?>(.+?)</a>.+?<div class="sub-title">(.+?)</div>} $html {} link desc time]} {
2140
          regsub -all -- {<.*?>} $time "" time
2141
        }
2142
        regsub -- {<h2 class="title">.*?<a.*?href=".+?".*?>.+?</a>.+?<div class="sub-title">.+?</div>} $html {} html
2143
2144
        # if there's no desc, return or stop looping, depending
2145
        if {[info exists desc] == 0} {
2146
          if {$results == 0} {
2147
            set reply $no_search
2148
            return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
2149
          } else {
2150
            break
2151
          }
2152
        }
2153
        
2154
        if {[info exists desc] == 1 && $incith::google::description_length > 0} {
2155
          set desc [string range $desc 0 [expr $incith::google::description_length - 1]]
2156
          set desc [descdecode [string trim $desc]]
2157
        }
2158
2159
        # prevent duplicate results is mostly useless here, but will at least
2160
        #   ensure that we don't get the exact same article.
2161
        if {[string match "*$link*" $output] == 1} {
2162
          break
2163
        }
2164
       
2165
        if {[info exists desc]} { set desc "$incith::google::desc_modes$desc$incith::google::desc_demodes" }
2166
        if {[info exists time]} { set time "$incith::google::desc_modes[descdecode [string trim $time]]$incith::google::desc_demodes" }
2167
        if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" }
2168
        # add the search result
2169
        if {$incith::google::link_only == 1} { 
2170
          append output "${link}${incith::google::seperator}"
2171
        } else {
2172
          append output "$desc \($time\)$::incith::google::break${link}${incith::google::seperator}"
2173
        }
2174
2175
        # increase the results, clear the variables for the next loop just in case
2176
        unset link; unset desc
2177
        incr results
2178
      }
2179
2180
      # make sure we have something to send
2181
      if {$match == ""} {
2182
        set reply $no_search
2183
        return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
2184
      }
2185
      return $output
2186
    }
2187
2188
    # PRINT
2189
    # fetches book titles from books.google.
2190
    # -madwoota supplied, -broken-
2191
    # -speechless updated, fixed no longer using print.google
2192
    #
2193
    proc print {input} {
2194
      ; set results 0 ; set output "" ; set titem "" ; set no_search "" ; set did_you_mean "" ; set titen ""
2195
      ; set match ""
2196
2197
      # this isn't global, so we need to keep ctry (country) here
2198
      regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titen dummy
2199
      if {$titen == ""} {
2200
        set titen "${incith::google::google_country}" 
2201
      }
2202
2203
      # fetch the html
2204
      set html [fetch_html $input 6]
2205
2206
      # user input causing errors?
2207
	if {[string match -nocase "*socketerrorabort*" $html]} {
2208
            regsub {(.+?)\|} $html {} html
2209
            return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" 
2210
	}
2211
	if {[string match -nocase "*timeouterrorabort*" $html]} {
2212
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
2213
	}
2214
2215
      # strip out 'did you mean?' first
2216
      # what do we call 'no search results in any language?'
2217
      regexp -- {<td id="main_content">(.*?)</p>} $html - no_search
2218
2219
      # if we have a no search results message, let's format it for displaying possibly.
2220
      if {$no_search != ""} {
2221
        #regsub -all -- {\002\002} $no_search "\002" no_search
2222
        regsub -- {</a></div>} $no_search "? " no_search
2223
        regsub -all -- {<(.+?)>} $no_search { } no_search
2224
        while {[string match "*  *" $no_search]} {
2225
          regsub -all -- {  } $no_search " " no_search
2226
        }
2227
        set no_search [string trim $no_search]
2228
      }
2229
2230
      # give results an output header with result tally.
2231
      regexp -- {<td align=right>(.+?)\s\002(.+?)\(\002} $html - titem match
2232
      if {![regexp -- {1\002\s-\s\002.+?\002.+?\002(.+?)\002} $match - match]} {
2233
         set match "Google"
2234
         set titem ""
2235
      }
2236
2237
      regsub -all -- {<(.+?)>} $match {} match
2238
      # format output according to variables.
2239
      if {$incith::google::total_results != 0 && $match > 0} {
2240
        set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}"
2241
        if {$incith::google::bold_descriptions == 0} {
2242
          regsub -all -- "\002" $output {} output
2243
        }
2244
      } 
2245
2246
      while {$results < $incith::google::print_results} {
2247
        if {[regexp -- {<div class=resbdy><h2 class="resbdy">(.*?)</table>} $html - snippet]} {
2248
          if {![regexp -- {<a.*?href=".+?id=(.+?)&pg=(.*?)&.*?".*?>(.+?)</a></h2>(.+?)<br} $snippet - id page desc author]} {
2249
            regexp -- {<a.*?href=".+?id=(.+?)&.*?".*?>(.+?)</a></h2>(.+?)<br} $snippet - id desc author
2250
          }
2251
          regsub -- {<div class=resbdy><h2 class="resbdy"><a.*?href=(.+?)</table>} $html "" html
2252
        }
2253
2254
        # if there's no desc, return or stop looping, depending
2255
        if {![info exists desc]} {
2256
          if {$results == 0} {
2257
            set reply $no_search
2258
            return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
2259
          } else {
2260
            break
2261
          }
2262
        }
2263
2264
        # this cleans up perhaps bad html cuts
2265
        if {[info exists desc]} {
2266
          regsub -all -- {<(.+?)>} $desc "" desc
2267
          set desc [string trim $desc]
2268
        }
2269
2270
        if {[info exists desc]} {
2271
          regsub -all -- {<(.+?)>} $author "" author
2272
          set author [string trim $author]
2273
        }
2274
2275
        # make link by appending book id
2276
        if {[info exists page]} { set page "&pg=$page" } { set page "" }
2277
        set link "http://books.google.${titen}?id=${id}${page}"
2278
   
2279
        # prevent duplicate results is mostly useless here, but will at least
2280
        # ensure that we don't get the exact same article.
2281
        #if {[string match "*$link*" $output] == 1} {
2282
        # break
2283
        #}
2284
        append desc " (${author})"
2285
        if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
2286
        if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" }
2287
2288
        # add the search result
2289
        if {$incith::google::link_only == 1} { 
2290
          append output "${link}${incith::google::seperator}"
2291
        } else {
2292
          append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}"
2293
        }
2294
2295
        # increase the results, clear the variables for the next loop just in case
2296
        unset link ; unset desc ; unset page
2297
        incr results
2298
      }
2299
2300
      # make sure we have something to send
2301
      if {![info exists output]} {
2302
        set reply $no_search
2303
        return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
2304
      }
2305
      return $output
2306
    }
2307
  
2308
    # GeoBytes
2309
    # Fetches IP Location information
2310
    # -speechless supplied
2311
    #
2312
    proc locate {input} {
2313
      ; set results 0 ; set output ""
2314
      ; set city "" ; set region "" ; set country ""
2315
      ; set certainty "" ; set timezone "" ; set population ""
2316
      ; set currency "" ; set proxy "" ; set curr "" ; 
2317
2318
      # fetch the html
2319
      set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e"
2320
      set http [::http::config -useragent $ua]
2321
      set url "http://www.geobytes.com/IpLocator.htm?GetLocation"
2322
      set query [::http::formatQuery ipaddress $input]
2323
      set http [::http::geturl $url -query $query -headers $::incith_hdr -timeout [expr 1000 * 10]]
2324
      upvar #0 $http state
2325
      set html [ungzip [::http::data $http] $state(meta)]
2326
      ::http::cleanup $http
2327
2328
      # is site broken? if it is, say so
2329
      if {![string match "*<html>*" $html]} {
2330
        return "$::incith::google::error_modes\002 GeoBytes Error:\002 Unable to access site. www.geobytes.com seems to be down.$::incith::google::error_demodes"
2331
      }
2332
2333
      #strip html tags
2334
      regsub -all "\t" $html "" html
2335
      regsub -all "\n" $html "" html
2336
      regsub -all "\r" $html "" html
2337
      regsub -all "\v" $html "" html
2338
      regsub -all "&#039;" $html "'" html
2339
2340
      #parse html
2341
      regexp -- {input.+?name="ro-no_bots_pls13".+?value="(.+?)".+?size} $html {} country
2342
      regexp -- {input.+?name="ro-no_bots_pls15".+?value="(.+?)".+?size} $html {} region
2343
      regexp -- {input.+?name="ro-no_bots_pls17".+?value="(.+?)".+?size} $html {} city
2344
      regexp -- {input.+?name="ro-no_bots_pls18".+?value="(.+?)".+?size} $html {} certainty
2345
      regexp -- {input.+?name="ro-no_bots_pls9".+?value="(.+?)".+?size} $html {} timezone
2346
      regexp -- {input.+?name="ro-no_bots_pls3".+?value="(.+?)".+?size} $html {} population
2347
      regexp -- {input.+?name="ro-no_bots_pls1".+?value="(.+?)".+?size} $html {} currency
2348
      #currency sometimes has a trailing space, let's fix that with a dirty hack.
2349
      set currency [string trim $currency]
2350
      regexp -- {input.+?name="ro-no_bots_pls11".+?value="(.+?)".+?size} $html {} proxy
2351
      regexp -- {input.+?name="ro-no_bots_pls".+?value="(.+?)".+?size} $html {} curr
2352
2353
      #in case we get blocked, say we did
2354
      if {[string match "*temporarily blocked*" $html] == 1} {
2355
       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"
2356
      }
2357
2358
      #if we can't read a country, assume there was nothing to lookup.
2359
      if {$country == "" && $output == ""} {
2360
        set output "$::incith::google::error_modes\002GeoBytes Error:\002 (${input}) Undefined IP. Nothing to LookUp.$::incith::google::error_demodes"
2361
      } elseif {$output == ""} {
2362
        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"
2363
      }
2364
      if {$incith::google::bold_descriptions != 1 && [string match "\002" $incith::google::desc_modes] != 1} {
2365
         regsub -all -- "\002" $output {} output
2366
      }
2367
      return $output
2368
    }
2369
2370
    # VIDEO
2371
    # fetches links to video with search data in it (video.google.com)
2372
    # -madwoota supplied, speechless updated
2373
    #
2374
    proc video {input} {
2375
      ; set results 0 ; set output ""; set match ""; set ded ""
2376
      ; set titen "" ; set titem "" ; set no_search "" ; set did_you_mean ""
2377
2378
      # this isn't global, so we need to keep ctry (country) here
2379
      regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titen dummy
2380
      if {$titen == ""} {
2381
        set titen "${incith::google::google_country}" 
2382
      }
2383
2384
      # fetch the html
2385
      set html [fetch_html $input 7]
2386
2387
      # user input causing errors?
2388
	if {[string match -nocase "*socketerrorabort*" $html]} {
2389
            regsub {(.+?)\|} $html {} html
2390
            return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" 
2391
	}
2392
	if {[string match -nocase "*timeouterrorabort*" $html]} {
2393
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
2394
	}
2395
2396
      # strip out 'did you mean?' first
2397
      # what do we call 'no search results in any language?'
2398
      if {[regexp -- {<div class=med><p style=.*?>(.*?)<p style} $html - no_search]} {
2399
        #regsub -all -- {(<strong>|</strong>)} $no_search "\002" no_search
2400
        #regsub -- {</a>} $no_search "? " no_search
2401
        #regsub -- {</td>} $no_search ". " no_search
2402
        regsub -all -- {<(.+?)>} $no_search "" no_search
2403
        set no_search [string trim $no_search] 
2404
      }
2405
2406
      # give results an output header with result tally.
2407
      if {![regexp -- {<div id=resultStats>(.+?)<nobr>} $html - match]} {
2408
         set match "Google"
2409
         set titem ""
2410
      } else {
2411
        regsub -all -- {<(.+?)>} $match {} match
2412
        regexp -- {([0-9].*?)$} $match - match
2413
        set match "\002[join [lrange [split $match] 0 end-1]]\002 [lindex [split $match] end]"
2414
      }
2415
      # format output according to variables.
2416
      if {$incith::google::total_results != 0} {
2417
        set output "${::incith::google::total_modes}[string trim ${match}]${::incith::google::total_demodes}${incith::google::seperator}"
2418
        if {$incith::google::bold_descriptions == 0} {
2419
          regsub -all -- "\002" $output {} output
2420
        }
2421
      }
2422
2423
      # parse the html
2424
      while {$results < $incith::google::video_results} {
2425
        # somewhat extenuated regexp due to allowing that there might be an image next to the title
2426
        regexp -- {<h3 class=r>.*?href="(.*?)".*?>(.*?)</a>.*?<span class=f>(.*?)</span><br>(.*?)<br>} $html {} link desc ded ded2
2427
        regsub -- {<h3 class=r>.*?href=".*?".*?>.*?</a>.*?<span class=f>.*?</span><br>.*?<br>} $html "" html
2428
2429
        # if there's no desc, return or stop looping, depending
2430
        if {[info exists desc] == 0} {
2431
          if {$results == 0} {
2432
            set reply $no_search
2433
            return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
2434
          } else {
2435
            break
2436
          }
2437
        }
2438
2439
        set desc [string trim [string range $desc 0 [expr $incith::google::description_length - 1]]]
2440
        # append narration to description for more detail unless its identical
2441
        # keep description from becoming too lengthy and clean up trailing spaces
2442
        regsub -all {<div class=description.+?</div>} $ded "" ded
2443
        regexp {(.+?)\)--} $ded - ded
2444
        regsub { -} $ded " - " ded
2445
        regsub {<span class=rl-domain>} $ded " - " ded
2446
        regsub -all {<(.*?)>} $ded "" ded
2447
        if {[string length $ded2]} {
2448
          set ded2 "\([descdecode [string range $ded2 0 [expr $incith::google::description_length - 1]]]\)"
2449
        }
2450
        set desc "[descdecode $desc] $ded2\([descdecode [string trim $ded]]\)"
2451
2452
        # make the link valid because we were only given a partial href result, not a full url
2453
        if {[string match [string range $link 0 0] "/"]} {
2454
          regsub -- {&.+?$} $link "" link
2455
          set link "http://video.google.${titen}${link}"
2456
        }
2457
2458
        # prevent duplicate results is mostly useless here, but will at least
2459
        #   ensure that we don't get the exact same article.
2460
        if {[string match "*$link*" $output] == 1} {
2461
         break
2462
        }
2463
        # quick and dirty double-space remover
2464
        while {[string match "*  *" $desc]} {
2465
          regsub -all -- {  } $desc " " desc
2466
        }
2467
        set desc [string trim $desc]
2468
        if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
2469
        if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" }
2470
2471
        # add the search result
2472
        if {$incith::google::link_only == 1} { 
2473
          append output "${link}${incith::google::seperator}"
2474
        } else {
2475
          append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}"
2476
        }
2477
2478
        # increase the results, clear the variables for the next loop just in case
2479
        unset link; unset desc
2480
        incr results
2481
      }
2482
2483
      # make sure we have something to send
2484
      if {$match == ""} {
2485
        set reply $no_search
2486
        return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
2487
      }
2488
      return $output
2489
    }
2490
2491
    # FIGHT
2492
    # google fight !
2493
    #
2494
    proc fight {input} {
2495
      set output ""; set winner 0; set match1 0; set match2 0
2496
2497
      if {![regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - country input]} {
2498
        set country "${incith::google::google_country}" 
2499
      }
2500
      regexp -nocase -- {^(.+?) vs (.+?)$} $input - word1 word2
2501
      if {![regexp -nocase -- {^\.(.+?)\s(.+?)$} $word2 - country2 word2]} {
2502
        set country2 "${incith::google::google_country}"
2503
      }
2504
2505
      # fetch the first result
2506
      set html [fetch_html ".$country $word1" 8]
2507
      # parse the html
2508
      if {![regexp -nocase {<div id=prs>.*?</div><p>(.+?)(?:\(\002|\[)} $html - matches1]} {
2509
        if {![regexp -- {<div id=resultStats> (.*?) (.*?)\(\002} $html - titem matches1]} {
2510
          if {[regexp -- {<div id=resultStats>(.*?)\(} $html - match]} {
2511
            set matches1 [lindex [split [string trim $match]] end-1]
2512
          }
2513
        }
2514
      }
2515
      if {[info exists matches1]} {
2516
        regsub -- {(?:\002|\s)1\002 - \0021\002} $matches1 "" matches1
2517
        regsub -- {(?:\002|\s)1\002-\0021\002} $matches1 "" matches1
2518
        regsub -nocase { of about } $matches1 "" matches1
2519
        regsub -nocase -all {<a href.*?>} $matches1 "" matches1
2520
        regsub -nocase -all {</a>} $matches1 "" matches1
2521
        set match1 $matches1
2522
        regsub -all -- {[\., ]} $match1 "" match1
2523
      } else { set matches1 "0" }
2524
      if {![string is digit $match1]} {
2525
        regexp -- {\002(.+?)\002.*?\002(.+?)\002} $matches1 - dummy match1
2526
        if {[string match $match1 $word1]} {
2527
          regexp -- {\002(.+?)\002} $matches1 - match1
2528
        }
2529
      }
2530
2531
      # fetch the second result
2532
      set html [fetch_html ".$country2 $word2" 8]
2533
      # parse the html
2534
      if {![regexp -nocase {<div id=prs>.*?</div><p>(.+?)(?:\(\002|\[)} $html - matches2]} {
2535
        if {![regexp -- {<div id=resultStats> (.*?) (.*?)\(\002} $html - titem matches2]} {
2536
          if {[regexp -- {<div id=resultStats>(.*?)\(} $html - match]} {
2537
            set matches2 [lindex [split [string trim $match]] end-1]
2538
          }
2539
        }
2540
      }
2541
      if {[info exists matches2]} {
2542
        regsub -- {(?:\002|\s)1\002 - \0021\002} $matches2 "" matches2
2543
        regsub -- {(?:\002|\s)1\002-\0021\002} $matches2 "" matches2
2544
        regsub -nocase { of about } $matches2 "" matches2
2545
        regsub -nocase -all {<a href.*?>} $matches2 "" matches2
2546
        regsub -nocase -all {</a>} $matches2 "" matches2
2547
        set match2 $matches2
2548
      } else { set matches2 "0" }
2549
      if {![string is digit $match2]} {
2550
        regexp -- {\002(.+?)\002.*?\002(.+?)\002} $matches2 - dummy match2
2551
        if {[string match $match2 $word2]} {
2552
          regexp -- {\002(.+?)\002} $matches2 - match2
2553
        }
2554
      }
2555
2556
      if {![string match $country $country2]} { set country "$country and Google.$country2" }
2557
      if {![info exists match1]} {
2558
        set match1 "0"
2559
        set match1expr "0"
2560
      } else {
2561
        regsub -all {(?:\.|,| )} $match1 "" match1expr
2562
      }
2563
2564
      if {![info exists match2]} {
2565
        set match2 "0"
2566
        set match2expr "0"
2567
      } else {
2568
        regsub -all {(?:\.|,| )} $match2 "" match2expr
2569
      }
2570
2571
      if {[expr $match2expr < $match1expr]} {
2572
        set winner 1
2573
      } elseif {[string match $match2expr $match1expr]} {
2574
        set winner 3
2575
      } else {
2576
        set winner 2
2577
      }
2578
2579
      if {$incith::google::bold_descriptions > 0 && $incith::google::desc_modes == ""} {
2580
        set word1 "\002$word1\002"; set word2 "\002$word2\002"
2581
        set match1 "\002 $matches1\002"; set match2 "\002 $matches2\002"
2582
      } elseif {$incith::google::desc_modes != ""} {
2583
        set word1 "\002$word1\002"; set word2 "\002$word2\002"
2584
        set match1 " $matches1"; set match2 " $matches2"
2585
      } else {
2586
        set match1 " $matches1"; set match2 " $matches2"
2587
      }
2588
2589
      if {$winner == 1} {
2590
        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"
2591
      } elseif {$winner == 2} {
2592
        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"
2593
      } else {
2594
        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"
2595
      }
2596
2597
      # make sure we have something to send
2598
      if {[info exists output] == 0} {
2599
        set reply "${::incith::google::desc_modes}Sorry, no search results were found. Something is wrong...$::incith::google::desc_demodes"
2600
        return $reply
2601
      }
2602
      return $output
2603
    }
2604
2605
    # YOUTUBE
2606
    # fetches links to video with search data in it (youtube.com)
2607
    # -speechless supplied
2608
    #
2609
    proc youtube {input} {
2610
     
2611
      ; set results 0 ; set output "" ; set ded ""; set match "" ; set titem "" ; set titen ""
2612
      if {[regsub -nocase -all -- "$::incith::google::youtube_highdef" $input "" dummy]} { set hd 1 }
2613
      # this isn't global, so we need to keep ctry (country) here
2614
      regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titem dummy
2615
      if {$titem == ""} {
2616
        set titem "${incith::google::youtube_country}" 
2617
      }
2618
2619
      # fetch the html
2620
      set html [fetch_html $input 9]
2621
2622
      # user input causing errors?
2623
	if {[string match -nocase "*socketerrorabort*" $html]} {
2624
            regsub {(.+?)\|} $html {} html
2625
            return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" 
2626
	}
2627
	if {[string match -nocase "*timeouterrorabort*" $html]} {
2628
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
2629
	}
2630
2631
      # give results an output header with result tally.
2632
      if {![regexp -- {<div id="search-num-results" class="name">(.*?)</div} $html - match]} {
2633
        set match "YouTube"
2634
        set titen "results"
2635
      } else {
2636
        regsub -all {\s+} [string trim $match] " " match
2637
        set match [split $match]
2638
        set titen [lindex $match end-6]
2639
        set match [lindex $match end]
2640
      } 
2641
      # format output according to variables.
2642
      if {$incith::google::total_results != 0 && $match != ""} {
2643
        set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titen]]${::incith::google::total_demodes}${incith::google::seperator}"
2644
        if {$incith::google::bold_descriptions == 0} {
2645
          regsub -all -- "\002" $output {} output
2646
        }
2647
      }
2648
      if {[regexp -nocase {<div class="marT10">(.+?)(</div></div>|</div><div>|</a></div>|<\!--)} $html - reply]} {
2649
        regsub -all -nocase {<div class="marT10">.+?(</div></div>|</div><div>|</a></div>|<\!--)} $html "" html
2650
        regsub -all {<td>} $reply ". " reply
2651
        regsub -all -- {<.*?>} $reply "" reply
2652
      } elseif {[regexp -nocase {id="search-no-results-message">(.*?)</div>} $html - reply]} {
2653
        regsub -all -- {<.*?>} $reply "" reply
2654
      } elseif {[regexp -nocase {id="results-main-.*?>.*?<img.*?>(.*?)<br>} $html - reply]} {
2655
        regsub -all -- {<.*?>} $reply "" reply
2656
      } else { set reply "" }
2657
2658
      # parse the html
2659
      while {$results < $incith::google::youtube_results} {
2660
        # somewhat extenuated regexp due to allowing that there might be an image next to the title
2661
        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]} {
2662
          if {[string match "*</span>*" $desc]} {
2663
            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
2664
          }
2665
          regsub -nocase {<span class="video-time">.*?</span.*?class="video\-view\-count">.*?</span} $html "" html
2666
        }
2667
        if {[info exists desc] == 0} {
2668
          if {$results == 0} {
2669
            append output "[descdecode [string trim $reply]]${incith::google::seperator}"
2670
            return "$incith::google::desc_modes[descdecode $reply]$::incith::google::desc_demodes"
2671
          } else {
2672
            break
2673
          }
2674
        }
2675
2676
        # keep description from becoming too lengthy and clean up trailing spaces
2677
        if {[info exists desc]} {
2678
          set desc [string range $desc 0 [expr $incith::google::description_length - 1]]
2679
          set desc [descdecode [string trim $desc]]
2680
        }
2681
2682
        # append length to description for more detail
2683
        if {[info exists ded] && [info exists desc]} {
2684
          if {![string equal "<" [string index $ded 0]]} {
2685
            set ded " ([descdecode [string trim [string range $ded 0 [expr $incith::google::description_length - 1]]]]) "
2686
          } else { set ded " " }
2687
          if {[string match " ($desc) " $ded]} { set ded " " }
2688
          if {[info exists ded4]} {
2689
            append desc "${ded}(${ded4}; ${ded2}; ${ded3})"
2690
          } else {
2691
            append desc "${ded}"
2692
          }
2693
        }
2694
2695
        # make the link valid because we were only given a partial href result, not a full url
2696
        if {$titem == "com" } {
2697
          set link "http://youtube.com/watch?v=${cid}&hl=en"
2698
        } else {
2699
          set link "http://${titem}.youtube.com/watch?v=${cid}&hl=${titem}"
2700
        }
2701
        # fullscreen window link - http://youtube.com/v/${cid}
2702
2703
        if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
2704
        if {[info exists link]} { 
2705
          if {[info exists hd]} {
2706
            set link [string map {"&hd=1" "&fmt=22"} $link]
2707
          } elseif {$incith::google::youtube_highquality != 0} {
2708
            append link "&fmt=18"
2709
          }
2710
          set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes"
2711
        }
2712
2713
        # add the search result
2714
        if {$incith::google::link_only == 1} { 
2715
          append output "${link}${incith::google::seperator}"
2716
        } else {
2717
          append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}"
2718
        }
2719
2720
        # increase the results, clear the variables for the next loop just in case
2721
        unset link; unset desc ; set ded ""
2722
        incr results
2723
      }
2724
      return $output
2725
    }
2726
2727
    # MYSPACEVIDS
2728
    # fetches links to video with search data in it (videosearch.myspace.com)
2729
    # -speechless supplied
2730
    #
2731
    proc myspacevids {input} {
2732
2733
      ; set results 0 ; set output "" ; set ded ""; set match "" ; set rating ""
2734
2735
      # fetch the html
2736
      set html [fetch_html $input 11]
2737
2738
      # give results an output header with result tally.
2739
      regexp -nocase -- {class="resultsInfo">.*?1-.*?\s.*?\s(.*?)\s(.*?)\s} $html - match videos
2740
2741
      # format output according to variables.
2742
      if {$incith::google::total_results != 0 && $match != ""} {
2743
        set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $videos]]${::incith::google::total_demodes}${incith::google::seperator}"
2744
        if {$incith::google::bold_descriptions == 0} {
2745
          regsub -all -- "\002" $output {} output
2746
        }
2747
      }
2748
2749
      # parse the html
2750
      while {$results < $incith::google::myspacevids_results} {
2751
        # somewhat extenuated regexp due to allowing that there might be an image next to the title
2752
        regexp -nocase -- {a class="taggedlink.*?href=.*?videoid=(.*?)\&.*?>(.*?)</a>.*?<a class=.*?>(.*?)</a>.*?<ul class="videoData group">(.*?)</ul>} $html - cid desc ded rating
2753
        regsub -nocase -- {a class="taggedlink.*?href=.*?videoid=.*?\&.*?>.*?</a>.*?<a class=.*?>.*?</a>.*?<ul class="videoData group">.*?</ul>} $html {} html
2754
        # if there's no desc, return or stop looping, depending
2755
        if {![info exists desc]} {
2756
          if {$results == 0} {
2757
            if {[regexp -- {class="displayingSummary">(.+?)</div>} $html - reply]} {
2758
              return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
2759
            } elseif {[regexp -- {<p id="displaySummary" class="resultsInfo">(.*?)</p>} $html - reply]} {
2760
              return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
2761
            }
2762
          } else {
2763
            break
2764
          }
2765
        }
2766
2767
        # duplicate link filter, clumsy indeed.. will remove soon and fix properly
2768
        if {[string match "*${cid}*" $output] == 1} {
2769
          break
2770
        }
2771
        if {[info exists rating]} {
2772
          regsub -all {</li>} [string map {"	" "" "\002" ""} $rating] ";" rating
2773
          regsub -all {<.*?>} $rating "" rating
2774
          regsub -all {\s+} $rating " " rating
2775
          regsub -all { ;} $rating ";" rating
2776
        }
2777
        if {[info exists ded]} {
2778
          regsub -all {<.*?>} [string trim $ded] "" ded
2779
          if {[string length $ded]} { set ded "(by $ded)" }
2780
        }
2781
        # keep description from becoming too lengthy and clean up trailing spaces
2782
        if {[info exists desc]} {
2783
          set desc [string trim [string range $desc 0 [expr $incith::google::description_length - 1]]]
2784
          set desc "${desc} ${ded}([string trim ${rating} "; "])"
2785
        }
2786
2787
        # make the link valid because we were only given a partial href result, not a full url
2788
        set link "http://vids.myspace.com/index.cfm?fuseaction=vids.individual&videoid=${cid}"
2789
2790
        if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
2791
        if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" }
2792
2793
        # add the search result
2794
        if {$incith::google::link_only == 1} { 
2795
          append output "${link}${incith::google::seperator}"
2796
        } else {
2797
          append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}"
2798
        }
2799
2800
        # increase the results, clear the variables for the next loop just in case
2801
        unset link; unset desc
2802
        incr results
2803
      }
2804
2805
      # make sure we have something to send
2806
      if {$match == ""} {
2807
        regexp -- {class="displayingSummary">(.+?)</div>} $html - reply
2808
        return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
2809
      }
2810
      if {$incith::google::bold_descriptions != 0} {
2811
        regsub -all -- "(<mark>|</mark>)" $output "\002" output
2812
      } else { regsub -all -- "(<mark>|</mark>)" $output "" output }
2813
      return $output
2814
    }
2815
2816
    # trans
2817
    # google translation -(www.google.com\translate_t?)
2818
    # -speechless supplied
2819
    #
2820
    proc trans {input where} {
2821
      global incithcharset
2822
      ; set results 0 ; set output ""; set match "" ; set titem ""
2823
      if {[regsub -nocase -all -- $incith::google::trans_input_t $input "" input]} { set y 0 }
2824
      if {[regsub -nocase -all -- $incith::google::trans_output_t $input "" input]} { set z 0 }
2825
      # split up stuff
2826
      regexp -nocase -- {^(.+?)@(.+?)\s(.+?)$} $input - link desc titem
2827
      # fetch the html
2828
      set ua "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3"
2829
      if {$::incith::google::trans_input > 0} {
2830
        set http [::http::config -useragent $ua -urlencoding "utf-8"]
2831
      } else {
2832
        set http [::http::config -useragent $ua -urlencoding ""]
2833
      }
2834
      set url "http://translate.google.com/translate_t?"
2835
      if {$::incith::google::trans_input > 0} {
2836
        if {![info exists y]} {
2837
          set ie "&ie=utf-8"
2838
        } else {
2839
          set ie ""
2840
        }
2841
      } else {
2842
        if {![info exists y]} {
2843
          set ie ""
2844
        } else {
2845
          set ie "&ie=utf-8"
2846
        }
2847
      }
2848
      if {$::incith::google::trans_output > 0} {
2849
        if {![info exists z]} {
2850
          set oe "&oe=utf-8"
2851
        } else {
2852
          set oe ""
2853
        }
2854
      } else {
2855
        if {![info exists z]} {
2856
          set oe ""
2857
        } else {
2858
          set oe "&oe=utf-8"
2859
        }
2860
      }
2861
      if {![info exists y]} {
2862
        set query "text=[urlencode $titem 0 "utf-8"]&sl=${link}&tl=${desc}$ie$oe"
2863
      } else {
2864
        set query "text=[urlencode $titem 0]&sl=${link}&tl=${desc}$ie$oe"
2865
      }
2866
	catch {set http [::http::geturl "$url" -query $query -headers $::incith_hdr -timeout [expr 1000 * 10]]} error
2867
2868
      # CHECK CHECK
2869
      upvar #0 $http state
2870
      set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)]
2871
      if {$incith::google::debug > 0} {
2872
        putserv "privmsg $incith::google::debugnick :\002url:\002 $url$query \002\037charset:\002\037 [string map -nocase {"iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $incithcharset]"
2873
      }
2874
	if {[string match -nocase "*couldn't open socket*" $error]} {
2875
		return "${::incith::google::error_modes}Socket Error accessing '${url}' .. Does it exist?${::incith::google::error_demodes}" 
2876
	}
2877
	if { [::http::status $http] == "timeout" } {
2878
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
2879
	}
2880
      set html [ungzip [::http::data $http] $state(meta)]
2881
      if {[info exists z]} { set html [incithencode $html] }
2882
      ::http::cleanup $http
2883
2884
      regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html
2885
      regsub -all -nocase {<font.+?>} $html "" html
2886
      regsub -all -nocase {</font>} $html "" html
2887
      regsub -all -nocase {<span.*?>} $html "" html
2888
      regsub -all -nocase {</span>} $html "" html
2889
      regsub -all -nocase {<input.+?>} $html "" html
2890
      regsub -all -nocase {(?:<i>|</i>)} $html "" html
2891
      regsub -all -nocase {<i style.*?>} $html "" html
2892
      regsub -all "\t" $html " " html
2893
      regsub -all "\n" $html " " html
2894
      regsub -all "\r" $html " " html
2895
      regsub -all "\v" $html " " html
2896
      regsub -all "</li>" $html ". " html
2897
      regsub -all ";;>" $html "" html
2898
      # make sure everything is lowercase.
2899
      # make sure everything is lowercase.
2900
      set desc [string tolower $desc]
2901
      set link [string tolower $link]
2902
      if {![regexp -- {<h3 id=headingtext.*?>(.+?)</h3>} $html {} detect]} {set detect ""} { regsub -all {<.*?>} $detect "" detect}
2903
      if {[regexp -- {</h3>.*?</object></div>(.+?)</div>} $html - match]} { regsub -all {<.*?>} $match "" match }
2904
      if {[string length $match]} {
2905
        put_output $where "${::incith::google::total_modes}Google\:$::incith::google::total_demodes$::incith::google::desc_modes \(${link}\-\>${desc}\)\ [descdecode $detect]"
2906
        put_output $where [descdecode [descdecode ${match}]]
2907
      } else {
2908
        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"
2909
      }
2910
    }
2911
2912
    # MININOVA TORRENT HUNT
2913
    # fetches torrent links from mininova. (mininova.com)
2914
    # -speechless supplied
2915
    #
2916
    proc mininova {input} {
2917
2918
      ; set results 0 ; set output ""; set match "" ; set ebcSP "" ; set match2 ""
2919
2920
      #regsub -all {-} $input { } input
2921
      # fetch the html
2922
      set html [fetch_html $input 51]
2923
2924
      # give results an output header with result tally.
2925
      regexp -- {<h1>(?!No).*?\((.+?)\s(.+?)\)} $html - match match2
2926
      # format output according to variables.
2927
      if {$incith::google::total_results != 0} {
2928
        set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $match2]]${::incith::google::total_demodes}${incith::google::seperator}"
2929
        if {$incith::google::bold_descriptions == 0} {
2930
          regsub -all -- "\002" $output {} output
2931
        }
2932
      }
2933
      regsub {<tr.*?>(.+?)</tr>} $html "" html
2934
2935
      # parse the html
2936
      while {$results < $incith::google::mininova_results && $match != ""} {
2937
        # this could break any second, its cumbersome and long..i know, but for now it works.
2938
        regexp -nocase {<tr.*?>(.+?)</tr>} $html - htm
2939
        regsub {<tr.*?>(.+?)</tr>} $html "" html
2940
        regexp -nocase {<td>(.+?)</td><td><a href="/cat.+?>(.+?)</a>.+?<a href="/get/(.*?)".+?">.+?<a href="/tor.+?">(.+?)</a>} $htm - ebcU ebcI ebcBid ebcPR
2941
        regexp -nocase {<td align="right">(.+?)</td><td align="right">(.+?)</td><td align="right">(.+?)</td>} $htm - ebcShpNew ebcTim ebcCheck
2942
        regexp -nocase {title="Tracker URL: (.+?)"} $htm - ebcSP
2943
        if {$ebcSP != ""} {
2944
          set ebcSP "\037${ebcSP}\037 "
2945
        }
2946
        # keep torrent name from becoming too lengthy
2947
        if {[info exists ebcPR]} {
2948
          set ebcPR [string range $ebcPR 0 [expr $incith::google::description_length - 1]]
2949
          set ebcPR [string trim $ebcPR]
2950
        }
2951
 
2952
        # check results are more than 0, return or stop looping, depending
2953
        if {$match < 1 } {
2954
          if {$results == 0} {
2955
            regexp -nocase {<h1>(.+?)</h1>} $html - reply
2956
            if {![regexp -nocase {</h1><p>(.+?)</p>} $html - reply2]} { set reply2 "" } {
2957
              if {![string match *Didn't* $reply2]} { regsub -all -- {<(.+?)>} $reply2 "" reply2 ; set reply2 ". $reply2" } { set reply2 "" }
2958
            }
2959
            regsub -all -- {<(.+?)>} $reply "" reply
2960
            return "$::incith::google::desc_modes$reply$reply2$::incith::google::desc_demodes"
2961
          } else {
2962
            break
2963
          }
2964
        }
2965
2966
        # make the link valid because we were only given a partial href result, not a full url
2967
        set link "http://mininova.org/get/${ebcBid}"
2968
2969
        # prevent duplicate results is mostly useless here, but will at least
2970
        # ensure that we don't get the exact same article.
2971
        if {[string match "*$link*" $output] == 1} {
2972
          break
2973
        }
2974
2975
        # fix up our variables so the output looks purdy.
2976
        set desc "${ebcU}/${ebcI} ${ebcSP}\002${ebcPR}\002 (${ebcShpNew}, ${ebcTim}s, ${ebcCheck}p)"
2977
2978
        if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
2979
        if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" }
2980
2981
        # add the search result
2982
        if {$incith::google::link_only == 1} { 
2983
          append output "${link}${incith::google::seperator}"
2984
        } else {
2985
          append output "$desc$::incith::google::break${link}${incith::google::seperator}"
2986
        }
2987
2988
        # increase the results, clear the variables for the next loop just in case
2989
        unset link ; set ebcCheck "" ; set ebcU "" ; set ebcSP ""
2990
        incr results
2991
      }
2992
2993
      # make sure we have something to send
2994
      if {$match == ""} {
2995
        regexp -nocase {<h1>(.+?)</h1>} $html - reply
2996
        if {![regexp -nocase {</h1><p>(.+?)</p>} $html - reply2]} { set reply2 "" } {
2997
          if {![string match *Didn't* $reply2]} { regsub -all -- {<(.+?)>} $reply2 "" reply2 ; set reply2 ". $reply2" } { set reply2 "" }
2998
        }
2999
        regsub -all -- {<(.+?)>} $reply "" reply
3000
        return "$::incith::google::desc_modes$reply$reply2$::incith::google::desc_demodes"
3001
      }
3002
3003
      regsub -all -- " " $input "+" input
3004
      append output "www.mininova.org/search/${input}/seeds"
3005
      #append output "www.mininova.org/search/?search=${input}"
3006
      return $output
3007
    }
3008
3009
    # DAILYMOTION
3010
    # fetches links to video with search data in it (dailymotion.com)
3011
    # -speechless supplied
3012
    #
3013
    proc dailymotion {input} {
3014
3015
      ; set results 0 ; set output "" ; set titem ""
3016
3017
      # this isn't global, so we need to keep ctry (country) here
3018
      regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titem dummy
3019
      if {$titem == ""} {
3020
        set titem "${incith::google::daily_country}" 
3021
      }
3022
3023
      # fetch the html
3024
      set html [fetch_html $input 14]
3025
3026
      # user input causing errors?
3027
	if {[string match -nocase "*socketerrorabort*" $html]} {
3028
            regsub {(.+?)\|} $html {} html
3029
            return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" 
3030
	}
3031
	if {[string match -nocase "*timeouterrorabort*" $html]} {
3032
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
3033
	}
3034
3035
      if {[regexp -- {<div class="dmco_text foreground2">(.*?)</div>} $html - nope]} {
3036
        regsub -all -- {</a>} $nope "." nope
3037
        regsub -all -- {<br/>} $nope " " nope
3038
        regsub -all -- {<.*?>} $nope "" nope
3039
        set reply "${::incith::google::desc_modes}$nope$::incith::google::desc_demodes"
3040
        return $reply
3041
      }
3042
3043
      set output "DailyMotion${incith::google::seperator}"
3044
      if {$incith::google::bold_descriptions != 0} {
3045
        set output "$::incith::google::total_modes\002DailyMotion\002$::incith::google::total_demodes${incith::google::seperator}"
3046
      }
3047
      # parse the html
3048
      while {$results < $incith::google::daily_results} {
3049
        # somewhat extenuated regexp due to allowing that there might be an image next to the title
3050
        regexp -nocase -- {<div class="dmco_text duration">(.*?)<.*?<a class=.+?href=.*?/video/(.*?)_.*?">(.*?)<.*?<div class="dmpi_video_description foreground.*?>.*?<div>(.*?)<} $html - snatch cid desc vote
3051
        regsub -nocase -- {<div class="dmco_text duration">.*?<h4 class="dmco_title.*?>.*?<a class=.+?href=.*?/video/.+?_.*?">.*?div class="dmco_date">(.*?)<} $html "" html
3052
3053
        # if there's no desc, return or stop looping, depending
3054
        if {[info exists desc] == 0} {
3055
          if {$results == 0} {
3056
            set reply "Sorry, no search results were found."
3057
            return "${::incith::google::desc_modes}$reply$::incith::google::desc_demodes"
3058
          } else {
3059
            break
3060
          }
3061
        }
3062
        set desc [string trim [string range $desc 0 [expr $incith::google::description_length - 1]]]
3063
        set vote [string trim [string range $vote 0 [expr $incith::google::description_length - 1]]]
3064
        set desc "${desc} (${snatch}) ([string trim $vote])"
3065
3066
        # make the link valid because we were only given a partial href result, not a full url
3067
        set link "http://www.dailymotion.com/${titem}/video/${cid}"
3068
3069
        # prevent duplicate results is mostly useless here, but will at least
3070
        #   ensure that we don't get the exact same article.
3071
        if {[string match "*$link*" $output] == 1} {
3072
         break
3073
        }
3074
3075
        if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
3076
        if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" }
3077
3078
        # add the search result
3079
        if {$incith::google::link_only == 1} { 
3080
          append output "${link}${incith::google::seperator}"
3081
        } else {
3082
          append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}"
3083
        }
3084
3085
        # increase the results, clear the variables for the next loop just in case
3086
        unset link; unset desc ; unset cid
3087
        incr results
3088
      }
3089
3090
      # make sure we have something to send
3091
      if {[info exists output] == 0} {
3092
        set reply "Sorry, no search results were found."
3093
        return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
3094
      }
3095
      return $output
3096
    }
3097
3098
    # GAMEFAQS
3099
    # fetches upcoming game list variable by system and region (gamefaqs.com)
3100
    # this is far better than any gamefaqs procedure you've seen before, this is looooong, but very simple
3101
    # in it's approach. I learned alot coding it.
3102
    # -speechless supplied
3103
    #
3104
    proc gamefaqs {system region} {
3105
3106
      ; set results 0 ; set output "" ; set html "" ; set match 0 ; set game "" ; set date ""
3107
3108
      # strip excessive spaces from region and system desired.
3109
      regsub -all " " $system "" system
3110
      regsub -all " " $region "" region
3111
3112
      # this is where most of the work is done
3113
      # parsing systems and regions to create an output header
3114
      # and cut the html down to the specified region
3115
3116
      if {[string match -nocase "nds" $system] == 1} {
3117
        if {[string match -nocase "usa" $region] == 1} {
3118
          set html [fetch_html "/region-1" 15]
3119
          set output "\002NDS North America (USA)\002"
3120
        }
3121
        if {[string match -nocase "jap" $region] == 1} {
3122
          set html [fetch_html "/region-2" 15]
3123
          set output "\002NDS Asia (JAPAN)\002"         
3124
        }
3125
        if {[string match -nocase "eur" $region] == 1} {
3126
          set html [fetch_html "/region-3" 15] 
3127
          set output "\002NDS Europe (UK)\002"
3128
        }
3129
        if {[string match -nocase "aus" $region] == 1} {
3130
          set html [fetch_html "/region-4" 15]
3131
          set output "\002NDS Australia (AUS)\002"
3132
        }
3133
      }
3134
3135
      if {[string match -nocase "3ds" $system] == 1} {
3136
        if {[string match -nocase "usa" $region] == 1} {
3137
          set html [fetch_html "/region-1" 56]
3138
          set output "\0023DS North America (USA)\002"
3139
        }
3140
        if {[string match -nocase "jap" $region] == 1} {
3141
          set html [fetch_html "/region-2" 56]
3142
          set output "\0023DS Asia (JAPAN)\002"         
3143
        }
3144
        if {[string match -nocase "eur" $region] == 1} {
3145
          set html [fetch_html "/region-3" 56] 
3146
          set output "\0023DS Europe (UK)\002"
3147
        }
3148
        if {[string match -nocase "aus" $region] == 1} {
3149
          set html [fetch_html "/region-4" 56]
3150
          set output "\002NDS Australia (AUS)\002"
3151
        }
3152
      }
3153
3154
      if {[string match -nocase "iphone" $system] == 1} {
3155
        if {[string match -nocase "usa" $region] == 1} {
3156
          set html [fetch_html "/region-1" 16]  
3157
          set output "\002iPhone North America (USA)\002"
3158
        }
3159
        if {[string match -nocase "jap" $region] == 1} {
3160
          set html [fetch_html "/region-2" 16]
3161
          set output "\002iPhone Asia (JAPAN)\002"
3162
        }
3163
        if {[string match -nocase "eur" $region] == 1} {
3164
          set html [fetch_html "/region-3" 16]
3165
          set output "\002iPhone Europe (UK)\002"
3166
        }
3167
        if {[string match -nocase "aus" $region] == 1} {
3168
          set html [fetch_html "/region-4" 16]
3169
          set output "\002iPhone Australia (AUS)\002"
3170
        }
3171
      }
3172
3173
      if {[string match -nocase "psp" $system] == 1} {
3174
        if {[string match -nocase "usa" $region] == 1} {
3175
          set html [fetch_html "/region-1" 17]
3176
          set output "\002PSP North America (USA)\002"
3177
        }
3178
        if {[string match -nocase "jap" $region] == 1} {
3179
          set html [fetch_html "/region-2" 17]
3180
          set output "\002PSP Asia (JAPAN)\002"
3181
        }
3182
        if {[string match -nocase "eur" $region] == 1} {
3183
          set html [fetch_html "/region-3" 17]
3184
          set output "\002PSP Europe (UK)\002"
3185
        }
3186
        if {[string match -nocase "aus" $region] == 1} {
3187
          set html [fetch_html "/region-4" 17]
3188
          set output "\002PSP Australia (AUS)\002"
3189
        }
3190
      }
3191
3192
      if {[string match -nocase "x360" $system] == 1} {
3193
        if {[string match -nocase "usa" $region] == 1} {
3194
          set html [fetch_html "/region-1" 18]
3195
          set output "\002XBOX360 North America (USA)\002"
3196
        }
3197
        if {[string match -nocase "jap" $region] == 1} {
3198
          set html [fetch_html "/region-2" 18]
3199
          set output "\002XBOX360 Asia (JAPAN)\002"
3200
        }
3201
        if {[string match -nocase "eur" $region] == 1} {
3202
          set html [fetch_html "/region-3" 18]    
3203
          set output "\002XBOX360 Europe (UK)\002"
3204
        }
3205
        if {[string match -nocase "aus" $region] == 1} {
3206
          set html [fetch_html "/region-4" 18]
3207
          set output "\002XBOX360 Australia (AUS)\002"
3208
        }
3209
      }
3210
3211
      if {[string match -nocase "xbox" $system] == 1} {
3212
        if {[string match -nocase "usa" $region] == 1} {
3213
          set html [fetch_html "/region-1" 19]
3214
          set output "\002XBOX North America (USA)\002"
3215
        }
3216
        if {[string match -nocase "jap" $region] == 1} {
3217
          set html [fetch_html "/region-2" 19]
3218
          set output "\002XBOX Asia (JAPAN)\002"
3219
        }
3220
        if {[string match -nocase "eur" $region] == 1} {
3221
          set html [fetch_html "/region-3" 19]   
3222
          set output "\002XBOX Europe (UK)\002"
3223
        }
3224
        if {[string match -nocase "aus" $region] == 1} {
3225
          set html [fetch_html "/region-4" 19]
3226
          set output "\002XBOX Australia (AUS)\002"
3227
        }
3228
      }
3229
3230
      if {[string match -nocase "gc" $system] == 1} {
3231
        if {[string match -nocase "usa" $region] == 1} {
3232
          set html [fetch_html "/region-1" 20]
3233
          set output "\002GAMECUBE North America (USA)\002"
3234
        }
3235
        if {[string match -nocase "jap" $region] == 1} {
3236
          set html [fetch_html "/region-2" 20]
3237
          set output "\002GAMECUBE Asia (JAPAN)\002"
3238
        }
3239
        if {[string match -nocase "eur" $region] == 1} {
3240
          set html [fetch_html "/region-3" 20]
3241
          set output "\002GAMECUBE Europe (UK)\002"
3242
        }
3243
        if {[string match -nocase "aus" $region] == 1} {
3244
          set html [fetch_html "/region-4" 20]
3245
          set output "\002GAMECUBE Australia (AUS)\002"
3246
        }
3247
      }
3248
3249
      if {[string match -nocase "ps2" $system] == 1} {
3250
        if {[string match -nocase "usa" $region] == 1} {
3251
          set html [fetch_html "/region-1" 21]
3252
          set output "\002PS2 North America (USA)\002"
3253
        }
3254
        if {[string match -nocase "jap" $region] == 1} {
3255
          set html [fetch_html "/region-2" 21]
3256
          set output "\002PS2 Asia (JAPAN)\002"
3257
        }
3258
        if {[string match -nocase "eur" $region] == 1} {
3259
          set html [fetch_html "/region-3" 21] 
3260
          set output "\002PS2 Europe (UK)\002"
3261
        }
3262
        if {[string match -nocase "aus" $region] == 1} {
3263
          set html [fetch_html "/region-4" 21]
3264
          set output "\002PS2 Australia (AUS)\002"
3265
        }
3266
      }
3267
3268
      if {[string match -nocase "pc" $system] == 1} {
3269
        if {[string match -nocase "usa" $region] == 1} {
3270
          set html [fetch_html "/region-1" 22]
3271
          set output "\002PC North America (USA)\002"
3272
        }
3273
        if {[string match -nocase "jap" $region] == 1} {
3274
          set html [fetch_html "/region-2" 22]
3275
          set output "\002PC Asia (JAPAN)\002"
3276
        }
3277
        if {[string match -nocase "eur" $region] == 1} {
3278
          set html [fetch_html "/region-3" 22]
3279
          set output "\002PC Europe (UK)\002"
3280
        }
3281
        if {[string match -nocase "aus" $region] == 1} {
3282
          set html [fetch_html "/region-4" 22]
3283
          set output "\002PC Australia (AUS)\002"
3284
        }
3285
      }
3286
3287
      if {[string match -nocase "ps3" $system] == 1} {
3288
        if {[string match -nocase "usa" $region] == 1} {
3289
          set html [fetch_html "/region-1" 23]
3290
          set output "\002PS3 North America (USA)\002"
3291
        }
3292
        if {[string match -nocase "jap" $region] == 1} {
3293
          set html [fetch_html "/region-2" 23]
3294
          set output "\002PS3 Asia (JAPAN)\002"
3295
        }
3296
        if {[string match -nocase "eur" $region] == 1} {
3297
          set html [fetch_html "/region-3" 23]
3298
          set output "\002PS3 Europe (UK)\002"
3299
        }
3300
        if {[string match -nocase "aus" $region] == 1} {
3301
          set html [fetch_html "/region-4" 23]
3302
          set output "\002PS3 Australia (AUS)\002"
3303
        }
3304
      }
3305
3306
      if {[string match -nocase "wii" $system] == 1} {
3307
        if {[string match -nocase "usa" $region] == 1} {
3308
          set html [fetch_html "/region-1" 28]
3309
          set output "\002Wii North America (USA)\002"
3310
        }
3311
        if {[string match -nocase "jap" $region] == 1} {
3312
          set html [fetch_html "/region-2" 28]
3313
          set output "\002Wii Asia (JAPAN)\002"
3314
        }
3315
        if {[string match -nocase "eur" $region] == 1} {
3316
          set html [fetch_html "/region-3" 28]
3317
          set output "\002Wii Europe (UK)\002"
3318
        }
3319
        if {[string match -nocase "aus" $region] == 1} {
3320
          set html [fetch_html "/region-4" 28]
3321
          set output "\002Wii Australia (AUS)\002"
3322
        }
3323
      }
3324
3325
      if {[string match -nocase "dc" $system] == 1} {
3326
        if {[string match -nocase "jap" $region] == 1} {
3327
          set html [fetch_html "/region-2" 29]
3328
          set output "\002Dreamcast Asia (JAPAN)\002"
3329
        }
3330
      }
3331
3332
      if {[string match -nocase "mac" $system] == 1} {
3333
        if {[string match -nocase "usa" $region] == 1} {
3334
          set html [fetch_html "/region-1" 59]
3335
          set output "\002MAC America (USA)\002"
3336
        }
3337
        if {[string match -nocase "jap" $region] == 1} {
3338
          set html [fetch_html "/region-2" 59]
3339
          set output "\002MAC Asia (JAPAN)\002"         
3340
        }
3341
        if {[string match -nocase "eur" $region] == 1} {
3342
          set html [fetch_html "/region-3" 59] 
3343
          set output "\002MAC Europe (UK)\002"
3344
        }
3345
        if {[string match -nocase "aus" $region] == 1} {
3346
          set html [fetch_html "/region-4" 59]
3347
          set output "\002MAC Australia (AUS)\002"
3348
        }
3349
      }
3350
3351
      if {[string length $output]} {
3352
        set output "$::incith::google::total_modes$output$::incith::google::total_demodes"
3353
      }
3354
      # remove the bold if it isn't desired.
3355
      if {$incith::google::bold_descriptions == 0} {
3356
        regsub -all -- "\002" $output {} output
3357
      }
3358
3359
      # parse for results and loop until desired amount of results
3360
      # is attempted to be reached if possible.
3361
      while {$results < $incith::google::gamefaq_results && $output != ""} {
3362
3363
        # grab date and game title and clear future html of it for looping
3364
        regexp -nocase {<tr.*?td>(.*?)<.+?td>.*?<td><a.+?href.+?title.+?"(.+?)">.+?<.+?a><.+?td>} $html {} date game
3365
        regsub {<tr.*?td>(.+?)<.+?a><.+?td>} $html "" html
3366
3367
        # add the search result
3368
        # if there is a date, add date in bold and game to $output
3369
        if {[string len $date] > 3} {
3370
          if {$incith::google::bold_descriptions == 0} {
3371
            append output "${incith::google::seperator}$::incith::google::desc_modes${date} ${game}$::incith::google::desc_demodes"
3372
          } else {
3373
            append output "${incith::google::seperator}$::incith::google::desc_modes\002${date}\002 ${game}$::incith::google::desc_demodes"
3374
          }
3375
        # otherwise just add name of game
3376
        } elseif {[string len $game] > 1}  {
3377
          append output "${incith::google::split_char}$::incith::google::desc_modes${game}$::incith::google::desc_demodes"
3378
          #append output ",${game}"
3379
        }
3380
3381
        # increase the results, clear the variables for the next loop just in case
3382
        incr results
3383
        ; set date "" ; set game ""    
3384
      }
3385
3386
      # if we have nothing to send, we have no results :(
3387
      if {$output == ""} {
3388
        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"
3389
      }
3390
      return $output
3391
    }
3392
3393
    # BLOGSEARCH
3394
    # fetches the news from blogsearch.google.
3395
    # -madwoota supplied (uses news.google engine), speechless updated
3396
    #
3397
    proc blog {input} {
3398
      ; set results 0 ; set output "" ; set match "" ; set titem "" ; set no_search "" ; set did_you_mean ""
3399
3400
      # fetch the html
3401
      set html [fetch_html $input 24]
3402
3403
      # user input causing errors?
3404
	if {[string match -nocase "*socketerrorabort*" $html]} {
3405
            regsub {(.+?)\|} $html {} html
3406
            return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" 
3407
	}
3408
	if {[string match -nocase "*timeouterrorabort*" $html]} {
3409
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
3410
	}
3411
      # strip out 'did you mean?' first
3412
      # what do we call 'no search results in any language?'
3413
      regexp -- {<p></p></div></div><div id=f>(.+?)<br><br>} $html - no_search
3414
      if {$no_search != ""} {
3415
        regsub -- {</a>} $no_search "? " no_search
3416
        regsub -all -- {<(.+?)>} $no_search { } no_search
3417
        while {[string match "*  *" $no_search]} {
3418
          regsub -all -- {  } $no_search " " no_search
3419
        }
3420
        set no_search [string trim $no_search]
3421
      }
3422
3423
      # give results an output header with result tally.
3424
      regexp -- {</td><td align=right class=rsb>(.+?)\s\002(.+?)\(\002} $html - titem match
3425
      if {![regexp -- {1\002\s-\s\002.+?\002.+?\002(.+?)\002} $match - match]} {
3426
         set match "Google"
3427
         set titem ""
3428
      }
3429
      regsub -all -- {<(.+?)>} $match {} match
3430
      # format output according to variables.
3431
      if {$incith::google::total_results != 0 && $match > 0} {
3432
        set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}"
3433
        if {$incith::google::bold_descriptions == 0} {
3434
          regsub -all -- "\002" $output {} output
3435
        }
3436
      }
3437
3438
      # parse the html
3439
      while {$results < $incith::google::news_results} {
3440
        # somewhat extenuated regexp due to allowing that there *might* be
3441
        # an image next to the story
3442
        regexp -- {</p><a href="(.+?)".+?id=.+?">(.+?)</a>.+?<td class=j>(.+?)<br>} $html {} link desc time
3443
        regsub -- {</p><a href=(.+?)</a>} $html {} html
3444
3445
        # if there's no desc, return or stop looping, depending
3446
        if {[info exists desc] == 0} {
3447
          if {$results == 0} {
3448
            set reply $no_search
3449
            return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
3450
          } else {
3451
            break
3452
          }
3453
        }
3454
        # clean up desc
3455
        if {[info exists desc] == 1 && $incith::google::description_length > 0} {
3456
          set desc [string range $desc 0 [expr $incith::google::description_length - 1]]
3457
          set desc "[descdecode [string trim $desc]] ([descdecode [string trim $time]])"
3458
        }
3459
        # prevent duplicate results is mostly useless here, but will at least
3460
        # ensure that we don't get the exact same article.
3461
        if {[string match "*$link*" $output] == 1} {
3462
          break
3463
        }
3464
3465
        if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
3466
        if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" }
3467
3468
        # add the search result
3469
        if {$incith::google::link_only == 1} { 
3470
          append output "${link}${incith::google::seperator}"
3471
        } else {
3472
          append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}"
3473
        }
3474
3475
        # increase the results, clear the variables for the next loop just in case
3476
        unset link; unset desc
3477
        incr results
3478
      }
3479
3480
      # make sure we have something to send
3481
      if {$match == ""} {
3482
        set reply $no_search
3483
        return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
3484
      }
3485
      return $output
3486
    }
3487
3488
    # SCHOLAR SEARCH
3489
    # fetches the news from scholar.google.
3490
    # -madwoota supplied (uses news.google engine), speechless updated
3491
    #
3492
    proc scholar {input} {
3493
      ; set results 0 ; set output "" ; set match "" ; set titem "" ; set no_search "" ; set did_you_mean "" ; set titen ""
3494
3495
      # this isn't global, so we need to keep ctry (country) here
3496
      regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titen dummy
3497
      if {$titen == ""} {
3498
        set titen "${incith::google::google_country}" 
3499
      }
3500
3501
      # fetch the html
3502
      set html [fetch_html $input 10]
3503
3504
      # user input causing errors?
3505
	if {[string match -nocase "*socketerrorabort*" $html]} {
3506
            regsub {(.+?)\|} $html {} html
3507
            return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" 
3508
	}
3509
	if {[string match -nocase "*timeouterrorabort*" $html]} {
3510
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
3511
	}
3512
      # strip out 'did you mean?' first
3513
      # what do we call 'no search results in any language?'
3514
      if {![regexp -- {</script><p>(.+?)\.<br>} $html - no_search]} {
3515
        regexp -- {</script><br><br>(.+?)<br><br>} $html - no_search
3516
      }
3517
      if {$no_search != ""} {
3518
        regsub -- {</a>} $no_search "? " no_search
3519
        regsub -all -- {<(.*?)>} $no_search { } no_search
3520
        while {[string match "*  *" $no_search]} {
3521
          regsub -all -- {  } $no_search " " no_search
3522
        }
3523
        set no_search [string trim $no_search]
3524
      }
3525
3526
      # give results an output header with result tally.
3527
      regexp -- {align=right nowrap>(.+?)\s\002(.+?)\(\002} $html - titem match
3528
      if {![regexp -- {1\002\s-\s\002.+?\002.+?\002(.+?)\002} $match - match]} {
3529
         set match "Google"
3530
         set titem ""
3531
      }
3532
      regsub -all -- {<(.+?)>} $match {} match
3533
      # format output according to variables.
3534
      if {$incith::google::total_results != 0 && $match > 0} {
3535
        set output "${::incith::google::total_modes}\002[string trim ${match}]\002 [descdecode [string trim $titem]]${::incith::google::total_demodes}${incith::google::seperator}"
3536
        if {$incith::google::bold_descriptions == 0} {
3537
          regsub -all -- "\002" $output {} output
3538
        }
3539
      }
3540
3541
      # parse the html
3542
      while {$results < $incith::google::news_results} {
3543
        # somewhat extenuated regexp due to allowing that there *might* be
3544
        # an image next to the story
3545
        if {[regexp -- {<p class=g><h3 class="r">(.+?)   } $html - ps]} {
3546
          regsub -- {<p class=g><h3 class="r">(.+?)   } $html {} html
3547
          if {![regexp -- {<a href="(.+?)" onmousedown} $ps - link]} { set link "none" } { regsub {<a href="(.+?)" onmousedown.*?>} $ps "" ps }
3548
          if {[regexp -- {(.+?)</h3>.*?<br>(.*?)<br>} $ps - desc time]} { regsub {</a>} $desc "" desc }
3549
        }
3550
3551
        # if there's no desc, return or stop looping, depending
3552
        if {[info exists desc] == 0} {
3553
          if {$results == 0} {
3554
            set reply $no_search
3555
            return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
3556
          } else {
3557
            break
3558
          }
3559
        }
3560
        # clean up desc
3561
        if {[info exists desc] == 1 && $incith::google::description_length > 0} {
3562
          set desc [string range $desc 0 [expr $incith::google::description_length - 1]]
3563
          set desc "[string trim $desc] ([string trim $time])"
3564
        }
3565
        # prevent duplicate results is mostly useless here, but will at least
3566
        # ensure that we don't get the exact same article.
3567
        if {[string match "*$link*" $output] == 1} {
3568
          break
3569
        }
3570
3571
        if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
3572
        if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" }
3573
3574
        # add the search result
3575
        if {$incith::google::link_only == 1} { 
3576
          append output "${link}${incith::google::seperator}"
3577
        } else {
3578
          if {![string equal $link "none"]} {
3579
            if {![string match "http*" $link]} { set link "http://scholar.google.${titen}/$link" }
3580
            append output "[descdecode $desc]$::incith::google::break${link}${incith::google::seperator}"
3581
          } else {
3582
            append output "[descdecode $desc]${incith::google::seperator}"
3583
          }
3584
        }
3585
3586
        # increase the results, clear the variables for the next loop just in case
3587
        unset link; unset desc
3588
        incr results
3589
      }
3590
3591
      # make sure we have something to send
3592
      if {$match == ""} {
3593
        set reply $no_search
3594
        return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
3595
      }
3596
      return $output
3597
    }
3598
3599
3600
    # WIKI
3601
    # fetches wiki info from *.wikipedia.org
3602
    # -speechless supplied
3603
    #
3604
    proc wiki {input} {
3605
      global incithcharset
3606
      ; set output "" ; set ded "" ; set match "" ; set redir "" ; set country "" ; set dec ""
3607
      ; set query "" ; set titem "" ; set ebcPR "" ; set results "" ; set tresult "" ; set red 0
3608
      ; set subtag "" ; set region "" ; set regional ""
3609
3610
      # make it so people can search their country
3611
      regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - country input
3612
      if {$country == ""} {
3613
        set country "${incith::google::wiki_country}"
3614
      }
3615
      regexp -nocase -- {(.*)\@(.*)} $country - country region
3616
3617
      # this is my input encoding hack, this will convert input before it goes
3618
      # out to be queried.
3619
      if {$incith::google::encoding_conversion_input > 0 && $region != ""} {
3620
        set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "${region}:*"]] :] 1]
3621
      } elseif {$incith::google::encoding_conversion_input > 0 && $country != ""} {
3622
        set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "${country}:*"]] :] 1]
3623
      } else { set encoding_found "" }
3624
      if {$encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} {
3625
        set input [encoding convertfrom $encoding_found $input]
3626
      }
3627
      regsub -all -- {_} $input { } input
3628
      regexp -- {^(.+?)\#(.+?)$} $input - input results
3629
      regsub -all -- {_} $results { } results
3630
      set input [urlencode $input 0 "utf-8"]
3631
      set results [string map {.20 _} [urlencode [string trim $results] 1 "utf-8"]]
3632
3633
# 1st load of webpage - this is the only part which has error control
3634
# this is where we load the search page to find an exact match or most relevant.
3635
# we will also be able to detect bad user input in the form of socket errors.
3636
3637
      # beware, changing the useragent will result in differently formatted html from Google.
3638
      set query "http://${country}.wikipedia.org/wiki/index.php?title=Special%3ASearch&search=${input}&fulltext=Search"
3639
      set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e"
3640
      set http [::http::config -useragent $ua -urlencoding "utf-8"]
3641
      # stole this bit from rosc2112 on egghelp forums
3642
      # borrowed is a better term, all procs eventually need this error handler.
3643
	catch {set http [::http::geturl "$query" -headers $::incith_hdr -timeout [expr 1000 * 5]]} error
3644
3645
	if {[string match -nocase "*couldn't open socket*" $error]} {
3646
		return "${::incith::google::error_modes}Socket Error accessing '${country}.wikipedia.org' .. Does it exist?${::incith::google::error_demodes}" 
3647
	}
3648
	if { [::http::status $http] == "timeout" } {
3649
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
3650
	}
3651
3652
      # CHECK CHECK
3653
      upvar #0 $http state
3654
      set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)]
3655
      set html [ungzip [::http::data $http] $state(meta)]
3656
      set redir [::http::ncode $http]
3657
      # REDIRECT
3658
      if {[string match "*${redir}*" "302|301" ]} {
3659
        foreach {name value} $state(meta) {
3660
	    if {[regexp -nocase ^location$ $name]} {
3661
	      catch {set http [::http::geturl "$value" -query "" -headers $::incith_hdr -timeout [expr 1000 * 10]]} error
3662
            if { $::incith::google::debug > 0 } { putserv "privmsg $::incith::google::debugnick :\002redirected:\002 $query -> $value" }
3663
	      if {[string match -nocase "*couldn't open socket*" $error]} {
3664
              return "${::incith::google::error_modes}Socket Error accessing '${country}.wikipedia.org' .. Does it exist?${::incith::google::error_demodes}" 
3665
	      }
3666
	      if { [::http::status $http] == "timeout" } {
3667
		  return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
3668
	      }
3669
            upvar #0 $http state
3670
            set html [ungzip [::http::data $http] $state(meta)]
3671
            set query $value
3672
	    }
3673
        } 
3674
      }
3675
      ::http::cleanup $http
3676
     
3677
      # generic pre-parsing
3678
      regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html
3679
      regsub -all -nocase {<font.+?>} $html "" html
3680
      regsub -all -nocase {</font>} $html "" html
3681
      regsub -all -nocase {<input.+?>} $html "" html
3682
      regsub -all -nocase {(?:<i>|</i>)} $html "" html
3683
      regsub -all "\t" $html " " html
3684
      regsub -all "\n" $html " " html
3685
      regsub -all "\r" $html " " html
3686
      regsub -all "\v" $html " " html
3687
      regsub -all "</li>" $html ". " html
3688
      regsub -all ";;>" $html "" html
3689
      regsub {<div class="floating_object".*?>.*?</div>} $html "" html
3690
3691
      if {$html == ""} { return "$::incith::google::error_modes\002Wikipedia Error:\002 No html to parse.$::incith::google::error_demodes" }
3692
3693
      # see if our direct result is available and if so, lets take it
3694
      if {![regexp -- {<div id="contentSub"><p>.*?<a href="(.+?)".*?title} $html - match]} {
3695
        if {![regexp -- {<div class=.searchresults.><p>*?<a href="(.+?)".*?title} $html - match]} {
3696
          regexp -- {<div class=.searchresults.><p class="mw-search.*?>.*?<a href="(.+?)".*?title} $html - match
3697
        }
3698
      }
3699
      putserv "privmsg speechles :match $match"
3700
      if {[string match -nocase "*action=edit*" $match]} { set match "" }
3701
      # otherwise we only care about top result
3702
      if {$match == ""} {
3703
        if {![regexp -- {<li><a href="((?!http).+?)"} $html - match]} {
3704
          if {![regexp -- {<li style.*?><a href="(.+?)"} $html - match]} {
3705
            if {![regexp -- {<div class='searchresults'>.*?<a href="(.*?)".*?class="mw-redirect">} $html - match]} {
3706
              if {[regexp -- {<li><div class='mw-search-result-heading'>(.*?)</div>} $html - slice]} {
3707
		    if {![regexp -- {<span class='searchalttitle'>.*?<a href="(.*?)"} $slice - match]} {
3708
		      regexp -- {<a href="(.*?)"} $slice - match
3709
                }
3710
              }
3711
            }
3712
          }
3713
        }
3714
      }
3715
      #if {[string match "http://*" $match]} { set match "" }
3716
      if {[string match -nocase "*/wiki*" $country]} {
3717
        regsub -- {/wiki} $country {} country
3718
      }
3719
      # DEBUG DEBUG                    
3720
      set junk [open "ig-debug.txt" w]
3721
      puts $junk $html
3722
      close $junk
3723
3724
      # at this point we can tell if there was any match, so let's not even bother
3725
      # going further if there wasn't a match, this pulls the 'no search etc' found.
3726
      # this can be in any language.
3727
      if {$match == ""} {
3728
        # these are for 'no search results' or similar message
3729
        # these can be in any language.
3730
        if {[regexp -- {<div class='searchresults'>(.+?)</p>} $html - match]} {
3731
          regsub -all {(?:<b>|</b>|<em>|</em>)} $match "\002" match
3732
          regsub -- {<a href="/wiki/Special\:Allpages.*?</a>} $match "." match
3733
          regsub -all {<div id.*?>} $match "" match
3734
          regsub -- {</a></div>} $match "?" match
3735
          regsub -all {</div>} $match "" match
3736
          regsub -all {\[Index\]} $match "" match
3737
          regsub -all {<span.*?/span>} $match "" match
3738
          regsub -all {<script type.*?</script>} $match "" match
3739
          regsub -all { \(<.*?>\)} $match ". " match
3740
          if {[string match "*<!--*" $match]} {
3741
            regexp -- {<li class="normal">.*?</p><p>(.*?)</p>} $html - match
3742
          }
3743
        } else {
3744
          if {[regexp -- {<div id='search results'><p class="mw-search.*?>(.*?)</p>} $html - match]} {
3745
            regsub -all {(?:<b>|</b>|<em>|</em>)} $match "\002" match
3746
          }
3747
        }
3748
3749
        if {$match == ""} {
3750
          if {[regexp -nocase -- {<div class='searchresults'>(.*?)<div class="printfooter">} $html - match]} {
3751
            regsub -all {<p>} $match " " match
3752
            regsub -all {(?:<b>|</b>|<em>|</em>)} $match "\002" match
3753
            regsub -- {<a href="/wiki/Special\:Allpages.*?</a>} $match "." match
3754
            regsub -all {<div id.*?>} $match "" match
3755
            regsub -- {</a></div>} $match "?" match
3756
            regsub -all {</div>} $match "" match
3757
            regsub -all {\[Index\]} $match "" match
3758
            regsub -all {<span.*?/span>} $match "" match
3759
            regsub -all {<script type.*?</script>} $match "" match
3760
            regsub -all { \(<.*?>\)} $match ". " match
3761
          }
3762
        }
3763
        # this is our last error catch, this can grab the
3764
        # 'wikimedia cannot search at this time' message
3765
        # this can be in any language.
3766
        if {[string len $match] < 3} { regexp -- {<center><b>(.+?)</b>} $html - match }
3767
        if {$match == ""} {
3768
          regsub -all -- { } $results {_} results
3769
          if {$results != ""} { set results "#${results}" } 
3770
          return "$::incith::google::error_modes\002Wikimedia Error:\002 Unable to parse for: \002${input}\002 @ ${query}${results}$::incith::google::error_demodes"
3771
        }
3772
        # might be tags since we allowed any language here we cut them out
3773
        regsub -all -- {<(.+?)>} $match {} match
3774
        if {$region == ""} {
3775
          return "$::incith::google::desc_modes[utf8encodefix $country [descdecode ${match}]]$::incith::google::desc_demodes"
3776
        } else {
3777
          return "$::incith::google::desc_modes[utf8encodefix $region [descdecode ${match}]]$::incith::google::desc_demodes"
3778
        }
3779
      }
3780
3781
      # we assume here we found another page to traverse in our search.
3782
      if {$region != ""} {
3783
        regsub -- {/wiki/} $match "/$region/" match
3784
      }
3785
      if {![string match http://* $match]} { set query "http://${country}.wikipedia.org${match}" } { set query $match }
3786
3787
# 2nd load of webpage - this has no error checking what-so-ever
3788
# here is where we pluck the link to the exact match, or the most relevant 'top' link.
3789
# or in the case of redirects, to other pages, we will handle that here as well.
3790
3791
      # beware, changing the useragent will result in differently formatted html from Google.
3792
      set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e"
3793
      set http [::http::config -useragent $ua -urlencoding "utf-8"]
3794
      set http [::http::geturl "$query" -headers $::incith_hdr -timeout [expr 1000 * 5]]
3795
      upvar #0 $http state
3796
      set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)]
3797
      # this is the output encoding hack.
3798
      if {$incith::google::encoding_conversion_output > 0} {
3799
        if {$region != ""} {
3800
          set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$region:*"]] :] 1]
3801
        } else {
3802
          set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$country:*"]] :] 1]
3803
        }
3804
      }
3805
3806
      set html [ungzip [::http::data $http] $state(meta)]
3807
      if {$incith::google::debug > 0} {
3808
        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"
3809
      }
3810
      if {$encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} {
3811
        set ::incithcharset $encoding_found
3812
        set html [incithencode $html] 
3813
      }
3814
      ::http::cleanup $http
3815
      #correct the html, remove shitty tags
3816
      # generic pre-parsing
3817
      regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html
3818
      regsub -all -nocase {<font.+?>} $html "" html
3819
      regsub -all -nocase {</font>} $html "" html
3820
      regsub -all -nocase {<input.+?>} $html "" html
3821
      regsub -all -nocase {(?:<i>|</i>)} $html "" html
3822
      regsub -all "\t" $html " " html
3823
      regsub -all "\n" $html " " html
3824
      regsub -all "\r" $html " " html
3825
      regsub -all "\v" $html " " html
3826
      regsub -all "</li>" $html ". " html
3827
      regsub -all ";;>" $html "" html
3828
3829
      if {$incith::google::bold_descriptions > 0 && [string match "\002" $incith::google::desc_modes] != 1} {
3830
        regsub -all -nocase {(?:<b>|</b>)} $html "\002" html
3831
      }
3832
      set match ""
3833
3834
      # are we redirected to another page? if so, let's go there
3835
      regexp -- {alt="#REDIRECT ".+?<a href="(.+?)" title="} $html - match
3836
      if {$match != ""} {
3837
        incr red 1
3838
        set query "http://${country}.wikipedia.org${match}"
3839
3840
# 3rd load of webpage - this has no error checking what-so-ever
3841
# here is our final webpage, this is hopefully what the user was looking for.
3842
3843
        # beware, changing the useragent will result in differently formatted html from Google.
3844
        set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e"
3845
        set http [::http::config -useragent $ua -urlencoding "utf-8"]
3846
        set http [::http::geturl $query -headers $::incith_hdr -timeout [expr 1000 * 10]]
3847
        upvar #0 $http state
3848
3849
        set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)]
3850
        # this is the output encoding hack.
3851
        if {$incith::google::encoding_conversion_output > 0} {
3852
          if {$region != ""} {
3853
            set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$region:*"]] :] 1]
3854
          } else {
3855
            set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$country:*"]] :] 1]
3856
          }
3857
        } else { set ::incithcharset "" }
3858
3859
        set html [ungzip [::http::data $http] $state(meta)]
3860
        if {$incith::google::debug > 0} {
3861
          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"
3862
        }
3863
        if {$encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} {
3864
          set ::incithcharset $encoding_found
3865
          set html [incithencode $html] 
3866
        }
3867
        ::http::cleanup $http
3868
        #correct the html, remove shitty tags
3869
        # generic pre-parsing
3870
        regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html
3871
        regsub -all -nocase {<font.+?>} $html "" html
3872
        regsub -all -nocase {</font>} $html "" html
3873
        regsub -all -nocase {<input.+?>} $html "" html
3874
        regsub -all -nocase {(?:<i>|</i>)} $html "" html
3875
        regsub -all "\t" $html " " html
3876
        regsub -all "\n" $html " " html
3877
        regsub -all "\r" $html " " html
3878
        regsub -all "\v" $html " " html
3879
        regsub -all "</li>" $html ". " html
3880
        regsub -all ";;>" $html "" html
3881
3882
        if {$incith::google::bold_descriptions > 0 && [string match "\002" $incith::google::desc_modes] != 1} {
3883
          regsub -all -nocase {(?:<b>|</b>)} $html "\002" html
3884
        }
3885
      }
3886
3887
      set match ""
3888
      # give results an output header with result tally.
3889
      if {[regexp -- {<title>(.+?)</title>} $html - match]} { regexp -- {(.+?)\s(?:-|-)\s} $match - match }
3890
      # see if page has a redirect to fragment
3891
      regexp -- {redirectToFragment\("\#(.*?)"\)} $html - tresult
3892
      if {[string match "*#*" $query]} { regexp -- {^(.*?)#(.*?)$} $query - query tresult }
3893
      if {![string match "*<a name=*" $html]} { set walt 1 }
3894
      # this is my kludge to allow listing table of contents, to make
3895
      # sub-tag lookups easier to see on irc.
3896
      if {[string length $results]} {
3897
        set tresult ""
3898
        set subtag [string tolower $results]
3899
        # if the table of contents exists on the page, lets use real world words
3900
        # instead of ugly subtags...
3901
        if {[string match "*<table id=\"toc*" $html]} {
3902
          set ded "\002ToC\002\: " ; set ebcPR "" ; set results ""
3903
          # set results [regexp -inline -all -- {<li class="toclevel.*?<span class="toctext">(.*?)</span>} $html]
3904
          set results [regexp -inline -all -- {<li class="toclevel.*?href="#(.*?)"} $html]
3905
          foreach {junk anchor} $results { lappend anchors $anchor }
3906
          #if {![info exists anchors]} { set anchors "toc" }
3907
          if {[string tolower $subtag] == "toc"} {
3908
            foreach anchor $anchors { lappend new [string map {"_" " "} [subtagDecode $anchor]] }
3909
            append ded [join $new "; "]
3910
            set toc 1
3911
          } else {
3912
            set ded ""
3913
          }
3914
        } else {
3915
          # table of contents doesnt exist for the page, so we are manually
3916
          # going to pull them for the user ourselves.
3917
          set ded "\002\(ToC)\002: " ; set ebcPR ""
3918
          if {![info exists walt]} {
3919
            set results [regexp -inline -all -- {<a name=".*?id="(.+?)"} $html]
3920
          } else {
3921
            set results [regexp -inline -all -- {<span class="mw-headline".*?id="(.*?)"} $html]
3922
          }
3923
          foreach {junk anchor} $results { lappend anchors $anchor }
3924
          #if {![info exists anchors]} { set anchors "toc" }
3925
          if {[string tolower $subtag] == "toc"} {
3926
            foreach anchor $anchors { lappend new [string map {"_" " "} [subtagDecode $anchor]] }
3927
            append ded [join $new "; "]
3928
            set toc 1
3929
          } else {
3930
            set ded ""
3931
          }
3932
        }
3933
      }
3934
3935
      # this is in case an internal redirectToFragment(# ) was found
3936
      if {$tresult != ""} {
3937
        set subtag $tresult
3938
        incr red 1
3939
        if {![info exists walt]} {
3940
          set redir "<a name=\"${subtag}\".*?>(.*?)(?:<a name|<div class=\"printfooter)"
3941
        } else {
3942
          if {[string index $tresult 0] == "#"} { set tresult [string range $tresult 1 end] ; set subtag $tresult }
3943
          set redir "<span class=\"mw-headline\" id=\"${subtag}\".*?>(.*?)(?:<span class=\"mw-headline|<div class=\"printfooter)"
3944
        }
3945
        regexp -nocase "$redir" $html - ded
3946
        regsub -all -- {\[<(.*?)>\]} $ded {} ded
3947
        regsub -all -- {\[[[:digit:]]+\]}  $ded {} ded
3948
        regsub -all -- {<th style=.*?</th>} $ded {} ded
3949
        regsub -all -- {<table.+?</table>} $ded {} ded
3950
        if {$ded == ""} {
3951
            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"
3952
        }
3953
      }
3954
3955
      # This is for our manual #sub-tag search..
3956
      if {![string equal [string tolower $subtag] "toc"] && [string length $subtag] && ![string length $tresult]} {
3957
        set subtag [string map {" " "_"} $subtag]
3958
        # direct match
3959
        if {[info exists anchors]} {
3960
	    foreach entry $anchors {
3961
            if {[string match -nocase $entry $subtag]} {
3962
              set stf "true"
3963
              incr red 1
3964
              set subtag [string map {" " "_"} $entry]
3965
              break
3966
            }
3967
          }
3968
          if {![info exists stf]} {
3969
            # starts the anchor
3970
            foreach entry $anchors {
3971
              if {[string match -nocase "$subtag*" $entry]} {
3972
                set stf "true"
3973
                incr red 1
3974
                set subtag [string map {" " "_"} $entry]
3975
                break
3976
              }
3977
            }
3978
          }
3979
          if {![info exists stf]} {
3980
            # anywhere in the anchor
3981
            foreach entry $anchors {
3982
              if {[string match -nocase "*$subtag*" $entry]} {
3983
		    set stf "true"
3984
                incr red 1
3985
                set subtag [string map {" " "_"} $entry]
3986
                break
3987
              }
3988
            }
3989
          }
3990
        }
3991
        if {![info exists stf]} {
3992
          return "$::incith::google::error_modes\002Wikipedia Error:\002 Manual #anchor (${subtag}) not found in body of html @ ${query} .$::incith::google::error_demodes"
3993
        }
3994
        if {![info exists walt]} {
3995
          set redir "<a name=\"${subtag}\".*?>(.*?)(?:<a name|<div class=\"printfooter)"
3996
        } else {
3997
          set redir "<span class=\"mw-headline\" id=\"${subtag}\".*?>(.*?)(?:<span class=\"mw-headline|<div class=\"printfooter)"
3998
        }
3999
        regexp -nocase "${redir}" $html - ded
4000
        regsub -all -- {\[<(.*?)>\]} $ded {} ded
4001
        regsub -all -- {\[[[:digit:]]+\]}  $ded {} ded
4002
        regsub -all -- {<th style=.*?</th>} $ded {} ded
4003
        regsub -all -- {<table.+?</table>} $ded {} ded
4004
        if {$ded == ""} {
4005
            return "$::incith::google::error_modes\002Wikipedia Error:\002 Unknown problem with (${subtag}) found @ ${query} .$::incith::google::error_demodes"
4006
        }
4007
      }
4008
4009
      # we couldn't chop these earlier because we needed them
4010
      # to easily pull our #sub-tag finder above, need to remove
4011
      # them here before we go further, because it might upset our checks.
4012
      regsub -all -nocase {<span.*?>} $html "" html
4013
      regsub -all -nocase {</span>} $html "" html
4014
4015
      # if we have no pre-cut html, let's start the cutting process.
4016
      if {$ded == ""} {
4017
        regsub -all {<div id="siteNotice">.*?</p></div>} $html {} html
4018
        regsub -all {<script type=.*?</script>} $html {} html
4019
        regsub -all {<th style=.*?</th>} $html {} html
4020
        regsub -all {//<.*?//]]>} $html {} html
4021
        ### - trying to clear out those damned wikipedia tables --
4022
        regsub -all -- {<table.+?</table>} $html {} html
4023
        regexp -- {<p>(.+?)<h} $html - ded
4024
        if {[string match "*</table>*" $ded]} {
4025
          regsub -all -- {.+?</table>} $ded {} ded
4026
        } elseif {[string match "*<table*" $ded]} {
4027
          regsub -all -- {<table.*>.+?} $ded {} ded
4028
        }
4029
      }
4030
   
4031
      # if wiki page is non-standard, then this will attempt
4032
      # to get at least something from the webpage to display.
4033
      if {$ded == ""} {
4034
        if {![regexp -- {<p>(.+?)</p>} $html - ded]} {
4035
          regexp -- {<p>(.+?)<div class="printfooter">} $html - ded
4036
        }
4037
      }
4038
      #clean up messy parsing.
4039
      regsub -all -- {<br>|<br/>} $ded {. } desc
4040
      regsub -all -- {\[<(.*?)>\]} $desc {} desc
4041
      regsub -all -- {<(.+?)>} $desc {} desc
4042
      while {[string match "*  *" $desc]} {
4043
        regsub -all -- {  } $desc " " desc
4044
      }
4045
      regsub -all -- {\[[[:digit:]]+\]}  $desc {} desc
4046
      regsub -all -- { , } $desc ", " desc
4047
      regsub -all -- { \.} $desc "\." desc
4048
      set match [string trim $match]
4049
      # if we have a very short description this will grab more.
4050
      if {$match != ""} {
4051
        if {[string len $desc] < 3} {
4052
          regexp -- {<p>.+?<p>(.+?)<h} $html - ded
4053
          regsub -all -- {<(.+?)>} $ded { } desc
4054
        }
4055
      }
4056
      # if we still have a tiny description, grab more yet.
4057
      if {$match != ""} {
4058
        if {[string len $desc] < 3} {
4059
          regexp -- {<p>(.+?)<p} $html - ded
4060
          regsub -all -- {<(.+?)>} $ded { } desc
4061
        }
4062
      }
4063
4064
      # clean up messy parsing.
4065
      # here we try to sanitize the description
4066
      # i'm hoping this works with any language, *crosses fingers*
4067
      set desc [string trim $desc]
4068
      regsub -all -- {<br>} $desc {. } desc
4069
      regsub -all -- {\[<(.*?)>\]} $desc {} desc
4070
      regsub -all -- {<(.+?)>} $desc {} desc
4071
      while {[string match "*  *" $desc]} {
4072
        regsub -all -- {  } $desc " " desc
4073
      }
4074
      regsub -all -- {\[[[:digit:]]+\]}  $desc {} desc
4075
      regsub -all -- { , } $desc ", " desc
4076
      regsub -all -- { \.} $desc "\." desc
4077
      # regsub -all -- {&#(25(\[6-9\])?|2(\[6-9\])?[\d]|(\[3-9\])?[\d]{2}|[\d]{4,5});} $desc "?" desc
4078
      # set our variables so formatting settings work
4079
      if {$subtag != ""} {
4080
        #regsub -- {" id="top".*?$} $subtag "" subtag
4081
        set subtag "#${subtag}"
4082
      }
4083
      set link $query
4084
      if {![info exists toc]} { set desc "[descdecode [string range $desc 0 [expr 360 * $incith::google::wiki_lines]]]" }
4085
      if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
4086
      if {[info exists link]} { set link "$incith::google::link_modes[string trim "$link$subtag"]$incith::google::link_demodes" }
4087
      if {[info exists match]} { set match "$incith::google::total_modes[string trim $match]$incith::google::total_demodes" }
4088
      # after stripping excessive tags if our description is
4089
      # reduced to nothing, let's lie and say it was too much to parse :)
4090
      if {$match != "" && $desc == ""} {
4091
        regexp -- {<h[0-9].*?>.*?h[0-9]>.*?<ul>(.*?)</ul>} $html - desc
4092
        set desc [string trim $desc]
4093
        regsub -all -- {<br>} $desc {. } desc
4094
        regsub -all -- {\[<(.*?)>\]} $desc {} desc
4095
        regsub -all -- {<(.+?)>} $desc {} desc
4096
        while {[string match "*  *" $desc]} {
4097
          regsub -all -- {  } $desc " " desc
4098
        }
4099
        regsub -all -- {\[[[:digit:]]+\]}  $desc {} desc
4100
        regsub -all -- { , } $desc ", " desc
4101
        regsub -all -- { \.} $desc "\." desc
4102
        set desc "${::incith::google::desc_modes}$desc${::incith::google::desc_demodes}"
4103
      }
4104
      # if we have no description, then let's decide what to do.
4105
      if {$desc == ""} {
4106
        regexp -- {<p>(.+?)</p>} $html - match
4107
        if {$match != ""} { return "$::incith::google::error_modes\002Wikipedia Error:\002 Unable to parse for: \002${input}\002 @ ${query}${subtag}$::incith::google::error_demodes" }
4108
        if {$match == ""} { return "$::incith::google::error_modes\002Wikipedia Error:\002 Sorry, no search results found.$::incith::google::error_demodes" }
4109
        break
4110
      }
4111
      # regular output displayed.
4112
      if {$match != ""} {
4113
        if {$red > 0} {
4114
          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"
4115
        } else {
4116
          set output "\002[descdecode ${match}]\002${incith::google::seperator}${desc}$::incith::google::break${link}"
4117
        }
4118
      } else {
4119
        if {$red > 0} {
4120
          set output "${desc}$::incith::google::break${link} $::incith::google::total_modes\[${red} Redirect\(s\)\]$::incith::google::total_demodes"
4121
        } else {
4122
          set output "${desc}$::incith::google::break${link}"
4123
        }
4124
      }
4125
      return $output
4126
    }
4127
4128
4129
    # WIKIMEDIA
4130
    # fetches wiki info from sites other than wikipedia.org
4131
    # -speechless supplied
4132
    #
4133
    proc wikimedia {input} {
4134
      global incithcharset
4135
      ; set output "" ; set ded "" ; set match "" ; set redir "" ; set country "" ; set dec ""
4136
      ; set query "" ; set titem "" ; set ebcPR "" ; set results "" ; set tresult "" ; set red 0
4137
      ; set subtag "" ; set no_search "" ; set force 0 ; set fr 0 ; set natch "" ; set region ""
4138
      ; set regional ""
4139
4140
      # make it so people can search their wiki in proper encoding....
4141
      regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - country input
4142
      if {$country == ""} {
4143
        set country "${incith::google::wikimedia_site}"
4144
      }
4145
      regexp -nocase -- {(.*)\@(.*)} $country - country region
4146
      # allow full search if desired
4147
      if {[string match "+" [string range $region 0 0]]} {
4148
        set region [string range $region 1 end]
4149
        set regional $region
4150
      }
4151
4152
      # this is my input encoding hack, this will convert input before it goes
4153
      # out to be queried.
4154
      if {$incith::google::encoding_conversion_input > 0 && $region != ""} {
4155
        set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "${region}:*"]] :] 1]
4156
      } elseif {$incith::google::encoding_conversion_input > 0 && $country != ""} {
4157
        set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "${country}:*"]] :] 1]
4158
      } else { set encoding_found "" }
4159
      if {$encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} {
4160
        set input [encoding convertfrom $encoding_found $input]
4161
      } 
4162
4163
      regsub -all -- {_} $input { } input
4164
      regexp -- {^(.+?)\#(.+?)$} $input - input results
4165
      regsub -all -- { } $results { } results
4166
      set input [urlencode $input 0 "utf-8"]
4167
      set results [string map {.20 _} [urlencode [string trim $results] 1 "utf-8"]]
4168
4169
      # force is for those times you want to MAKE
4170
      # it directly go to a location, you use force
4171
      # by making first letter of your search term a .
4172
      set force [regexp -nocase -- {^\.(.+?)$} $input - input]
4173
      if {$force == 1} {
4174
        #set query "http://${country}/index.php?search=${input}&go=Go"
4175
        set query "http://${country}/index.php/${input}"
4176
        #set match "/index.php?search=${input}&go=Go"
4177
        #set match "/index.php/${input}"
4178
      } else {
4179
        set query "http://${country}/index.php?title=Special%3ASearch&search=${input}&fulltext=Search"
4180
      }
4181
# pre-load page to get damn redirects out of the way
4182
# this is stupid i agree, but let's not think about it.
4183
4184
      # beware, changing the useragent will result in differently formatted html from Google.
4185
      set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e"
4186
      set http [::http::config -useragent $ua -urlencoding "utf-8"]
4187
      # stole this bit from rosc2112 on egghelp forums
4188
      # borrowed is a better term, all procs eventually need this error handler.
4189
	catch {set http [::http::geturl $query -headers $::incith_hdr -timeout [expr 1000 * 5]]} error
4190
4191
	if {[string match -nocase "*couldn't open socket*" $error]} {
4192
		return "${::incith::google::error_modes}Socket Error accessing '${query}' .. Does it exist?${::incith::google::error_demodes}" 
4193
	}
4194
	if { [::http::status $http] == "timeout" } {
4195
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
4196
	}
4197
4198
      # CHECK CHECK
4199
      upvar #0 $http state
4200
      set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)]
4201
      set html [ungzip [::http::data $http] $state(meta)]
4202
      # REDIRECT
4203
      if {[string match "*${redir}*" "302|301" ]} {
4204
        foreach {name value} $state(meta) {
4205
	    if {[regexp -nocase ^location$ $name]} {
4206
	      catch {set http [::http::geturl "$v" -query "" -headers $::incith_hdr -timeout [expr 1000 * 10]]} error
4207
	      if {[string match -nocase "*couldn't open socket*" $error]} {
4208
		  return "${::incith::google::error_modes}Socket Error accessing '${query}' .. Does it exist?${::incith::google::error_demodes}" 
4209
	      }
4210
	      if { [::http::status $http] == "timeout" } {
4211
		  return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
4212
	      }
4213
            upvar #0 $http state
4214
            set html [ungzip [::http::data $http] $state(meta)]
4215
            set query $value
4216
            incr red
4217
	    }
4218
        } 
4219
      }
4220
      ::http::cleanup $http
4221
4222
      # are we redirected to another page so soon?
4223
      # usually this is the case, if our original search page wants
4224
      # to search using another method, so let's accomodate it...
4225
      regexp -nocase -- {document has moved.+?<a href="(.+?)">} $html - match
4226
      regexp -nocase -- {Did you mean to type.+?<a href="(.+?)">} $html - match
4227
4228
      # if we are redirected, then we can modify our url
4229
      # to include the redirect as our new destination site.
4230
      if {$match != ""} {
4231
        incr red 1 ; set fr 1
4232
        set query $match
4233
        regsub -all "&amp;" $query {\&} query
4234
        regexp -- {http\:\/\/(.+?)/index.php} $match - country
4235
      } 
4236
4237
# 1st load of webpage - this is the only part which has error control
4238
# this is where we load the search page to find an exact match or most relevant.
4239
# we will also be able to detect bad user input in the form of socket errors.
4240
4241
      # beware, changing the useragent will result in differently formatted html from Google.
4242
      if {$fr == 1} {
4243
        set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e"
4244
        set http [::http::config -useragent $ua -urlencoding "utf-8"]
4245
	  set http [::http::geturl $query -headers $::incith_hdr -timeout [expr 1000 * 15]]
4246
        upvar #0 $http state
4247
        set html [ungzip [::http::data $http] $state(meta)]
4248
        ::http::cleanup $http
4249
      }
4250
4251
      # generic pre-parsing
4252
      regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html
4253
      regsub -all -nocase {<font.+?>} $html "" html
4254
      regsub -all -nocase {</font>} $html "" html
4255
      regsub -all -nocase {<span.*?>} $html "" html
4256
      regsub -all -nocase {</span>} $html "" html
4257
      regsub -all -nocase {<input.+?>} $html "" html
4258
      regsub -all -nocase {(?:<i>|</i>)} $html "" html
4259
      regsub -all "\t" $html " " html
4260
      regsub -all "\n" $html " " html
4261
      regsub -all "\r" $html " " html
4262
      regsub -all "\v" $html " " html
4263
      regsub -all "</li>" $html ". " html
4264
      regsub -all ";;>" $html "" html
4265
      regsub {<div class="floating_object".*?>.*?</div>} $html "" html
4266
4267
      if {$html == ""} { return "$::incith::google::error_modes\002Wikimedia Error:\002 No html to parse.$::incith::google::error_demodes" }
4268
4269
  # this is my kludge, enjoy it
4270
  if {$force == 0} {
4271
      # see if our direct result is available and if so, lets take it
4272
      if {![regexp -- {<div id="contentSub"><p>.*?<a href="((?!#).+?)".*?title} $html - match]} {
4273
        regexp -nocase -- {<div class='searchresults'>.*?<a href="(.*?)".*?(class=|title=|style=)} $html - match
4274
      }
4275
      if {[string match -nocase "*action=edit*" $match]} { set match "" }
4276
      # otherwise we only care about top result
4277
      # this is the _only_ way to parse mediawiki, sorry.
4278
      if {$match == ""} {
4279
        regexp -- {<li><a href="(.*?)"} $html - match
4280
        if {$match == ""} {
4281
          if {![regexp -- {<li><div class='mw-search.*?'><a href="(.*?)"} $html - match]} {
4282
            regexp -- {<li style.*?><a href="(.+?)"} $html - match
4283
          }
4284
        }
4285
      }
4286
      # this will strip double domain entries from our country if it exists
4287
      # on our anchor.
4288
      if {$incith::google::wiki_domain_detect != 0} {
4289
        if {[string match -nocase [lindex [split $country "/"] end] [lindex [split $match "/"] 1]]} {
4290
          set country [join [lrange [split $country "/"] 0 end-1] "/"]
4291
        }
4292
      } elseif {[string match -nocase "*/wiki*" $country]} {
4293
       regsub -- {/wiki} $country {} country
4294
      }
4295
4296
4297
      # at this point we can tell if there was any match, so let's not even bother
4298
      # going further if there wasn't a match, this pulls the 'no search etc' found.
4299
      # this can be in any language.
4300
      if {$match == ""} {
4301
        # these are for 'no search results' or similar message
4302
        # these can be in any language.
4303
        # if {[regexp -- {</form>.*?<p>(.+?)(<p><b>|</p><hr)} $html - match]} { regsub -all -- {<(.+?)>} $match {} match } 
4304
        if {$match == ""} {
4305
          if {[regexp -- {<div class='searchresults'>(.+?)</p>} $html - match]} {
4306
            regsub -all {(?:<b>|</b>|<em>|</em>)} $match "\002" match
4307
          } else {
4308
            if {[regexp -- {<div id="contentSub">(.+?)<form id=} $html - match]} {
4309
              regsub -all {(?:<b>|</b>|<em>|</em>)} $match "\002" match
4310
              regsub -- {<a href="/wiki/Special\:Allpages.*?</a>} $match "." match
4311
              regsub -- {<div id.*?>} $match "" match
4312
              regsub -- {</a></div>} $match "?" match
4313
              regsub -- {</div>} $match "" match
4314
              regsub -- {\[Index\]} $match "" match
4315
              regsub -- {<span.*?/span>} $match "" match
4316
              regsub -- { \(<.*?>\)} $match ". " match
4317
              if {[string match "*<!--*" $match]} {
4318
                regexp -- {<li class="normal">.*?</p><p>(.*?)</p>} $html - match
4319
              }
4320
            }
4321
          } 
4322
        }
4323
        # this is our last error catch, this can grab the
4324
        # 'wikimedia cannot search at this time' message
4325
        # this can be in any language.
4326
        if {[string len $match] < 3} { regexp -- {<center><b>(.+?)</b>} $html - match }
4327
        if {$match == ""} {
4328
          regsub -all -- { } $results {_} results
4329
          if {$results != ""} { set results "#${results}" } 
4330
          return "$::incith::google::error_modes\002Wikimedia Error:\002 Unable to parse for: \002${input}\002 @ ${query}${results}$::incith::google::error_demodes"
4331
        }
4332
        # might be tags since we allowed any language here we cut them out
4333
        regsub -all -- {<(.+?)>} $match "" match
4334
        if {$region == ""} {
4335
          return "$::incith::google::desc_modes[utf8encodefix $country [descdecode ${match}]]$::incith::google::desc_demodes"
4336
        } else {
4337
          return "$::incith::google::desc_modes[utf8encodefix $region [descdecode ${match}]]$::incith::google::desc_demodes"
4338
        }
4339
      }
4340
     
4341
      # this lets us easily change our internal sub redirected wiki link.
4342
      #if {$regional != ""} {
4343
      # regsub -- {/wiki/} $match "/$region/" match
4344
      #}
4345
4346
      # we assume here we found another page to traverse in our search.
4347
      if {![string match "*http*" $match]} { set query "http://${country}${match}" } { set query $match }
4348
4349
# 2nd load of webpage - this has no error checking what-so-ever
4350
# here is where we pluck the link to the exact match, or the most relevant 'top' link.
4351
# or in the case of redirects, to other pages, we will handle that here as well.
4352
4353
      # beware, changing the useragent will result in differently formatted html from Google.
4354
      set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e"
4355
      set http [::http::config -useragent $ua -urlencoding "utf-8"]
4356
      set http [::http::geturl $query -headers $::incith_hdr -timeout [expr 1000 * 15]]
4357
      upvar #0 $http state ; set ncode [http::ncode $http] ; set metas $state(meta) ; set value ""
4358
      set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)]
4359
      # this is the output encoding hack.
4360
      if {$incith::google::encoding_conversion_output > 0} {
4361
        if {$region != ""} {
4362
          set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$region:*"]] :] 1]
4363
        } else {
4364
          set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$country:*"]] :] 1]
4365
        }
4366
      }
4367
4368
      set html [ungzip [::http::data $http] $state(meta)]
4369
4370
      if {$incith::google::debug > 0} {
4371
        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"
4372
      }
4373
      if {$encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} {
4374
        set ::incithcharset $encoding_found
4375
        set html [incithencode $html] 
4376
      }
4377
      ::http::cleanup $http
4378
      #correct the html, remove shitty tags
4379
      # generic pre-parsing
4380
      regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html
4381
      regsub -all -nocase {<font.+?>} $html "" html
4382
      regsub -all -nocase {</font>} $html "" html
4383
      regsub -all -nocase {<input.+?>} $html "" html
4384
      regsub -all -nocase {(?:<i>|</i>)} $html "" html
4385
      regsub -all "\t" $html " " html
4386
      regsub -all "\n" $html " " html
4387
      regsub -all "\r" $html " " html
4388
      regsub -all "\v" $html " " html
4389
      regsub -all "</li>" $html ". " html
4390
      regsub -all ";;>" $html "" html
4391
      if {$incith::google::bold_descriptions > 0 && [string match "\002" $incith::google::desc_modes] != 1} {
4392
        regsub -all -nocase {(?:<b>|</b>)} $html "\002" html
4393
      }
4394
      set match ""
4395
   
4396
    # this is where my kludge ends ;)
4397
    # this is if there is no text on a special page.
4398
    } else {
4399
     if {[regexp -nocase -- {<div class="noarticletext">(.+?)</div>} $html - no_search]} {
4400
       regsub -all -- {<(.+?)>} $no_search {} no_search
4401
       while {[string match "*  *" $no_search]} {
4402
         regsub -all -- {  } $no_search " " no_search
4403
       }
4404
       return "$::incith::google::desc_modes$no_search$::incith::google::desc_demodes"
4405
     }
4406
    }
4407
    
4408
    if {[string match 30* $ncode]} {
4409
      foreach {name value} $metas {
4410
        if {[regexp -nocase ^location$ $name]} {
4411
          set go $value
4412
        }
4413
      }
4414
    }
4415
    # are we redirected to another page? if so, let's go there
4416
    if {[regexp -- {alt="#REDIRECT ".+?<a href="(.+?)" title="} $html - match] || [info exists go]} {
4417
      if {$match != ""} {
4418
        incr red 1
4419
        set query "http://${country}${match}"
4420
      } else { set query $go }
4421
4422
# 3rd load of webpage - this has no error checking what-so-ever
4423
# here is our final webpage, this is hopefully what the user was looking for.
4424
4425
        # beware, changing the useragent will result in differently formatted html from Google.
4426
        set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e"
4427
        set http [::http::config -useragent $ua -urlencoding "utf-8"]
4428
        set http [::http::geturl $query -headers $::incith_hdr -timeout [expr 1000 * 15]]
4429
        upvar #0 $http state
4430
        set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)]
4431
        # this is the output encoding hack.
4432
        if {$incith::google::encoding_conversion_output > 0} {
4433
          if {$region != ""} {
4434
            set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$region:*"]] :] 1]
4435
          } else {
4436
            set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$country:*"]] :] 1]
4437
          }
4438
        }
4439
4440
        set html [ungzip [::http::data $http] $state(meta)]
4441
4442
        if {$incith::google::debug > 0} {
4443
          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"
4444
        }
4445
        if {$encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} {
4446
          set ::incithcharset $encoding_found
4447
          set html [incithencode $html] 
4448
        }
4449
        ::http::cleanup $http
4450
        #correct the html, remove shitty tags
4451
        # generic pre-parsing
4452
        regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html
4453
        regsub -all -nocase {<font.+?>} $html "" html
4454
        regsub -all -nocase {</font>} $html "" html
4455
        regsub -all -nocase {<input.+?>} $html "" html
4456
        regsub -all -nocase {(?:<i>|</i>)} $html "" html
4457
        regsub -all "\t" $html " " html
4458
        regsub -all "\n" $html " " html
4459
        regsub -all "\r" $html " " html
4460
        regsub -all "\v" $html " " html
4461
        regsub -all "</li>" $html ". " html
4462
        regsub -all ";;>" $html "" html
4463
        if {$incith::google::bold_descriptions > 0 && [string match "\002" $incith::google::desc_modes] != 1} {
4464
          regsub -all -nocase {(?:<b>|</b>)} $html "\002" html
4465
        }
4466
      }
4467
4468
      set match ""
4469
      # give results an output header with result tally.
4470
      regexp -- {<title>(.+?)\s\-\s.+?</title>} $html - match
4471
      # see if page has a redirect to fragment
4472
      if {![string length $results]} { regexp -- {redirectToFragment\("(\#.+?)"\)} $html - tresult }
4473
      if {![string match "*<a name=*" $html]} { set walt 1 }
4474
      # this is my kludge to allow listing table of contents, to make
4475
      # sub-tag lookups easier to see on irc.
4476
      if {[string length $results] || [string length $tresult]} {
4477
        if {[string length $results]} { set tresult "" }
4478
        set subtag [string tolower $results]
4479
        # if the table of contents exists on the page, lets use real world words
4480
        # instead of ugly subtags...
4481
        if {[string match "*<table id=\"toc*" $html]} {
4482
          set ded "\002ToC\002\: " ; set ebcPR "" ; set results ""
4483
          # set results [regexp -inline -all -- {<li class="toclevel.*?<span class="toc.*?">(.*?)</span>} $html]
4484
          set results [regexp -inline -all -- {<li class="toclevel.*?href="#(.*?)"} $html]
4485
          set anchors [list "toc"]
4486
          foreach {junk anchor} $results { lappend anchors $anchor }
4487
          if {[string tolower $subtag] == "toc"} {
4488
            foreach anchor $anchors { lappend new [string map {"_" " "} [subtagDecode $anchor]] }
4489
            append ded [join $new "; "]
4490
            set toc 1 ; set loop 1
4491
          } else {
4492
            set ded ""
4493
          }
4494
        } else {
4495
          # table of contents doesnt exist for the page, so we are manually
4496
          # going to pull them for the user ourselves.
4497
          set ded "\002\(ToC)\002: " ; set ebcPR ""
4498
          if {![info exists walt]} {
4499
            set results [regexp -inline -all -- {<a name=".*?id="(.+?)"} $html]
4500
          } else {
4501
            set results [regexp -inline -all -- {<span class="mw-headline".*?id="(.*?)"} $html]
4502
          }
4503
          set anchors [list "toc"]
4504
          foreach {junk anchor} $results { lappend anchors $anchor }
4505
          #if {![info exists anchors]} { set anchors "toc" }
4506
          if {[string tolower $subtag] == "toc"} {
4507
            foreach anchor $anchors { lappend new [string map {"_" " "} [subtagDecode $anchor]] }
4508
            append ded [join $new "; "]
4509
            set toc 1 ; set loop 1
4510
          } else {
4511
            set ded ""
4512
          }
4513
        }
4514
      }
4515
4516
      # this is in case an internal redirectToFragment(# ) was found
4517
      if {$tresult != ""} {
4518
        #set subtag $tresult
4519
        incr red 1
4520
        if {![info exists walt]} {
4521
          set redir "name=\"${tresult}\".*?>(.+?)(<a name|</table>|\<\!\-)"
4522
        } else {
4523
          set tresult [string range $tresult 1 end]
4524
          set redir "<span class=\"mw-headline\" id=\"${tresult}.*?>(.+?)(<span|</table>|\<\!\-)"
4525
        }
4526
        regexp -nocase "$redir" $html - ded
4527
        regsub -all -- {\[<(.*?)>\]} $ded {} ded
4528
        regsub -all -- {\[[[:digit:]]+\]}  $ded {} ded
4529
        regsub -all -- {<table.+?</table>} $ded {} ded
4530
        if {$ded == ""} {
4531
            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"
4532
        }
4533
      }
4534
4535
      # This is for our manual #sub-tag search..
4536
      if {![string equal [string tolower $subtag] "toc"] && [string length $subtag]} {
4537
        set subtag [string map {" " "_"} $subtag]
4538
        # direct match
4539
        if {[info exists anchors]} {
4540
	    foreach entry $anchors {
4541
            if {[string match -nocase $entry $subtag]} {
4542
              set stf "true"
4543
              incr red 1
4544
              set subtag [string map {" " "_"} $entry]
4545
              break
4546
            }
4547
          }
4548
          if {![info exists stf]} {
4549
            # starts the anchor
4550
            foreach entry $anchors {
4551
              if {[string match -nocase "$subtag*" $entry]} {
4552
                set stf "true"
4553
                incr red 1
4554
                set subtag [string map {" " "_"} $entry]
4555
                break
4556
              }
4557
            }
4558
          }
4559
          if {![info exists stf]} {
4560
            # anywhere in the anchor
4561
            foreach entry $anchors {
4562
              if {[string match -nocase "*$subtag*" $entry]} {
4563
		    set stf "true"
4564
                incr red 1
4565
                set subtag [string map {" " "_"} $entry]
4566
                break
4567
              }
4568
            }
4569
          }
4570
        }
4571
        if {![info exists stf]} {
4572
          return "$::incith::google::error_modes\002Wikimedia Error:\002 Manual #anchor (${subtag}) not found in body of html @ ${query} .$::incith::google::error_demodes"
4573
        }
4574
        if {![info exists walt]} {
4575
          set redir "name=\"${subtag}\".*?>(.*?)(?:<a name|<div class=\"printfooter)"
4576
        } else {
4577
          set redir "<span class=\"mw-headline\" id=\"${subtag}\".*?>(.*?)(?:<span class=\"mw-headline|<div class=\"printfooter)"
4578
        }
4579
        regexp -nocase "${redir}" $html - ded
4580
        regsub -all -- {\[<(.*?)>\]} $ded {} ded
4581
        regsub -all -- {\[[[:digit:]]+\]}  $ded {} ded
4582
        regsub -all -- {<th style=.*?</th>} $ded {} ded
4583
        regsub -all -- {<table.+?</table>} $ded {} ded
4584
        if {$ded == ""} {
4585
            return "$::incith::google::error_modes\002Wikimedia Error:\002 Unknown problem with (${subtag}) found @ ${query} .$::incith::google::error_demodes"
4586
        }
4587
      }
4588
4589
      # we couldn't chop these earlier because we needed them
4590
      # to easily pull our #sub-tag finder above, need to remove
4591
      # them here before we go further, because it might upset our checks.
4592
      regsub -all -nocase {<span.*?>} $html "" html
4593
      regsub -all -nocase {</span>} $html "" html
4594
4595
      # if we have no pre-cut html, let's start the cutting process.
4596
      if {$ded == ""} {   
4597
        regexp -- {<h1.*?>.*?<p>(.+?)<h} $html - ded
4598
        ### - trying to clear out those damned wikipedia tables --
4599
        regsub -all -- {<table.+?</table>} $ded {} ded
4600
        if {[string match "*</table>*" $ded]} {
4601
          regsub -all -- {.+?</table>} $ded {} ded
4602
        } elseif {[string match "*<table*" $ded]} {
4603
          regsub -all -- {<table.*>.+?} $ded {} ded
4604
        }
4605
      }
4606
   
4607
      # if wiki page is non-standard, then this will attempt
4608
      # to get at least something from the webpage to display.
4609
      if {$ded == ""} {
4610
        regexp -- {<p>(.+?)<div class="printfooter">} $html - ded
4611
      }
4612
      #clean up messy parsing.
4613
      regsub -all -- {<br>|<br/>} $ded {. } desc
4614
      #regsub -all -- {">:alpha:\]} $desc {} desc
4615
      regsub -all -- {\[<(.*?)>\]} $desc {} desc
4616
      regsub -all -- {<(.+?)>} $desc {} desc
4617
      while {[string match "*  *" $desc]} {
4618
        regsub -all -- {  } $desc " " desc
4619
      }
4620
      regsub -all -- {\[[[:digit:]]+\]}  $desc {} desc
4621
      regsub -all -- { , } $desc ", " desc
4622
      regsub -all -- { \.} $desc "\." desc
4623
      regsub -all -- {&#(25(\[6-9\])?|2(\[6-9\])?[\d]|(\[3-9\])?[\d]{2}|[\d]{4,5});} $desc "?" desc
4624
      set match [string trim $match]
4625
      # if we have a very short description this will grab more.
4626
      if {[string len $desc] < 3} {
4627
        if {[regexp -- {<p>.+?<p>(.+?)<h} $html - desc]} { set desc [cleans $desc] }
4628
      }
4629
      if {[string len $desc] < 3} {
4630
        if {[regexp -- {<p>(.+?)<p} $html - desc]}  { set desc [cleans $desc] }
4631
      }
4632
      #if {[string length $tresult]} { set subtag $tresult }
4633
      # set our variables so formatting settings work
4634
      if {$subtag != ""} {
4635
        regsub -- {" id="top".*?$} $subtag "" subtag
4636
        set subtag "#${subtag}"
4637
      }
4638
      set link $query
4639
      if {![info exists loop]} { set desc "[string range $desc 0 [expr 360 * $incith::google::wiki_lines]]" }
4640
      if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim [descdecode $desc]]$incith::google::desc_demodes" }
4641
      if {[info exists match]} { set match "$incith::google::total_modes[string trim $match]$incith::google::total_demodes" }
4642
      if {[info exists link]} { set link "$incith::google::link_modes[string trim "$link$subtag"]$incith::google::link_demodes" }
4643
      # after stripping excessive tags if our description is
4644
      # reduced to nothing, let's lie and say it was too much to parse :)
4645
4646
      # if we have no description, then let's decide what to do.
4647
      if {$desc == ""} {
4648
        regexp -- {<p>(.+?)</p>} $html - match
4649
        if {$match != ""} { return "$::incith::google::error_modes\002Wikimedia Error:\002 Unable to parse for: \002${input}\002 @ ${query}${subtag}$::incith::google::error_demodes" }
4650
        if {$match == ""} { return "$::incith::google::error_modes\002Wikimedia Error:\002 Sorry, no search results found.$::incith::google::error_demodes" }
4651
        break
4652
      }
4653
4654
      # regular output displayed.
4655
      if {$match != ""} {
4656
        if {$red > 0} {
4657
          set output "\002[descdecode ${match}]\002${incith::google::seperator}[descdecode ${desc}]$incith::google::break${link} $incith::google::total_modes\[${red} Redirect\(s\)\]$::incith::google::total_demodes"
4658
        } else {
4659
          set output "\002[descdecode ${match}]\002${incith::google::seperator}[descdecode ${desc}]$::incith::google::break${link}"
4660
        }
4661
      } else {
4662
        if {$red > 0} {
4663
          set output "${desc}$::incith::google::break${link} $::incith::google::total_modes\[${red} Redirect\(s\)\]$::incith::google::total_demodes"
4664
        } else {
4665
          set output "${desc}$::incith::google::break${link}"
4666
        }
4667
      }
4668
      return $output
4669
    }
4670
4671
    # wikipedia/wikimedia support
4672
    # CLEANS
4673
    #
4674
    proc cleans {input} {
4675
      # clean up messy parsing.
4676
      # here we try to sanitize the description
4677
      # i'm hoping this works with any language, *crosses fingers*
4678
      set desc [string trim $input]
4679
      regsub -all -- {<br>} $desc {. } desc
4680
      regsub -all -- {\[<(.*?)>\]} $desc {} desc
4681
      regsub -all -- {<(.+?)>} $desc {} desc
4682
      while {[string match "*  *" $desc]} {
4683
        regsub -all -- {  } $desc " " desc
4684
      }
4685
      regsub -all -- {\[[[:digit:]]+\]}  $desc {} desc
4686
      regsub -all -- { , } $desc ", " desc
4687
      regsub -all -- { \.} $desc "\." desc
4688
      regsub -all -- {&#(25(\[6-9\])?|2(\[6-9\])?[\d]|(\[3-9\])?[\d]{2}|[\d]{4,5});} $desc "?" desc
4689
      return $desc
4690
    }
4691
4692
    # EBAY
4693
    # fetches search results from ebay for auctions closest to completion.
4694
    # -speechless supplied
4695
    #
4696
    proc ebay {input} {
4697
      # lots of variables, keeping them clean is important.
4698
      ; set results 0 ; set output "" ; set titem "" ; set tresult "" ; set ebcSP ""
4699
      ; set ebcU "" ; set ebcI "" ; set ebcBid "" ; set ebcPR "" ; set ebcTim "" ; set ebcShpNew ""
4700
      ; set ebcCheck "" ; set no_search "" ; set auctions "" ; set ebcBid2 "" ; set ebcStr ""
4701
4702
      # this isn't global, so we need to keep ctry (country) here
4703
      regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - titem dummy
4704
      if {$titem == ""} {
4705
        set titem "${incith::google::ebay_country}" 
4706
      }
4707
4708
      # fetch the html
4709
      set html [fetch_html $input 25]
4710
      if {$html == ""} {
4711
        return "$::incith::google::error_modes\002Ebay Error: No html to parse.$::incith::google::error_demodes"
4712
      }
4713
4714
      # user input causing errors?
4715
	if {[string match -nocase "*socketerrorabort*" $html]} {
4716
            regsub {(.+?)\|} $html {} html
4717
            return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" 
4718
	}
4719
	if {[string match -nocase "*timeouterrorabort*" $html]} {
4720
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
4721
	}
4722
4723
      # set up an ebay results header for results to be appended to as $output
4724
      if {![regexp -- {class="sectiontitle">([0-9  .,]+)\002.*?<h2 class="standard ens} $html - tresult]} {
4725
        if {![regexp -- {<div class="count">([0-9  .,]+) } $html - tresult]} {
4726
           if {![regexp -- {var.*?getCustomAdConfig.*?,"items=(.+?)"} $html - tresult]} {
4727
             if {![regexp -nocase {<div id="v.*?" class="fpcc"><div><h1 class="smuy">(.*?)\s(.*?)\s(.*?)\s} $html - tresult auctions]} {
4728
               if {![regexp -nocase {<div id="v.*?" class="fpcc"><div>(.*?)\s(.*?)\s(.*?)\s} $html - tresult auctions]} {
4729
                 regexp -nocase {<div id="v.*?" class="fpcc">.*?\s(.+?)\s.*?\:\s*(.+?)\s} $html - auctions tresult
4730
                 set tresult "[join [scan  $tresult "%d%d"] ""]"
4731
               }
4732
             }
4733
           }
4734
        }
4735
      }
4736
      # no_results line in any language.
4737
      if {[regexp -- {<div class="msg msg-alert">(.+?)</div>} $html - no_search]} {
4738
        if {[regexp -- {div class="msg msg-alert.+?</div>.+?"msg msg-alert">(.+?)</div>} $html - more]} {
4739
          append no_search " $more"
4740
        }
4741
        regsub -all {<(.+?)>} $no_search "" no_search
4742
      } else {
4743
        if {![regexp -- {class="sectiontitle">(.+?)</h2><h2 class="standard ens"> } $html - no_search]} {
4744
          if {![regexp -- {<div class="count">(.+?)(?:</script>|</div>)} $html - no_search]} {
4745
            if {![regexp -- {<div class="toplne"><div class="msg">(.+?)</div>} $html - no_search]} {
4746
              regexp -- {<div class="cnt">(.*?)</div>} $html - no_search
4747
            }
4748
          }
4749
        }
4750
      }
4751
4752
      # santize our no_search results found error message
4753
      # may need to use it very shortly if we have no results
4754
      if {$no_search != ""} {
4755
        #if {[regexp -- {<div class="suggestions".+?<ul><li><div>(.+?)</li>} $html - ebcStr]} {
4756
        #  regsub -all -- {<(.+?)>} $ebcStr {} ebcStr
4757
        #  set ebcStr "${ebcStr}. "
4758
        #}
4759
        #regexp {(^.+?)document.write} $no_search - no_search
4760
        #regsub -all -- {<(.+?)>} $no_search {} no_search
4761
        #set no_search "${ebcStr}[string trim $no_search]"
4762
      } else {
4763
        if {$tresult == 0 && $no_search == ""} {
4764
          set no_search "eBay error."
4765
        }
4766
      }
4767
4768
      # bids in any language
4769
      if {![regexp -- {<td class="ebcBid">(.+?)</td>} $html {} ebcSP]} {set ebcsp ""}
4770
4771
      # format output according to variables.
4772
      if {$incith::google::total_results != 0} {
4773
        regexp -- {<option value="1" selected="selected">(.+?)</option>} $html - auctions
4774
        set output "$::incith::google::total_modes\002[string trim ${tresult}]\002 [string trim $auctions]$::incith::google::total_demodes${incith::google::seperator}"
4775
        if {$incith::google::bold_descriptions == 0} {
4776
          regsub -all -- "\002" $output {} output
4777
        }
4778
      }
4779
4780
      # parse the html
4781
      while {$results < $incith::google::ebay_results} {
4782
        # these CANNOT be tied together, some results appear in different
4783
        # order, so always leave these spread out in a mess...
4784
        if {![regexp -nocase {<td class="dtl"><div class="ttl">(.*?)</a></td>} $html - line]} {
4785
          if {![regexp -nocase {<table class="lview nol">.*?class="details.*?">(.+?)</table>} $html - line]} {
4786
            if {![regexp -nocase {<table class="nol">.*?class="details.*?">(.+?)</table>} $html - line]} {
4787
              if {![regexp -nocase {<h3 class="ens fontnormal">(.+?)class="ebRight"} $html - line]} { 
4788
                if {![regexp -nocase {<td class="details">(.*?)</a></td>} $html - line]} {
4789
                  set line ""
4790
                } else { regsub -nocase {<td class="details">.*?</a></td>} $html {} html }
4791
              } else { regsub {<h3 class="ens fontnormal">.+?class="ebRight"} $html {} html }
4792
            } else { regsub {<table class="nol">.+?</table>} $html {} html }
4793
          } else { regsub {<table class="lview nol">.+?</table>} $html {} html }
4794
        } else { regsub -nocase {<td class="dtl"><div class="ttl">.*?</a></td>} $html {} html } 
4795
        # name & url
4796
        if {![regexp -nocase {href=".*?ebay.*?/.*?/(.*?)\?pt.*?>(.*?)</a>} $line - ebcU ebcI]} {
4797
          if {![regexp -nocase {<a href=".+?QQitem(.+?)QQ.+?">.+?<a href=".*?">(.+?)</a>} $line - ebcU ebcI]} {
4798
		regexp -nocase {<a href="http://cgi.ebay.*?/.*?/(.*?)\?cmd=.*?>(.*?)</a>} $line - ebcU ebcI
4799
          }
4800
        } 
4801
        # bid
4802
        if {[regexp -nocase {class="bids.*?">(.+?)</td>} $line - ebcBid]} {
4803
          if {[regexp {<div.*?>(.+?)</div><img src=".*?title="(.+?)"} $ebcBid - ebcBid ebcBid2]} {
4804
            set ebcBid "${ebcBid}/${ebcBid2}"
4805
          }
4806
          if {[string match *<img* $ebcBid]} { regexp {<img src=".*?title="(.+?)"} $ebcBid - ebcBid }
4807
        } else {
4808
          regexp -nocase {class="ebcBid">(.*?)</td} $line - ebcBid
4809
          # trying to parse out the phrase "buy-it-now" in any language
4810
          # this isn't elegant at all, we are chopping 'massive' html tags out
4811
          # it works effectively, but isn't quick at all. We also have to account
4812
          # for multiple bid/buy-it-now possibilities....
4813
          regexp -- {(^[0-9\-]{1,})<} $ebcBid {} ebcBid2
4814
          if {![regexp -- {title="(.+?)"} $ebcBid {} ebcBid]} {
4815
            if {![regexp -- {alt="(.+?)(?:\":\:|-)} $ebcBid {} ebcBid]} {
4816
              regsub -all -- {<(.+?)>} $ebcBid "" ebcBid
4817
              if {$ebcBid == "-"} { set ebcBid "0" }
4818
              if {$ebcBid != ""} {
4819
                regsub -all -- {<(.+?)>} $ebcSP "" ebcSP
4820
                append ebcBid " ${ebcSP}"
4821
              }
4822
              if {$ebcBid == ""} { set ebcBid "??" }
4823
            }
4824
          }
4825
          # if our buy-it-now has a bid too, prepend bid to it.
4826
          if {![string match "*${ebcBid2}*" $ebcBid]} {
4827
             if {$ebcBid2 == "-"} { set ebcBid2 "0" }
4828
             regsub -all -- {<(.+?)>} $ebcSP "" ebcSP
4829
             set ebcBid "${ebcBid2} ${ebcSP}/[string trim $ebcBid]"
4830
          }
4831
        }
4832
        regsub -nocase {</div><div class=.*?>} $ebcBid "/" ebcBid
4833
        regsub -all {<.*?>} $ebcBid "" ebcBid
4834
        # prices
4835
        if {[regexp -nocase {<td class="prc.*?">(.*?)</td} $line - ebcPR]} {
4836
          regsub -- {</div><div>} $ebcPR "/" ebcPR
4837
          regexp -- {^(.+)</div>(.*?)$} $ebcPR - ebcPR ebcShpNew
4838
          regsub -all {<.*?>} $ebcPR "" ebcPR
4839
        }
4840
        
4841
        # shipping
4842
        if {![string length $ebcShpNew]} {
4843
          if {[regexp -nocase {td class=".*?(?:ship|fshp).*?">(.+?)</td>} $line - ebcShpNew]} {
4844
            if {[string match "<" [string index $ebcShpNew 0]]} { set ebcShpNew "Calculate" }
4845
          } else {
4846
            regexp -nocase {class="ebcShpNew">(.+?)<} $line - ebcShpNew
4847
            if {[info exists ebcShpNew]} {
4848
              regexp -- {;;">(.+?)} $ebcShpNew {} ebcCheck
4849
              if {$ebcCheck == ""} {
4850
                regexp -- {$(.+?)<} $ebcShpNew {} ebcShpNew
4851
                if {$ebcShpNew == ""} {
4852
                  set ebcTim "store"
4853
                  regexp -nocase {class="ebcStr">.+?http://stores.ebay.com/.+?">(.+?)</a>} $html - ebcStr
4854
                }
4855
              } else {
4856
		    if {![regexp -- {(.*?)<div class="tfsp">(.*?)</div>} $ebcPR - ebcPR ebcShpNew]} {
4857
                  set ebcShpNew "Calculate"
4858
		    }
4859
              }
4860
            }
4861
            # remove pesky trailing spaces
4862
            regsub -all -- {<(.+?)>} $ebcShpNew {} ebcShpNew
4863
            regsub -all " " $ebcShpNew "" ebcShpNew
4864
          }
4865
        }
4866
        # time left
4867
        if {![regexp -nocase {td class="time.*?rt">(.+?)</td>} $line - ebcTim]} {
4868
          if {![regexp -nocase {class="ebcTim">(.+?)<} $line - ebcTim]} {
4869
            regexp -nocase {class="hidlb">(.+?)<} $line - ebcTim
4870
          }
4871
        }
4872
        if {[info exists ebcTim]} {
4873
          regsub -all -- {<.*?>} [string map {\002 ""} $ebcTim] {} ebcTim
4874
          if {[string match *:* $ebcTim]} { set ebcTim [join [lrange [split $ebcTim :] 1 end]] }
4875
        }
4876
        # keep ebay Item from becoming too lengthy
4877
        if {[info exists ebcI]} {
4878
          #ebay has these odd tags, removing them cleans up results.
4879
          regsub -all -nocase "<wbr>" $ebcI "" ebcI
4880
          set ebcI [string range $ebcI 0 [expr $incith::google::description_length - 1]]
4881
          set ebcI [string trim $ebcI]
4882
        }
4883
 
4884
        # check results are more than 0, return or stop looping, depending
4885
        if {$tresult < 1 } {
4886
          if {$results == 0} {
4887
            set reply $no_search
4888
            return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
4889
          } else {
4890
            break
4891
          }
4892
        }
4893
4894
        # make the link valid because we were only given a partial href result, not a full url
4895
        set link "http://cgi.ebay.${titem}/_W0QQItemZ[lindex [split ${ebcU} "/"] end]"
4896
4897
        # fix up our variables so the output looks purdy.
4898
        if {$ebcPR == ""} { set ebcPR "--" }
4899
        if {$ebcTim == ""} {
4900
          set ebcTim "--"
4901
        } elseif {$ebcTim == "store"} {
4902
          set desc "\037${ebcStr}\037 ${ebcI}, ${ebcPR}(${ebcShpNew}), ${ebcBid}"
4903
        } elseif {$ebcI != ""} {
4904
          set desc "${ebcI}, ${ebcPR}(${ebcShpNew}), ${ebcBid}, ${ebcTim}"
4905
        } else {
4906
          set link "" ; set desc ""
4907
        }
4908
4909
        # add the search result
4910
        if {$link != ""} {
4911
          if {[info exists desc] == 1 && $ebcI != ""} {
4912
          if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
4913
          if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" }
4914
            if {$incith::google::link_only == 1} { 
4915
              append output "${link}${incith::google::seperator}"
4916
            } else {
4917
              append output [descdecode "${desc}$::incith::google::break${link}${incith::google::seperator}"]
4918
            }
4919
          }
4920
        }
4921
4922
        # increase the results, clear the variables for the next loop just in case
4923
        unset link ; set ebcCheck "" ; set ebcU "" ; set ebcBid2 ""
4924
        set ebcI "" ; set ebcPR "" ; set ebcShpNew ""
4925
        incr results
4926
      }
4927
4928
      # make sure we have something to send
4929
      if {$tresult < 1} {
4930
        set reply $no_search
4931
        return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
4932
      }
4933
      return $output
4934
    }
4935
4936
4937
    # EBAYFIGHT
4938
    # ebay fight !
4939
    #
4940
    proc ebayfight {input} {
4941
      set output ""; set winner 0 ; set match1 0; set match2 0
4942
      
4943
      regexp -nocase -- {^(.+?) vs (.+?)$} $input - word1 word2
4944
4945
      # fetch the first result
4946
      set html [fetch_html $word1 25]
4947
      if {![regexp -- {class="sectiontitle">([0-9  .,]+)\002.*?<h2 class="standard ens} $html - match1]} {
4948
        if {![regexp -- {<div class="count">([0-9  .,]+) } $html - match1]} {
4949
           if {![regexp -- {var.*?getCustomAdConfig.*?,"items=(.+?)"} $html - match1]} {
4950
             if {![regexp -nocase {<div id="v.*?" class="fpcc"><div><h1 class="smuy">(.*?)\s(.*?)\s} $html - match1]} {
4951
               if {![regexp -nocase {<div id="v.*?" class="fpcc"><div>(.*?)\s(.*?)\s} $html - match1]} {
4952
                 regexp -nocase {<div id="v.*?" class="fpcc">.*?\s.+?\s.*?\:\s*(.+?)\s} $html - auctions match1
4953
                 set match1 "[join [scan  $match1 "%d%d"] ""]"
4954
               }
4955
             }
4956
           }
4957
        }
4958
      }
4959
4960
      # fetch the second result
4961
      set html [fetch_html $word2 25]
4962
      regexp -- {<div id="v.*?" class="fpcc">(.+?)\s} $html - match2
4963
      if {![regexp -- {class="sectiontitle">([0-9  .,]+)\002.*?<h2 class="standard ens} $html - match2]} {
4964
        if {![regexp -- {<div class="count">([0-9  .,]+) } $html - match2]} {
4965
           if {![regexp -- {var.*?getCustomAdConfig.*?,"items=(.+?)"} $html - match2]} {
4966
             if {![regexp -nocase {<div id="v.*?" class="fpcc"><div><h1 class="smuy">(.*?)\s(.*?)\s} $html - match2]} {
4967
               if {![regexp -nocase {<div id="v.*?" class="fpcc"><div>(.*?)\s(.*?)\s} $html - match2]} {
4968
                 regexp -nocase {<div id="v.*?" class="fpcc">.*?\s.+?\s.*?\:\s*(.+?)\s} $html - auctions match2
4969
                 set match2 "[join [scan  $match2 "%d%d"] ""]"
4970
               }
4971
             }
4972
           }
4973
        }
4974
      }
4975
4976
      # clean up our matches, so it looks all tidy and neat.
4977
      regsub -all "\002" $match1 " " match1
4978
      regsub -all "\002" $match2 " " match2
4979
4980
      if {![info exists match1]} {
4981
        set match1 "0"
4982
        set match1expr "0"
4983
      } else {
4984
        regsub -all {,} $match1 {} match1expr
4985
      }
4986
4987
      if {![info exists match2]} {
4988
        set match2 "0"
4989
        set match2expr "0"
4990
      } else {
4991
        regsub -all {,} $match2 {} match2expr
4992
      }
4993
4994
      if {[expr $match2expr < $match1expr]} {
4995
        set winner 1
4996
      } else {
4997
        set winner 2
4998
      }
4999
5000
      if {[expr $match2expr == $match1expr]} {
5001
        set winner 1
5002
        set troll1 {
5003
         Pissing Shitting SpillingPez DrippingCum Trolling
5004
        } 
5005
        set troll2 {
5006
         YourFace YourSister YourMama
5007
        } 
5008
        set match1 "[lindex $troll1 [rand [llength $troll1]]]"
5009
        set match2 "[lindex $troll2 [rand [llength $troll2]]]"
5010
      }
5011
5012
      if {$incith::google::bold_descriptions > 0 && $incith::google::desc_modes == ""} {
5013
        set word1 "\002$word1\002"; set word2 "\002$word2\002"
5014
        set match1 "\002 $match1\002"; set match2 "\002 $match2\002"
5015
      } elseif {$incith::google::desc_modes != ""} {
5016
        set word1 "$incith::google::desc_modes$word1$incith::google::desc_demodes"; set word2 "$incith::google::desc_modes$word2$incith::google::desc_demodes"
5017
        set match1 " $incith::google::desc_modes$match1$incith::google::desc_demodes"; set match2 " $incith::google::desc_modes$match2$incith::google::desc_demodes"
5018
      } else {
5019
        set match1 " $match1"; set match2 " $match2"
5020
      }
5021
5022
      regsub -all " " $match1 "" match1
5023
      regsub -all " " $match2 "" match2
5024
5025
      if {$winner == 1} {
5026
        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"
5027
      } elseif {$winner == 2} {
5028
        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"
5029
      } else {
5030
        set output "${::incith::google::total_modes}Could not determine the winner."
5031
      }
5032
5033
      # make sure we have something to send
5034
      if {[info exists output] == 0} {
5035
        set reply "Sorry, no search results were found."
5036
        if {[info exists did_you_mean] == 1} {
5037
          append reply " Did you mean: ${did_you_mean}?"
5038
        }
5039
        return "$incith::google::desc_modes$reply$::incith::google::desc_demodes"
5040
      }
5041
      return $output
5042
    }
5043
5044
    # Popular
5045
    # fetches games results from gamerankings.
5046
    # -speechless supplied
5047
    #
5048
    proc popular {input} {
5049
5050
      # lots of variables, keeping them clean is important.
5051
      # borrowed mostly from my ebay proc above.
5052
      ; set results 0 ; set output "" ; set tresult ""
5053
      ; set ebcU "" ; set ebcI "" ; set ebcBid "" ; set ebcPR ""
5054
      ; set ebcCheck "" ; set html ""
5055
      
5056
      # redundant and messy, yes i know.. but it works, k
5057
      # parses the query and reads html according to system desired.
5058
5059
      if {[string match -nocase "gc" $input] == 1} {
5060
        set html [fetch_html "0" 30]
5061
        set output "\002GameRankings BEST GameCube\002"
5062
      }
5063
      if {[string match -nocase "pc" $input] == 1} {
5064
        set html [fetch_html "0" 31]
5065
        set output "\002GameRankings BEST PC\002"
5066
      }
5067
      if {[string match -nocase "ps2" $input] == 1} {
5068
        set html [fetch_html "0" 32]
5069
        set output "\002GameRankings BEST PlayStation2\002"
5070
      }
5071
      if {[string match -nocase "ps3" $input] == 1} {
5072
        set html [fetch_html "0" 33]
5073
        set output "\002GameRankings BEST PlayStation3\002"
5074
      }
5075
      if {[string match -nocase "wii" $input] == 1} {
5076
        set html [fetch_html "0" 34]
5077
        set output "\002GameRankings BEST Wii\002"
5078
      }
5079
      if {[string match -nocase "xbox" $input] == 1} {
5080
        set html [fetch_html "0" 35]
5081
        set output "\002GameRankings BEST Xbox\002"
5082
      }
5083
      if {[string match -nocase "x360" $input] == 1} {
5084
        set html [fetch_html "0" 36]
5085
        set output "\002GameRankings BEST Xbox360\002"
5086
      }
5087
      if {[string match -nocase "ds" $input] == 1} {
5088
        set html [fetch_html "0" 37]
5089
        set output "\002GameRankings BEST NDS\002"
5090
      }
5091
      if {[string match -nocase "gba" $input] == 1} {
5092
        set html [fetch_html "0" 38]
5093
        set output "\002GameRankings BEST GBA\002"
5094
      }
5095
      if {[string match -nocase "psp" $input] == 1} {
5096
        set html [fetch_html "0" 39]
5097
        set output "\002GameRankings BEST PSP\002"
5098
      }
5099
      if {[string match -nocase "mobile" $input] == 1} {
5100
        set html [fetch_html "0" 40]
5101
        set output "\002GameRankings BEST Mobile\002"
5102
      }
5103
      if {[string match -nocase "ngage" $input] == 1} {
5104
        set html [fetch_html "0" 41]
5105
        set output "\002GameRankings BEST N-Gage\002"
5106
      }
5107
      if {[string match -nocase "3do" $input] == 1} {
5108
        set html [fetch_html "0" 42]
5109
        set output "\002GameRankings BEST 3DO\002"
5110
      }
5111
      if {[string match -nocase "dc" $input] == 1} {
5112
        set html [fetch_html "0" 43]
5113
        set output "\002GameRankings BEST Dreamcast\002"
5114
      }
5115
      if {[string match -nocase "gen" $input] == 1} {
5116
        set html [fetch_html "0" 44]
5117
        set output "\002GameRankings BEST Genesis\002"
5118
      }
5119
      if {[string match -nocase "jag" $input] == 1} {
5120
        set html [fetch_html "0" 45]
5121
        set output "\002GameRankings BEST Jaguar\002"
5122
      }
5123
      if {[string match -nocase "n64" $input] == 1} {
5124
        set html [fetch_html "0" 46]
5125
        set output "\002GameRankings BEST N64\002"
5126
      }
5127
      if {[string match -nocase "neo" $input] == 1} {
5128
        set html [fetch_html "0" 47]
5129
        set output "\002GameRankings BEST Neo-Geo\002"
5130
      }
5131
      if {[string match -nocase "ps1" $input] == 1} {
5132
        set html [fetch_html "0" 48]
5133
        set output "\002GameRankings BEST Playstation\002"
5134
      }
5135
      if {[string match -nocase "sat" $input] == 1} {
5136
        set html [fetch_html "0" 49]
5137
        set output "\002GameRankings BEST Saturn\002"
5138
      }
5139
      if {[string match -nocase "snes" $input] == 1} {
5140
        set html [fetch_html "0" 50]
5141
        set output "\002GameRankings BEST Snes\002"
5142
      }
5143
      if {[string match -nocase "segacd" $input] == 1} {
5144
        set html [fetch_html "0" 52]
5145
        set output "\002GameRankings BEST Sega-CD\002"
5146
      }
5147
      if {[string match -nocase "gameboy" $input] == 1} {
5148
        set html [fetch_html "0" 53]
5149
        set output "\002GameRankings BEST GameBoy\002"
5150
      }
5151
      if {[string match -nocase "gbc" $input] == 1} {
5152
        set html [fetch_html "0" 54]
5153
        set output "\002GameRankings BEST GameBoy Color\002"
5154
      }
5155
      if {[string match -nocase "all" $input] == 1} {
5156
        set html [fetch_html "0" 55]
5157
        set output "\002GameRankings BEST -ALL-\002"
5158
      }
5159
      if {[string match -nocase "3ds" $input] == 1} {
5160
        set html [fetch_html "0" 57]
5161
        set output "\002GameRankings BEST 3DS\002"
5162
      }
5163
      if {[string match -nocase "mac" $input] == 1} {
5164
        set html [fetch_html "1" 58]
5165
        set output "\002GameRankings WORST MAC\002"
5166
      }
5167
5168
      if {[string match -nocase "*http://www.gamespot.com/gamerankings/offline.html*" $html]} {
5169
        append output "${incith::google::seperator}${::incith::google::error_modes}We're sorry, we are temporarily offline.  We'll be back as soon as possible."
5170
        return $output
5171
      }
5172
      if {[string match -nocase "*Temporarily Unavailable*" $html]} {
5173
        append output "${incith::google::seperator}${::incith::google::error_modes}GameRankings is Temporarily Unavailable."
5174
        return $output
5175
      }
5176
      if {$output == ""} {
5177
        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"
5178
      } else { set output "$::incith::google::total_modes$output$::incith::google::total_demodes" }
5179
5180
      regsub -all "(?:\t|\n|\r|\v)" $html "" html
5181
       
5182
      # remove the bold if it isn't desired.
5183
      if {$incith::google::bold_descriptions == 0} {
5184
        regsub -all -- "\002" $output {} output
5185
      }
5186
5187
      # parse for results and loop until desired amount of results
5188
      # is attempted to be reached if possible.
5189
      while {$results < $incith::google::popular_results && $output != ""} {
5190
        # grab date and game title and clear future html of it for looping
5191
        if {[regexp -- {<col class="game" />.*?<tr.+?<td>.*?<td>(.*?)</td>.*?<a href=.+?">(.+?)</a>.*?<br />(.+?)</td><td>(.+?)<} $html - sys game pub date]} {
5192
          regsub -- {><tr.*?<td>.*?</td></tr} $html "" html
5193
          regsub -- {<nobr>} $date "" date
5194
        }
5195
5196
        # if there's no desc, return or stop looping, depending
5197
        if {![info exists game]} {
5198
          if {$results == 0} {
5199
            set reply "Sorry, no search results were found."
5200
            return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
5201
          } else {
5202
            break
5203
          }
5204
        }
5205
5206
        # add the search result
5207
        # add game to output if there is one
5208
        if {[info exists game]} {
5209
          if {[string match -nocase "all" $input] == 1} {
5210
            append output "${incith::google::seperator}$::incith::google::desc_modes\002${game}\002 ($sys) by $pub (${date})$::incith::google::desc_demodes"
5211
          } else {
5212
            append output "${incith::google::seperator}$::incith::google::desc_modes\002${game}\002 by $pub (${date})$::incith::google::desc_demodes"
5213
          }
5214
          unset game; unset date
5215
        }
5216
        # increase the results, clear the variables for the next loop just in case
5217
        incr results
5218
      }
5219
      # if we have nothing to send, we have no results :(
5220
      if {$output == ""} {
5221
        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"
5222
      }
5223
      return $output
5224
    }
5225
5226
    # Recent Games
5227
    # fetches games results from Gamerankings.
5228
    # -speechless supplied
5229
    #
5230
    proc recent {input} {
5231
5232
      # lots of variables, keeping them clean is important.
5233
      # borrowed mostly from my ebay proc above.
5234
      ; set results 0 ; set output "" ; set tresult ""
5235
      ; set ebcU "" ; set ebcI "" ; set ebcBid "" ; set ebcPR ""
5236
      ; set ebcCheck "" ; set html ""
5237
      
5238
      # redundant and messy, yes i know.. but it works, k
5239
      # parses the query and reads html according to system desired.
5240
5241
      if {[string match -nocase "gc" $input] == 1} {
5242
        set html [fetch_html "1" 30]
5243
        set output "\002GameRankings WORST GameCube\002"
5244
      }
5245
      if {[string match -nocase "pc" $input] == 1} {
5246
        set html [fetch_html "1" 31]
5247
        set output "\002GameRankings WORST PC\002"
5248
      }
5249
      if {[string match -nocase "ps2" $input] == 1} {
5250
        set html [fetch_html "1" 32]
5251
        set output "\002GameRankings WORST PlayStation2\002"
5252
      }
5253
      if {[string match -nocase "ps3" $input] == 1} {
5254
        set html [fetch_html "1" 33]
5255
        set output "\002GameRankings WORST PlayStation3\002"
5256
      }
5257
      if {[string match -nocase "wii" $input] == 1} {
5258
        set html [fetch_html "1" 34]
5259
        set output "\002GameRankings WORST Wii\002"
5260
      }
5261
      if {[string match -nocase "xbox" $input] == 1} {
5262
        set html [fetch_html "1" 35]
5263
        set output "\002GameRankings WORST Xbox\002"
5264
      }
5265
      if {[string match -nocase "x360" $input] == 1} {
5266
        set html [fetch_html "1" 36]
5267
        set output "\002GameRankings WORST Xbox360\002"
5268
      }
5269
      if {[string match -nocase "ds" $input] == 1} {
5270
        set html [fetch_html "1" 37]
5271
        set output "\002GameRankings WORST NDS\002"
5272
      }
5273
      if {[string match -nocase "gba" $input] == 1} {
5274
        set html [fetch_html "1" 38]
5275
        set output "\002GameRankings WORST GBA\002"
5276
      }
5277
      if {[string match -nocase "psp" $input] == 1} {
5278
        set html [fetch_html "1" 39]
5279
        set output "\002GameRankings WORST PSP\002"
5280
      }
5281
      if {[string match -nocase "mobile" $input] == 1} {
5282
        set html [fetch_html "1" 40]
5283
        set output "\002GameRankings WORST Mobile\002"
5284
      }
5285
      if {[string match -nocase "ngage" $input] == 1} {
5286
        set html [fetch_html "1" 41]
5287
        set output "\002GameRankings WORST N-Gage\002"
5288
      }
5289
      if {[string match -nocase "3do" $input] == 1} {
5290
        set html [fetch_html "1" 42]
5291
        set output "\002GameRankings WORST 3D0\002"
5292
      }
5293
      if {[string match -nocase "dc" $input] == 1} {
5294
        set html [fetch_html "1" 43]
5295
        set output "\002GameRankings WORST Dreamcast\002"
5296
      }
5297
      if {[string match -nocase "gen" $input] == 1} {
5298
        set html [fetch_html "1" 44]
5299
        set output "\002GameRankings WORST Genesis\002"
5300
      }
5301
      if {[string match -nocase "jag" $input] == 1} {
5302
        set html [fetch_html "1" 45]
5303
        set output "\002GameRankings WORST Jaguar\002"
5304
      }
5305
      if {[string match -nocase "n64" $input] == 1} {
5306
        set html [fetch_html "1" 46]
5307
        set output "\002GameRankings WORST N64\002"
5308
      }
5309
      if {[string match -nocase "neo" $input] == 1} {
5310
        set html [fetch_html "1" 47]
5311
        set output "\002GameRankings WORST Neo-Geo\002"
5312
      }
5313
      if {[string match -nocase "ps1" $input] == 1} {
5314
        set html [fetch_html "1" 48]
5315
        set output "\002GameRankings WORST Playstation\002"
5316
      }
5317
      if {[string match -nocase "sat" $input] == 1} {
5318
        set html [fetch_html "1" 49]
5319
        set output "\002GameRankings WORST Saturn\002"
5320
      }
5321
      if {[string match -nocase "snes" $input] == 1} {
5322
        set html [fetch_html "1" 50]
5323
        set output "\002GameRankings WORST Snes\002"
5324
      }
5325
      if {[string match -nocase "segacd" $input] == 1} {
5326
        set html [fetch_html "1" 52]
5327
        set output "\002GameRankings WORST Sega-CD\002"
5328
      }
5329
      if {[string match -nocase "gameboy" $input] == 1} {
5330
        set html [fetch_html "1" 53]
5331
        set output "\002GameRankings WORST GameBoy\002"
5332
      }
5333
      if {[string match -nocase "gbc" $input] == 1} {
5334
        set html [fetch_html "1" 54]
5335
        set output "\002GameRankings WORST GameBoy Color\002"
5336
      }
5337
      if {[string match -nocase "all" $input] == 1} {
5338
        set html [fetch_html "1" 55]
5339
        set output "\002GameRankings WORST -ALL-\002"
5340
      }
5341
      if {[string match -nocase "3ds" $input] == 1} {
5342
        set html [fetch_html "1" 57]
5343
        set output "\002GameRankings WORST 3DS\002"
5344
      }
5345
      if {[string match -nocase "mac" $input] == 1} {
5346
        set html [fetch_html "1" 58]
5347
        set output "\002GameRankings WORST MAC\002"
5348
      }
5349
5350
      if {[string match -nocase "*http://www.gamespot.com/gamerankings/offline.html*" $html]} {
5351
        append output "${incith::google::seperator}${::incith::google::error_modes}We're sorry, we are temporarily offline.  We'll be back as soon as possible."
5352
        return $output
5353
      }
5354
      if {[string match -nocase "*Temporarily Unavailable*" $html]} {
5355
        append output "${incith::google::seperator}${::incith::google::error_modes}GameRankings is Temporarily Unavailable."
5356
        return $output
5357
      }
5358
      if {$output == ""} {
5359
        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"
5360
      } else { set output "$::incith::google::total_modes$output$::incith::google::total_demodes" }
5361
5362
      regsub -all "(?:\t|\n|\r|\v)" $html "" html
5363
5364
      # remove the bold if it isn't desired.
5365
      if {$incith::google::bold_descriptions == 0} {
5366
        regsub -all -- "\002" $output {} output
5367
      }
5368
5369
      # parse for results and loop until desired amount of results
5370
      # is attempted to be reached if possible.
5371
      while {$results < $incith::google::popular_results && $output != ""} {
5372
      
5373
        # grab date and game title and clear future html of it for looping
5374
        if {[regexp -- {<col class="game" />.*?<tr.+?<td>.*?<td>(.*?)</td>.*?<a href=.+?">(.+?)</a>.*?<br />(.+?)</td><td>(.+?)<} $html - sys game pub date]} {
5375
          regsub -- {><tr.*?<td>.*?</td></tr} $html "" html
5376
          regsub -- {<nobr>} $date "" date
5377
        }
5378
5379
        # if there's no desc, return or stop looping, depending
5380
        if {![info exists game]} {
5381
          if {$results == 0} {
5382
            set reply "Sorry, no search results were found."
5383
            return "$::incith::google::desc_modes$reply$::incith::google::desc_modes"
5384
          } else {
5385
            break
5386
          }
5387
        }
5388
5389
        # add the search result
5390
        # add game to output if there is one
5391
        if {[info exists game]} {
5392
          if {[string match -nocase "all" $input] == 1} {
5393
            append output "${incith::google::seperator}$::incith::google::desc_modes\002${game}\002 ($sys) by $pub (${date})$::incith::google::desc_demodes"
5394
          } else {
5395
            append output "${incith::google::seperator}$::incith::google::desc_modes\002${game}\002 by $pub (${date})$::incith::google::desc_demodes"
5396
          }
5397
          unset game; unset date
5398
        }
5399
        # increase the results, clear the variables for the next loop just in case
5400
        incr results
5401
      }
5402
      # if we have nothing to send, we have no results :(
5403
      if {$output == ""} {
5404
        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"
5405
      }
5406
      return "$output"
5407
    }
5408
5409
    # Google Trends
5410
    # fetches top search terms from google
5411
    # -speechless supplied
5412
    #
5413
    proc trends {input} {
5414
5415
      # lots of variables, keeping them clean is important.
5416
      ; set results 0 ; set output "" ; set tresult "" ; set no_results "" ; set no_search ""
5417
5418
      set html [fetch_html $input 13]
5419
5420
      # user input causing errors?
5421
	if {[string match -nocase "*socketerrorabort*" $html]} {
5422
            regsub {(.+?)\|} $html {} html
5423
            return "${::incith::google::error_modes}Socket Error accessing '${html}' .. Does it exist?${::incith::google::error_demodes}" 
5424
	}
5425
	if {[string match -nocase "*timeouterrorabort*" $html]} {
5426
		return "${::incith::google::error_modes}Connection has timed out...${::incith::google::error_demodes}" 
5427
	}
5428
5429
      # give location results we are displaying.
5430
      regexp -- {<table width=100%  cellpadding=2 cellspacing=0 bgcolor=#E5ECF9><tr><td>(.+?)</td>} $html - tresult
5431
      if {$tresult != ""} { set output "$::incith::google::total_modes${tresult}$::incith::google::total_demodes${incith::google::seperator}" }
5432
5433
      # get what we call the no_search for any language.
5434
      if {[string match "*system_down.html*" $html]} {
5435
        set no_search "$::incith::google::error_modes\002Trends Error:\002 System appears to be down, try again later.$::incith::google::error_demodes"
5436
      } else {
5437
         if {[regexp -- {<br><br>(.+?)</p>} $html - no_search]} {
5438
          regsub -- {<p>} $no_search { } no_search
5439
        } else {
5440
          if {![regexp -- {<ul><li>(.+?)</ul>} $html - no_search]} {
5441
            regexp -- {</table><p>(.+?)</p>} $html - no_search
5442
          }
5443
        }
5444
      }
5445
5446
      # remove the bold if it isn't desired.
5447
      if {$incith::google::bold_descriptions == 0} {
5448
        regsub -all -- "\002" $output {} output
5449
      }
5450
5451
      # parse for results and loop until desired amount of results
5452
      # is attempted to be reached if possible.
5453
      while {$results < $incith::google::trends_results} {
5454
        set link "$::incith::google::total_modes\002[expr $results + 1]\002$::incith::google::total_demodes"
5455
        # grab our trend and cut it out
5456
        regexp -- {<td class=num>.+?<a href=.+?>(.+?)</a>} $html {} desc
5457
        regsub -- {<td class=num>.+?<a href=.+?>(.+?)</a>} $html "" html
5458
        if {[info exists desc]} {
5459
          append link " $incith::google::desc_modes$desc$::incith::google::desc_demodes"
5460
        } else {
5461
          if {$results == 0} {
5462
            set reply "${no_search}"
5463
            return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
5464
          } else {
5465
            break
5466
          }
5467
        }
5468
5469
        # add the search result
5470
        # add game to output if there is one
5471
        if {[info exists desc]} {
5472
          append output "${link}${incith::google::split_char}"
5473
        }
5474
        # increase the results, clear the variables for the next loop just in case
5475
        unset desc; unset link
5476
        incr results
5477
      }
5478
      # if we have nothing to send, we have no results :(
5479
      if {$output == ""} {
5480
        set output "$::incith::google::desc_modes${no_search}$::incith::google::desc_demodes"
5481
      }
5482
      return [string trim $output $incith::google::split_char]
5483
    }
5484
5485
    # Gamespot Game Review
5486
    # fetches review results from gamespot searches.
5487
    # -speechless supplied
5488
    #
5489
    proc rev {input} {
5490
      global incithcookie
5491
      # lots of variables, keeping them clean is important..
5492
      ; set results "" ; set output "" ; set tresult ""; set inputb ""
5493
      ; set ebcU "" ; set ebcI "" ; set ebcPR "" ; set review ""
5494
      ; set us "?" ; set them "?" ; set you "?" ; set stats "" ; set vid ""
5495
5496
      regexp -nocase -- {^(.+?) @ (.+?)$} $input - input inputb
5497
      
5498
      # fetch the html
5499
      set html [fetch_html $input 12]
5500
      regsub -all {\\n} $html "" html
5501
      if {[string match "*NO RESULTS RETURNED*" $html]} {
5502
        set reply "${::incith::google::desc_modes}Sorry, no search results were found."
5503
        return $reply
5504
      }
5505
5506
      if {$inputb != ""} {
5507
        while {$results == ""} {
5508
          # this could break any second, its cumbersome and long..i know, but for now it works.
5509
          regexp -- {<div class=\\"result_title\\">.*?<a href=\\"(.+?)\?tag=result.*?\\">(.+?)<\\/a>} $html - ebcU ebcI
5510
          set ebcU [string map {"\\" ""} $ebcU]
5511
          if {[string match -nocase "*\(${inputb}\)*" $ebcI] == 1} { set results "true" }
5512
          if {$ebcU == $ebcPR} { 
5513
            regsub -all { } $input {%20} input
5514
            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"
5515
          }
5516
          regsub -- {<div class=\\"result_title\\">.*?<a href=\\".+?\\">.+?<\\/a>} $html "" html
5517
          set ebcPR $ebcU
5518
        }
5519
      }
5520
5521
      # get url snippet where game review can be pulled
5522
      if {$inputb == ""} {
5523
        if {[regexp -- {<div class=\\"result_title\\">.*?<a href=\\"(.+?)\?tag=result.*?\\">(.+?)<\\/a>} $html - ebcU ebcI]} {
5524
          set ebcU [string map {"\\" ""} $ebcU]
5525
        }
5526
      }
5527
      # if no snippet there is nothing more to do
5528
      if {$ebcU == "" } { return "${::incith::google::desc_modes}Sorry, no search results were found." }
5529
      # grab game review
5530
      set query "${ebcU}"
5531
      set ebcU ""; set ebcI ""; set ebcPR ""
5532
      regexp -- {(.+?)&q=} $query {} query
5533
      regexp -- {(.+?)\?q=} $query {} query
5534
      if {![string match "*http*" $query]} {
5535
        set query "http://www.gamespot.com${query}"
5536
      } 
5537
5538
      # beware, changing the useragent will result in differently formatted html from Google.
5539
      set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e"
5540
      set http [::http::config -useragent $ua]
5541
      set http [::http::geturl $query -headers $::incith_hdr -timeout [expr 1000 * 10]]
5542
      if {$::incith::google::debug > 0 } {
5543
        putserv "privmsg $incith::google::debugnick :\002url \([::http::ncode $http]\):\002 $query"
5544
      }
5545
      upvar #0 $http state
5546
      set html [ungzip [::http::data $http] $state(meta)]
5547
      ::http::cleanup $http
5548
      # strip the html down
5549
        regsub -all "\t" $html "" html
5550
        regsub -all "\n" $html "" html
5551
        regsub -all "\r" $html "" html
5552
        regsub -all "\v" $html "" html
5553
        regsub -all "<script.*?>.*?</script>" $html "" html
5554
      # DEBUG DEBUG                    
5555
      set junk [open "ig-debug.txt" w]
5556
      puts $junk $html
5557
      close $junk
5558
5559
      if {![regexp -- {<div class="module_title_wrap">(.*?)</div></div>} $html - name]} {
5560
        regexp -- {<title>(.+?) \- } $html {} name
5561
        # sometimes our game and system cut isn't pretty this cleans it up
5562
        regexp -- {(.+?)<.+?title} $name - name
5563
        set name [string trim $name]
5564
      } else {
5565
        regsub -- {</h1>} $name " " name
5566
        regsub -all -- {<.*?>} $name "" name
5567
	}
5568
5569
      if {[regexp -- {\&tag=scoresummary%3Bgs-score">(.+?)<} $html - us]} {
5570
         regsub -- {<.*?>} $us "" us
5571
      }
5572
      if {[regexp -- {\&tag=scoresummary%3Bcritic-score">(.+?)<} $html - them]} {
5573
        regsub -- {<.*?>} $them "" them
5574
      }
5575
      regexp -- {\?tag=scoresummary%3Buser-score">(.+?)<} $html - you
5576
      if {[regexp -- {<ul class="stats">(.+?)<div class="actions">} $html - stats]} {
5577
        regsub {<div class="label">Top 5 User Tags\:.+?</ol>} $stats "" stats
5578
        regsub {<div class="desc">.+?</ul>} $stats "" stats
5579
        regsub {<li class="stat universe">.+?</ul>} $stats "" stats
5580
        regsub -all {<.+?>} $stats "" stats
5581
        while {[string match "*  *" $stats]} {
5582
          regsub -all -- {  } $stats " " stats
5583
        }
5584
        regsub {More Info Game Stats} $stats "» «" stats
5585
        regsub {Tracking\:.+?Wish It&raquo;} $stats "» «" stats
5586
        regsub -all {&raquo;} $stats "» «" stats
5587
        regsub -all {/\s»} $stats "»" stats
5588
        regsub -all {«\s/} $stats "«" stats
5589
      }
5590
      if {[regexp {<p class="review deck".*?>(.+?)</p>} $html - review]} {
5591
        regsub -all -- {<.*?>} $review "" review
5592
        set review " « $review »"
5593
      } elseif {[regexp {<p class="product deck".*?>(.+?)</p>} $html - review]} {
5594
        regsub -all -- {<.*?>} $review "" review
5595
        set review " « $review »"
5596
      } 
5597
      if {[regexp -- {<ul class="videos">.+?<a href="(.+?)".*?">(.+?)</a>} $html - vurl vid]} {
5598
        if {[regexp -nocase -- {a href=""} $vid]} {
5599
          if {[regexp -- {<div class="module videos">.*?<div class="head">.*?href="(.*?)">(.*?)</a>} $html - vurl vid]} {
5600
            set vurl "http://www.gamespot.com$vurl" 
5601
          }
5602
        } else {
5603
          regexp -- {^(.+?)?tag=;} $vurl - vurl
5604
        }
5605
        if {[string match "/" [string index $vurl 0]]} { set vurl "http://www.gamespot.com$vurl" }
5606
        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"
5607
      }
5608
      set desc "[descdecode "${name} \(us\002$us\002 them\002$them\002 you\002$you\002\) «$stats»$review"]"
5609
      # make sure we have something to send
5610
      set output "$::incith::google::desc_modes${desc}$::incith::google::desc_demodes$::incith::google::break$::incith::google::link_modes${query}$::incith::google::link_demodes$vid"
5611
      return $output
5612
    }
5613
5614
    # IGN
5615
    # fetches games results from ign searches.
5616
    # -speechless supplied
5617
    #
5618
    proc ign {input} {
5619
5620
      # lots of variables, keeping them clean is important.
5621
      # borrowed mostly from my ebay proc above.
5622
      ; set results 0 ; set output "" ; set tresult ""
5623
      ; set ebcU "" ; set ebcI "" ; set ebcBid "" ; set ebcPR ""
5624
      ; set ebcCheck "" ; set match ""
5625
5626
      # fetch the html
5627
      set html [fetch_html $input 26]
5628
5629
      if {$html == ""} { return "${::incith::google::error_modes}IGN search page appears to be blank... No results maybe?!" }
5630
5631
      # give results an output header with result tally.
5632
      # regexp -- {All Products \(([,0-9]{1,})\)<br/>} $html - match
5633
      set match "iGN"
5634
5635
      # format output according to variables.
5636
      if {$match != ""} {
5637
        set output "$::incith::google::total_modes\002${match}\002 results$::incith::google::total_demodes${incith::google::seperator}"
5638
        if {$incith::google::bold_descriptions == 0} {
5639
          regsub -all -- "\002" $output {} output
5640
        }
5641
      } else {
5642
        regexp -- {<p.*?class="searchResultTitle">(.+?)</p>} $html - match
5643
        set output "${match}$::incith::google::seperator"
5644
      }
5645
5646
      if {[regexp -- {<p class="searchResultTitle".+?<strong>(.+?)<br} $html - no_search]} {
5647
        return $no_search
5648
      }
5649
5650
      # parse the html
5651
      while {$results < $incith::google::ign_results} {
5652
        # this could break any second, its cumbersome and long..i know, but for now it works.
5653
        regexp -- {<h3 class="game-title"><a href="(.*?)">(.*?)</h3>} $html - ebcU ebcI 
5654
        if {![regexp -- {class="publisherLink">(.*?)</a>(.*?)</p>} $html - ebcBid desc]} {
5655
          regexp -- {<div id="articleType"><strong>(.+?)</strong>} $html - ebcBid
5656
          set desc ""
5657
        } else {
5658
          set desc [string trim $desc "- "]
5659
          regsub -all -- {\s+} $desc " " desc
5660
          if {[string length $desc]} {
5661
            set desc " - $desc"
5662
          }
5663
        }
5664
        regsub -- {<h3 class="game-title">(.+?)</div>} $html "" html
5665
5666
        # check results are more than 0, return or stop looping, depending
5667
        if {![string length $ebcU]} {
5668
          if {$results == 0} {
5669
            regexp -nocase -- {<p class="searchFail">(.*?)</p>} $html - reply
5670
            return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
5671
          } else {
5672
            break
5673
          }
5674
        }
5675
5676
        # this needs to be done for user formatting of links and descriptions.
5677
        set link "${ebcU}"
5678
5679
        # prevent duplicate results is mostly useless here, but will at least
5680
        # ensure that we don't get the exact same article.
5681
        if {[string match "*$link*" $output] == 1} {
5682
         break
5683
        }
5684
5685
        # ign clutters with excess spacing to make parsing hard
5686
        # this is a quick and dirty way to get through the mud.
5687
 
5688
        #clean up messy parsing.
5689
        regsub -all {<script type=.+?script>} $ebcBid {} ebcBid
5690
        regsub -all -- {<(.+?)>} $ebcBid {} ebcBid
5691
        while {[string match "*  *" $ebcBid]} {
5692
          regsub -all -- {  } $ebcBid " " ebcBid
5693
        }
5694
        set ebcBid [string trim $ebcBid]
5695
        regexp -- {^(.*?)</a>(.*?)$} $ebcI - ebcI plat
5696
        regexp -- {<span class="platform default">(.*?)</span>} $ebcI - plat
5697
        regexp -- {^(.*?)</a>} $ebcI - ebcI
5698
        regsub -all -- {\s+} $plat { } plat
5699
        # set formatting.
5700
        set desc "${ebcI} ([string totitle $plat] by ${ebcBid})$desc"
5701
        if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
5702
        if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" }
5703
5704
        # add the search result
5705
        if {$incith::google::link_only == 1} { 
5706
          append output "${link}${incith::google::seperator}"
5707
        } else {
5708
          append output "[descdecode ${desc}]$::incith::google::break${link}${incith::google::seperator}"
5709
        }
5710
5711
        # increase the results, clear the variables for the next loop just in case
5712
        unset link ; set ebcCheck ""
5713
        incr results
5714
      }
5715
5716
      # make sure we have something to send
5717
      if {[info exists output] == 0} {
5718
        set reply "Sorry, no search results were found."
5719
        return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
5720
      }
5721
      return $output
5722
    }
5723
5724
    # GameSpot
5725
    # fetches games results from gamespot searches.
5726
    # -speechless supplied
5727
    #
5728
    proc gamespot {input} {
5729
      
5730
      # lots of variables, keeping them clean is important.
5731
      # borrowed mostly from my ebay proc above.
5732
      ; set results 0 ; set output "" ; set tresult ""
5733
      ; set type "" ; set name ""
5734
      ; set details "" ; set deck ""
5735
5736
      # fetch the html
5737
      set html [fetch_html $input 12]
5738
      regsub -all {\\n} $html "" html
5739
5740
      # set up gamespot results header so results can be appended to it.
5741
      regexp -- {,"num_results"\:"(.+?)"} $html {} tresult
5742
      set tresult [string trim $tresult]
5743
      # format output according to variables.
5744
      if {$incith::google::total_results != 0} {
5745
        set output "$::incith::google::total_modes\002[string trim ${tresult}]\002 games$::incith::google::total_demodes${incith::google::seperator}"
5746
        if {$incith::google::bold_descriptions == 0} {
5747
          regsub -all -- "\002" $output {} output
5748
        }
5749
      }
5750
5751
      # parse the html
5752
      while {$results < $incith::google::gamespot_results} {
5753
        # this could break any second, its cumbersome and long..i know, but for now it works.
5754
        if {[regexp -- {<div class=\\"result_title\\">(.*?)<a href=\\"(.+?)\\">(.*?)<\\/a>.*?<div class=\\"details\\">(.*?)<\\/div>.+?<div class=\\"deck\\">(.*?)<\\/div>} $html - type link name details deck]} {
5755
          regexp -- {^(.+?)\?tag=result} $link - link
5756
          if {[string length $deck] > 0} {set deck " - [string trim $deck]"}
5757
          regsub -- {<div class=\\"result_title\\">.+?<div class=\\"deck\\">.+?<\\/div>} $html "" html
5758
          set details [string map {" | " "/"} $details]
5759
          set link [string map {"\\" ""} $link]
5760
          set desc "\002[string trim $type] [string trim $name]\002 \([string trim $details]\)$deck"
5761
        }
5762
        # check results are more than 0, return or stop looping, depending
5763
        if {![info exists link]} {
5764
          if {$results == 0} {
5765
            set reply "Sorry, no search results were found."
5766
            return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
5767
          } else {
5768
            break
5769
          }
5770
        }
5771
        regsub -all {<.+?>} $desc "" desc
5772
        # prevent duplicate results is mostly useless here, but will at least
5773
        # ensure that we don't get the exact same article.
5774
        if {[string match "*$link*" $output] == 1} {
5775
         break
5776
        }
5777
5778
        if {[info exists desc]} { set desc "$incith::google::desc_modes[string trim $desc]$incith::google::desc_demodes" }
5779
        if {[info exists link]} { set link "$incith::google::link_modes[string trim $link]$incith::google::link_demodes" }
5780
5781
        # add the search result
5782
        if {$incith::google::link_only == 1} { 
5783
          append output "${link}${incith::google::seperator}"
5784
        } else {
5785
          append output "${desc}$::incith::google::break${link}${incith::google::seperator}"
5786
        }
5787
5788
        # increase the results, clear the variables for the next loop just in case
5789
        unset link ; set name "" ; set deck "" ; set type "" ; set details ""
5790
        incr results
5791
      }
5792
5793
      # make sure we have something to send
5794
      if {[info exists output] == 0} {
5795
        set reply "Sorry, no search results were found."
5796
        return "$::incith::google::desc_modes$reply$::incith::google::desc_demodes"
5797
      }
5798
      return $output
5799
    }
5800
5801
    # TriggerBot
5802
    # Displays all the triggers this scripts is capable of
5803
    # explaining syntax, and also will let user know if trigger
5804
    # is disabled or how many results are available.
5805
    # -speechless supplied
5806
    #
5807
5808
    proc helpbot {nick input} {
5809
      set temp "" ; set output "" ; set num 0 ; set all 0
5810
      set item "" ; set found ""
5811
      if {[string tolower $input] == [lindex [split $incith::google::helplist " "] 0]} { set all 1 ; set found "all" }
5812
      if {$all == 0} {
5813
        foreach item [split $incith::google::helplist] {
5814
          if {[string tolower $input] == $item} { set found $item }
5815
        }
5816
        if {$found == ""} {
5817
           foreach item [split $incith::google::helplist " "] {
5818
             append temp "${item},"
5819
           }
5820
           set temp [string trimright $temp ","]
5821
           return "${incith::google::helpmsg1} ${temp}"
5822
        }
5823
      }
5824
      puthelp "NOTICE $nick :--> Bot triggers available:"
5825
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 1]} {
5826
        foreach trig [split $incith::google::google_binds " "] {
5827
          append temp "${incith::google::command_char}${trig},"
5828
        }
5829
        set temp [string trimright $temp ","]
5830
        if {$incith::google::search_results > 0} {
5831
          set item "${incith::google::helpmsg3}${incith::google::search_results}${incith::google::helpmsg4}"
5832
        } else {
5833
          set item "${incith::google::helpmsg2}"
5834
        }
5835
        puthelp "NOTICE $nick :${temp} ${incith::google::help1} ${item}"
5836
      }
5837
      set temp ""
5838
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 2]} {
5839
        foreach trig [split $incith::google::image_binds " "] {
5840
          append temp "${incith::google::command_char}${trig},"
5841
        }
5842
        set temp [string trimright $temp ","]
5843
        if {$incith::google::image_results > 0} {
5844
          set item "${incith::google::helpmsg3}${incith::google::image_results}${incith::google::helpmsg4}"
5845
        } else {
5846
          set item "${incith::google::helpmsg2}"
5847
        }
5848
        puthelp "NOTICE $nick :${temp} ${incith::google::help2} ${item}"
5849
      }
5850
      set temp ""
5851
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 3]} {
5852
        foreach trig [split $incith::google::group_binds " "] {
5853
          append temp "${incith::google::command_char}${trig},"
5854
        }
5855
        set temp [string trimright $temp ","]
5856
        if {$incith::google::group_results > 0} {
5857
          set item "${incith::google::helpmsg3}${incith::google::group_results}${incith::google::helpmsg4}"
5858
        } else {
5859
          set item "${incith::google::helpmsg2}"
5860
        }
5861
        puthelp "NOTICE $nick :${temp} ${incith::google::help3} ${item}"
5862
      }
5863
      set temp ""
5864
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 4]} {
5865
        foreach trig [split $incith::google::news_binds " "] {
5866
          append temp "${incith::google::command_char}${trig},"
5867
        }
5868
        set temp [string trimright $temp ","]
5869
        if {$incith::google::news_results > 0} {
5870
          set item "${incith::google::helpmsg3}${incith::google::news_results}${incith::google::helpmsg4}"
5871
        } else {
5872
          set item "${incith::google::helpmsg2}"
5873
        }
5874
        puthelp "NOTICE $nick :${temp} ${incith::google::help4} ${item}"
5875
      }
5876
      set temp ""
5877
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 5]} {
5878
        foreach trig [split $incith::google::local_binds " "] {
5879
          append temp "${incith::google::command_char}${trig},"
5880
        }
5881
        set temp [string trimright $temp ","]
5882
        if {$incith::google::local_results > 0} {
5883
          set item "${incith::google::helpmsg3}${incith::google::local_results}${incith::google::helpmsg4}"
5884
        } else {
5885
          set item "${incith::google::helpmsg2}"
5886
        }
5887
        puthelp "NOTICE $nick :${temp} ${incith::google::help5} ${item}"
5888
      }
5889
      set temp ""
5890
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 6]} {
5891
        foreach trig [split $incith::google::print_binds " "] {
5892
          append temp "${incith::google::command_char}${trig},"
5893
        }
5894
        set temp [string trimright $temp ","]
5895
        if {$incith::google::print_results > 0} {
5896
          set item "${incith::google::helpmsg3}${incith::google::print_results}${incith::google::helpmsg4}"
5897
        } else {
5898
          set item "${incith::google::helpmsg2}"
5899
        }
5900
        puthelp "NOTICE $nick :${temp} ${incith::google::help6} ${item}"
5901
      }
5902
      set temp ""
5903
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 7]} {
5904
        foreach trig [split $incith::google::video_binds " "] {
5905
          append temp "${incith::google::command_char}${trig},"
5906
        }
5907
        set temp [string trimright $temp ","]
5908
        if {$incith::google::video_results > 0} {
5909
          set item "${incith::google::helpmsg3}${incith::google::video_results}${incith::google::helpmsg4}"
5910
        } else {
5911
          set item "${incith::google::helpmsg2}"
5912
        }
5913
        puthelp "NOTICE $nick :${temp} ${incith::google::help7} ${item}"
5914
      }
5915
      set temp ""
5916
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 8]} {
5917
        foreach trig [split $incith::google::fight_binds " "] {
5918
          append temp "${incith::google::command_char}${trig},"
5919
        }
5920
        set temp [string trimright $temp ","]
5921
        if {$incith::google::google_fight > 0} {
5922
          set item "${incith::google::helpmsg3}${incith::google::google_fight}${incith::google::helpmsg4}"
5923
        } else {
5924
          set item "${incith::google::helpmsg2}"
5925
        }
5926
        puthelp "NOTICE $nick :${temp} ${incith::google::help8} ${item}"
5927
      }
5928
      set temp ""
5929
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 9]} {
5930
        foreach trig [split $incith::google::youtube_binds " "] {
5931
          append temp "${incith::google::command_char}${trig},"
5932
        }
5933
        set temp [string trimright $temp ","]
5934
        if {$incith::google::youtube_results > 0} {
5935
          set item "${incith::google::helpmsg3}${incith::google::youtube_results}${incith::google::helpmsg4}"
5936
        } else {
5937
          set item "${incith::google::helpmsg2}"
5938
        }
5939
        puthelp "NOTICE $nick :${temp} ${incith::google::help9} ${item}"
5940
      }
5941
      set temp ""
5942
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 10]} {
5943
        foreach trig [split $incith::google::trans_binds " "] {
5944
          append temp "${incith::google::command_char}${trig},"
5945
        }
5946
        set temp [string trimright $temp ","]
5947
        if {$incith::google::trans_results > 0} {
5948
          set item "${incith::google::helpmsg3}${incith::google::trans_results}${incith::google::helpmsg4}"
5949
        } else {
5950
          set item "${incith::google::helpmsg2}"
5951
        }
5952
        puthelp "NOTICE $nick :${temp} ${incith::google::help10} ${item}"
5953
      }
5954
      set temp ""
5955
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 11]} {
5956
        foreach trig [split $incith::google::gamespot_binds " "] {
5957
          append temp "${incith::google::command_char}${trig},"
5958
        }
5959
        set temp [string trimright $temp ","]
5960
        if {$incith::google::gamespot_results > 0} {
5961
          set item "${incith::google::helpmsg3}${incith::google::gamespot_results}${incith::google::helpmsg4}"
5962
        } else {
5963
          set item "${incith::google::helpmsg2}"
5964
        }
5965
        puthelp "NOTICE $nick :${temp} ${incith::google::help11} ${item}"
5966
      }
5967
      set temp ""
5968
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 12]} {
5969
        foreach trig [split $incith::google::gamefaq_binds " "] {
5970
          append temp "${incith::google::command_char}${trig},"
5971
        }
5972
        set temp [string trimright $temp ","]
5973
        if {$incith::google::gamefaq_results > 0} {
5974
          set item "${incith::google::helpmsg3}${incith::google::gamefaq_results}${incith::google::helpmsg4}"
5975
        } else {
5976
          set item "${incith::google::helpmsg2}"
5977
        }
5978
        puthelp "NOTICE $nick :${temp} ${incith::google::help12} ${item}"
5979
      }
5980
      set temp ""
5981
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 13]} {
5982
        foreach trig [split $incith::google::blog_binds " "] {
5983
          append temp "${incith::google::command_char}${trig},"
5984
        }
5985
        set temp [string trimright $temp ","]
5986
        if {$incith::google::blog_results > 0} {
5987
          set item "${incith::google::helpmsg3}${incith::google::blog_results}${incith::google::helpmsg4}"
5988
        } else {
5989
          set item "${incith::google::helpmsg2}"
5990
        }
5991
        puthelp "NOTICE $nick :${temp} ${incith::google::help13} ${item}"
5992
      }
5993
      set temp ""
5994
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 14]} {
5995
        foreach trig [split $incith::google::ebay_binds " "] {
5996
          append temp "${incith::google::command_char}${trig},"
5997
        }
5998
        set temp [string trimright $temp ","]
5999
        if {$incith::google::ebay_results > 0} {
6000
          set item "${incith::google::helpmsg3}${incith::google::ebay_results}${incith::google::helpmsg4}"
6001
        } else {
6002
          set item "${incith::google::helpmsg2}"
6003
        }
6004
        puthelp "NOTICE $nick :${temp} ${incith::google::help14} ${item}"
6005
      }
6006
      set temp ""
6007
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 15]} {
6008
        foreach trig [split $incith::google::efight_binds " "] {
6009
          append temp "${incith::google::command_char}${trig},"
6010
        }
6011
        set temp [string trimright $temp ","]
6012
        if {$incith::google::google_fight > 0} {
6013
          set item "${incith::google::helpmsg3}${incith::google::google_fight}${incith::google::helpmsg4}"
6014
        } else {
6015
          set item "${incith::google::helpmsg2}"
6016
        }
6017
        puthelp "NOTICE $nick :${temp} ${incith::google::help15} ${item}"
6018
      }
6019
      set temp ""
6020
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 16]} {
6021
        foreach trig [split $incith::google::wiki_binds " "] {
6022
          append temp "${incith::google::command_char}${trig},"
6023
        }
6024
        set temp [string trimright $temp ","]
6025
        if {$incith::google::wiki_results > 0} {
6026
          set item "${incith::google::helpmsg3}${incith::google::wiki_results}${incith::google::helpmsg4}"
6027
        } else {
6028
          set item "${incith::google::helpmsg2}"
6029
        }
6030
        puthelp "NOTICE $nick :${temp} ${incith::google::help16} ${item}"
6031
      }
6032
      set temp ""
6033
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 17]} {
6034
        foreach trig [split $incith::google::wikimedia_binds " "] {
6035
          append temp "${incith::google::command_char}${trig},"
6036
        }
6037
        set temp [string trimright $temp ","]
6038
        if {$incith::google::wikimedia_results > 0} {
6039
          set item "${incith::google::helpmsg3}${incith::google::wikimedia_results}${incith::google::helpmsg4}"
6040
        } else {
6041
          set item "${incith::google::helpmsg2}"
6042
        }
6043
        puthelp "NOTICE $nick :${temp} ${incith::google::help17} ${item}"
6044
      }
6045
      set temp ""
6046
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 18]} {
6047
        foreach trig [split $incith::google::locate_binds " "] {
6048
          append temp "${incith::google::command_char}${trig},"
6049
        }
6050
        set temp [string trimright $temp ","]
6051
        if {$incith::google::locate_results > 0} {
6052
          set item "${incith::google::helpmsg3}${incith::google::locate_results}${incith::google::helpmsg4}"
6053
        } else {
6054
          set item "${incith::google::helpmsg2}"
6055
        }
6056
        puthelp "NOTICE $nick :${temp} ${incith::google::help18} ${item}"
6057
      }
6058
      set temp ""
6059
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 19]} {
6060
        foreach trig [split $incith::google::rev_binds " "] {
6061
          append temp "${incith::google::command_char}${trig},"
6062
        }
6063
        set temp [string trimright $temp ","]
6064
        if {$incith::google::rev_results > 0} {
6065
          set item "${incith::google::helpmsg3}${incith::google::rev_results}${incith::google::helpmsg4}"
6066
        } else {
6067
          set item "${incith::google::helpmsg2}"
6068
        }
6069
        puthelp "NOTICE $nick :${temp} ${incith::google::help19} ${item}"
6070
      }
6071
      set temp ""
6072
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 20]} {
6073
        foreach trig [split $incith::google::mininova_binds " "] {
6074
          append temp "${incith::google::command_char}${trig},"
6075
        }
6076
        set temp [string trimright $temp ","]
6077
        if {$incith::google::mininova_results > 0} {
6078
          set item "${incith::google::helpmsg3}${incith::google::mininova_results}${incith::google::helpmsg4}"
6079
        } else {
6080
          set item "${incith::google::helpmsg2}"
6081
        }
6082
        puthelp "NOTICE $nick :${temp} ${incith::google::help20} ${item}"
6083
      }
6084
      set temp ""
6085
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 21]} {
6086
        foreach trig [split $incith::google::recent_binds " "] {
6087
          append temp "${incith::google::command_char}${trig},"
6088
        }
6089
        set temp [string trimright $temp ","]
6090
        if {$incith::google::recent_results > 0} {
6091
          set item "${incith::google::helpmsg3}${incith::google::recent_results}${incith::google::helpmsg4}"
6092
        } else {
6093
          set item "${incith::google::helpmsg2}"
6094
        }
6095
        puthelp "NOTICE $nick :${temp} ${incith::google::help21} ${item}"
6096
      }
6097
      set temp ""
6098
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 22]} {
6099
        foreach trig [split $incith::google::popular_binds " "] {
6100
          append temp "${incith::google::command_char}${trig},"
6101
        }
6102
        set temp [string trimright $temp ","]
6103
        if {$incith::google::popular_results > 0} {
6104
          set item "${incith::google::helpmsg3}${incith::google::popular_results}${incith::google::helpmsg4}"
6105
        } else {
6106
          set item "${incith::google::helpmsg2}"
6107
        }
6108
        puthelp "NOTICE $nick :${temp} ${incith::google::help22} ${item}"
6109
      }
6110
      set temp ""
6111
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 23]} {
6112
        foreach trig [split $incith::google::daily_binds " "] {
6113
          append temp "${incith::google::command_char}${trig},"
6114
        }
6115
        set temp [string trimright $temp ","]
6116
        if {$incith::google::daily_results > 0} {
6117
          set item "${incith::google::helpmsg3}${incith::google::daily_results}${incith::google::helpmsg4}"
6118
        } else {
6119
          set item "${incith::google::helpmsg2}"
6120
        }
6121
        puthelp "NOTICE $nick :${temp} ${incith::google::help23} ${item}"
6122
      }
6123
      set temp ""
6124
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 24]} {
6125
        foreach trig [split $incith::google::ign_binds " "] {
6126
          append temp "${incith::google::command_char}${trig},"
6127
        }
6128
        set temp [string trimright $temp ","]
6129
        if {$incith::google::ign_results > 0} {
6130
          set item "${incith::google::helpmsg3}${incith::google::ign_results}${incith::google::helpmsg4}"
6131
        } else {
6132
          set item "${incith::google::helpmsg2}"
6133
        }
6134
        puthelp "NOTICE $nick :${temp} ${incith::google::help24} ${item}"
6135
      }
6136
      set temp ""
6137
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 25]} {
6138
        foreach trig [split $incith::google::myspacevids_binds " "] {
6139
          append temp "${incith::google::command_char}${trig},"
6140
        }
6141
        set temp [string trimright $temp ","]
6142
        if {$incith::google::myspacevids_results > 0} {
6143
          set item "${incith::google::helpmsg3}${incith::google::myspacevids_results}${incith::google::helpmsg4}"
6144
        } else {
6145
          set item "${incith::google::helpmsg2}"
6146
        }
6147
        puthelp "NOTICE $nick :${temp} ${incith::google::help25} ${item}"
6148
      }
6149
      set temp ""
6150
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 26]} {
6151
        foreach trig [split $incith::google::trends_binds " "] {
6152
          append temp "${incith::google::command_char}${trig},"
6153
        }
6154
        set temp [string trimright $temp ","]
6155
        if {$incith::google::trends_results > 0} {
6156
          set item "${incith::google::helpmsg3}${incith::google::trends_results}${incith::google::helpmsg4}"
6157
        } else {
6158
          set item "${incith::google::helpmsg2}"
6159
        }
6160
        puthelp "NOTICE $nick :${temp} ${incith::google::help26} ${item}"
6161
      }
6162
      set temp ""
6163
      if {$found == "all" || $found == [lindex [split $incith::google::helplist " "] 27]} {
6164
        foreach trig [split $incith::google::scholar_binds " "] {
6165
          append temp "${incith::google::command_char}${trig},"
6166
        }
6167
        set temp [string trimright $temp ","]
6168
        if {$incith::google::scholar_results > 0} {
6169
          set item "${incith::google::helpmsg3}${incith::google::image_results}${incith::google::helpmsg4}"
6170
        } else {
6171
          set item "${incith::google::helpmsg2}"
6172
        }
6173
        puthelp "NOTICE $nick :${temp} ${incith::google::help27} ${item}"
6174
      }
6175
    }
6176
      
6177
    # FETCH_HTML
6178
    # fetches html for the various *.google.com sites
6179
    #
6180
    proc fetch_html {input switch} {
6181
    global incithcharset
6182
    global incithcookie
6183
    set country ""
6184
#-->  # Begin urlencoding kludge
6185
      if {($switch < 15) || ($switch > 23) && ($switch != 28) && ($switch !=29) && ($switch !=56) && ($switch !=58) && ($switch !=59)} {
6186
        set helps $input
6187
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $input - country input
6188
        # this is my input encoding hack, this will convert input before it goes
6189
        # out to be queried.
6190
        if {$incith::google::encoding_conversion_input > 0 && $country != "" } {
6191
          set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$country:*"]] :] 1]
6192
          if {$encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} { set input [encoding convertfrom $encoding_found $input] }
6193
        } else { set encoding_found "" }
6194
        set input [urlencode $input 0 "utf-8"]
6195
        set country "" ;#reset country and input
6196
      }
6197
#<--  # End urlencoding kludge
6198
6199
      # GOOGLE
6200
      if {$switch == 1} {
6201
        # make it so people can search their country
6202
        set country ""
6203
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6204
        if {$country == ""} {
6205
          set country "${incith::google::google_country}"
6206
          set flavor "search"
6207
        } else {
6208
          if {[string match */* $country]} {
6209
            if {![string length [set flavor [join [lrange [split $country /] 1 end] /]]]} {
6210
              set flavor "search"
6211
            }
6212
            set country [lindex [split $country /] 0]
6213
          } else { set flavor "search" }
6214
        }
6215
        if {[string equal -nocase "intl" [lindex [split $flavor /] 0]]} {
6216
          set lng [lindex [split $flavor /] 1]
6217
          set uselang 1
6218
        }
6219
        # we don't want 'define:+<search>', so we'll just remove the space if there is one.
6220
        regsub -nocase -- {^define:\s*} $input {define:} input
6221
        # spell after define so 'spell: define: foo' doesn't turn into a define lookup
6222
        if {[string match -nocase "spell%3a*" $input] == 1} {
6223
          regsub -nocase -- {^spell%3a\s*} $input {} input
6224
          set spell "&spell=1"
6225
        } else {
6226
          set spell ""
6227
        }
6228
        if {[info exists uselang]} {
6229
          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"
6230
        } else {
6231
          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"
6232
        }
6233
      # IMAGES
6234
      } elseif {$switch == 2} {
6235
        # make it so people can search their country
6236
        set country ""
6237
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6238
        if {$country == ""} {
6239
          set country "${incith::google::google_country}" 
6240
        }
6241
        set query "http://images.google.${country}/images?q=${input}&safe=${incith::google::safe_search}&btnG=Search+Images&ie=utf-8&sout=1&nfpr=1"
6242
      # LOCAL
6243
      } elseif {$switch == 3} {
6244
        # make it so people can search their country
6245
        set country ""
6246
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6247
        if {$country == ""} {
6248
          set country "${incith::google::google_country}"
6249
          set dummy $helps
6250
        }
6251
        #regexp -nocase -- {^(.+?) near (.+?)$} $dummy - search location
6252
        #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"
6253
        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"
6254
      } elseif {$switch == 4} {
6255
        # make it so people can search their country
6256
        set country ""
6257
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6258
        if {$country == ""} {
6259
          set country "${incith::google::google_country}" 
6260
        }
6261
        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"
6262
      } elseif {$switch == 5} {
6263
        # make it so people can search their country
6264
        set country ""
6265
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6266
        if {$country == ""} {
6267
          set country "${incith::google::google_country}" 
6268
        }
6269
        set query "http://news.google.${country}/news?q=${input}&ie=utf-8&nfpr=1"
6270
      } elseif {$switch == 6} {
6271
        # make it so people can search their country
6272
        set country ""
6273
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6274
        if {$country == ""} {
6275
          set country "${incith::google::google_country}" 
6276
        }
6277
        set query "http://books.google.${country}/books?q=${input}&btnG=Search+Books&ie=utf-8&nfpr=1"
6278
      } elseif {$switch == 7} {
6279
        # make it so people can search their country
6280
        set country ""
6281
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6282
        if {$country == ""} {
6283
          set country "${incith::google::google_country}" 
6284
        }
6285
        set query "http://www.google.${country}/search?q=${input}&tbs=vid:1&nfpr=1"
6286
        #set query "http://video.google.${country}/videosearch?q=${input}&btnG=Search+Video&ie=utf-8"
6287
      } elseif {$switch == 8} {
6288
        # make it so people can search their country
6289
        set country ""
6290
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6291
        if {$country == ""} {
6292
          set country "${incith::google::google_country}" 
6293
        }
6294
        set query "http://www.google.${country}/search?hl=&q=${input}&safe=off&btnG=Search&lr=lang_all&num=1&ie=utf-8"
6295
      } elseif {$switch == 9} {
6296
        # make it so people can search their country
6297
        set country "" ; set hd ""
6298
        if {[regsub -nocase -all -- "[urlencode $::incith::google::youtube_highdef 0]" $input "" input]} {
6299
          set hd "&high_definition=1"
6300
        }
6301
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6302
        if {$country == ""} {
6303
          set country "${incith::google::youtube_country}"
6304
        }
6305
        if {$country == "com"} {
6306
          set query "http://www.youtube.com/results?search_query=${input}&hl=en&ie=utf-8$hd"
6307
        } else {
6308
          set query "http://${country}.youtube.com/results?search_query=${input}&hl=${country}&ie=utf-8$hd"
6309
        }
6310
      } elseif {$switch == 10} {
6311
        # make it so people can search their country
6312
        set country ""
6313
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6314
        if {$country == ""} {
6315
          set country "${incith::google::google_country}" 
6316
        }
6317
        set query "http://scholar.google.${country}/scholar?hl=all&lr=&safe=${incith::google::safe_search}&q=${input}&btnG=Search&ie=utf-8"
6318
      } elseif {$switch == 11} {
6319
        #set query "http://vidsearch.myspace.com/index.cfm?fuseaction=vids.fullsearch&searchText=${input}&fullSearch=Search%20Videos"
6320
        #set query "http://vids.myspace.com/index.cfm?SearchBoxID=SplashHeader&fuseaction=vids.search&q=${input}&t=tvid"
6321
        set query "http://searchservice.myspace.com/index.cfm?fuseaction=sitesearch.results&orig=search_Header&origpfc=VidsSplash&type=MySpaceTV&qry=${input}&submit=Search"
6322
      } elseif {$switch == 12} {
6323
        #set query "http://www.gamespot.com/search.html?qs=${input}&x=0&y=0"
6324
        #set query "http://www.gamespot.com/pages/search/index.php?qs=${input}&sub=g"
6325
        set query "http://www.gamespot.com/pages/search/search_ajax.php?q=${input}&type=game&offset=0&tags_only=false&sort=rank"
6326
        #set query "http://www.gamespot.com/search.html?tag=search%3Bbutton&om_act=convert&om_clk=search&qs=${input}"
6327
        #set query "http://www.gamespot.com/pages/search/index.php?qs=${input}#game"
6328
        #set query "http://www.gamespot.com/search.html?qs=${input}"
6329
        #set query "http://www.gamespot.com/pages/tags/index.php?type=game&tags=${input}"
6330
      } elseif {$switch == 13} {
6331
        # make it so people can search their country
6332
        set country ""
6333
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6334
        if {$country == ""} {
6335
          set country "${incith::google::google_country}" 
6336
        }
6337
        set query "http://www.google.${country}/trends/hottrends?date=${input}&sa=x&ctab=0&hl=en"
6338
      } elseif {$switch == 14} {
6339
        # make it so people can search their country
6340
        set country ""
6341
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6342
        if {$country == ""} {
6343
          set country "${incith::google::daily_country}" 
6344
        }
6345
        if {$country == "en"} {
6346
          set query "http://www.dailymotion.com/relevance/search/${input}"
6347
        } else {
6348
          set query "http://www.dailymotion.com/${country}/relevance/search/${input}"
6349
        }
6350
      } elseif {$switch == 15} {
6351
        set query "http://www.gamefaqs.com/ds/releases${input}"
6352
      } elseif {$switch == 16} {
6353
        set query "http://www.gamefaqs.com/iphone/releases${input}"
6354
      } elseif {$switch == 17} {
6355
        set query "http://www.gamefaqs.com/psp/releases${input}"
6356
      } elseif {$switch == 18} {
6357
        set query "http://www.gamefaqs.com/xbox360/releases${input}"
6358
      } elseif {$switch == 19} {
6359
        set query "http://www.gamefaqs.com/xbox/releases${input}"
6360
      } elseif {$switch == 20} {
6361
        set query "http://www.gamefaqs.com/gamecube/releases${input}"
6362
      } elseif {$switch == 21} {
6363
        set query "http://www.gamefaqs.com/ps2/releases${input}"
6364
      } elseif {$switch == 22} {
6365
        set query "http://www.gamefaqs.com/pc/releases${input}"
6366
      } elseif {$switch == 23} {
6367
        set query "http://www.gamefaqs.com/ps3/releases${input}"
6368
      } elseif {$switch == 24} {
6369
        # make it so people can search their country
6370
        set country ""
6371
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6372
        if {$country == ""} {
6373
          set country "${incith::google::google_country}" 
6374
        }
6375
        regsub -all -- {-} $input "%2d" input
6376
        set query "http://blogsearch.google.${country}/blogsearch?q=${input}&lr=&sa=N&tab=gn&ie=utf-8"
6377
      } elseif {$switch == 25} {
6378
        # make it so people can search their country
6379
        set country "" ; set shop ""
6380
        regexp -nocase -- {^\.(.+?)\s(.+?)$} $helps - country dummy
6381
        if {$country == ""} {
6382
          if {![regexp -nocase -- {^\@(.+?)\s(.+?)$} $helps - shop input]} {
6383
             set country $::incith::google::ebay_country
6384
          }
6385
        }
6386
        regsub -all -- {-} $input "%2d" input
6387
        regsub -all -- { } $input "-" input
6388
6389
        #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"
6390
        #set query "http://search.ebay.${country}/${input}"
6391
        #set query "http://shop.ebay.${country}/items/_W0QQ_nkwZ${input}QQ_armrsZ1QQ_fromZQQ_mdoZ"
6392
        #set query "http://shop.ebay.${country}/${input}"
6393
        #set query "http://shop.ebay.${country}/items/_W0QQ_nkwZ${input}QQ_armrsZ1QQ_fromZQQ_mdoZ"
6394
        if {![string length $shop]} { 
6395
          set query "http://shop.ebay.${country}/i.html?_nkw=${input}&_armrs=1&_from=&_ipg=&_dmd=1"
6396
        } else {
6397
          set query "http://$shop.shop.ebay.com/?_nkw=${input}&_armrs=1&_from=&_ipg=&_dmd=1"
6398
        }
6399
        #set query "http://search.ebay.${country}/${input}_W0QQpqryZ${input}"
6400
      } elseif {$switch == 26} {
6401
        set query "http://search.ign.com/products?sort=relevance&query=${input}&so=exact&objtName=all&origin=&startat=0&nc=false&ns=false"
6402
        #set query "http://search.ign.com/products?query=${input}"
6403
      } elseif {$switch == 27} {
6404
        # place holder for wikipedia
6405
        # eventually it will get put back into fetch_html
6406
      } elseif {$switch == 28} {
6407
        set query "http://www.gamefaqs.com/wii/releases${input}"
6408
      } elseif {$switch == 29} {
6409
        set query "http://www.gamefaqs.com/dreamcast/releases${input}"
6410
      } elseif {$switch == 30} {
6411
        set query "http://www.gamerankings.com/browse.html?site=gamecube&cat=0&year=2&numrev=0&sort=${input}&search="
6412
      } elseif {$switch == 31} {
6413
        set query "http://www.gamerankings.com/browse.html?site=pc&cat=0&year=0&numrev=2&sort=${input}&search="
6414
      } elseif {$switch == 32} {
6415
        set query "http://www.gamerankings.com/browse.html?site=ps2&cat=0&year=0&numrev=2&sort=${input}&search="
6416
      } elseif {$switch == 33} {
6417
        set query "http://www.gamerankings.com/browse.html?site=ps3&cat=0&year=0&numrev=2&sort=${input}&search="
6418
      } elseif {$switch == 34} {
6419
        set query "http://www.gamerankings.com/browse.html?site=wii&cat=0&year=0&numrev=2&sort=${input}&search="
6420
      } elseif {$switch == 35} {
6421
        set query "http://www.gamerankings.com/browse.html?site=xbox&cat=0&year=0&numrev=2&sort=${input}&search="
6422
      } elseif {$switch == 36} {
6423
        set query "http://www.gamerankings.com/browse.html?site=xbox360&cat=0&year=0&numrev=2&sort=${input}&search="
6424
      } elseif {$switch == 37} {
6425
        set query "http://www.gamerankings.com/browse.html?site=ds&cat=0&year=0&numrev=2&sort=${input}&search="
6426
      } elseif {$switch == 38} {
6427
        set query "http://www.gamerankings.com/browse.html?site=gba&cat=0&year=0&numrev=2&sort=${input}&search="
6428
      } elseif {$switch == 39} {
6429
        set query "http://www.gamerankings.com/browse.html?site=psp&cat=0&year=0&numrev=2&sort=${input}&search="
6430
      } elseif {$switch == 40} {
6431
        set query "http://www.gamerankings.com/browse.html?site=mobile&cat=0&year=0&numrev=2&sort=${input}&search="
6432
      } elseif {$switch == 41} {
6433
        set query "http://www.gamerankings.com/browse.html?site=ngage&cat=0&year=0&numrev=2&sort=${input}&search="
6434
      } elseif {$switch == 42} {
6435
        set query "http://www.gamerankings.com/browse.html?site=3do&cat=0&year=0&numrev=2&sort=${input}&search="
6436
      } elseif {$switch == 43} {
6437
        set query "http://www.gamerankings.com/browse.html?site=dreamcast&cat=0&year=0&numrev=2&sort=${input}&search="
6438
      } elseif {$switch == 44} {
6439
        set query "http://www.gamerankings.com/browse.html?site=genesis&cat=0&year=0&numrev=2&sort=${input}&search="
6440
      } elseif {$switch == 45} {
6441
        set query "http://www.gamerankings.com/browse.html?site=jaguar&cat=0&year=0&numrev=2&sort=${input}&search="
6442
      } elseif {$switch == 46} {
6443
        set query "http://www.gamerankings.com/browse.html?site=n64&cat=0&year=0&numrev=2&sort=${input}&search="
6444
      } elseif {$switch == 47} {
6445
        set query "http://www.gamerankings.com/browse.html?site=neo&cat=0&year=0&numrev=2&sort=${input}&search="
6446
      } elseif {$switch == 48} {
6447
        set query "http://www.gamerankings.com/browse.html?site=ps&cat=0&year=0&numrev=2&sort=${input}&search="
6448
      } elseif {$switch == 49} {
6449
        set query "http://www.gamerankings.com/browse.html?site=saturn&cat=0&year=0&numrev=2&sort=${input}&search="
6450
      } elseif {$switch == 50} {
6451
        set query "http://www.gamerankings.com/browse.html?site=snes&cat=0&year=0&numrev=2&sort=${input}&search="
6452
      } elseif {$switch == 51} {
6453
        set query "http://www.mininova.org/search/${input}/seeds"
6454
      } elseif {$switch == 52} {
6455
        set query "http://www.gamerankings.com/browse.html?site=segacd&cat=0&year=0&numrev=2&sort=${input}&search="
6456
      } elseif {$switch == 53} {
6457
        set query "http://www.gamerankings.com/browse.html?site=gameboy&cat=0&year=0&numrev=2&sort=${input}&search="
6458
      } elseif {$switch == 54} {
6459
        set query "http://www.gamerankings.com/browse.html?site=gbc&cat=0&year=0&numrev=2&sort=${input}&search="
6460
      } elseif {$switch == 55} {
6461
        set query "http://www.gamerankings.com/browse.html?site=&cat=0&year=0&numrev=2&sort=${input}&search="
6462
      } elseif {$switch == 56} {
6463
        set query "http://www.gamefaqs.com/3ds/releases${input}"
6464
      } elseif {$switch == 57} {
6465
        set query "http://www.gamerankings.com/browse.html?site=3ds&cat=0&year=0&numrev=3&sort=${input}&search="
6466
      } elseif {$switch == 58} {
6467
        set query "http://www.gamerankings.com/browse.html?site=mac&cat=0&year=0&numrev=2&sort=${input}&search="
6468
      } elseif {$switch == 59} {
6469
        set query "http://www.gamefaqs.com/mac/releases${input}"
6470
      }
6471
6472
      # didnt have this before, this is needed for google parsers to correctly
6473
      # encode the 'do not include' tag, aka the hyphen.. hehe
6474
      if {$switch < 9} {
6475
        regsub -nocase -- {-} $input "%2d" input
6476
      }
6477
      regsub -all -- {\+} $query {%2B} query
6478
      regsub -all -- {\"} $query {%22} query 
6479
      if {$switch != 25} {
6480
        regsub -all -- { } $query {+} query
6481
      }
6482
      
6483
      if {$switch == 12} {
6484
        # grab the ajax data
6485
        set http [::http::geturl $query -headers "X-Requested-With XMLHttpRequest X-Request JSON Referer $query $::incith_hdr" -timeout [expr 1000 * 10]]
6486
        upvar #0 $http state
6487
        set html [ungzip [string map {"\\n" "" "\\" ""} [::http::data $http]] $state(meta)]
6488
        set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)]
6489
        set redir [::http::ncode $http]
6490
        set cookies [list]
6491
      } else {    
6492
        # beware, changing the useragent will result in differently formatted html from Google.
6493
        set ua "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3"
6494
        #set ua "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 OpenSSL/0.9.7e"
6495
        # enable proxy
6496
        if {![string length $::incith::google::proxy_host]} { 
6497
          set http [::http::config -useragent $ua]
6498
        } else { 
6499
         set http [::http::config -useragent $ua -proxyhost $::incith::google::proxy_host -proxyport $::incith::google::proxy_port]
6500
        }
6501
        # stole this bit from rosc2112 on egghelp forums
6502
        # borrowed is a better term, all procs eventually need this error handler.
6503
6504
        catch {set http [::http::geturl "$query" -headers $::incith_hdr -timeout [expr 1000 * 12]]} error
6505
        if {[string match -nocase "*couldn't open socket*" $error]} {
6506
              return "socketerrorabort|${query}"
6507
        }
6508
        if { [::http::status $http] == "timeout" } {
6509
	    return "timeouterrorabort"
6510
	  }
6511
        upvar #0 $http state
6512
        set html [ungzip [::http::data $http] $state(meta)]
6513
        set redir [::http::ncode $http]
6514
        # CHECK CHECK
6515
        upvar #0 $http state
6516
        set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)]
6517
        # Are there cookies?
6518
        set cookies [list]
6519
        foreach {name value} $state(meta) {
6520
          # do we have cookies?                                                                                                                                                                             
6521
          if {[string equal -nocase $name "Set-Cookie"]} {
6522
            # yes, add them to cookie list                                                                                                                                                                          
6523
            lappend webCookies [lindex [split $value {;}] 0]                                                                                                                                                             
6524
          }                                                                                                                                                                                                             
6525
        }
6526
        if {[info exists webCookies] && [llength $webCookies]} {
6527
          set cookies "[string trim [join $webCookies {;}] {;}]"
6528
        } else {
6529
          set cookies ""
6530
        }
6531
        # REDIRECT
6532
        while {[string match "*${redir}*" "303|302|301" ]} {
6533
          foreach {name value} $state(meta) {
6534
            if {[regexp -nocase ^location$ $name]} {
6535
              if {![string match "http*" $value]} {
6536
                if {![string match "/" [string index $value 0]]} {
6537
                  set value "[join [lrange [split $query "/"] 0 2] "/"]/$value"
6538
                } else {
6539
                  set value "[join [lrange [split $query "/"] 0 2] "/"]$value"
6540
                }
6541
              }
6542
              if {[string length $cookies]} {
6543
                set http [::http::geturl "[string map {" " "%20"} $value]" -headers "$::incith_hdr Referer $query Cookie $cookies" -timeout [expr 1000 * 10]]
6544
              } else {
6545
                set http [::http::geturl "[string map {" " "%20"} $value]" -headers "$::incith_hdr Referer $query" -timeout [expr 1000 * 10]]
6546
              }
6547
              if { $::incith::google::debug > 0 } { putserv "privmsg $::incith::google::debugnick :\002redirected \($redir\):\002 $query -> $value :: \002Cookie:\002 [join $cookies]" }
6548
              if {[string match -nocase "*couldn't open socket*" $error]} {
6549
                return "socketerrorabort|${value}"
6550
              }
6551
              if { [::http::status $http] == "timeout" } {
6552
		    return "timeouterrorabort"
6553
              }
6554
              upvar #0 $http state
6555
              # Are there cookies?
6556
              foreach {nam val} $state(meta) {
6557
                # do we have cookies?                                                                                                                                                                             
6558
                if {[string equal -nocase $nam "Set-Cookie"]} {
6559
                  if {![info exists flagme]} {
6560
                    set flagme 0
6561
                    set cookies [list]
6562
                  }
6563
                  # yes, add them to cookie list                                                                                                                                                                          
6564
                  lappend webCookies [lindex [split $val {;}] 0]                                                                                                                                                             
6565
                }                                                                                                                                                                                                             
6566
              }
6567
              if {[info exists webCookies] && [llength $webCookies]} {
6568
                set cookies "[string trim [join $webCookies {;}] {;}]"
6569
              } else {
6570
                set cookies ""
6571
              }
6572
              set redir [::http::ncode $http]
6573
              set incithcharset [string map -nocase {"UTF-" "utf-" "iso-" "iso" "windows-" "cp" "shift_jis" "shiftjis"} $state(charset)]
6574
              set query [string map {" " "%20"} $value]
6575
            }
6576
          } 
6577
        }
6578
      }
6579
      set html [ungzip [::http::data $http] $state(meta)]
6580
      ::http::cleanup $http
6581
      # ---- step 1
6582
      # Determine which encoding to use
6583
      #
6584
      set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "$country:*"]] :] 1]
6585
      if {$incith::google::encoding_conversion_output > 0} {
6586
        if {$incith::google::automagic > 0} {
6587
          if {[string match -nocase "utf-8" $incithcharset] && $incith::google::utf8workaround > 0 && $encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} {
6588
            set new_encoding $encoding_found
6589
          } else {
6590
            set new_encoding $incithcharset
6591
          }
6592
        } else {
6593
          if {$encoding_found != "" } {
6594
            set new_encoding $encoding_found
6595
          } else {
6596
            set new_encoding "NONE"
6597
          }
6598
        }
6599
      } else {
6600
        set new_encoding "DISABLED"
6601
      }
6602
6603
      # ---- step 2
6604
      # Report the conclusion to debugnick
6605
      #
6606
      if {$incith::google::debug > 0} {
6607
        if {[string match -nocase $new_encoding $incithcharset]} {
6608
          if {[lsearch -exact [encoding names] $incithcharset] != -1} {
6609
            putserv "privmsg $incith::google::debugnick :\002url \($redir\):\002 $query \002\037charset:\037\002 $incithcharset \002encode_string:\002 $encoding_found :: \002Cookie:\002 $cookies" 
6610
          } else {
6611
            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" 
6612
          }
6613
        } elseif {[string match -nocase $new_encoding $encoding_found]} {
6614
          if {$encoding_found != "" && [lsearch -exact [encoding names] $encoding_found] != -1} {
6615
            putserv "privmsg $incith::google::debugnick :\002url \($redir\):\002 $query \002charset:\002 $incithcharset \037\002encode_string:\002\037 $encoding_found :: \002Cookie:\002 $cookies" 
6616
          } else {
6617
            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" 
6618
          }
6619
        } elseif {[string match -nocase "DISABLED" $new_encoding]} {
6620
          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" 
6621
        } else {
6622
          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" 
6623
        }
6624
      }
6625
6626
      # ---- step 3
6627
      # Apply the encoding
6628
      #
6629
      if {![string match *$new_encoding* "utf-8"] && ![string equal "DISABLED" $new_encoding]} {
6630
         set incithcharset $new_encoding
6631
         set html [incithencode $html]
6632
      }
6633
6634
      # generic pre-parsing
6635
      regsub -all "\n" $html "" html
6636
      regsub -all "(?:\x91|\x92|&#39;)" $html {'} html
6637
      regsub -all "(?:\x93|\x94|&quot;)" $html {"} html
6638
      regsub -all "&amp;" $html {\&} html
6639
      regsub -all -nocase {<sup>(.+?)</sup>} $html {^\1} html
6640
      if {![string match $switch "4"] && ![string match $switch "26"]} {
6641
        regsub -all -nocase {<font.+?>} $html "" html
6642
        regsub -all -nocase {</font>} $html "" html
6643
        regsub -all -nocase {<script type=.*?script>} $html "" html
6644
      }
6645
      if {![string match *$switch* "|9|7|"]} {
6646
         regsub -all -nocase {<span.*?>} $html "" html
6647
         regsub -all -nocase {</span>} $html "" html
6648
      }
6649
      regsub -all -nocase {<input.+?>} $html "" html
6650
      regsub -all -nocase {(?:<i>|</i>)} $html "" html
6651
      regsub -all "&times;" $html {*} html
6652
      regsub -all "&nbsp;" $html { } html
6653
      regsub -all -nocase "&#215;" $html "x" html
6654
      regsub -all -nocase "&lt;" $html "<" html
6655
      regsub -all -nocase "&gt;" $html ">" html
6656
      regsub -all {\x000f} $html "" html
6657
      # '
6658
      # regexps that should remain seperate go here
6659
      # google specific regexps
6660
      if {$switch == 1} {
6661
        # regexp the rest of the html for a much easier result to parse
6662
        regsub -all -nocase {<b>\[PDF\]</b>\s*} $html "" html
6663
        regsub {<p class=g style="margin-top:0">(.+?)</p>} $html "" html
6664
      } elseif {$switch == 2} {
6665
        # these %2520 codes, I have no idea. But they're supposed to be %20's
6666
        regsub -all {%2520} $html {%20} html
6667
      } elseif {$switch == 3} {
6668
        regsub -all -nocase { - <nobr>Unverified listing</nobr>} $html "" html
6669
        regsub -all -- {&#160;} $html { } html  
6670
      } elseif {$switch == 4} {
6671
      } elseif {$switch == 5} {
6672
      } elseif {$switch == 6} {
6673
      } elseif {$switch == 7} {
6674
      } elseif {$switch == 8} {
6675
      } elseif {$switch == 9} { 
6676
        regsub -all "\t" $html "" html
6677
        regsub -all "\n" $html "" html
6678
        regsub -all "\r" $html "" html
6679
        regsub -all "\v" $html "" html
6680
      } elseif {$switch == 10} {
6681
        regsub -all -nocase { - <nobr>Unverified listing</nobr>} $html "" html
6682
        regsub -all -- {&#160;} $html { } html
6683
      } elseif {$switch == 25} {
6684
        regsub -all {<script.*?>.+?</script>} $html "" html
6685
        regsub -all "\t" $html "" html
6686
        regsub -all "\n" $html "" html
6687
        regsub -all "\r" $html "" html
6688
        regsub -all "\v" $html "" html
6689
        regsub -all "<wbr/>" $html "" html
6690
      } elseif {$switch > 11 && $switch < 31 || $switch == 56 || $switch == 58 || $switch == 59} {
6691
        regsub -all "\t" $html "" html
6692
        regsub -all "\n" $html "" html
6693
        regsub -all "\r" $html "" html
6694
        regsub -all "\v" $html "" html
6695
        regsub -all "&#039;" $html "'" html
6696
      } elseif {$switch == 51} {
6697
        regsub -all "<strong>|</strong>" $html "\002" html
6698
      }
6699
6700
      # no point having it so many times
6701
      if {$incith::google::bold_descriptions > 0 && [string match "\002" $incith::google::desc_modes] != 1} {
6702
        regsub -all -nocase {(?:<b>|</b>|<em>|</em>|<strong>|</strong>)} $html "\002" html
6703
      } else {
6704
        regsub -all -nocase {(<b>|</b>|<em>|</em>|<strong>|</strong>)} $html "" html
6705
      }
6706
      # DEBUG DEBUG                    
6707
      set junk [open "ig-debug.txt" w]
6708
      puts $junk $html
6709
      close $junk
6710
      return $html
6711
    }
6712
6713
    # PUBLIC_MESSAGE
6714
    # decides what to do with binds that get triggered
6715
    #
6716
    proc public_message {nick uhand hand chan input} {
6717
      if {[lsearch -exact [channel info $chan] +google] != -1} {
6718
        if {$incith::google::chan_user_level == 3} {
6719
          if {[isop $nick $chan] == 0} {
6720
            return
6721
          }
6722
        } elseif {$incith::google::chan_user_level == 2} {
6723
          if {[ishalfop $nick $chan] == 0 && [isop $nick $chan] == 0} {
6724
            return
6725
          }
6726
        } elseif {$incith::google::chan_user_level == 1} {
6727
          if {[isvoice $nick $chan] == 0 && [ishalfop $nick $chan] == 0 && [isop $nick $chan] == 0} {
6728
            return
6729
          }
6730
        }
6731
        send_output "$input" "$chan" "$nick" "$uhand"
6732
      }
6733
    }
6734
6735
    # PRIVATE_MESSAGE
6736
    # decides what to do with binds that get triggered
6737
    #
6738
    proc private_message {nick uhand hand input} {
6739
      if {$incith::google::private_messages >= 1} {
6740
        send_output $input $nick $nick $uhand
6741
      }
6742
    }
6743
6744
    # SEND_OUTPUT
6745
    # no point having two copies of this in public/private_message{}
6746
    #
6747
    proc send_output {input where nick uhand} {
6748
6749
      # this is my input encoding hack, this will convert input before it goes
6750
      # out to be queried.
6751
      if {$incith::google::encoding_conversion_input > 0} {
6752
        if {[encoding system] != "identity" && [lsearch [encoding names] "utf-8"]} {
6753
          set command_char [encoding convertfrom "utf-8" ${incith::google::command_char}]
6754
          set input [encoding convertfrom "utf-8" $input]
6755
        } elseif {[encoding system] == "identity"} {
6756
          set command_char [encoding convertfrom identity ${incith::google::command_char}]
6757
          set input [encoding convertfrom identity $input]
6758
        } else {
6759
          set command_char ${incith::google::command_char}
6760
        }
6761
      } else {
6762
        set command_char ${incith::google::command_char}
6763
      }
6764
6765
      #Specifically retrieve only ONE (ascii) character, then check that matches the command_char first
6766
      set trigger_char [string index $input 0]
6767
      if {[encoding system] == "identity"} {
6768
        set trigger_char [encoding convertfrom identity $trigger_char]
6769
      }
6770
6771
      #Sanity check 1 - If no match, stop right here. No need to match every (first word) of
6772
      # every line of channel data against every bind if the command_char doesnt even match.
6773
      if {$trigger_char != $command_char} {
6774
        return
6775
      }
6776
6777
      set trigger [string range [lindex [split $input] 0] 1 end]
6778
      #Sanity check 2 - Stop if theres nothing to search for (quiet)
6779
      if {$incith::google::aversion_vocabulary > 0} {
6780
        set search [vocabaversion [string trim [string range $input [string wordend $input 1] end]]]
6781
      } else {
6782
        set search [string trim [string range $input [string wordend $input 1] end]]
6783
      }
6784
      if {$search == ""} { return }
6785
6786
      if {$incith::google::force_private == 1} { set where $nick }
6787
      # check for !google
6788
      if {$incith::google::search_results > 0} {
6789
        foreach bind [split $incith::google::google_binds " "] {
6790
          if {[string match -nocase $bind $trigger] == 1} {
6791
            # channel filter check
6792
            foreach c [split $incith::google::filtered " "] {
6793
              if {[string match -nocase $where $c] == 1} {
6794
                return
6795
              }
6796
            }
6797
            # flood protection check
6798
            if {[flood $nick $uhand]} {
6799
              return
6800
            }
6801
            # call google
6802
            foreach line [incith::google::parse_output [google $search]] {
6803
              put_output $where "$incith::google::search_prepend$line"
6804
            }
6805
            break
6806
          }
6807
        }
6808
      }
6809
      # check for !images
6810
      if {$incith::google::image_results > 0} {
6811
        foreach bind [split $incith::google::image_binds " "] {
6812
          if {[string match -nocase $bind $trigger] == 1} {
6813
            # flood protection check
6814
            if {[flood $nick $uhand]} {
6815
              return
6816
            }
6817
            # call images
6818
            foreach line [incith::google::parse_output [images $search]] {
6819
              put_output $where "$incith::google::image_prepend$line"
6820
            }
6821
            break
6822
          }
6823
        }
6824
      }
6825
      # check for !local
6826
      if {$incith::google::local_results > 0} {
6827
        foreach bind [split $incith::google::local_binds " "] {
6828
          if {[string match -nocase $bind $trigger] == 1} {
6829
            # flood protection check
6830
            if {[flood $nick $uhand]} {
6831
              return
6832
            }
6833
            # local requires splitting of the search
6834
            regexp -nocase -- {^(.+?) near (.+?)$} $search - what location
6835
            if {![info exists what] || ![info exists location]} {
6836
              put_output $where "Local searches should be the format of 'pizza near footown, bar'"
6837
              return
6838
            }
6839
            foreach line [incith::google::parse_output [local $search]] {
6840
              put_output $where "$incith::google::local_prepend$line"
6841
            }
6842
            break
6843
          }
6844
        }
6845
      }
6846
      # check for !groups
6847
      if {$incith::google::group_results > 0} {
6848
        foreach bind [split $incith::google::group_binds " "] {
6849
          if {[string match -nocase $bind $trigger] == 1} {
6850
            # flood protection check
6851
            if {[flood $nick $uhand]} {
6852
              return
6853
            }
6854
            # call groups
6855
            foreach line [incith::google::parse_output [groups $search]] {
6856
              put_output $where "$incith::google::group_prepend$line"
6857
            }
6858
            break
6859
          }
6860
        }
6861
      }
6862
      # check for !news
6863
      if {$incith::google::news_results > 0} {
6864
        foreach bind [split $incith::google::news_binds " "] {
6865
          if {[string match -nocase $bind $trigger] == 1} {
6866
            # flood protection check
6867
            if {[flood $nick $uhand]} {
6868
              return
6869
            }
6870
            # call news
6871
            foreach line [incith::google::parse_output [news $search]] {
6872
              put_output $where "$incith::google::news_prepend$line"
6873
            }
6874
            break
6875
          }
6876
        }
6877
      }
6878
      # check for !print
6879
      if {$incith::google::print_results > 0} {
6880
        foreach bind [split $incith::google::print_binds " "] {
6881
          if {[string match -nocase $bind $trigger] == 1} {
6882
            # flood protection check
6883
            if {[flood $nick $uhand]} {
6884
              return
6885
            }
6886
            # call print
6887
            foreach line [incith::google::parse_output [print $search]] {
6888
              put_output $where "$incith::google::print_prepend$line"
6889
            }
6890
            break
6891
          }
6892
        }
6893
      }
6894
      # check for !video
6895
      if {$incith::google::video_results > 0} {
6896
        foreach bind [split $incith::google::video_binds " "] {
6897
          if {[string match -nocase $bind $trigger] == 1} {
6898
            # flood protection check
6899
            if {[flood $nick $uhand]} {
6900
              return
6901
            }
6902
            # call video
6903
            foreach line [incith::google::parse_output [video $search]] {
6904
              put_output $where "$incith::google::video_prepend$line"
6905
            }
6906
            break
6907
          }
6908
        }
6909
      }
6910
      # check for !scholar
6911
      if {$incith::google::scholar_results > 0} {
6912
        foreach bind [split $incith::google::scholar_binds " "] {
6913
          if {[string match -nocase $bind $trigger] == 1} {
6914
            # flood protection check
6915
            if {[flood $nick $uhand]} {
6916
              return
6917
            }
6918
            # call video
6919
            foreach line [incith::google::parse_output [scholar $search]] {
6920
              put_output $where "$incith::google::scholar_prepend$line"
6921
            }
6922
            break
6923
          }
6924
        }
6925
      }
6926
      # check for !fight
6927
      if {$incith::google::google_fight > 0} {
6928
        foreach bind [split $incith::google::fight_binds " "] {
6929
          if {[string match -nocase $bind $trigger] == 1} {
6930
            # flood protection check
6931
            if {[flood $nick $uhand]} {
6932
              return
6933
            }
6934
            # fight requires splitting of the search
6935
            regexp -nocase -- {^(.+?) vs (.+?)$} $search - word1 word2
6936
            if {![info exists word1] || ![info exists word2]} {
6937
              put_output $where "Google fights should be the format of 'word(s) one vs word(s) two'"
6938
              return
6939
            }
6940
            # call fight
6941
            foreach line [incith::google::parse_output [fight $search]] {
6942
              put_output $where "$incith::google::fight_prepend$line"
6943
            }
6944
            break
6945
          }
6946
        }
6947
      }
6948
      # check for !ebayfight
6949
      if {$incith::google::google_fight > 0} {
6950
        foreach bind [split $incith::google::efight_binds " "] {
6951
          if {[string match -nocase $bind $trigger] == 1} {
6952
            # flood protection check
6953
            if {[flood $nick $uhand]} {
6954
              return
6955
            }
6956
            # fight requires splitting of the search
6957
            regexp -nocase -- {^(.+?) vs (.+?)$} $search - word1 word2
6958
            if {![info exists word1] || ![info exists word2]} {
6959
              put_output $where "Ebay fights should be the format of 'word(s) one vs word(s) two'"
6960
              return
6961
            }
6962
            # call ebayfight
6963
            foreach line [incith::google::parse_output [ebayfight $search]] {
6964
              put_output $where "$incith::google::ebayfight_prepend$line"
6965
            }
6966
            break
6967
          }
6968
        }
6969
      }
6970
      # check for !youtube
6971
      if {$incith::google::youtube_results > 0} {
6972
        foreach bind [split $incith::google::youtube_binds " "] {
6973
          if {[string match -nocase $bind $trigger] == 1} {
6974
            # flood protection check
6975
            if {[flood $nick $uhand]} {
6976
              return
6977
            }
6978
            # call youtube
6979
            foreach line [incith::google::parse_output [youtube $search]] {
6980
              put_output $where "$incith::google::youtube_prepend$line"
6981
            }
6982
            break
6983
          }
6984
        }
6985
      }
6986
      # check for !helpbot
6987
      if {$incith::google::helpbot_results > 0} {
6988
        foreach bind [split $incith::google::helpbot_binds " "] {
6989
          if {[string match -nocase $bind $trigger] == 1} {
6990
            # flood protection check
6991
            if {[flood $nick $uhand]} {
6992
              return
6993
            }
6994
            # call helpbot
6995
            foreach line [incith::google::parse_output [helpbot $nick $search]] {
6996
              put_output $where $line
6997
            }
6998
            break
6999
          }
7000
        }
7001
      }
7002
      # check for !myspacevids
7003
      if {$incith::google::myspacevids_results > 0} {
7004
        foreach bind [split $incith::google::myspacevids_binds " "] {
7005
          if {[string match -nocase $bind $trigger] == 1} {
7006
            # flood protection check
7007
            if {[flood $nick $uhand]} {
7008
              return
7009
            }
7010
            # call myspacevids
7011
            foreach line [incith::google::parse_output [myspacevids $search]] {
7012
              put_output $where "$incith::google::myspacevids_prepend$line"
7013
            }
7014
            break
7015
          }
7016
        }
7017
      }
7018
      # check for !mininova
7019
      if {$incith::google::mininova_results > 0} {
7020
        foreach bind [split $incith::google::mininova_binds " "] {
7021
          if {[string match -nocase $bind $trigger] == 1} {
7022
            # flood protection check
7023
            if {[flood $nick $uhand]} {
7024
              return
7025
            }
7026
            # call mininova
7027
            foreach line [incith::google::parse_output [mininova $search]] {
7028
              put_output $where "$incith::google::mininova_prepend$line"
7029
            }
7030
            break
7031
          }
7032
        }
7033
      }
7034
      # check for !recent
7035
      if {$incith::google::recent_results > 0} {
7036
        foreach bind [split $incith::google::recent_binds " "] {
7037
          if {[string match -nocase $bind $trigger] == 1} {
7038
            # flood protection check
7039
            if {[flood $nick $uhand]} {
7040
              return
7041
            }
7042
            # call recent game lookup
7043
            foreach line [incith::google::parse_output [recent $search]] {
7044
              put_output $where "$incith::google::recent_prepend$line"
7045
            }
7046
            break
7047
          }
7048
        }
7049
      }
7050
      # check for !wiki
7051
      if {$incith::google::wiki_results > 0} {
7052
        foreach bind [split $incith::google::wiki_binds " "] {
7053
          if {[string match -nocase $bind $trigger] == 1} {
7054
            # flood protection check
7055
            if {[flood $nick $uhand]} {
7056
              return
7057
            }
7058
            # call wiki
7059
            foreach line [incith::google::parse_output [wiki $search]] {
7060
              put_output $where "$incith::google::wiki_prepend$line"
7061
            }
7062
            break
7063
          }
7064
        }
7065
      }
7066
      # check for !wikimedia
7067
      if {$incith::google::wikimedia_results > 0} {
7068
        foreach bind [split $incith::google::wikimedia_binds " "] {
7069
          if {[string match -nocase $bind $trigger] == 1} {
7070
            # flood protection check
7071
            if {[flood $nick $uhand]} {
7072
              return
7073
            }
7074
            # call wiki
7075
            foreach line [incith::google::parse_output [wikimedia $search]] {
7076
              put_output $where "$incith::google::wikimedia_prepend$line"
7077
            }
7078
            break
7079
          }
7080
        }
7081
      }
7082
      # check for !review
7083
      if {$incith::google::rev_results > 0} {
7084
        foreach bind [split $incith::google::rev_binds " "] {
7085
          if {[string match -nocase $bind $trigger] == 1} {
7086
            # flood protection check
7087
            if {[flood $nick $uhand]} {
7088
              return
7089
            }
7090
            # call review
7091
            foreach line [incith::google::parse_output [rev $search]] {
7092
              put_output $where "$incith::google::rev_prepend$line"
7093
            }
7094
            break
7095
          }
7096
        }
7097
      }
7098
      # check for !ign
7099
      if {$incith::google::ign_results > 0} {
7100
        foreach bind [split $incith::google::ign_binds " "] {
7101
          if {[string match -nocase $bind $trigger] == 1} {
7102
            # flood protection check
7103
            if {[flood $nick $uhand]} {
7104
              return
7105
            }
7106
            # call ign
7107
            foreach line [incith::google::parse_output [ign $search]] {
7108
              put_output $where "$incith::google::ign_prepend$line"
7109
            }
7110
            break
7111
          }
7112
        }
7113
      }
7114
      # check for !trends
7115
      if {$incith::google::trends_results > 0} {
7116
        foreach bind [split $incith::google::trends_binds " "] {
7117
          if {[string match -nocase $bind $trigger] == 1} {
7118
            # flood protection check
7119
            if {[flood $nick $uhand]} {
7120
              return
7121
            }
7122
            # call trends
7123
            foreach line [incith::google::parse_output [trends $search]] {
7124
              put_output $where "$incith::google::trends_prepend$line"
7125
            }
7126
            break
7127
          }
7128
        }
7129
      }
7130
      # check for !gamespot
7131
      if {$incith::google::gamespot_results > 0} {
7132
        foreach bind [split $incith::google::gamespot_binds " "] {
7133
          if {[string match -nocase $bind $trigger] == 1} {
7134
            # flood protection check
7135
            if {[flood $nick $uhand]} {
7136
              return
7137
            }
7138
            # call gamespot
7139
            foreach line [incith::google::parse_output [gamespot $search]] {
7140
              put_output $where "$incith::google::gamespot_prepend$line"
7141
            }
7142
            break
7143
          }
7144
        }
7145
      }
7146
      # check for !trans
7147
      if {$incith::google::trans_results > 0} {
7148
        foreach bind [split $incith::google::trans_binds " "] {
7149
          if {[string match -nocase $bind $trigger] == 1} {
7150
            # flood protection check
7151
            if {[flood $nick $uhand]} {
7152
              return
7153
            }
7154
            # translation requires splitting of the search
7155
            if {![regexp -nocase -- {^(.+?)@(.+?)\s(.+?)$} $search - word1 word2 word3]} {
7156
              if {[regexp -nocase -- {^@(.+?)\s(.+?)$} $search - word2 word3]} {
7157
                set search [join [lrange [split $search] 1 end]]
7158
              } else {
7159
                regexp -nocase -- {^(.+?)@\s(.+?)$} $search - word1 word3
7160
              }
7161
            }
7162
            if {[info exists word2]} {
7163
              if {[string equal [string index $word2 0] " "]} {
7164
                regexp -nocase -- {^(.+?)@\s(.+?)$} $search - word1 word3
7165
                set word2 $::incith::google::trans
7166
              }
7167
            }
7168
            if {![info exists word1]} { set word1 "auto" }
7169
            if {![info exists word2]} { set word2 $::incith::google::trans }
7170
            if {![info exists word3]} { set word3 $search }
7171
            set search "$word1@$word2 $word3"
7172
            # call translate
7173
            trans $search $where
7174
          }
7175
        }
7176
      }
7177
      # check for !dailymotion
7178
      if {$incith::google::daily_results > 0} {
7179
        foreach bind [split $incith::google::daily_binds " "] {
7180
          if {[string match -nocase $bind $trigger] == 1} {
7181
            # flood protection check
7182
            if {[flood $nick $uhand]} {
7183
              return
7184
            }
7185
            # call dailymotion
7186
            foreach line [incith::google::parse_output [dailymotion $search]] {
7187
              put_output $where "$incith::google::dailymotion_prepend$line"
7188
            }
7189
            break
7190
          }
7191
        }
7192
      }
7193
      # check for !gamefaqs
7194
      if {$incith::google::gamefaq_results > 0} {
7195
        foreach bind [split $incith::google::gamefaq_binds " "] {
7196
          if {[string match -nocase $bind $trigger] == 1} {
7197
            # flood protection check
7198
            if {[flood $nick $uhand]} {
7199
              return
7200
            }
7201
            # gamefaqs requires splitting of the search
7202
            regexp -nocase -- {^(.+?) in (.+?)$} $search - system region
7203
            if {![info exists system] || ![info exists region]} {
7204
              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\]"
7205
              return
7206
            }
7207
            # call gamefaqs
7208
            foreach line [incith::google::parse_output [gamefaqs $system $region]] {
7209
              put_output $where "$incith::google::gamefaqs_prepend$line"
7210
            }
7211
            break
7212
          }
7213
        }
7214
      }
7215
      # check for !locate
7216
      if {$incith::google::locate_results > 0} {
7217
        foreach bind [split $incith::google::locate_binds " "] {
7218
          if {[string match -nocase $bind $trigger] == 1} {
7219
            # flood protection check
7220
            if {[flood $nick $uhand]} {
7221
              return
7222
            }
7223
            # call locate
7224
            if {![string match "*.*" $search]} {
7225
              set nsearch [lindex [split [getchanhost $search $where] @] 1]
7226
              if {[string length $nsearch]} { set search $nsearch }
7227
            }
7228
            foreach line [incith::google::parse_output [locate $search]] {
7229
              put_output $where "$incith::google::locate_prepend$line"
7230
            }
7231
            break
7232
          }
7233
        }
7234
      }
7235
      # check for !blog
7236
      if {$incith::google::blog_results > 0} {
7237
        foreach bind [split $incith::google::blog_binds " "] {
7238
          if {[string match -nocase $bind $trigger] == 1} {
7239
            # flood protection check
7240
            if {[flood $nick $uhand]} {
7241
              return
7242
            }
7243
            # call blogsearch.google
7244
            foreach line [incith::google::parse_output [blog $search]] {
7245
              put_output $where "$incith::google::blog_prepend$line"
7246
            }
7247
            break
7248
          }
7249
        }
7250
      }
7251
      # check for !ebay
7252
      if {$incith::google::ebay_results > 0} {
7253
        foreach bind [split $incith::google::ebay_binds " "] {
7254
          if {[string match -nocase $bind $trigger] == 1} {
7255
            # flood protection check
7256
            if {[flood $nick $uhand]} {
7257
              return
7258
            }
7259
            # call ebay
7260
            foreach line [incith::google::parse_output [ebay $search]] {
7261
              put_output $where "$incith::google::ebay_prepend$line"
7262
            }
7263
            break
7264
          }
7265
        }
7266
      }
7267
      # check for !popular
7268
      if {$incith::google::popular_results > 0} {
7269
        foreach bind [split $incith::google::popular_binds " "] {
7270
          if {[string match -nocase $bind $trigger] == 1} {
7271
            # flood protection check
7272
            if {[flood $nick $uhand]} {
7273
              return
7274
            }
7275
            # call popular
7276
            foreach line [incith::google::parse_output [popular $search]] {
7277
              put_output $where "$incith::google::popular_prepend$line"
7278
            }
7279
            break
7280
          }
7281
        }
7282
      }
7283
      # check for customized any triggers
7284
      if {$incith::google::my_custom > 0} {
7285
        foreach bind $incith::google::my_customs {
7286
          foreach sbind [split [lindex [split $bind :] 0]] {
7287
            if {[string match -nocase $sbind $trigger] == 1} {
7288
              # invoke customized trigger with phrase
7289
              # no need to flood protect this, if we do
7290
              # it may trigger erroneously
7291
              set text [join [lrange [split $bind :] 2 end] :]
7292
              if {$::incith::google::custom_words > 0} {
7293
                set remaps [regexp -inline -all {%%((?:end|[0-9]{1,2}|[0-9]{1,2}-(?:[0-9]{1,2}|end)))%%} $text]
7294
                foreach {junk remap} $remaps {
7295
                  if {[regexp -nocase {^((?:end|[0-9]{1,2}))$} $remap - rnum]} {
7296
                    if {[string equal -nocase "end" $rnum]} {
7297
                      set real [llength [split $search]]
7298
                    } else {
7299
                      set real [expr {$remap -1}]
7300
                    }
7301
                    regsub -all "$junk" $text "[lindex [split $search] $real]" text
7302
                  } elseif {[regexp -nocase {^([0-9]{1,2})-((?:[0-9]{1,2}|end))$} $remap - rstart rend]} {
7303
                    if {![string equal -nocase "end" $rend]} { set real [expr {$rend -1}] } else { set real [llength [split $search]] }
7304
                    regsub -all "$junk" $text "[join [lrange [split $search] [expr {${rstart}-1}] $real]]" text
7305
                  }
7306
                }
7307
              }
7308
              regsub -all -- {%search%} $text "$search" text
7309
              send_output "$::incith::google::command_char[lindex [split $bind :] 1] $text" $where $nick $uhand
7310
            }
7311
          }
7312
        }
7313
      }
7314
    }
7315
7316
    # PUT_OUTPUT
7317
    # actually sends the output to the server
7318
    proc put_output {where line} {
7319
      if {$incith::google::notice_reply == 1} {
7320
        putserv "NOTICE $where :$line"
7321
      } else {
7322
        putserv "PRIVMSG $where :$line"
7323
      }
7324
    }
7325
7326
    # PARSE_OUTPUT
7327
    # prepares output for sending to a channel/user, calls line_wrap
7328
    #
7329
    proc parse_output {input} {
7330
      set parsed_output [list] ; set parsed_current [list]
7331
      if {[string match "*\n*" $incith::google::seperator] == 1} {
7332
        set lastline ""
7333
        foreach newline [split $input "\n"] {
7334
          foreach line [incith::google::line_wrap $newline] {
7335
            set fix ""
7336
            # bold
7337
            if {[expr {[regexp -all {\002} $lastline] & 1 }]} {
7338
              append fix "\002"
7339
            }
7340
            # underline
7341
            if {[expr {[regexp -all {\037} $lastline] & 1 }]} {
7342
              append fix "\037"
7343
            }
7344
            # color
7345
            if {[expr {[regexp -all {\003} $lastline] & 1 }]} {
7346
              if {[set i [string last "\003" $lastline]] != -1} {
7347
                set lc [string range $lastline [expr {$i + 1}] [expr {$i + 5}]] 
7348
                if {![regexp {^[0-9]+\,[0-9+]$} $lc]} {
7349
                  if {[regexp {^[0-9]+$} [string range $lc 0 1]]} {
7350
                    append fix "\003[string range $lc 0 1]"
7351
                  }
7352
                } else {
7353
                  append fix "\003$lc"
7354
                }
7355
              }
7356
            }
7357
            # add fix+line to output
7358
            if {[string length [string map {" " ""} [stripcodes bcruag $line]]]} {
7359
              lappend parsed_output "$fix$line"
7360
            }
7361
            set lastline "$fix$line"
7362
          }
7363
        }
7364
      } else {
7365
        set input [string trimright $input $incith::google::seperator]
7366
        set lastline ""
7367
        foreach line [incith::google::line_wrap $input] {
7368
          # initialize fix each iteration
7369
          set fix ""
7370
          # add bold
7371
          if {[expr {[regexp -all {\002} $lastline] & 1 }]} {
7372
            append fix "\002"
7373
          }
7374
          # add underline
7375
          if {[expr {[regexp -all {\037} $lastline] & 1 }]} {
7376
            append fix "\037"
7377
          }
7378
          # add color
7379
          if {[expr {[regexp -all {\003} $lastline] & 1 }]} {
7380
            if {[set i [string last "\003" $lastline]] != -1} {
7381
              set lc [string range $lastline [expr {$i + 1}] [expr {$i + 5}]]
7382
              if {![regexp {^[0-9]{1,2}\,[0-9]{1,2}$} $lc]} {
7383
                if {[regexp {^[0-9]{1,2}} [string range $lc 0 1]]} {
7384
                  append fix "\003[string range $lc 0 1]"
7385
                } 
7386
              } else {
7387
                append fix "\003$lc"
7388
              }
7389
            }
7390
          }
7391
          # add fix+line to output
7392
          if {[string length [string map {" " ""} [stripcodes bcruag $line]]]} {
7393
            lappend parsed_output "$fix$line"
7394
          }
7395
          set lastline "$fix$line"
7396
        }
7397
      }
7398
      return $parsed_output
7399
    }
7400
7401
    # LINE_WRAP
7402
    # takes a long line in, and chops it before the specified length
7403
    # http://forum.egghelp.org/viewtopic.php?t=6690
7404
    #
7405
    proc line_wrap {str {splitChr { }}} { 
7406
      set out [set cur {}]
7407
      set i 0
7408
      set len $incith::google::split_length
7409
      #regsub -all "\002" $str "<ZQ" str
7410
      #regsub -all "\037" $str "<ZX" str
7411
      #regsub -all "\003" $str "<ZJ" str
7412
      foreach word [split [set str][set str ""] $splitChr] { 
7413
        if {[incr i [string len $word]] > $len} { 
7414
          #regsub -all "<ZQ" $cur "\002" cur
7415
          #regsub -all "<ZX" $cur "\037" cur
7416
          #regsub -all "<ZJ" $cur "\003" cur
7417
          lappend out [join $cur $splitChr] 
7418
          set cur [list $word] 
7419
          set i [string len $word] 
7420
        } else { 
7421
          lappend cur $word 
7422
        } 
7423
        incr i 
7424
      } 
7425
      #regsub -all "<ZQ" $cur "\002" cur
7426
      #regsub -all "<ZX" $cur "\037" cur
7427
      #regsub -all "<ZJ" $cur "\003" cur
7428
      lappend out [join $cur $splitChr] 
7429
    }
7430
7431
    # FLOOD_INIT
7432
    # modified from bseen
7433
    #
7434
    variable flood_data
7435
    variable flood_array
7436
    proc flood_init {} {
7437
      if {$incith::google::ignore < 1} {
7438
        return 0
7439
      }
7440
      if {![string match *:* $incith::google::flood]} {
7441
        putlog "$incith::google::version: variable flood not set correctly."
7442
        return 1
7443
      }
7444
      set incith::google::flood_data(flood_num) [lindex [split $incith::google::flood :] 0]
7445
      set incith::google::flood_data(flood_time) [lindex [split $incith::google::flood :] 1]
7446
      set i [expr $incith::google::flood_data(flood_num) - 1]
7447
      while {$i >= 0} {
7448
        set incith::google::flood_array($i) 0
7449
        incr i -1
7450
      }
7451
    }
7452
    ; flood_init
7453
7454
    # FLOOD
7455
    # updates and returns a users flood status
7456
    #
7457
    proc flood {nick uhand} {
7458
      if {$incith::google::ignore < 1} {
7459
        return 0
7460
      }
7461
      if {$incith::google::flood_data(flood_num) == 0} {
7462
        return 0
7463
      }
7464
      set i [expr ${incith::google::flood_data(flood_num)} - 1]
7465
      while {$i >= 1} {
7466
        set incith::google::flood_array($i) $incith::google::flood_array([expr $i - 1])
7467
        incr i -1
7468
      }
7469
      set incith::google::flood_array(0) [unixtime]
7470
      if {[expr [unixtime] - $incith::google::flood_array([expr ${incith::google::flood_data(flood_num)} - 1])] <= ${incith::google::flood_data(flood_time)}} {
7471
        putlog "$incith::google::version: flood detected from ${nick}."
7472
        putserv "notice $nick :$incith::google::version: flood detected, placing you on ignore for $::incith::google::ignore minute(s)! :P"
7473
        newignore [join [maskhost *!*[string trimleft $uhand ~]]] $incith::google::version flooding $incith::google::ignore
7474
        return 1
7475
      } else {
7476
        return 0
7477
      }
7478
    }
7479
7480
7481
    # AUTOMAGIC CHARSET ENCODING SUPPORT
7482
    # on the fly encoding support
7483
    #
7484
    proc incithdecode {text} {
7485
      global incithcharset
7486
      if {[lsearch -exact [encoding names] $incithcharset] != -1} {
7487
        set text [encoding convertfrom $incithcharset $text]
7488
      }
7489
      return $text
7490
    }
7491
7492
    proc incithencode {text} {
7493
      global incithcharset
7494
      if {[lsearch -exact [encoding names] $incithcharset] != -1} {
7495
        set text [encoding convertto $incithcharset $text]
7496
      }
7497
      return $text
7498
    }
7499
7500
    # utf-8 sucks for displaying any language using extended ascii, this helps alleviate that.
7501
    # correct utf-8 problems before they even appear.
7502
    proc utf8encodefix {country input} {
7503
      if {[lsearch -exact [encoding names] [set encoding_found [lindex [split [lindex $incith::google::encode_strings [lsearch -glob $incith::google::encode_strings "${country}:*"]] :] 1]]]} {
7504
        if {![string match "" $encoding_found]} { set input [encoding convertto $encoding_found $input] }
7505
      }
7506
      return $input
7507
    }
7508
7509
    # Wikipedia/Wikimedia subtag-decoder...
7510
    # decodes those silly subtags
7511
    #
7512
    proc subtagDecode {text} {
7513
      set url ""
7514
      regsub -all {\.([0-9a-fA-F][0-9a-fA-F])} $text {[format %c 0x\1]} text
7515
      set text [subst $text]
7516
      regsub -all "\r\n" $text "\n" text
7517
      foreach byte [split [encoding convertto "utf-8" $text] ""] {
7518
        scan $byte %c i
7519
        if { $i < 33 } {
7520
          append url [format %%%02X $i]
7521
        } else {
7522
          append url $byte
7523
        }
7524
      }
7525
      return [string map {% .} $url]
7526
    }
7527
7528
    # Vocabulary Aversion
7529
    # This converts swear words into appropriate words for IRC
7530
    # this is rather rudementary, is probably a better way to do this but meh..
7531
    #
7532
    proc vocabaversion {text} {
7533
      set newtext ""
7534
      foreach element [split $text] {
7535
        set violation 0
7536
        foreach vocabulary $incith::google::aversion {
7537
          set swear [lindex [split $vocabulary :] 0]
7538
          set avert [join [lrange [split $vocabulary :] 1 end]]
7539
          if {[string match -nocase "$swear" $element] && $avert != ""} {
7540
            append newtext "$avert "
7541
            set violation 1
7542
            break
7543
          }
7544
        }
7545
        if {$violation == 0} { append newtext "$element " }
7546
      }
7547
      return [string trim $newtext]
7548
    } 
7549
7550
    # Description Decode 
7551
    # convert html codes into characters - credit perplexa (urban dictionary)
7552
    #
7553
    proc descdecode {text} {
7554
      # code below is neccessary to prevent numerous html markups
7555
      # from appearing in the output (ie, &quot;, &#5671;, etc)
7556
      # stolen (borrowed is a better term) from perplexa's urban
7557
      # dictionary script..
7558
      if {[string match *&* $text]} {
7559
        global incithcharset
7560
        set escapes {
7561
		&nbsp; \xa0 &iexcl; \xa1 &cent; \xa2 &pound; \xa3 &curren; \xa4
7562
		&yen; \xa5 &brvbar; \xa6 &sect; \xa7 &uml; \xa8 &copy; \xa9
7563
		&ordf; \xaa &laquo; \xab &not; \xac &shy; \xad &reg; \xae
7564
		&macr; \xaf &deg; \xb0 &plusmn; \xb1 &sup2; \xb2 &sup3; \xb3
7565
		&acute; \xb4 &micro; \xb5 &para; \xb6 &middot; \xb7 &cedil; \xb8
7566
		&sup1; \xb9 &ordm; \xba &raquo; \xbb &frac14; \xbc &frac12; \xbd
7567
		&frac34; \xbe &iquest; \xbf &Agrave; \xc0 &Aacute; \xc1 &Acirc; \xc2
7568
		&Atilde; \xc3 &Auml; \xc4 &Aring; \xc5 &AElig; \xc6 &Ccedil; \xc7
7569
		&Egrave; \xc8 &Eacute; \xc9 &Ecirc; \xca &Euml; \xcb &Igrave; \xcc
7570
		&Iacute; \xcd &Icirc; \xce &Iuml; \xcf &ETH; \xd0 &Ntilde; \xd1
7571
		&Ograve; \xd2 &Oacute; \xd3 &Ocirc; \xd4 &Otilde; \xd5 &Ouml; \xd6
7572
		&times; \xd7 &Oslash; \xd8 &Ugrave; \xd9 &Uacute; \xda &Ucirc; \xdb
7573
		&Uuml; \xdc &Yacute; \xdd &THORN; \xde &szlig; \xdf &agrave; \xe0
7574
		&aacute; \xe1 &acirc; \xe2 &atilde; \xe3 &auml; \xe4 &aring; \xe5
7575
		&aelig; \xe6 &ccedil; \xe7 &egrave; \xe8 &eacute; \xe9 &ecirc; \xea
7576
		&euml; \xeb &igrave; \xec &iacute; \xed &icirc; \xee &iuml; \xef
7577
		&eth; \xf0 &ntilde; \xf1 &ograve; \xf2 &oacute; \xf3 &ocirc; \xf4
7578
		&otilde; \xf5 &ouml; \xf6 &divide; \xf7 &oslash; \xf8 &ugrave; \xf9
7579
		&uacute; \xfa &ucirc; \xfb &uuml; \xfc &yacute; \xfd &thorn; \xfe
7580
		&yuml; \xff &fnof; \u192 &Alpha; \u391 &Beta; \u392 &Gamma; \u393 &Delta; \u394
7581
		&Epsilon; \u395 &Zeta; \u396 &Eta; \u397 &Theta; \u398 &Iota; \u399
7582
		&Kappa; \u39A &Lambda; \u39B &Mu; \u39C &Nu; \u39D &Xi; \u39E
7583
		&Omicron; \u39F &Pi; \u3A0 &Rho; \u3A1 &Sigma; \u3A3 &Tau; \u3A4
7584
		&Upsilon; \u3A5 &Phi; \u3A6 &Chi; \u3A7 &Psi; \u3A8 &Omega; \u3A9
7585
		&alpha; \u3B1 &beta; \u3B2 &gamma; \u3B3 &delta; \u3B4 &epsilon; \u3B5
7586
		&zeta; \u3B6 &eta; \u3B7 &theta; \u3B8 &iota; \u3B9 &kappa; \u3BA
7587
		&lambda; \u3BB &mu; \u3BC &nu; \u3BD &xi; \u3BE &omicron; \u3BF
7588
		&pi; \u3C0 &rho; \u3C1 &sigmaf; \u3C2 &sigma; \u3C3 &tau; \u3C4
7589
		&upsilon; \u3C5 &phi; \u3C6 &chi; \u3C7 &psi; \u3C8 &omega; \u3C9
7590
		&thetasym; \u3D1 &upsih; \u3D2 &piv; \u3D6 &bull; \u2022
7591
		&hellip; \u2026 &prime; \u2032 &Prime; \u2033 &oline; \u203E
7592
		&frasl; \u2044 &weierp; \u2118 &image; \u2111 &real; \u211C
7593
		&trade; \u2122 &alefsym; \u2135 &larr; \u2190 &uarr; \u2191
7594
		&rarr; \u2192 &darr; \u2193 &harr; \u2194 &crarr; \u21B5
7595
		&lArr; \u21D0 &uArr; \u21D1 &rArr; \u21D2 &dArr; \u21D3 &hArr; \u21D4
7596
		&forall; \u2200 &part; \u2202 &exist; \u2203 &empty; \u2205
7597
		&nabla; \u2207 &isin; \u2208 &notin; \u2209 &ni; \u220B &prod; \u220F
7598
		&sum; \u2211 &minus; \u2212 &lowast; \u2217 &radic; \u221A
7599
		&prop; \u221D &infin; \u221E &ang; \u2220 &and; \u2227 &or; \u2228
7600
		&cap; \u2229 &cup; \u222A &int; \u222B &there4; \u2234 &sim; \u223C
7601
		&cong; \u2245 &asymp; \u2248 &ne; \u2260 &equiv; \u2261 &le; \u2264
7602
		&ge; \u2265 &sub; \u2282 &sup; \u2283 &nsub; \u2284 &sube; \u2286
7603
		&supe; \u2287 &oplus; \u2295 &otimes; \u2297 &perp; \u22A5
7604
		&sdot; \u22C5 &lceil; \u2308 &rceil; \u2309 &lfloor; \u230A
7605
		&rfloor; \u230B &lang; \u2329 &rang; \u232A &loz; \u25CA
7606
		&spades; \u2660 &clubs; \u2663 &hearts; \u2665 &diams; \u2666
7607
		&quot; \x22 &amp; \x26 &lt; \x3C &gt; \x3E O&Elig; \u152 &oelig; \u153
7608
		&Scaron; \u160 &scaron; \u161 &Yuml; \u178 &circ; \u2C6
7609
		&tilde; \u2DC &ensp; \u2002 &emsp; \u2003 &thinsp; \u2009
7610
		&zwnj; \u200C &zwj; \u200D &lrm; \u200E &rlm; \u200F &ndash; \u2013
7611
		&mdash; \u2014 &lsquo; \u2018 &rsquo; \u2019 &sbquo; \u201A
7612
		&ldquo; \u201C &rdquo; \u201D &bdquo; \u201E &dagger; \u2020
7613
		&Dagger; \u2021 &permil; \u2030 &lsaquo; \u2039 &rsaquo; \u203A
7614
		&euro; \u20AC &apos; \u0027 &lrm; "" &rlm; "" &#8236; "" &#8237; ""
7615
		&#8238; "" &#8212; \u2014
7616
        }
7617
        set text [string map $escapes $text]
7618
        # enable transcoding html elements?
7619
        if {$::incith::google::dirty_decode > 0} {
7620
          if {![string equal $incithcharset [encoding system]]} { set text [encoding convertfrom $incithcharset $text] }
7621
          set text [string map [list "\]" "\\\]" "\[" "\\\[" "\$" "\\\$" "\\" "\\\\"] $text]
7622
          regsub -all -- {&#([[:digit:]]{1,5});} $text {[format %c [string trimleft "\1" "0"]]} text
7623
          regsub -all -- {&#x([[:xdigit:]]{1,4});} $text {[format %c [scan "\1" %x]]} text
7624
          regsub -all -- {\\x([[:xdigit:]]{1,2})} $text {[format %c [scan "\1" %x]]} text
7625
          set text [subst "$text"]
7626
          if {![string equal $incithcharset [encoding system]]} { set text [encoding convertto $incithcharset $text] }
7627
        }
7628
      }
7629
      # correct possible bleedover of bold or underline
7630
      set fix "" ; 
7631
      if {[expr {[regexp -all {\002} $text] & 1 }]} {
7632
        append fix "\002"
7633
      }
7634
      if {[expr {[regexp -all {\037} $text] & 1 }]} {
7635
        append fix "\037"
7636
      }
7637
      set text "$text$fix"
7638
      return $text
7639
      
7640
    }
7641
7642
    # URL Decode
7643
    # Decodes all of the %00 strings in a url and returns it
7644
    #
7645
    proc urldecode {text} {
7646
      set url ""
7647
      # tcl filter required because we are using SUBST command below
7648
      # this will escape any sequence which could potentially trigger
7649
      # the interpreter..
7650
        regsub -all -- \\\\ $text \\\\\\\\ text
7651
        regsub -all -- \\\[ $text \\\\\[ text
7652
        regsub -all -- \\\] $text \\\\\] text
7653
        regsub -all -- \\\} $text \\\\\} text
7654
        regsub -all -- \\\{ $text \\\\\{ text
7655
        regsub -all -- \\\" $text \\\\\" text
7656
        regsub -all -- \\\$ $text \\\\\$ text
7657
      # end tcl filter
7658
      regsub -all {\%([0-9a-fA-F][0-9a-fA-F])} $text {[format %c 0x\1]} text
7659
      set text [subst $text]
7660
      foreach byte [split $text ""] {
7661
        scan $byte %c i
7662
        if { $i < 33 || $i > 127 } {
7663
          append url [format %%%02X $i]
7664
        } else {
7665
          append url $byte
7666
        }
7667
      }
7668
      return $url
7669
    }
7670
    # Un Gzip
7671
    # Unzips those silly g-zipped wikis
7672
    #
7673
    proc ungzip {html metas} {
7674
      if {$::incith::google::use_gzip > 0} {
7675
        if {![info exists ::incith_nozlib]} {
7676
          foreach {name value} $metas {
7677
            if {[regexp -nocase ^Content-Encoding$ $name]} {
7678
              if {[string equal -nocase "gzip" $value]} {
7679
	          if {![info exists ::incith_trf]} {
7680
                  if {[catch {set html [zlib inflate [string range $html 10 [expr { [string length $html] - 8 } ]]]} error]} { return $html }
7681
                } else {
7682
                  set html [zip -mode decompress -nowrap 1 [string range $html 10 [expr { [string length $html] - 8 } ]]]
7683
                }
7684
                break
7685
              }
7686
            }
7687
          }
7688
        }
7689
      }
7690
      return $html
7691
    }
7692
7693
    # URL Encode
7694
    # Encodes anything not a-zA-Z0-9 into %00 strings...
7695
    #
7696
    proc urlencode {text type {enc ""}} {
7697
      if {[string length $enc]} {
7698
        set text [encoding convertto $enc $text]
7699
      }
7700
      set url ""
7701
      foreach byte [split $text ""] {
7702
        scan $byte %c i
7703
        if {$i < 65 || $i > 122} {
7704
          append url [format %%%02X $i]
7705
        } else {
7706
          append url $byte
7707
        }
7708
      }
7709
      if {$type == 1} {
7710
        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]
7711
      } else {
7712
        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]
7713
      }
7714
    }
7715
  }
7716
}
7717
7718
putlog " - UNOFFICIAL $incith::google::version loaded."
7719
7720
# EOF