Eggdrop

İlk Eggdrop Tcl Scriptiniz: Sıfırdan Basit Bir Komut Botu Yazmak

· Güncelleme: · 6 dk okuma

İlk Eggdrop Tcl Scriptiniz: Sıfırdan Basit Bir Komut Botu Yazmak
İçindekiler
  1. Ne Yazacağız?
  2. Tcl'in Temelleri: Beş Dakikada
  3. 1. Dosyayı Oluşturun
  4. 2. Ayarları Tanımlayın
  5. 3. Kanal Bayrağı Tanımlayın
  6. 4. Komutları Bağlayın
  7. 5. Prosedürleri Yazın
  8. 6. Scripti Yükleyin ve Açın
  9. Kullanıcı Girdisini İşlemek
  10. Flood'a Karşı Basit Önlem
  11. Test ve Hata Ayıklama
  12. Sonraki Adımlar
  13. Neden Kendi Scriptinizi Yazmalısınız?
  14. Kod Yazım Alışkanlıkları
  15. Scripti Paylaşmak
  16. Sonuç

Hazır scriptleri kullanmak güzeldir, ama kendi scriptinizi yazmak bambaşka bir keyiftir. Botunuz tam olarak istediğiniz gibi davranır ve Eggdrop'un nasıl çalıştığını gerçekten anlamaya başlarsınız. Bu rehberde Eggdrop Tcl script yazma sürecini, hiç Tcl bilmeyen biri için sıfırdan küçük ama işe yarar bir script üzerinden anlatıyoruz.

Ne Yazacağız?

Örnek scriptimiz bir kanal için üç komut sunacak:

  1. !kurallar: Kanal kurallarını gösterir.
  2. !zar: 1 ile 6 arasında rastgele bir sayı atar.
  3. !saat: Botun bulunduğu sunucunun saatini söyler.

Ayrıca script yalnızca bizim seçtiğimiz kanallarda çalışacak.

Tcl'in Temelleri: Beş Dakikada

Scripti yazmadan önce bilmeniz gereken birkaç temel kural:

  • Komutlar boşlukla ayrılır: set ad "Ayse" komutu ad değişkenine "Ayse" değerini atar.
  • Değişkenler $ ile okunur: $ad ifadesi "Ayse" değerini verir.
  • Köşeli parantez komut çalıştırır: [rand 6] ifadesi rand komutunu çalıştırıp sonucunu yerine koyar.
  • Süslü parantez metni olduğu gibi tutar: Prosedür gövdeleri ve kod blokları süslü parantez içinde yazılır.
  • Çift tırnak içinde değişkenler açılır: "Merhaba $ad" ifadesi "Merhaba Ayse" olur.

Değişkenler ve listeler hakkında daha fazlası için Tcl değişkenler ve listeler yazımıza bakın.

1. Dosyayı Oluşturun

Botunuzun scripts klasöründe kanalkomut.tcl adlı bir dosya oluşturun. İlk satırlara scriptin ne yaptığını açıklayan yorumlar yazın:

# kanalkomut.tcl - Basit kanal komutlari
# Kullanim: .chanset #kanal +kanalkomut

Yorum yazmak iyi bir alışkanlıktır; birkaç ay sonra scripti açtığınızda ne yaptığını hemen hatırlarsınız.

2. Ayarları Tanımlayın

Kullanıcıların değiştirebileceği değerleri scriptin başında toplamak, scriptin bakımını kolaylaştırır:

set kk(kurallar) "1) Saygili olun 2) Reklam yasak 3) Flood yapmayin"
set kk(onek) "!"

kk adlı bir dizi (array) kullanarak bütün ayarları tek bir isim altında topladık. Bu sayede başka scriptlerin değişkenleriyle çakışma riski azalır.

3. Kanal Bayrağı Tanımlayın

Scriptin yalnızca seçtiğimiz kanallarda çalışması için kendi chanset bayrağımızı oluşturalım:

setudef flag kanalkomut

Bu satır sayesinde partyline'da .chanset #kanal +kanalkomut yazarak scripti istediğimiz kanalda açabiliriz. Chanset hakkında bilgi için chanset kanal ayarları yazımıza bakın.

4. Komutları Bağlayın

bind pub - !kurallar kk_kurallar
bind pub - !zar kk_zar
bind pub - !saat kk_saat

Her komut için bir bind pub satırı yazdık. Bind'in yapısını Tcl bind komutları yazımızda ayrıntılı anlattık.

5. Prosedürleri Yazın

proc kk_kurallar {nick uhost hand chan text} {
  global kk
  if {![channel get $chan kanalkomut]} { return 0 }
  puthelp "PRIVMSG $chan :$kk(kurallar)"
  return 1
}

proc kk_zar {nick uhost hand chan text} {
  if {![channel get $chan kanalkomut]} { return 0 }
  set sayi [expr {[rand 6] + 1}]
  puthelp "PRIVMSG $chan :$nick zar atti: $sayi"
  return 1
}

proc kk_saat {nick uhost hand chan text} {
  if {![channel get $chan kanalkomut]} { return 0 }
  set saat [clock format [clock seconds] -format "%H:%M"]
  puthelp "PRIVMSG $chan :Sunucu saati: $saat"
  return 1
}

Satır satır inceleyelim:

  • global kk: Prosedür içinde dışarıda tanımlanan kk dizisini kullanabilmek için gereklidir. Tcl'de prosedürler kendi değişken alanlarına sahiptir.
  • channel get $chan kanalkomut: Kanalda bizim bayrağımızın açık olup olmadığını kontrol eder. Kapalıysa prosedür hiçbir şey yapmadan çıkar.
  • rand 6: 0 ile 5 arasında rastgele bir sayı verir; 1 ekleyerek 1-6 aralığına taşıdık.
  • clock format: Zamanı istediğimiz biçimde yazdırır.
  • puthelp: Mesajı düşük öncelikli kuyrukla gönderir; botun flood'a düşmesini önler.

6. Scripti Yükleyin ve Açın

eggdrop.conf'un sonuna ekleyin:

source scripts/kanalkomut.tcl

Partyline'da:

.rehash
.chanset #kanal +kanalkomut

Şimdi kanalda !zar yazarak deneyin.

Kullanıcı Girdisini İşlemek

Komutlara parametre eklemek de kolaydır. Örneğin !selamla Ayse yazıldığında Ayse'yi selamlayan bir komut:

bind pub - !selamla kk_selamla

proc kk_selamla {nick uhost hand chan text} {
  if {![channel get $chan kanalkomut]} { return 0 }
  set hedef [lindex [split $text] 0]
  if {$hedef eq ""} {
    puthelp "PRIVMSG $chan :Kullanim: !selamla nick"
    return 0
  }
  puthelp "PRIVMSG $chan :$nick, $hedef kisisine selam gonderiyor!"
  return 1
}

split metni kelimelere böler, lindex ilk kelimeyi alır. Kullanıcıdan gelen metni her zaman önce split ile listeye çevirip öyle işlemek, özel karakterlerin beklenmedik sorunlara yol açmasını önler. Kullanıcı girdisini asla eval veya köşeli parantezle doğrudan çalıştırmayın; bu, uzaktan kod çalıştırma açığına yol açar.

Flood'a Karşı Basit Önlem

Kalabalık bir kanalda biri !zar komutunu art arda yüzlerce kez kullanırsa bot da yüzlerce mesaj gönderir. Basit bir zaman kontrolü ekleyerek bunu önleyebilirsiniz: Her kullanıcının en son komutu ne zaman kullandığını bir dizide saklayın ve birkaç saniyeden kısa aralıklarla gelen istekleri yok sayın. Zamanlayıcılarla ilgili teknikler için timer ve utimer yazımıza bakın.

Test ve Hata Ayıklama

  • Script yüklenirken hata alırsanız partyline'daki mesaj size satır ve sebep hakkında ipucu verir.
  • Komut çalışmıyorsa .binds pub ile bind'in kayıtlı olup olmadığını kontrol edin.
  • Kanal bayrağını açmayı unutmuş olabilirsiniz: .chaninfo #kanal çıktısında +kanalkomut görünmelidir.
  • Prosedürün içine geçici putlog satırları ekleyerek hangi noktaya kadar çalıştığını görebilirsiniz.

Sonraki Adımlar

Bu küçük script, Eggdrop script yazmanın bütün temel parçalarını içeriyor: ayarlar, kanal bayrağı, bind'ler, prosedürler ve kullanıcı girdisi. Bundan sonra yapabilecekleriniz:

  1. Komutları yalnızca op'lara açmak için bayrak kısıtlaması eklemek,
  2. Verileri bir dosyada saklamak,
  3. Zamanlanmış duyurular eklemek,
  4. Kullanıcı girişlerinde karşılama mesajı göstermek.

Neden Kendi Scriptinizi Yazmalısınız?

İnternette binlerce hazır Eggdrop scripti bulunur ve çoğu işinizi görür. Ancak hazır scriptlerin önemli bir kısmı yıllar önce yazılmıştır, bakımı yapılmaz ve güncel Eggdrop sürümlerinde uyarı veya hata üretebilir. Bazıları ihtiyacınızdan çok daha fazlasını yapar ve botunuza gereksiz yük bindirir. Kendi küçük scriptinizi yazdığınızda ise kodun her satırını bilirsiniz; bir sorun çıktığında nereye bakacağınızı anında anlarsınız. Ayrıca güvenlik açısından da büyük bir avantajdır: Tanımadığınız birinin yazdığı ve kullanıcı girdisini nasıl işlediğini bilmediğiniz bir kodu botunuzda çalıştırmak yerine, kendi kontrolünüzdeki temiz bir kodu kullanırsınız.

Kod Yazım Alışkanlıkları

Script yazarken baştan edinilen birkaç alışkanlık uzun vadede çok zaman kazandırır. Girintileri tutarlı tutun; iki veya dört boşluk fark etmez ama her yerde aynı olsun. Prosedürlerinizin adlarına scriptinize özgü bir önek ekleyin; bu örnekte kk_ kullandık. Her prosedürün başına ne yaptığını anlatan tek satırlık bir yorum yazın. Ayarları dosyanın başında toplayın ki scripti kullanan biri kodu okumadan değiştirebilsin. Son olarak scriptinizin başına sürüm numarası ve son değişiklik tarihini not edin; scripti başkalarıyla paylaştığınızda hangi sürümün kullanıldığını takip etmek kolaylaşır.

Scripti Paylaşmak

Scriptiniz işe yaradığında onu başkalarıyla paylaşmak isteyebilirsiniz. Paylaşmadan önce kişisel bilgileri, kanal adlarını ve parolaları kodun içinden çıkarın; bunları ayar değişkenlerine taşıyın. Kısa bir kullanım açıklaması ve gereken Eggdrop sürümünü belirtin. Bir lisans seçmek de başkalarının kodunuzu nasıl kullanabileceğini netleştirir.

Sonuç

İlk Tcl scriptinizi yazmak, Eggdrop'un gerçek gücünü keşfetmenin başlangıcıdır. Küçük başlayın, her adımı test edin, kullanıcı girdisini güvenle işleyin ve kodunuzu yorumlarla açıklayın. Tcl'in veri yapılarını daha iyi anlamak için sıradaki rehberimiz Tcl değişkenler ve listeler.

IRC sorunun mu var? Kanalda birlikte çözelim.

💬 Kanala Bağlan

Sıkça Sorulan Sorular

Tcl öğrenmek zor mu?

Hayır. Tcl'in söz dizimi küçük ve tutarlıdır. Eggdrop için gereken temel bilgiler birkaç günde öğrenilebilir.

Scriptimi test etmek için ayrı bir bota ihtiyacım var mı?

Zorunlu değil ama önerilir. Hatalı bir script canlı kanaldaki botun beklenmedik davranmasına yol açabilir.

Scriptim hata verdiğinde nereye bakmalıyım?

Partyline'daki Tcl hata mesajlarına ve log dosyasına bakın. Hata mesajı hangi prosedürde sorun olduğunu gösterir.