From c0196a65bd31aeb041e1862324381b14df0d0b91 Mon Sep 17 00:00:00 2001 From: Palapeli <26661008+mkwcat@users.noreply.github.com> Date: Thu, 6 Mar 2025 05:20:32 -0500 Subject: [PATCH] GPCM: Update report to use the "wl:" namespace --- gpcm/error.go | 13 ---------- gpcm/kick.go | 3 --- gpcm/report.go | 66 +++++++++++++++++--------------------------------- qr2/group.go | 16 ++++++------ 4 files changed, 31 insertions(+), 67 deletions(-) diff --git a/gpcm/error.go b/gpcm/error.go index b7b03f2..146c271 100644 --- a/gpcm/error.go +++ b/gpcm/error.go @@ -385,19 +385,6 @@ var ( "Error Code: %[1]d", }, } - - WWFCMsgTooManyFramesDropped = WWFCErrorMessage{ - ErrorCode: 22010, - MessageRMC: map[byte]string{ - LangEnglish: "" + - "Your game is dropping too many frames.\n" + - "Please remove any modifications that may\n" + - "be causing frame rate problems to avoid\n" + - "being banned from WiiLink WFC.\n" + - "\n" + - "Error Code: %[1]d", - }, - } ) func (err GPError) GetMessage() string { diff --git a/gpcm/kick.go b/gpcm/kick.go index 6d90439..27ad174 100644 --- a/gpcm/kick.go +++ b/gpcm/kick.go @@ -25,9 +25,6 @@ func kickPlayer(profileID uint32, reason string) { case "invalid_elo": errorMessage = WWFCMsgInvalidELO - case "too_many_frames_dropped": - errorMessage = WWFCMsgTooManyFramesDropped - case "network_error": // No error message common.CloseConnection(ServerName, session.ConnIndex) diff --git a/gpcm/report.go b/gpcm/report.go index 8a174b0..97dfb38 100644 --- a/gpcm/report.go +++ b/gpcm/report.go @@ -1,7 +1,6 @@ package gpcm import ( - "fmt" "strconv" "wwfc/common" "wwfc/logging" @@ -12,75 +11,54 @@ import ( func (g *GameSpySession) handleWWFCReport(command common.GameSpyCommand) { for key, value := range command.OtherValues { - logging.Info(g.ModuleName, "WWFC Report:", aurora.Yellow(key)) + logging.Info(g.ModuleName, "WiiLink Report:", aurora.Yellow(key)) + + keyColored := aurora.BrightCyan(key).String() switch key { - case "mkw_user": - if g.GameName != "mariokartwii" { - logging.Warn(g.ModuleName, "Ignoring mkw_user packet from wrong game") - continue - } - - packet, err := common.Base64DwcEncoding.DecodeString(value) - if err != nil { - logging.Error(g.ModuleName, "Error decoding mkw_user packet:", err.Error()) - continue - } - - if len(packet) != 0xC0 { - logging.Error(g.ModuleName, "Invalid mkw_user packet length:", len(packet)) - continue - } - - qr2.ProcessUSER(g.User.ProfileId, g.QR2IP, packet) - - case "mkw_malicious_packet": - if g.GameName != "mariokartwii" { - logging.Warn(g.ModuleName, "Ignoring mkw_malicious_packet from wrong game") - continue - } + default: + logging.Error(g.ModuleName, "Unknown record", aurora.Cyan(key).String()+":", aurora.Cyan(value)) + case "wl:bad_packet": profileId, err := strconv.ParseUint(value, 10, 32) if err != nil { - logging.Error(g.ModuleName, "Error decoding mkw_malicious_packet:", err.Error()) + logging.Error(g.ModuleName, "Error decoding", keyColored+":", err.Error()) continue } - logging.Warn(g.ModuleName, "Malicious packet from", aurora.BrightCyan(strconv.FormatUint(profileId, 10))) - - case "mkw_room_stall": - if g.GameName != "mariokartwii" { - logging.Warn(g.ModuleName, "Ignoring mkw_room_stall from wrong game") - continue - } + logging.Warn(g.ModuleName, "Report bad packet from", aurora.BrightCyan(strconv.FormatUint(profileId, 10))) + case "wl:stall": profileId, err := strconv.ParseUint(value, 10, 32) if err != nil { - logging.Error(g.ModuleName, "Error decoding mkw_room_stall:", err.Error()) + logging.Error(g.ModuleName, "Error decoding", keyColored+":", err.Error()) continue } logging.Warn(g.ModuleName, "Room stall caused by", aurora.BrightCyan(strconv.FormatUint(profileId, 10))) - case "mkw_too_many_frames_dropped": + case "wl:mkw_user": if g.GameName != "mariokartwii" { - logging.Warn(g.ModuleName, "Ignoring mkw_too_many_frames_dropped from wrong game") + logging.Warn(g.ModuleName, "Ignoring", keyColored+":", "from wrong game") continue } - framesDropped, err := strconv.ParseUint(value, 10, 32) + packet, err := common.Base64DwcEncoding.DecodeString(value) if err != nil { - logging.Error(g.ModuleName, "Error decoding mkw_too_many_frames_dropped:", err.Error()) + logging.Error(g.ModuleName, "Error decoding", keyColored+":", err.Error()) continue } - profileId := g.User.ProfileId - logging.Warn(g.ModuleName, "Kicking", aurora.BrightCyan(strconv.FormatUint(uint64(profileId), 10)), fmt.Sprintf("for dropping too many frames (%d)", framesDropped)) - kickPlayer(profileId, "too_many_frames_dropped") + if len(packet) != 0xC0 { + logging.Error(g.ModuleName, "Invalid", keyColored, "record length:", len(packet)) + continue + } - case "mkw_select_course", "mkw_select_cc": + qr2.ProcessUSER(g.User.ProfileId, g.QR2IP, packet) + + case "wl:mkw_select_course", "wl:mkw_select_cc": if g.GameName != "mariokartwii" { - logging.Warn(g.ModuleName, "Ignoring mkw_select_* from wrong game") + logging.Warn(g.ModuleName, "Ignoring", keyColored, "from wrong game") continue } diff --git a/qr2/group.go b/qr2/group.go index bcb3b3e..3a1039e 100644 --- a/qr2/group.go +++ b/qr2/group.go @@ -379,7 +379,7 @@ func ProcessUSER(senderPid uint32, senderIP uint64, packet []byte) { if miiGroupCount != 2 { logging.Error(moduleName, "Received USER packet with unexpected Mii group count", aurora.Cyan(miiGroupCount)) // Kick the client - gpErrorCallback(senderPid, "malpacket") + gpErrorCallback(senderPid, "bad_packet") return } @@ -396,7 +396,7 @@ func ProcessUSER(senderPid uint32, senderIP uint64, packet []byte) { mii := common.Mii(packet[index : index+0x4C]) if mii.RFLCalculateCRC() != 0x0000 { logging.Error(moduleName, "Received USER packet with invalid Mii data CRC") - gpErrorCallback(senderPid, "malpacket") + gpErrorCallback(senderPid, "bad_packet") return } @@ -408,7 +408,7 @@ func ProcessUSER(senderPid uint32, senderIP uint64, packet []byte) { decodedName, err := common.GetWideString(packet[index+0x2:index+0x2+20], binary.BigEndian) if err != nil { logging.Error(moduleName, "Failed to parse Mii name:", err) - gpErrorCallback(senderPid, "malpacket") + gpErrorCallback(senderPid, "bad_packet") return } @@ -487,11 +487,13 @@ func ProcessMKWSelectRecord(profileId uint32, key string, value string) { return } + keyColored := aurora.BrightCyan(key).String() + switch key { - case "mkw_select_course": + case "wl:mkw_select_course": courseId, err := strconv.ParseUint(value, 10, 32) if err != nil { - logging.Error(moduleName, "Error decoding mkw_select_course:", err.Error()) + logging.Error(moduleName, "Error decoding", keyColored+":", err.Error()) return } @@ -505,10 +507,10 @@ func ProcessMKWSelectRecord(profileId uint32, key string, value string) { group.MKWEngineClassID = -1 return - case "mkw_select_cc": + case "wl:mkw_select_cc": ccId, err := strconv.ParseUint(value, 10, 32) if err != nil { - logging.Error(moduleName, "Error decoding mkw_select_cc:", err.Error()) + logging.Error(moduleName, "Error decoding", keyColored+":", err.Error()) return }