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


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
    }

#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 ;)
Away
#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 :)
#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 :

Quote:[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] "
#5
toujours pareil,
tu ferme la proc avec
tcl
if {$action=="ajout"} {

C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#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 :)

Me reste plus que à voir le soucis pourquoi pour add sa merde avec le bind
#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 ;)
Away
#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
#9
lis la doc de open tu trouveras la solution
C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#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 ;)
Away
#11
Ouep façon toutes la proc et pas bonne.. et sa fait merder les procédures d'appel
#12
pourquoi tu cherches absolument à accéder au fichier à chaque fois ?
C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#13
comment ça ?
#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 ;)
Away
#15
en cas de rehash/restart/die etc... le fichier sera sauvegardé automatiquement avant l'action, donc pas de pertes de données :)
C'est en reconnaissant ses erreurs que l'on progresse ;)
Away


Possibly Related Threads…
Thread Author Replies Views Last Post
Question Action sur pseudo KeeViiNou 4 1,297 30/08/2020, 21:42
Last Post: aliasangelius
  Activation Action Replier dsa 5 3,530 28/11/2017, 19:27
Last Post: dsa
  Déclarer $nick dans msgcat. aliasangelius 5 4,919 04/09/2012, 16:27
Last Post: CrazyCat

Forum Jump:


Users browsing this thread: 1 Guest(s)