###############################################
# #
# 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