uzun bir aradan sonra ,bu kodu hatırlayıp geçen hafta "onarmaya" başladım... onarmaya dememin nedeni,kodun en mühim sorunu yapılan aramalarda ; misal 5 arama çıktısına ayarladıysanız ,ama aradığınız kişi/kriterin 5'ten fazla girdisi/kaydı var ise, dosyayı hep ilk satırdan EOF ,yani sona doğru okuduğu için ,en eski 5 kaydı gösteriyordu. ki bu durumda 5'ten fazla kaydı olan aramalarda hep aynı 5 çıktıyı veriyordu...
geçen haftaiçi aklıma geldi bi el atayım bakalım bir yolunu bulabilecekmiyim dedimdi, ancak ne denesem bir türlü geriye doğru arama/okutma olmadıydı.
gugıl'da oraya buraya dalmama bir dolu döküman tırmalamama rağmen ,şuradaki gibi ->
[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] soruya verilen cevaplarda da belirtildiği gibi ,Tcl kaynak kodları hep ileriye doğru okumak üzerine bunu kısıtlamış.Tcl'nin kaynak kodlarında (ki C ile yazılmıştır Tcl kaynak kodları) oynayıp değişmeyi önerenlere dahi rastladım...
olmadı Tcl destek kanalında sordum bunun bir yolu var mıdır ,dosyayı tersten,yani son satırdan başlayıp ilk satıra doğru ,yeni girdiden eskiye doğru okumanın diye,yine cevap alamadım,cevap diye önerilen/ler de bir işe yaramadıydı...
aklıma okutulan satırlardaki tarih saat girdilerini regexp yada scan ile yakalatıp,birbirleriyle eşleştirip, lsort -decreasing yani terse doğru sıralatmayla yapabilirmiyim acaba diye tırmalayıp durdum ki ...cık oda olmadıydı...
taki dün geceye kadar,,, tcllib paketlerinin dökümanları arasında dolaşırken aradığımı buluverdim ,,,sonunda....
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
bu kanal içi girdileri/user kayıtları için :
Kod: Kodu kopyalamak için üzerine çift tıklayın!
setudef flag userec
package require struct::list
bind join - * rname:join
bind pub nm|oa !ara user:search
proc rname:join {nick uhost hand chan} {
set userecfile "scripts/[string range $chan 1 end]-users.txt"
set ::rnick $nick ;set ::rhost $uhost ;set ::rchan $chan ;set ::userecfile $userecfile
if {![channel get $chan userec]} { return 0 }
if {![string match -nocase $::botnick $nick] && [onchan $nick $chan]} {
putquick "whois $nick $nick"
bind raw - 311 rname:check
}
return 0
}
proc rname:check {from key text} {
set rname [join [string map -nocase {: ""} [lrange [split $text] 5 end]]]
set nick $::rnick ;set uhost $::rhost ;set chan $::rchan ;set userecfile $::userecfile
set fp [open $userecfile a+]
set stamp [clock format [clock seconds] -format "\002Tarih:\002\00312 %d.%B.%Y %A\003 - \002Saat:\002\00312 %H:%M:%S\003" -locale tr_TR]
set host [lindex [split $uhost @] 1]; set ident [lindex [split $uhost @] 0]
set data "\00300,04JOIN\003 \00312$stamp\003 | \002Nick:\002 \00311$nick\003 | \002Ident:\002 \00311$ident\003 \
| \002Host:\002 \00311$host\003 | \002Realname:\002 \00311$rname\003 | \002Kanal:\002 \00309$chan\003"
puts $fp "$data"
close $fp
catch {unbind raw - 311 rname:check}
return 0
}
proc user:search {nick uhost hand chan text} {
if {![channel get $chan userec]} { return 0;}
if {[llength $text] eq "0"} { puthelp "notice $nick :Kullanımı:\002 $::lastbind <aranacak>\002"; return 0;}
set userecfile "scripts/[string range $chan 1 end]-users.txt"
set text *[string map {" " *} $text]*
putserv "notice $nick :\002$text\002 aranıyor..."
set i 0
set fp [open $userecfile r]
set lines [split [read -nonewline $fp] "\n"]
foreach line [struct::list reverse $lines] {
if {[string match -nocase $text $line]} {
if {$i == 5} break
puthelp "notice $nick :$line"
incr i
}
}
close $fp
if {$i} {
putquick "notice $nick :gösterilen arama sonucu : \002$i \002 [expr {$i == 1?"":"adettir."}]..."
} else {
putserv "notice $nick :\002aramayla eşleşen kayıt bulunamadı...\002"
return 0
}
}
putlog "Ok..."
bu ise sunucu girişlerini kaydedip ,arama yapılabilmesi için:
Kod: Kodu kopyalamak için üzerine çift tıklayın!
setudef flag userconnect
package require struct::list
bind raw - NOTICE rname_connect
bind pub nm|oa !ara search_user
proc rname_connect {from key text} {
if {[string match -nocase *!*@* $from]} { return 0 }
if {[regexp -nocase -- {Client connecting on port (\d+): (.*) \(([^@]+)@(\S+)\) \[(.*)\]} $text -> port nick ident host rname] && \
![string match -nocase $::botnick $nick]} {
set userecfile "scripts/connecting-users.txt"
set fp [open $userecfile a+]
set stamp [clock format [clock seconds] -format "\002Tarih:\002\00312 %d.%B.%Y %A\003 - \002Saat:\002\00312 %H:%M:%S\003" -locale tr_TR]
set data "\00300,04Connected\003 \00312$stamp\003 | \002Nick:\002 \00311$nick\003 | \002Ident:\002 \00311$ident\003 \
| \002Host:\002 \00311$host\003 | \002Realname:\002 \00311$rname\003 | \002Port:\002 \00309$port\003"
puts $fp "$data"
close $fp
}
return 0
}
proc search_user {nick uhost hand chan text} {
if {![channel get $chan userconnect]} { return 0 }
if {[llength $text] eq "0"} { puthelp "notice $nick :Kullanımı:\002 $::lastbind <aranacak>\002"; return 0;}
set userecfile "scripts/connecting-users.txt"
set text *[string map {" " *} $text]*
putserv "notice $nick :\002$text\002 aranıyor..."
set i 0
set fp [open $userecfile r]
set lines [split [read -nonewline $fp] "\n"]
foreach line [struct::list reverse $lines] {
if {[string match -nocase $text $line]} {
if {$i == 5} break
puthelp "notice $nick :$line"
incr i
}
}
close $fp
if {$i} {
putquick "notice $nick :gösterilen arama sonucu : \002$i \002 [expr {$i == 1?"":"adettir."}]..."
} else {
putserv "notice $nick :\002aramayla eşleşen kayıt bulunamadı...\002"
return 0
}
}
putlog "Ok..."
her ikisi içinde tcllib struct paketi gereklidir.