IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası

IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası (https://www.ircforumlari.net/)
-   TCL Scriptler (https://www.ircforumlari.net/tcl-scriptler/)
-   -   kanal girişleri kayıt/arama (https://www.ircforumlari.net/tcl-scriptler/544203-kanal-girisleri-kayit-arama.html)

saywhat 24 Ağustos 2013 19:12

kanal girişleri kayıt/arama
 
-> [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]

# istek üzerine yapılmıştır.
# amaç: kodun aktif edildiği kanal/lara giren kullanıcıları
# txt. üzerine kaydetmek.
# nicki - userhostu - girilen kanal - realname -saat+tarih
# kodun diğer işleviyse bu kayıtlar içinden istenen veriyi
# aratıp sonuçları aktarabilmesi.
# arama nick/host/kanal/tarih yada saat,
# kaydedilmiş veri içersinde eşleşek herhangi bir kritere
# göre yapılabilir.aramalarda wildcard kullanılabilir..
# !ara @*hostun-bir-kısmı yada !ara nick* vs gibide olabilir.
# kodun kanalda aktif olabilmesi için botunuza bağlanın:
# .chanset #kanalınız +userec

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]

not: .txt dosyasını aktif ettiğiniz her kanal için ayrı olarak kendiliğinden oluşturacaktır.sizin ayrıca .txt dosyası oluşturmanıza yada kod içinde kendiniz girmenize gerek yoktur.

örnek :
bota bağlanıp : .chanset #ircforumlari +userec
aktif edildikten sonraki ilk kanala giriş ile birlikte botunuzun/scripts klasörü içinde ,bu giriş/ler kanalınız-users.txt ..bu örnek için söylersek, ircforumlari-users.txt içinde saklanmış olur.ne kadar sayıda kanal üzerinde aktif edilirse herbir kanal için .txt oluşturacak o kadar sayıda kanalınız-users.txt scripts/ içinde görülecektir....

(kodun sadece "gereken" kısımları Türkçe'ye çevrilmiştir.)

Kod:

# istek üzerine yapılmıştır.
# amaç: kodun aktif edildiği kanal/lara giren kullanıcıları
# txt. üzerine kaydetmek.
# nicki - userhostu - girilen kanal - realname -saat+tarih
# kodun diğer işleviyse bu kayıtlar içinden istenen veriyi
# aratıp sonuçları aktarabilmesi.
# arama nick/host/kanal/tarih yada saat,
# kaydedilmiş veri içersinde eşleşek herhangi bir kritere
# göre yapılabilir.aramalarda wildcard kullanılabilir..
# !ara @*hostun-bir-kısmı yada !ara nick* vs gibide olabilir.
# kodun kanalda aktif olabilmesi için botunuza bağlanın:
# .chanset #kanalınız +userec
###############################################################

setudef flag userec

set userecfile "scripts/[string range $chan 1 end]-users.txt"

bind join - * rname:join
bind raw - 311 rname:check
bind join - * users:rec
bind pub nm|oa !ara user:search
 
 proc users:rec {nick uhost hand chan} {
  if {![channel get $chan userec]} { return 0;}
  set fp [open $::userecfile a+]
  set data "\002Nick:\002 $nick | \002Userhost:\002 $uhost | \002Kanal:\002 $chan"
    puts $fp "$data"
    close $fp
  return 0
}

 proc rname:join {nick host hand chan} {
  if {![channel get $chan userec]} { return 0;}
  if {[strlwr $nick] != [strlwr $::botnick]} {
      putserv "whois $nick"
    }
}

proc rname:check {from key arg} {
  set realname [strlwr [ctrl:filter [string range [lindex [split $arg] end] 1 end]]]
  set stamp [clock format [expr {3600 + [clock second]}] -format "Tarih: %d/%m/%Y Saat: %H:%M (GMT+3)"]
  set fp [open $::userecfile a+]
  set data "\002Realname:\002 $realname | \002Kayıt-Zamanı:\002 $stamp"
  puts $fp "$data"
    close $fp
    return 0
}

proc ctrl:filter {str} {
  regsub -all -- { \003[0-9]{0,2}(,[0-9]{0,2})?|\017|\037|\002|\026|\006|\007 } $str "" str
  return $str
 }

proc user:search {nick uhost hand chan text} {
  if {![channel get $chan userec]} { return 0;}
  if {[llength $text] == "0"} { puthelp "notice $nick :kullanımı:\002 $::lastbind nick\002"; return 0;}
  set text *[string map {" " *} $text]*
    putserv "notice $nick :\002$text\002 aranıyor..."
    set i 0
    set fp [open $::userecfile r]
    while {[gets $fp b]>-1} {
    if {[string match -nocase $text $b]} {
      incr i
      putserv "notice $nick :-> $b"
    }
  }
  close $fp
    if {$i} {
    putserv "notice $nick :arama sonucu: \002[expr {$i / 2}] \002 [expr {$i == 1?"":"adet"}]..."
    } {
    putserv "notice $nick :\002aramayla eşleşen kayıt bulunamadı...\002"
    }
}

putlog "Ok..."

not: kod ile alakalı bilinen bug* hata/yada şimdilik eksiklik şudur ki: giriş yapan kullanıcı realname'i renkli/renk kodları içeriyorsa kayıt edilmiyor.isteği yapan kişiye kod teslim edildikten sonraki denemelerde fark ettim. henüz onarmadım... olası* sonraki güncelleme/lerde buda aklımda,yapılacak işler listesinde bir yerlerde....

saywhat 24 Ağustos 2013 22:46

Cevap: kanal girişleri kayıt/arama
 
güncelleme : -> [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]

yukardaki "ilk" çalışan halindeki sorunlar halledildi.
bir tek renk kodları içeren "realname" her ne hikmetse ne denediysem ,
renkli" realname'leri görüp/yazdırtmasını başaramadım.

aklıma gelen her yöntemi denedim realname yakalayan kısmı defalarca yeni baştan yazdım-denedim.. yok olmadı..geriye bir o "eksiği" kaldı...

"renkli realname kaydetme/görme sorunu dışında gayet iyi işliyor.

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]

Kod:

# istek üzerine yapılmıştır.
# amaç: kodun aktif edildiği kanal/lara giren kullanıcıları
# txt. üzerine kaydetmek.
# nicki - userhostu - girilen kanal - realname -saat+tarih
# kodun diğer işleviyse bu kayıtlar içinden istenen veriyi
# aratıp sonuçları aktarabilmesi.
# arama nick/host/kanal/tarih yada saat,
# kaydedilmiş veri içersinde eşleşek herhangi bir kritere
# göre yapılabilir.aramalarda wildcard kullanılabilir..
# !ara @*hostun-bir-kısmı yada !ara nick* vs gibide olabilir.
# kodun kanalda aktif olabilmesi için botunuza bağlanın:
# .chanset #kanalınız +userec
###############################################################

setudef flag userec

# txt dosyasını aktif ettiğiniz her kanal için ayrı olarak kendiliğinden oluşturacaktır.
# sizin ayrıca .txt dosyası oluşturmanıza yada kod içinde kendiniz girmenize gerek yoktur.

set userecfile "scripts/[string range $chan 1 end]-users.txt"

bind join - * rname:join
bind pub nm|oa !ara user:search

 proc rname:join {nick uhost hand chan} {
  set ::rnick $nick ;set ::rhost $uhost ;set ::rchan $chan
  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
      }
}

proc rname:check {from key text} {
  set rname [stripcodes bcruag [string range [lindex [split [string trim $text]] end] 1 end]]
    set fp [open $::userecfile a+]
    set nick $::rnick ;set uhost $::rhost ;set chan $::rchan
    set stamp [clock format [clock seconds] -format "\002Tarih:\002 %d/%m/%Y \002Saat:\002 %H:%M:%S \002TZ:\002 %z"]
    set data "\002Nick:\002 $nick | \002Userhost:\002 $uhost |  \002Realname:\002 $rname \002Kanal:\002 $chan | \002Zamanı:\002 $stamp"
    puts $fp "$data"
    close $fp
  return 0
}

if {[info exists rname:check]} {
catch {unbind raw - 311 rname:check}
}

proc user:search {nick uhost hand chan text} {
  if {![channel get $chan userec]} { return 0;}
  if {[llength $text] == "0"} { puthelp "notice $nick :kullanımı:\002 $::lastbind nick\002"; return 0;}
    set text *[string map {" " *} $text]*
    putserv "notice $nick :\002$text\002 aranıyor..."
    set i 0
    set fp [open $::userecfile r]
    while {[gets $fp b]>-1} {
    if {[string match -nocase $text $b]} {
      incr i
      putserv "notice $nick :\002$i->\002 $b"
    }
 }
  close $fp
    if {$i} {
    putserv "notice $nick :arama sonucu: \002$i \002 [expr {$i == 1?"":"adet"}]..."
    } {
    putserv "notice $nick :\002aramayla eşleşen kayıt bulunamadı...\002"
    }
}

putlog "Ok..."


saywhat 25 Ağustos 2013 01:43

Cevap: kanal girişleri kayıt/arama
 
yukarda sözünü ettiğim renk kodları içeren realname görmeme/kayıt etmeme sorunuda giderildi.

en sonunda kendim cebelleşmek yerine birinin görüşünü alayım dedim iyiki de etmişim. meğer çözüm inanılmaz derecede basitmiş.
(saat 18:00'den beri bunla cebelleşiyordum )
basit çözümü ve hatanın onarılmasındaki yardımı için UnderNet #tcl kanalındaki _MaDaLiN_ 'e teşekkür ederim...

-> [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]

Kod:

# istek üzerine yapılmıştır.
# amaç: kodun aktif edildiği kanal/lara giren kullanıcıları
# txt. üzerine kaydetmek.
# nicki - userhostu - girilen kanal - realname -saat+tarih
# kodun diğer işleviyse bu kayıtlar içinden istenen veriyi
# aratıp sonuçları aktarabilmesi.
# arama nick/host/kanal/tarih yada saat,
# kaydedilmiş veri içersinde eşleşecek herhangi bir kritere
# göre yapılabilir.aramalarda wildcard kullanılabilir..
# !ara @*hostun-bir-kısmı yada !ara nick* vs gibide olabilir.
# kodun kanalda aktif olabilmesi için botunuza bağlanın:
# .chanset #kanalınız +userec
###############################################################

setudef flag userec

# txt dosyasını aktif ettiğiniz her kanal için ayrı olarak kendiliğinden oluşturacaktır.
# sizin ayrıca .txt dosyası oluşturmanıza yada kod içinde kendiniz girmenize gerek yoktur.

set userecfile "scripts/[string range $chan 1 end]-users.txt"

bind join - * rname:join
bind pub nm|oa !ara user:search

 proc rname:join {nick uhost hand chan} {
  set ::rnick $nick ;set ::rhost $uhost ;set ::rchan $chan
  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
          }
}

proc rname:check {from key text} {
;# realname üzerindeki kod hatasının çözümü için Undernet #tcl kanalında _MaDaLiN_ 'e,
;# teşekkür borcum var. çözüm inanılmaz derecede baitmiş halbuki...
;# insan bazen gözü önündeki şeyi göremez hale geliyor.
;# tek yapılması gereken eski :
;# set rname [stripcodes bcruag [string range [lindex [split [string trim $text]] end] 1 end]
;# satırının yerine alttaki basit satırmış...
;# neler neler denedim meğer hiçbişey yapmayıp dümdüz yakalsaymışımda olurmuş :)

    set rname [join [lrange $text 5 end]]
    set fp [open $::userecfile a+]
        set nick $::rnick ;set uhost $::rhost ;set chan $::rchan
    set stamp [clock format [clock seconds] -format "\002Tarih:\002 %d/%m/%Y \002Saat:\002 %H:%M:%S \002TZ:\002 %z"]
    set data "\002Nick:\002 $nick | \002Userhost:\002 $uhost | \002Realname:\002 $rname | \002Kanal:\002 $chan | \002Zamanı:\002 $stamp"
    puts $fp "$data"
    close $fp
  return 0
}

if {[info exists rname:check]} {
catch {unbind raw - 311 rname:check}
}


proc user:search {nick uhost hand chan text} {
  if {![channel get $chan userec]} { return 0;}
  if {[llength $text] == "0"} { puthelp "notice $nick :kullanımı:\002 $::lastbind nick\002"; return 0;}
    set text *[string map {" " *} $text]*
    putserv "notice $nick :\002$text\002 aranıyor..."
    set i 0
    set fp [open $::userecfile r]
    while {[gets $fp b]>-1} {
    if {[string match -nocase $text $b]} {
      incr i
      putserv "notice $nick :\002$i->\002 $b"
    }
 }
  close $fp
    if {$i} {
    putserv "notice $nick :arama sonucu: \002$i \002 [expr {$i == 1?"":"adet"}]..."
    } {
    putserv "notice $nick :\002aramayla eşleşen kayıt bulunamadı...\002"
    }
}

putlog "Ok..."


Sephiroth 27 Ağustos 2013 03:00

Cevap: kanal girişleri kayıt/arama
 
Emeğine sağlık... Clubber ve sana öncülüğünüz için teşekkürler gerçekten güzel paylaşımlar..

saywhat 03 Ağustos 2014 00:40

Cevap: kanal girişleri kayıt/arama
 
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....

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]

[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]

bu kanal içi girdileri/user kayıtları için :

Kod:

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:

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.


Tüm Zamanlar GMT +3 Olarak Ayarlanmış. Şuanki Zaman: 05:05.

Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2025, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
Copyright ©2004 - 2025 IRCForumlari.Net Sparhawk