Mise en forme de code: pensez à utiliser les balises [ tcl ] et [ /tcl ] (sans les espaces bien sûr) autour de vos codes tcl afin d'avoir un meilleur rendu et une coloration syntaxique. x


Commande à trois fonctions (carton jaune)
#1
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
#2
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.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#3
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.
#4
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.
#5
(08/06/2013, 09:34)wax Wrote: 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 :)
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#6
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.
#7
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
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.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#8
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..."
#9
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 :)
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#10
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 : )
#11
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é"

irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#12
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.
#13
Est-ce que tu as pensé à supprimer le fichier cd.db et à rehasher l'eggdrop ?
Je viens de faire le test à nouveau.
Canal Wrote: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 Wrote:[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
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#14
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 ?
#15
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.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away


Forum Jump:


Users browsing this thread: 1 Guest(s)