Nevnap-YnM.tcl Eggdrop

# ========================================================
# Névnap 1.0.4 (2025-es önálló verzió, Czo eredetije alapján)
# Szerzői jog: 2025, YnM   Szerkesztette: Markus ([email protected])   Minden jog fenntartva.
# Parancs: !nevnap  vagy !nevnap 6.5 vagy !nevnap Bella
# ========================================================

namespace eval ::nevnap {
    # Initialize all variables in the namespace
    variable honaphosz {0 31 28 31 30 31 30 31 31 30 31 30 31}
    variable honapok {"" "I." "II." "III." "IV." "V." "VI." "VII." "VIII." "IX." "X." "XI." "XII."}
    variable morning_timer
    variable evening_timer
    
    # Névnap-adatbázis
    variable honap
    array set honap {
        1 {"," ",Fruzsina," ",Abel," ",Genoveva,Benjamin," ",Leona,Titusz," ",Simon," ",Boldizsar," ",Ramona,Attila," ",Gyongyver," ",Marcell," ",Melania," ",Agota," ",Erno," ",Veronika," ",Bodog," ",Lorant,Lorand," ",Gusztav," ",Antonia,Antal," ",Piroska," ",Sara,Mario," ",Fabian,Sebestyen," ",Agnes," ",Vince,Arthur," ",Zelma,Rajmund," ",Timot," ",Pal," ",Vanda,Paula," ",Angelika," ",Karola,Karoly," ",Adel," ",Martina,Gerda," ",Marcella,"}
        2 {"," ",Ignac," ",Karolina,Aida," ",Balazs," ",Csenge,Rahel," ",Agota,Ingrid," ",Dorottya,Dora," ",Todor,Romeo," ",Aranka," ",Abigel,Alex," ",Elvira," ",Marietta,Bertold," ",Livia,Lidia," ",Ella,Linda," ",Balint,Valentin," ",Georgina,Kolos," ",Julianna,Lilla," ",Donat," ",Bernadett," ",Zsuzsanna," ",Aladar,Almos," ",Eleonora," ",Gerzson," ",Alfred," ",Matyas," ",Geza," ",Edina," ",Akos,Bator," ",Elemer," ",Elemer,"}
        3 {"," ",Albin," ",Lujza," ",Kornelia," ",Kazmer," ",Adorjan,Adrian," ",Leonora,Inez," ",Tamas," ",Zoltan," ",Franciska,Fanni," ",Ildiko," ",Szilard," ",Gergely," ",Krisztian,Ajtony," ",Matild," ",Kristof," ",Henrietta," ",Gertrud,Patrik," ",Sandor,Ede," ",Jozsef,Bank," ",Klaudia," ",Benedek," ",Beata,Izolda," ",Emoke," ",Karina,Gabor," ",Iren,Irisz," ",Emanuel," ",Hajnalka," ",Johanna,Gedeon," ",Auguszta," ",Zalan," ",Arpad,"}
        4 {"," ",Hugo," ",Aron," ",Buda,Richard," ",Izidor," ",Vince," ",Biborka,Vince," ",Herman," ",Denes," ",Erhard," ",Zsolt," ",Leo,Szaniszlo," ",Gyula," ",Ida," ",Tibor," ",Anasztazia,Tas," ",Csongor," ",Rudolf," ",Andrea,Ilma," ",Emma," ",Tivadar," ",Konrad," ",Csilla,Noemi," ",Bela," ",Gyorgy," ",Mark," ",Ervin," ",Zita," ",Valeria," ",Peter," ",Kitti,Katalin,"}
        5 {"," ",Fulop,Jakab," ",Zsigmond," ",Timea,Irma," ",Monika,Florian," ",Gyorgyi," ",Ivett,Frida," ",Gizella," ",Mihaly," ",Gergely," ",Palma,Armin," ",Ferenc," ",Pongrac," ",Imola,Szervac," ",Bonifac," ",Szonja,Zsofia," ",Mozes,Botond," ",Paszkal," ",Alexandra,Erik," ",Ivo,Milan," ",Felicia,Bernat," ",Konstantin," ",Julia,Rita," ",Dezso," ",Eliza,Eszter," ",Orban," ",Evelin,Fulop," ",Hella," ",Emil,Csanad," ",Magdolna," ",Janka,Zsanett," ",Angela,Petronella,"}
        6 {"," ",Tunde," ",Anita,Karmen," ",Klotild," ",Bulcsu," ",Fatime," ",Cintia,Norbert," ",Robert," ",Medard," ",Felix," ",Margit,Greta," ",Barnabas," ",Villo," ",Anett,Antal," ",Vazul," ",Jolan,Vid," ",Jusztin," ",Laura,Alida," ",Arnold,Levente," ",Gyarfas," ",Rafael," ",Leila,Alajos," ",Paulina," ",Zoltan," ",Ivan," ",Vilmos," ",Janos,Pal," ",Laszlo," ",Iren,Levente," ",Peter,Pal," ",Pal,"}
        7 {"," ",Annamaria,Tihamer," ",Otto," ",Kornelia,Soma," ",Ulrik," ",Emese,Sarolta," ",Csaba," ",Apollonia," ",Ellak," ",Lukrecia," ",Amalia," ",Lili,Nora," ",Izabella,Dalma," ",Jeno," ",Stella,Ors," ",Henrik,Roland," ",Valter," ",Endre,Elek," ",Frigyes," ",Emilia," ",Illes," ",Daniella,Daniel," ",Magdolna," ",Lenke," ",Kinga,Kincso," ",Kristof,Jakab," ",Aniko,Anna," ",Liliana,Olga," ",Szabolcs," ",Flora,Marta," ",Judit,Xenia," ",Oszkar,"}
        8 {"," ",Boglarka," ",Lehel," ",Hermina," ",Dominika,Domonkos," ",Krisztina," ",Bettina,Berta," ",Ibolya," ",Laszlo," ",Emod," ",Lorinc," ",Zsuzsanna,Tiborc," ",Klara," ",Ipoly," ",Marcell," ",Maria," ",Abraham," ",Jacint," ",Ilona," ",Huba," ",allami unnep," ",Hajna,Samuel," ",Mirjam,Menyhert," ",Bence," ",Bertalan," ",Patricia,Lajos," ",Izso," ",Gaspar," ",Agoston," ",Beatrix,Erna," ",Rozsa," ",Erika,Bella,"}
        9 {"," ",Egyed,Egon," ",Rebeka,Dorina," ",Hilda," ",Rozalia," ",Viktor,Lõrinc," ",Zakarias," ",Regina," ",Adrienn,Maria," ",Adam," ",Nikolett,Hunor," ",Teodora," ",Maria," ",Kornel," ",Roxana,Szerena," ",Melitta,Enikõ," ",Edit," ",Zsofia," ",Diana," ",Vilhelmina," ",Friderika," ",Mirella,Mate," ",Moric," ",Tekla," ",Mercedesz,Gellert," ",Eufrozina,Kende," ",Jusztina," ",Adalbert," ",Vencel," ",Mihaly," ",Jeromos,"}
        10 {"," ",Malvin," ",Petra," ",Helga," ",Ferenc," ",Aurel," ",Renata,Bruno," ",Amalia," ",Koppany," ",Denes," ",Gedeon," ",Brigitta," ",Miksa," ",Kalman,Ede," ",Helen," ",Terez," ",Gal," ",Hedvig," ",Lukacs," ",Nandor," ",Vendel," ",Orsolya," ",Elod," ",Gyongyi," ",Salamon," ",Bianka,Blanka," ",Domotor," ",Szabina," ",Szimonetta,Simon," ",Narcisz," ",Alfonz," ",Farkas,"}
        11 {"," ",Marianna," ",Achilles," ",Gyozo," ",Karoly," ",Imre," ",Lenard," ",Rezso," ",Zsombor," ",Tivadar," ",Reka," ",Marton," ",Jonas,Renato," ",Szilvia," ",Aliz," ",Albert,Lipot," ",Odon," ",Hortenzia,Gergo," ",Jeno," ",Erzsebet," ",Jolan," ",Oliver," ",Cecilia," ",Klementina,Kelemen," ",Emma," ",Katalin," ",Virag," ",Virgil," ",Stefania," ",Taksony," ",Andras,Andor,"}
        12 {"," ",Elza," ",Melinda,Vivien," ",Olivia,Ferenc," ",Barbara,Borbala," ",Vilma," ",Miklos," ",Ambrus," ",Maria," ",Natalia," ",Judit," ",Arpad," ",Gabriella," ",Luca,Otilia," ",Szilarda," ",Valer," ",Aletta,Etelka," ",Olimpia,Lazar," ",Auguszta," ",Viola," ",Teofil," ",Tamas," ",Zeno," ",Viktoria," ",Adam,Eva," ",Eugenia," ",Istvan," ",Janos," ",Kamilla," ",Tamara,Tamas," ",David," ",Szilveszter,"}
    }
    variable nevnapver "1.0.4"
    variable nevnapvers "1.0.4"
    variable announcement_channels "#Magyar"  ;# Itt megy az automatikus értesítés
    variable activation_channel "#YnM"        ;# Csak ide küldi az aktiválási üzenetet
    
    # Load timer on script start
    proc init {} {
        variable announcement_channels
        variable activation_channel
        variable nevnapvers
        
        ::nevnap::schedule_announcements
        putlog "Névnap TCL betöltve — verzió $nevnapvers"
        
        # Send activation message ONLY to activation channel
        putserv "PRIVMSG $activation_channel :Névnap figyelő aktiválva. Automatikus értesítések 7:00 és 20:00-kor."
    }
    
    # Schedule the daily announcements
    proc schedule_announcements {} {
        # Cancel any existing timers
        catch {killutimer $::nevnap::morning_timer}
        catch {killutimer $::nevnap::evening_timer}
        
        # Calculate next 7:00 and 20:00
        set now [clock seconds]
        set today [clock format $now -format "%Y-%m-%d"]
        set morning_time [clock scan "$today 07:00:00"]
        set evening_time [clock scan "$today 20:00:00"]
        
        # If time already passed today, schedule for tomorrow
        if {$morning_time < $now} {
            set morning_time [clock add $morning_time 1 day]
        }
        if {$evening_time < $now} {
            set evening_time [clock add $evening_time 1 day]
        }
        
        # Schedule timers
        variable morning_timer [utimer [expr {$morning_time - $now}] [list ::nevnap::morning_announcement]]
        variable evening_timer [utimer [expr {$evening_time - $now}] [list ::nevnap::evening_announcement]]
        
        # Reschedule for next day after each execution
        utimer [expr {86400 - ($now - [clock scan "$today 00:00:00"])}] [list ::nevnap::schedule_announcements]
    }
    
    # Morning announcement (7:00)
    proc morning_announcement {} {
        variable announcement_channels
        
        # Get current date
        set maihonap [clock format [clock seconds] -format %m]
        regsub {^0} $maihonap "" maihonap
        set mainap [clock format [clock seconds] -format %e]
        set maiev [clock format [clock seconds] -format %Y]
        
        set mainevnap [string trim [lindex $::nevnap::honap($maihonap) $mainap] ","]
        
        foreach chan $announcement_channels {
            putserv "PRIVMSG $chan :\002⏰ Ma $mainevnap névnapja van! Boldog névnapot! 🎉 🎈\002"
        }
    }
    
    # Evening announcement (20:00)
    proc evening_announcement {} {
        variable announcement_channels
        
        # Get current date
        set maihonap [clock format [clock seconds] -format %m]
        regsub {^0} $maihonap "" maihonap
        set mainap [clock format [clock seconds] -format %e]
        set maiev [clock format [clock seconds] -format %Y]
        
        # Calculate tomorrow's date
        set honaphossz [lindex $::nevnap::honaphosz $maihonap]
        if {($maihonap == 2) && ($maiev % 4 == 0) && ($maiev % 100 != 0 || $maiev % 400 == 0)} {
            set honaphossz 29
        }
        
        set holnapinap [expr {$mainap + 1}]
        set holnapihonap $maihonap
        set holnapiev $maiev
        
        if {$holnapinap > $honaphossz} {
            set holnapinap 1
            incr holnapihonap
            if {$holnapihonap > 12} {
                set holnapihonap 1
                incr holnapiev
            }
        }
        
        set mainevnap [string trim [lindex $::nevnap::honap($maihonap) $mainap] ","]
        set holnapnevnap [string trim [lindex $::nevnap::honap($holnapihonap) $holnapinap] ","]
        
        foreach chan $announcement_channels {
            putserv "PRIVMSG $chan :\002🌙 Esti névnap összefoglaló 🌙\002 Ma ($maiev.$maihonap.$mainap): \002$mainevnap\002, névnapja volt. Holnap: \002$holnapnevnap\002 névnapja lesz"
        }
    }
    
    # Initialize on script load
    init
}

# PUB és MSG parancsok
bind pub - "!nevnap" ::nevnap::pub_nevnap
bind msg - "!nevnap" ::nevnap::msg_nevnap

proc ::nevnap::pub_nevnap {nick uhost hand chan arg} {
    ::nevnap::nevnap_valasz $nick $chan $arg
    return 0
}

proc ::nevnap::msg_nevnap {nick uhost hand arg} {
    ::nevnap::nevnap_valasz $nick $nick $arg
    return 0
}

proc ::nevnap::nevnap_valasz {kitol kinek arg} {
    variable honap
    variable honaphosz
    variable honapok

    # Get current date
    set maihonap [clock format [clock seconds] -format %m]
    regsub {^0} $maihonap "" maihonap
    set mainap [clock format [clock seconds] -format %e]
    set maiev [clock format [clock seconds] -format %Y]

    # Calculate tomorrow's date
    set honaphossz [lindex $honaphosz $maihonap]
    if {($maihonap == 2) && ($maiev % 4 == 0) && ($maiev % 100 != 0 || $maiev % 400 == 0)} {
        set honaphossz 29
    }

    set holnapinap [expr {$mainap + 1}]
    set holnapihonap $maihonap
    set holnapiev $maiev

    if {$holnapinap > $honaphossz} {
        set holnapinap 1
        incr holnapihonap
        if {$holnapihonap > 12} {
            set holnapihonap 1
            incr holnapiev
        }
    }

    # No argument - show today and tomorrow
    if {$arg eq ""} {
        set mainevnap [string trim [lindex $honap($maihonap) $mainap] ","]
        set holnapnevnap [string trim [lindex $honap($holnapihonap) $holnapinap] ","]
        putserv "PRIVMSG $kinek :Névnap: Ma ($maiev.$maihonap.$mainap): \002$mainevnap\002, holnap: \002$holnapnevnap\002"
        return
    }

    # Date format (MM.DD)
    if {[regexp {^(\d{1,2})\.(\d{1,2})$} $arg -> honapocska napocska]} {
        if {$honapocska < 1 || $honapocska > 12} {
            putserv "PRIVMSG $kinek :Névnap: Hibás hónap (1-12)!"
            return
        }
        
        set maxnap [lindex $honaphosz $honapocska]
        if {$honapocska == 2 && $maiev % 4 == 0 && ($maiev % 100 != 0 || $maiev % 400 == 0)} {
            set maxnap 29
        }
        
        if {$napocska < 1 || $napocska > $maxnap} {
            putserv "PRIVMSG $kinek :Névnap: Hibás nap (1-$maxnap) a $honapocska. hónapban!"
            return
        }
        
        set nevnapocska [string trim [lindex $honap($honapocska) $napocska] ","]
        putserv "PRIVMSG $kinek :névnap: $honapocska.$napocska: \002$nevnapocska\002"
        return
    }

    # Name search
    set mikorvan ""
    set nevkeres [string tolower [string trim $arg]]
    for {set x 1} {$x <= 12} {incr x} {
        for {set y 1} {$y <= [lindex $honaphosz $x]} {incr y} {
            set napnevek [string tolower [lindex $honap($x) $y]]
            if {[regexp [subst -nocommands -nobackslashes {,($nevkeres)(,|$)}] ",$napnevek,"]} {
                append mikorvan "[lindex $honapok $x]$y. "
            }
        }
    }

    if {$mikorvan ne ""} {
        putserv "PRIVMSG $kinek :Névnap: Mikor van $arg nap: $mikorvan"
    } else {
        putserv "PRIVMSG $kinek :Névnap: Ilyen nevű névnap nincs."
    }
}