summaryrefslogtreecommitdiff
path: root/pkg
diff options
context:
space:
mode:
authorSanto Cariotti <santo@dcariotti.me>2025-04-17 22:08:43 +0200
committerSanto Cariotti <santo@dcariotti.me>2025-04-17 22:08:43 +0200
commit8255fbdd7d9d595e71545b7c6909114024527a34 (patch)
tree94773150af8b9d0a2b4e5b548923441cbc107b34 /pkg
parent9cd48c660231592f3f8d9a035d45b568d987616e (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.go32
-rw-r--r--pkg/ui/views/api.go4
-rw-r--r--pkg/ui/views/game.go23
-rw-r--r--pkg/ui/views/game_api.go11
-rw-r--r--pkg/ui/views/game_keymap.go10
-rw-r--r--pkg/ui/views/game_moves.go4
-rw-r--r--pkg/ui/views/game_util.go2
-rw-r--r--pkg/ui/views/play.go2
-rw-r--r--pkg/ui/views/play_api.go6
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
}