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


Log connexions
#1
Bonjour,

J'avais pris un code TCL qui a été posté sur le Forum, et qu'il ne fonctionnait pas, alors j'ai du modifier quelque lignes dans le code pour le faire débuger. Le code sert à historiser les connexions entrantes sur le serveur IRC, et les enregistrer dans un fichier "connects.db", et j'aimerais ajouter une nouvelle fonctionnalité qui servira à retourer via l'adresse IP les pseudo qui ont été passés sous cette adresse, et vis-versa via un pseudo çà me retourne les adresse qui ont été utilisées par le pseudo en question.

Exemple:

Code:
<Good>!connect bob
<Bot>Connection de bob
<bot>pseudo : bob IP: 00.000.00.IP Date:01/02/03 à 13h03
<bot>pseudo : bob IP: 00.000.00.IP Date:01/02/03 à 14h03


sens contraire :


<Good>!connect 01.020.0301.IP
<Bot>Connection de 01.020.0301.IP
<bot> IP: 00.000.00.IP pseudo: bob1 Date:01/02/03 à 13h03
<bot> IP: 00.000.00.IP pseudo: bob09 Date:01/02/03 à 14h03
Voici le code que j'utilise:


tcl
#################
##  PUTQUICK  ##
###############
 
 
proc putquick {arg} {
 append arg "\n"
 putdccraw 0 [string length $arg] $arg
}
 
 
bind raw - NOTICE connexion
proc connexion {from key arg} {
global botnick notc mod
   set text [split $arg] 
   if {[join [lrange $text 2 5]] == "Notice -- Client connecting"} {
     set g_nick [lindex $text 9]
      set g_user [string range [lindex [split [lindex $text 10] "@"] 0] 1 end]
      set g_host [string range [lindex [split [lindex $text 10] "@"] 1] 0 end-1]
   set g_userhost "$g_nick!$g_user@$g_host"
   set connexion "$g_nick $g_host"
    putquick "PRIVMSG #test :\00301Connexion de:\00303 $g_nick \00301sous le host \00301$g_user\00304@\00301$g_host"
   }
   set logfichier [open "connect.txt" "a+"]
   puts $logfichier "$connexion"
   close $logfichier
   }
   return 0
   }
}
 
bind pub - !connect connects
proc connects { nick uhost handle channel arg } {   
   putquick "NOTICE $nick :\0033..:Liste des connexions:.."
   catch {open "connect.txt" "r"} connexion
   set num 0
   while {![eof $connexion]} {
   gets $connexion verif
   if {$verif ne ""} {incr num 1;putquick "NOTICE $nick :\0034 $num -->\0033 [lrange $verif 0 end] \r"}
   }
   if {$num eq "0"} {putquick "NOTICE $nick :\0034Aucune connexion dans la base de donnée ! \r; return 0"}
   putquick "NOTICE $nick :\0033Fin de la Liste (\0034 $num \0033connexion(s) enregistré(s))"; return 0
   catch {close $connexion}
}


Donc, je sais pas d'ou commencer pour ajouter cette fonction.
Merci de votre aide à l'avance.
#2
En fait ce qui te manque, c'est le moyen de rechercher dans le fichier un pseudo ou une IP précise, c'est bien ça ?
Donc, il y a deux choses à faire:
1) modifier le format de ton fichier pour ajouter les informations manquantes (date ?)
2) modifier la procédure connects pour utiliser les arguments ($args) et ne faire d'affichage que si l'argument passé est dans la ligne
irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#3
Bonjour,

J'ai effectué plusieurs tests, mais je ne comprends toujours pas comment faire, j'ai fait des recherches ailleurs mais pas grand monde serait me dire comment faire l'exemple que j'ai posté au début du poste, pourriez vous me faire un exemple ou avoir une aide plus précise.

Merci d'avance.
Cordialement.
Aristide
#4
salut


tcl
if {$verif ne "" && [string match -nocase *$arg* $verif]} {incr num 1;putquick "NOTICE $nick :\0034 $num -->\0033 [lrange $verif 0 end] \r"}

ça devrais faire ce que tu veux.

par contre à la fin tu fermes le fichier après un "return" donc en réalité il ne se ferme pas

tcl
if {$num eq "0"} {putquick "NOTICE $nick :\0034Aucune connexion dans la base de donnée ! \r; return 0"}
   putquick "NOTICE $nick :\0033Fin de la Liste (\0034 $num \0033connexion(s) enregistré(s))"; return 0
   catch {close $connexion}

à remplacer par

tcl
catch {close $connexion}
   if {$num eq "0"} {putquick "NOTICE $nick :\0034Aucune connexion dans la base de donnée ! \r; return 0"}
   putquick "NOTICE $nick :\0033Fin de la Liste (\0034 $num \0033connexion(s) enregistré(s))"; return 0

C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#5
j'oubliais l heure

tcl
set connexion "$g_nick $g_host"

à remplacer par

tcl
set connexion "$g_nick $g_host [clock format [clock seconds] -format "%d/%m/%Y %H:%M:%S"]"

C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#6
Bonjour,

@djkenny: J'ai remplacé les lignes que tu avais précisé, mais j'ai toujours un message d'erreur en Party-Line


Code:
[16:11] Tcl error [connexion]: can't read "connexion": no such variable
Voici les modifications que j'ai apporté:


tcl
#################
##  PUTQUICK  ##
###############
 
 
proc putquick {arg} {
append arg "\n"
putdccraw 0 [string length $arg] $arg
}
 
 
 
bind raw - NOTICE connexion
proc connexion {from key arg} {
global botnick notc mod
   set text [split $arg]
   if {[join [lrange $text 2 5]] == "Notice -- Client connecting"} {
     set g_nick [lindex $text 9]
      set g_user [string range [lindex [split [lindex $text 10] "@"] 0] 1 end]
      set g_host [string range [lindex [split [lindex $text 10] "@"] 1] 0 end-1]
   set g_userhost "$g_nick!$g_user@$g_host"
   set connexion "$g_nick $g_host [clock format [clock seconds] -format "%d/%m/%Y %H:%M:%S"]"
    putquick "PRIVMSG #test :\00301Connexion de:\00303 $g_nick \00301sous le host \00301$g_user\00304@\00301$g_host"
   }
   set logfichier [open "connect.txt" "a+"]
   puts $logfichier "$connexion"
   close $logfichier
   }
   return 0
   }
}
 
 
bind pub - !connect connects
proc connects { nick uhost handle channel arg } {  
   putquick "NOTICE $nick :\0033..:Liste des connexions:.."
   catch {open "connect.txt" "r"} connexion
   set num 0
   while {![eof $connexion]} {
   gets $connexion verif
if {$verif ne "" && [string match -nocase *$arg* $verif]} {incr num 1;putquick "NOTICE $nick :\0034 $num -->\0033 [lrange $verif 0 end] \r"}   }
catch {close $connexion}
   if {$num eq "0"} {putquick "NOTICE $nick :\0034Aucune connexion dans la base de donnée ! \r; return 0"}
   putquick "NOTICE $nick :\0033Fin de la Liste (\0034 $num \0033connexion(s) enregistré(s))"; return 0
 
   }


Merci pour ton aide djkenny.
#7
essais de remplacer ca:
tcl
if {[join [lrange $text 2 5]] == "Notice -- Client connecting"} {

par
tcl
if {[string match -nocase "*notice*client*connecting*" $text]} {

C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#8
Hum, souci dans la procedure connexion, $connexion n'est pas rempli (je pense). Donc, erreur vers:

tcl
set connexion "$g_nick $g_host [clock format [clock seconds] -format "%d/%m/%Y %H:%M:%S"]"

Et si on remplaçait ça par:

tcl
set ts [clock format [clock seconds] -format "%d/%m/%Y %H:%M:%S"]
set connexion "$g_nick $g_host $ts"

irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#9
nan en fait j pense que la proc ne passe pas le if, vu que " puts $logfichier "$connexion"" ne se trouve pas dans le if l erreur est logique.
pour moi c est le if qui est faux
C'est en reconnaissant ses erreurs que l'on progresse ;)
Away
#10
Bonsoir,

@CrazyCat: Merci pour la réponse, j'ai remplacé les lignes que tu m'avais précisé dans le code et j'ai toujours la même erreur en partyline


Code:
<Hestia> [22:32] Tcl error [connexion]: can't read "connexion": no such variable
@djkenny: Merci aussi pour tes réponses, et si seulement tu pourrai me corriger le code, çà serait trop bien. Merci encore pour l'aide et pour le temps que tu consacres pour nous aider.


tcl
#################
##  PUTQUICK  ##
###############
 
 
proc putquick {arg} {
append arg "\n"
putdccraw 0 [string length $arg] $arg
}
 
 
 
bind raw - NOTICE connexion
proc connexion {from key arg} {
global botnick notc mod
   set text [split $arg]
    if {[string match -nocase "*notice*client*connecting*" $text]} {
     set g_nick [lindex $text 9]
      set g_user [string range [lindex [split [lindex $text 10] "@"] 0] 1 end]
      set g_host [string range [lindex [split [lindex $text 10] "@"] 1] 0 end-1]
   set g_userhost "$g_nick!$g_user@$g_host"
   set ts [clock format [clock seconds] -format "%d/%m/%Y %H:%M:%S"]
   set connexion "$g_nick $g_host $ts"
    putquick "PRIVMSG #test :\00301Connexion de:\00303 $g_nick \00301sous le host \00301$g_user\00304@\00301$g_host"
   }
   set logfichier [open "connect.txt" "a+"]
   puts $logfichier "$connexion"
   close $logfichier
   }
   return 0
   }
}
 
 
bind pub - !connect connects
proc connects { nick uhost handle channel arg } {  
   putquick "NOTICE $nick :\0033..:Liste des connexions:.."
   catch {open "connect.txt" "r"} connexion
   set num 0
   while {![eof $connexion]} {
   gets $connexion verif
if {$verif ne "" && [string match -nocase *$arg* $verif]} {incr num 1;putquick "NOTICE $nick :\0034 $num -->\0033 [lrange $verif 0 end] \r"}   }
catch {close $connexion}
   if {$num eq "0"} {putquick "NOTICE $nick :\0034Aucune connexion dans la base de donnée ! \r; return 0"}
   putquick "NOTICE $nick :\0033Fin de la Liste (\0034 $num \0033connexion(s) enregistré(s))"; return 0
 
   }

#11
Avec un code bien indenté et proprement structuré, ça donnerait plutôt:

tcl
#################
##  PUTQUICK  ##
###############
proc putquick {arg} {
   append arg "\n"
   putdccraw 0 [string length $arg] $arg
}
 
bind raw - NOTICE connexion
proc connexion {from key arg} {
   global botnick notc mod
   set text [split $arg]
   if {[string match -nocase "*notice*client*connecting*" $text]} {
      set g_nick [lindex $text 9]
      set g_user [string range [lindex [split [lindex $text 10] "@"] 0] 1 end]
      set g_host [string range [lindex [split [lindex $text 10] "@"] 1] 0 end-1]
      set g_userhost "$g_nick!$g_user@$g_host"
      set ts [clock format [clock seconds] -format "%d/%m/%Y %H:%M:%S"]
      set connexion "$g_nick $g_host $ts"
      putquick "PRIVMSG #test :\00301Connexion de:\00303 $g_nick \00301sous le host \00301$g_user\00304@\00301$g_host"
      set logfichier [open "connect.txt" "a+"]
      puts $logfichier $connexion
      close $logfichier
   }
   return 0
}
 
bind pub - !connect connects
proc connects { nick uhost handle channel arg } {  
   putquick "NOTICE $nick :\0033..:Liste des connexions:.."
   catch {open "connect.txt" "r"} connexion
   set num 0
   while {![eof $connexion]} {
      gets $connexion verif
      if {$verif ne "" && [string match -nocase *$arg* $verif]} {
         incr num 1;
         putquick "NOTICE $nick :\0034 $num -->\0033 [lrange $verif 0 end] \r"
      }
   }
   catch {close $connexion}
   if {$num eq "0"} {putquick "NOTICE $nick :\0034Aucune connexion dans la base de donnée ! \r; return 0"}
   putquick "NOTICE $nick :\0033Fin de la Liste (\0034 $num \0033connexion(s) enregistré(s))";
   return 0
}

irc.zeolia.net - Offrez-moi un café
Merci de ne pas demander d'aide en MP
Away
#12
Merci CrazyCat, avec ton code j'ai plus d'erreur en PartyLine, et çà fonctionne correctement Merci beaucoup ;)

Bonne soirée a tous.


Forum Jump:


Users browsing this thread: 1 Guest(s)