Messages : 6
Sujets : 1
Inscription : May 2013
Niveau d’avertissement :
0%
Bonsoir, voilà je voudrais crée une commande "!cj" qui veut dire carton jaune
qui donne trois type de résultat:
Si je tape "!cj pseudo1" sur "salon1" pseudo1 reçoit un carton jaune sur salon1 (en message public)
Si je retape la même commande au même pseudo avant 24h (!cj pseudo1) sur le même salon, pseudo1 reçoit deux cartons jaunes
Si je retape une troisième fois la même commande au même pseudo sur le même salon (salon1) avant 24h (!cj pseudo1), pseudo1 reçoit un carton rouge.
Dans le script il faut mémorisé pseudo1 et le carton qu'il a reçut ainsi que le salon sur le quel il l'a reçut.
Autrement dit tant que pseudo1 n'a pas reçut 1 carton jaune sur "salon2" il ne peut recevoir un carton 2ième carton jaune
Quand un pseudo reçoit un carton rouge sur salon1 ses cartons sont remis à zéro automatiquement sur salon1.
Voilà en gros le but du script, se servir d'une seule commande au lieu de trois. Merci pour votre aide
Messages : 2,281
Sujets : 178
Inscription : Apr 2004
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.
Messages : 297
Sujets : 8
Inscription : Dec 2008
Niveau d’avertissement :
0%
Salut,
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.
Question: Quel est le but ?
Cordialement.
Messages : 6
Sujets : 1
Inscription : May 2013
Niveau d’avertissement :
0%
Bonjour,
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.
Messages : 2,281
Sujets : 178
Inscription : Apr 2004
(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
Messages : 6
Sujets : 1
Inscription : May 2013
Niveau d’avertissement :
0%
Re bonjour,
Oui CrazyCat j'ajouterais ces lignes là moi même, selon dans quoi je vais employé le script. Ça je peux
le faire moi même. Comme tu dis c'est le corps du scripte qui compte.
Messages : 2,281
Sujets : 178
Inscription : Apr 2004
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é  )...
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.
Messages : 6
Sujets : 1
Inscription : May 2013
Niveau d’avertissement :
0%
Bonsoir,
J'ai testé le code, j'ai ceci comme message d'erreur:
[21:29:56] Tcl error [::cj::carton]: missing close-bracket
in expression "![info exists ::cj::puni..."
Messages : 2,281
Sujets : 178
Inscription : Apr 2004
Ca, tu aurais pu le corriger:
remplace
TCL if {![info exists ::cj::punish($chan$victim)} {
par
TCL if {![info exists ::cj::punish($chan$victim)]} {
Petite faute de frappe, ça arrive
Messages : 6
Sujets : 1
Inscription : May 2013
Niveau d’avertissement :
0%
Re, Pas grave : )
J'ai ceci comme erreur maintenant, [02:13:37] Tcl error [::cj::carton]: invalid command name "1"
Si tu pouvais le tester chez toi comme ça il sera complet.
Merci : )
Messages : 2,281
Sujets : 178
Inscription : Apr 2004
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 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|- "!cj" [namespace current]::carton
proc 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>"
return 0
}
set victim [lindex [split $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 {[expr [expr 3600 * $::cj::delay] + [lindex $tmp 1]]>=[clock seconds]} {
# La sanction date de moins de "delay" heures
if {[lindex $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 {
putlog "!=1"
# Il en a eu 2, on le banni
newchanban $chan "$victim!*@*" $nick "Carton rouge" [expr 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 -nonewline $fi]
close $fi
foreach carton [split $cartons "\n"] {
set fields [split $carton " "]
set ::cj::punish([lindex $fields 0]) [lindex $fields 1]
}
}
}
::cj::load
putlog "Carton jaune chargé"
Messages : 6
Sujets : 1
Inscription : May 2013
Niveau d’avertissement :
0%
Bonjour CrazyCat,
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.
Merci d'avance.
Messages : 2,281
Sujets : 178
Inscription : Apr 2004
Est-ce que tu as pensé à supprimer le fichier cd.db et à rehasher l'eggdrop ?
Je viens de faire le test à nouveau.
Canal a écrit :09:08:13 --> moimoi (d9465544@5451F6D3.79C8CF8F.7D3B207D.IP) a rejoint #tests
09:08:25 <CrazyCat> !cj moimoi
09:08:26 <-- Artus a expulsé moimoi (Carton jaune N°1 !)
09:08:31 --> moimoi (d9465544@5451F6D3.79C8CF8F.7D3B207D.IP) a rejoint #tests
09:08:36 <CrazyCat> !cj moimoi
09:08:38 <-- Artus a expulsé moimoi (Carton jaune N°2 !)
09:08:43 --> moimoi (d9465544@5451F6D3.79C8CF8F.7D3B207D.IP) a rejoint #tests
09:08:47 <CrazyCat> !cj moimoi
09:08:48 -- Mode #tests [+b moimoi!*@*] par Artus
09:08:48 <-- Artus a expulsé moimoi (Banni: Carton rouge)
Party-line a écrit :[09:08:07] Carton jaune chargé
Tcl:
[09:08:26] moimoi kicked from #tests by Artus: Carton jaune N�1 !
[09:08:38] moimoi kicked from #tests by Artus: Carton jaune N�2 !
[09:08:48] #tests: mode change '+b moimoi!*@*' by Artus!Artus@www.eggdrop.fr
[09:08:48] moimoi kicked from #tests by Artus: Banni: Carton rouge
Messages : 710
Sujets : 66
Inscription : Apr 2010
Niveau d’avertissement :
0%
Salut,
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.
A moins que je me trompe ?
Messages : 2,281
Sujets : 178
Inscription : Apr 2004
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.
|