Bon, j'ai fait un petit script rapide (même pas testé )...
Le fonctionnement est très simple, c'est juste le moteur, il peut bien sûr être énormément amélioré, pour l'instant il ne se base que sur les nicks.
Deux petits notas:
- les cartons jaunes expirés ne sont retirés que si l'on remet un carton à la personne,
- une personne qui a un carton rouge est "supprimée" de la base pour le canal, en partant du principe que le ban l'empèche de revenir et donc de reprendre un carton jaune pendant 24h.
Le fonctionnement est très simple, c'est juste le moteur, il peut bien sûr être énormément amélioré, pour l'instant il ne se base que sur les nicks.
tcl
namespace eval cj {
# emplacement de la base de données
variable cjdb "databases/cj.db"
# Durée de validité d'un carton
variable delay 24
variable punish
bind pub o|o "!cj" [namespace current]::carton
proc carton {nick uhost handle chan args} {
if {[llength $args]!=1} {
# Oubli de la victime ?
puthelp "NOTICE $nick :Syntaxe: !cj <nick>"
return 0
}
set victim [string tolower [lindex $args 0]]
if {![onchan $victim $chan]} {
# victime pas sur le canal
puthelp "NOTICE $nick: $victim n'est pas sur $chan"
return 0
}
if {![info exists ::cj::punish($chan$victim)} {
# Pas de précédent carton, on le met et on kick
set ::cj::punish($chan$victim) "1µ[clock seconds]"
putkick $chan $victim "Carton jaune N°1 !"
} else {
# Utilisateur déjà sanctionné
set tmp [split $::cj::punish($chan$victim) "µ"]
if {[$tmp[1] + (3600*$::cj::delay)]>=[clock seconds]} {
# La sanction date de moins de "delay" heures
if {[$tmp[0]==1} {
# Il n'a eu qu'un carton, on lui met le 2ème
set ::cj::punish($chan$victim) "2µ[clock seconds]"
putkick $chan $victim "Carton jaune N°2 !"
} else {
# Il en a eu 2, on le banni
newchanban $chan "$victim!*@*" $nick "Carton rouge" 60*$::cj::delay
putkick $chan $victim "Carton rouge !"
unset ::cj::punish($chan$victim)
}
} else {
# Cas particulier: c'est un carton ancien, on repart à 1
set ::cj::punish($chan$victim) "1µ[clock seconds]"
putkick $chan $victim "Carton jaune N°1 !"
}
}
# Et maintenant, sauvegarde
::cj::save
return 0
}
# procédure de sauvegarde
proc save {} {
set fo [open $::cj::cjdb w]
foreach cv [array names $::cj::punish] {
puts $fo "$cv $::cj::punish($cv)"
}
close $fo
}
# chargement de la base
proc load {} {
if {![file exists $::cj::cjdb]} {
return 0
}
set fi [open $::cj::cjdb r]
set cartons [read -nonewlines $fi]
close $fi
foreach carton [split $cartons "\n"] {
set fields [split $carton " "]
set ::cj::punish($fields[0]) $fields[1]
}
}
}
::cj::load
putlog "Carton jaune chargé"
Deux petits notas:
- les cartons jaunes expirés ne sont retirés que si l'on remet un carton à la personne,
- une personne qui a un carton rouge est "supprimée" de la base pour le canal, en partant du principe que le ban l'empèche de revenir et donc de reprendre un carton jaune pendant 24h.