Tekil Mesaj gösterimi
Alt 16 Ağustos 2026, 16:13   #1
KivanC Editör
✓
W r i t e r
KivanC - ait Kullanıcı Resmi (Avatar)

Standart Antibad - Gelişmiş Badnick Korumasi. (2026)

AntiBad — BadNick Koruma & Kanal Güvenlik Botu (mIRC)
Kanallarınızı istenmeyen/zararlı nicklerden otomatik koruyan, hafif ve tamamen özelleştirilebilir bir mIRC güvenlik scripti.
🔧 Özellikler
🛡️ Otomatik BadNick Koruması — Join/nick değişikliğinde anlık kontrol, regex tabanlı esnek eşleştirme
🌐 Uzaktan Liste Güncelleme — Kural listesi GitHub üzerinden otomatik çekilir, !bad reload ile anında yenilenir
💾 Kalıcı Depolama — Whitelist, geçmiş ve loglar diske kaydedilir; script yeniden başlasa bile kaybolmaz
📴 Çevrimdışı Yedek — İnternet/GitHub'a erişilemezse son çekilen liste diskten kullanılmaya devam eder
🔍 Periyodik Tam Tarama — Kanaldaki tüm kullanıcıları belirli aralıklarla otomatik tarar
⚙️ 4 Farklı Aksiyon Modu — kick, kill, ban, warn (sadece izleme/bildirim)
✅ Whitelist Desteği — Joker karakterli (Guest*) istisna tanımlama
🔁 Tekrarlayan İhlal Takibi — Aynı IP'den gelen tekrar ihlaller operlere otomatik bildirilir
🔐 Tek Seferlik Admin Girişi — !bad login <parola> ile hem NickServ identify hem de parola doğrulanır; bir kez giriş yapan admin oturum boyunca (nick değişse bile) tekrar login olmadan komutları kullanabilir
📊 Durum Paneli — !bad status ile anlık bot durumu, kural/whitelist sayısı tek bakışta

!

HTML-Kodu

bad login <parola> | !bad logout
!bad on/off | !bad status
!bad scan | !bad scan on/off
!bad reload | !bad action kick/kill/ban/warn
!bad add <regex> | !bad del <regex> | !bad list
!bad allow/deny <nick> | !bad whitelist
!bad history <nick> | !bad clearhistory <nick>
!bad log | !bad opers | !bad whoauth | !bad save
;

HTML-Kodu

============================================================
; AntiBad vFinal++ (LOGIN SİSTEMLİ)
; BadNick Koruması + Tarama + Whitelist + Geçmiş Uyarı
; Kalıcı Depolama + Tek Seferlik Identify+OperPass Girişi
; Bot Nick : AntiBad
; Nick Pass: deneme123
; Oper Pass: deneme123
; ============================================================

on *:START: {
  .timer 1 2 AntiBad.Init
}

alias AntiBad.Init {
  set %AntiBad.botnick     AntiBad
  set %AntiBad.nickpass    deneme123
  set %AntiBad.operpass    deneme123
  set %AntiBad.badlist.host raw.githubusercontent.com
  set %AntiBad.badlist.path /example/badnicks/main/list.txt
  set %AntiBad.enabled     1
  set %AntiBad.action      kick
  set %AntiBad.scan.interval 300
  set %AntiBad.scan.enabled  1
  set %AntiBad.scan.cooldown 10
  set %AntiBad.data.dir $+($scriptdir,AntiBadData,\)

  if (!$isdir(%AntiBad.data.dir)) mkdir $qt(%AntiBad.data.dir)

  hmake AntiBad.badlist     2000
  hmake AntiBad.whitelist    300
  hmake AntiBad.history     1000
  hmake AntiBad.opers        100
  hmake AntiBad.log          500
  hmake AntiBad.auth         100
  hmake AntiBad.pendingauth   50

  AntiBad.LoadState
  echo -a AntiBad vFinal++ yüklendi.
  AntiBad.FetchList
  if (%AntiBad.scan.enabled) AntiBad.StartScan
}

; ==================== KALICI DEPOLAMA ====================
; Not: auth/pendingauth kasıtlı olarak kaydedilmez — girişler oturuma özeldir,
; script yeniden başladığında herkes tekrar !bad login yapmalıdır.
alias AntiBad.LoadState {
  if ($isfile($+(%AntiBad.data.dir,badlist.hsh)))   hload AntiBad.badlist   $qt($+(%AntiBad.data.dir,badlist.hsh))
  if ($isfile($+(%AntiBad.data.dir,whitelist.hsh))) hload AntiBad.whitelist $qt($+(%AntiBad.data.dir,whitelist.hsh))
  if ($isfile($+(%AntiBad.data.dir,history.hsh)))   hload AntiBad.history   $qt($+(%AntiBad.data.dir,history.hsh))
  if ($isfile($+(%AntiBad.data.dir,log.hsh)))       hload AntiBad.log       $qt($+(%AntiBad.data.dir,log.hsh))
  echo -a AntiBad: kayıtlı veriler yüklendi (whitelist: $hget(AntiBad.whitelist).size $+ , badlist yedek: $hget(AntiBad.badlist).size $+ )
}

alias AntiBad.SaveState {
  hsave AntiBad.badlist   $qt($+(%AntiBad.data.dir,badlist.hsh))
  hsave AntiBad.whitelist $qt($+(%AntiBad.data.dir,whitelist.hsh))
  hsave AntiBad.history   $qt($+(%AntiBad.data.dir,history.hsh))
  hsave AntiBad.log       $qt($+(%AntiBad.data.dir,log.hsh))
}

on *:UNLOAD: {
  sockclose AntiBad.sock
  .timerAntiBadScan off
  AntiBad.SaveState
}

; ==================== WEB'DEN LİSTE ÇEKME ====================
alias AntiBad.FetchList {
  sockclose AntiBad.sock
  unset %AntiBad.listready
  unset %AntiBad.headersdone
  sockopen AntiBad.sock %AntiBad.badlist.host 443
}

on *:SOCKOPEN:AntiBad.sock: {
  if ($sockerr) {
    echo -a AntiBad: bağlantı hatası → $sock($sockname).wsmsg $+ . Yerel yedek liste kullanılıyor (kural sayısı: $hget(AntiBad.badlist).size $+ ).
    return
  }
  sockwrite -n $sockname GET %AntiBad.badlist.path HTTP/1.1
  sockwrite -n $sockname Host: %AntiBad.badlist.host
  sockwrite -n $sockname Connection: close
  sockwrite -n $sockname $crlf
}

on *:SOCKREAD:AntiBad.sock: {
  if ($sockerr) {
    echo -a AntiBad: okuma hatası → $sock($sockname).wsmsg
    return
  }
  var %d, %new = 0
  while (1) {
    sockread %d
    if ($sockerr) break
    if ($sockbr == 0) break

    if ($regex(%d,/^HTTP\/1\.[01] 200/)) { set %AntiBad.listready 1 | continue }

    if (!%AntiBad.headersdone) {
      if (%d == $null) set %AntiBad.headersdone 1
      continue
    }

    if (%AntiBad.listready && %AntiBad.headersdone && $regex(%d,/^[^#\s].+/)) {
      hadd -m AntiBad.badlist $md5(%d) %d
      inc %new
    }
  }
}

on *:SOCKCLOSE:AntiBad.sock: {
  unset %AntiBad.listready
  unset %AntiBad.headersdone
  echo -a Badnick listesi güncellendi → $hget(AntiBad.badlist).size kural
  AntiBad.SaveState
}

; ==================== TEK NOKTADAN EŞLEŞTİRME ====================
alias AntiBad.Match {
  var %n = $1, %i = 1
  while ($hget(AntiBad.badlist,%i).item) {
    var %p = $hget(AntiBad.badlist,%i)
    if ($regex(%n,/ $+ %p $+ /i)) return %p
    inc %i
  }
  return $null
}

; ==================== BADNICK KONTROL ====================
on *:JOIN:#: {
  if (%AntiBad.enabled) AntiBad.Check $nick $chan
}

on *:NICK: {
  ; oturum kimliğini yeni nick'e taşı (yeniden login gerekmesin)
  if ($hget(AntiBad.auth,$nick)) {
    hadd -m AntiBad.auth $newnick $hget(AntiBad.auth,$nick)
    hdel AntiBad.auth $nick
  }
  if (%AntiBad.enabled) AntiBad.Check $newnick
}

on *:QUIT: {
  if ($hget(AntiBad.auth,$nick))        hdel AntiBad.auth $nick
  if ($hget(AntiBad.pendingauth,$nick)) hdel AntiBad.pendingauth $nick
}

alias AntiBad.Check {
  if ($AntiBad.IsWhitelisted($1)) return
  var %n = $1, %c = $2
  var %p = $AntiBad.Match(%n)
  if (%p) {
    AntiBad.Action %n %c %p
    AntiBad.RecordHistory %n
  }
}

alias AntiBad.Action {
  var %n = $1, %c = $2, %p = $3
  if (%AntiBad.action == kick) {
    if (%c) kick %c %n BadNick: %p
    else .raw KILL %n :BadNick: %p
  }
  elseif (%AntiBad.action == kill) .raw KILL %n :BadNick: %p
  elseif (%AntiBad.action == ban) {
    if (%c) {
      mode %c +b *!*@ $+ $address(%n,2)
      kick %c %n BadNick
    }
  }
  elseif (%AntiBad.action == warn) {
    ; sadece logla ve operlere bildir, kick/ban yapma
  }
  AntiBad.Log BADNICK %n → %p (aksiyon: %AntiBad.action)
}

; ==================== WHITELIST ====================
alias AntiBad.IsWhitelisted {
  if ($hfind(AntiBad.whitelist,$1,0,w).item) return $true
  return $false
}

; ==================== TEKRAR EDEN İHLAL (Sadece Uyarı) ====================
alias AntiBad.RecordHistory {
  var %n = $1
  var %ip = $address(%n,2)
  if (!%ip) return
  var %key = $md5(%ip)
  var %count = $hget(AntiBad.history,%key)
  if (!%count) %count = 0
  inc %count
  hadd -m AntiBad.history %key %count

  if (%count >= 2) AntiBad.WarnOpers %n %ip %count
}

alias AntiBad.WarnOpers {
  var %n = $1, %ip = $2, %count = $3
  var %msg = [BADNICK UYARI] %n (IP: %ip) → %count $+ . ihlal

  var %i = 1
  while ($hget(AntiBad.opers,%i).item) {
    var %op = $hget(AntiBad.opers,%i).item
    if ($comchan(%op,0)) notice %op %msg
    inc %i
  }
  AntiBad.Log REPEAT %n → %count $+ . ihlal (IP: %ip)
}

; ==================== TARAMA SİSTEMİ ====================
alias AntiBad.StartScan {
  .timerAntiBadScan 0 %AntiBad.scan.interval AntiBad.FullScan
  echo -a Otomatik tarama aktif (her %AntiBad.scan.interval sn)
}

alias AntiBad.FullScan {
  if (!%AntiBad.enabled) return
  if ($timer(AntiBadScanCooldown)) { echo -a AntiBad: tarama zaten yeni tamamlandı, kısa süre bekleyin. | return }
  .timerAntiBadScanCooldown 1 %AntiBad.scan.cooldown echo -a AntiBad: tarama tekrar kullanılabilir.

  echo -a [TARAMA] Başladı...
  var %total = 0, %caught = 0, %i = 1
  while ($chan(%i)) {
    var %c = $chan(%i), %j = 1
    while ($nick(%c,%j)) {
      var %n = $nick(%c,%j)
      if (%n != $me && !$AntiBad.IsWhitelisted(%n)) {
        inc %total
        var %p = $AntiBad.Match(%n)
        if (%p) {
          AntiBad.Action %n %c %p
          AntiBad.RecordHistory %n
          inc %caught
        }
      }
      inc %j
    }
    inc %i
  }
  echo -a [TARAMA] Bitti → %total nick / %caught badnick
  AntiBad.Log SCAN %total tarandı / %caught yakalandı
}

; ==================== OPER / ADMIN TANIMA (botun kendisi) ====================
raw 381:*: {
  hadd -m AntiBad.opers $me $ctime
  AntiBad.Log OPER-SUCCESS $me
}

; ==================== IDENTIFY & OPERPASS TAKİBİ (botun kendisi) ====================
on *:NOTICE:*: {
  if ($nick == NickServ) {
    if (Password accepted isin $1-) AntiBad.Log IDENTIFY-SUCCESS $target
    elseif ((incorrect isin $1-) || (wrong isin $1-) || (failed isin $1-)) {
      AntiBad.Log IDENTIFY-FAIL $target → $1-
    }
  }
}

on *:INPUT:*: {
  if ($1 == /oper) AntiBad.Log OPER-ATTEMPT $me → $2
}

; ==================== ADMIN GİRİŞİ (Tek Seferlik Identify + OperPass) ====================
; Kullanım: !bad login <operpass>
; 1) Girilen parola %AntiBad.operpass ile karşılaştırılır.
; 2) Doğruysa kullanıcı WHOIS edilir; NickServ'e identify olup olmadığı (hesap adı) kontrol edilir.
; 3) İkisi de geçerse kullanıcı AntiBad.auth tablosuna eklenir ve bir daha login istenmez
;    (nick değiştirse bile oturumu korunur, sadece QUIT/disconnect'te düşer).
alias AntiBad.HandleLogin {
  var %who = $1, %pass = $2
  if (!%pass) { notice %who Kullanım: !bad login <operpass> | return }
  if ($hget(AntiBad.auth,%who)) { notice %who Zaten giriş yapmışsınız. | return }
  if (%pass != %AntiBad.operpass) {
    AntiBad.Log LOGIN-FAIL %who → yanlış parola
    notice %who Parola hatalı.
    return
  }
  hadd -m AntiBad.pendingauth %who $ctime
  notice %who Parola doğru, NickServ kimliğiniz kontrol ediliyor...
  whois %who
}

raw 330:*: {
  ; :sunucu 330 benimnick hedefnick hesapadi :is logged in as
  var %target = $2, %account = $3
  if ($hget(AntiBad.pendingauth,%target)) {
    hdel AntiBad.pendingauth %target
    hadd -m AntiBad.auth %target $ctime
    notice %target AntiBad: Giriş başarılı ( $+ %account $+ hesabıyla identify onaylandı). Artık !bad komutlarını kullanabilirsiniz.
    AntiBad.Log LOGIN-SUCCESS %target ( $+ %account $+ )
  }
}

raw 318:*: {
  ; End of /WHOIS — buraya kadar 330 gelmediyse identify olmamış demektir
  var %target = $2
  if ($hget(AntiBad.pendingauth,%target)) {
    hdel AntiBad.pendingauth %target
    notice %target AntiBad: Giriş reddedildi — NickServ'e identify olmamışsınız. Önce nick'inizi identify edin, sonra tekrar deneyin.
    AntiBad.Log LOGIN-FAIL %target → identify yok
  }
}

raw 401:*: {
  ; No such nick — pending kaydını temizle
  var %target = $2
  if ($hget(AntiBad.pendingauth,%target)) hdel AntiBad.pendingauth %target
}

; ==================== LOG ====================
alias AntiBad.Log {
  var %msg = $asctime(HH:nn:ss) [ $+ $1 $+ ] $2-
  hadd -m AntiBad.log $ctime %msg
  echo -s %msg
}

; ==================== KOMUTLAR ====================
on *:TEXT:!bad*:*: {
  ; login/logout, staff olma şartı aranmadan herkese açık
  if ($2 == login) { AntiBad.HandleLogin $nick $3 | return }
  if ($2 == logout) {
    if ($hget(AntiBad.auth,$nick)) {
      hdel AntiBad.auth $nick
      notice $nick Çıkış yapıldı.
    }
    else notice $nick Zaten giriş yapılmamış.
    return
  }

  if (!$AntiBad.IsStaff($nick)) {
    notice $nick Yetkiniz yok. Giriş yapmak için: !bad login <operpass>
    return
  }

  if ($2 == on) {
    set %AntiBad.enabled 1
    notice $nick AntiBad AKTİF
  }
  elseif ($2 == off) {
    set %AntiBad.enabled 0
    notice $nick AntiBad PASİF
  }
  elseif ($2 == scan && $3 == on) {
    set %AntiBad.scan.enabled 1
    AntiBad.StartScan
    notice $nick Otomatik tarama AÇIK
  }
  elseif ($2 == scan && $3 == off) {
    set %AntiBad.scan.enabled 0
    .timerAntiBadScan off
    notice $nick Otomatik tarama KAPALI
  }
  elseif ($2 == scan) {
    notice $nick Manuel tarama başlatılıyor...
    AntiBad.FullScan
  }
  elseif ($2 == reload) {
    hfree AntiBad.badlist
    hmake AntiBad.badlist 2000
    AntiBad.FetchList
    notice $nick Liste yeniden çekiliyor...
  }
  elseif ($2 == action) {
    if ($istok(kick kill ban warn,$3,32)) {
      set %AntiBad.action $3
      notice $nick Aksiyon → $3
    }
    else notice $nick Geçersiz aksiyon. Seçenekler: kick, kill, ban, warn
  }
  elseif ($2 == list) {
    notice $nick Badnick kural sayısı: $hget(AntiBad.badlist).size
  }
  elseif ($2 == add && $3) {
    hadd -m AntiBad.badlist $md5($3-) $3-
    notice $nick Eklendi: $3-
    AntiBad.SaveState
  }
  elseif ($2 == del && $3) {
    hdel AntiBad.badlist $md5($3-)
    notice $nick Silindi: $3-
    AntiBad.SaveState
  }
  elseif ($2 == allow && $3) {
    hadd -m AntiBad.whitelist $3 $ctime
    notice $nick $3 whitelist'e eklendi
    AntiBad.SaveState
  }
  elseif ($2 == deny && $3) {
    hdel AntiBad.whitelist $3
    notice $nick $3 whitelist'ten çıkarıldı
    AntiBad.SaveState
  }
  elseif ($2 == whitelist) {
    notice $nick Whitelist ($hget(AntiBad.whitelist).size):
    var %i = 1
    while ($hget(AntiBad.whitelist,%i).item) {
      notice $nick → $hget(AntiBad.whitelist,%i).item
      inc %i
    }
  }
  elseif ($2 == history && $3) {
    var %ip = $iif($address($3,2),$address($3,2),$3)
    var %count = $hget(AntiBad.history,$md5(%ip))
    notice $nick $3 → $iif(%count,%count,0) ihlal
  }
  elseif ($2 == clearhistory && $3) {
    var %ip = $iif($address($3,2),$address($3,2),$3)
    hdel AntiBad.history $md5(%ip)
    notice $nick $3 geçmişi temizlendi
  }
  elseif ($2 == log) {
    notice $nick Son 8 log:
    var %i = $hget(AntiBad.log).size
    var %end = $calc(%i - 7)
    if (%end < 1) %end = 1
    while (%i >= %end) {
      notice $nick $hget(AntiBad.log,$hget(AntiBad.log,%i).item)
      dec %i
    }
  }
  elseif ($2 == opers) {
    notice $nick Bilinen Operler:
    var %i = 1
    while ($hget(AntiBad.opers,%i).item) {
      notice $nick → $hget(AntiBad.opers,%i).item
      inc %i
    }
  }
  elseif ($2 == whoauth) {
    notice $nick Giriş yapmış adminler ($hget(AntiBad.auth).size):
    var %i = 1
    while ($hget(AntiBad.auth,%i).item) {
      notice $nick → $hget(AntiBad.auth,%i).item
      inc %i
    }
  }
  elseif ($2 == status) {
    notice $nick — AntiBad Durum —
    notice $nick Durum: $iif(%AntiBad.enabled,AKTİF,PASİF) | Aksiyon: %AntiBad.action
    notice $nick Otomatik tarama: $iif(%AntiBad.scan.enabled,AÇIK,KAPALI) (her %AntiBad.scan.interval sn)
    notice $nick Badnick kuralı: $hget(AntiBad.badlist).size | Whitelist: $hget(AntiBad.whitelist).size | Giriş yapmış admin: $hget(AntiBad.auth).size
  }
  elseif ($2 == save) {
    AntiBad.SaveState
    notice $nick Veriler diske kaydedildi.
  }
  else {
    notice $nick AntiBad Komutları:
    notice $nick !bad login <operpass> | !bad logout
    notice $nick !bad on/off | !bad status | !bad scan | !bad scan on/off
    notice $nick !bad reload | !bad action kick/kill/ban/warn
    notice $nick !bad list | !bad add <regex> | !bad del <regex>
    notice $nick !bad allow/deny <nick> | !bad whitelist
    notice $nick !bad history <nick> | !bad clearhistory <nick>
    notice $nick !bad log | !bad opers | !bad whoauth | !bad save
  }
}

; Zaten IRCOp olan veya @/&/~ yetkisi olan kişiler ek login yapmadan da kullanabilir;
; login sistemi IRCOp olmayan ama parolayı bilen adminler için ek bir yol sağlar.
alias AntiBad.IsStaff {
  if ($hfind(AntiBad.opers,$1,0).item) return $true
  if ($left($usermode($1),1) isin @&~) return $true
  if ($hget(AntiBad.auth,$1)) return $true
  return $false
}

; Bağlanınca otomatik identify + oper
on *:CONNECT: {
  .timer 1 3 ns identify %AntiBad.nickpass
  .timer 1 6 oper %AntiBad.botnick %AntiBad.operpass
}
________________

"Sevilmenin kıymeti bilinmiyorsa, Uzaklaşmak En güzeli ki üzülen sen olmayasın"