En iyi Webmaster forumlari.
iyilerin buluşma noktasi.

Kod dogrulama

Başlatan Administrator, Tem 27, 2025, 07:53 ÖÖ

« önceki - sonraki »

Administrator

  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
}
 
Webmasterforumlari.com yorumlarınız değerlidir..