Eggdrop

Eggdrop Tcl bind Komutları: Botunuzu Olaylara Bağlamanın Temeli

· Güncelleme: · 5 dk okuma

Eggdrop Tcl bind Komutları: Botunuzu Olaylara Bağlamanın Temeli
İçindekiler
  1. bind Komutunun Yapısı
  2. Prosedür Parametreleri
  3. pub ve pubm: Kanal Mesajları
  4. msg: Özel Mesajlar
  5. join, part, sign: Giriş ve Çıkışlar
  6. time ve cron: Zamanlanmış İşler
  7. dcc: Partyline Komutları
  8. Bayrak Kısıtlamaları
  9. Çıktı Komutları: putserv, puthelp, putquick
  10. Bind'leri Görmek ve Kaldırmak
  11. Gerçek Bir Senaryo: Basit Bir Komut Seti
  12. Sık Yapılan Hatalar
  13. Bind'leri Düzenli Tutmak
  14. Sonuç

Bir Eggdrop scriptinin nasıl çalıştığını anlamak istiyorsanız önce bind komutunu anlamanız gerekir. Bind, botu belirli olaylara bağlayan köprüdür: "Kanalda biri !selam yazdığında şu prosedürü çalıştır", "Biri kanala girdiğinde şunu yap", "Her saat başı şu mesajı gönder" gibi. Bu rehberde Eggdrop bind komutunun yapısını ve en sık kullanılan bind türlerini örneklerle anlatıyoruz.

bind Komutunun Yapısı

bind tür bayraklar tetikleyici prosedür
  • tür: Hangi olaya bağlanılacağı (pub, msg, join, time...).
  • bayraklar: Olayı kimlerin tetikleyebileceği. - herkes anlamına gelir.
  • tetikleyici: Komut adı, maske veya zaman kalıbı; türe göre değişir.
  • prosedür: Olay gerçekleştiğinde çağrılacak Tcl prosedürünün adı.

Basit bir örnek:

bind pub - !selam pub_selam

proc pub_selam {nick uhost hand chan text} {
  putserv "PRIVMSG $chan :Merhaba $nick!"
}

Kanalda biri !selam yazdığında bot "Merhaba Ayse!" diye cevap verir. Bu scripti yüklemeyi Tcl script yükleme yazımızda anlattık.

Prosedür Parametreleri

Her bind türü, prosedüre belirli sırada belirli parametreler gönderir. Prosedürünüz bu parametreleri doğru sayıda kabul etmelidir; aksi hâlde "wrong # args" hatası alırsınız.

TürProsedüre gönderilen parametreler
pubnick uhost hand chan text
pubmnick uhost hand chan text
msgnick uhost hand text
msgmnick uhost hand text
joinnick uhost hand chan
partnick uhost hand chan msg
signnick uhost hand chan reason
nicknick uhost hand chan newnick
kicknick uhost hand chan target reason
modenick uhost hand chan mode target
timeminute hour day month year
dcchand idx text

Parametrelerin anlamları:

  • nick: Olayı tetikleyen kişinin nicki.
  • uhost: kullanıcı@host bilgisi.
  • hand: Kullanıcının bottaki kayıt adı (handle). Tanınmıyorsa * olur.
  • chan: Olayın gerçekleştiği kanal.
  • text: Mesajın komuttan sonraki kısmı.
  • idx: Partyline bağlantısının kimlik numarası.

Parametre listesi Eggdrop'un doc/tcl-commands.doc belgesinde her bind türü için ayrıntılı olarak verilir. Script yazarken bu belgeyi açık tutmanızı öneririz.

pub ve pubm: Kanal Mesajları

pub, kanal mesajının ilk kelimesi tetikleyiciyle eşleştiğinde çalışır:

bind pub - !kurallar pub_kurallar

pubm ise mesajın tamamını, kanal adıyla birlikte bir maskeyle karşılaştırır:

bind pubm - "#kanal *merhaba*" pubm_merhaba

Bu örnek, #kanal'da içinde "merhaba" geçen her mesajda tetiklenir. Maskenin başındaki * ise bütün kanalları kapsar. pubm, kelime filtreleri ve otomatik cevaplar için kullanışlıdır ama her mesajda çalıştığı için dikkatli kullanılmalıdır.

msg: Özel Mesajlar

bind msg - yardim msg_yardim

proc msg_yardim {nick uhost hand text} {
  puthelp "PRIVMSG $nick :Komutlar: !kurallar, !seen nick"
}

Kullanıcı bota /msg Bot yardim yazdığında çalışır.

join, part, sign: Giriş ve Çıkışlar

bind join - "#kanal *" join_karsila

proc join_karsila {nick uhost hand chan} {
  if {[isbotnick $nick]} { return }
  puthelp "NOTICE $nick :#kanal'a hos geldin!"
}

join ve part bind'lerinde tetikleyici "#kanal nick!user@host" biçiminde bir maskedir. "* *" bütün kanallardaki bütün girişleri yakalar. isbotnick kontrolü, botun kendi girişinde tetiklenmemesini sağlar. Karşılama scriptleri için karşılama scripti yazımıza bakın.

time ve cron: Zamanlanmış İşler

time bind'i dakika, saat, gün, ay ve yıl alanlarından oluşan bir maskeyle çalışır:

bind time - "00 * * * *" saatbasi_duyuru

Bu bind her saatin başında (dakika 00) tetiklenir. Güncel Eggdrop sürümleri ayrıca Unix crontab biçimini kullanan cron bind türünü de destekler; bu, karmaşık zamanlamaları yazmayı kolaylaştırır. Kısa süreli gecikmeler için ise bind yerine timer kullanılır; ayrıntılar timer ve utimer yazımızda.

dcc: Partyline Komutları

bind dcc m duyuru dcc_duyuru

proc dcc_duyuru {hand idx text} {
  foreach chan [channels] {
    puthelp "PRIVMSG $chan :Duyuru: $text"
  }
  putdcc $idx "Duyuru gonderildi."
  return 1
}

Bu örnek, partyline'a .duyuru komutunu ekler. m bayrağı, komutu yalnızca master yetkisine sahip kullanıcıların kullanabileceğini belirtir. return 1, komutun partyline log'una kaydedilmesini sağlar.

Bayrak Kısıtlamaları

Bind'deki bayrak alanı, olayı kimlerin tetikleyebileceğini belirler:

YazımAnlamı
- veya `-\-`Herkes
oGlobal op bayrağı olanlar
`-\o`Kanal op bayrağı olanlar
`o\o`Global veya kanal op bayrağı olanlar
nYalnızca sahipler

Bayraklar hakkında ayrıntılı bilgi için kullanıcı bayrakları yazımıza bakın. Prosedür içinde daha ayrıntılı kontrol için matchattr komutu kullanılır:

if {![matchattr $hand o|o $chan]} { return }

Çıktı Komutları: putserv, puthelp, putquick

Bot IRC'ye mesaj gönderirken üç farklı kuyruk kullanır:

  • putquick: En yüksek öncelik; mod değişiklikleri gibi acil işler için.
  • putserv: Normal öncelik; genel mesajlar için.
  • puthelp: Düşük öncelik; yardım metinleri gibi acil olmayan mesajlar için.

Bu kuyruklar, botun sunucuya çok hızlı mesaj gönderip "Excess Flood" ile düşmesini önler. Kalabalık kanallarda uzun çıktılar için puthelp kullanmak iyi bir alışkanlıktır.

Bind'leri Görmek ve Kaldırmak

.binds
.binds pub

Bir bind'i kaldırmak için unbind komutu kullanılır; bind ile aynı parametreleri alır:

unbind pub - !selam pub_selam

Gerçek Bir Senaryo: Basit Bir Komut Seti

Bir kanal için üç komut istediğinizi düşünelim: !kurallar herkes tarafından kullanılabilsin ve kuralları göstersin, !duyur yalnızca kanal op'ları tarafından kullanılsın ve verilen metni kanal konusuna eklesin, botun sahibine özel mesajla durum yazıldığında ise kanaldaki kişi sayısı bildirilsin. Bu üç ihtiyaç; bir pub -, bir pub -|o ve bir msg n bind'iyle karşılanır. Her biri kendi küçük prosedürünü çağırır. Bu şekilde görevleri küçük, tek işe odaklı prosedürlere bölmek, scriptinizi hem okunabilir hem de hata ayıklaması kolay hâle getirir. Bir komut bozulduğunda yalnızca onun prosedürüne bakmanız yeterli olur.

Sık Yapılan Hatalar

  • Parametre sayısı yanlış: pub prosedürü beş parametre almalıdır; dört yazarsanız hata alırsınız.
  • Tetikleyici büyük-küçük harf: pub tetikleyicileri genellikle büyük-küçük harf duyarsızdır; maskeli türlerde dikkatli olun.
  • Kullanıcı metnini güvensiz kullanmak: text parametresini eval, exec veya köşeli parantezli ifadelerde doğrudan kullanmayın.
  • Bot kendi olayını tetikliyor: join gibi bind'lerde isbotnick kontrolü ekleyin.

Bind'leri Düzenli Tutmak

Script büyüdükçe bind satırları dosyanın farklı yerlerine dağılabilir. İyi bir alışkanlık, bütün bind'leri dosyanın başında, ayarların hemen altında bir arada toplamaktır. Böylece scripti açan biri, scriptin hangi olaylara tepki verdiğini tek bakışta görür. Prosedür adlarının başına scriptinize özgü kısa bir önek eklemek de başka scriptlerle isim çakışmasını önler. İki farklı script aynı isimde bir prosedür tanımlarsa sonra yüklenen öncekinin üzerine yazar ve ilk script sessizce bozulur; bu tür hataları bulmak saatler alabilir.

Sonuç

bind komutu, Eggdrop scriptlerinin temel yapı taşıdır. Hangi olayın hangi prosedürü çağıracağını tanımlar, bayraklarla kimin tetikleyebileceğini sınırlar. Bind türlerini ve parametrelerini öğrendikten sonra kendi komutlarınızı yazmak çok kolaylaşır. Hemen uygulamaya geçmek için ilk Tcl scriptiniz rehberimize göz atın.

IRC sorunun mu var? Kanalda birlikte çözelim.

💬 Kanala Bağlan

Sıkça Sorulan Sorular

bind komutu ne işe yarar?

Belirli bir olay gerçekleştiğinde (bir mesaj, bir giriş, bir zaman) hangi Tcl prosedürünün çalışacağını tanımlar.

pub ile pubm arasındaki fark nedir?

pub, mesajın ilk kelimesi bir komutla eşleştiğinde tetiklenir. pubm ise mesajın tamamını bir maskeyle karşılaştırır ve joker karakter destekler.

Bind'i yalnızca op'ların kullanması için nasıl kısıtlarım?

bind komutundaki bayrak alanına o veya -|o gibi bir değer yazarak yalnızca ilgili bayrağa sahip kullanıcıların tetiklemesini sağlayabilirsiniz.