mIRC Script

mIRC while Döngüsü: Tekrarlayan İşlemleri Otomatikleştirmek

· Güncelleme: · 5 dk okuma

mIRC while Döngüsü: Tekrarlayan İşlemleri Otomatikleştirmek
İçindekiler
  1. Temel Yapı
  2. Kanallar Üzerinde Gezinmek
  3. Kullanıcı Listesi Üzerinde Gezinmek
  4. Metin Kelimelerini İşlemek
  5. Geriye Doğru Döngü
  6. Döngü Kontrolü: break ve continue
  7. İç İçe Döngüler
  8. Performans ve mIRC'in Donması
  9. Sonsuz Döngüden Korunmak
  10. Gerçek Bir Senaryo
  11. Döngü Yerine Daha İyi Yollar
  12. Döngülerde Okunabilirlik
  13. Sonuç

Scriptlerde sıkça aynı işi birden fazla kez yapmak gerekir: Bütün kanallara bir mesaj göndermek, kullanıcı listesindeki herkesi kontrol etmek, bir metnin kelimelerini tek tek işlemek, bir dosyadaki satırları okumak. mIRC while döngüsü, bu tekrarları yapmanın tek yoludur; mIRC'te başka döngü yapısı bulunmaz. Bu rehberde döngüleri doğru ve güvenli kullanmayı anlatıyoruz.

Temel Yapı

var %i = 1
while (%i <= 5) {
  echo -a Satir %i
  inc %i
}

Döngünün üç parçası vardır: sayacın başlangıç değeri, devam koşulu ve sayacın artırılması. Üçünden biri eksik veya yanlışsa döngü ya hiç çalışmaz ya da sonsuza kadar sürer.

Sayacı artırmayı unutmak, mIRC scripting'te en sık yapılan hatalardan biridir ve sonsuz döngüye yol açar. mIRC bu durumda genellikle bir uyarı göstererek döngüyü durdurmanıza imkân verir, ama yine de dikkatli olmak gerekir.

Kanallar Üzerinde Gezinmek

alias tumkanallar {
  var %i = 1
  while (%i <= $chan(0)) {
    msg $chan(%i) $1-
    inc %i
  }
}

$chan(0) içinde bulunduğunuz kanal sayısını, $chan(%i) ise sıradaki kanalın adını verir. Bu kalıp, mIRC'teki bütün liste identifier'larında aynıdır: Sıfır parametresi sayıyı, diğer sayılar o sıradaki öğeyi verir.

Önemli uyarı: Bu örnek bütün kanallara hızla mesaj gönderir. Çok sayıda kanalda bulunuyorsanız sunucu bunu flood olarak algılayabilir ve bağlantınızı kesebilir. Böyle durumlarda mesajları zamanlayıcıyla aralıklı göndermek gerekir; bkz. mIRC timer.

Kullanıcı Listesi Üzerinde Gezinmek

alias kanaldakiler {
  var %i = 1
  while (%i <= $nick($chan,0)) {
    echo -a $nick($chan,%i)
    inc %i
  }
}

$nick($chan,0) kanaldaki kişi sayısını verir. Bu identifier ek parametrelerle filtrelenebilir: Yalnızca op'ları, yalnızca voice sahiplerini veya yalnızca yetkisiz kullanıcıları listelemek mümkündür. Filtre kullanmak, döngü içinde kontrol yapmaktan hem daha kısa hem daha hızlıdır.

Metin Kelimelerini İşlemek

alias kelimeler {
  var %i = 1
  while (%i <= $numtok($1-,32)) {
    echo -a Kelime %i $+ : $gettok($1-,%i,32)
    inc %i
  }
}

$numtok bir metindeki parça sayısını, $gettok ise belirli sıradaki parçayı verir. Son parametre ayırıcı karakterin kodudur; 32 boşluk, 44 virgül, 46 noktadır. Metin işleme identifier'ları için mIRC token identifierları yazımıza bakın.

Geriye Doğru Döngü

Bazı durumlarda listeyi sondan başa doğru işlemek gerekir. Özellikle döngü içinde listeden öğe çıkarıyorsanız bu zorunludur, çünkü baştan ilerlerken bir öğe çıkarmak sonraki öğelerin sıralarını kaydırır:

alias tumkanallardanCik {
  var %i = $chan(0)
  while (%i >= 1) {
    part $chan(%i)
    dec %i
  }
}

Bu kalıbı hatırlamak önemlidir: Liste değişiyorsa geriye doğru gidin.

Döngü Kontrolü: break ve continue

var %i = 1
while (%i <= $nick($chan,0)) {
  if ($nick($chan,%i) == Aranan) {
    echo -a Bulundu, sira: %i
    break
  }
  inc %i
}

break döngüden hemen çıkar. continue ise o turu atlayıp bir sonrakine geçer:

var %i = 1
while (%i <= $nick($chan,0)) {
  inc %i
  if ($nick($chan,%i) isop $chan) { continue }
  echo -a Op olmayan: $nick($chan,%i)
}

continue kullanırken sayacı artırma satırının yerine özellikle dikkat edin: Sayaç artırma continue'dan sonra gelirse döngü sonsuza girer. Bu yüzden continue kullanan döngülerde sayacı turun başında artırmak daha güvenlidir.

İç İçe Döngüler

var %i = 1
while (%i <= $chan(0)) {
  var %j = 1
  while (%j <= $nick($chan(%i),0)) {
    echo -a $chan(%i) $+ : $nick($chan(%i),%j)
    inc %j
  }
  inc %i
}

İç içe döngülerde her döngünün kendi sayacı olmalıdır. Aynı değişkeni iki döngüde kullanmak, kafa karıştırıcı hatalara yol açar. İç döngünün sayacını iç döngünün hemen başında tanımlamak, her dış turda sıfırlanmasını sağlar.

İç içe döngüler hızla maliyetli hâle gelir: Yirmi kanalda yüz kişi varsa iki bin tur çalışır. Bu tür kodları yalnızca gerçekten gerektiğinde ve kullanıcının açık isteğiyle çalıştırın.

Performans ve mIRC'in Donması

mIRC tek iş parçacıklı çalışır: Bir döngü çalışırken arayüz donar, gelen mesajlar işlenmez. Kısa döngülerde bu fark edilmez, ama binlerce tur süren bir döngü mIRC'i birkaç saniye kilitleyebilir.

Performansı korumak için:

  • Döngü içinde ağır işlem yapmayın: Dosya okuma yazma gibi işlemleri döngü dışına taşıyın veya en aza indirin.
  • Filtreli identifier'lar kullanın: Döngü içinde kontrol yapmak yerine, mümkünse identifier'ın kendi filtresini kullanın.
  • Hash tabloları tercih edin: Arama işlemleri için döngü yerine hash tablosu kullanmak kat kat hızlıdır. Bkz. mIRC hash tabloları.
  • Uzun işlemleri bölün: Çok uzun işlemleri zamanlayıcıyla parçalara ayırarak mIRC'in arada soluklanmasını sağlayın.

Performans teknikleri için mIRC script performansı yazımıza bakın.

Sonsuz Döngüden Korunmak

Sonsuz döngü, scriptinizi ve mIRC'i kilitler. Korunmak için:

  1. Sayaç artırmayı asla atlamayın. Döngü gövdesini yazmaya sayaç satırıyla başlamak iyi bir alışkanlıktır.
  2. Koşulu kontrol edin. <= ile >= karıştırmak sık yapılan bir hatadır.
  3. Güvenlik sınırı koyun. Koşulun yanında bir üst tur sınırı eklemek, beklenmedik durumlarda döngünün durmasını sağlar.
  4. Liste değişiyorsa dikkat edin. Döngü içinde listeye öğe ekleyen bir kod, döngünün hiç bitmemesine yol açabilir.

Gerçek Bir Senaryo

Bir kullanıcı, kanaldaki bütün kullanıcıların adres bilgilerini bir dosyaya kaydeden bir script yazıyor. İlk sürümde döngünün her turunda dosyayı açıp yazıp kapatıyor. Beş yüz kişilik bir kanalda script çalıştığında mIRC on saniye boyunca donuyor. Scripti yeniden yazıyor: Döngü içinde bilgileri bir değişkende biriktiriyor, döngü bittikten sonra tek seferde dosyaya yazıyor. Aynı iş artık bir saniyeden kısa sürüyor.

Döngü Yerine Daha İyi Yollar

Her tekrar eden iş için döngü yazmak zorunda değilsiniz. mIRC, bazı işler için döngüye gerek bırakmayan hazır araçlar sunar. Örneğin bir metni parçalarına ayırıp hepsini işlemek yerine, bazen tek bir metin işleme identifier'ı aynı sonucu verir. Bir listede arama yapmak için döngü kurmak yerine, metin arama identifier'larını veya hash tablolarını kullanmak kat kat hızlıdır.

Bu yüzden bir döngü yazmaya başlamadan önce kendinize şunu sormak faydalıdır: Bu işi tek bir identifier ile yapmanın bir yolu var mı? Cevap genellikle evet olur ve ortaya çıkan kod hem kısa hem hızlı olur.

Döngülerde Okunabilirlik

Uzun döngüleri okunabilir tutmanın birkaç yolu vardır. Döngü gövdesindeki işi bir alias'a taşımak, döngünün kendisini üç dört satıra indirir ve ne yaptığı bir bakışta anlaşılır. Sayaç değişkenine anlamlı bir ad vermek, özellikle iç içe döngülerde hangi sayacın ne saydığını hatırlamanızı sağlar. Döngünün üstüne ne üzerinde gezindiğini anlatan bir yorum satırı eklemek de aylar sonra kodu açtığınızda çok işinize yarar.

Sonuç

while döngüsü, mIRC'te tekrarlayan işlerin tek aracıdır. Üç parçasını (başlangıç, koşul, artırma) her zaman eksiksiz yazın, listelerde sıfır parametresiyle sayıyı alın, liste değişiyorsa geriye doğru ilerleyin, break ve continue ile akışı yönetin ve döngülerinizi mIRC'i kilitlemeyecek kadar kısa tutun. mIRC'in hazır bilgi kaynaklarını tanımak için sıradaki rehberimiz mIRC identifierlar.

IRC sorunun mu var? Kanalda birlikte çözelim.

💬 Kanala Bağlan

Sıkça Sorulan Sorular

mIRC'te for döngüsü var mı?

Hayır, mIRC yalnızca while döngüsünü sunar. Sayaç tanımlamayı ve artırmayı kendiniz yaparsınız.

Sonsuz döngüye girdim, ne yapmalıyım?

mIRC genellikle uzun süren döngüleri durdurmanız için bir uyarı gösterir. Döngü koşulunu ve sayaç artırma satırını kontrol edin.

Döngü içinde mesaj göndermek güvenli mi?

Dikkatli olun. Çok sayıda mesajı hızla göndermek sunucu tarafından flood olarak algılanabilir ve bağlantınızın kesilmesine yol açabilir.