action non déclarer.
#1
Bonjour,

Voilà j'ai commencé à reprendre le code de progfile de Pooshy mais il se trouve que lorsque je fais appel à $action il me dit no such variable..

Hors j'ai essayé de mettre variable action et ça na rien donnais.

Pourtant dans ma procédure action et bien dedans je ne comprends pas..
Si quelqu'un à une idée..
Voici le code.

TCL
proc fepo {nick action arg} {
        set arg [charfilter $arg]
        set fa [open "$basedir/$autorise(fichier)" a+]
        seek $fa 0
        while {![eof $fa]} {
             set get [gets $fa]
             if {[string equal [string tolower $get] [string tolower $nick]]==1} {
             }
        }
        close $fa
        return 0
    }
    if {$action=="ajout"} {
        if {$r!=""} {
            puts $fa $r
        } else {
            puts $fa $arg
        }
            return 1
    }
    if {$action=="sup"} {
        if {$r!=""} {
            if {![string match -nocase $arg [lindex $fa 0]] && ![string match -nocase $arg [lindex $fa 1]]} {
                puts $fa $r
            } else {
                return 1
            }
        }
    }
    if {$action=="join"} {
        if {$r!=""} {
            puts $fa $r
            if [string match -nocase [lindex $fa 0] $arg] {
                return 1
            }
        }
        close $fa
    }


Répondre Avertir
#2
en fait ta proc se termine la
TCL
proc fepo {nick action arg} {
   set arg [charfilter $arg]
   set fa [open "$basedir/$autorise(fichier)" a+]
   seek $fa 0
   while {![eof $fa]} {
      set get [gets $fa]
      if {[string equal [string tolower $get] [string tolower $nick]]==1} {
      }
   }
   close $fa
   return 0
}


C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir
#3
En faite je ferme la procédure alors que je devrais le faire que à la fin.

je vais tester ça voir merci d'avance Smile
Répondre Avertir
#4
J'ai donc modifié par :

TCL
proc fepo {nick action arg} {
        set arg [charfilter $arg]
        set fa [open "$basedir/$autorise(fichier)" a+]
        seek $fa 0
        while {![eof $fa]} {
             set get [gets $fa]
             if {[string equal [string tolower $get] [string tolower $nick]]==1} {
             }
        }
    }
    if {$action=="ajout"} {
        if {$r!=""} {
            puts $fa $r
        } else {
            puts $fa $arg
        }
            return 1
    }
    if {$action=="sup"} {
        if {$r!=""} {
            if {![string match -nocase $arg [lindex $fa 0]] && ![string match -nocase $arg [lindex $fa 1]]} {
                puts $fa $r
            } else {
                return 1
            }
        }
    }
    if {$action=="join"} {
        if {$r!=""} {
            puts $fa $r
            if [string match -nocase [lindex $fa 0] $arg] {
                return 1
            }
        }
        close $fa
    }




et lorsque je fait .compile ...tcl j'ai toujours l'erreur :

Citation :[13:18:36] (alias_angelius) .compile autorise.tcl
[13:18:36] <Talk-Me> [13:18:45] Compilation De : autorise.tcl...
[13:18:36] <Talk-Me> [13:18:45] can't read "action": no such variable
[13:18:36] <Talk-Me> [13:18:45] while executing
[13:18:36] <Talk-Me> [13:18:45] "if {$action=="ajout"} {
[13:18:36] <Talk-Me> [13:18:45] if {$r!=""} {
[13:18:36] <Talk-Me> [13:18:45] puts $fa $r
[13:18:36] <Talk-Me> [13:18:45] } else {
[13:18:36] <Talk-Me> [13:18:45] puts $fa $arg
[13:18:36] <Talk-Me> [13:18:45] }
[13:18:36] <Talk-Me> [13:18:45] return 1
[13:18:37] <Talk-Me> [13:18:45] }"
[13:18:37] <Talk-Me> [13:18:45] (in namespace eval "::autorise" script line 72)
[13:18:37] <Talk-Me> [13:18:45] invoked from within
[13:18:37] <Talk-Me> [13:18:45] "namespace eval ::autorise {
[13:18:37] <Talk-Me> [13:18:45] package require msgcat
[13:18:37] <Talk-Me> [13:18:45] package require Tcl 8.5
[13:18:37] <Talk-Me> [13:18:45] # Salon back/ou salon ou ont désire mettre une autorisation.
[13:18:37] <Talk-Me> [13:18:45] ..."
[13:18:37] <Talk-Me> [13:18:45] (file "scripts/autorise.tcl" line 25)
[13:18:37] <Talk-Me> [13:18:45] invoked from within
[13:18:37] <Talk-Me> [13:18:45] "source scripts/autorise.tcl"
[13:18:37] <Talk-Me> [13:18:45] ("uplevel" body line 1)
[13:18:37] <Talk-Me> [13:18:45] invoked from within
[13:18:37] <Talk-Me> [13:18:45] "uplevel #0 [list source scripts/$args] "
Répondre Avertir
#5
toujours pareil,
tu ferme la proc avec
TCL
if {$action=="ajout"} {


C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir
#6
ouep j'ai donc fait :

TCL
proc fepo {nick action arg} {
        set arg [charfilter $arg]
        set fa [open "$basedir/$autorise(fichier)" a+]
        seek $fa 0
        while {![eof $fa]} {
             set get [gets $fa]
             if {[string equal [string tolower $get] [string tolower $nick]]==1} {
             }
        }
    if {$action=="ajout"} {
        if {$r!=""} {
            puts $fa $r
        } else {
            puts $fa $arg
        }
            return 1
    }
    if {$action=="sup"} {
        if {$r!=""} {
            if {![string match -nocase $arg [lindex $fa 0]] && ![string match -nocase $arg [lindex $fa 1]]} {
                puts $fa $r
            } else {
                return 1
            }
        }
    }
    if {$action=="join"} {
        if {$r!=""} {
            puts $fa $r
            if [string match -nocase [lindex $fa 0] $arg] {
                return 1
            }
        }
        close $fa
    }
}



Merci Smile

Me reste plus que à voir le soucis pourquoi pour add sa merde avec le bind
Répondre Avertir
#7
par contre ton fichier n'est jamais fermé et la variable r n'existe pas
C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir
#8
Oui, en faite j'ai oublié de mettre :

TCL
set r [gets $fa]



Mais même en faisant comme ça depuis les modifications les commandes ne fonctionnent plus
Répondre Avertir
#9
lis la doc de open tu trouveras la solution
C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir
#10
tu peux aussi regarder la doc de seek
(indice: c'est un problème de position dans le fichier)

édit: il me semble qu'il y ai aussi un problème dans la boucle
C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir
#11
Ouep façon toutes la proc et pas bonne.. et sa fait merder les procédures d'appel
Répondre Avertir
#12
pourquoi tu cherches absolument à accéder au fichier à chaque fois ?
C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir
#13
comment ça ?
Répondre Avertir
#14
ba, à chaque modification, t'ouvres le fichier en lecture, tu charges les données dans une variable, tu modifies la variable, (normalement tu refermes le fichier et tu le ré-ouvres en écriture), tu inscrits la valeur de la variable dans le fichier et tu fermes le tout ...
bref ça fait beaucoup de chose pour pas grand chose.

ma solution:
- au chargement du tcl tu charges le fichier dans ta variable (un seul chargement à la place d'un chargement a chaque appel de la procédure)
- dans la procédure tu modifies la variable
- et enfin avec un bind evnt save (sauvegarde des fichiers de l eggdrop une foi par heure) tu sauvegardes les données de ta variable dans le fichier

avantage:
- moins d'interactions avec le fichier
- la procédure s’exécute plus rapidement
- simplicité de codage puisque tu n'as plus à t'occuper de l ouverture/fermeture du fichier, par exemple dans le cas ou tu fais une procédure pour récupérer une liste des pseudos autorisés, il te suffis de faire un foreach sur la variable.

exemple: (pour reprendre le code que je t'avais filé l'autre jour)
TCL
namespace eval autorise {
variable salons "#test"
variable data
variable file [file join scripts autorised.db]

# on vérifie si le fichier existe, sinon on le crée  
  if ![file exists $file] {
    catch {open $file w+} p
    catch {close $p}
  }
# on reset la valeur de data qui contiendra la contenue du fichier db 
#(utile pour les rehash)
  set data ""
# on charge le contenue du fichier dans la variable data
  catch {open $file r} p
  while {![eof $p]} {
    if {[gets $p d]!=""} {lappend data $d}
  }
  catch {close $p}
  unset p
 
# le bind qui servira a sauvegarder toutes les heures
  bind evnt - save autorise::save_file

# la procédure qui va avec et qui sauvegarde le contenue de $data dans le fichier
  proc save_file {type} {
   variable data
   variable file
    if {$data==""} return
    catch {open $file w+} p
    foreach d $data {
      if {$d!=""} {puts $p [join $d]}
    }
    catch {close $p}
    putlog "Sauvegarde du fichier autorised.db"
  }
 
.....

# le bind pub pour ajouter une personne
  bind pub - .+autorise autorise::add
 
  proc add {nick host hand chan arg} {
#on déclare la variable data qui contient les données
   variable data
   variable salons
    if {[lsearch -nocase $salons $chan]==-1} return
    if {[llength $arg]!=1} {puthelp "NOTICE $nick :syntaxe: .+autorise <pseudo>";return}

# comme dit plus haut un simple foreach sur $data et on test (stgcomp = string equal -nocase)
    foreach d $data {
      if {[stgcomp [lindex $d 0] $chan] && [stgcomp [lindex $d 1] $arg]} {
        putserv "NOTICE $nick :ce pseudo est déjà autorisé sur $chan."
        return
      }
    }
# et ici on ajoute les données avec un simple lappend
    lappend data [string tolower "$chan $arg"]
    putserv "NOTICE $nick :$arg est a été ajouté sur $chan."
  }
 
....


C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir
#15
en cas de rehash/restart/die etc... le fichier sera sauvegardé automatiquement avant l'action, donc pas de pertes de données Smile
C'est en reconnaissant ses erreurs que l'on progresse Wink
Répondre Avertir


Atteindre :


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