Replace log.Printf/Println with slog.Info/Error/Warn across the codebase. Initialize slog with JSON handler in main.go. Add panic recovery defer in SSH session handler. Add structured game event logging (room created, player joined, game started, game over, player inactive removed). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
54 lines
1.5 KiB
Go
54 lines
1.5 KiB
Go
package server
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
|
|
"github.com/charmbracelet/ssh"
|
|
"github.com/charmbracelet/wish"
|
|
"github.com/charmbracelet/wish/bubbletea"
|
|
tea "github.com/charmbracelet/bubbletea"
|
|
gossh "golang.org/x/crypto/ssh"
|
|
"github.com/tolelom/catacombs/game"
|
|
"github.com/tolelom/catacombs/store"
|
|
"github.com/tolelom/catacombs/ui"
|
|
)
|
|
|
|
func Start(addr string, lobby *game.Lobby, db *store.DB) error {
|
|
s, err := wish.NewServer(
|
|
wish.WithAddress(addr),
|
|
wish.WithHostKeyPath(".ssh/catacombs_host_key"),
|
|
wish.WithPublicKeyAuth(func(_ ssh.Context, _ ssh.PublicKey) bool {
|
|
return true // accept all keys
|
|
}),
|
|
wish.WithPasswordAuth(func(_ ssh.Context, _ string) bool {
|
|
return true // accept any password (game server, not secure shell)
|
|
}),
|
|
wish.WithMiddleware(
|
|
bubbletea.Middleware(func(s ssh.Session) (tea.Model, []tea.ProgramOption) {
|
|
pty, _, _ := s.Pty()
|
|
fingerprint := ""
|
|
if s.PublicKey() != nil {
|
|
fingerprint = gossh.FingerprintSHA256(s.PublicKey())
|
|
}
|
|
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
slog.Error("session panic recovered", "error", r, "fingerprint", fingerprint)
|
|
}
|
|
}()
|
|
|
|
slog.Info("new SSH session", "fingerprint", fingerprint, "width", pty.Window.Width, "height", pty.Window.Height)
|
|
m := ui.NewModel(pty.Window.Width, pty.Window.Height, fingerprint, lobby, db)
|
|
return m, []tea.ProgramOption{tea.WithAltScreen()}
|
|
}),
|
|
),
|
|
)
|
|
if err != nil {
|
|
return fmt.Errorf("could not create server: %w", err)
|
|
}
|
|
|
|
slog.Info("starting SSH server", "addr", addr)
|
|
return s.ListenAndServe()
|
|
}
|