action non déclarer.
#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


Messages dans ce sujet
action non déclarer. - par aliasangelius - 30/10/2011, 12:05
RE: action non déclarer. - par djkenny - 30/10/2011, 12:52
RE: action non déclarer. - par aliasangelius - 30/10/2011, 14:05
RE: action non déclarer. - par aliasangelius - 30/10/2011, 14:23
RE: action non déclarer. - par djkenny - 30/10/2011, 14:32
RE: action non déclarer. - par aliasangelius - 30/10/2011, 14:45
RE: action non déclarer. - par djkenny - 30/10/2011, 18:51
RE: action non déclarer. - par aliasangelius - 31/10/2011, 11:27
RE: action non déclarer. - par djkenny - 31/10/2011, 14:36
RE: action non déclarer. - par djkenny - 31/10/2011, 14:40
RE: action non déclarer. - par aliasangelius - 31/10/2011, 14:44
RE: action non déclarer. - par djkenny - 31/10/2011, 14:46
RE: action non déclarer. - par aliasangelius - 31/10/2011, 15:27
RE: action non déclarer. - par djkenny - 31/10/2011, 17:55
RE: action non déclarer. - par djkenny - 31/10/2011, 18:05
RE: action non déclarer. - par aliasangelius - 31/10/2011, 19:05
RE: action non déclarer. - par djkenny - 31/10/2011, 22:04
RE: action non déclarer. - par aliasangelius - 31/10/2011, 22:17
RE: action non déclarer. - par djkenny - 31/10/2011, 22:39
RE: action non déclarer. - par DnS - 31/10/2011, 22:44
RE: action non déclarer. - par djkenny - 31/10/2011, 22:47
RE: action non déclarer. - par DnS - 31/10/2011, 22:55
RE: action non déclarer. - par aliasangelius - 31/10/2011, 22:59

Atteindre :


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