From ed52397ea9a2e282e695f5c84d60150fdcd639e4 Mon Sep 17 00:00:00 2001 From: lc-official Date: Mon, 11 Aug 2025 11:55:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0server=20status=E5=92=8Cmega?= =?UTF-8?q?=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- proto/server.proto | 14 +++++++++ router/minecraft/servers.go | 61 +++++++++++++++++++++++++++++++------ 2 files changed, 65 insertions(+), 10 deletions(-) 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 } } }