MeteoqueW – Script TCL pour eggdrop
En complément à mon article précédent, voici le script TCL MeteoqueW pour eggdrop qui permet d’afficher la mété des villes françaises dans votre salon (ou en privé) :
Merci de ne pas faire de copier/coller avec le code ci-dessous. J’ai dû modifier le code pour qu’il s’affiche proprement.
# MeteoqueW[IRC] 1.2
# Cree le 09/04/2006
# Modifie la derniere fois le 05/01/2009
# !meteo affiche la meteo sur [endroit par défaut]
# !meteo XXXX affiche la meteo pour la ville/code postal
# !aide affiche l'aide
#
# by BaroqueW
#
# 0.1 : affichage températures, prévisions, fonction de recherche "un seul mot"
# 0.2 : ajout de l'aide, gestion des villes inconnues, gestion des noms de ville avec apastrophe et espaces
# 0.3 : fonction de recherche multi mots avec gestion des "-[]()' et autres espaces, ajout du dtcmode, ajout du mode debug
# 1.0 : mise-à-jour du script 'future-proof'. Toutes les requêtes sont désormais faites par le site www.baroquew.info
# pour éviter d'avoir à modifier un large nombre d'installations à chaque fois que Meteo France change son format de données
# 1.1 : possibilité de personnaliser le message d'aide en fonction de l'endroit par défaut
# 1.2 : possibilité pour les utilisateurs de définir leur propre niveau de détail (configurable par l'admin)
package require http
bind pub - !meteo pub:meteo
bind pub - !aide pub:aide
#0 n'affiche pas l'aide sur !aide et !help, 1 affiche l'aide
set affiche_aide 1
#0 pas de message spécifique sur !meteo XXX (XXX appartenant à dtcmatches), 1 mode cdtc (ie on répond dtcmessage à !meteo XXX)
set dtcmode 1
set dtcmessage "Il fait chaud et humide dtc !"
set dtcmatches {"dtc" "dans ton cul"}
#choisir où sera affichée la meteo
#1 -> sera affiché sur cette fenetre, 0 -> ne sera pas affiché sur cette fenetre
set chanpublic 1
set notice 0
set query 0
#choisir le niveau de verbosité
#2 -> affiche tout, 1 -> n'affiche pas les vents, 0 -> n'affiche pas les vents, ni la météo détaillée
set verbosity 1
#pour laisser choisir les utilisateurs leur niveau de verbosité
set freeverbosity 1
#code par défaut du lieu renvoyé par !meteo
#et nom du lieu pour le message d'aide
#75013/Paris XIIIème par défaut
set IDDefault "75013"
set nomvilledefaut "Paris XIIIème"
#1 -> affiche les print de debug, 0 -> ne les affiche pas
set debug 0
#NE RIEN MODIFIER EN DESSOUS DE CETTE LIGNE!
set agent "Mozilla"
if { ($freeverbosity == 1) } {
bind pub - !meteo0 pub:meteo0
bind pub - !meteo1 pub:meteo1
bind pub - !meteo2 pub:meteo2
}
proc print { nick channel message} {
global chanpublic
global notice
global query
if { ($chanpublic == 1) && ($query == 0) && ($notice == 0) } {
putserv "PRIVMSG $channel :$message"
} elseif { ($chanpublic == 0) && ($query == 1) && ($notice == 0) } {
putserv "PRIVMSG $nick :$message"
} elseif { ($chanpublic == 0) && ($query == 0) && ($notice == 1) } {
putserv "NOTICE $nick :$message"
}
}
proc printdebug { nick channel message} {
global chanpublic
global notice
global query
global debug
if {($debug == 1)} {
if { ($chanpublic == 1) && ($query == 0) && ($notice == 0) } {
putserv "PRIVMSG $channel :$message"
} elseif { ($chanpublic == 0) && ($query == 1) && ($notice == 0) } {
putserv "PRIVMSG $nick :$message"
} elseif { ($chanpublic == 0) && ($query == 0) && ($notice == 1) } {
putserv "NOTICE $nick :$message"
}
}
}
proc pub:aide { nick uhost handle channel arg } {
global affiche_aide
global nomvilledefaut
global freeverbosity
global verbosity
if { ($affiche_aide == 1) } {
print $nick $channel "!meteo pour avoir la météo sur $nomvilledefaut"
print $nick $channel "!meteo code_postal ou !meteo ville pour rechercher la météo d'un autre endroit"
print $nick $channel "Données fournies par Meteo France (http://www.meteofrance.com)"
if { ($freeverbosity == 1) } {
print $nick $channel "Utilisez !meteo0 pour avoir la météo abrégée"
print $nick $channel "Utilisez !meteo1 pour avoir la météo détaillée"
print $nick $channel "Utilisez !meteo2 pour avoir la météo détaillée avec les vents"
print $nick $channel "Par défaut, !meteo affiche la météo comme !meteo$verbosity"
}
}
}
proc aplatir { vect } {
#si on a un code postal, pas de traitement
set first [lindex $vect 0]
set iscodepostal [regexp {[0-9][0-9][0-9][0-9][0-9]} $first codepostal]
if {([llength vect] == 1) && ($iscodepostal == 1)} {
set aplat $first
} else {
#traitement standard
set space "%20"
#on merge tous les arguments avec des %20 entre chaque (ie un espace)
set aplat [join $vect $space]
#on vire tous les chiffres puisque ce n'est pas un code postal
regsub -all {[0-9]} $aplat "" aplat
#on vire tous les "- et les espaces et on met un %20 à leur place
regsub -all {[ ''-]+} $aplat $space aplat
#on remplace les apostrophes par leur code HTML (%27)
regsub -all {\''} $aplat "%27" aplat
#au cas où, on vire les parenthèses, crochets et accolades et on les remplace par des espaces (%20)
set setbrackets {\[|\]|\(|\)|\{|\}}
regsub -all $setbrackets+ $aplat $space aplat
#on supprime les "%20" à répétition
set aplat [split $aplat $space]
set buffer {}
foreach word $aplat {
if { ( $word != $space ) && ( $word != "" ) } {
lappend buffer $word
}
}
set aplat [join $buffer $space]
#petite feinte
regsub {%207} $aplat "%27" aplat
}
#dans tous les cas, on retourne aplat sans accents
return [string map -nocase {
"à" "a" "â" "a" "ä" "a"
"é" "e" "è" "e" "ê" "e" "ë" "e"
"î" "i" "ï" "i"
"ô" "o" "ö" "o"
"ù" "u" "û" "u" "ü" "u"
"ç" "c" "ñ" "n" "ã" "a" "õ" "o"
} $aplat]
}
proc pub:meteo { nick uhost handle channel arg } {
global dtcmode
global agent
global IDDefault
global dtcmessage
global dtcmatches
global verbosity
set ID $IDDefault
if {[llength $arg] == 0} {
#par defaut : Paris Montsouris
set query "http://www.baroquew.net/cgi-bin/meteo.cgi?ville=$ID&v=$verbosity&html=0"
set token [::http::config -useragent $agent]
set token [::http::geturl $query -timeout 3000]
puts stderr ""
set htmlFile [::http::data $token]
set token [::http::cleanup $token]
set result [split $htmlFile _]
foreach i $result {
print $nick $channel $i
}
#si il y a des arguments
} else {
#chercher la premiere ville correspondante
set ville [aplatir $arg]
printdebug $nick $channel $ville
#vérifier le dtc mode
regsub -all {%20} $ville " " villedtc
printdebug $nick $channel $villedtc
set dtctest [lsearch -exact $dtcmatches $villedtc]
if { ($dtctest >= 0) && ($dtcmode == 1) } {
print $nick $channel $dtcmessage
} else {
set pagesearch [::http::config -useragent $agent]
set urlsearch "http://www.baroquew.net/cgi-bin/meteo.cgi?ville=$ville&v=$verbosity&html=0"
set token [::http::config -useragent $agent]
set token [::http::geturl $urlsearch]
puts stderr ""
set htmlFile [::http::data $token]
set token [::http::cleanup $token]
set result [split $htmlFile _]
foreach i $result {
print $nick $channel $i
}
}
}
}
proc pub:meteo0 { nick uhost handle channel arg } {
global dtcmode
global agent
global IDDefault
global dtcmessage
global dtcmatches
global verbosity
set ID $IDDefault
if {[llength $arg] == 0} {
#par defaut : Paris Montsouris
set query "http://www.baroquew.net/cgi-bin/meteo.cgi?ville=$ID&v=0&html=0"
set token [::http::config -useragent $agent]
set token [::http::geturl $query -timeout 3000]
puts stderr ""
set htmlFile [::http::data $token]
set token [::http::cleanup $token]
set result [split $htmlFile _]
foreach i $result {
print $nick $channel $i
}
#si il y a des arguments
} else {
#chercher la premiere ville correspondante
set ville [aplatir $arg]
printdebug $nick $channel $ville
#vérifier le dtc mode
regsub -all {%20} $ville " " villedtc
printdebug $nick $channel $villedtc
set dtctest [lsearch -exact $dtcmatches $villedtc]
if { ($dtctest >= 0) && ($dtcmode == 1) } {
print $nick $channel $dtcmessage
} else {
set pagesearch [::http::config -useragent $agent]
set urlsearch "http://www.baroquew.net/cgi-bin/meteo.cgi?ville=$ville&v=$verbosity&html=0"
set token [::http::config -useragent $agent]
set token [::http::geturl $urlsearch]
puts stderr ""
set htmlFile [::http::data $token]
set token [::http::cleanup $token]
set result [split $htmlFile _]
foreach i $result {
print $nick $channel $i
}
}
}
}
proc pub:meteo1 { nick uhost handle channel arg } {
global dtcmode
global agent
global IDDefault
global dtcmessage
global dtcmatches
global verbosity
set ID $IDDefault
if {[llength $arg] == 0} {
#par defaut : Paris Montsouris
set query "http://www.baroquew.net/cgi-bin/meteo.cgi?ville=$ID&v=1&html=0"
set token [::http::config -useragent $agent]
set token [::http::geturl $query -timeout 3000]
puts stderr ""
set htmlFile [::http::data $token]
set token [::http::cleanup $token]
set result [split $htmlFile _]
foreach i $result {
print $nick $channel $i
}
#si il y a des arguments
} else {
#chercher la premiere ville correspondante
set ville [aplatir $arg]
printdebug $nick $channel $ville
#vérifier le dtc mode
regsub -all {%20} $ville " " villedtc
printdebug $nick $channel $villedtc
set dtctest [lsearch -exact $dtcmatches $villedtc]
if { ($dtctest >= 0) && ($dtcmode == 1) } {
print $nick $channel $dtcmessage
} else {
set pagesearch [::http::config -useragent $agent]
set urlsearch "http://www.baroquew.net/cgi-bin/meteo.cgi?ville=$ville&v=$verbosity&html=0"
set token [::http::config -useragent $agent]
set token [::http::geturl $urlsearch]
puts stderr ""
set htmlFile [::http::data $token]
set token [::http::cleanup $token]
set result [split $htmlFile _]
foreach i $result {
print $nick $channel $i
}
}
}
}
proc pub:meteo2 { nick uhost handle channel arg } {
global dtcmode
global agent
global IDDefault
global dtcmessage
global dtcmatches
global verbosity
set ID $IDDefault
if {[llength $arg] == 0} {
#par defaut : Paris Montsouris
set query "http://www.baroquew.net/cgi-bin/meteo.cgi?ville=$ID&v=2&html=0"
set token [::http::config -useragent $agent]
set token [::http::geturl $query -timeout 3000]
puts stderr ""
set htmlFile [::http::data $token]
set token [::http::cleanup $token]
set result [split $htmlFile _]
foreach i $result {
print $nick $channel $i
}
#si il y a des arguments
} else {
#chercher la premiere ville correspondante
set ville [aplatir $arg]
printdebug $nick $channel $ville
#vérifier le dtc mode
regsub -all {%20} $ville " " villedtc
printdebug $nick $channel $villedtc
set dtctest [lsearch -exact $dtcmatches $villedtc]
if { ($dtctest >= 0) && ($dtcmode == 1) } {
print $nick $channel $dtcmessage
} else {
set pagesearch [::http::config -useragent $agent]
set urlsearch "http://www.baroquew.net/cgi-bin/meteo.cgi?ville=$ville&v=$verbosity&html=0"
set token [::http::config -useragent $agent]
set token [::http::geturl $urlsearch]
puts stderr ""
set htmlFile [::http::data $token]
set token [::http::cleanup $token]
set result [split $htmlFile _]
foreach i $result {
print $nick $channel $i
}
}
}
}
putlog "MeteoqueW\[IRC\] 1.2 - LOADED!"
Notez les paramètres :
- affiche_aide : 0 pour désactiver l’aide, 1 pour l’activer (trigger sur !aide)
- dtcmode : 0 pour désactiver, 1 pour activer. Si le mode est activé, le bot répondra dtcmessage lorsqu’il sera interrogé sur la météo à un endroit listé dans dtcmatches
- chanpublic, notice, query : 0/1 pour choisir où afficher les résultats
- verbosity : 0/1/2 affichent respectivement les tendances du jour, les tendances ET la météo détaillée des jours à venir, les tendances ET la météo détaillée des jours à venir ET les vents (pour les villes qui bénéficient de ce genre d’informations
- freeverbosity : 0/1 pour laisser les utilisateurs libres de choisir leur niveau de verbosité via les nouvelles commandes !meteo0, !meteo1, !meteo2
- IDDefault : ville par défaut si !meteo est appelé sans argument
- nomvilledefaut : nom de la ville par défaut affichée dans l’aide
- debug : 0/1 pour activer les messages de debugging
Si vous utilisez ce script MeteoqueW, merci de me laisser un mot ! De même si vous décidez de le modifier, merci de toujours référer à mon site et de faire profiter tout le monde de vos modifications !

MeteoqueW by http://www.baroquew.info/wordpress/archives/meteoquew-script-tcl-pour-eggdrop is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.0 France License.
Based on a work at www.baroquew.info.
J’avoue avoir emprunté la table de mapping des lettres avec/sans accents au script “Motus” que vous pouvez trouver sur http://forum.egghelp.org/viewtopic.php?t=13665


