Eggdrop timer ve utimer: Zamanlanmış ve Gecikmeli İşler
İçindekiler
- timer ve utimer Arasındaki Fark
- Basit Bir Gecikme
- Tekrarlayan Görevler
- Zamanlayıcıları Listelemek ve İptal Etmek
- Rehash Tuzağı: Çift Zamanlayıcı
- Flood Koruması İçin utimer
- Belirli Saatlerde İş: time ve cron Bind'leri
- timer mı, time Bind'i mi?
- Gerçek Bir Senaryo: Hatırlatıcı Komutu
- Bot Yeniden Başlarsa
- Sık Yapılan Hatalar
- Zamanlayıcıları Belgelemek
- Sonuç
Bazı işler hemen değil, belirli bir süre sonra yapılmalıdır: Bir kullanıcıya verilen geçici voice'u beş dakika sonra almak, bir duyuruyu her yarım saatte bir tekrarlamak, flood koruması için kullanıcının komut kullanımını birkaç saniye engellemek gibi. Eggdrop'ta bu işler timer ve utimer komutlarıyla yapılır. Bu rehberde Eggdrop timer kullanımını ve sık karşılaşılan tuzakları anlatıyoruz.
timer ve utimer Arasındaki Fark
| Komut | Birim | Örnek kullanım |
|---|---|---|
timer | Dakika | Yarım saatte bir duyuru, 10 dakikada bir kayıt |
utimer | Saniye | 5 saniyelik flood engeli, kısa gecikmeli op |
Her ikisi de aynı söz dizimini kullanır:
timer dakika komut
utimer saniye komut
Komut, süre dolduğunda çalıştırılacak Tcl ifadesidir. Her iki komut da bir zamanlayıcı kimliği döndürür; bu kimlik zamanlayıcıyı iptal etmek için kullanılır.
Basit Bir Gecikme
Bir kullanıcıya geçici voice verip bir dakika sonra almak:
proc gecici_voice {chan nick} {
pushmode $chan +v $nick
timer 1 [list pushmode $chan -v $nick]
}
Burada önemli bir ayrıntı var: Zamanlayıcıya verilen komutu list ile oluşturduk. Bu, değişkenlerin değerlerinin doğru şekilde saklanmasını ve nick içindeki özel karakterlerin (köşeli parantez, süslü parantez gibi) beklenmedik şekilde çalıştırılmamasını sağlar. Kullanıcıdan gelen bir değeri zamanlayıcı komutuna çift tırnak içinde doğrudan yerleştirmek, güvenlik açığına yol açabilir.
Tekrarlayan Görevler
timer ve utimer varsayılan olarak bir kez çalışır. Tekrarlayan bir görev için iki yöntem vardır.
1. Kendini yeniden kuran prosedür:
proc duyuru_dongusu {} {
puthelp "PRIVMSG #kanal :Yardim icin !yardim yazin."
timer 30 duyuru_dongusu
}
Prosedür her çalıştığında kendisini 30 dakika sonrası için tekrar kurar.
2. Tekrar sayısı parametresi: Güncel Eggdrop sürümlerinde timer ve utimer, kaç kez tekrarlanacağını belirten ek bir parametre alabilir; sıfır verildiğinde sonsuza kadar tekrarlanır. Kullandığınız sürümün tcl-commands.doc belgesinde bu parametrenin varlığını kontrol edin.
Zamanlayıcıları Listelemek ve İptal Etmek
timers
utimers
killtimer timer123
killutimer timer456
timers ve utimers aktif zamanlayıcıları listeler; her biri için kalan süre, çalışacak komut ve kimlik gösterilir. killtimer ve killutimer ise belirtilen zamanlayıcıyı iptal eder. Zamanlayıcıyı oluştururken dönen kimliği bir değişkende saklamak, onu daha sonra iptal etmeyi kolaylaştırır.
Rehash Tuzağı: Çift Zamanlayıcı
En yaygın timer hatası şudur: Script yüklenirken bir döngü zamanlayıcısı başlatılır. Her .rehash scripti yeniden yükler ve yeni bir zamanlayıcı başlatır; eski zamanlayıcı ise çalışmaya devam eder. Birkaç rehash sonra duyurunuz aynı anda üç, dört kez gönderilmeye başlar.
Çözüm, zamanlayıcıyı başlatmadan önce aynı komutla çalışan bir zamanlayıcının olup olmadığını kontrol etmektir:
proc timer_var_mi {komut} {
foreach t [timers] {
if {[lindex $t 1] eq $komut} { return 1 }
}
return 0
}
if {![timer_var_mi duyuru_dongusu]} {
timer 30 duyuru_dongusu
}
Eggdrop'la gelen yardımcı scriptlerde bu iş için hazır fonksiyonlar da bulunabilir. Bu kontrol, scriptinizin rehash'e karşı dayanıklı olmasını sağlar.
Flood Koruması İçin utimer
Bir komutun aynı kullanıcı tarafından kısa sürede tekrar tekrar kullanılmasını engellemek için utimer pratik bir araçtır:
proc komut_kilidi {nick} {
global kilit
set n [string tolower $nick]
if {[info exists kilit($n)]} { return 1 }
set kilit($n) 1
utimer 10 [list unset -nocomplain kilit($n)]
return 0
}
Komut prosedürünün başında if {[komut_kilidi $nick]} { return 0 } satırını eklediğinizde aynı kullanıcı komutu 10 saniyede yalnızca bir kez kullanabilir. Dizilerin kullanımı için Tcl değişkenler ve listeler yazımıza bakın.
Belirli Saatlerde İş: time ve cron Bind'leri
"Her gün saat 09:00'da günaydın mesajı gönder" gibi bir işi timer ile yapmak zahmetlidir. Bunun için time bind'i daha uygundur:
bind time - "00 09 * * *" gunaydin
proc gunaydin {dakika saat gun ay yil} {
puthelp "PRIVMSG #kanal :Gunaydin herkese!"
}
time bind'inin maskesi dakika, saat, gün, ay ve yıl alanlarından oluşur. Güncel sürümlerde cron bind'i, Unix crontab biçimini kullanarak "hafta içi her gün 09:00" gibi zamanlamaları daha kolay yazmanıza izin verir. Bind türleri için Tcl bind komutları yazımıza bakın.
timer mı, time Bind'i mi?
| İhtiyaç | Doğru araç |
|---|---|
| X saniye/dakika sonra bir kez | utimer / timer |
| Her X dakikada bir | timer döngüsü veya cron |
| Her gün belirli saatte | time veya cron bind'i |
| Kısa süreli kilit veya bekleme | utimer |
Gerçek Bir Senaryo: Hatırlatıcı Komutu
Kanal kullanıcılarının !hatirlat 15 Toplanti basliyor yazarak 15 dakika sonra kendilerine hatırlatma alabildiği bir komut düşünelim. Prosedür, ilk kelimeyi dakika olarak alır ve sayı olup olmadığını kontrol eder, makul bir üst sınır (örneğin 24 saat) uygular, ardından timer ile gecikmeli bir NOTICE mesajı kurar. Komut list ile oluşturulduğu için kullanıcının yazdığı metin güvenli şekilde saklanır. Bir kullanıcının aynı anda kurabileceği hatırlatma sayısını sınırlamak ve bot yeniden başlatıldığında zamanlayıcıların kaybolacağını kullanıcılara belirtmek, bu komutu hem kullanışlı hem de güvenli kılar.
Bot Yeniden Başlarsa
Zamanlayıcılar bellekte tutulur; bot .restart veya çökme nedeniyle yeniden başladığında hepsi kaybolur. Kalıcı olması gereken zamanlanmış işleri (örneğin süreli banlar) bir dosyada saklayıp bot açılırken yeniden kurmanız gerekir. Eggdrop'un kendi süreli banları bu işi zaten kendisi yapar.
Sık Yapılan Hatalar
Zamanlayıcılarla ilgili hataların çoğu birkaç başlık altında toplanır. Komutu çift tırnakla oluşturup değişkenleri hemen açmak yerine, süre dolduğunda açılmasını beklemek bir hatadır; değişken o arada değişmiş olabilir. Bir zamanlayıcıyı iptal etmek istediğinizde kimliğini saklamamış olmak da sık görülür; bu durumda timers çıktısını tarayıp doğru kaydı bulmak gerekir. Çok kısa aralıklı tekrarlar, örneğin her saniye çalışan bir utimer, botun gereksiz yere işlemci kullanmasına yol açar; mümkünse olaya dayalı bind'leri tercih edin. Son olarak zamanlayıcının çalıştırdığı prosedürün içinde hata oluşursa döngü kırılır ve zamanlayıcı kendini yeniden kuramaz; bu yüzden döngü prosedürlerinde yeniden kurma satırını en başa koymak veya hata yakalama eklemek dayanıklılığı artırır.
Zamanlayıcıları Belgelemek
Script büyüdükçe kaç zamanlayıcının çalıştığını takip etmek zorlaşır. Her zamanlayıcının neden var olduğunu, kaç dakikada bir çalıştığını ve hangi prosedürü çağırdığını scriptin başındaki yorumlara yazmak iyi bir alışkanlıktır. Partyline'da .tcl timers komutuyla aktif zamanlayıcıları görmek de canlı bir botta neler olup bittiğini anlamanın en hızlı yoludur.
Sonuç
timer ve utimer, Eggdrop scriptlerine zaman boyutu kazandırır. Komutları list ile oluşturun, rehash sonrası çift zamanlayıcıya karşı kontrol ekleyin, belirli saatler için time veya cron bind'ini tercih edin ve kalıcı işleri dosyada saklayın. Birden fazla botu birlikte çalıştırmak için sıradaki rehberimiz botnet kurulumu.
IRC sorunun mu var? Kanalda birlikte çözelim.
💬 Kanala BağlanSıkça Sorulan Sorular
timer ile utimer arasındaki fark nedir?
timer dakika cinsinden, utimer saniye cinsinden gecikme ile çalışır.
Rehash sonrası mesajlarım neden iki kez gönderiliyor?
Script her yüklendiğinde yeni bir zamanlayıcı başlatıyor olabilir. Zamanlayıcıyı başlatmadan önce aynı zamanlayıcının çalışıp çalışmadığını kontrol etmelisiniz.
Belirli bir saatte iş yaptırmak için timer mı kullanmalıyım?
Belirli saatlerde çalışacak işler için time veya cron bind'i daha uygundur. timer ve utimer belirli bir gecikmeden sonra çalışacak işler içindir.


