diff options
-rw-r--r-- | pkg/p2p/network.go | 3 | ||||
-rw-r--r-- | pkg/ui/views/game.go | 6 | ||||
-rw-r--r-- | pkg/ui/views/game_api.go | 29 | ||||
-rw-r--r-- | pkg/ui/views/game_keymap.go | 2 | ||||
-rw-r--r-- | pkg/ui/views/game_util.go | 12 | ||||
-rw-r--r-- | pkg/ui/views/play_api.go | 4 |
6 files changed, 36 insertions, 20 deletions
diff --git a/pkg/p2p/network.go b/pkg/p2p/network.go index 7ff0746..fba8c80 100644 --- a/pkg/p2p/network.go +++ b/pkg/p2p/network.go @@ -22,6 +22,9 @@ type Message struct { // A network ID is represented by a string type NetworkID string +// Default empty network' ID +const EmptyNetworkID NetworkID = NetworkID("") + // This type represents the function that is called every time a new message // arrives to the server. type NetworkMessageReceiveFunc func(msg Message) diff --git a/pkg/ui/views/game.go b/pkg/ui/views/game.go index 8750789..4e8cc87 100644 --- a/pkg/ui/views/game.go +++ b/pkg/ui/views/game.go @@ -94,7 +94,7 @@ func (m GameModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { cmds = append(cmds, cmd, m.updateMovesListCmd()) case EndGameMsg: if msg.abandoned { - if m.network.Me() == "peer-1" { + if m.network.Me() == m.playerPeer(1) { m.game.Outcome = string(chess.WhiteWon) } else { m.game.Outcome = string(chess.BlackWon) @@ -173,12 +173,12 @@ func (m GameModel) View() string { switch m.game.Outcome { case string(chess.WhiteWon): outcome = "White won" - if m.network.Me() == "peer-1" { + if m.network.Me() == m.playerPeer(1) { outcome += " (YOU)" } case string(chess.BlackWon): outcome = "Black won" - if m.network.Me() == "peer-2" { + if m.network.Me() == m.playerPeer(2) { outcome += " (YOU)" } case string(chess.Draw): diff --git a/pkg/ui/views/game_api.go b/pkg/ui/views/game_api.go index 485df41..e2ef280 100644 --- a/pkg/ui/views/game_api.go +++ b/pkg/ui/views/game_api.go @@ -6,6 +6,7 @@ import ( "os" "github.com/boozec/rahanna/internal/api/database" + "github.com/boozec/rahanna/pkg/p2p" tea "github.com/charmbracelet/bubbletea" "github.com/notnil/chess" ) @@ -15,6 +16,21 @@ func (m GameModel) handleDatabaseGameMsg(msg database.Game) (GameModel, tea.Cmd) var cmd tea.Cmd + // Establish peer connection + if m.network.Peer() == p2p.EmptyNetworkID { + if m.network.Me() == m.playerPeer(1) { + if m.game.IP2 != "" { + remote := m.game.IP2 + go m.network.AddPeer(m.playerPeer(2), remote) + } + } else { + if m.game.IP1 != "" { + remote := m.game.IP1 + go m.network.AddPeer(m.playerPeer(1), remote) + } + } + } + if m.game.Outcome != chess.NoOutcome.String() { cmd = func() tea.Msg { return EndGameMsg{} @@ -46,19 +62,6 @@ func (m *GameModel) getGame() tea.Cmd { return nil } - // Establish peer connection - if m.network.Me() == "peer-1" { - if game.IP2 != "" { - remote := game.IP2 - go m.network.AddPeer("peer-2", remote) - } - } else { - if game.IP1 != "" { - remote := game.IP1 - go m.network.AddPeer("peer-1", remote) - } - } - return game } } diff --git a/pkg/ui/views/game_keymap.go b/pkg/ui/views/game_keymap.go index 6f363d7..00b062f 100644 --- a/pkg/ui/views/game_keymap.go +++ b/pkg/ui/views/game_keymap.go @@ -38,7 +38,7 @@ func (m GameModel) handleKeyMsg(msg tea.KeyMsg) (GameModel, tea.Cmd) { // Abandon game only if it is not finished if m.game.Outcome == "*" { var outcome string - if m.network.Me() == "peer-1" { + if m.network.Me() == m.playerPeer(1) { outcome = string(chess.BlackWon) } else { outcome = string(chess.WhiteWon) diff --git a/pkg/ui/views/game_util.go b/pkg/ui/views/game_util.go index eb904c5..f5e4a5d 100644 --- a/pkg/ui/views/game_util.go +++ b/pkg/ui/views/game_util.go @@ -1,6 +1,9 @@ package views import ( + "fmt" + + "github.com/boozec/rahanna/pkg/p2p" tea "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" ) @@ -24,5 +27,12 @@ func (m GameModel) buildWindowContent(content string, formWidth int) string { } func (m GameModel) isMyTurn() bool { - return m.turn%2 == 0 && m.network.Me() == "peer-1" || m.turn%2 == 1 && m.network.Me() == "peer-2" + return m.turn%2 == 0 && m.network.Me() == m.playerPeer(1) || m.turn%2 == 1 && m.network.Me() == m.playerPeer(2) +} + +func (m GameModel) playerPeer(n int) p2p.NetworkID { + if m.game == nil { + return p2p.EmptyNetworkID + } + return p2p.NetworkID(fmt.Sprintf("%s-%d", m.game.Name, n)) } diff --git a/pkg/ui/views/play_api.go b/pkg/ui/views/play_api.go index d65dca9..6cc0c6e 100644 --- a/pkg/ui/views/play_api.go +++ b/pkg/ui/views/play_api.go @@ -45,7 +45,7 @@ func (m *PlayModel) handlePlayResponse(msg playResponse) (tea.Model, tea.Cmd) { logger, _ := logger.GetLogger() callbackCompleted := make(chan bool) - m.network = multiplayer.NewGameNetwork("peer-1", fmt.Sprintf("%s:%d", msg.Ok.IP, msg.Ok.Port), func() error { + m.network = multiplayer.NewGameNetwork(fmt.Sprintf("%s-1", m.playName), fmt.Sprintf("%s:%d", msg.Ok.IP, msg.Ok.Port), func() error { close(callbackCompleted) return nil }, logger) @@ -68,7 +68,7 @@ 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), p2p.DefaultHandshake, logger) + network := multiplayer.NewGameNetwork(fmt.Sprintf("%s-2", m.game.Name), fmt.Sprintf("%s:%d", localIP, localPort), p2p.DefaultHandshake, logger) return m, SwitchModelCmd(NewGameModel(m.width, m.height+1, m.game.ID, network)) } |