Aide pour un script... simple ?
#1
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é* :(
Répondre Avertir
#2
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?
Répondre Avertir
#3
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. :(
Répondre Avertir
#4
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
Répondre
#5
Merci CrazyCat mais le script ne fonctionne pas chez moi. :(

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.
Répondre Avertir
#6
en accord avec la ligne :
tcl
set newlines [list [lrange $data $::memnb end]]


remplace :
tcl
foreach line $newline {


par :
tcl
foreach line $newlines {


Répondre Avertir
#7
bonsoir

essaye en remplacent

tcl
foreach line $newline  {


par
tcl
foreach line $newlines  {


Répondre Avertir
#8
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 ?
Répondre Avertir
#9
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"
Répondre


Atteindre :


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