diff options
author | Santo Cariotti <santo@dcariotti.me> | 2025-04-17 22:08:43 +0200 |
---|---|---|
committer | Santo Cariotti <santo@dcariotti.me> | 2025-04-17 22:08:43 +0200 |
commit | 8255fbdd7d9d595e71545b7c6909114024527a34 (patch) | |
tree | 94773150af8b9d0a2b4e5b548923441cbc107b34 /pkg | |
parent | 9cd48c660231592f3f8d9a035d45b568d987616e (diff) |
Logger with also stdout and move logic to network.Me() instead of network.Peer()
Diffstat (limited to 'pkg')
-rw-r--r-- | pkg/ui/multiplayer/multiplayer.go | 32 | ||||
-rw-r--r-- | pkg/ui/views/api.go | 4 | ||||
-rw-r--r-- | pkg/ui/views/game.go | 23 | ||||
-rw-r--r-- | pkg/ui/views/game_api.go | 11 | ||||
-rw-r--r-- | pkg/ui/views/game_keymap.go | 10 | ||||
-rw-r--r-- | pkg/ui/views/game_moves.go | 4 | ||||
-rw-r--r-- | pkg/ui/views/game_util.go | 2 | ||||
-rw-r--r-- | pkg/ui/views/play.go | 2 | ||||
-rw-r--r-- | pkg/ui/views/play_api.go | 6 |
9 files changed, 53 insertions, 41 deletions
diff --git a/pkg/ui/multiplayer/multiplayer.go b/pkg/ui/multiplayer/multiplayer.go index 1680035..c9fc4b2 100644 --- a/pkg/ui/multiplayer/multiplayer.go +++ b/pkg/ui/multiplayer/multiplayer.go @@ -8,10 +8,12 @@ import ( ) type GameNetwork struct { - Server *network.TCPNetwork - Peer string + server *network.TCPNetwork + me network.NetworkID + peer network.NetworkID } +// Wrapper to a `TCPNetwork` func NewGameNetwork(localID string, address string, onHandshake network.NetworkHandshakeFunc, logger *zap.Logger) *GameNetwork { opts := network.TCPNetworkOpts{ ListenAddr: address, @@ -20,9 +22,29 @@ func NewGameNetwork(localID string, address string, onHandshake network.NetworkH Logger: logger, } server := network.NewTCPNetwork(network.NetworkID(localID), opts) - peer := "" return &GameNetwork{ - Server: server, - Peer: peer, + server: server, + me: network.NetworkID(localID), } } + +func (n *GameNetwork) Peer() network.NetworkID { + return n.peer +} + +func (n *GameNetwork) Me() network.NetworkID { + return n.me +} + +func (n *GameNetwork) Send(payload []byte) error { + return n.server.Send(n.peer, payload) +} + +func (n *GameNetwork) AddPeer(remoteID network.NetworkID, addr string) { + n.peer = remoteID + n.server.AddPeer(remoteID, addr) +} + +func (n *GameNetwork) AddReceiveFunction(f network.NetworkMessageReceiveFunc) { + n.server.OnReceiveFn = f +} diff --git a/pkg/ui/views/api.go b/pkg/ui/views/api.go index ba202c8..14f4cf2 100644 --- a/pkg/ui/views/api.go +++ b/pkg/ui/views/api.go @@ -38,7 +38,7 @@ func getUserID() (int, error) { return -1, err } - claims, err := auth.ValidateJWT("Bearer " + token) + claims, err := auth.ValidateJWT(token) if err != nil { return -1, err } @@ -55,7 +55,7 @@ func sendAPIRequest(method, url string, payload []byte, authorization string) (* } req.Header.Set("Content-Type", "application/json") - req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", authorization)) + req.Header.Add("Authorization", authorization) client := &http.Client{} return client.Do(req) diff --git a/pkg/ui/views/game.go b/pkg/ui/views/game.go index 7075f8b..a97d068 100644 --- a/pkg/ui/views/game.go +++ b/pkg/ui/views/game.go @@ -5,7 +5,6 @@ import ( "strings" "github.com/boozec/rahanna/internal/api/database" - "github.com/boozec/rahanna/internal/network" "github.com/boozec/rahanna/pkg/ui/multiplayer" "github.com/charmbracelet/bubbles/list" "github.com/charmbracelet/bubbles/textinput" @@ -25,7 +24,6 @@ type GameModel struct { keys gameKeyMap // Game state - peer string currentGameID int game *database.Game network *multiplayer.GameNetwork @@ -36,7 +34,7 @@ type GameModel struct { } // NewGameModel creates a new GameModel. -func NewGameModel(width, height int, peer string, currentGameID int, network *multiplayer.GameNetwork) GameModel { +func NewGameModel(width, height int, currentGameID int, network *multiplayer.GameNetwork) GameModel { listDelegate := list.NewDefaultDelegate() listDelegate.ShowDescription = false listDelegate.Styles.SelectedTitle = lipgloss.NewStyle(). @@ -55,7 +53,6 @@ func NewGameModel(width, height int, peer string, currentGameID int, network *mu width: width, height: height, keys: defaultGameKeyMap, - peer: peer, currentGameID: currentGameID, network: network, chessGame: chess.NewGame(chess.UseNotation(chess.UCINotation{})), @@ -97,10 +94,10 @@ func (m GameModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmds = append(cmds, cmd, m.updateMovesListCmd()) case EndGameMsg: if msg.abandoned { - if m.peer == "peer-2" { - m.game.Outcome = "1-0" + if m.network.Me() == "peer-1" { + m.game.Outcome = string(chess.WhiteWon) } else { - m.game.Outcome = "0-1" + m.game.Outcome = string(chess.BlackWon) } m, cmd = m.handleDatabaseGameMsg(*m.game) cmds = append(cmds, cmd) @@ -123,7 +120,7 @@ func (m GameModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.err = err } else { m.turn++ - m.network.Server.Send(network.NetworkID(m.peer), []byte(moveStr)) + m.network.Send([]byte(moveStr)) m.err = nil } cmds = append(cmds, m.getMoves(), m.updateMovesListCmd()) @@ -172,17 +169,17 @@ func (m GameModel) View() string { } else { var outcome string switch m.game.Outcome { - case "1-0": + case string(chess.WhiteWon): outcome = "White won" - if m.peer == "peer-2" { + if m.network.Me() == "peer-1" { outcome += " (YOU)" } - case "0-1": + case string(chess.BlackWon): outcome = "Black won" - if m.peer == "peer-1" { + if m.network.Me() == "peer-2" { outcome += " (YOU)" } - case "1/2-1/2": + case string(chess.Draw): outcome = "Draw" default: outcome = "NoOutcome" diff --git a/pkg/ui/views/game_api.go b/pkg/ui/views/game_api.go index 34ba1f3..485df41 100644 --- a/pkg/ui/views/game_api.go +++ b/pkg/ui/views/game_api.go @@ -12,11 +12,6 @@ import ( func (m GameModel) handleDatabaseGameMsg(msg database.Game) (GameModel, tea.Cmd) { m.game = &msg - if m.peer == "peer-2" { - m.network.Peer = msg.IP2 - } else { - m.network.Peer = msg.IP1 - } var cmd tea.Cmd @@ -52,15 +47,15 @@ func (m *GameModel) getGame() tea.Cmd { } // Establish peer connection - if m.peer == "peer-2" { + if m.network.Me() == "peer-1" { if game.IP2 != "" { remote := game.IP2 - go m.network.Server.AddPeer("peer-2", remote) + go m.network.AddPeer("peer-2", remote) } } else { if game.IP1 != "" { remote := game.IP1 - go m.network.Server.AddPeer("peer-1", remote) + go m.network.AddPeer("peer-1", remote) } } diff --git a/pkg/ui/views/game_keymap.go b/pkg/ui/views/game_keymap.go index 29881c8..5c65a57 100644 --- a/pkg/ui/views/game_keymap.go +++ b/pkg/ui/views/game_keymap.go @@ -3,10 +3,10 @@ package views import ( "fmt" - "github.com/boozec/rahanna/internal/network" "github.com/charmbracelet/bubbles/key" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" + "github.com/notnil/chess" ) // gameKeyMap defines the key bindings for the game view. @@ -36,13 +36,13 @@ func (m GameModel) handleKeyMsg(msg tea.KeyMsg) (GameModel, tea.Cmd) { switch { case key.Matches(msg, m.keys.Abandon): var outcome string - if m.peer == "peer-2" { - outcome = "0-1" + if m.network.Me() == "peer-1" { + outcome = string(chess.BlackWon) } else { - outcome = "1-0" + outcome = string(chess.WhiteWon) } - m.network.Server.Send(network.NetworkID(m.peer), []byte("🏳️")) + m.network.Send([]byte("🏳️")) return m, m.endGame(outcome) case key.Matches(msg, m.keys.Quit): return m, SwitchModelCmd(NewPlayModel(m.width, m.height)) diff --git a/pkg/ui/views/game_moves.go b/pkg/ui/views/game_moves.go index 4ce3796..eeee9e1 100644 --- a/pkg/ui/views/game_moves.go +++ b/pkg/ui/views/game_moves.go @@ -24,10 +24,10 @@ func (i item) Description() string { return "" } func (i item) FilterValue() string { return i.title } func (m *GameModel) getMoves() tea.Cmd { - m.network.Server.OnReceiveFn = func(msg network.Message) { + m.network.AddReceiveFunction(func(msg network.Message) { payload := string(msg.Payload) m.incomingMoves <- payload - } + }) return func() tea.Msg { move := <-m.incomingMoves diff --git a/pkg/ui/views/game_util.go b/pkg/ui/views/game_util.go index 7d83eee..eb904c5 100644 --- a/pkg/ui/views/game_util.go +++ b/pkg/ui/views/game_util.go @@ -24,5 +24,5 @@ func (m GameModel) buildWindowContent(content string, formWidth int) string { } func (m GameModel) isMyTurn() bool { - return m.turn%2 == 0 && m.peer == "peer-2" || m.turn%2 == 1 && m.peer == "peer-1" + return m.turn%2 == 0 && m.network.Me() == "peer-1" || m.turn%2 == 1 && m.network.Me() == "peer-2" } diff --git a/pkg/ui/views/play.go b/pkg/ui/views/play.go index ed5f1e1..20e2ebb 100644 --- a/pkg/ui/views/play.go +++ b/pkg/ui/views/play.go @@ -89,7 +89,7 @@ func (m PlayModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { m.userID, m.err = getUserID() return m.handleGamesResponse(msg) case StartGameMsg: - return m, SwitchModelCmd(NewGameModel(m.width, m.height+1, "peer-2", m.currentGameId, m.network)) + return m, SwitchModelCmd(NewGameModel(m.width, m.height+1, m.currentGameId, m.network)) case error: return m.handleError(msg) } diff --git a/pkg/ui/views/play_api.go b/pkg/ui/views/play_api.go index 7119ffa..40f26a8 100644 --- a/pkg/ui/views/play_api.go +++ b/pkg/ui/views/play_api.go @@ -68,11 +68,9 @@ func (m *PlayModel) handleGameResponse(msg database.Game) (tea.Model, tea.Cmd) { localPort, _ := strconv.ParseInt(ip[1], 10, 32) logger, _ := logger.GetLogger() - network := multiplayer.NewGameNetwork("peer-2", fmt.Sprintf("%s:%d", localIP, localPort), func() error { - return nil - }, logger) + network := multiplayer.NewGameNetwork("peer-2", fmt.Sprintf("%s:%d", localIP, localPort), network.DefaultHandshake, logger) - return m, SwitchModelCmd(NewGameModel(m.width, m.height+1, "peer-1", m.game.ID, network)) + return m, SwitchModelCmd(NewGameModel(m.width, m.height+1, m.game.ID, network)) } return m, nil } |