diff --git a/gamestats/error.go b/gamestats/error.go index 5b8fed7..b36fbd4 100644 --- a/gamestats/error.go +++ b/gamestats/error.go @@ -6,10 +6,15 @@ import ( "wwfc/logging" ) -func (g *GameStatsSession) replyError(err gpcm.GPError) { - logging.Error(g.ModuleName, "Reply error:", err.ErrorString) - common.SendPacket(ServerName, g.ConnIndex, []byte(err.GetMessage())) - if err.Fatal { - common.CloseConnection(ServerName, g.ConnIndex) +func (g *GameStatsSession) replyError(gpErr gpcm.GPError) { + logging.Error(g.ModuleName, "Reply error:", gpErr.ErrorString) + err := common.SendPacket(ServerName, g.ConnIndex, []byte(gpErr.GetMessage())) + if gpErr.Fatal || err != nil { + if err != nil { + logging.Error(g.ModuleName, "Failed to send error message:", err) + } + if err := common.CloseConnection(ServerName, g.ConnIndex); err != nil { + logging.Error(g.ModuleName, "Failed to close connection:", err) + } } } diff --git a/gamestats/main.go b/gamestats/main.go index b26ad8a..d1be83f 100644 --- a/gamestats/main.go +++ b/gamestats/main.go @@ -61,22 +61,19 @@ func StartServer(reload bool) { if err != nil { panic(err) } + defer func() { + common.ShouldNotError(file.Close()) + }() decoder := gob.NewDecoder(file) - - err = decoder.Decode(&sessionsByConnIndex) - file.Close() - - if err != nil { - panic(err) - } + common.ShouldNotError(decoder.Decode(&sessionsByConnIndex)) for _, session := range sessionsByConnIndex { session.gameInfo = common.GetGameInfoByName(session.GameName) if session.gameInfo == nil { logging.Error(session.ModuleName, "Unknown game from reload:", aurora.Cyan(session.GameName)) // Force close the session now to prevent a panic later - common.CloseConnection(ServerName, session.ConnIndex) + _ = common.CloseConnection(ServerName, session.ConnIndex) delete(sessionsByConnIndex, session.ConnIndex) } } @@ -88,20 +85,14 @@ func StartServer(reload bool) { func Shutdown() { // Save state file, err := os.OpenFile("state/gstats_sessions.gob", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) - if err != nil { - panic(err) - } + common.ShouldNotError(err) + defer func() { + common.ShouldNotError(file.Close()) + }() + defer db.Close() encoder := gob.NewEncoder(file) - - err = encoder.Encode(sessionsByConnIndex) - file.Close() - - if err != nil { - panic(err) - } - - db.Close() + common.ShouldNotError(encoder.Encode(sessionsByConnIndex)) logging.Notice("GSTATS", "Saved", aurora.Cyan(len(sessionsByConnIndex)), "sessions") } @@ -132,7 +123,10 @@ func NewConnection(index uint64, address string) { "id": "1", }, }) - common.SendPacket(ServerName, index, []byte(session.WriteBuffer)) + err := common.SendPacket(ServerName, index, []byte(session.WriteBuffer)) + if err != nil { + logging.Error(session.ModuleName, "Failed to send initial packet:", err) + } session.WriteBuffer = []byte{} logging.Notice(session.ModuleName, "Connection established from", address) @@ -241,8 +235,12 @@ func HandlePacket(index uint64, data []byte) { } if len(session.WriteBuffer) > 0 { - common.SendPacket(ServerName, session.ConnIndex, session.WriteBuffer) - session.WriteBuffer = []byte{} + err := common.SendPacket(ServerName, session.ConnIndex, session.WriteBuffer) + if err != nil { + logging.Error(session.ModuleName, "Failed to send packet:", err) + } else { + session.WriteBuffer = []byte{} + } } } diff --git a/gamestats/web.go b/gamestats/web.go index a1a2802..12bb5cd 100644 --- a/gamestats/web.go +++ b/gamestats/web.go @@ -33,9 +33,7 @@ func HandleWebRequest(w http.ResponseWriter, r *http.Request) { } path := u.Path - if strings.HasPrefix(path, "/") { - path = path[1:] - } + path = strings.TrimPrefix(path, "/") gameName := path subPath := "" @@ -97,7 +95,10 @@ func HandleWebRequest(w http.ResponseWriter, r *http.Request) { w.Header().Set("X-Powered-By", "ASP.NET") w.Header().Set("Content-Length", strconv.Itoa(len(response))) w.WriteHeader(200) - w.Write(response) + _, err = w.Write(response) + if err != nil { + logging.Error("GSTATS", "Error writing response:", err) + } } func calculateToken(u *url.URL, host string) string { @@ -113,6 +114,9 @@ func calculateToken(u *url.URL, host string) string { } func handleGet2(game *common.GameInfo, query url.Values) []byte { + // TODO + common.MaybeUnused(game, query) + data := binary.LittleEndian.AppendUint32([]byte{}, 1) // RNK_GET data = binary.LittleEndian.AppendUint32(data, 0) // count return data @@ -131,5 +135,8 @@ func replyHTTPError(w http.ResponseWriter, errorCode int, errorString string) { w.Header().Set("Content-Length", strconv.Itoa(len(response))) w.Header().Set("Connection", "close") w.WriteHeader(errorCode) - w.Write([]byte(response)) + _, err := w.Write([]byte(response)) + if err != nil { + logging.Error("GSTATS", "Error writing response:", err) + } }