Senin yazdığın kod-daki sorunları açıklayayım sana.
-
Kod:
On *:snotice:*client conn*: {
var %ipp = $remove($gettok($10,2,64),$chr(41)))
hinc -m %ipp $+(%ipp,$9) 1
if ($hget(%ipp,$+(%ipp,$9)) == 2) { notice $9 Clone Limitine ulaştınız. Lütfen başka cLone bağlamayın. }
if ($hget(%ipp,$+(%ipp,$9)) == 3) { kill $9 Clone Yasak }
hdel %ipp $+(%ipp,$9)
}
-
Senin yazdığın kod neler yapar?
Her giriş için ayrı bir tablo oluşturur. Tablonun ITEM(parça) kısmınada ip ile nick-i birleştirerek bir değer yükseltir. Kısacası senin yazdığın kod, bir kullanıcı(ki yazdığın kodda aynı kullanıcı oluyor bu, farklı kullanıcıda işlev yapmaz) sunucuya 2 veya 3 defa girip çıktığında işlev yapıyor. Ki bu işlevide hiçbir zaman yapmayacaktır. Çünki sen /if sorgularından bağımsız /hdel komutu ile parçayı sildiriyorsun. Kısacası bu kod sadece ayrı ayrı veriler ekler ve aynı zamanda eklediğin verileride siler. Hiçbir işlev yapmaz. Tablo-lar kalır, buda yoğun giriş/çıkışta RAM-ı zorlar.
-
Benim yazdığım kodu açıklayayım:
on $*:snotice:/client\s(connecting|exiting)/Si: {
;burada on snotice event-ı client connecting veya exiting mesajını algıladığında =>
var %_reg = $regml(1),%_ip = $remove($gettok($10,2,64),$chr(41))
;algılamayı regex kullanarak yaptığımız için $regml(1) giriş veya çıkışı belirler. bizde sonuçlanan işlevi %_reg değişkenine atıyoruz. ve aynı zamanda %_ip değişkeninede ip-i atıyoruz.
if ($(,%_reg) = connecting) {
;burada diyoruzki, eğer %_reg değişkeni connecting(giriş ise) =>
hinc -m _ips %_ip 1
;_ips ismindeki tabloya %_ip değişkenine atadığımız veriyi parça olarak ata ve bir değer yükselt.
if ($hget(_ips,%_ip) = 2) notice $9 vs.
;eğer _ips tablosundaki %_ip verisinin değeri 2-ye eşit olursa notice işlevini yap.
if ($hget(_ips,%_ip) = 3) { kill $9 :sebeb. | hdel _ips %_ip }
;eğer _ips tablosundaki %_ip verisinin değeri 3-e eşit olursa kullanıcıyı sunucudan kill ile kick-le. ve tablodaki değeri sil.(eğer burada tablodaki değeri silmezsek kullanıcı sunucuya giriş yaptığında (clone olsa dahi) hiçbir işlev gerçekleşmez.)
}
if ($(,%_reg) = exiting) $iif($hget(_ips,%_ip),hdec _ips %_ip 1)
;eğer %_reg değişkeni exiting ise(çıkış ise) =>
;eğer sunucudan çıkan kullanıcının ip numarası _ips tablosunda mevcut ise, o ip için atanan parçanın değerini bir değer düşür.
;bunu yapmamızın sebebi, kullanıcı(AYNI KULLANICI OLSA DAHİ) sunucuya 2 veya 2-den fazla giriş çıkış yaparsa yine işlev görmesin diye. çünki bu bir clone değildir. kısacası tekil hit-dir diyelim :)
}