Skip to content

Commit

Permalink
Added protobuf support to MCStatus and simplified the response behavi…
Browse files Browse the repository at this point in the history
…our (to be offloaded to the actual site)
  • Loading branch information
p0t4t0sandwich committed Apr 20, 2024
1 parent a8fac3a commit 98abbd5
Show file tree
Hide file tree
Showing 11 changed files with 647 additions and 301 deletions.
3 changes: 3 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,6 @@ gen:

protoc -I=./proto --go_out=./modules/proto ./proto/problem.proto
sed -i 's/json:"\(.*\),omitempty"/json:"\1,omitempty" xml:"\1,omitempty"/g' ./modules/proto/problempb/problem.pb.go

protoc -I=./proto --go_out=./modules/proto ./proto/mcstatus.proto
sed -i 's/json:"\(.*\),omitempty"/json:"\1" xml:"\1"/g' ./modules/proto/mcstatuspb/mcstatus.pb.go
4 changes: 2 additions & 2 deletions modules/game_server_status/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,11 @@ func (s *service) QueryGameServer(game string, host string, port int) (*GameServ
for _, v := range MinecraftList {
if v == game {
isBedrock := game != "minecraft"
response, err := mcstatus.NewService().GetServerStatus(host, port, isBedrock, true)
response, err := mcstatus.NewService().GetServerStatus(host, port, isBedrock, true, port)
if err != nil {
return nil, err
}
return (*mcstatusResponse)(response).Normalize(), nil
return (*mcServerStatus)(response).Normalize(), nil
}
}
for _, v := range GameQList {
Expand Down
12 changes: 6 additions & 6 deletions modules/game_server_status/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,22 +61,22 @@ type GameQResponse struct {
}

// Type alias
type mcstatusResponse mcstatus.MCStatusResponse
type mcServerStatus mcstatus.MCServerStatus

// Normalize - Normalize Minecraft response
func (mc *mcstatusResponse) Normalize() *GameServerStatus {
func (mc *mcServerStatus) Normalize() *GameServerStatus {
players := make([]Player, len(mc.Players))
for i, v := range mc.Players {
players[i] = Player{Name: v.Name, ID: v.UUID.String()}
players[i] = Player{Name: v.Name, ID: v.Uuid}
}

return &GameServerStatus{
Host: mc.Host,
Port: mc.Port,
Port: int(mc.Port),
Name: mc.Name,
MapName: mc.Map,
MaxPlayers: mc.MaxPlayers,
NumPlayers: mc.NumPlayers,
MaxPlayers: int(mc.MaxPlayers),
NumPlayers: int(mc.NumPlayers),
Players: players,
QueryType: QueryTypeMinecraft,
Raw: mc.Raw,
Expand Down
32 changes: 17 additions & 15 deletions modules/mcstatus/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"image/png"
"net/http"
"strconv"
"strings"

"github.com/NeuralNexusDev/neuralnexus-api/responses"
)
Expand All @@ -16,53 +17,54 @@ func ApplyRoutes(mux *http.ServeMux) *http.ServeMux {
return mux
}

// Route that returns the server status
// GetServerStatus - Route that returns the server status
func GetServerStatus(s MCStatusService) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
host := r.PathValue("host")
isBedrock := r.URL.Query().Get("bedrock") == "true"
queryEnabled := r.URL.Query().Get("query") == "true"
raw := r.URL.Query().Get("raw") == "true"
port, err := strconv.Atoi(r.URL.Query().Get("port"))
port, err := strconv.Atoi(host[strings.LastIndex(host, ":")+1:])
if err != nil {
if isBedrock {
port = 19132
} else {
port = 25565
}
}
queryPort, err := strconv.Atoi(r.URL.Query().Get("query_port"))
if err != nil {
queryPort = port
}

status, err := s.GetServerStatus(host, port, isBedrock, queryEnabled)
status, err := s.GetServerStatus(host, port, isBedrock, queryEnabled, queryPort)
if err != nil {
responses.SendAndEncodeInternalServerError(w, r, err.Error())
responses.SendAndEncodeNotFound(w, r, err.Error())
return
}
if !raw {
status.Raw = nil
}

responses.SendAndEncodeStruct(w, r, http.StatusOK, status)
}
}

// Route that returns the server icon as a PNG (base64 encoded string didn't work for some reason)
// GetIcon - Route that returns the server icon as a PNG
func GetIcon(s MCStatusService) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
host := r.PathValue("host")
isBedrock := r.URL.Query().Get("bedrock") == "true"
queryEnabled := r.URL.Query().Get("query") == "true"
port, err := strconv.Atoi(r.URL.Query().Get("port"))
if isBedrock {
responses.SendAndEncodeBadRequest(w, r, "Bedrock servers do not have icons.")
}
port, err := strconv.Atoi(host[strings.LastIndex(host, ":")+1:])
if err != nil {
if isBedrock {
port = 19132
} else {
port = 25565
}
port = 25565
}

status, err := s.GetServerStatus(host, port, isBedrock, queryEnabled)
status, err := s.GetJavaServerStatus(host, port, false, 0)
if err != nil {
responses.SendAndEncodeInternalServerError(w, r, err.Error())
responses.SendAndEncodeNotFound(w, r, err.Error())
return
}

Expand Down
18 changes: 9 additions & 9 deletions modules/mcstatus/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import (

// MCStatusService - Minecraft Status service
type MCStatusService interface {
GetJavaServerStatus(host string, port int, queryEnabled bool) (*MCStatusResponse, error)
GetBedrockServerStatus(host string, port int) (*MCStatusResponse, error)
GetServerStatus(host string, port int, isBedrock bool, queryEnabled bool) (*MCStatusResponse, error)
GetJavaServerStatus(host string, port int, queryEnabled bool, queryPort int) (*MCServerStatus, error)
GetBedrockServerStatus(host string, port int) (*MCServerStatus, error)
GetServerStatus(host string, port int, isBedrock bool, queryEnabled bool, queryPort int) (*MCServerStatus, error)
}

// service - Minecraft Status service implementation
Expand All @@ -25,14 +25,14 @@ func NewService() MCStatusService {
}

// GetJavaServerStatus - Get Java server status
func (s *service) GetJavaServerStatus(host string, port int, queryEnabled bool) (*MCStatusResponse, error) {
func (s *service) GetJavaServerStatus(host string, port int, queryEnabled bool, queryPort int) (*MCServerStatus, error) {
pinger := minequery.NewPinger(
minequery.WithTimeout(5*time.Second),
minequery.WithProtocolVersion16(minequery.Ping16ProtocolVersion162),
minequery.WithProtocolVersion17(minequery.Ping17ProtocolVersion119),
)

var status *MCStatusResponse = nil
var status *MCServerStatus = nil
s17, err := pinger.Ping17(host, port)
if err == nil {
status = GetPing17Status(s17)
Expand Down Expand Up @@ -62,14 +62,14 @@ func (s *service) GetJavaServerStatus(host string, port int, queryEnabled bool)
}
if status != nil {
status.Host = host
status.Port = port
status.Port = int32(port)
return status, nil
}
return nil, errors.New("failed to get java server status")
}

// GetBedrockServerStatus - Get Bedrock server status
func (s *service) GetBedrockServerStatus(host string, port int) (*MCStatusResponse, error) {
func (s *service) GetBedrockServerStatus(host string, port int) (*MCServerStatus, error) {
connect := host + ":" + fmt.Sprint(port)
status, err := bedrockping.Query(connect, 5*time.Second, 150*time.Millisecond)
if err != nil {
Expand All @@ -79,9 +79,9 @@ func (s *service) GetBedrockServerStatus(host string, port int) (*MCStatusRespon
}

// GetServerStatus - Get server status
func (s *service) GetServerStatus(host string, port int, isBedrock bool, queryEnabled bool) (*MCStatusResponse, error) {
func (s *service) GetServerStatus(host string, port int, isBedrock bool, queryEnabled bool, queryPort int) (*MCServerStatus, error) {
if isBedrock {
return s.GetBedrockServerStatus(host, port)
}
return s.GetJavaServerStatus(host, port, queryEnabled)
return s.GetJavaServerStatus(host, port, queryEnabled, queryPort)
}
Loading

0 comments on commit 98abbd5

Please sign in to comment.