Donc, si je résume:
- on comptabilise les cartons jaunes par canal
- chaque carton a une validité de 24h
- si on se prend un 3ème carton jaune sur le même canal dans les temps, il a un carton rouge sur ce canal
Relativement simple à faire, sauf qu'il faut tenir compte du grand délai et des risques de redémarrage de l'eggdrop, ce qui implique d'enregistrer dans un fichier les cartons.
Concernant les ip's aussi, certains FAI, attribuent une ip pour 24heures.Peut-etre voir a mettre un flag particulier sur "pseudo1" . (genre flag defini pour *!ident@fai ) Attention a ne pas mettre un flag dejà utilisé/reconnu dans l'eggdrop.
CrazyCat, c'est bien ça tu as résumé ce que j'ai dis en trois ligne. Ça serais bien si rien ne se perd en mémoire comme tu dis après redémarrage de l'eggdrope.
cestlemien, pour répondre à ta question tout simplement un système d'avertissement sur salon, je pourrais m'amuser à rajouter des kick, et ban au lieu des carton jaune et rouge ect.. si non s'en servir pour un jeux en modifiant un peu le code.
(08/06/2013, 09:34)wax a écrit : cestlemien, pour répondre à ta question tout simplement un système d'avertissement sur salon, je pourrais m'amuser à rajouter des kick, et ban au lieu des carton jaune et rouge ect.. si non s'en servir pour un jeux en modifiant un peu le code.
Pour ma part, j'avais parfaitement compris la version "ludique" du système d'avertissement.
J'ai tout de même une question subsidiaire: est-ce que donner un carton provoque une action, comme un kick dans le cas d'un jaune et un kickban dans le cas d'un rouge ?
Ceci n'est pas bien important pour le moteur (une simple ligne à ajouter chaque fois), mais autant faire quelque chose qui fonctionne bien :)
08/06/2013, 15:33 (Modification du message : 22/06/2013, 16:51 par CrazyCat.)
Bon, j'ai fait un petit script rapide (même pas testé :D)...
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
namespaceeval cj {
# emplacement de la base de donnéesvariable cjdb "databases/cj.db"
# Durée de validité d'un cartonvariable delay 24variable punish
bind pub o|o "!cj"[namespace current]::cartonproc carton {nick uhost handle chan args}{if{[llength$args]!=1}{
# Oubli de la victime ?
puthelp "NOTICE $nick :Syntaxe: !cj <nick>"return0}set victim [string tolower [lindex$args0]]if{![onchan $victim$chan]}{
# victime pas sur le canal
puthelp "NOTICE $nick: $victim n'est pas sur $chan"return0}if{![info exists ::cj::punish($chan$victim)}{
# Pas de précédent carton, on le met et on kickset ::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" heuresif{[$tmp[0]==1}{
# Il n'a eu qu'un carton, on lui met le 2èmeset ::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 à 1set ::cj::punish($chan$victim)"1µ[clock seconds]"
putkick $chan$victim"Carton jaune N°1 !"}} # Et maintenant, sauvegarde
::cj::savereturn0}
# procédure de sauvegardeproc save {}{set fo [open$::cj::cjdb w]foreach cv [array names $::cj::punish]{puts$fo"$cv $::cj::punish($cv)"}close$fo}
# chargement de la baseprocload{}{if{![file exists $::cj::cjdb]}{return0}set fi [open$::cj::cjdb r]set cartons [read -nonewlines $fi]close$fiforeach 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.
Si tu pouvais être un peu plus poli, comme ça j'apprécierai de t'aider.
Je te rappelle, comme je viens de le dire, qu'on aide, et bénévolement. Et que les personnes qui demandent des scripts sont là pour apprendre un peu le tcl.
Donc, voici un script testé, toute modification sur le fonctionnement devra être faite par toi.
tcl
namespaceeval cj {
# emplacement de la base de donnéesvariable cjdb "databases/cj.db"
# Durée de validité d'un cartonvariable delay 24variable punish
bind pub o|- "!cj"[namespace current]::cartonproc carton {nick uhost handle chan text}{set args [split$text]if{$args=="" || [llength[split$args]]!=1}{
# Oubli de la victime ?
puthelp "NOTICE $nick :Syntaxe: !cj <nick>"return0}set victim [lindex[split$args]0]if{![onchan $victim$chan]}{
# victime pas sur le canal
puthelp "NOTICE $nick :$victim n'est pas sur $chan"return0}if{![info exists ::cj::punish($chan$victim)]}{
# Pas de précédent carton, on le met et on kickset ::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{[expr[expr3600*$::cj::delay] + [lindex$tmp1]]>=[clock seconds]}{
# La sanction date de moins de "delay" heuresif{[lindex$tmp0]==1}{
# Il n'a eu qu'un carton, on lui met le 2èmeset ::cj::punish($chan$victim)"2/[clock seconds]"
putkick $chan$victim"Carton jaune N°2 !"}else{
putlog "!=1" # Il en a eu 2, on le banni
newchanban $chan"$victim!*@*"$nick"Carton rouge"[expr60*$::cj::delay]
putkick $chan$victim"Carton rouge !"
unset ::cj::punish($chan$victim)}}else{
# Cas particulier: c'est un carton ancien, on repart à 1set ::cj::punish($chan$victim)"1/[clock seconds]"
putkick $chan$victim"Carton jaune N°1 !"}} # Et maintenant, sauvegarde
::cj::savereturn0}
# procédure de sauvegardeproc save {}{set fo [open$::cj::cjdb w]foreach cv [array names ::cj::punish]{puts$fo"$cv $::cj::punish($cv)"}close$fo}
# chargement de la baseprocload{}{if{![file exists $::cj::cjdb]}{return0}set fi [open$::cj::cjdb r]set cartons [read -nonewline $fi]close$fiforeach carton [split$cartons"\n"]{set fields [split$carton" "]set ::cj::punish([lindex$fields0])[lindex$fields1]}}}
::cj::load
putlog "Carton jaune chargé"
Je tiens à te remercier pour l'aide que tu me prête. Sauf erreur de ma part je ne vois pas d'impolitesse dans le dernier message que j'ai laissé, tu l'a surement mal interpréter. J'ai juste dis si tu t'a le temps de tester le code ça nous éviterais de rencontrer des messages d'erreur que je ne comprend pas, et je ne vois pas de mal à ça.
Bref, j'ai testé le code il y a toujours erreur: Tcl error [::cj::carton]: missing operand at _@_
in expression "86400 + _@_"
Si tu veux bien voir où ça cloche, et me faire part de ça.
J'aurais une question.
Lorsqu'ont fait un newchanban.. Normalement tu n'a pas besoin de putkick par la suite étant donner que newchanban kick aussi après le ban poser.
Effectivement, le newchanban (ainsi que le newban) kick l'utilisateur, mais j'ai pris l'habitude de doubler cette commande d'un kick car je ne suis jamais certain du moment où elle est effective: lorsque la ligne est lue ou à la fin du script (comme pour les modes). Alors que le putkick est (si je ne me trompe pas) immédiat.