Communauté Eggdrop
Aide pour un script... simple ? - Version imprimable

+- Communauté Eggdrop (https://forum.eggdrop.fr)
+-- Forum : Eggdrop et TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=8)
+--- Forum : Scripts TCL (https://forum.eggdrop.fr/forumdisplay.php?fid=4)
+--- Sujet : Aide pour un script... simple ? (/showthread.php?tid=717)



Aide pour un script... simple ? - akya - 10/07/2010

Coucou !

Après moulte recherche sur le net à la recherche d'un petit script sans résultat, j'en viens à votre aide.

Je recherche donc un moyens d'afficher sur 1 chan le résultat de 1 fichier texte. Mais le bot doit afficher uniquement LA / LES nouvelles entrées !

exemple du fichier du texte.txt :
texte.txt a écrit :[...]
Allooo~
Salut

Maintenant si j'ajoute la ligne "Bonjour" le bot va détecter cette nouvelle ligne et l'afficher sur le chan. Sans afficher l'ancien texte Alloo~ et Salut :

texte.txt a écrit :[...]
Allooo~
Salut
Bonjour

Résultat :
Citation :<Eggdrop> Bonjour

Pour résumer, le bot va donc lire le fichier toutes les xx secondes pour vérifier si oui ou non de nouvelles lignes ont été ajoutées et donc afficher si oui ou non les lignes en question sur le channel.

Si quelqu'un veut bien venir à mon secours... *désespéré* Sad


RE: Aide pour un script... simple ? - Artix - 14/07/2010

Si les lignes restent toujours dans le même ordre et ne sont pas identiques ça devrait être plutôt simple: il suffit alors de lire le fichier, et un backup fait plus tôt, ligne à ligne et comparer le contenu des deux.
Si les lignes sont identiques, on continue,
et si les lignes sont différentes, on l'affiche celle du fichier de base & on passe à la suivante.
Ca devrait pouvoir se faire simplement en C ou en TCL

Le pb par contre serait que par exemple si à un moment on venait à changer l'ordre des lignes, l'eggdrop risque de relire toutes les lignes....

Quelle serait l'utilisation pratique du script?


RE: Aide pour un script... simple ? - akya - 15/07/2010

Bonsoir,

Tout d'abord merci de porter ton attention à ce sujet Artix,

Alors pour être plus explicite, le but est de lire un petit fichier de journalisation (log) toutes les 10 minutes et donc d'afficher le résultat sur un seul chan automatiquement. ^^

J'ai peut être trouvé une piste sur un vieux topic egghelp. Mais j'avoue ne pas comprendre grand chose au TCL, j'ai donc modifié à peu prêt comme je pouvais mais ça ne marche pas vraiment.

tcl
# Rls: track_list.v1.0.tcl
# Date: 19/06/10
# Coded by: SaNcTuM
# Contact: #a.b.inner-sanctum@EFNET
###################################
 
bind PUB - -tlist SaNcTuM_tracks
 
set track_list "/home/user/test"
 
proc SaNcTuM_tracks {nick uhost hand chan text} {
    set number [lindex [split $text] 0]
    set filename ${::track_list}/${number}.log
    if {![file exists $filename]} {
        putquick "NOTICE $nick :log file not found."
        return
    }
 
    set tracks [open $filename]
    set data [split [read -nonewline $tracks] \n]
    close $tracks
    foreach log_info $data {
        putquick "NOTICE $nick :\00315$log_info"
    }
 }
 
putlog "log_list.v1.0 LOADED"



J'ai cherché sur plusieurs forums et sites de scripts TCL, et je n'ai rien trouvé d'autre. Sad


RE: Aide pour un script... simple ? - CrazyCat - 15/07/2010

S'il s'agit d'un fichier de log, les lignes sont toujours dans le même ordre et le nombre est uniquement croissant (en fonctionnement normal).
Le moyen le plus simple pourrait être de mémoriser le nombre de lignes et à chaque lecture du fichier de comparer le nouveau nombre. S'il est supérieur au précédent, on affiche les nouvelles lignes.
tcl
set memnb 0
set logfile "/path/to/file"
bind pub - !saylog log:say
proc log:say { nick uhost handle chan args } {
   set fp [open $::logfile]
   set data [split [read -nonewline $fp] /n]
   close $fp
   if { [llength $data] > $::memnb } {
      set newlines [list [lrange $data $::memnb end]]
      foreach line $newline {
         putserv "PRIVMSG $chan :$line"
      }
      set $::memnb [llength $data]
   }
   return 1
}


Attention: le /n est en fait \n


RE: Aide pour un script... simple ? - akya - 15/07/2010

Merci CrazyCat mais le script ne fonctionne pas chez moi. Sad

J'ai l'erreur en PL lorsque je tape !saylog :
Citation :Tcl error [log:say]: can't read "newline": no such variable

EDIT : J'utilise TCL 8.5, je sais pas si c'est à cause de ça.


RE: Aide pour un script... simple ? - MenzAgitat - 15/07/2010

en accord avec la ligne :
tcl
set newlines [list [lrange $data $::memnb end]]


remplace :
tcl
foreach line $newline {


par :
tcl
foreach line $newlines {





RE: Aide pour un script... simple ? - fedora - 15/07/2010

bonsoir

essaye en remplacent

tcl
foreach line $newline  {


par
tcl
foreach line $newlines  {





RE: Aide pour un script... simple ? - akya - 15/07/2010

Ca marche !

Rolalala... Comment ai-je pu louper un truc pareil... :/

Est-ce possible de rajouter un timer (5min) pour que le eggdrop vérifie les nouvelles lignes et les affiches automatiquement sur 1 seul chan ?


RE: Aide pour un script... simple ? - CrazyCat - 15/07/2010

Au lieu de faire un bind pub, utilises un bind time.
Si je préconise ça, c'est parce que bientôt eggdrop gèrera le bind CRON où tu pourras utiliser : "*/5 * * * *" pour dire "toutes les 5 minutes"