80 lines
2.9 KiB
Go
80 lines
2.9 KiB
Go
|
|
package handlers
|
||
|
|
|
||
|
|
import (
|
||
|
|
"customServer/internal/protocol"
|
||
|
|
"customServer/internal/state"
|
||
|
|
"fmt"
|
||
|
|
"net"
|
||
|
|
)
|
||
|
|
|
||
|
|
func HandleWhatsNewPussycatRequest(conn net.Conn, requestData []byte) ([]byte, int) {
|
||
|
|
fmt.Println("[TCP] Handling WhatsNewPussycatRequest")
|
||
|
|
|
||
|
|
mgr := state.GlobalManager
|
||
|
|
if mgr.HasActiveGame() {
|
||
|
|
activeGameID := mgr.GetActiveGameID()
|
||
|
|
fmt.Printf("[TCP] StatusReport: Reporting Active Game %d\n", activeGameID)
|
||
|
|
|
||
|
|
// StatusReport Message (Inner)
|
||
|
|
innerReport := make([]byte, 0)
|
||
|
|
|
||
|
|
// Field 1: GameId (int64)
|
||
|
|
innerReport = append(innerReport, 0x08)
|
||
|
|
innerReport = append(innerReport, protocol.EncodeVarint(uint64(activeGameID))...)
|
||
|
|
|
||
|
|
// Field 2: Status (Enum) = 1 (IN_PROGRESS)
|
||
|
|
innerReport = append(innerReport, 0x10)
|
||
|
|
innerReport = append(innerReport, protocol.EncodeVarint(uint64(protocol.GameStatus_IN_PROGRESS))...)
|
||
|
|
|
||
|
|
// Field 3: Data (Bytes) - Dynamic IronGameState
|
||
|
|
dataBytes := state.GetMockIronGameStateBytes()
|
||
|
|
innerReport = append(innerReport, 0x1a)
|
||
|
|
innerReport = append(innerReport, protocol.EncodeVarint(uint64(len(dataBytes)))...)
|
||
|
|
innerReport = append(innerReport, dataBytes...)
|
||
|
|
|
||
|
|
// Field 4: TurnId (int32) = 4
|
||
|
|
innerReport = append(innerReport, 0x20)
|
||
|
|
innerReport = append(innerReport, protocol.EncodeVarint(4)...)
|
||
|
|
|
||
|
|
// Field 5: NextPlayerIds (Repeated Int32)
|
||
|
|
nextPlayers := []uint64{uint64(state.MockUserID)}
|
||
|
|
npBytes := make([]byte, 0)
|
||
|
|
for _, pid := range nextPlayers {
|
||
|
|
npBytes = append(npBytes, protocol.EncodeVarint(pid)...)
|
||
|
|
}
|
||
|
|
innerReport = append(innerReport, 0x2a)
|
||
|
|
innerReport = append(innerReport, protocol.EncodeVarint(uint64(len(npBytes)))...)
|
||
|
|
innerReport = append(innerReport, npBytes...)
|
||
|
|
|
||
|
|
// Field 6: Players (Repeated Player)
|
||
|
|
mockPlayer := state.GetMockPlayerBytes()
|
||
|
|
innerReport = append(innerReport, 0x32)
|
||
|
|
innerReport = append(innerReport, protocol.EncodeVarint(uint64(len(mockPlayer)))...)
|
||
|
|
innerReport = append(innerReport, mockPlayer...)
|
||
|
|
|
||
|
|
// Field 14: Configuration (GameConfiguration)
|
||
|
|
fallbackConfig := getFallbackConfigBytes()
|
||
|
|
innerReport = append(innerReport, 0x72)
|
||
|
|
innerReport = append(innerReport, protocol.EncodeVarint(uint64(len(fallbackConfig)))...)
|
||
|
|
innerReport = append(innerReport, fallbackConfig...)
|
||
|
|
|
||
|
|
// Field 16: ActivePlayer (Int32)
|
||
|
|
innerReport = append(innerReport, 0x80, 0x01)
|
||
|
|
innerReport = append(innerReport, protocol.EncodeVarint(uint64(state.MockUserID))...)
|
||
|
|
|
||
|
|
// Wrap in GameStatusReportRequest (Field 1: repeated StatusReport)
|
||
|
|
responsePayload := make([]byte, 0)
|
||
|
|
responsePayload = append(responsePayload, 0x0a)
|
||
|
|
responsePayload = append(responsePayload, protocol.EncodeVarint(uint64(len(innerReport)))...)
|
||
|
|
responsePayload = append(responsePayload, innerReport...)
|
||
|
|
|
||
|
|
return responsePayload, 512
|
||
|
|
} else {
|
||
|
|
fmt.Println("[TCP] StatusReport: Reporting Idle/Lobby State (Dynamic)")
|
||
|
|
|
||
|
|
// Idle Status (Empty reports list)
|
||
|
|
responsePayload := make([]byte, 0)
|
||
|
|
return responsePayload, 512
|
||
|
|
}
|
||
|
|
}
|