LastMUD/internal/server/server.go

111 lines
1.9 KiB
Go
Raw Normal View History

2025-06-19 16:22:55 +03:00
package server
import (
2025-06-20 16:26:39 +03:00
"context"
2025-06-19 16:22:55 +03:00
"net"
2025-06-20 16:26:39 +03:00
"sync"
2025-06-19 16:22:55 +03:00
"time"
2025-06-20 16:26:39 +03:00
"code.haedhutner.dev/mvv/LastMUD/internal/game"
"code.haedhutner.dev/mvv/LastMUD/internal/logging"
2025-06-19 16:22:55 +03:00
)
type Server struct {
2025-06-20 16:26:39 +03:00
ctx context.Context
wg *sync.WaitGroup
2025-06-19 16:22:55 +03:00
listener *net.TCPListener
connections []*Connection
2025-06-20 16:26:39 +03:00
game *game.LastMUDGame
2025-06-19 16:22:55 +03:00
}
2025-06-20 16:26:39 +03:00
func CreateServer(ctx context.Context, wg *sync.WaitGroup, port string) (srv *Server, err error) {
logging.Info(" _ _ __ __ _ _ ____ ")
logging.Info(" | | __ _ ___| |_| \\/ | | | | _ \\ ")
logging.Info(" | | / _` / __| __| |\\/| | | | | | | | ")
logging.Info(" | |__| (_| \\__ \\ |_| | | | |_| | |_| | ")
logging.Info(" |_____\\__,_|___/\\__|_| |_|\\___/|____/ ")
logging.Info(" ")
2025-06-19 16:22:55 +03:00
addr, err := net.ResolveTCPAddr("tcp", port)
if err != nil {
2025-06-20 16:26:39 +03:00
logging.Error(err)
2025-06-19 16:22:55 +03:00
return nil, err
}
ln, err := net.ListenTCP("tcp", addr)
if err != nil {
2025-06-20 16:26:39 +03:00
logging.Error(err)
2025-06-19 16:22:55 +03:00
return nil, err
}
2025-06-20 16:26:39 +03:00
logging.Info("Starting server, listening on port ", port)
2025-06-19 16:22:55 +03:00
srv = &Server{
2025-06-20 16:26:39 +03:00
ctx: ctx,
wg: wg,
2025-06-19 16:22:55 +03:00
listener: ln,
connections: []*Connection{},
}
2025-06-20 16:26:39 +03:00
srv.game = game.CreateGame(ctx, srv.wg)
srv.wg.Add(1)
go srv.listen()
2025-06-19 16:22:55 +03:00
return
}
2025-06-20 16:26:39 +03:00
func (srv *Server) listen() {
defer srv.wg.Done()
defer srv.shutdown()
2025-06-19 16:22:55 +03:00
for {
2025-06-20 16:26:39 +03:00
srv.listener.SetDeadline(time.Now().Add(1 * time.Second))
2025-06-19 16:22:55 +03:00
if srv.shouldStop() {
break
}
conn, err := srv.listener.Accept()
if err != nil {
continue
}
2025-06-20 16:26:39 +03:00
tcpConn, ok := conn.(*net.TCPConn)
2025-06-19 16:22:55 +03:00
2025-06-20 16:26:39 +03:00
if !ok {
logging.Warn("Attempted invalid connection from", conn.RemoteAddr())
continue
}
2025-06-19 16:22:55 +03:00
2025-06-20 16:26:39 +03:00
c := CreateConnection(tcpConn, srv.ctx, srv.wg)
srv.connections = append(srv.connections, c)
2025-06-19 16:22:55 +03:00
}
2025-06-20 16:26:39 +03:00
}
func (srv *Server) shutdown() {
logging.Info("Stopping Server...")
2025-06-19 16:22:55 +03:00
err := srv.listener.Close()
if err != nil {
2025-06-20 16:26:39 +03:00
logging.Error(err)
2025-06-19 16:22:55 +03:00
}
}
func (srv *Server) shouldStop() bool {
select {
2025-06-20 16:26:39 +03:00
case <-srv.ctx.Done():
2025-06-19 16:22:55 +03:00
return true
default:
return false
}
}