set kod_kontrol_suresi 60
set max_denetim 3
set kodlar_file "data/kodlar.txt"
set dogrulanan_file "data/dogrulananlar.txt"
set denemeler_file "data/denemeler.txt"
bind join - * giris_kontrol
bind msg - "!kod" kod_dogrula
# Kullanıcı giriş kontrolü
proc giris_kontrol {nick host handle chan} {
set dogrulananlar [get_file_lines $::dogrulanan_file]
if {[lsearch -exact $dogrulananlar $nick] == -1} {
putquick "PRIVMSG $nick :Merhaba $nick, bu kanala girebilmek için doğrulama kodunu yazmalısın: /msg $::botnick !kod <kod>"
timer $::kod_kontrol_suresi [list kontrol_et $nick $chan]
}
}
# Süre dolduğunda hala doğrulanmadıysa kick
proc kontrol_et {nick chan} {
set dogrulananlar [get_file_lines $::dogrulanan_file]
if {[lsearch -exact $dogrulananlar $nick] == -1} {
putquick "KICK $chan $nick :Kod doğrulaması yapılmadı."
}
}
# Kod doğrulama işlemi
proc kod_dogrula {nick host handle text} {
set kod [string trim $text]
set satirlar [get_file_lines $::kodlar_file]
set dogru 0
set yeni_satirlar {}
set bulundu 0
foreach line $satirlar {
if {[llength [split $line]] != 2} { continue }
lassign [split $line] kadi k
if {[string tolower $nick] eq [string tolower $kadi]} {
set bulundu 1
if {$kod eq $k} {
set dogru 1
# Kod doğruysa kaydet ve çık
add_line_to_file $::dogrulanan_file $nick
putquick "PRIVMSG $nick :✅ Doğrulama başarılı! Artık kanalda kalabilirsin."
}
continue ;# bu satırı yazmayalım ki tek kullanımlık olsun (silinsin)
} else {
lappend yeni_satirlar $line
}
}
# Kodları yeniden yaz (tek kullanımlık)
set f [open $::kodlar_file w]
foreach line $yeni_satirlar {
puts $f $line
}
close $f
if {$dogru} {
sil_kullanici_denemesi $nick
return
}
if {!$bulundu} {
putquick "PRIVMSG $nick :❌ Kod bulunamadı veya süresi dolmuş."
return
}
# Deneme limiti kontrol
set denemeler [yukle_denemeler]
set sayi [expr {[info exists denemeler($nick)] ? $denemeler($nick) : 0}]
incr sayi
kaydet_denemeler $nick $sayi
if {$sayi >= $::max_denetim} {
putquick "KICK #kanal $nick :❌ 3 kez yanlış kod girildi."
} else {
set kalan [expr {$::max_denetim - $sayi}]
putquick "PRIVMSG $nick :❌ Hatalı kod. $kalan hakkınız kaldı."
}
}
# Yardımcı dosya işlemleri
proc get_file_lines {file} {
if {![file exists $file]} { return {} }
set f [open $file r]
set d [split [read $f] "\n"]
close $f
return $d
}
proc add_line_to_file {file line} {
set f [open $file a]
puts $f $line
close $f
}
# Deneme verisi yükle
proc yukle_denemeler {} {
array set denemeler {}
if {![file exists $::denemeler_file]} { return [array get denemeler] }
set f [open $::denemeler_file r]
while {[gets $f line] != -1} {
if {[llength [split $line]] == 2} {
lassign [split $line] nick sayi
set denemeler($nick) $sayi
}
}
close $f
return [array get denemeler]
}
# Deneme verisi kaydet
proc kaydet_denemeler {nick sayi} {
set denemeler [yukle_denemeler]
set denemeler($nick) $sayi
set f [open $::denemeler_file w]
foreach {k v} [array get denemeler] {
puts $f "$k $v"
}
close $f
}
# Başarıyla doğrulananın denemesi silinsin
proc sil_kullanici_denemesi {nick} {
set denemeler [yukle_denemeler]
array unset denemeler $nick
set f [open $::denemeler_file w]
foreach {k v} [array get denemeler] {
puts $f "$k $v"
}
close $f
}