BaroqueW

and his side-kick nikkitaa

MeteoqueW – Script TCL pour eggdrop

leave a comment »

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 !

Creative Commons License
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

Written by baroquew

January 5, 2009 at 20:49

Leave a Reply