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/)
-   Eggdrop, NeoStats, BNC (https://www.ircforumlari.net/eggdrop-neostats-bnc/)
-   -   Kodlama hakkında sorular [TCL] (https://www.ircforumlari.net/eggdrop-neostats-bnc/577246-kodlama-hakkinda-sorular-tcl.html)

xwerswoodx 30 Mart 2014 19:17

Kodlama hakkında sorular [TCL]
 
TCL kodlamasını hiç bilmiyorum yeni başladım ve yavaş yavaş anlamaya çalışıyorum.[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]
buradan biraz bilgi alıp ufak testler yaptım fakat hala çözemediğim bazı şeyler var.

[BOX="Soru 1"]Bot kafasına göre -e alıyor veya flood koruması yapıyor.
Bot sunucuya girip +h aldığında kafasına göre +e deki nickleri kaldırıp, flood yapanı atıyor, halbuki ben botun herhangi bir şekilde kanalda öyle bir koruma yapmasını istemiyorum. Zaten öyle bir kodda eklemedim ancak her botta tanımlanan bazı tcl dosyalarını tanımlamıştım sadece.
source scripts/alltools.tcl
source scripts/action.fix.tcl
source scripts/userinfo.tcl
source hamit/hamit.tcl[/BOX]

[BOX="Soru 2"]Bir text'e nasıl veri yazdırır ve o veriyi aktif olduğunda nasıl kullanırım?
sunucuda !kanal ekle #sohbet yazdığımda #sohbet kanalını bir text'e yazdırmak ve o texti sonradan sunucuya her girdiğinde channel add #kanal şeklinde çekmek istiyorum, ancak texte veriyi yazdırırken o textte o verinin olup olmadığını kontrol etmek istiyorum.

Ek olarak eğer bir text oluşturulmamışsa create tarzında bir komut var mı?

Kod:

# General Settings
set channel_oper        "#Opers"
set channel_logs        "#Bots"

set channel_prefix        "h"
set me                "Hamit"

# Files
set file_channel        "hamit/database/channel.dat"
#set file_language        "hamit/database/lang/tr.lang"

# Commands
bind pub - !kanal Channel

proc Channel {nick uhost hand chan text} {
global channel_oper channel_prefix me channel_logs file_channel
set fchan [lindex $text 1]
set hamionay 0
        if {[lindex $text 0] == "ekle"} {
                set hamit [open $file_channel r]
                if {[gets $fchan=1 line] > 0} {
                set hamitonay 1
                }
                close hamit

                set hamit [open $file_channel w]
                if {$hamionay == "0"} {
                        if {![validchan $fchan]} {
                                puts $hamit "$fchan=1"
                                putserv "PRIVMSG $chan $fchan kanalı listeye eklendi."
                                return 1
                        }
                close hamit
                }
        }
}

Böyle bir şey denedim ancak kayıt etmedi malesef. Mesaj yazdı ama sanırım yazma komutu puts değil. Gets ilede veriyi alıyor mu emin değilim. Dediğim gibi hiç bir şey bilmiyorum.

Ek olarak $istok gibi yada $regex gibi bir komut var mı? yani sadece ekle değilde (^ekle(me|)$) tarzında bir şeyler yapabilmek için. Veyahut $istok(ekle ekleme eklemek,$text,32) tarzında.[/BOX]

[BOX="Soru 3"]Array kullanımı hakkında?
Arraydan kastım şu

.set hamit(nicks) {
"sıfır"
"bir"
"iki"
}

Bu tarz bir kodda 2 yazdığımda $hamit(2) gibi bir komut var mı? Yani 2 yazdığımda "iki" olarak dönecek. Ek olarak badnick koruması gibi düşündüğümüzde bir nickin o listedeki bir maskeye uyup uymadığını anlamamız mümkün mü yoksa bu tarz bir yöntem ile while çekip mi bulabiliriz? Yani $hmatch tarzında bir komutu var mı?
[/BOX]

[BOX="Soru 4"]Gettok tarzında bir komut?
Mesela;
.set hamit 1=2

uyguladığım zaman $gettok($hamit,1,$asc(=)) tarzında bir komut var mı? Sadece = den öncesini yada sonrasını alacağımız bir komut.

[/BOX]

Bunları cevaplarken TCL kodlamasıyla sadece 30dk uğraşmış biri olduğumu unutmadan cevap verirseniz çok sevinirim, şuanda hemen hemen hiç bir döngüyü kullanmayı bilmiyorum, yazarken biraz açıklamalı yazarsanız daha iyi anlayabilirim.

Sitede arama yaptım ancak bir çok link düşmüş veya anlayamadım, bazıları ise benim istediğimi veremiyorlar. Geçici olarak channel add ile yapıyorum zaten kod altından ama ben oraya eklenen kanalları text'e kayıt edip her girişte çekmek istiyorum. Conf içinden yapmam gerek sanırım bunu, o konuda yardımcı olurasnız çok sevinirim.

Başlığın çok açıklamalı olmadığının farkındayım, lakin başka sorularımın olabileceğini göz önünde bulundurarak her soru için bir başlık açmak yerine bu başlık altından sormak isterim diye öyle koydum, anlayış göstereceğinizi umuyorum.

Şimdiden teşekkürler.

Entrance 30 Mart 2014 21:43

Cevap: Kodlama hakkında sorular [TCL]
 
* TCL Scripting, üzerine pek bir bilgim yok ancak, biraz ingilizcen var ise veya düzgün çeviri yapabilen bir site varsa [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] veya [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] link'ten faydalanabilirsiniz..

İyi forumlar..^^

xwerswoodx 30 Mart 2014 22:24

Cevap: Kodlama hakkında sorular [TCL]
 
Bilgi için teşekkürler, ancak en üstteki linkde aynı siteyeydi ancak direkt olarak site ismi olarak görünmediği için gözden kaçmış sanırım. Evet orası bilgi veriyor lakin yeterince açık olmuyor, gets i gösteriyor ama anlamını tam olarak anlamadım ben line sanıyorum dosyanın satır sayısına denk geliyor ama dosyadan bir veriyi nasıl çekeceğimizi anlatmıyor malesef yada ben kullanmayı öğrenemedim sanırım :)

Entrance 30 Mart 2014 23:06

Cevap: Kodlama hakkında sorular [TCL]
 
Daha da fazla bilgi edinmek istiyor iseniz akıl vermek gibi olmasın da, bu kategori altında veri alma, okuma, vb bir çok kod mevcut örnek -> [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] burda satır okutma ile alakalı yorumlar var, ve yazılan kodları biraz incelerseniz veya yazılan kodlara istinaden mesela "Bu kullanıcı bu sebepten ötürü atıldı." gibi, benzeri yorumlar kullanılıyor bunlardan yola çıkılarakta hiç bir bilgisi olmayan biride olsa mantığı kavrayabilir düşüncesindeyim..

İyi forumlar, ve iyi geceler.. ^^

xwerswoodx 05 Nisan 2014 02:22

Cevap: Kodlama hakkında sorular [TCL]
 
Öncelikle @[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] bana cevap verdiğiniz ve yardımcı olduğunuz için çok teşekkür ederim. Ben yavaş yavaş deneye deneye bir şeyler yapmaya çalışıyorum, aslında araştırıyorum ancak 64 sayfalık bir döküman var ve bir çok link düşmüş, hak verirsiniz ki bulmak biraz zor oluyor :) Ancak tabiki bir yandan araştırıyorum.

Benimle aynı sorunları yaşayan arkadaşlar için bazı soruların cevabını buldum ve vermek istiyorum, insanlar yararlansın diye :)

Öncelikle ilk sorumda +h alınca kanaldan atma -e alma gibi sorunları dile getirmiştim, bunu çözmek için conf dosyama;
Kod:

set global-chanset +nodesynch
ekledim ve sorun çözülmüş oldu.

2. sorumda ise bir texte nasıl bir veri yüklenip, okutulduğunu sormuştum onuda şöyle bir kodlama ile çözdüm;

Kod:

proc is:infile {filename args} {
        if {[file exists $filename]} {
        set dosya [open $filename r]
                while {![eof $dosya]} {
                catch {set argn0 [gets $dosya]}
                        if {$argn0 == $args} {
                        catch {close $dosya}
                        return 1
                        }
                }
        catch {close $dosya}
        }
return 0
}

Burada filename dosyanın adı yani mesela; scripts/hamit.txt, args ise burada dosyaya eklenecek veri.

Yani mesela
set hamit "hamit.txt" olarak belirlediğinizi varsayarsak,
if {[is:infile $hamit #Sohbet] == "1"]} { return 1 }
tarzında kullanabilirsiniz.

Örnek vermem gerekirse;
Kod:

proc is:operchan {args} {
global file_channel_oper
        if {[is:infile $file_channel_oper $args] == "1"} {
        return 1
        }
return 0
}

proc is:userchan {args} {
global file_channel
        if {[is:infile $file_channel $args] == "1"} {
        return 1
        }
return 0
}

Bu basit bir okuma metoduydu.

Yazma metodunda ise deneme yanılma yöntemiyle şunu fark ettim, "w" ile open yaptığımız zaman direkt olarak dosyayı hiç bir şey yazılmamış gibi yazıyordu, lakin, "a" ile yaptığımız zaman dosyaya veriyi ekliyordu.

Yani eğer bir oyun botu yapıyorsanız ve bir sıra yapmak için geçici olarak dosyaya veri yazdıracaksanız dosyayı silmek yerine w metodunu kullanabilirsiniz.

Sonrasında listelemek ve eklemek için yaptığım kodlama aslında basit ama yinede bilmeyenler için göstermek istiyorum.

Kod:

bind pub - !kanalx com:kanal
proc com:kanal {nick host hand chan text} {
global file_channel me
        if {[is:operchan $chan] == "1"} {
        set argn0 [lindex $text 0]
        set argn1 [lindex $text 1]

                if {$argn0 == "ekle" && $argn1 != ""} {
                        if {[is:muafchan $argn1] == "1"} {
                        putquick "PRIVMSG $chan :\2$argn1\2 kanalı muaf listesinde bulunuyor."
                        } elseif {[is:userchan $argn1] == "1"} {
                        putquick "PRIVMSG $chan :\2$argn1\2 kanalı zaten listede bulunuyor."
                        } else {
                        set dosya [open $file_channel a]
                        puts $dosya $argn1
                                channel add $argn1 {
                                need-op { putserv "MODE $argn1 +h $me" }
                                }
                        putquick "PRIVMSG $chan :\2$argn1\2 kanalı listeye eklendi."
                        close $dosya
                        }
                } elseif {$argn0 == "list"} {
                        putquick "PRIVMSG $chan :Kayıtlı kanallar listeleniyor;"
                        putquick "PRIVMSG $chan :\2"
                        if {[file exists $file_channel]} {
                        set dosya [open $file_channel r]
                                while {![eof $dosya]} {
                                catch {set argn2 [gets $dosya]}
                                        if {$argn2 != ""} {
                                        putquick "PRIVMSG $chan :Kanal: \2$argn2\2"
                                        }
                                }
                        catch {close $dosya}
                        putquick "PRIVMSG $chan :\2"
                        putquick "PRIVMSG $chan :Kayıtlı kanallar listelendi."
                        }
                } elseif {$argn0 == "test" && $argn1 != ""} {
                        if {[is:infile $file_channel $argn1] == "1"} then {
                        putquick "PRIVMSG $chan :\2$argn1\2 kanalı listede bulunuyor."
                        } else {
                        putquick "PRIVMSG $chan :\2$argn1\2 kanalı listede bulunmuyor."
                        }
                }
        }
return 0
}

Eklediğiniz kanallara girmesi için ise conf dosyanıza;
Kod:

set file_channel "hamit/database/channel.dat"
if {[file exists $file_channel]} {
set dosya [open $file_channel r]
        while {![eof $dosya]} {
        catch {set args [gets $dosya]}
                if {$args != ""} {
                        channel add $args {
                          need-op { putserv "MODE $args +h Bot" }
                        }
                }
        }
        catch {close $dosya}
}

şeklinde ekleyebilirsiniz.

Tekrardan söylüyorum, ben TCL konusunda herhangi bir bilgim olduğunu iddia etmiyorum, ancak bu konuda bilgisi olupta yardım etmeye üşenen insanların yapmadığı şeyi yapmaya çalışıyorum...

Tekrardan sorularım olduğu zaman yazarım, çözüm buldukcada açıklamaya çalışacağımdan şüpheniz olmasın.

Bu arada okutma kodunu @[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] arkadaşımızın verdiği sayfadan bulmuştum, kendisinede teşekkür ediyorum yardımları için

Lipton 08 Nisan 2014 10:05

Cevap: Kodlama hakkında sorular [TCL]
 
xwerwoodx :p

KTeknoloji 14 Haziran 2014 08:35

Cevap: Kodlama hakkında sorular [TCL]
 
Eggdrop bota topic nasıl attırırım?

saywhat 14 Haziran 2014 10:46

Cevap: Kodlama hakkında sorular [TCL]
 
açıklama kodun içinde -> [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]

saywhat 14 Haziran 2014 13:05

Cevap: Kodlama hakkında sorular [TCL]
 
yuf ossun bana... markete gitmem lazım diye acele acele yazayım derken ayar kısımlarında "set .." 'leri eklememişim. sadece isimleri girmişim .gittim geldim başka birşey için yeniden sublime editörü açınca gördüm "set .." yazmadığımı ....pfff
yukardakini yok sayın . sildim zaten hesabımdan....

Kod:

# Komuta erişimi olacak kişilerin eggdrop kullanıcı flagları ne olmalı
set tpkflags "mnoa"

# kodu harekete geçirecek komut ne olmalı
set tpkkmt "topik"

# komut başına gelecek sembol/işaret/trigger ne olmalı
set tpktrig "!"

# topic komutu gönderimi için hangi service ile muhatap olunmalı
set tpkserv "ChanServ"

# hangi kanal üstünde kullanılacaksa botunuza bağlanın : .chanset #kanal +topik
setudef flag topik

bind pub - $tpktrig$tpkkmt top:topik

proc top:topik {nick uhost hand chan text} {
  if {![channel get $chan topik]} { return }
      set tpkmsj [join [lrange [split $text] 0 end]]
    # aşağıdaki  if {![isop $nick $chan]} { satırları aktif edilecekse
    #  yani kanal opları kullansın* seçilecekse bu if {![matchattr [nick2hand $nick] $::tpkflags $chan]} {
    # ile başlayan satırların başına # ekleyerek pasif kılmalısınız.
    # aksi halde kanalda op olsalar dahi botun kullanıcı listesinde istenen flaglarla
    # ekli değilselerde çalışmayacaktır. yani ikisi arasında seçim yapmalısınız.
    # ya kullanıcı flagları ya kanal yetkileri...şu haliyle kullanıcı flaglarına bakar...
  if {![matchattr [nick2hand $nick] $::tpkflags $chan]} {
          puthelp "notice $nick :\00312Bu komutu kullanmaya yetkili değilsiniz. \
      Komuta erişim için $::tpkflags eggdrop kullanıcı flaglarına sahip olmalısınız.\003"
      return 0
      }
    # kanal oplarının kullanımına açmak için alttaki satırların başlarındaki # 'ları kaldırın.
        # oplar dışında halfop ve voicelar içinde kullansın isteniyorsa if {![isop $nick $chan]} {
    # satırını if {![isop $nick $chan] || ![ishalfop $nick $chan] || ![isvoice $nick $chan]} {
    # olarak değişmeniz gerekir.
       
  #if {![isop $nick $chan]} {
  #    puthelp "notice $nick :\00312Bu komutu kullanmaya yetkili değilsiniz. \
  #  $chan kanalında en az Op ( @ ) olmalısınız...\003"
  #      return 0
  #  }
 
  if {[llength $tpkmsj] < "1"} {
          puthelp "notice $nick :\002Kullanım şekli\002 : \00304$::lastbind <kanal topiği>\003"
      return
    }
     
  if {![botisop $chan]} {
          puthelp "notice $nick :$chan \00312kanalında yetkim yok...\003"
      return 0
    }
     
    putserv "privmsg $::tpkserv :topic $chan $tpkmsj"
    puthelp "notice $nick :$chan \00312kanalının Topiği\003 $tpkmsj \00312olarak değiştirildi...\003"
}
   
putlog "ok..."


KTeknoloji 14 Haziran 2014 18:44

Cevap: Kodlama hakkında sorular [TCL]
 
Birde Bunu Musteriservde Calıstırmak istiyorum !on !offline komutunda yardımcı olabilirmisiniz acaba sizi cok yoruyorum


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

Powered by vBulletin® Version 3.8.8 Beta 3
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
Copyright ©2004 - 2024 IRCForumlari.Net