diff --git a/proto/server.proto b/proto/server.proto index a724536..004d5fd 100644 --- a/proto/server.proto +++ b/proto/server.proto @@ -13,6 +13,16 @@ enum ServerPacketType { LEAVE = 6; LIST = 7; TOTAL = 8; + STATUS = 9; +} + +enum ServerStatus { + FREE = 0; + WAITING = 1; + STARTING = 2; + PLAYING = 3; + ENDING = 4; + FULL = 5; } message ServerPacket { @@ -49,4 +59,8 @@ message ServerListPacket { message ServerTotalPacket { int32 total = 1; +} + +message ServerStatusPacket { + ServerStatus status = 1; } \ No newline at end of file diff --git a/router/minecraft/servers.go b/router/minecraft/servers.go index 223182c..8dd1169 100644 --- a/router/minecraft/servers.go +++ b/router/minecraft/servers.go @@ -22,6 +22,7 @@ const ( ServerTypeRoom ServerType = "ROOM" ServerTypeLimbo ServerType = "LIMBO" ServerTypeSystem ServerType = "SYSTEM" + ServerTypeMega ServerType = "MAGA" // make america great again ) func (typ ServerType) Prefix() string { @@ -34,6 +35,8 @@ func (typ ServerType) Prefix() string { return "" case ServerTypeSystem: return "S" + case ServerTypeMega: + return "mega" case ServerTypeUnknown: default: return "U" @@ -41,6 +44,17 @@ func (typ ServerType) Prefix() string { return "U" } +type Status string + +const ( + ServerStatusFree Status = "FREE" + ServerStatusWaiting Status = "WAITING" + ServerStatusStarting Status = "STARTING" + ServerStatusFull Status = "FULL" + ServerStatusPlaying Status = "PLAYING" + ServerStatusEnding Status = "ENDING" +) + type Server struct { Id string `json:"id"` Name string `json:"name"` @@ -50,6 +64,7 @@ type Server struct { Type ServerType `json:"type"` Motd string `json:"motd"` Players []string `json:"players"` + Status Status `json:"status"` LastHB time.Time } @@ -150,12 +165,14 @@ func ServerRegister(c *gin.Context) { } server := &Server{ - Id: generateServerId(data.Type.Prefix()), - Host: data.Host, - Port: data.Port, - Type: data.Type, - Group: data.Group, - LastHB: time.Now(), + Id: generateServerId(data.Type.Prefix()), + Host: data.Host, + Port: data.Port, + Motd: data.Motd, + Type: data.Type, + Group: data.Group, + Players: make([]string, 0), + LastHB: time.Now(), } if data.Name == "AUTO" { @@ -336,6 +353,32 @@ func serverReadLoop(conn *ws.Conn, serverId string) { conn.WriteChan <- ws.Binary(buf) return } + case ServerPacketType_STATUS: + var payload ServerStatusPacket + err := proto.Unmarshal(pkt.GetPayload(), &payload) + if err != nil { + panic(err) + } + switch payload.Status { + case ServerStatus_FREE: + server.Status = ServerStatusFull + break + case ServerStatus_WAITING: + server.Status = ServerStatusWaiting + break + case ServerStatus_STARTING: + server.Status = ServerStatusStarting + break + case ServerStatus_PLAYING: + server.Status = ServerStatusPlaying + break + case ServerStatus_ENDING: + server.Status = ServerStatusEnding + break + case ServerStatus_FULL: + server.Status = ServerStatusFull + break + } case ServerPacketType_TOTAL: total := 0 servers.Range(func(_, value any) bool { @@ -358,10 +401,8 @@ func serverReadLoop(conn *ws.Conn, serverId string) { } conn.WriteChan <- ws.Binary(buf) } - default: - if conn.IsClosed() { - return - } + case <-conn.Context.Done(): + return } } }