75 lines
1.5 KiB
Go

package main
import (
"log"
"os"
"os/signal"
"syscall"
"time"
)
var (
loginServer *LoginServer
runLoops = true
)
func main() {
// Initialize logging
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("EQ2Emulator Login Server Starting...")
// Load configuration
config, err := LoadConfig("login_config.json")
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
// Initialize login server
loginServer, err = NewLoginServer(config)
if err != nil {
log.Fatalf("Failed to create login server: %v", err)
}
// Setup signal handling
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
// Start the server
go func() {
if err := loginServer.Start(); err != nil {
log.Fatalf("Server failed to start: %v", err)
}
}()
// Start maintenance routines
go startMaintenanceTimers()
log.Printf("Login server listening on port %d", config.Port)
// Wait for shutdown signal
<-sigChan
log.Println("Shutdown signal received, stopping server...")
runLoops = false
loginServer.Stop()
log.Println("Server stopped.")
}
// startMaintenanceTimers starts periodic maintenance tasks
func startMaintenanceTimers() {
statsTicker := time.NewTicker(60 * time.Second)
cleanupTicker := time.NewTicker(5 * time.Minute)
defer statsTicker.Stop()
defer cleanupTicker.Stop()
for runLoops {
select {
case <-statsTicker.C:
loginServer.UpdateStats()
case <-cleanupTicker.C:
loginServer.CleanupStaleConnections()
}
}
}