All pastes #995409 Raw Edit

Miscellany

public text v1 · immutable
#995409 ·published 2008-04-24 03:41 UTC
rendered paste body
# <- GIGAGOOGLE 2.1 -> root@sbird.org
#
# --> S?rie GigaGoogle enti?rement ?dit?e par Raphael
# gigagoogle.tcl 2.1 par Raphael (root@sbird.org)
# gigagoogle.tcl 2.0 par Raphael (root@sbird.org)
# gigagoogle.tcl 1.0 par Raphael (root@sbird.org)
# supergoogle.tcl 1.3 par brazOo (brazman@systemz.org)
# supergoogle.tcl 1.2 par brother (luc@rocketmail.com)
#
# Ce script est une extension du Google.tcl script de 
# aNa|0Gue - analogue@glop.org - http://www.glop.org
# Il a ?t? modifi? par Scratch pour ajout? des options
# et caract?ristiques au google.tcl original. 
# Modifi? et traduit en fran?ais par Raphael pour
# ajouter de nouvelles caract?ristiques et corriger les
# derniers bugs trouv?s.
#
# Contacter Raphael :
# E-Mail : root@sbird.org
# Site : http://www.sbird.org/
# IRC :  Serveur : irc.sbird.org
#           Port : 6667
#           Chan : #Aide
#
#
# Caract?ristiques
# * Choisissez les canaux sur lesquels vous affichez les r?sultats [Par Scratch]
# * les Proxy sont support?s [Par Scratch]
# * Details comme le nom du site et la taille des liens [Par Scratch]
# * Aide en ligne [Par Scratch, modifi?e par Raphael]
# * Mode de DEBUG [Par Scratch]
# * Commande de contr?le du flood [Par Scratch]
# * Recherche dans les groupes, dans les images, etc... [Par Raphael]
# * Recherche en Party-Line [Par Scratch, modifi? par Raphael]
# * Demander plusieurs liens pour une recherche [Par Raphael]
# * Plusieurs options de recherche (langue, d?tails ou pas, etc...) [Par Raphael]
#
# Corrections de GigaGoogle v2.1 par rapport ? GigaGoogle v2.0
# * Modification de tous les parsages de pages ne fonctionnant plus depuis que google
#   avait chang? ses pages
# * Am?lioration des affichages des recherches
# * Suppression momentan?e des tailles d'images/de page inutiles puisque introuvables.
#
# Corrections de GigaGoogle v2.0 par rapport ? GigaGoogle v1.0
# * R?paration de la recherche simple : dans la v1.0 le script supprimait le premier
#   lien trouv? sur google dans les recherches !google.
# 
# Vous avez seulement besoin de charger les modules TCL suivant pour que le script
# fonctionne :
#   source scripts/alltools.tcl
#   source scripts/http.tcl          #seulement pour win32 ou si le module ne fonctionne pas
#   source scripts/gigagoogle.tcl    #ce script
#
#
#
#
# Ci-dessous remplissez ces quelques variables IMPORTANTES

# Hostname de votre service Proxy. Mettez ? "" si vous ne voulez pas l'utiliser.
# Ceci est pour les membres de bidule.fr (factice)
# set ggoogle_proxy "proxy.bidule.fr:8080"
set ggoogle_proxy ""

# Permettez seulement la commande sur les salons suivants...
# set ggoogle_channels "#chan1 #chan2 #chanX"
# ou pour tous les salons
# set ggoogle_channels ""
set ggoogle_channels ""

# Le maximum de liens retourn?s ? l'utilisateur
set ggoogle_hits 5

# le nombre par d?faut de liens retourn?s
set ggoogle_hits_default 1

# Permettre l'utilisation du mode d?taill?? [1/Oui - 0/Non]
set ggoogle_detail 1

# Employer le mode d?taill? seulement si il est demand?? [1/Oui - 0/Non]
set ggoogle_detail_request 1

# Methode de r?ponse pour une demande publique (sur le salon)
# Placer ? 0 pour une notice ? l'utilisateur
# Placer ? 1 pour un message priv? ? l'utilisateur
# Placer ? 2 pour une r?ponse sur le salon
set ggoogle_pubmethod 2

# Qui a le droit de faire une recherche Google dans la Party-Line
# (Utiliser les flags EggDrop)
# ie . Autorise seulement les BotMasters ou BotOwners
set ggoogle_pline_flags ""

# demande de notification? [1/Oui - 0/Non]
set ggoogle_log 1

# DEBUG le script? [1/Oui - 0/Non]
set ggoogle_debug 0

#
# Ne pas changer ? partir d'ici
#
set ggoogle_lastreq ""
set ggoogle_antiflood 0
package require http
if {!($ggoogle_proxy == "")} {
    http::config -proxyhost [lindex [split $ggoogle_proxy {:}] 0] -proxyport [lindex [split $ggoogle_proxy {:}] 1] -useragent "BrasMort Browser"
} { http::config -useragent "BrasMort Browser" }
bind pub - !google pub:ggoogle
bind pub - !zoek pub:ggoogle
bind pub - !search pub:ggoogle
bind pub - !images pub:gimages
bind pub - !groups pub:ggroups
bind dcc $ggoogle_pline_flags google dcc:ggoogle
bind dcc $ggoogle_pline_flags zoek dcc:ggoogle
bind dcc $ggoogle_pline_flags search dcc:ggoogle
bind dcc $ggoogle_pline_flags images dcc:gimages
bind dcc $ggoogle_pline_flags groups dcc:ggroups

proc fixhtml {html} {
  package require htmlparse
  set value [::htmlparse::mapEscapes $html]
  return $value
}
proc ggoogle_antiflood_reset {} {
  global ggoogle_antiflood
  set ggoogle_antiflood 0
  set ggoogle_lastreq ""
  foreach th [timers] {
    if {[lindex $th 1]=="ggoogle_antiflood_reset"} {
      killtimer [lindex $th 2]
    }
  }
}
proc pub:ggoogle { nick uhost handle channel arg } {
 global ggoogle_channels ggoogle_pubmethod
 global ggoogle_antiflood ggoogle_lastreq ggoogle_log 
   if {$ggoogle_antiflood > 4} {return 0}
   if {[llength $arg]!=0} {
    if {$arg == $ggoogle_lastreq} {return 0}
   }
    set ggoogle_lastreq $arg
   if {!($ggoogle_channels == "") && ([lsearch -exact [string tolower $ggoogle_channels] [string tolower $channel]] < 0)} {return 0}
   if {$ggoogle_pubmethod == 0} {set logger [ggoogle_start "google" 0 $nick $arg]} elseif {($ggoogle_pubmethod == 2) && ([string tolower $arg] != "help") && ([string tolower $arg] != "aide") && ([string tolower $arg] != "version")} {
     set logger [ggoogle_start "google" 2 $channel $arg]} else {set logger [ggoogle_start "google" 1 $nick $arg]}
   if {$ggoogle_log == 1} {putcmdlog "\[GG\] ($channel) $nick $logger"}
   set ggoogle_antiflood [expr $ggoogle_antiflood + 1]
   timer 1 ggoogle_antiflood_reset
   return 0
}
proc dcc:ggoogle { handle idx arg } {
 global ggoogle_antiflood ggoogle_lastreq ggoogle_log 
   if {$ggoogle_antiflood > 8} {return 0}
   if {$arg == $ggoogle_lastreq} {return 0}
   set ggoogle_lastreq $arg
   set logger [ggoogle_start "google" 3 $idx $arg]
   if {$ggoogle_log == 1} {putcmdlog "\[GG\] (Pline) $handle $logger"}
   set ggoogle_antiflood [expr $ggoogle_antiflood + 1]
   timer 1 ggoogle_antiflood_reset
   return 0
}

proc pub:gimages { nick uhost handle channel arg } {
 global ggoogle_channels ggoogle_pubmethod
 global ggoogle_antiflood ggoogle_lastreq ggoogle_log 
   if {$ggoogle_antiflood > 4} {return 0}
   if {$arg == $ggoogle_lastreq} {return 0}
   set ggoogle_lastreq $arg
   if {!($ggoogle_channels == "") && ([lsearch -exact [string tolower $ggoogle_channels] [string tolower $channel]] < 0)} {return 0}
   if {$ggoogle_pubmethod == 0} {set logger [ggoogle_start "images" 0 $nick $arg]} elseif {($ggoogle_pubmethod == 2) && ([string tolower $arg] != "help") && ([string tolower $arg] != "aide")} {
     set logger [ggoogle_start "images" 2 $channel $arg]} else {set logger [ggoogle_start "images" 1 $nick $arg]}
   if {$ggoogle_log == 1} {putcmdlog "\[GG\] ($channel) $nick $logger"}
   set ggoogle_antiflood [expr $ggoogle_antiflood + 1]
   timer 1 ggoogle_antiflood_reset
   return 0
}
proc dcc:gimages { handle idx arg } {
 global ggoogle_antiflood ggoogle_lastreq ggoogle_log 
   if {$ggoogle_antiflood > 8} {return 0}
   if {$arg == $ggoogle_lastreq} {return 0}
   set ggoogle_lastreq $arg
   set logger [ggoogle_start "images" 3 $idx $arg]
   if {$ggoogle_log == 1} {putcmdlog "\[GG\] (Pline) $handle $logger"}
   set ggoogle_antiflood [expr $ggoogle_antiflood + 1]
   timer 1 ggoogle_antiflood_reset
   return 0
}

proc pub:ggroups { nick uhost handle channel arg } {
 global ggoogle_channels ggoogle_pubmethod
 global ggoogle_antiflood ggoogle_lastreq ggoogle_log 
   if {$ggoogle_antiflood > 4} {return 0}
   if {$arg == $ggoogle_lastreq} {return 0}
   set ggoogle_lastreq $arg
   if {!($ggoogle_channels == "") && ([lsearch -exact [string tolower $ggoogle_channels] [string tolower $channel]] < 0)} {return 0}
   if {$ggoogle_pubmethod == 0} {set logger [ggoogle_start "groups" 0 $nick $arg]} elseif {($ggoogle_pubmethod == 2) && ([string tolower $arg] != "help") && ([string tolower $arg] != "aide")} {
     set logger [ggoogle_start "groups" 2 $channel $arg]} else {set logger [ggoogle_start "groups" 1 $nick $arg]}
   if {$ggoogle_log == 1} {putcmdlog "\[GG\] ($channel) $nick $logger"}
   set ggoogle_antiflood [expr $ggoogle_antiflood + 1]
   timer 1 ggoogle_antiflood_reset
   return 0
}
proc dcc:ggroups { handle idx arg } {
 global ggoogle_antiflood ggoogle_lastreq ggoogle_log 
   if {$ggoogle_antiflood > 8} {return 0}
   if {$arg == $ggoogle_lastreq} {return 0}
   set ggoogle_lastreq $arg
   set logger [ggoogle_start "groups" 3 $idx $arg]
   if {$ggoogle_log == 1} {putcmdlog "\[GG\] (Pline) $handle $logger"}
   set ggoogle_antiflood [expr $ggoogle_antiflood + 1]
   timer 1 ggoogle_antiflood_reset
   return 0
}

proc ggoogle_start { mode public destination arg } {
 global ggoogle_version version ggoogle_hits ggoogle_hits_default ggoogle_debug ggoogle_detail_request ggoogle_detail lastbind
   regsub -all -nocase {\$\{\}\[\]} $arg {} arg
   set arg [string tolower $arg]
   if {(([llength $arg]==0) || ([string tolower $arg] == "help") || ([string tolower $arg] == "aide")) && ($mode=="google")} {
      set temp ""
      lappend temp "Aide: $ggoogle_version"
      lappend temp "|-$lastbind \[fr|france|linux\] \[detail|simple\] <num> <mot(s) cl?(s)>"
      lappend temp "|  Recherchez sur Google avec des Mots Cl?s. Vous pouvez sp?cifier "
      lappend temp "|  le nombre de liens que vous d?sirez ainsi que plusieurs"
      lappend temp "|  mots cl?s pour trouver plus facilement ce que vous cherchez."
      lappend temp "|  Le Maximum de liens est actuellement de : $ggoogle_hits"
      lappend temp "|-$lastbind <num> <mot(s) cl?(s)>"
      lappend temp "|  Chercher des sites sur Google avec des Mots Cl?s"
      lappend temp "|-!images <num> <mot(s) cl?(s)>"
      lappend temp "|  Chercher des images sur Google avec des Mots Cl?s"
      lappend temp "|-!groups <num> \[langue=fr|de|en...\] <mot(s) cl?(s)>"
      lappend temp "|  Chercher des groupes sur Google avec des Mots Cl?s"
      lappend temp "`-$lastbind aide"
      ggoogle_sendtext $temp 0 $destination
      return "asked for help."
   }
   if {(([llength $arg]==0) || ([string tolower $arg] == "help") || ([string tolower $arg] == "aide")) && ($mode=="images")} {
      set temp ""
      lappend temp "Aide: $ggoogle_version"
      lappend temp "|-!google \[fr|france|linux\] \[detail|simple\] <num> <mot(s) cl?(s)>"
      lappend temp "|  Recherchez sur Google avec des Mots Cl?s. Vous pouvez sp?cifier "
      lappend temp "|  le nombre de liens que vous d?sirez ainsi que plusieurs"
      lappend temp "|  mots cl?s pour trouver plus facilement ce que vous cherchez."
      lappend temp "|  Le Maximum de liens est actuellement de : $ggoogle_hits"
      lappend temp "|-!google <num> <mot(s) cl?(s)>"
      lappend temp "|  Chercher des sites sur Google avec des Mots Cl?s"
      lappend temp "|-$lastbind <num> <mot(s) cl?(s)>"
      lappend temp "|  Chercher des images sur Google avec des Mots Cl?s"
      lappend temp "|-!groups <num> \[langue=fr|de|en...\] <mot(s) cl?(s)>"
      lappend temp "|  Chercher des groupes sur Google avec des Mots Cl?s"
      lappend temp "`-$lastbind aide"
      ggoogle_sendtext $temp 0 $destination
      return "asked for help."
   }
   if {(([llength $arg]==0) || ([string tolower $arg] == "help") || ([string tolower $arg] == "aide")) && ($mode=="groups")} {
      set temp ""
      lappend temp "Aide: $ggoogle_version"
      lappend temp "|-!google \[fr|france|linux\] \[detail|simple\] <num> <mot(s) cl?(s)>"
      lappend temp "|  Recherchez sur Google avec des Mots Cl?s. Vous pouvez sp?cifier "
      lappend temp "|  le nombre de liens que vous d?sirez ainsi que plusieurs"
      lappend temp "|  mots cl?s pour trouver plus facilement ce que vous cherchez."
      lappend temp "|  Le Maximum de liens est actuellement de : $ggoogle_hits"
      lappend temp "|-!google <num> <mot(s) cl?(s)>"
      lappend temp "|  Chercher des sites sur Google avec des Mots Cl?s"
      lappend temp "|-!images <num> <mot(s) cl?(s)>"
      lappend temp "|  Chercher des images sur Google avec des Mots Cl?s"
      lappend temp "|-$lastbind <num> \[langue=fr|de|en...\] <mot(s) cl?(s)>"
      lappend temp "|  Chercher des groupes sur Google avec des Mots Cl?s"
      lappend temp "`-$lastbind aide"
      ggoogle_sendtext $temp 0 $destination
      return "asked for help."
   }
   if {$arg == "version"} {
      ggoogle_sendtext "{$ggoogle_version est activ? sur un eggdrop [lindex $version 0].}" 0 $destination
      return "a demand? la version."
   }

    if {$mode=="images"} {
        set zoekstring $arg
        set detailed 0
        if {[string match {[0-9]} [lindex $zoekstring 0]] || [string match {[0-9][0-9]} [lindex $zoekstring 0]]} {
            set hits [lindex $zoekstring 0]
            set zoekstring [lrange $arg 1 end]
            if {$hits > $ggoogle_hits} {
                ggoogle_sendtext "{Trop de liens demand?s (voir $lastbind aide)}" $public $destination
                return "a demand? ? avoir trop de liens."
            }
            if {$hits < 1} {
                ggoogle_sendtext "{Le nombre de liens demand?s doit ?tre de 1 minimum}" $public $destination
                return "a mit un nombre invalide de liens."
            } 
        } else {
            set hits $ggoogle_hits_default
        }
        set query "http://images.google.fr/images?q="
        for { set index 0 } { $index<[llength $zoekstring] } { incr index } {
            set query "$query[lindex $zoekstring $index]"
            if {$index<[llength $zoekstring]-1} then {
                set query "$query+"
            }
        }
        set query "$query&num=$hits"
        if {$ggoogle_debug == 1} {
            putlog "DEBUG: Query built ($query)"
            putlog "DEBUG: Contacting website..."
        }
        set token [http::geturl $query]
        puts stderr ""
        upvar #0 $token state
        if {$ggoogle_debug == 1} {putlog "DEBUG: Got state ($state(http))"}
        if {[string tolower [lindex $state(http) 2]] != "ok"} {
            ggoogle_sendtext "{Aucun r?sultat trouv? pour $zoekstring (Error: [lrange $state(http) 2 end])}" $public $destination
            return "a recherch? $zoekstring (images) mais il y a eu une erreur: [lrange $state(http) 2 end]."
        }
        set htmldata [http::data $token]
        if {$ggoogle_debug == 1} {putlog "DEBUG: Got data ([string length $htmldata] bytes)"}
        set parsed [images_parse $htmldata]
        if {$parsed == 0} {
            if {$ggoogle_debug == 1} {putlog "DEBUG: Could not find items to parse."}
            ggoogle_sendtext "{Aucun r?sultat trouv? pour $zoekstring}" $public $destination
            return "a recherch? $zoekstring mais n'a pas eu de r?sultats. (images)"
        }
        if {$ggoogle_debug == 1} {putlog "DEBUG: Data parsed (got [lindex $parsed 0] items)"}
        set sendtext [images_template $parsed $detailed $zoekstring]
        if {$ggoogle_debug == 1} {putlog "DEBUG: Template applied ([llength $sendtext] lines of text)"}
        ggoogle_sendtext $sendtext $public $destination
        if {$ggoogle_debug == 1} {putlog "DEBUG: Sent text to output. Done..."}          
        return "a recherch? $zoekstring et a eu [lindex $parsed 0] liens  (images - [string length $htmldata] bytes)"
    }

    if {$mode=="groups"} {
        set zoekstring $arg
        set detailed 0
        if {[string match {[0-9]} [lindex $zoekstring 0]] || [string match {[0-9][0-9]} [lindex $zoekstring 0]]} {
            set hits [lindex $zoekstring 0]
            set zoekstring [lrange $arg 1 end]
            if {$hits > $ggoogle_hits} {
                ggoogle_sendtext "{Trop de liens demand?s (voir $lastbind aide)}" $public $destination
                return "a demand? ? avoir trop de liens."
            }
            if {$hits < 1} {
                ggoogle_sendtext "{Le nombre de liens demand?s doit ?tre de 1 minimum}" $public $destination
                return "a mit un nombre invalide de liens."
            } 
        } else {
            set hits $ggoogle_hits_default
        }
        set lang 0
        if {[string range $zoekstring 0 4]=="lang="} {
            set lang [lindex $zoekstring 0]
            set zoekstring [lrange $zoekstring 1 end]
            set lang [string range $lang 5 end]
            set lang "lr=lang_[string tolower $lang]"
        }
        set query "http://groups.google.fr/groups?q="
        for { set index 0 } { $index<[llength $zoekstring] } { incr index } {
            set query "$query[lindex $zoekstring $index]"
            if {$index<[llength $zoekstring]-1} then {
                set query "$query+"
            }
        }
        if {$lang!=0} {
            set query "$query&$lang"
        }
        set query "$query&num=$hits"
        if {$ggoogle_debug == 1} {
            putlog "DEBUG: Query built ($query)"
            putlog "DEBUG: Contacting website..."
        }
        set token [http::geturl $query]
        puts stderr ""
        upvar #0 $token state
        if {$ggoogle_debug == 1} {putlog "DEBUG: Got state ($state(http))"}
        if {[string tolower [lindex $state(http) 2]] != "ok"} {
            ggoogle_sendtext "{Aucun r?sultat trouv? pour $zoekstring (Erreur: [lrange $state(http) 2 end])}" $public $destination
            return "a recherch? $zoekstring (groups) mais a eu une erreur: [lrange $state(http) 2 end]."
        }
        set htmldata [http::data $token]
        if {$ggoogle_debug == 1} {putlog "DEBUG: Got data ([string length $htmldata] bytes)"}
        set parsed [groups_parse $htmldata]
        if {$parsed == 0} {
            if {$ggoogle_debug == 1} {putlog "DEBUG: Could not find items to parse."}
            ggoogle_sendtext "{Aucun r?sultat trouv? pour $zoekstring}" $public $destination
            return "a recherch? $zoekstring mais n'a pas eu de r?sultats. (groups)"
        }
        if {$ggoogle_debug == 1} {putlog "DEBUG: Data parsed (got [lindex $parsed 0] items)"}
        set sendtext [groups_template $parsed $detailed $zoekstring]
        if {$ggoogle_debug == 1} {putlog "DEBUG: Template applied ([llength $sendtext] lines of text)"}
        ggoogle_sendtext $sendtext $public $destination
        if {$ggoogle_debug == 1} {putlog "DEBUG: Sent text to output. Done..."}          
        return "a recherch? $zoekstring et a eu [lindex $parsed 0] liens (groups - [string length $htmldata] bytes)"
    }
    
   set maybelang [string tolower [lindex $arg 0]]
   if {($maybelang == "france")||($maybelang == "fr")} {set arg [lrange $arg 1 end];set google_lang "fr"}
   if {($maybelang == "linux")} {set arg [lrange $arg 1 end];set google_lang "linux"}
   if {[string tolower [lindex $arg 0]] == "detail"} {
      set zoekstring [lrange $arg 1 end]
      if {$ggoogle_detail == 1} {
        set detailed 1
      } else {
        ggoogle_sendtext "{Le mode d?taill? a ?t? interdit par l'administrateur}" $public $destination
      }
   } elseif {[string tolower [lindex $arg 0]] == "simple"} {
      set zoekstring [lrange $arg 1 end]
      set detailed 0
   } else {
      set zoekstring $arg
      if {$ggoogle_detail_request == 1} {set detailed 0} else {set detailed 1}
   }
   if {[string match {[0-9]} [lindex $zoekstring 0]] || [string match {[0-9][0-9]} [lindex $zoekstring 0]]} {
      set hits [lindex $zoekstring 0]
      set zoekstring [lrange $zoekstring 1 end]
      if {$hits > $ggoogle_hits} {
         ggoogle_sendtext "{Trop de liens demand?s (voir $lastbind aide)}" $public $destination
         return "a demand? ? avoir trop de liens."
      }
      if {$hits < 1} {
         ggoogle_sendtext "{Le nombre de liens demand?s doit ?tre de 1 minimum}" $public $destination
         return "a mit un nombre invalide de liens."
      } 
   } else {
      set hits $ggoogle_hits_default
      set zoekstring $zoekstring
   }
   if {[info exist google_lang]} {
    switch -exact -- $google_lang {
        "fr" {set query "http://www.google.fr/search?lr=lang_fr&q="}
        "linux" {set query "http://www.google.com/linux?q="}
    }
   } else {
    set query "http://www.google.com/search?q="
   }
   for { set index 0 } { $index<[llength $zoekstring] } { incr index } {
    set query "$query[lindex $zoekstring $index]"
    if {$index<[llength $zoekstring]-1} then {
      set query "$query+"
    }
   }
   set query "$query&num=$hits"
   if {$ggoogle_debug == 1} {
      putlog "DEBUG: Query built ($query)"
      putlog "DEBUG: Contacting website..."
   }
   set token [http::geturl $query]
   puts stderr ""
   upvar #0 $token state
   if {$ggoogle_debug == 1} {putlog "DEBUG: Got state ($state(http))"}
   if {[string tolower [lindex $state(http) 2]] != "ok"} {
      ggoogle_sendtext "{Aucun r?sultat trouv? pour $zoekstring (Erreur: [lrange $state(http) 2 end])}" $public $destination
      return "a recherch? $zoekstring (google) mais a eu une erreur: [lrange $state(http) 2 end]."
   }
   set htmldata [http::data $token]

   if {$ggoogle_debug == 1} {putlog "DEBUG: Got data ([string length $htmldata] bytes)"}
   set parsed [ggoogle_parse $htmldata]
   if {$parsed == 0} {
     if {$ggoogle_debug == 1} {putlog "DEBUG: Could not find items to parse."}
     ggoogle_sendtext "{Aucun r?sultat trouv? pour $zoekstring}" $public $destination
     return "a recherch? $zoekstring mais n'a pas eu de r?sultats. (google)"
   }
   if {$ggoogle_debug == 1} {putlog "DEBUG: Data parsed (got [lindex $parsed 0] items)"}
   set sendtext [ggoogle_template $parsed $detailed $zoekstring]
   if {$ggoogle_debug == 1} {putlog "DEBUG: Template applied ([llength $sendtext] lines of text)"}
   ggoogle_sendtext $sendtext $public $destination
   if {$ggoogle_debug == 1} {putlog "DEBUG: Sent text to output. Done..."}
   return "a recherch? $zoekstring et a eu [lindex $parsed 0] liens (google - [string length $htmldata] bytes)"
}
proc ggoogle_parse {data} {
   set count 0
   set outputdata ""
   regsub -all "\n" $data "<newline>" data
   regsub -all "<div class=g><a " $data \n data
   regsub -all " - </span><nobr><a class=" $data \n data
   regsub -all -- "<font size=-1>" $data \n data
   regsub -all "<newline>" $data \n data
   set data [split $data \n]
   set pattern "href=*"
   foreach elem $data {
      if {[string match "Results *" $elem] || [string match "R?sultats *" $elem]} {
          regsub -all "</font>" $elem "\n" elem
          set elem [lindex [split $elem \n] 0]
          regsub -all "<b>" $elem "\002" elem
          regsub -all "</b>" $elem "\002" elem
          lappend outputdata $elem
      }
      if {[string match $pattern $elem]} {
          set full $elem
	  regsub -all "\"" $elem "" elem
	  regsub -all "class=l>" $elem "" elem
          regsub -all "</a>" $elem \n elem
          set elem [split $elem \n]
          set elem [lindex $elem 0]
          set full [lrange $full [expr [llength $full]-7] end]
          set size "N/A"
          foreach word $full {
                regexp {[0-9]+k} $word size
          }
          set result ""
          set infos [gere_result $elem]
          set title [lindex $infos 0]
          set url [lindex $infos 1]
          lappend result $title $url $size
          lappend outputdata $result
          incr count
      }
   }
   if {$count==0} {return 0}
   return "$count $outputdata" 
}
proc gere_result { line } {
        set reply ""
        regsub -all "href=" $line "" line
        regsub -all ">" $line \n buf
        set lien [lindex $buf 0]
        set lienlen [string length $lien]
        set title [string range $line [expr $lienlen+1] end]
	set title [gere_html $title]
        lappend reply $title $lien
        return $reply
}
proc gere_html {title} {
        regsub -all "</?b>" $title "\002" title
        regsub -all "</?u>" $title "\037" title
	set title [fixhtml $title]
	return $title
}
proc images_parse {data} {
    set count 0
    set outputdata ""
    regsub -all "\n" $data "<newline>" data
    regsub -all "<a href=/imgres" $data "\n" data
    regsub -all " ko<br><font color" $data "\n" data
    set data [split $data \n]
    set pattern "?imgurl=*"
    foreach elem $data {
        if {[string match $pattern $elem]} {
            set size "N/A"
            regexp {[0-9]+} [lindex $elem end] size
            if {$size!="N/A"} {append size "ko"}
            regsub -all "&imgrefurl=" $elem "\n" elem
            set elem [split $elem \n]
            set url "[string range [lindex $elem 0] 8 end]"
            lappend outputdata "$url $size"
            incr count
        }
    }
   if {$count==0} {return 0}
   return "$count $outputdata" 
}
proc groups_parse {data} {
    set count 0
    set outputdata ""
    regsub -all "\n" $data "<newline>" data
    regsub -all "<font size=\"\\+0\"><newline>  <a   " $data "\n" data
    regsub -all "</td></tr></table>" $data "\n" data
    regsub -all "<p><a href=/group" $data "\n" data
    regsub -all -- "- <a href=/groups" $data "\n" data
    set data [split $data \n]
    foreach elem $data {
	set url "N/A"
	regexp "^href=\"/group/(.+)\">(.+)</a><newline>  </font>&nbsp;<newline>  &nbsp; &nbsp;<nobr><font size=\"-1\">Groupe :</font><newline>  <a  href=\"/group/.+\?lnk=sg\" >(.+)</a><newline></nobr><newline>  <table cellspacing=\"0\" cellpadding=\"0\" border=\"0\"><tr><td><newline>  .+<newline><br><newline>  <font class=\"gl\">(.+) de (.+) - (\[0-9]+) messages? - (\[0-9]+) auteurs?.*$" $elem match url title group date auteur nbmsgs nbauteurs
	if {$url != "N/A"} {
            set url "http://groups.google.fr/group/$url"
	    set title [gere_html $title]
            lappend outputdata [list $title $date $group $auteur $url $nbmsgs $nbauteurs]
            incr count
	}
    }
   if {$count==0} {return 0}
   return "$count $outputdata"
}
proc groups_template {data details terms} {
    global ggoogle_version
    set items [lrange $data 1 end]
    set reply ""
    set count 0
    foreach hit $items {
      set title [lindex $hit 0]
      set date [lindex $hit 1]
      set group [lindex $hit 2]
      set auteur [lindex $hit 3]
      set url [lindex $hit 4]
      set nbmsgs [lindex $hit 5]
      set nbauteurs [lindex $hit 6]
      set count [expr $count + 1]
      if {[lindex $data 0] == 1} then {
        set temp "$title - $date par $auteur ($group) $url"
      } else {
        set temp "\[$count\] $title - $date par $auteur ($group) $url"
      }
      lappend reply $temp
    }
    return $reply
}
proc images_template {data details terms} {
    global ggoogle_version
    set items [lrange $data 1 end]
    set reply ""
    set count 0
    foreach hit $items {
      set url [lindex $hit 0]
      set size [lindex $hit 1]
      set count [expr $count + 1]
      if {[lindex $data 0] == 1} then {
        # set temp "$url ($size)" // when $size could be used ...
	set temp "$url"
      } else {
        # set temp "\[$count\] $url ($size)" // when $size could be used ...
        set temp "\[$count\] $url"
      }
      lappend reply $temp
    }
    return $reply
}

proc ggoogle_template {data detail terms} {
  global ggoogle_version
  # les liens sont [lrange $data 2 end] dans la version pr?c?dente

  set items [lrange $data 1 end]
  set reply ""
  if {$detail == 0} {
    set count 0
    foreach hit $items {
      set url [lindex $hit 1]
      set size [lindex $hit 2]
      if {$size != "-"} then {
        set count [expr $count + 1]
        if {[lindex $data 0] == 1} then {
          # set temp "$url ($size)" // when $size could be used ...
          set temp "$url"
        } else {
          # set temp "\[$count\] $url ($size)" // when $size could be used ...
          set temp "\[$count\] $url"
        }
        lappend reply $temp
      }
    }
  } else {
    lappend reply "Recherche de $terms ($ggoogle_version)"
    set count 0
    foreach hit $items {
      set name [lindex $hit 0]
      set url [lindex $hit 1]
      set size [lindex $hit 2]
      if {$size != "-"} then {
        set count [expr $count + 1]
        if {[lindex $data 0] == 1} then {
          # lappend reply "|- $url ($size)" // when $size could be used ...
          lappend reply "|- $url"
          lappend reply "|  $name"
        } else {
          # lappend reply "|-\[$count\] $url ($size)" // when $size could be used ...
          lappend reply "|-\[$count\] $url"
          lappend reply "|  $name"
        }
      }
    }
    set result [lindex $data 1]
    regsub -all "for" $result \n result
    regsub -all "pour" $result \n result
    set result [split $result \n]
    set result [lindex $result 0]
    regsub -all "&nbsp;" $result " " result
    regsub -all "," $result " " result
    regsub -all "Results" $result "R?sultats" result
    regsub -all "of about" $result "sur un total d'environ" result
    lappend reply "`- $result"
  }
  return $reply
}
proc ggoogle_sendtext {data public destination} {
  global botnick
  if {[llength $data] == 1 && $public == 2} {putquick ":$botnick PRIVMSG $destination :[lindex $data 0]"} else {
    foreach text $data {
      if {$public == 0} {
        putquick ":$botnick NOTICE $destination :$text"
      } elseif {$public == 1 || $public == 2} {
        putquick ":$botnick PRIVMSG $destination :$text"
      } else {
        putdcc $destination $text
      }
    }
  }
}
set ggoogle_version "GigaGoogle v2.1"
putlog "$ggoogle_version par Raphael charg? (root@sbird.org - http://www.sbird.org/)"