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 multi flag
#1
Bonjour,

Voila j'aimerais faire une liste de commandes qui reagisse en fonction des utilisateurs avec un certain flag.

J'ai essayé en faisant le code suivant, quand quelqu'un avec le flag Z tapes !commandes ca lui donne les commandes qui vont pour le flag Z mais aussi la partie de ceux qui n'ont pas de flag. Pareil pour ceux avec le flag X, mais quand un utilisateur qui n'est pas reg dans le bot ca lui donne les commandes du bot. Voici le code ce sera peut etre plus facile à comprendre.


tcl
bind pubm - *!commandes* liste
proc liste {nick host hand channel arg} {
global botnick
   if {[matchattr $nick Z]} {
   putserv "NOTICE $nick :Voici la liste des commandes ADMIN"
   putserv "NOTICE $nick :Tape !cdegene pour avoir la liste des commandes pour les ajouts/suppressions d'users/admin Ban/Unban etc..."
   putserv "NOTICE $nick :Tape !cdebl pour avoir la liste des commandes de la BlackListe"
}
   if {[matchattr $nick X]} {
   putserv "NOTICE $nick :Voici la liste des commandes OPERATEUR"
   putserv "NOTICE $nick :Tape !cdegene pour avoir la liste des commandes pour les ajouts/suppressions d'users/admin Ban/Unban etc..."
} else {
   putserv "NOTICE $nick :Voici la liste des commandes Disponibles TOUS"
   putserv "NOTICE $nick :Tape !cdejeux pour avoir la commande des jeux"
}
}


Voila donc j'aimerais que quand quelqu'un non reg dans le bot tape !commandes ca lui donne que la derniere partie.

Quelqu'un avec un flag Z ca lui donne la partie qui correspond a son flag et la derniere partie.

Et quand quelqu'un avec un flag X ca lui donne la partie su flag X et la derniere partie.

La actuellement quand ca fonctionne pas totalement bien, car quelqu'un avec un flag Z qui tape la commande ca lui donne bien la partie de son flag et sa commence a dire la premiere phrase de la derniere partie mais ca s'arrete.

Et quelqu'un avec un flag X ca lui donne que sa partie, ca ne commence meme pas la premiere phrase de la derniere partie.

Si quelqu'un a une idée.

Merci d'avance
#2
salut,

déjà tu devrais utiliser la variable $hand plutôt que $nick
par exemple:

tcl
bind pubm - *!commandes* liste
proc liste {nick host hand channel arg} {
   if [matchattr $hand Z] {
      putserv "NOTICE $nick :Voici la liste des commandes ADMIN"
      putserv "NOTICE $nick :Tape !cdegene pour avoir la liste des commandes pour les ajouts/suppressions d'users/admin Ban/Unban etc..."
      putserv "NOTICE $nick :Tape !cdebl pour avoir la liste des commandes de la BlackListe"
   }
   if [matchattr $hand X] {
      putserv "NOTICE $nick :Voici la liste des commandes OPERATEUR"
      putserv "NOTICE $nick :Tape !cdegene pour avoir la liste des commandes pour les ajouts/suppressions d'users/admin Ban/Unban etc..."
   }
   if ![validuser $hand] {
      putserv "NOTICE $nick :Voici la liste des commandes Disponibles TOUS"
      putserv "NOTICE $nick :Tape !cdejeux pour avoir la commande des jeux"
   }
}

C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#3
djkenny Wrote:salut,

déjà tu devrais utiliser la variable $hand plutôt que $nick
par exemple:

tcl
bind pubm - *!commandes* liste
proc liste {nick host hand channel arg} {
   if [matchattr $hand Z] {
      putserv "NOTICE $nick :Voici la liste des commandes ADMIN"
      putserv "NOTICE $nick :Tape !cdegene pour avoir la liste des commandes pour les ajouts/suppressions d'users/admin Ban/Unban etc..."
      putserv "NOTICE $nick :Tape !cdebl pour avoir la liste des commandes de la BlackListe"
   }
   if [matchattr $hand X] {
      putserv "NOTICE $nick :Voici la liste des commandes OPERATEUR"
      putserv "NOTICE $nick :Tape !cdegene pour avoir la liste des commandes pour les ajouts/suppressions d'users/admin Ban/Unban etc..."
   }
   if ![validuser $hand] {
      putserv "NOTICE $nick :Voici la liste des commandes Disponibles TOUS"
      putserv "NOTICE $nick :Tape !cdejeux pour avoir la commande des jeux"
   }
}

Quand un utilisateur avec le flag Z tape !commandes, ca donne bien la partie pour le flag Z mais pas la suite des commandes pour tous.Et j'ai maintenant cette erreur en PL ==> [00:52:56] Tcl error [liste]: wrong # args: no script following "!1" argument
#4
ah, je pensai (comme tu avais mis un "else") que les commandes étaient disponibles seulement pour les personnes non enregistrées
donc:

tcl
bind pubm - *!commandes* liste
proc liste {nick host hand channel arg} {
   if [matchattr $hand Z] {
      putserv "NOTICE $nick :Voici la liste des commandes ADMIN"
      putserv "NOTICE $nick :Tape !cdegene pour avoir la liste des commandes pour les ajouts/suppressions d'users/admin Ban/Unban etc..."
      putserv "NOTICE $nick :Tape !cdebl pour avoir la liste des commandes de la BlackListe"
   }
   if [matchattr $hand X] {
      putserv "NOTICE $nick :Voici la liste des commandes OPERATEUR"
      putserv "NOTICE $nick :Tape !cdegene pour avoir la liste des commandes pour les ajouts/suppressions d'users/admin Ban/Unban etc..."
   }
   putserv "NOTICE $nick :Voici la liste des commandes Disponibles TOUS"
   putserv "NOTICE $nick :Tape !cdejeux pour avoir la commande des jeux"
}

C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#5
Ce que je ferais:

tcl
bind pubm - *!commandes* liste
proc liste {nick host hand channel arg} {
   if {[matchattr $hand Z]} {
      putserv "NOTICE $nick :Voici la liste des commandes ADMIN"
      putserv "NOTICE $nick :Tape !cdegene pour avoir la liste des commandes pour les ajouts/suppressions d'users/admin Ban/Unban etc..."
      putserv "NOTICE $nick :Tape !cdebl pour avoir la liste des commandes de la BlackListe"
   }
   if {[matchattr $hand Z] || [matchattr $hand X]} {
     putserv "NOTICE $nick :Voici la liste des commandes OPERATEUR"
     putserv "NOTICE $nick :Tape !cdegene pour avoir la liste des commandes pour les ajouts/suppressions d'users/admin Ban/Unban etc..."
  }
  if {[matchattr $hand Z] || [matchattr $hand X] || [matchattr $hand Y]} {
     putserv "NOTICE $nick :Voici la liste des commandes HALFOP"
  }
  putserv "NOTICE $nick :Voici la liste des commandes Disponibles TOUS"
  putserv "NOTICE $nick :Tape !cdejeux pour avoir la commande des jeux"
}

Evidemment, il ne faut pas avoir 50 niveaux possibles sinon les "if" deviennent imbitables.
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#6
Moi j'aurait fait plutot comme ça :


tcl
bind pubm - *!commandes* liste
        proc liste {nick host hand channel arg} {
		 set commande [lindex $arg 1]
         set commande [stripcodes abcu [lindex $arg 0]]
    if {$commande == ""} {
         puthelp "privmsg $nick :Commande du Robot"
    foreach c [channels] {
    if [matchattr $hand Z $c] {
       puthelp "privmsg $nick :Voici la liste des commandes ADMIN"
       ....
       break
    }
}
    if [matchattr $hand ZX $c] {
        puthelp "privmsg $nick :Voici la liste des commandes OPERATEUR"
        ....
        break
    }
  }
}


Et j'utilise puthelp pour ce type de message puthelp et largement suffisants.
Et pour les autre level au lieu de faire :


tcl
if {[matchattr $hand Z] || [matchattr $hand X]} {


Pourquoi ?
Autant faire :


tcl
if {[matchattr $hand ZX] {


Sa fera exactement la même chose en plus court non ?
#7
alias_angelius Wrote:
tcl
if {[matchattr $hand Z] || [matchattr $hand X]} {

Pourquoi ?
Autant faire :

tcl
if {[matchattr $hand ZX]} {

Sa fera exactement la même chose en plus court non ?

Je n'en étais pas certain et j'avais la flemme de faire les tests. Sinon dans le principe, nous faisons pareil.

Concernant le puthelp ou putserv: je suis d'accord avec toi, je n'ai modifié que ce qui était important pour la compréhension (donc les if).

Par contre, je ne suis pas d'accord avec ta boucle sur les canaux, pour deux raisons:
1) au départ le script semble être pour des droits globaux, donc le canal est inutile,
2) c'est une commande en canal, donc à quoi bon aller chercher les droits sur les autres canaux ?
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#8
alias_angelius Wrote:Et pour les autre level au lieu de faire :


tcl
if {[matchattr $hand Z] || [matchattr $hand X]} {


Pourquoi ?
Autant faire :


tcl
if {[matchattr $hand ZX] {


Sa fera exactement la même chose en plus court non ?

je ne suis pas d 'accord la

tcl
if {[matchattr $hand ZX] {

équivaut à

tcl
if {[matchattr $hand Z] && [matchattr $hand X]} {

ce qui est très différent de

tcl
if {[matchattr $hand Z] || [matchattr $hand X]} {

C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#9
Ah ! Je savais que j'aurais du tester avant de répondre à alias_angelius :)
Merci djkenny :)
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#10
Mais pourquoi faire deux matchattr alors qu'un seul suffit ? ou alors j'ai pas compris le sens..

Oui pour le canal j'ai pas fait gaffe désolé CC :)
#11
djkenny Wrote:
tcl
if {[matchattr $hand ZX] {

équivaut à

tcl
if {[matchattr $hand Z] && [matchattr $hand X]} {

ce qui est très différent de

tcl
if {[matchattr $hand Z] || [matchattr $hand X]} {

alias_angelius Wrote:Mais pourquoi faire deux matchattr alors qu'un seul suffit ? ou alors j'ai pas compris le sens..

Non, ce n'est pas équivalent, c'est ce que dit djkenny. Ce que tu fais est un ET logique (il faut les deux flags) alors que l'on cherche un OU logique (l'un ou l'autre des flags).
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#12
Merci à vous CrazyCat, djkenny et alias_angelius

Pour vos réponse et votre aide.

Donc j'ai testé et celui là fonctionne tres bien


tcl
bind pubm - *!commandes* liste
proc liste {nick host hand channel arg} {
   if [matchattr $hand Z] {
      putserv "NOTICE $nick :Voici la liste des commandes ADMIN"
      putserv "NOTICE $nick :Tape !cdegene pour avoir la liste des commandes pour les ajouts/suppressions d'users/admin Ban/Unban etc..."
      putserv "NOTICE $nick :Tape !cdebl pour avoir la liste des commandes de la BlackListe"
   }
   if [matchattr $hand X] {
      putserv "NOTICE $nick :Voici la liste des commandes OPERATEUR"
      putserv "NOTICE $nick :Tape !cdegene pour avoir la liste des commandes pour les ajouts/suppressions d'users/admin Ban/Unban etc..."
   }
   putserv "NOTICE $nick :Voici la liste des commandes Disponibles TOUS"
   putserv "NOTICE $nick :Tape !cdejeux pour avoir la commande des jeux"
}


Merci encore.

SUJET RESOLU
#13
Heu, j'ai un gros doute sur la résolution.
Un admin (+Z) voit les commandes admin et operateur ? Ou bien il a les flags +Z et +X ?
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#14
non s'il donne que le flag +Z il ne verra pas les commande ayant le flag +X.
Sauf si il fesait comme j'avait dit mettre ZX... la les admins vois les commandes Opérateur aussi.
#15
Non un admin flag Z vois la partie des commandes ADMIN et la partie pour tous, pas la partie
du flag X.

C'est donc bien ce que je voulais.


Possibly Related Threads…
Thread Author Replies Views Last Post
  [Tutorial] La programmation multi-thread avec Tcl Merwin 3 9,743 20/06/2012, 21:29
Last Post: CrazyCat
  Flag dans un bnd join.. aliasangelius 9 4,777 24/04/2012, 15:30
Last Post: aliasangelius

Forum Jump:


Users browsing this thread: 1 Guest(s)