En fait aucune erreur que ce soit en PL ou ailleurs, a part le fait qu'a la commande !vdm rien ne se passe :)
En y regardant mieux je n'ai pas vu non plus de spécification de salons ou le !vdm doit être actif .... Ou alors j'ai loupé quelque chose ..
je CC le TCL ici :
En y regardant mieux je n'ai pas vu non plus de spécification de salons ou le !vdm doit être actif .... Ou alors j'ai loupé quelque chose ..
je CC le TCL ici :
tcl
###############################################
# #
# V i e D e M e r d e #
# v2.0 (04/08/2010) #
# par Galdinx, MenzAgitat et ealexp #
# #
# http://www.boulets-roxx.com #
# IRC: irc.teepi.net #boulets #
# irc.epiknet.org #boulets #
# #
# Les scripts de MenzAgitat sont #
# téléchargeables sur http://www.egghelp.org #
# ou http://www.eggdrop.fr #
# #
###############################################
# Description
# script permettant d'afficher une citation, soit prise au hasard, soit selon son numéro, soit la dernière parue,
# depuis le site http://www.viedemerde.fr/
# Changelog :
# 1.0 : 1ère version
# 1.1 : Correction suite à un changement de payload du site + simplification des regsub
# 2.0 : Modifications apportees par ealexp
# - Correction suite à un changement du payload du site.
# - Commandes !vdm last[- nombre] et !vdm <numéro>.
# - Paramètres suppélmentaires (urls du site, et couleurs de la VDM).
#
# LICENCE:
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
if {[catch {package require http}]} {
putlog "\002$::vdm::scriptname\002 : Vous avez besoin du package http pour pouvoir utiliser ce script."
return
}
if {[catch {package require Tcl 8.5}]} {
putlog "\002$::vdm::scriptname\002 : Vous avez besoin de Tcl en version 8.5 au moins pour pouvoir utiliser ce script."
}
if {[info commands vdm::uninstall] eq "::vdm::uninstall"} { vdm::uninstall }
namespace eval ::vdm {
#######################
# #
# CONFIGURATION #
# #
#######################
########################################
# COMMANDES PUBLIQUES ET AUTORISATIONS #
#######################################
# Nom de la commande publique
# Valeur par défaut : "!vdm"
variable vdm_command_name "!vdm"
# Autorisations pour la commande
# Valeur par défaut "-|-"
variable vdm_command_flags "-|-"
###################
# PARAMÈTRES HTTP #
###################
# UserAgent
# Valeur par défaut : "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"
variable useragent "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"
# Url pour récupérer une VDM aléatoire
# Valeur par défaut : "http://www.viedemerde.fr/aleatoire"
variable url_aleatoire "http://www.viedemerde.fr/aleatoire"
# Url pour récupérer une seule VDM
# Valeur par défaut : "http://www.viedemerde.fr/inclassable/"
variable url_une "http://www.viedemerde.fr/inclassable/"
# Url pour récupérer la dernière VDM
# Valeur par défaut : "http://www.viedemerde.fr/"
variable url_dernieres "http://www.viedemerde.fr/"
#################
# MISE EN FORME #
#################
# Note : les couleurs sont à mettre sous la forme "<avant-plan>[,arrière-plan]".
# Si vous ne voulez pas de couleurs, mettez une chaîne vide ("")
# Couleur du texte des VDM
# Valeur par défaut : ""
variable couleur_texte_vdm "00,01"
# Couleur du texte des erreurs
# Valeur par défaut : "14"
variable couleur_texte_erreurs "14"
# Affichage de l'ID, de la date ou de l'auteur de la VDM (dans l'ordre).
# Valeur par défaut : "1 1 1"
# Exemples : "1 1 0" pour afficher l'id, la date mais pas l'auteur de la VDM.
variable affichage "1 1 1"
# Couleur de l'ID de la VDM
# Valeur par défaut : "01,15"
variable couleur_id_vdm "01,15"
# Couleur de la date de la VDM
# Valeur par défaut : ""
variable couleur_date_vdm ""
# Couleur de l'auteur de la VDM
# Valeur par défaut : ""
variable couleur_auteur_vdm ""
# Nombre de caractères maximum par ligne
# Valeur par défaut : 420
variable max_line_length 420
##############################
# PARAMETRES DE L'ANTI-FLOOD #
##############################
# Anti-flood (0 = désactivé, 1 = activé)
variable antiflood 1
# Combien de commandes sont autorisées en combien de temps ?
# exemple : "4:45" = 4 commandes maximum en 45 secondes;
# les suivantes seront ignorées.
variable cmdflood_vdm "4:45"
# Intervalle de temps minimum entre l'affichage de 2 messages
# avertissant que l'anti-flood a été déclenché (ne réglez pas
# cette valeur trop bas afin de ne pas être floodé par les messages
# d'avertissement de l'anti-flood...)
variable antiflood_msg_interval 20
#######################################################################
# #
# NE RIEN MODIFIER APRÈS CE CADRE SI VOUS NE CONNAISSEZ PAS TCL #
# #
#######################################################################
variable script_name "VDM"
variable script_version "2.0"
variable nb_vdm_page 13
# Flag udef
setudef flag vdm
variable current_flood ""
variable antiflood_msg ""
proc uninstall {args} {
putlog "Désallocation des ressources de \002$::vdm::script_name\002..."
foreach binding [lsearch -inline -all -regexp [binds *[set ns [string range [namespace current] 2 end]]*] " \{?(::)?$ns"] {
unbind [lindex $binding 0] [lindex $binding 1] [lindex $binding 2] [lindex $binding 4]
}
foreach running_timer [timers] {
if { [string match "*[namespace current]::*" [lindex $running_timer 1]] } { killtimer [lindex $running_timer 2] }
}
foreach running_utimer [utimers] {
if { [string match "*[namespace current]::*" [lindex $running_utimer 1]] } { killutimer [lindex $running_utimer 2] }
}
namespace delete [namespace current]
}
}
# ::vdm::vdm_command
#
# Procédure principale
proc ::vdm::vdm_command {nick host handle chan arg} {
if {![channel get $chan vdm]} {
return
}
if {($::vdm::antiflood == 1) && ([::vdm::antiflood $chan] == "flood")} {
return
}
if {[lindex [set arg [split $arg]] 0] eq ""} {
set vdm [::vdm::fetch_vdm $::vdm::url_aleatoire]
} elseif {[string is integer [lindex $arg 0]]} {
set vdm [::vdm::fetch_vdm $::vdm::url_une$arg]
} elseif {$arg eq "last"} {
set vdm [::vdm::fetch_vdm $::vdm::url_dernieres]
} elseif {[regexp {last-(.*)} $arg dummy nb]} {
if {$nb > $::vdm::nb_vdm_page} {
puthelp "PRIVMSG $chan :[code $::vdm::couleur_texte_erreurs $chan]L'index doit être inférieur ou égal à $::vdm::nb_vdm_page.[code endcolor $chan]"
return
}
set vdm [::vdm::fetch_vdm $::vdm::url_dernieres $nb]
} else {
puthelp "PRIVMSG $chan :[code $::vdm::couleur_texte_erreurs $chan]Usage : !vdm \[numéro/last\[- 1 à $::vdm::nb_vdm_page\]\][code endcolor $chan]"
return
}
switch $vdm {
"http_error" {
puthelp "PRIVMSG $chan :[code $::vdm::couleur_texte_erreurs $chan]La connexion à VDM n'a pas pu être établie. Peut-être le site rencontre-t-il des difficultés techniques. Veuillez réessayer plus tard.[code endcolor $chan]"
return
}
"vdm_error" {
puthelp "PRIVMSG $chan :[code $::vdm::couleur_texte_erreurs $chan]La VDM n'a pas pu être récupérée.[code endcolor $chan]"
return
}
}
lassign $::vdm::affichage afficher_id afficher_date afficher_auteur
lassign $vdm id message date auteur
# Affichage de l'ID
if {$afficher_id} {
append privmsg "[code $::vdm::couleur_id_vdm $chan]\[$id\][code endcolor $chan] "
}
# La VDM en elle-même
append privmsg "[code $::vdm::couleur_texte_vdm $chan][::vdm::string_filter $message $chan][code endcolor $chan]"
# Affichage de la date
if {$afficher_date} {
append privmsg " - [code $::vdm::couleur_date_vdm $chan]$date[code endcolor $chan]"
}
# Affichage de l'auteur
if {$afficher_auteur} {
append privmsg " - par [code $::vdm::couleur_auteur_vdm $chan]$auteur[code endcolor $chan]"
}
foreach ligne [::vdm::split_line $privmsg] {
puthelp "PRIVMSG $chan :$ligne"
}
return
}
# ::vdm::fetch_vdm
#
# Récupère la page donnée, et la parse pour récupérer la xième VDM présente.
# En cas de succès, elle retourne une liste contenant l'id et le contenu de la VDM.
# Si une erreur s'est produite, elle retourne "error"
# Note : la présentation des VDM est la même pour toutes les pages (VDM aléatoires, une seule VDM et dernière VDM postée), donc il n'y a pas besoin de plusieurs procédures.
proc ::vdm::fetch_vdm {url {index 0} args} {
set token [::vdm::geturl $url {*}$args]
if {[::http::status $token] ne "ok"} {
::http::cleanup $token
return "http_error"
}
foreach {dummy id vdm date auteur} [regexp -all -inline {<div class="post" id="(.+?)">(.+?)</p><div class="date">(?:.*?)<p style="margin-top:(?:.*?)">(.*?) - <a class="(?:.*?)" href="(?:.*?)">(?:.*?)</a> - par (.*?) } [::http::data $token]] {
lappend vdm_list [list $id $vdm $date $auteur]
}
::http::cleanup $token
if {[info exists vdm_list] eq ""} {
return "vdm_error"
}
return [lindex $vdm_list $index]
}
# ::vdm::string_filter
#
# Nettoie la VDM
proc ::vdm::string_filter {str chan} {
set str [string map -nocase {
"à" "à" "à" "à" "á" "á" "â" "â"
"ã" "ã" "ä" "ä" "å" "å" "æ" "æ"
"ç" "ç" "è" "è" "é" "é" "ê" "ê"
"ë" "ë" "ì" "ì" "í" "í" "î" "î"
"ï" "ï" "ð" "ð" "ñ" "ñ" "ò" "ò"
"ó" "ó" "ô" "ô" "õ" "õ" "ö" "ö"
"÷" "÷" "ø" "ø" "ù" "ù" "ú" "ú"
"û" "û" "ü" "ü" "ý" "ý" "þ" "þ"
"ÿ" "ÿ" """ "\"" "&" "&" "€" "€"
"œ" "Å“" "Ÿ" "Ÿ" " " " " "¡" "¡"
"¢" "¢" "£" "£" "¤" "¤" "¥" "Â¥"
"¦" "¦" "&brkbar;" "¦" "§" "§" "¨" "¨"
"¨" "¨" "©" "©" "ª" "ª" "«" "«"
"¬" "¬" "­" "Â-" "®" "®" "¯" "¯"
"&hibar;" "¯" "°" "°" "±" "±" "²" "²"
"³" "³" "´" "´" "µ" "µ" "¶" "¶"
"·" "·" "¸" "¸" "¹" "¹" "º" "º"
"»" "»" "¼" "¼" "½" "½" "¾" "¾"
"¿" "¿" "À" "À" "Á" "Ã" "Â" "Â"
"Ã" "Ã" "Ä" "Ä" "Å" "Å" "Æ" "Æ"
"Ç" "Ç" "È" "È" "É" "É" "Ê" "Ê"
"Ë" "Ë" "Ì" "í" "Í" "Ã" "Î" "Î"
"Ï" "Ã" "Ð" "Ã" "Đ" "Ã" "Ñ" "Ñ"
"Ò" "Ò" "Ó" "Ó" "Ô" "Ô" "Õ" "Õ"
"Ö" "Ö" "×" "×" "Ø" "Ø" "Ù" "Ù"
"Ú" "Ê" "Û" "Û" "Ü" "í" "Ý" "Ã"
"Þ" "Î" "ß" "ß" "\r" "" "\t" ""
"'" "\'" "'" "\'" ">" ">" "<" "<"
""" "\'" "&" "&" "#91;" "\(" "\" "\/"
"]" ")" "{" "(" "}" ")" "£" "£"
"¨" "¨" "©" "©" "«" "«" "Â" "Â"
"®" "®" "´" "´" "·" "·" "¹" "¹"
"»" "»" "¼" "¼" "½" "½" "¾" "¾"
"À" "À" "Ã" "Ã" "Â" "Â" "Ã" "Ã"
"Ä" "Ä" "Å" "Å" "Æ" "Æ" "Ç" "Ç"
"È" "È" "É" "É" "Ê" "Ê" "Ë" "Ë"
"í" "í" "Ã" "Ã" "Î" "Î" "Ã" "Ã"
"Ã" "Ã" "Ñ" "Ñ" "Ò" "Ò" "Ó" "Ó"
"Ô" "Ô" "Õ" "Õ" "Ö" "Ö" "×" "×"
"Ø" "Ø" "Ù" "Ù" "Ê" "Ê" "Û" "Û"
"í" "í" "Ã" "Ã" "Î" "Î" "ß" "ß"
"à" "à" "á" "á" "â" "â" "ã" "ã"
"ä" "ä" "å" "å" "æ" "æ" "ç" "ç"
"è" "è" "é" "é" "ê" "ê" "ë" "ë"
"ì" "ì" "í" "í" "î" "î" "ï" "ï"
"ð" "ð" "ñ" "ñ" "ò" "ò" "ó" "ó"
"ô" "ô" "õ" "õ" "ö" "ö" "÷" "÷"
"ø" "ø" "ù" "ù" "ú" "ú" "û" "û"
"ü" "ü" "ý" "ý" "þ" "þ"
} $str]
regsub -all {<br />} $str " " str
regsub -all {<[^>]+>} $str "" str
regsub -all {\n} $str " " str
regsub {VDM$} $str "[code bold $chan]VDM[code bold $chan]" str
return $str
}
# ::vdm::geturl
#
# Appelle ::http::geturl et suit les redirections.
proc ::vdm::geturl {url args} {
::http::config -useragent $::vdm::useragent
set original_url_host [lindex [regexp -inline {http://(.*?)/} $url] 0]
while {1} {
set token [::http::geturl $url {*}$args]
if {![string match {30[1237]} [::http::ncode $token]]} {
return $token
}
set meta [set ${token}(meta)]
::http::cleanup $token
if {![dict exists $meta Location]} {
return $token
}
set url [dict get $meta Location]
unset meta
if {[regexp -inline {http://(.*?)/} $url] eq ""} {
set url $original_url_host$url
}
}
}
# ::vdm::antiflood
#
# Vérifie si l'antiflood n'est pas déclenché sur le chan.
proc ::vdm::antiflood {chan} {
if {![dict exists $::vdm::current_flood $chan]} {
dict set ::vdm::current_flood $chan 0
}
if {![dict exists $::vdm::antiflood_msg $chan]} {
dict set ::vdm::antiflood_msg $chan 0
}
set max_requests [lindex [split $::vdm::cmdflood_vdm ":"] 0]
set time [lindex [split $::vdm::cmdflood_vdm ":"] 1]
if {[dict get $::vdm::current_flood $chan] >= $max_requests} {
if {[dict get $::vdm::antiflood_msg $chan] == 0} {
dict set ::vdm::antiflood_msg $chan 1
putquick "PRIVMSG $chan :[code 7 $chan]:::[code $::vdm::couleur_texte_erreurs $chan] Contrôle de flood activé pour la commande [code bold $chan]$::vdm::vdm_command_name[code bold $chan] : pas plus de $max_requests requête(s) toutes les $time secondes.[code endcolor $chan]"
utimer $::vdm::antiflood_msg_interval [list ::vdm::antiflood_msg_reset $chan]
}
return "flood"
} else {
dict incr ::vdm::current_flood $chan
utimer $time [list ::vdm::antiflood_close_instance $chan]
return "no flood"
}
}
# ::vdm::antiflood_close_instance
proc ::vdm::antiflood_close_instance {chan} {
if {[dict get $::vdm::current_flood $chan] > 0} {
dict incr ::vdm::current_flood $chan -1
}
}
# ::vdm::antiflood_msg_reset
proc ::vdm::antiflood_msg_reset {chan} {
dict set ::vdm::antiflood_msg $chan 0
}
proc ::vdm::code {code chan} {
if {$code eq "bold"} {
if {![string match *c* [lindex [split [getchanmode $chan]] 0]]} { return "\002" } { return "" }
} elseif {$code eq "underline"} {
if {![string match *c* [lindex [split [getchanmode $chan]] 0]]} { return "\037" } { return "" }
} elseif {$code eq "endcolor"} {
if {![string match *c* [lindex [split [getchanmode $chan]] 0]]} { return "\003" } { return "" }
} elseif {$code ne ""} {
if {![string match *c* [lindex [split [getchanmode $chan]] 0]]} { return "\003$code" } { return "" }
} else {
return ""
}
}
proc ::vdm::split_line {texte} {
set output_length [string length $texte]
set letter_index 0
while {$letter_index < $output_length} {
if {$output_length - $letter_index > $::vdm::max_line_length} {
set cut_index [string last " " $texte [expr $letter_index + $::vdm::max_line_length ]]
} else {
set cut_index $output_length
}
lappend output [string range $texte $letter_index $cut_index]
set letter_index $cut_index
}
if { ![info exists output] } { lappend output {} }
return $output
}
bind evnt -|- prerehash ::vdm::uninstall
bind pub $::vdm::vdm_command_flags $::vdm::vdm_command_name ::vdm::vdm_command