90 lines
1.7 KiB
Go
90 lines
1.7 KiB
Go
package plays
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"gitea.konchin.com/ytshih/inp2025/game/types"
|
|
ea "github.com/charmbracelet/bubbletea"
|
|
)
|
|
|
|
type JoinRoom struct {
|
|
*Base
|
|
rooms []types.Room
|
|
cursor int
|
|
choice *types.Room
|
|
}
|
|
|
|
func NewJoinRoom(base *Base, rooms []types.Room) *JoinRoom {
|
|
return &JoinRoom{
|
|
Base: base,
|
|
rooms: rooms,
|
|
}
|
|
}
|
|
|
|
func (m *JoinRoom) Init() ea.Cmd {
|
|
return ea.ClearScreen
|
|
}
|
|
|
|
func (m *JoinRoom) Update(msg ea.Msg) (ea.Model, ea.Cmd) {
|
|
switch msg := msg.(type) {
|
|
case ea.KeyMsg:
|
|
switch msg.String() {
|
|
case "ctrl+c", "q":
|
|
return m, ea.Quit
|
|
case "enter":
|
|
if m.cursor < len(m.rooms) {
|
|
m.choice = &m.rooms[m.cursor]
|
|
}
|
|
return m, ea.Quit
|
|
case "up":
|
|
if m.cursor > 0 {
|
|
m.cursor--
|
|
}
|
|
case "down":
|
|
if m.cursor < len(m.rooms)-1 {
|
|
m.cursor++
|
|
}
|
|
}
|
|
}
|
|
return m, nil
|
|
}
|
|
|
|
func (m *JoinRoom) View() string {
|
|
var b strings.Builder
|
|
b.WriteString("Select a room to join:\n\n")
|
|
|
|
for i, room := range m.rooms {
|
|
if m.cursor == i {
|
|
b.WriteString("(•) ")
|
|
} else {
|
|
b.WriteString("( ) ")
|
|
}
|
|
b.WriteString(room.View() + "\n")
|
|
}
|
|
|
|
return b.String()
|
|
}
|
|
|
|
func (m *JoinRoom) Next(queue *[]*ea.Program) error {
|
|
if m.choice == nil {
|
|
*queue = append(*queue, ea.NewProgram(NewLobby(m.Base)))
|
|
return nil
|
|
}
|
|
|
|
resp, err := m.Base.client.R().
|
|
SetResult(&types.Room{}).
|
|
Post(fmt.Sprintf("/api/rooms/%s/join", m.choice.ID))
|
|
|
|
if err != nil || resp.StatusCode() != http.StatusOK {
|
|
*queue = append(*queue, ea.NewProgram(NewRedirect("Failed to join room")))
|
|
*queue = append(*queue, ea.NewProgram(NewLobby(m.Base)))
|
|
return nil
|
|
}
|
|
|
|
room := resp.Result().(*types.Room)
|
|
*queue = append(*queue, ea.NewProgram(NewRoomWaiting(m.Base, room.ID)))
|
|
return nil
|
|
}
|