|
|
|
|
package core
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"log/slog"
|
|
|
|
|
"net"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/EngoEngine/ecs"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type Server struct {
|
|
|
|
|
l *slog.Logger
|
|
|
|
|
port string
|
|
|
|
|
ctx context.Context
|
|
|
|
|
Sessions chan *Session
|
|
|
|
|
ln net.Listener
|
|
|
|
|
w *ecs.World
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewServer(ctx context.Context, l *slog.Logger, port string, w *ecs.World) *Server {
|
|
|
|
|
var s Server
|
|
|
|
|
|
|
|
|
|
c := make(chan *Session)
|
|
|
|
|
s.Sessions = c
|
|
|
|
|
lc := net.ListenConfig{
|
|
|
|
|
KeepAlive: 5 * time.Minute,
|
|
|
|
|
KeepAliveConfig: net.KeepAliveConfig{
|
|
|
|
|
Enable: true,
|
|
|
|
|
Idle: 3 * time.Minute,
|
|
|
|
|
Interval: 15 * time.Second,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ln, err := lc.Listen(ctx, "tcp", port)
|
|
|
|
|
if err != nil {
|
|
|
|
|
s.l.With(
|
|
|
|
|
slog.Any("error", err),
|
|
|
|
|
).Error("could not start tcp listener")
|
|
|
|
|
return &s
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
s.ctx = ctx
|
|
|
|
|
s.ln = ln
|
|
|
|
|
s.l = l
|
|
|
|
|
s.port = port
|
|
|
|
|
s.w = w
|
|
|
|
|
|
|
|
|
|
return &s
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *Server) Start() {
|
|
|
|
|
s.l.Debug("starting telnet server")
|
|
|
|
|
for {
|
|
|
|
|
select {
|
|
|
|
|
case <-s.ctx.Done():
|
|
|
|
|
return
|
|
|
|
|
default:
|
|
|
|
|
conn, err := s.ln.Accept()
|
|
|
|
|
if err != nil {
|
|
|
|
|
s.l.With(
|
|
|
|
|
slog.Any("error", err),
|
|
|
|
|
).Error("could not accept tcp connection")
|
|
|
|
|
}
|
|
|
|
|
s.Sessions <- NewSession(s.ctx, conn, Printer{}, s.l)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|