# Meteo[queW] 0.3 # Cree le 09/04/2006 # Modifie la derniere fois le 15/04/2006 # !meteo affiche la meteo sur Paris-Montsouris # !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 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 0 set notice 0 set query 1 set agent "Mozilla" #code par défaut du lieu renvoyé par !meteo #FR75056 : Paris XIIIème set IDDefault FR75056 #1 -> affiche les print de debug, 0 -> ne les affiche pas set debug 0 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 if { ($affiche_aide == 1) } { print $nick $channel "!meteo pour avoir la météo sur Paris XIIIème" 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" } } proc parse {nick channel query} { global agent set token [http::config -useragent $agent] set token [http::geturl $query] puts stderr "" set htmlFile [http::data $token] #recupere le nom de la ville set searchville [regexp -nocase {visions ville: ([a-zâêîéàçèïë �-9;]*)} $htmlFile ville villenom] regsub -all {'} $villenom "'" villenom print $nick $channel "Meteo à $villenom" #recupere toutes les temperatures set search [regexp -nocase -all -inline {[0-9]*°} $htmlFile] #affiche les min/max de la journee set tempmin [lindex $search 0] regexp -nocase {([0-9]*)°} $tempmin valuemin tempmin set tempmax [lindex $search 1] regexp -nocase {([0-9]*)°} $tempmax valuemax tempmax print $nick $channel "Aujourd'hui : température minimale $tempmin°/maximale $tempmax°" #recupere les prochaines temperatures set temp1 [lindex $search 2] regexp -nocase {([0-9]*)°} $temp1 value1 temp1 set temp2 [lindex $search 3] regexp -nocase {([0-9]*)°} $temp2 value2 temp2 set temp3 [lindex $search 4] regexp -nocase {([0-9]*)°} $temp3 value3 temp3 set temp4 [lindex $search 5] regexp -nocase {([0-9]*)°} $temp4 value4 temp4 #recupere la description meteo (nuageux etc.) set weathers [regexp -all -nocase -inline {showAlt['()a-zàâéêèçùîô, ]*,false} $htmlFile] set weather1 [lindex $weathers 0] regexp -nocase {'([a-zàâéêèçùîô, ]*)'} $weather1 buffer weather1 set weather2 [lindex $weathers 1] regexp -nocase {'([a-zàâéêèçùîô, ]*)'} $weather2 buffer weather2 set weather3 [lindex $weathers 2] regexp -nocase {'([a-zàâéêèçùîô, ]*)'} $weather3 buffer weather3 set weather4 [lindex $weathers 3] regexp -nocase {'([a-zàâéêèçùîô, ]*)'} $weather4 buffer weather4 set secondes [clock seconds] set heure [clock format $secondes -format %H] #affiche tout if {($heure < 8)} { print $nick $channel "Aujourd'hui à 8h : $temp1° - $weather1" print $nick $channel "Aujourd'hui à 14h : $temp2° - $weather2" print $nick $channel "Aujourd'hui à 20h : $temp3° - $weather3" print $nick $channel "Demain à 8h : $temp4° - $weather4" } elseif {($heure > 7) && ($heure < 14)} { print $nick $channel "Aujourd'hui à 14h : $temp1° - $weather1" print $nick $channel "Aujourd'hui à 20h : $temp2° - $weather2" print $nick $channel "Demain à 8h : $temp3° - $weather3" print $nick $channel "Demain à 14h : $temp4° - $weather4" } elseif {($heure > 13) && ($heure < 20)} { print $nick $channel "Aujourd'hui à 20h : $temp1° - $weather1" print $nick $channel "Demain à 8h : $temp2° - $weather2" print $nick $channel "Demain à 14h : $temp3° - $weather3" print $nick $channel "Demain à 20h : $temp4° - $weather4" } elseif {($heure > 19)} { print $nick $channel "Demain à 8h : $temp1° - $weather1" print $nick $channel "Demain à 14h : $temp2° - $weather2" print $nick $channel "Demain à 20h : $temp3° - $weather3" print $nick $channel "Après-demain à 2h : $temp4° - $weather4" } } 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 return $aplat } proc pub:meteo { nick uhost handle channel arg } { global dtcmode global agent global IDDefault global dtcmessage global dtcmatches set ID $IDDefault if {[llength $arg] == 0} { #par defaut : Paris Montsouris set query "http://www.meteofrance.com/FR/mameteo/prevVille.jsp?LIEUID=$ID" parse $nick $channel $query #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.meteofrance.com/FR/mameteo/resultatRechercheLieu.jsp?VUE=PrevisionVilleGP&LIEU=$ville" set pagesearch [http::geturl $urlsearch] puts stderr "" set searchresult [http::data $pagesearch] set rechercheville [regexp {FR[0-9][0-9][0-9][0-9][0-9]} $searchresult ID] if {($rechercheville != 0)} { set query "http://www.meteofrance.com/FR/mameteo/prevVille.jsp?LIEUID=$ID" parse $nick $channel $query } else { set query "http://www.meteofrance.com/FR/mameteo/resultatRechercheLieu.jsp?VUE=PrevisionVilleGP&LIEU=$ville" set token [http::config -useragent $agent] set token [http::geturl $query] puts stderr "" upvar #0 $token state regexp -nocase {jsessionid=([a-z=?.0-9]*=FR[0-9]*)} $state(meta) buffer buffer2 if { [info exists buffer2] } { set query "http://www.meteofrance.com/FR/mameteo/prevVille.jsp;jsessionid=$buffer2" parse $nick $channel $query } else { print $nick $channel "La ville ou le code postal demandés (ie. $ville) n'ont pas été trouvés" } } } } } putlog "Meteo\[queW\] 0.3 - LOADED!"