diff options
author | Santo Cariotti <santo@dcariotti.me> | 2025-04-18 12:46:00 +0200 |
---|---|---|
committer | Santo Cariotti <santo@dcariotti.me> | 2025-04-18 12:46:00 +0200 |
commit | fafd0111465ded6bfec5c0d91d7dd9c19ddac50b (patch) | |
tree | 17908eae0e0d3292798b7d98777ff8fb22722cfe /pkg | |
parent | 0f21452248783d627ec1a3b4e8a3f8f0d9a69a10 (diff) |
Close connection on end game
Diffstat (limited to 'pkg')
-rw-r--r-- | pkg/p2p/network.go | 6 | ||||
-rw-r--r-- | pkg/ui/multiplayer/multiplayer.go | 14 | ||||
-rw-r--r-- | pkg/ui/views/game.go | 2 | ||||
-rw-r--r-- | pkg/ui/views/game_keymap.go | 28 |
4 files changed, 38 insertions, 12 deletions
diff --git a/pkg/p2p/network.go b/pkg/p2p/network.go index 2ebec43..7ff0746 100644 --- a/pkg/p2p/network.go +++ b/pkg/p2p/network.go @@ -51,6 +51,7 @@ type TCPNetwork struct { id NetworkID listener net.Listener connections map[NetworkID]net.Conn + isClosed bool } // Initiliaze a new TCP network @@ -129,6 +130,8 @@ func (n *TCPNetwork) startServer() error { return err } + n.isClosed = false + go n.listenLoop() n.Logger.Sugar().Infof("server started on %s\n", n.ListenAddr) @@ -141,6 +144,7 @@ func (n *TCPNetwork) listenLoop() error { for { conn, err := n.listener.Accept() if errors.Is(err, net.ErrClosed) { + n.isClosed = true n.Logger.Sugar().Errorf("connection is closed in such a way: %v\n", err) return err } @@ -218,7 +222,7 @@ func (n *TCPNetwork) retryConnect(remoteID NetworkID, addr string) { if err != nil { n.Logger.Sugar().Errorf("failed to connect to %s: %v. Retrying in %v...", remoteID, err, n.RetryDelay) time.Sleep(n.RetryDelay) - if n.RetryDelay < 30*time.Second { + if !n.isClosed && n.RetryDelay < 30*time.Second { n.RetryDelay *= 2 } else { n.Lock() diff --git a/pkg/ui/multiplayer/multiplayer.go b/pkg/ui/multiplayer/multiplayer.go index 0e390eb..ac3bc7a 100644 --- a/pkg/ui/multiplayer/multiplayer.go +++ b/pkg/ui/multiplayer/multiplayer.go @@ -3,6 +3,7 @@ package multiplayer import ( "time" + "github.com/boozec/rahanna/internal/logger" "github.com/boozec/rahanna/pkg/p2p" "go.uber.org/zap" ) @@ -48,3 +49,16 @@ func (n *GameNetwork) AddPeer(remoteID p2p.NetworkID, addr string) { func (n *GameNetwork) AddReceiveFunction(f p2p.NetworkMessageReceiveFunc) { n.server.OnReceiveFn = f } + +func (n *GameNetwork) Close() error { + err := n.server.Close() + logger, _ := logger.GetLogger() + + if err != nil { + logger.Sugar().Errorf("Can't close connection for network '%+v': %s", n, err.Error()) + } else { + logger.Sugar().Infof("Connection closed for network '%+v'", n) + } + + return err +} diff --git a/pkg/ui/views/game.go b/pkg/ui/views/game.go index a97d068..8750789 100644 --- a/pkg/ui/views/game.go +++ b/pkg/ui/views/game.go @@ -102,6 +102,8 @@ func (m GameModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m, cmd = m.handleDatabaseGameMsg(*m.game) cmds = append(cmds, cmd) } + + m.err = m.network.Close() case error: m.err = msg } diff --git a/pkg/ui/views/game_keymap.go b/pkg/ui/views/game_keymap.go index 5c65a57..6f363d7 100644 --- a/pkg/ui/views/game_keymap.go +++ b/pkg/ui/views/game_keymap.go @@ -35,15 +35,18 @@ var defaultGameKeyMap = gameKeyMap{ func (m GameModel) handleKeyMsg(msg tea.KeyMsg) (GameModel, tea.Cmd) { switch { case key.Matches(msg, m.keys.Abandon): - var outcome string - if m.network.Me() == "peer-1" { - outcome = string(chess.BlackWon) - } else { - outcome = string(chess.WhiteWon) - } + // Abandon game only if it is not finished + if m.game.Outcome == "*" { + var outcome string + if m.network.Me() == "peer-1" { + outcome = string(chess.BlackWon) + } else { + outcome = string(chess.WhiteWon) + } - m.network.Send([]byte("🏳️")) - return m, m.endGame(outcome) + m.network.Send([]byte("🏳️")) + return m, m.endGame(outcome) + } case key.Matches(msg, m.keys.Quit): return m, SwitchModelCmd(NewPlayModel(m.width, m.height)) } @@ -52,9 +55,12 @@ func (m GameModel) handleKeyMsg(msg tea.KeyMsg) (GameModel, tea.Cmd) { } func (m GameModel) renderNavigationButtons() string { - abandonKey := fmt.Sprintf("%s %s", - altCodeStyle.Render(m.keys.Abandon.Help().Key), - m.keys.Abandon.Help().Desc) + var abandonKey string + if m.game.Outcome == "*" { + abandonKey = fmt.Sprintf("%s %s", + altCodeStyle.Render(m.keys.Abandon.Help().Key), + m.keys.Abandon.Help().Desc) + } quitKey := fmt.Sprintf("%s %s", altCodeStyle.Render(m.keys.Quit.Help().Key), |