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

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 Smile
Répondre Avertir
#2
Un petit up please ? Smile
Répondre Avertir
#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
Répondre
#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 Smile

Merci
Répondre Avertir
#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"


Répondre Avertir
#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...
Répondre
#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
Répondre Avertir
#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.
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté