All pastes #287055 Raw Edit

Divers

public text v1 · immutable
#287055 ·published 2006-12-21 03:03 UTC
rendered paste body
# 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âêîéàçèïë &#0-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!"