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


[Script] Modération par les voices
#1
Bonjour à tous :)

Je souhaite faire un script tcl qui pourrait permettre la modération par les voices.

A partir des flags que j'aurai ajouté à mes voices (hv) je souhaiterai leur donner la possibilité d'utiliser 2 commandes. La première qui sera le kick et la deuxième le ban bien évidemment...

Mais je voudrai pouvoir stocker dans un fichier .db le voice qui a utilisé la commande et quelle commande il a utilisé et sur quel pseudo.

Je ne rencontre pas trop de problème pour les premières étapes, c'est pour la partie écriture dans le fichier que j'ai plus de mal...

Voici le code :


tcl
namespace eval vdmodo { 
 
   # emplacement de la base de données 
   variable vdmododb "/home/portgasdkiba/vdmbot/databases/carton.db"
 
   variable punish 
 
   variable vdmodochan "#viedemerde" 
 
   bind pub hv|hv "!vdmkick" [namespace current]::vdmkick 
 
   proc vdmkick {nick uhost handle chan text} { 
      if { [string tolower $chan] ne [string tolower $::vdmodo::vdmodochan] } { 
         putlog "Script non actif sur $chan"
		 puthelp "NOTICE $nick :Script non actif sur $chan !"
         return 0; 
      } 
      set args [split $text] 
      if {$args=="" || [llength [split $args]]!=1} { 
         # Oubli de la victime ? 
         puthelp "NOTICE $nick :Syntaxe: !vdmkick <pseudo>" 
         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 {[isvoice $victim $chan]||[ishalfop $victim $chan]||[isop $victim $chan] || (![matchattr $handle gv $chan]&&![matchattr $handle hp])} {
         puthelp "NOTICE $nick :$victim ne peut pas être kické sur $chan car il a un accès." 
         putlog "$nick vient d'essayer de kicker $victim sur $chan" 
		 putlog "flags gv pour $handle sur $chan : [matchattr $handle gv $chan]"
		 putlog "flags hp global pour $handle : [matchattr $handle hp]"
         return 0 
      } 
      if {![info exists ::vdmodo::punish($chan$victim)]} { 
         # Pas de précédent carton, on l'ajoute dans le fichier et on kick 
         set ::vdmodo::punish($nick a utilisé la commande !vdmkick sur $victim) 
         putkick $chan $victim "PAN ! $victim, dans ta tronche !" 
      }
 
      # Et maintenant, sauvegarde 
      ::vdmodo::save 
      return 0 
   } 
 
   # procédure de sauvegarde 
   proc save {} { 
      set fo [open $::vdmodo::vdmododb w] 
      foreach cv [array names ::vdmodo::punish] { 
         puts $fo "$cv $::vdmodo::punish($cv)" 
      } 
      close $fo 
   } 
 
   # chargement de la base 
   proc load {} { 
      if {![file exists $::vdmodo::vdmododb]} { 
         return 0 
      } 
      set fi [open $::vdmodo::vdmododb r] 
      set cartons [read -nonewline $fi] 
      close $fi 
      foreach carton [split $cartons "n"] { 
         set fields [split $carton " "] 
         set ::vdmodo::punish([lindex $fields 0]) [lindex $fields 1] 
      } 
   } 
} 
 
::vdmodo::load 
 
putlog "VDM Modération chargé par KiBa adapté de la version Carton.tcl de CrazyCat"


Après ça il faudra que je fasse la même chose avec !vdmban

Merci beaucoup pour l'aide :)
#2
Un petit up please ? :)
#3
Je ne comprends pas trop l'utilité de ta partie de chargement du .db.
Il te suffit d'ajouter une ligne dans ton .db chaque fois : http://tools.eggdrop.fr/pasteme/view/126e0704
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#4
Ok Crazy, je pensais qu'il fallait d'abord charger la db avant de pouvoir écrire dedans... Je regarde ce que tu as fait :)

Merci
#5
J'ai bien avancé grâce à un bon coup de pouce de Crazy

Voici le code !

Je suis toutefois bloqué sur deux points :

- pour les personnes qui tapent la commande sans pseudo, ça retourne "puthelp "NOTICE $nick :Syntaxe: !vdmkick <pseudo>"", le problème c'est que ce message est générique toutefois la commande n'est pas toujours !vdmkick

- pour la commande !vdmunban qui ne fonctionne pas


tcl
namespace eval vdmodo {
 
    # emplacement de la base de données
    variable vdmododb "/home/portgasdkiba/vdmbot/databases/vdmmoderation.db"
    variable vdmododbfail "/home/portgasdkiba/vdmbot/databases/vdmmoderationfail.db"
 
    variable vdmodochan "#viedemerde"
 
    bind pub hv|hv "!vdmkick" [namespace current]::vdmkick
    bind pub hv|hv "!vdmban"  [namespace current]::vdmban
	bind pub hv|hv "!vdmunban" [namespace current]::vdmunban
 
    proc vdmkick {nick uhost handle chan text} {
        [namespace current]::act "kick" $nick $uhost $handle $chan $text
    }
 
    proc vdmban {nick uhost handle chan text} {
        [namespace current]::act "ban" $nick $uhost $handle $chan $text
    }
 
	proc vdmunban {nick uhost handle chan text} {
		[namespace current]::act  "unban" $nick $uhost $handle $chan $text
	}
 
    proc act {action nick uhost handle chan text} {
        set text [string trim $text]
        if { [string tolower $chan] ne [string tolower $::vdmodo::vdmodochan] } {
            putlog "Script non actif sur $chan"
            puthelp "NOTICE $nick :Script non actif sur $chan !"
            return 0;
        }
        set args [split $text]
        if {$args=="" || [llength [split $args]]!=1} {
            # Oubli de la victime ?
            puthelp "NOTICE $nick :Syntaxe: !vdmkick <pseudo>"
            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 {[isvoice $victim $chan]||[ishalfop $victim $chan]||[isop $victim $chan] || (![matchattr $handle gv $chan]&&![matchattr $handle hp])} {
            if {$action == "ban"} {
                puthelp "NOTICE $nick :$victim ne peut pas être banni de $chan car il a un accès."
                [namespace current]::save 0 "$nick a essayé de bannir $victim de $chan le [strftime %D] alors qu'il a un accès."
            } else {
                puthelp "NOTICE $nick :$victim ne peut pas être kické sur $chan car il a un accès."
                [namespace current]::save 0 "$nick a essayé de kicker $victim sur $chan le [strftime %D] alors qu'il a un accès."
            }
            return 0
        }
        if {$action == "ban"} {
            newchanban $chan $victim!*@* $nick "PAN ! $victim, tu es banni 24h, ça t'apprendra !"
            [namespace current]::save 1 "$nick a utilisé la commande !vdmban sur $victim le [strftime %D]"
        }elseif {$action == "kick"} {
			putkick $chan $victim "PAN ! $victim, dans ta tronche !"
			[namespace current]::save 1 "$nick a utilisé la commande !vdmkick sur $victim le [strftime %D]"
		}elseif {$action == "unban"} {
			killchanban $chan $victim!*@*
		}
        return 0
    }
 
    # procédure de sauvegarde
    proc save {success line} {
        if { $success == 1 } {
            set file $::vdmodo::vdmododb
        } else {
            set file $::vdmodo::vdmododbfail
        }
        set fo [open $file a]
        puts $fo $line
        close $fo
    }
 
}
 
putlog "VDM Modération chargé par KiBa adapté de la version Carton.tcl de CrazyCat"

#6
Pour ton premier "souci", il suffit de corriger:

tcl
if {$args=="" || [llength [split $args]]!=1} {
            # Oubli de la victime ?
            puthelp "NOTICE $nick :Syntaxe: !vdmkick <pseudo>"
            return 0
       }

en:

tcl
if {$args=="" || [llength [split $args]]!=1} {
            # Oubli de la victime ?
            puthelp "NOTICE $nick :Syntaxe: !vdm$action <pseudo>"
            return 0
       }

Et pour le second souci, je ne sais pas si le killchanban ne se fait pas sur l'id du ban et non pas le mask. Et retirer le ban dans l'eggdrop ne signifie pas forcément le retirer du canal, il faut certainement ajouter un putserv mode -b...
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#7
Ok j'ai corrigé pour le point 1.

Pour le point 2, je viens de tester :


tcl
} elseif {$action == "unban"} {
putserv "MODE $chan -b $victim!*@*"
}


14:04 Aomine !vdmunban poulpe!*@*
14:04 VDMBot poulpe!*@* n'est pas sur #viedemerde
#8
...

Je suis sûr à environ 397% de t'avoir dit que pour le unban, il ne fallait bien sûr pas vérifier la présence de la "victime" sur le canal, vu qu'elle est bannie.
Je te laisse un peu chercher.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away


Possibly Related Threads…
Thread Author Replies Views Last Post
  [Résolu] moderation SQL aliasangelius 15 7,677 10/03/2017, 14:43
Last Post: aliasangelius
  Moderation.tcl lesny 4 5,100 03/10/2011, 16:22
Last Post: CrazyCat
  TCL de modération Julien23 12 8,499 24/04/2010, 13:27
Last Post: aliasangelius
  Moderation.tcl Behemoth 1 6,100 29/11/2009, 19:36
Last Post: fedora

Forum Jump:


Users browsing this thread: 1 Guest(s)