Fix bug with Bedrock status

This commit is contained in:
Jacob Gunther
2023-08-13 21:03:18 -05:00
parent f7b9a06503
commit 0b19ad96f5

View File

@@ -308,7 +308,7 @@ func FetchBedrockStatus(host string, port uint16) BedrockStatusResponse {
func BuildJavaResponse(host string, port uint16, status interface{}, query *response.FullQuery) (result JavaStatusResponse) { func BuildJavaResponse(host string, port uint16, status interface{}, query *response.FullQuery) (result JavaStatusResponse) {
result = JavaStatusResponse{ result = JavaStatusResponse{
BaseStatus: BaseStatus{ BaseStatus: BaseStatus{
Online: status != nil || query != nil, Online: false,
Host: host, Host: host,
Port: port, Port: port,
EULABlocked: IsBlockedAddress(host), EULABlocked: IsBlockedAddress(host),
@@ -318,43 +318,38 @@ func BuildJavaResponse(host string, port uint16, status interface{}, query *resp
JavaStatus: nil, JavaStatus: nil,
} }
if status == nil && query == nil { // Status
return
}
result.JavaStatus = &JavaStatus{
Players: JavaPlayers{
List: make([]Player, 0),
},
Mods: make([]Mod, 0),
Plugins: make([]Plugin, 0),
}
if status != nil {
switch s := status.(type) { switch s := status.(type) {
case *response.JavaStatus: case *response.JavaStatus:
{ {
result.Version = &JavaVersion{ if s == nil {
break
}
result.Online = true
result.JavaStatus = &JavaStatus{
Version: &JavaVersion{
NameRaw: s.Version.NameRaw, NameRaw: s.Version.NameRaw,
NameClean: s.Version.NameClean, NameClean: s.Version.NameClean,
NameHTML: s.Version.NameHTML, NameHTML: s.Version.NameHTML,
Protocol: s.Version.Protocol, Protocol: s.Version.Protocol,
} },
Players: JavaPlayers{
result.Players = JavaPlayers{
Online: s.Players.Online, Online: s.Players.Online,
Max: s.Players.Max, Max: s.Players.Max,
List: make([]Player, 0), List: make([]Player, 0),
} },
MOTD: MOTD{
result.MOTD = MOTD{
Raw: s.MOTD.Raw, Raw: s.MOTD.Raw,
Clean: s.MOTD.Clean, Clean: s.MOTD.Clean,
HTML: s.MOTD.HTML, HTML: s.MOTD.HTML,
},
Icon: s.Favicon,
Mods: make([]Mod, 0),
Plugins: make([]Plugin, 0),
} }
result.Icon = s.Favicon
if s.Players.Sample != nil { if s.Players.Sample != nil {
for _, player := range s.Players.Sample { for _, player := range s.Players.Sample {
result.Players.List = append(result.Players.List, Player{ result.Players.List = append(result.Players.List, Player{
@@ -379,6 +374,29 @@ func BuildJavaResponse(host string, port uint16, status interface{}, query *resp
} }
case *response.JavaStatusLegacy: case *response.JavaStatusLegacy:
{ {
if s == nil {
break
}
result.Online = true
result.JavaStatus = &JavaStatus{
Version: nil,
Players: JavaPlayers{
Online: &s.Players.Online,
Max: &s.Players.Max,
List: make([]Player, 0),
},
MOTD: MOTD{
Raw: s.MOTD.Raw,
Clean: s.MOTD.Clean,
HTML: s.MOTD.HTML,
},
Icon: nil,
Mods: make([]Mod, 0),
Plugins: make([]Plugin, 0),
}
if s.Version != nil { if s.Version != nil {
result.Version = &JavaVersion{ result.Version = &JavaVersion{
NameRaw: s.Version.NameRaw, NameRaw: s.Version.NameRaw,
@@ -388,27 +406,23 @@ func BuildJavaResponse(host string, port uint16, status interface{}, query *resp
} }
} }
result.Players = JavaPlayers{
Online: &s.Players.Online,
Max: &s.Players.Max,
List: make([]Player, 0),
}
result.MOTD = MOTD{
Raw: s.MOTD.Raw,
Clean: s.MOTD.Clean,
HTML: s.MOTD.HTML,
}
break break
} }
default:
panic(fmt.Errorf("unknown status type: %T", status))
}
} }
// Query
if query != nil { if query != nil {
if status == nil { result.Online = true
if result.JavaStatus == nil {
result.JavaStatus = &JavaStatus{
Players: JavaPlayers{
List: make([]Player, 0),
},
Mods: make([]Mod, 0),
Plugins: make([]Plugin, 0),
}
if motd, ok := query.Data["hostname"]; ok { if motd, ok := query.Data["hostname"]; ok {
if parsedMOTD, err := description.ParseFormatting(motd); err == nil { if parsedMOTD, err := description.ParseFormatting(motd); err == nil {
result.MOTD = MOTD{ result.MOTD = MOTD{
@@ -435,16 +449,16 @@ func BuildJavaResponse(host string, port uint16, status interface{}, query *resp
} }
} }
for _, username := range query.Players { if version, ok := query.Data["version"]; ok {
parsedName, err := description.ParseFormatting(username) parsedValue, err := description.ParseFormatting(version)
if err == nil { if err == nil {
result.Players.List = append(result.Players.List, Player{ result.Version = &JavaVersion{
UUID: "", NameRaw: parsedValue.Raw,
NameRaw: parsedName.Raw, NameClean: parsedValue.Clean,
NameClean: parsedName.Clean, NameHTML: parsedValue.HTML,
NameHTML: parsedName.HTML, Protocol: 0,
}) }
} }
} }
} }
@@ -496,7 +510,7 @@ func BuildJavaResponse(host string, port uint16, status interface{}, query *resp
func BuildBedrockResponse(host string, port uint16, status interface{}) (result BedrockStatusResponse) { func BuildBedrockResponse(host string, port uint16, status interface{}) (result BedrockStatusResponse) {
result = BedrockStatusResponse{ result = BedrockStatusResponse{
BaseStatus: BaseStatus{ BaseStatus: BaseStatus{
Online: true, Online: false,
Host: host, Host: host,
Port: port, Port: port,
EULABlocked: IsBlockedAddress(host), EULABlocked: IsBlockedAddress(host),
@@ -506,13 +520,15 @@ func BuildBedrockResponse(host string, port uint16, status interface{}) (result
BedrockStatus: nil, BedrockStatus: nil,
} }
if status == nil {
return
}
switch s := status.(type) { switch s := status.(type) {
case *response.BedrockStatus: case *response.BedrockStatus:
{ {
if s == nil {
break
}
result.Online = true
result.BedrockStatus = &BedrockStatus{ result.BedrockStatus = &BedrockStatus{
Version: nil, Version: nil,
Players: nil, Players: nil,
@@ -576,8 +592,6 @@ func BuildBedrockResponse(host string, port uint16, status interface{}) (result
break break
} }
default:
panic(fmt.Errorf("unknown status type: %T", status))
} }
return return