[Demande] Soucis sur bind mode
#1
Bonjour,

Voilà, j'ai repris le code de Fedora, pour faire un système de auth avec un op sur un IriX.
Donc le code fonctionne lorsqu'il doit se auth, et se op sans soucis.

Le problème et lors du bind mode.
Je m'explique..

Si je deop le bot, il va exécuté la commande de ré-op deux fois dessuite.
Pareil si je me deop moi même, il va se ré-op alors que je ne l'ai pas fait..

Exemple :

Citation :.[11:18:24] [DéOp] Tu viens de déoper Talk-Me.
.[11:18:24] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[11:18:26] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[11:18:27] [DéOp] Tu viens de te faire déoper par IriX.
.[11:18:27] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[11:18:35] [Voice] IriX vient de voicer (mode +v) Talk-Me.

Lorsque je me deop.. :

Citation :.[11:19:23] [DéOp] Tu viens de te déoper.
.[11:19:23] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[11:19:24] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[11:19:24] [DéOp] Tu viens de te faire déoper par IriX.
.[11:19:25] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[11:19:28] [Voice] IriX vient de voicer (mode +v) Talk-Me.

Donc j'ai tester des ligne du genre $nick == $botnick, ou botisop.. Mais rien ne fonctionne, ou alors j'ai mal interprêter une variable ou autre.
Voici le code :

tcl
namespace eval ::Opirix {
 
    setudef flag SalonOp
 
    set IriXPseudo "IriX"
    set IriXsal "#informatique"
    set IriXpass "passsdeouf"
 
    bind join - "*" [namespace current]::autoop
    proc autoop { nick uhost hand chan args} {
        if {$nick != $::botnick} {
            return 0
        }
        set idt [lsearch $::Opirix::IriXsal [string tolower $chan]]
        if { $idt eq -1 } {
            return 0
        } else {
            putspeed "PRIVMSG [lindex $::Opirix::IriXPseudo $idt] :auth $::Opirix::IriXsal $::botnick $::Opirix::IriXpass"
            putserv "PRIVMSG [lindex $::Opirix::IriXPseudo $idt] :op $::Opirix::IriXsal $::botnick"
            putserv "PRIVMSG [lindex $::Opirix::IriXPseudo $idt] :voice $::Opirix::IriXsal $::botnick"
        }
    }
 
    proc ::Opirix::whoisIriX {chan} {
        set nicks [chanlist $chan]
        return [string tolower [lsearch -nocase -inline $nicks IriX*]]
    }
 
    proc putspeed {arg} {
   putquick "$arg"
    }
 
    bind mode - *-o* [namespace current]::ReOp
    proc ReOp {nick host hand chan args} {
        set bot [::Opirix::whoisIriX $chan]
        if {($bot ne "") && [channel get $chan SalonOp]} {
            putquick "PRIVMSG $bot :op $::Opirix::IriXsal $::botnick"
            putserv "PRIVMSG $bot :voice $::Opirix::IriXsal $::botnick"
            putserv "PRIVMSG $bot :deop $::Opirix::IriXsal $nick"
            } else {
                putlog "\002\00304\[Refuser\]\002\00314 Je ne suis pas activé sur $chan"
            return 0
            }
    }
 
    #bind time -|- {* * * * *} [namespace current]::VervifbOt
    #proc VervifbOt {min hour args} {
     #   foreach chan [channels] {
      #      if {[channel get $chan SalonOp]} {
       #         set bot [::Opirix::whoisIriX $chan]
        #        if {$bot ne ""} {
         #           putquick "PRIVMSG $bot :op $::Opirix::IriXsal $::botnick"
          #          putserv "PRIVMSG $bot :voice $::Opirix::IriXsal $::botnick"
           #         return 0
            #    }
           # }
       # }
   # }
}



Si vous avez des pistes vers ou ça peut venir.., même m'aider à me mettre vers la vois je suis preneur.
  Répondre   Avertir
#2
Tout d'abord, que fait la fonction whoisIriX ? Elle retourne le nick du service Irix ?
Donc là, si je comprends ta procédure:
lors d'un déop, si un "irix" a été défini et que le canal a le flag SalonOp, ton eggdrop demande à Irix de mettre +ov sur l'eggdrop et -o sur celui qui a déoppé quelqu'un.
Donc comme Irix déop, ton eggdrop relance la procédure. Heureusement pour toi que Irix ne peut pas se déopper sinon tu aurais une boucle sans fin.

Tu devrais vérifier qui est la victime du déop, non ?
  Répondre   Avertir
#3
En faite sa vérifie plutôt si IriX et présent sur le canal, d'ou le chanlist.

Après je veux juste que si "untel" deop "eggdrop" il se ré-op.
Hors à l'heure actuel comme l'exemple montré plus haut, si une personne se deop elle même, eggdrop se ré-op alors que le déop ne fût pas sur lui même..

Et c'est sur ça que je bloque, la vérification pour que ça ne prenne en compte que "eggdrop" Donc si ont le deop il agit, sinon il fait rien.
  Répondre   Avertir
#4
Regarde ce que tu as dans $args, je suis à peu près certain que la cible du mode y est...

Le premier réflexe à avoir quand on manipule un bind, c'est de voir ce qu'il envoie. putlog is your friend :
  Répondre   Avertir
#5
Le putlog du $args me retourne ceci lorsque je déop le bot :

Citation :.[12:56:09] <Talk-Me> [12:56:09] -o Talk-Me
.[12:56:13] <Talk-Me> [12:56:13] -o alias_angelius

Et lorsque je me déop moi même sa me retourne ceci :

Citation :.[12:56:13] <Talk-Me> [12:56:13] -o alias_angelius
.[12:57:57] <Talk-Me> [12:57:58] -o alias_angelius
.[12:57:59] <Talk-Me> [12:58:00] -o alias_angelius

Test avec les putlog :

Citation :.[13:05:32] <Talk-Me> [13:05:34] l'eggdrop se op : irix #informatique Talk-Me
.[13:05:32] <Talk-Me> [13:05:34] l'eggdrop se voice : irix #informatique Talk-Me
.[13:05:32] <Talk-Me> [13:05:34] l'eggdrop déop la personne qui la déop : #informatique alias_angelius
.[13:05:35] <Talk-Me> [13:05:38] l'eggdrop se op : irix #informatique Talk-Me
.[13:05:35] <Talk-Me> [13:05:38] l'eggdrop se voice : irix #informatique Talk-Me
.[13:05:35] <Talk-Me> [13:05:38] l'eggdrop déop la personne qui la déop : #informatique IriX

Lorsque je me déop putlog :

Citation :.[13:06:39] <Talk-Me> [13:06:42] l'eggdrop se op : irix #informatique Talk-Me
.[13:06:39] <Talk-Me> [13:06:42] l'eggdrop se voice : irix #informatique Talk-Me
.[13:06:39] <Talk-Me> [13:06:42] l'eggdrop déop la personne qui la déop : #informatique alias_angelius
.[13:06:40] <Talk-Me> [13:06:43] l'eggdrop se op : irix #informatique Talk-Me
.[13:06:40] <Talk-Me> [13:06:43] l'eggdrop se voice : irix #informatique Talk-Me
.[13:06:40] <Talk-Me> [13:06:43] l'eggdrop déop la personne qui la déop : #informatique IriX

Les putlog :

tcl
bind mode - *-o* [namespace current]::ReOp
    proc ReOp {nick host hand chan args} {
        set bot [::Opirix::whoisIriX $chan]
        if {($bot ne "") && [channel get $chan SalonOp]} {
            putquick "PRIVMSG $bot :op $::Opirix::IriXsal $::botnick"
            putlog "l'eggdrop se op : $bot $::Opirix::IriXsal $::botnick"
            putserv "PRIVMSG $bot :voice $::Opirix::IriXsal $::botnick"
            putlog "l'eggdrop se voice : $bot $::Opirix::IriXsal $::botnick"
            putserv "PRIVMSG $bot :deop $::Opirix::IriXsal $nick"
            putlog "l'eggdrop déop la personne qui la déop : $::Opirix::IriXsal $nick"
            } else {
                putlog "\002\00304\[Refuser\]\002\00314 Je ne suis pas activé sur $chan"
            return 0
            }
    }


  Répondre   Avertir
#6
Donc tu as tous les éléments...
Si $nick n'est pas IriX ni ton eggdrop
ET si la victime ([lindex $args 1]) est ton eggdrop
Alors tu sanctionnes $nick

Je ne vois même pas la complexité du truc
  Répondre   Avertir
#7
Si je "[lindex $args 1]", alors je me retrouve avec une bataille navale de op/deop non stop.

Ce qui fait comme une boucle, ce que je ne comprend pas.

Et je me demande pourquoi il exécute plusieurs fois la demande.., Je crois que j'ai du mal sur la compréhension du système.

Si je résume bien.. : $nick et la personne qui déop l'eggdrop.
Je whoisirix qui liste le salon pour vérifié si IriX et présent sur canal.
Arrivée là : je vérifie si le tcl et active, si oui ont passe.

Et c'est après qu'il me sort les doubles op..
Et ceux aussi bien lorsqu'ont le déop, ou quelqu'un se déop lui même.
  Répondre   Avertir
#8
Et si tu montrais ta procédure actuelle ?
  Répondre   Avertir
#9
tcl
bind mode - *-o* [namespace current]::ReOp
    proc ReOp {nick host hand chan args} {
        set bot [::Opirix::whoisIriX $chan]
        if {($bot ne "") && [channel get $chan SalonOp]} {
            putquick "PRIVMSG $bot :op $::Opirix::IriXsal $::botnick"
            putlog "l'eggdrop se op : $bot $::Opirix::IriXsal $::botnick"
            putserv "PRIVMSG $bot :voice $::Opirix::IriXsal $::botnick"
            putlog "l'eggdrop se voice : $bot $::Opirix::IriXsal $::botnick"
            putserv "PRIVMSG $bot :deop $::Opirix::IriXsal $nick"
            putlog "l'eggdrop déop la personne qui la déop : $::Opirix::IriXsal $nick"
            } else {
                putlog "\002\00304\[Refuser\]\002\00314 Je ne suis pas activé sur $chan"
            return 0
            }
    }


  Répondre   Avertir
#10
Et où sont les contrôles que je te dis de faire:
(21/01/2017, 14:40)CrazyCat a écrit : Donc tu as tous les éléments...
Si $nick n'est pas IriX ni ton eggdrop
ET si la victime ([lindex $args 1]) est ton eggdrop
Alors tu sanctionnes $nick


Je ne vois même pas la complexité du truc
  Répondre   Avertir
#11
Premier test :

tcl
bind mode - *-o* [namespace current]::ReOp
    proc ReOp {nick host hand chan args} {
        set bot [::Opirix::whoisIriX $chan]
        set nick [lindex $args 1]
        if {($bot ne "") && [channel get $chan SalonOp]} {
            putquick "PRIVMSG $bot :op $::Opirix::IriXsal $::botnick"
            putlog "l'eggdrop se op : $bot $::Opirix::IriXsal $::botnick"
            putserv "PRIVMSG $bot :voice $::Opirix::IriXsal $::botnick"
            putlog "l'eggdrop se voice : $bot $::Opirix::IriXsal $::botnick"
            putserv "PRIVMSG $bot :deop $::Opirix::IriXsal $nick"
            putlog "l'eggdrop déop la personne qui la déop : $::Opirix::IriXsal $nick"
            } else {
                putlog "\002\00304\[Refuser\]\002\00314 Je ne suis pas activé sur $chan"
            return 0
            }
    }



Ce qui donne comme résultat sur un deop :

Citation :.[16:47:16] [DéOp] Tu viens de déoper Talk-Me.
.[16:47:17] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:47:17] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:47:17] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:47:17] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:47:25] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:47:26] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:47:27] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:47:33] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:47:35] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:47:35] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:47:40] <undefinedBluE> même pas peur !
.[16:47:41] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:47:43] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:47:43] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:47:48] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:47:50] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:47:51] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:47:56] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:47:59] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:47:59] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:48:05] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:48:07] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:48:07] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:48:12] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:48:14] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:48:14] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:48:20] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:48:22] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:48:22] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:48:28] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:48:31] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:48:31] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:48:31] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:48:32] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:48:40] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:48:43] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:48:43] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:48:45] <Yes_[Mode_Zen]> alias_angelius il flood
.[16:48:49] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:48:51] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:48:51] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:48:56] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:48:58] [DéOp] IriX vient de déoper (mode -o) Talk-Me .
.[16:48:58] [Op] IriX vient d'oper (mode +o) Talk-Me.

Second test :

tcl
bind mode - *-o* [namespace current]::ReOp
    proc ReOp {nick host hand chan args} {
        set bot [::Opirix::whoisIriX $chan]
        #set nick [lindex $args 1]
        if {($bot ne "") && [channel get $chan SalonOp]} {
            putquick "PRIVMSG $bot :op $::Opirix::IriXsal $::botnick"
            putlog "l'eggdrop se op : $bot $::Opirix::IriXsal $::botnick"
            putserv "PRIVMSG $bot :voice $::Opirix::IriXsal $::botnick"
            putlog "l'eggdrop se voice : $bot $::Opirix::IriXsal $::botnick"
            putserv "PRIVMSG $bot :deop $::Opirix::IriXsal $nick"
            putlog "l'eggdrop déop la personne qui la déop : $::Opirix::IriXsal [lindex $args 1]"
            } else {
                putlog "\002\00304\[Refuser\]\002\00314 Je ne suis pas activé sur $chan"
            return 0
            }
    }



Ce qui donne :

Citation :.[16:52:54] [DéOp] Tu viens de déoper Talk-Me.
.[16:52:55] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:52:56] [Voice] IriX vient de voicer (mode +v) Talk-Me.
.[16:52:59] [DéOp] Tu viens de te faire déoper par IriX.
.[16:52:59] [Op] IriX vient d'oper (mode +o) Talk-Me.
.[16:53:06] [Voice] IriX vient de voicer (mode +v) Talk-Me.
  Répondre   Avertir
#12
Déjà, tu écrases $nick, forcément que ça plante.
Il manque les conditions de sortie (celles où tu ne veux pas que l'eggdrop agisse).

Voila ce qui devrait fonctionner, il suffit de réfléchir 2 secondes pour y arriver....
tcl
proc ReOp {nick host hand chan args} {
   # La, on détermine qui est IriX
   set bot [::Opirix::whoisIriX $chan]
   # ici, on détermine la VICTIME, il faut pas changer nick (celui qui pose le mode)
   set victim [lindex $args 1]
   # Si celui qui deop est irix ou ton eggdrop, on ne fait rien, on sort de la procédure
   if { $nick == $bot || $nick == $botnick } { return 0 }
   # Si la victime n'est pas ton eggdrop, on sort aussi
   if { $victim != $botnick } { return 0 }
   ### maintenant tu peux continuer
   if {($bot ne "") && [channel get $chan SalonOp]} {
      putquick "PRIVMSG $bot :op $::Opirix::IriXsal $::botnick"
      putlog "l'eggdrop se op : $bot $::Opirix::IriXsal $::botnick"
      putserv "PRIVMSG $bot :voice $::Opirix::IriXsal $::botnick"
      putlog "l'eggdrop se voice : $bot $::Opirix::IriXsal $::botnick"
      putserv "PRIVMSG $bot :deop $::Opirix::IriXsal $nick"
      putlog "l'eggdrop déop la personne qui la déop : $::Opirix::IriXsal $victim"
   } else {
      putlog "\002\00304\[Refusé\]\002\00314 Je ne suis pas activé sur $chan"
      return 0
   }
}


  Répondre   Avertir
#13
D'accord, oui en effet j'inverser certains points..

Expliquer comme ça oui c'est mieux. Merci pour ton exemple Crazy Smile
  Répondre   Avertir


Sujets apparemment similaires...
Sujet Auteur Réponses Affichages Dernier message
  [Résolu] bug sur un bind mode Alucard`68 9 2,185 01/02/2017, 15:18
Dernier message: Alucard`68
  soucis sur un bind join. aliasangelius 18 5,062 23/10/2011, 13:16
Dernier message: CrazyCat
  Soucis tcl - bind join Meribre 4 3,066 23/03/2010, 11:55
Dernier message: heretoc
  Problème avec un script TCL (bind mode) Lyokomaster 3 2,875 15/03/2009, 18:05
Dernier message: Merwin

Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)