En iyi Webmaster forumlari.
iyilerin buluşma noktasi.
# proxyconnect.tcl - Client connecting IP'lerine göre proxy kontrolü
# Eggdrop'ın oper olması gerekir (server notice alabilmeli)
set proxylist_file "proxy.txt"
set opernick "BotNick" ;# GLINE için oper nick (gerekirse)
# IP listesi yükleme
proc load_proxy_list {} {
global proxy_list proxylist_file
set proxy_list {}
if {[file exists $proxylist_file]} {
set fp [open $proxylist_file r]
while {[gets $fp line] >= 0} {
set line [string trim $line]
if {$line ne ""} {
lappend proxy_list $line
}
}
close $fp
putlog "ProxyConnect: [llength $proxy_list] IP yüklendi."
} else {
putlog "ProxyConnect: proxy.txt bulunamadı!"
}
}
load_proxy_list
# Sunucu NOTICE'lerini yakala
bind raw - "NOTICE" raw_notice_handler
# NOTICE handler
proc raw_notice_handler {from keyword text} {
global proxy_list
# Örnek: *** Client connecting on port 6667: TestNick!user@1.2.3.4
if {[regexp {Client connecting on port \d+: .*?@([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)} $text -> ip]} {
putlog "ProxyConnect: Bağlantı IP tespit edildi: $ip"
foreach proxyip $proxy_list {
if {[string match "$proxyip*" $ip]} {
putlog "ProxyConnect: Proxy IP tespit edildi: $ip -> GLINE gönderiliyor."
send_gline $ip
return
}
}
}
}
# GLINE gönderimi
proc send_gline {ip} {
set reason "Proxy bağlantısı tespit edildi."
putserv "GLINE *@$ip 1d :$reason"
putlog "ProxyConnect: GLINE atıldı -> *@$ip ($reason)"
}
# proxycheck.tcl - proxy.txt üzerinden GLINE atan koruma sistemi
set proxylist_file "proxy.txt"
set oper_nick "BotNick" ;# Oper yetkili nick'in burada tanımlı olmalı
bind evnt - init-server load_proxy_list
bind evnt - user-login check_user_proxy
# Proxy listesi belleğe yüklenir
proc load_proxy_list {} {
global proxylist_file proxy_list
if {![file exists $proxylist_file]} {
putlog "ProxyCheck: proxy.txt bulunamadı!"
return
}
set fp [open $proxylist_file r]
set proxy_list {}
while {[gets $fp line] >= 0} {
set line [string trim $line]
if {[regexp {^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+} $line]} {
lappend proxy_list $line
}
}
close $fp
putlog "ProxyCheck: [llength $proxy_list] proxy IP yüklendi."
}
# Kullanıcı giriş yaptığında IP kontrolü yapılır
proc check_user_proxy {nick user host hand} {
global proxy_list
set fullip [getip $nick]
if {$fullip eq ""} {
putlog "ProxyCheck: $nick için IP alınamadı."
return
}
foreach proxyip $proxy_list {
if {[string match "$proxyip*" $fullip]} {
putlog "ProxyCheck: $nick ($fullip) PROXY tespit edildi. GLINE atılıyor."
send_gline $nick $fullip
return
}
}
}
# GLINE gönderimi
proc send_gline {nick ip} {
set reason "Proxy bağlantısı tespit edildi."
putserv "OPER $::oper_nick password" ;# Gerekirse OPER ol
putserv "GLINE *@$ip 1d :$reason"
putlog "ProxyCheck: GLINE atıldı -> *@$ip ($reason)"
}
# IP adresini al
proc getip {nick} {
if {[info exists ::laston($nick)]} {
return $::laston($nick)
}
return ""
}
wget https://www.unrealircd.org/downloads/unrealircd-6.1.4.tar.gz
# 1. Gerekli bağımlılıkları yükle
sudo apt update && sudo apt install build-essential libssl-dev pkg-config libpcre2-dev zlib1g-dev curl
# 2. İndirilen arşivi aç
tar xvf unrealircd-6.1.4.tar.gz
cd unrealircd-6.1.4
# 3. Yapılandırma sihirbazını başlat
./Config
# 4. Derleme ve kurulum
make
make install
# 5. Başlatma
cd ~/unrealircd
./unrealircd start
# UnrealIRCd 6 için örnek konfigürasyon
# Sunucu bilgileri
me {
name "irc.sohbetim.net";
info "Sohbet IRC Sunucusu";
sid "001";
};
admin {
"Erkan KUTLU";
"IRC Admin";
"admin@sohbetim.net";
};
class clients {
pingfreq 90;
maxclients 500;
sendq 100000;
recvq 8000;
};
class servers {
pingfreq 60;
maxclients 10;
sendq 1000000;
connfreq 30;
};
listen {
ip *;
port 6667;
};
allow {
ip *@*;
hostname *@*;
class clients;
maxperip 5;
};
allow {
ip 127.0.0.1;
hostname localhost;
class servers;
password "sunucu_sifresi";
};
link services.sohbetim.net {
incoming {
mask *;
password "sunucu_sifresi";
}
outgoing {
hostname 127.0.0.1;
port 7070;
password "sunucu_sifresi";
}
class servers;
};
ulines {
services.sohbetim.net;
};
drpass {
restart "restart123";
die "die123";
};
oper erkan {
class clients;
from {
userhost *@*;
}
password "gizlisifre";
flags {
netadmin;
can_zline;
can_gzline;
can_gkline;
global;
}
};
set {
network-name "SohbetimNet";
default-server "irc.sohbetim.net";
services-server "services.sohbetim.net";
stats-server "stats.sohbetim.net";
help-channel "#yardim";
hiddenhost-prefix "user";
cloak-keys {
"a1b2c3d4";
"e5f6g7h8";
"i9j0k1l2";
}
hosts {
local "locop.sohbetim.net";
global "ircop.sohbetim.net";
coadmin "coadmin.sohbetim.net";
admin "admin.sohbetim.net";
servicesadmin "csops.sohbetim.net";
netadmin "netadmin.sohbetim.net";
host-on-oper-up "yes";
}
};
log "ircd.log" {
maxsize 1000000;
flags {
oper;
connects;
server-connects;
kills;
errors;
sadmin-commands;
chg-commands;
tkl;
}
};
include "modules.default.conf";
include "aliases/anope.conf"; # Anope services kullanıyorsan
# cycle.tcl - Eggdrop Sahte Services Bot Cycle Sistemi
# Kodlayan: OpenAI - 2025
# Ayarlar
set cycle_channel "#kanaladi"
set cycle_delay_min 30
set cycle_delay_max 60
set cycle_hour_start 22
set cycle_hour_end 2
set cycle_nickfile "nick.txt"
# Değişkenler
set cycle_users {}
set cycle_active 1
# Nick listesini yükle
proc load_cycle_nicks {} {
if {![file exists $::cycle_nickfile]} { return }
set f [open $::cycle_nickfile r]
set data [read -nonewline $f]
close $f
set ::cycle_users [split $data "\n"]
}
# Rastgele delay belirle
proc rand_cycle_delay {} {
return [expr {$::cycle_delay_min + int(rand() * ($::cycle_delay_max - $::cycle_delay_min + 1))}]
}
# Geçerli saat
proc get_hour {} {
return [clock format [clock seconds] -format "%H"]
}
# Saat kontrolü
proc cycle_check_time {} {
set hour [get_hour]
if {$::cycle_hour_end < $::cycle_hour_start} {
return [expr {$hour >= $::cycle_hour_start || $hour < $::cycle_hour_end}]
} else {
return [expr {$hour >= $::cycle_hour_start && $hour < $::cycle_hour_end}]
}
}
# Cycle işlemi
proc cycle_user {} {
if {!$::cycle_active} return
if {![cycle_check_time]} {
utimer 60 cycle_user
return
}
if {[llength $::cycle_users] == 0} {
load_cycle_nicks
}
set nick [lindex $::cycle_users [expr {int(rand() * [llength $::cycle_users])}]]
set delay [rand_cycle_delay]
# JOIN
putquick "PRIVMSG OperServ :RAW :NICK $nick"
utimer 1 [list putquick "PRIVMSG OperServ :RAW :USER $nick * * :Cycle Bot"]
utimer 2 [list putquick "PRIVMSG OperServ :RAW :JOIN $::cycle_channel"]
# PART (kanaldan çıkış)
utimer [expr {$delay - 2}] [list putquick "PRIVMSG OperServ :RAW :PART $::cycle_channel :Cycle Part"]
# QUIT (sunucudan çıkış)
utimer [expr {$delay}] [list putquick "PRIVMSG OperServ :RAW :QUIT :Cycle Out"]
# Tekrarla
utimer [expr {$delay + 5}] cycle_user
}
# Başlat / Durdur
proc cycle_start {} {
set ::cycle_active 1
load_cycle_nicks
cycle_user
}
proc cycle_stop {} {
set ::cycle_active 0
}
# Komutlar
bind pub o !cyclestart pub_cycle_start
bind pub o !cyclestop pub_cycle_stop
bind pub o !cyclereload pub_cycle_reload
proc pub_cycle_start {nick uhost hand chan arg} {
cycle_start
putserv "PRIVMSG $chan :Cycle bot başlatıldı."
}
proc pub_cycle_stop {nick uhost hand chan arg} {
cycle_stop
putserv "PRIVMSG $chan :Cycle bot durduruldu."
}
proc pub_cycle_reload {nick uhost hand chan arg} {
load_cycle_nicks
putserv "PRIVMSG $chan :nick.txt yeniden yüklendi."
}
# Otomatik başlat
load_cycle_nicks
cycle_user
# Eggdrop IRC Proxy / Tor / DNSBL Koruma Sistemi
# Gelişmiş kontrol modülü: proxy.txt + tor.txt + DNSBL + admin komutları
set proxylist_file "proxy.txt"
set torlist_file "tor.txt"
set log_file "proxy_detect.log"
# DNSBL sunucuları
set dnsbl_servers {
"dnsbl.dronebl.org"
"rbl.efnetrbl.org"
"dnsbl.tornevall.org"
}
# Proxy port listesi
set proxy_ports {1080 3128 8080 8000 6588 553 81 9999 23}
# Admin tanımla
set admin_users {"Erkan" "Admin"}
# Başlangıçta listeleri yükle
set proxy_list {}
set tor_list {}
load_lists
# ==============================
# Dosya Okuma
# ==============================
proc load_lists {} {
global proxylist_file torlist_file proxy_list tor_list
if {[file exists $proxylist_file]} {
set fp [open $proxylist_file r]
set proxy_list [split [read $fp] "\n"]
close $fp
}
if {[file exists $torlist_file]} {
set fp [open $torlist_file r]
set tor_list [split [read $fp] "\n"]
close $fp
}
}
# ==============================
# Kontrol Fonksiyonları
# ==============================
proc is_proxy_ip {ip} {
global proxy_list
foreach p $proxy_list {
if {[string match "*$p*" $ip]} { return 1 }
}
return 0
}
proc is_tor_ip {ip} {
global tor_list
foreach t $tor_list {
if {[string match "*$t*" $ip]} { return 1 }
}
return 0
}
proc is_proxy_port {port} {
global proxy_ports
return [expr {$port in $proxy_ports}]
}
# ==============================
# Loglama
# ==============================
proc log_detect {type ip port} {
global log_file
set time [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S"]
set f [open $log_file a]
puts $f "$time - $type: $ip:$port"
close $f
}
# ==============================
# IRC'den Giriş Tespiti
# ==============================
bind raw - "* NOTICE *" detect_connection
proc detect_connection {from keyword arg} {
if {[regexp {Client connecting on port ([0-9]+): ([0-9\.]+)} $arg -> port ip]} {
set matched 0
if {[is_proxy_ip $ip]} {
log_detect "PROXY-LIST" $ip $port
set matched 1
}
if {[is_tor_ip $ip]} {
log_detect "TOR-EXIT" $ip $port
set matched 1
}
if {[is_proxy_port $port]} {
log_detect "PROXY-PORT" $ip $port
set matched 1
}
if {$matched} {
putserv "GLINE $ip 1d :Proxy veya Tor bağlantısı tespit edildi"
}
}
}
# ==============================
# Admin Komutları
# ==============================
bind pub - "!proxykontrol" cmd_proxykontrol
bind pub - "!proxyekle" cmd_proxyekle
bind pub - "!proxykaldir" cmd_proxykaldir
bind pub - "!proxylist" cmd_proxylist
bind pub - "!torliste" cmd_torliste
bind pub - "!dnsblkontrol" cmd_dnsbl
proc is_admin {nick} {
global admin_users
return [expr {$nick in $admin_users}]
}
proc cmd_proxykontrol {nick host hand chan arg} {
if {![is_admin $nick]} return
if {$arg eq ""} {
putserv "PRIVMSG $chan :Kullanım: !proxykontrol <ip>"
return
}
set msg "IP: $arg - "
if {[is_proxy_ip $arg]} { append msg "proxy.txt ✅ " }
if {[is_tor_ip $arg]} { append msg "tor.txt ✅ " }
putserv "PRIVMSG $chan :$msg"
}
proc cmd_proxyekle {nick host hand chan arg} {
if {![is_admin $nick]} return
if {$arg eq ""} return
set fp [open $::proxylist_file a]
puts $fp $arg
close $fp
load_lists
putserv "PRIVMSG $chan :$arg proxy listesine eklendi."
}
proc cmd_proxykaldir {nick host hand chan arg} {
if {![is_admin $nick]} return
if {$arg eq ""} return
set newlist {}
foreach line $::proxy_list {
if {$line ne $arg} {
lappend newlist $line
}
}
set fp [open $::proxylist_file w]
foreach item $newlist { puts $fp $item }
close $fp
load_lists
putserv "PRIVMSG $chan :$arg proxy listesinden çıkarıldı."
}
proc cmd_proxylist {nick host hand chan arg} {
if {![is_admin $nick]} return
putserv "PRIVMSG $chan :Proxy.txt → [join $::proxy_list ", "]"
}
proc cmd_torliste {nick host hand chan arg} {
if {![is_admin $nick]} return
putserv "PRIVMSG $chan :Tor.txt → [join $::tor_list ", "]"
}
proc cmd_dnsbl {nick host hand chan ip} {
if {![is_admin $nick]} return
if {![regexp {^([0-9]+\.){3}[0-9]+$} $ip]} {
putserv "PRIVMSG $chan :Geçersiz IP"
return
}
set revip [join [lreverse [split $ip "."]] "."]
foreach dnsbl $::dnsbl_servers {
set query "$revip.$dnsbl"
dnslookup $query [list dnsbl_result $chan $dnsbl $ip]
}
}
proc dnsbl_result {chan dnsbl ip addr status} {
if {$status eq "OK"} {
putserv "PRIVMSG $chan :$ip → $dnsbl LİSTELENMİŞ ❌"
} else {
putserv "PRIVMSG $chan :$ip → $dnsbl temiz ✅"
}
}
# Proxy Port + IP Tespiti - "Client connecting on port" satırlarını tarar
# IRC sunucusundan gelen NOTICE/SNOTICE loglarında çalışır
set proxylist_file "proxy.txt"
set proxy_ports {1080 3128 8080 8000 6588 553 81 9999 6666 23}
set log_file "proxy_detected.log"
set kick_reason "Proxy bağlantısı tespit edildi. Erişiminiz engellendi."
# Proxy IP listesi yükle
proc load_proxy_list {} {
global proxylist_file proxy_list
set proxy_list {}
if {[file exists $proxylist_file]} {
set fp [open $proxylist_file r]
set proxy_list [split [read $fp] "\n"]
close $fp
}
}
# IP proxy.txt içinde mi?
proc is_proxy_ip {ip} {
global proxy_list
foreach entry $proxy_list {
if {$entry eq ""} { continue }
if {[string match "*$entry*" $ip]} {
return 1
}
}
return 0
}
# Port şüpheli mi?
proc is_proxy_port {port} {
global proxy_ports
return [expr {$port in $proxy_ports}]
}
# Log yaz
proc log_proxy_detected {ip port reason} {
global log_file
set now [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S"]
set fp [open $log_file a]
puts $fp "$now - $ip:$port - $reason"
close $fp
}
# IRC'den gelen satırları izle
bind raw - "* NOTICE *" client_connect_check
proc client_connect_check {from keyword arg} {
# Örnek satır: "Client connecting on port 1080: 123.45.67.89"
if {[string match -nocase "*Client connecting on port*" $arg]} {
if {[regexp {Client connecting on port ([0-9]+): ([0-9\.]+)} $arg -> port ip]} {
set matched 0
if {[is_proxy_ip $ip]} {
log_proxy_detected $ip $port "proxy.txt içinde"
set matched 1
}
if {[is_proxy_port $port]} {
log_proxy_detected $ip $port "şüpheli port"
set matched 1
}
if {$matched} {
# Dilersen notice, kill, gline, vs.
putserv "KILL $ip :$::kick_reason"
# Alternatif: putserv "GLINE $ip 1d :$::kick_reason"
}
}
}
}
# Başlangıçta proxy listesi yüklenir
load_proxy_list
# IRC'den gelen satırda "Client connecting on port" varsa, proxy.txt'e göre kontrol eder
set proxylist_file "proxy.txt"
set proxy_notice_msg "Proxy tespit edildi: IP adresiniz listede."
set proxy_trigger_phrase "Client connecting on port"
set proxy_log_file "proxy_snotice.log"
# proxy.txt içeriğini oku
proc load_proxy_list {} {
global proxylist_file proxy_list
set proxy_list {}
if {[file exists $proxylist_file]} {
set fp [open $proxylist_file r]
set proxy_list [split [read $fp] "\n"]
close $fp
}
}
# IP proxy listesinde mi?
proc is_proxy_ip {ip} {
global proxy_list
foreach proxy_entry $proxy_list {
if {$proxy_entry eq ""} { continue }
if {[string match "*$proxy_entry*" $ip]} {
return 1
}
}
return 0
}
# Loglama
proc log_proxy_event {ip port} {
global proxy_log_file
set time [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S"]
set fp [open $proxy_log_file a]
puts $fp "$time - Proxy IP tespit edildi: $ip (Port $port)"
close $fp
}
# RAW satırları dinle
bind raw - "* NOTICE *" monitor_proxy_notice
proc monitor_proxy_notice {from keyword arg} {
global proxy_trigger_phrase
if {[string match -nocase "*$proxy_trigger_phrase*" $arg]} {
# Örnek satırdan IP ve port ayıkla
# Örnek: "Client connecting on port 1080: 123.45.67.89"
if {[regexp {Client connecting on port ([0-9]+): ([0-9\.]+)} $arg -> port ip]} {
if {[is_proxy_ip $ip]} {
log_proxy_event $ip $port
# Burada işlem yapılabilir, örneğin botun owner'ına notice at
putserv "PRIVMSG $::owner_nick :Proxy IP tespit edildi: $ip (port $port)"
}
}
}
}
# Proxy / TOR koruma sistemi (Eggdrop TCL)
# Gereksinimler: proxy.txt (engelli IP listesi), DNSBL destekli
setudef flag proxyblock
# DNSBL listesi (örnek)
set dnsbllist {
"dnsbl.dronebl.org"
"tor.dnsbl.sectoor.de"
"rbl.efnetrbl.org"
}
# Client bağlandığında IP kontrol
bind evnt - init-server check_proxy_init
proc check_proxy_init {type} {
bind raw - "001" check_proxy_load
}
# Kullanıcı listesi yüklendiğinde başla
proc check_proxy_load {from keyword text} {
unbind raw - "001" check_proxy_load
utimer 3 start_proxy_scan
}
# Bağlı kullanıcıları kontrol et
proc start_proxy_scan {} {
foreach user [handlist] {
set ip [getuser $user XTRA:ip]
if {[string length $ip] > 6} {
check_dnsbl $user $ip
}
}
}
# DNSBL sorgusu başlat
proc check_dnsbl {nick ip} {
foreach bl $::dnsbllist {
set reversed_ip [join [lreverse [split $ip "."]] "."]
set query "$reversed_ip.$bl"
dnslookup -t a $query [list dnsbl_result $nick $ip $bl]
}
}
# DNSBL sonucu
proc dnsbl_result {nick ip bl status result} {
if {$status == 0 && $result ne ""} {
putlog "Proxy/TOR Tespit: $nick ($ip) $bl tarafından listelenmiş."
putserv "PRIVMSG $nick :Sunucu koruması: IP adresiniz $bl DNSBL listesinde bulunuyor (Proxy/TOR). Bağlantınız engellenebilir."
putserv "KILL $nick :[random_reason]"
# AKILL sistemi varsa ekle:
# putserv "OPERSPY AKILL ADD $ip 1d TOR/Proxy IP engellendi."
}
}
# Rasgele sebep üretici
proc random_reason {} {
set reasons {
"Proxy kullanımı yasaktır."
"Güvenlik nedeniyle bağlantınız reddedildi."
"TOR ağı tespit edildi."
"Sunucu kurallarını ihlal ettiniz."
}
return [lindex $reasons [rand [llength $reasons]]]
}
# proxy_onconnect.tcl - Kullanıcı sunucuya bağlandığında IP'sini kontrol eder (on-connect)
# Eğer proxy.txt veya DNSBL eşleşmesi varsa, kullanıcı IRC'den atılır.
set proxylist "proxy.txt"
set dnsbl_servers {
"dnsbl.dronebl.org"
"dnsbl.tornevall.org"
"rbl.efnetrbl.org"
"dnsbl.proxybl.org"
}
bind raw - "NICK" proxy:onconnect_check
proc proxy:onconnect_check {from keyword text} {
# Gelen kullanıcıyı ayrıştır (nick, ident, host)
if {[regexp {^:?([^!]+)!([^@]+)@(.+)} $text -> nick ident host]} {
set ip [proxy:getip $host]
if {$ip eq ""} return
# Local proxy.txt kontrol
if {[proxy:checklist $ip]} {
putlog "proxy_onconnect: $nick -> IP $ip = proxy.txt eşleşmesi"
proxy:kickuser $nick "Proxy bağlantı tespit edildi (local)"
return
}
# DNSBL kontrol
foreach dnsbl $::dnsbl_servers {
if {[proxy:dnsbl_check $ip $dnsbl]} {
putlog "proxy_onconnect: $nick -> IP $ip = $dnsbl eşleşmesi"
proxy:kickuser $nick "Blacklist ($dnsbl)"
return
}
}
}
}
proc proxy:getip {host} {
if {[regexp {(\d+\.\d+\.\d+\.\d+)} $host -> ip]} {
return $ip
}
return ""
}
proc proxy:checklist {ip} {
if {![file exists $::proxylist]} { return 0 }
set f [open $::proxylist r]
set data [split [read $f] "\n"]
close $f
return [expr {$ip in $data}]
}
proc proxy:dnsbl_check {ip dnsbl} {
set parts [split $ip "."]
if {[llength $parts] != 4} { return 0 }
set revip "[lindex $parts 3].[lindex $parts 2].[lindex $parts 1].[lindex $parts 0].$dnsbl"
set result [dnslookup $revip]
return [expr {$result ne ""}]
}
proc proxy:kickuser {nick reason} {
# Kullanıcıyı IRC'den atmak için NOTICE + QUIT veya ircd'ye göre KILL/AKILL kullanılabilir
putserv "NOTICE $nick :Güvenlik uyarısı: $reason"
putserv "KILL $nick :Proxy / Tor bağlantılar yasaktır"
}
# cycle.tcl - Sahte services kullanıcıları nick.txt üzerinden join/part/quit yapar
# Özellikler:
# ✅ Rastgele delay süresi
# ✅ Saat aralığı kontrolü (örn: 22:00 - 02:00)
set cycle(chan) "#genel" ;# Hedef kanal
set cycle(delaymin) 40 ;# Minimum bekleme süresi
set cycle(delaymax) 90 ;# Maksimum bekleme süresi
set cycle(nickfile) "nick.txt" ;# Kullanıcı nicklerinin bulunduğu dosya
set cycle(start_hour) 22 ;# Başlangıç saati (örnek: 22:00)
set cycle(end_hour) 2 ;# Bitiş saati (örnek: 02:00)
bind evnt - init-server cycle:init
proc cycle:init {} {
global cycle
set cycle(users) [cycle:loadnicks $cycle(nickfile)]
cycle:next 0
}
proc cycle:loadnicks {filename} {
if {[file exists $filename]} {
set fp [open $filename r]
set data [split [read $fp] "\n"]
close $fp
return [lsearch -inline -all $data *]
} else {
putlog "cycle.tcl: nick.txt bulunamadı!"
return {}
}
}
proc cycle:inTimeRange {} {
global cycle
set now_hour [clock format [clock seconds] -format %H]
set hour [expr {int($now_hour)}]
set start $cycle(start_hour)
set end $cycle(end_hour)
if {$start < $end} {
return [expr {($hour >= $start) && ($hour < $end)}]
} else {
# Gece geçişi (örn: 22:00 - 02:00 gibi)
return [expr {($hour >= $start) || ($hour < $end)}]
}
}
proc cycle:randdelay {} {
global cycle
return [expr {int(rand() * ($cycle(delaymax) - $cycle(delaymin) + 1)) + $cycle(delaymin)}]
}
proc cycle:next {index} {
global cycle
if {![cycle:inTimeRange]} {
putlog "cycle.tcl: Saat aralığı dışında. Kontrol 60s sonra tekrar edilecek."
utimer 60 [list cycle:next $index]
return
}
if {[llength $cycle(users)] == 0} {
putlog "cycle.tcl: Kullanıcı listesi boş!"
return
}
if {$index >= [llength $cycle(users)]} {
set index 0
}
set nick [lindex $cycle(users) $index]
set nextindex [expr {$index + 1}]
set chan $cycle(chan)
putquick "NICK $nick"
putquick "JOIN $chan"
set delay [cycle:randdelay]
putlog "cycle.tcl: $nick -> $chan (delay: $delay saniye)"
utimer $delay [list cycle:part $nick $chan $nextindex]
}
proc cycle:part {nick chan nextindex} {
putquick "PART $chan"
utimer 2 [list putquick "QUIT :Cycled out"]
utimer 4 [list cycle:next $nextindex]
}