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

Standart Sunucu Geneli Oylama Sistemi - WHOIS Doğrulamalı!

🔐 Çift Katmanlı Güvenlik

WHOIS tabanlı gerçek IRCop doğrulaması — sunucudan gelen 313/318 cevabına dayanır, taklit edilemez
NickServ identify zorunluluğu — hesabına giriş yapmamış kimse oylama başlatamaz/bitiremez

🛡️ Tekrar Oy Koruması

Nick değiştirse bile aynı kullanıcı ikinci kez oy kullanamaz (hesap/host bazlı takip)

⏱️ Spam/Flood Koruması

Tüm komutlarda cooldown sistemi — komutları art arda hızlıca tetiklemeyi engeller

💬 Hem Kanal Hem Özel Mesaj Desteği
Kurulumu #Opers kanalında yapabildiğin gibi, bota özelden de tamamlayabilirsin

📢 Sunucu Geneli Duyuru

Bot oper olduğunda GLOBOPS/WALLOPS ile gerçek sunucu geneline, değilse botun bulunduğu tüm kanallara otomatik yayın
🧠 Akıllı Süre Algılama (Regex)

"1 saat", "30dk", "2 günlük" gibi doğal yazımları otomatik anlıyor

⏳ Otomatik Bitiş + Manuel Bitirme

Süre dolunca sonuçlar otomatik açıklanır, IRCop isterse !oybitir ile erken de bitirebilir

Alıntı:
Sen:!oylama başlat
Bot: Süreyi girin (örn: 1 saat, 30 dakika, 2 gün):
Sen: 1 saat
Bot: Sorunuzu sorun:
Sen: Türkiye savaşları ne zaman oldu?
Bot: 1. seçeneği girin:
Sen: 1919
Bot: 2. seçeneği girin, ya da bitirmek için "bitir" yazın:
Sen: 1923
Sen: bitir

HTML-Kodu

; ================================================================
;                  OYLAMA BOTU - TAM SÜRÜM
;   Sunucu geneli, WHOIS doğrulamalı, cooldown korumalı oylama
; ================================================================

; ---------- KURULUM (İLK ÇALIŞTIRMADA BUNLARI GİRİN) ----------
; /set %oylama.nick Oylama
; /set %oylama.operuser OperKullaniciAdi
; /set %oylama.operpass OperSifresi
; /set %oylama.nickpass NickServSifresi

on *:START:{
  if (%oylama.nick == $null) {
    echo -a [Bot] Uyarı: Ayarlar girilmemiş. Şunları çalıştırın:
    echo -a /set %oylama.nick Oylama
    echo -a /set %oylama.operuser OperKullaniciAdi
    echo -a /set %oylama.operpass OperSifresi
    echo -a /set %oylama.nickpass NickServSifresi
  }
  if (!$hget(oy_kurulum))       { hmake oy_kurulum 50 }
  if (!$hget(goy_bilgi))        { hmake goy_bilgi 10 }
  if (!$hget(goy_secenek))      { hmake goy_secenek 200 }
  if (!$hget(goy_sonuc))        { hmake goy_sonuc 200 }
  if (!$hget(goy_kullanan))     { hmake goy_kullanan 2000 }
  if (!$hget(oy_cooldown))      { hmake oy_cooldown 500 }
  if (!$hget(oy_whois_bekleyen)){ hmake oy_whois_bekleyen 50 }
}

; ================================================================
;                    BAĞLANTI / OPER / NICKSERV
; ================================================================

on *:CONNECT:{
  if (%oylama.nick != $null) { nick %oylama.nick }
  .timer 1 3 nickserv_giris
}

alias nickserv_giris {
  if (%oylama.nickpass != $null) { /msg NickServ IDENTIFY %oylama.nickpass }
  .timer 1 5 oper_ol
}

alias oper_ol {
  if (%oylama.operuser != $null) && (%oylama.operpass != $null) {
    /oper %oylama.operuser %oylama.operpass
  }
}

raw 381:*:{
  echo -a [Bot] IRCop oldu: $me
  set %bot.isoper $true
  halt
}

on *:DISCONNECT:{ unset %bot.isoper }

; ================================================================
;                 YETKİ + COOLDOWN YARDIMCI FONKSİYONLAR
; ================================================================

; Spam / tekrar koruması: aynı nick, belirtilen saniye içinde tekrar tetikleyemez
alias -l oy_cooldown_kontrol {
  var %anahtar = $1, %saniye = $2
  var %son = $hget(oy_cooldown,%anahtar)
  if (%son != $null) && ($calc($ctime - %son) < %saniye) {
    notice $nick [Oylama] Çok hızlı işlem yapıyorsunuz. $calc(%saniye - ($ctime - %son)) saniye sonra tekrar deneyin.
    return $false
  }
  hadd oy_cooldown %anahtar $ctime
  return $true
}

; WHOIS doğrulama başlat: nick'i whois'le, sonucu callback alias'ına ilet
alias -l oy_dogrula_baslat {
  var %nick = $1, %callback = $2, %hedef = $3
  hadd oy_whois_bekleyen %nick %callback $chr(9) %hedef $chr(9) 0
  whois %nick
}

; 313: "X kullanıcısı bir IRC operatörüdür" -> oper bayrağını işaretle
raw 313:*:{
  var %nick = $2
  if ($hget(oy_whois_bekleyen,%nick) == $null) { halt }
  var %veri = $hget(oy_whois_bekleyen,%nick)
  var %callback = $gettok(%veri,1,9)
  var %hedef = $gettok(%veri,2,9)
  hadd oy_whois_bekleyen %nick %callback $chr(9) %hedef $chr(9) 1
  halt
}

; 318: WHOIS sona erdi -> sonucu değerlendir ve callback'i çağır
raw 318:*:{
  var %nick = $2
  if ($hget(oy_whois_bekleyen,%nick) == $null) { halt }
  var %veri = $hget(oy_whois_bekleyen,%nick)
  var %callback = $gettok(%veri,1,9)
  var %hedef = $gettok(%veri,2,9)
  var %operMi = $gettok(%veri,3,9)
  hdel oy_whois_bekleyen %nick

  if ($account($nick) == $null) && ($account == $null) {
    msg %hedef [Oylama] $nick $+ , önce NickServ'e identify olmalısınız.
    halt
  }
  if (%operMi == 0) {
    msg %hedef [Oylama] $nick $+ , WHOIS doğrulamasına göre IRCop değilsiniz. İşlem reddedildi.
    halt
  }

  $callback(%nick, %hedef)
  halt
}

; ================================================================
;              İNTERAKTİF OYLAMA KURULUMU (kanal + özel)
; ================================================================

on ^*:TEXT:!oylama başlat:#Opers,?:{
  if ($oy_cooldown_kontrol($+(baslat-,$nick),15) == $false) { halt }

  if ($hget(goy_bilgi,aktif) != $null) {
    msg $iif($chan,$chan,$nick) [Oylama] Şu an aktif bir oylama var. Önce !oybitir ile bitirin.
    halt
  }
  if ($hget(oy_kurulum,$nick) != $null) {
    msg $iif($chan,$chan,$nick) [Oylama] $nick $+ , zaten devam eden bir kurulumunuz var. İptal: !oylama iptal
    halt
  }

  var %hedef = $iif($chan,$chan,$nick)
  msg %hedef [Oylama] $nick $+ , kimliğiniz doğrulanıyor...
  oy_dogrula_baslat $nick oy_kurulum_gercek_baslat %hedef
}

alias -l oy_kurulum_gercek_baslat {
  var %nick = $1, %hedef = $2
  hadd oy_kurulum %nick sure $chr(9) $chr(9) $chr(9) $chr(9) %hedef
  msg %hedef [Oylama] Doğrulama başarılı. %nick $+ , yeni oylama kurulumu başladı.
  msg %hedef [Oylama] Süreyi girin (örn: 1 saat, 30 dakika, 2 gün):
}

on ^*:TEXT:!oylama iptal:#Opers,?:{
  if ($hget(oy_kurulum,$nick) == $null) {
    notice $nick [Oylama] İptal edilecek bir kurulumunuz yok.
    halt
  }
  var %hedef = $gettok($hget(oy_kurulum,$nick),5,9)
  hdel oy_kurulum $nick
  msg %hedef [Oylama] $nick kurulumu iptal etti.
}

; ---------- ADIM ADIM CEVAPLARI YAKALA ----------
on ^*:TEXT:*:#Opers,?:{
  if ($hget(oy_kurulum,$nick) == $null) { halt }
  if ($left($1-,1) == !) { halt }

  var %veri = $hget(oy_kurulum,$nick)
  var %asama = $gettok(%veri,1,9)
  var %sure = $gettok(%veri,2,9)
  var %soru = $gettok(%veri,3,9)
  var %secenekler = $gettok(%veri,4,9)
  var %hedef = $gettok(%veri,5,9)

  ; ---- AŞAMA 1: SÜRE ----
  if (%asama == sure) {
    if ($regex($1-,/^\s*(\d+)\s*(saniyelik|saniye|sn|dakikalık|dakika|dk|saatlik|saat|s|günlük|gün|g)\s*$/i) == 0) {
      msg %hedef [Oylama] $nick $+ , süre anlaşılamadı. Örnek: "1 saat", "30 dakika", "2 gün"
      halt
    }
    var %sayi = $regml(1)
    var %birim = $lower($regml(2))
    var %saniye = 0
    if ($regex(%birim,/^(sn|saniye|saniyelik)$/)) { %saniye = %sayi }
    elseif ($regex(%birim,/^(dk|dakika|dakikalık)$/)) { %saniye = $calc(%sayi * 60) }
    elseif ($regex(%birim,/^(s|saat|saatlik)$/)) { %saniye = $calc(%sayi * 3600) }
    elseif ($regex(%birim,/^(g|gün|günlük)$/)) { %saniye = $calc(%sayi * 86400) }

    if (%saniye < 10) || (%saniye > 604800) {
      msg %hedef [Oylama] $nick $+ , süre 10 saniye ile 7 gün arasında olmalı. Tekrar girin:
      halt
    }

    hadd oy_kurulum $nick soru $chr(9) %saniye $chr(9) $chr(9) %hedef
    msg %hedef [Oylama] Süre kaydedildi: %sayi %birim
    msg %hedef [Oylama] Sorunuzu sorun:
    halt
  }

  ; ---- AŞAMA 2: SORU ----
  if (%asama == soru) {
    hadd oy_kurulum $nick secenek $chr(9) %sure $chr(9) $1- $chr(9) %hedef
    msg %hedef [Oylama] Soru kaydedildi: $1-
    msg %hedef [Oylama] 1. seçeneği girin:
    halt
  }

  ; ---- AŞAMA 3: SEÇENEKLER ----
  if (%asama == secenek) {
    if ($lower($1-) == bitir) || ($lower($1-) == tamam) {
      var %secenekSayisi = $numtok(%secenekler,124)
      if (%secenekSayisi < 2) {
        msg %hedef [Oylama] En az 2 seçenek girmelisiniz, devam edin:
        halt
      }
      hdel oy_kurulum $nick
      oylama_gercek_baslat %sure %soru %secenekler $nick
      halt
    }

    var %yeniSecenekler = $iif(%secenekler == $null,$1-,%secenekler $+ $chr(124) $+ $1-)
    var %sayac = $calc($numtok(%yeniSecenekler,124) + 1)
    hadd oy_kurulum $nick secenek $chr(9) %sure $chr(9) %soru $chr(9) %yeniSecenekler $chr(9) %hedef
    msg %hedef [Oylama] Seçenek eklendi: $1-
    msg %hedef [Oylama] $+ %sayac $+ . seçeneği girin, ya da bitirmek için "bitir" yazın:
    halt
  }
}

; ================================================================
;                    OYLAMAYI GERÇEKTEN BAŞLATMA
; ================================================================

alias oylama_gercek_baslat {
  var %saniye = $1
  var %soru = $2
  var %secenekler = $3
  var %baslatan = $4
  var %secenekSayisi = $numtok(%secenekler,124)
  var %bitis = $calc($ctime + %saniye)

  hadd goy_bilgi aktif %soru $chr(9) %bitis $chr(9) %secenekSayisi $chr(9) %baslatan

  var %i = 1
  while (%i <= %secenekSayisi) {
    hadd goy_secenek %i $gettok(%secenekler,%i,124)
    hadd goy_sonuc %i 0
    inc %i
  }

  oylama_yayinla $chr(3) $+ 4[OYLAMA BAŞLADI]$chr(3) %soru
  var %j = 1
  while (%j <= %secenekSayisi) {
    oylama_yayinla $chr(3) $+ 10 %j. $+ $chr(3) $gettok(%secenekler,%j,124)
    inc %j
  }
  oylama_yayinla $chr(3) $+ 14Oy vermek için: !oy <numara> (herhangi bir kanaldan veya bota özelden). Bitiş: $asctime(%bitis,hh:nn:ss dd/mm)$chr(3)

  .timer goybitis -oi 1 %saniye oylama_bitir_global
}

; ================================================================
;             YAYINLAMA (kanal + oper ise sunucu geneli)
; ================================================================

alias oylama_yayinla {
  var %c = 1
  while ($chan(%c) != $null) { echo $chan(%c) $1- | inc %c }
  if (%bot.isoper == $true) {
    ; ircd'nize göre birini aktif edin:
    ; /GLOBOPS $1-
    ; /WALLOPS $1-
    ; /SVSNOTICE * $1-
  }
}

; ================================================================
;                    OY VERME (kanal + özel)
; ================================================================

on ^*:TEXT:!oy *:*:{
  if ($oy_cooldown_kontrol($+(oy-,$nick),3) == $false) { halt }

  if ($hget(goy_bilgi,aktif) == $null) {
    notice $nick [Oylama] Şu anda aktif bir oylama yok.
    halt
  }
  var %secim = $2
  if ($regex(%secim,/^\d+$/) == 0) {
    notice $nick [Oylama] Geçersiz kullanım. Örnek: !oy 2
    halt
  }
  var %secenekSayisi = $gettok($hget(goy_bilgi,aktif),3,9)
  if (%secim < 1) || (%secim > %secenekSayisi) {
    notice $nick [Oylama] Geçersiz seçenek. 1 ile %secenekSayisi arasında bir sayı girin.
    halt
  }

  var %kimlik = $iif($account != $null,acc:$account,host:$address($nick,2))
  if ($hget(goy_kullanan,%kimlik) != $null) {
    notice $nick [Oylama] Zaten oy kullandınız! (Verdiğiniz oy: $hget(goy_kullanan,%kimlik) $+ .seçenek)
    halt
  }

  hadd goy_kullanan %kimlik %secim
  hadd goy_sonuc %secim $calc($hget(goy_sonuc,%secim) + 1)
  notice $nick [Oylama] Oyunuz kaydedildi: %secim $+ . seçenek $chr(40) $+ $hget(goy_secenek,%secim) $+ $chr(41)
}

; ================================================================
;                          BİTİRME
; ================================================================

alias oylama_bitir_global {
  if ($hget(goy_bilgi,aktif) == $null) { return }
  var %veri = $hget(goy_bilgi,aktif)
  var %soru = $gettok(%veri,1,9)
  var %secenekSayisi = $gettok(%veri,3,9)

  var %i = 1, %enYuksek = -1, %kazananlar = $null, %toplamOy = 0
  while (%i <= %secenekSayisi) {
    var %oy = $hget(goy_sonuc,%i)
    %toplamOy = $calc(%toplamOy + %oy)
    if (%oy > %enYuksek) { %enYuksek = %oy | %kazananlar = %i }
    elseif (%oy == %enYuksek) { %kazananlar = %kazananlar $+ , $+ %i }
    inc %i
  }

  oylama_yayinla $chr(3) $+ 4[OYLAMA SONA ERDİ]$chr(3) %soru
  var %i = 1
  while (%i <= %secenekSayisi) {
    oylama_yayinla $chr(3) $+ 10 %i. $+ $chr(3) $hget(goy_secenek,%i) $+ : $chr(3) $+ 9 $hget(goy_sonuc,%i) oy$chr(3)
    inc %i
  }
  var %sonuc = $iif(%toplamOy == 0,Hiç oy kullanılmadı.,$iif($numtok(%kazananlar,44) > 1,Berabere: %kazananlar,Kazanan: %kazananlar $+ . $hget(goy_secenek,%kazananlar)))
  oylama_yayinla $chr(3) $+ 3 $+ %sonuc (Toplam: %toplamOy oy)$chr(3)

  hdel goy_bilgi aktif
  var %i = 1
  while (%i <= %secenekSayisi) { hdel goy_secenek %i | hdel goy_sonuc %i | inc %i }
  var %j = 1
  while ($hget(goy_kullanan,%j).item != $null) { hdel goy_kullanan $hget(goy_kullanan,%j).item }
  .timer goybitis off
}

on ^*:TEXT:!oybitir:*:{
  if ($oy_cooldown_kontrol($+(bitir-,$nick),10) == $false) { halt }
  if ($hget(goy_bilgi,aktif) == $null) { notice $nick [Oylama] Aktif oylama yok. | halt }

  var %hedef = $iif($chan,$chan,$nick)
  msg %hedef [Oylama] $nick $+ , kimliğiniz doğrulanıyor...
  oy_dogrula_baslat $nick oy_bitir_gercek %hedef
}

alias -l oy_bitir_gercek {
  oylama_bitir_global
}

; ================================================================
;                    DURUM SORGULAMA (bonus)
; ================================================================

on ^*:TEXT:!oydurum:*:{
  if ($hget(goy_bilgi,aktif) == $null) {
    notice $nick [Oylama] Aktif oylama yok.
    halt
  }
  var %veri = $hget(goy_bilgi,aktif)
  var %kalan = $calc($gettok(%veri,2,9) - $ctime)
  notice $nick [Oylama] Soru: $gettok(%veri,1,9) | Kalan süre: $duration(%kalan)
}
________________

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