summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2025-04-18 12:46:00 +0200
committerSanto Cariotti <santo@dcariotti.me>2025-04-18 12:46:00 +0200
commitfafd0111465ded6bfec5c0d91d7dd9c19ddac50b (patch)
tree17908eae0e0d3292798b7d98777ff8fb22722cfe
parent0f21452248783d627ec1a3b4e8a3f8f0d9a69a10 (diff)
Close connection on end game
-rw-r--r--pkg/p2p/network.go6
-rw-r--r--pkg/ui/multiplayer/multiplayer.go14
-rw-r--r--pkg/ui/views/game.go2
-rw-r--r--pkg/ui/views/game_keymap.go28
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),