No_FeaR
17 Mart 2015, 21:42
sanırım biri daha evvel böyle birşey yazmıştı burada ama gördüğüm mirc script miydi? yoksa Tcl mi doğrusu hatırlamıyorum.
kodun yapması beklenen iş: oper botunuzun gördüğü sunucu girişlerinden kullanıcı hostu/IP'sini sorgulatmak, alınan şehir bilgisine göre o şehir isminde bir kanal var ise sunucuda ( ayar kısmındaki açıklamaları okuyunuz.) oraya o kullanıcıyı sajoin'lemek.
yok sunucudaki hiçbir şehir kanalıyla eşleşmiyen bir şehirdense bilgisi o zaman onları başka bir yerlere sajoin'lemek. (ayar kısmında belirtildi.)
Önemli Uyarılar :
* bu kod yapısı gereği, Tcl8.5.x ve üstü sürümlerce desteklenen,bu üst sürümlerde yer alan komutları kullanmaktadır.
Tcl8.4.x yada daha alt sürümlerde kod çalışmaz,tanımadığı/desteklemediği bu komutlar nedeniyle hata atar.
* kod'da veri alımında kullanılan site API'si verileri JSON formatındadır .. bu formatta alınan veriler tcllib json paketinin getirdiği komutlarla Tcl dict ( Tcl list )'e çevrilerek istenen veri alımı sağlanmıştır.
ki bu site için ya xml ya JSON formatı seçilebilirdi. xml seçseydim o zamanda tDom paketi ve onun getireceği komutlarla yazmam gerekirdi.
(ki bu tDom ayrı bir projedir ne Tcl ne tcllib içinde yer almaz ayrıca proje adresinden alınıp kurulması/derlenmesi gerekir.)
* site kodlarından regexp vs kullanılarak çekilemez miydi? diye sorulacaksa ,cevabı -> hayır çekilemezdi. çünkü site kodları javascript kullanıyor. ve alınmak istenen veriyi gizliyor. o nedenle de API kullanmaktan başka daha kullanışlı bir seçenek yok..tu...
uzun lafın kısası ,bu script için en az Tcl8.5 sürümü ve tcllib zorunludur.
# http paketi gerekir.
package require http
# tcllib json paketi gerekir.
# git clone [Only Registered Users Can See Links] && cd tcllib && ./configure && make install
package require json
# kullanıcı sehri eşleşirse bu kanallara gönderilecek...
# sunucunuzdaki #şehir kanallarını/kullanıcın çekilmesini istediğiniz kanalları,
# aralarına boşluk bırakarak girin.
set sehirknl "#adana #istanbul #bursa #samsun #ankara #samsun"
# şehir bilgisi yukarıdaki sunucunuzdaki #şehir kanallarından hiçbiriyle
# eşleşmeyen kullanılar,hangi kanallara çekilecek:
# birden fazlaysa, örnekteki şekilde giriniz.
set defknl [list #ana-kanal #bir-digeri]
# ayar sonu
# önemli uyarılar:
# Tcl8.5.x ve üstü sürümlerle çalışır. (daha alt sürümlerle *çalışmaz*)
# botun oper yetkilerine sahip olması gerekir.
bind raw * NOTICE client_connect
proc client_connect {from key text} {
if {[string match "*!*@*" $from]} { return }
if {![string match -nocase "*client connecting*" $text]} { return 0 }
regexp {^\W+([^\:]+)\:([^\(]+)\(([^@]+)@([^\\W+]+)\)$} $text - port nick ident host
if {[regexp {^([\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3})$} $host]} {
set target $host
} else {
set target [dnslookup $host ipchk]
}
set ipsite "[Only Registered Users Can See Links]"
::[Only Registered Users Can See Links] -useragent "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5"
set token [::[Only Registered Users Can See Links] $ipsite$target -timeout [expr {6*1000}]]
set data [json::json2dict [::[Only Registered Users Can See Links] $token]]
::[Only Registered Users Can See Links] $token
set sehir [dict get $data city]
foreach n [split $::sehirknl " "] {
if {[string match -nocase "#$sehir" $n]} {
putquick "sajoin $nick #$sehir"
} else {
putquick "sajoin $nick $::defknl"
}
}
return 0
}
proc ipchk {bir iki uc} {
if {$uc} {
return $bir
} else {
putcmdlog "Hata $iki çözülemedi..."
return $iki
}
}
putlog "ok..."
Output ;
can't find package json
while executing
"package require json"
(file "t.tcl" line 8)
Yapımcısı ; saywhat
kodun yapması beklenen iş: oper botunuzun gördüğü sunucu girişlerinden kullanıcı hostu/IP'sini sorgulatmak, alınan şehir bilgisine göre o şehir isminde bir kanal var ise sunucuda ( ayar kısmındaki açıklamaları okuyunuz.) oraya o kullanıcıyı sajoin'lemek.
yok sunucudaki hiçbir şehir kanalıyla eşleşmiyen bir şehirdense bilgisi o zaman onları başka bir yerlere sajoin'lemek. (ayar kısmında belirtildi.)
Önemli Uyarılar :
* bu kod yapısı gereği, Tcl8.5.x ve üstü sürümlerce desteklenen,bu üst sürümlerde yer alan komutları kullanmaktadır.
Tcl8.4.x yada daha alt sürümlerde kod çalışmaz,tanımadığı/desteklemediği bu komutlar nedeniyle hata atar.
* kod'da veri alımında kullanılan site API'si verileri JSON formatındadır .. bu formatta alınan veriler tcllib json paketinin getirdiği komutlarla Tcl dict ( Tcl list )'e çevrilerek istenen veri alımı sağlanmıştır.
ki bu site için ya xml ya JSON formatı seçilebilirdi. xml seçseydim o zamanda tDom paketi ve onun getireceği komutlarla yazmam gerekirdi.
(ki bu tDom ayrı bir projedir ne Tcl ne tcllib içinde yer almaz ayrıca proje adresinden alınıp kurulması/derlenmesi gerekir.)
* site kodlarından regexp vs kullanılarak çekilemez miydi? diye sorulacaksa ,cevabı -> hayır çekilemezdi. çünkü site kodları javascript kullanıyor. ve alınmak istenen veriyi gizliyor. o nedenle de API kullanmaktan başka daha kullanışlı bir seçenek yok..tu...
uzun lafın kısası ,bu script için en az Tcl8.5 sürümü ve tcllib zorunludur.
# http paketi gerekir.
package require http
# tcllib json paketi gerekir.
# git clone [Only Registered Users Can See Links] && cd tcllib && ./configure && make install
package require json
# kullanıcı sehri eşleşirse bu kanallara gönderilecek...
# sunucunuzdaki #şehir kanallarını/kullanıcın çekilmesini istediğiniz kanalları,
# aralarına boşluk bırakarak girin.
set sehirknl "#adana #istanbul #bursa #samsun #ankara #samsun"
# şehir bilgisi yukarıdaki sunucunuzdaki #şehir kanallarından hiçbiriyle
# eşleşmeyen kullanılar,hangi kanallara çekilecek:
# birden fazlaysa, örnekteki şekilde giriniz.
set defknl [list #ana-kanal #bir-digeri]
# ayar sonu
# önemli uyarılar:
# Tcl8.5.x ve üstü sürümlerle çalışır. (daha alt sürümlerle *çalışmaz*)
# botun oper yetkilerine sahip olması gerekir.
bind raw * NOTICE client_connect
proc client_connect {from key text} {
if {[string match "*!*@*" $from]} { return }
if {![string match -nocase "*client connecting*" $text]} { return 0 }
regexp {^\W+([^\:]+)\:([^\(]+)\(([^@]+)@([^\\W+]+)\)$} $text - port nick ident host
if {[regexp {^([\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3})$} $host]} {
set target $host
} else {
set target [dnslookup $host ipchk]
}
set ipsite "[Only Registered Users Can See Links]"
::[Only Registered Users Can See Links] -useragent "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5"
set token [::[Only Registered Users Can See Links] $ipsite$target -timeout [expr {6*1000}]]
set data [json::json2dict [::[Only Registered Users Can See Links] $token]]
::[Only Registered Users Can See Links] $token
set sehir [dict get $data city]
foreach n [split $::sehirknl " "] {
if {[string match -nocase "#$sehir" $n]} {
putquick "sajoin $nick #$sehir"
} else {
putquick "sajoin $nick $::defknl"
}
}
return 0
}
proc ipchk {bir iki uc} {
if {$uc} {
return $bir
} else {
putcmdlog "Hata $iki çözülemedi..."
return $iki
}
}
putlog "ok..."
Output ;
can't find package json
while executing
"package require json"
(file "t.tcl" line 8)
Yapımcısı ; saywhat