Files
galaxy-game/internal/model/rest/command.go
T
2026-02-11 00:30:37 +02:00

197 lines
6.4 KiB
Go

package rest
import "encoding/json"
type Command struct {
Actor string `json:"actor" binding:"required,notblank"`
Commands []json.RawMessage `json:"cmd" binding:"min=1"`
}
type CommandType string
const (
CommandTypeRaceQuit CommandType = "raceQuit"
CommandTypeRaceVote CommandType = "raceVote"
CommandTypeRaceRelation CommandType = "declarePeace"
CommandTypeShipClassCreate CommandType = "shipClassCreate"
CommandTypeShipClassMerge CommandType = "shipClassMerge"
CommandTypeShipClassRemove CommandType = "shipClassRemove"
CommandTypeShipGroupLoad CommandType = "shipGroupLoad"
CommandTypeShipGroupUnload CommandType = "shipGroupUnload"
CommandTypeShipGroupSend CommandType = "shipGroupSend"
CommandTypeShipGroupUpgrade CommandType = "shipGroupUpgrade"
CommandTypeShipGroupBreak CommandType = "shipGroupBreak"
CommandTypeShipGroupMerge CommandType = "shipGroupMerge"
CommandTypeShipGroupDismantle CommandType = "shipGroupDismantle"
CommandTypeShipGroupTransfer CommandType = "shipGroupTransfer"
CommandTypeShipGroupJoinFleet CommandType = "shipGroupJoinFleet"
CommandTypeFleetMerge CommandType = "fleetMerge"
CommandTypeFleetSend CommandType = "fleetSend"
CommandTypeScienceCreate CommandType = "scienceCreate"
CommandTypeScienceRemove CommandType = "scienceRemove"
CommandTypePlanetRename CommandType = "planetRename"
CommandTypePlanetProduce CommandType = "planetProduce"
CommandTypePlanetRouteSet CommandType = "planetRouteSet"
CommandTypePlanetRouteRemove CommandType = "planetRouteRemove"
)
type DecodableCommand interface {
CommandType() CommandType
}
type CommandMeta struct {
Type CommandType `json:"@type" binding:"required,notblank"`
}
func (cm CommandMeta) CommandType() CommandType {
return cm.Type
}
type CommandRaceQuit struct {
CommandMeta
}
type CommandRaceVote struct {
CommandMeta
Acceptor string `json:"acceptor" binding:"required,notblank"`
}
type CommandRaceRelation struct {
CommandMeta
Acceptor string `json:"acceptor" binding:"required,notblank"`
Relation string `json:"relation" binding:"required,notblank"`
}
type CommandShipClassCreate struct {
CommandMeta
Name string `json:"name" binding:"required,notblank,entity"`
Drive float64 `json:"drive" binding:"eq=0|gte=1"`
Armament int `json:"armament" binding:"ammoWeapons=Weapons"`
Weapons float64 `json:"weapons" binding:"ammoWeapons=Armament"`
Shields float64 `json:"shields" binding:"eq=0|gte=1"`
Cargo float64 `json:"cargo" binding:"eq=0|gte=1"`
}
type CommandShipClassMerge struct {
CommandMeta
Name string `json:"name" binding:"required,notblank,entity,nefield=Target"`
Target string `json:"target" binding:"required,notblank,entity,nefield=Class"`
}
type CommandShipClassRemove struct {
CommandMeta
Name string `json:"name" binding:"required,notblank,entity"`
}
type CommandShipGroupLoad struct {
CommandMeta
ID string `json:"id" binding:"required,uuid_rfc4122"`
Cargo string `json:"cargo" binding:"required,notblank,oneof=COL MAT CAP"`
Ships int `json:"ships" binding:"gte=0"`
Quantity float64 `json:"quantity" binding:"gte=0"`
}
type CommandShipGroupUnload struct {
CommandMeta
ID string `json:"id" binding:"required,uuid_rfc4122"`
Ships int `json:"ships" binding:"gte=0"`
Quantity float64 `json:"quantity" binding:"gte=0"`
}
type CommandShipGroupSend struct {
CommandMeta
ID string `json:"id" binding:"required,uuid_rfc4122"`
Destination int `json:"planetNumber" binding:"gte=0"`
Quantity int `json:"quantity" binding:"gte=0"`
}
type CommandShipGroupUpgrade struct {
CommandMeta
ID string `json:"id" binding:"required,uuid_rfc4122"`
Tech string `json:"tech" binding:"oneof=ALL DRIVE WEAPONS SHIELDS CARGO"`
MaxShips int `json:"maxShips" binding:"gte=0"`
Level int `json:"level" binding:"gte=1"`
}
type CommandShipGroupMerge struct {
CommandMeta
}
type CommandShipGroupBreak struct {
CommandMeta
ID string `json:"id" binding:"required,uuid_rfc4122"`
Quantity int `json:"quantity" binding:"gte=0"`
}
type CommandShipGroupDismantle struct {
CommandMeta
ID string `json:"id" binding:"required,uuid_rfc4122"`
Quantity int `json:"quantity" binding:"gte=0"`
}
type CommandShipGroupTransfer struct {
CommandMeta
ID string `json:"id" binding:"required,uuid_rfc4122"`
Acceptor string `json:"acceptor" binding:"required,notblank"`
Quantity int `json:"quantity" binding:"gte=0"`
}
type CommandShipGroupJoinFleet struct {
CommandMeta
ID string `json:"id" binding:"required,uuid_rfc4122"`
Name string `json:"name" binding:"required,notblank,entity"`
Quantity int `json:"quantity" binding:"gte=0"`
}
type CommandFleetMerge struct {
CommandMeta
Name string `json:"name" binding:"required,notblank,entity,nefield=Target"`
Target string `json:"target" binding:"required,notblank,entity,nefield=Name"`
}
type CommandFleetSend struct {
CommandMeta
Name string `json:"name" binding:"required,notblank,entity"`
Destination int `json:"planetNumber" binding:"gte=0"`
}
type CommandScienceCreate struct {
CommandMeta
Name string `json:"name" binding:"required,notblank,entity"`
Drive float64 `json:"drive" binding:"gte=0,lte=1"`
Weapons float64 `json:"weapons" binding:"gte=0,lte=1"`
Shields float64 `json:"shields" binding:"gte=0,lte=1"`
Cargo float64 `json:"cargo" binding:"gte=0,lte=1"`
}
type CommandScienceRemove struct {
CommandMeta
Name string `json:"name" binding:"required,notblank,entity"`
}
type CommandPlanetRename struct {
CommandMeta
Number int `json:"planetNumber" binding:"gte=0"`
Name string `json:"name" binding:"required,notblank,entity"`
}
type CommandPlanetProduce struct {
CommandMeta
Number int `json:"planetNumber" binding:"gte=0"`
Production string `json:"production" binding:"oneof=MAT CAP DRIVE WEAPONS SHIELDS CARGO SCIENCE SHIP"`
Subject string `json:"subject" binding:"subject"`
}
type CommandPlanetRouteSet struct {
CommandMeta
Origin int `json:"fromPlanetNumber" binding:"gte=0,nefield=Destination"`
Destination int `json:"toPlanetNumber" binding:"gte=0,nefield=Number"`
LoadType string `json:"loadType" binding:"oneof=MAT CAP COL EMP"`
}
type CommandPlanetRouteRemove struct {
CommandMeta
Origin int `json:"fromPlanetNumber" binding:"gte=0,nefield=Destination"`
LoadType string `json:"loadType" binding:"oneof=MAT CAP COL EMP"`
}