Merge remote-tracking branch 'upstream/main'

This commit is contained in:
ppeb 2025-03-06 22:18:08 -06:00
commit 433ade0293
No known key found for this signature in database
GPG Key ID: CC147AD1B3D318D0
10 changed files with 47 additions and 98 deletions

View File

@ -106,7 +106,7 @@ func GetUniqueUserID() uint64 {
func (user *User) UpdateProfile(pool *pgxpool.Pool, ctx context.Context, data map[string]string) {
firstName, firstNameExists := data["firstname"]
lastName, lastNameExists := data["lastname"]
openHost, openHostExists := data["wwfc_openhost"]
openHost, openHostExists := data["wl:oh"]
openHostBool := false
if openHostExists && openHost != "0" {
openHostBool = true

View File

@ -13,7 +13,7 @@ import (
func (g *GameStatsSession) getpd(command common.GameSpyCommand) {
errMsg := common.GameSpyCommand{
Command: "getpdr",
CommandValue: "0",
CommandValue: "1",
OtherValues: map[string]string{
"pid": command.OtherValues["pid"],
"lid": strconv.Itoa(g.LoginID),

View File

@ -27,7 +27,7 @@ func (g *GameStatsSession) setpd(command common.GameSpyCommand) {
errMsg := common.GameSpyCommand{
Command: "setpdr",
CommandValue: "0",
CommandValue: "1",
OtherValues: map[string]string{
"pid": command.OtherValues["pid"],
"lid": strconv.Itoa(g.LoginID),

View File

@ -549,33 +549,6 @@ var (
"Code Erreur: %[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 Retro WFC.\n" +
"\n" +
"Error Code: %[1]d",
LangJapanese: "" +
"ゲームのフレームレートがおそすぎます \n" +
"Retro WFCから BANされないように\n" +
"フレームレートが落ちるような\n" +
"プログラムを けしてください\n" +
"\n" +
"エラーコード: %[1]d",
LangFrenchEU: "" +
"Votre jeu perd trop de FPS.\n" +
"Veuillez retirer toute modification qui peut\n" +
"causer ce problème de performance pour éviter\n" +
"de vous faire bannir de Retro WFC.\n" +
"\n" +
"Code Erreur: %[1]d",
},
}
)
func (err GPError) GetMessage() string {
@ -646,12 +619,11 @@ func (err GPError) GetMessageTranslate(gameName string, region byte, lang byte,
errMsg = fmt.Sprintf(errMsg, wwfcMessage.ErrorCode, ngid, reason)
errMsgUTF16 := utf16.Encode([]rune(errMsg))
errMsgByteArray := common.UTF16ToByteArray(errMsgUTF16)
command.OtherValues["wwfc_errmsg"] = common.Base64DwcEncoding.EncodeToString(errMsgByteArray)
command.OtherValues["wl:errmsg"] = common.Base64DwcEncoding.EncodeToString(errMsgByteArray)
}
command.OtherValues["wwfc_err"] = strconv.Itoa(wwfcMessage.ErrorCode)
}
command.OtherValues["wl:err"] = strconv.Itoa(err.WWFCMessage.ErrorCode)
}
return common.CreateGameSpyMessage(command)

View File

@ -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)

View File

@ -182,11 +182,11 @@ func (g *GameSpySession) login(command common.GameSpyCommand) {
g.InGameName = ingamesn
g.UnitCode = unitcd
_, payloadVerExists := command.OtherValues["payload_ver"]
_, signatureExists := command.OtherValues["wwfc_sig"]
_, payloadVerExists := command.OtherValues["wl:ver"]
_, signatureExists := command.OtherValues["wl:sig"]
deviceId := uint32(0)
if hostPlatform, exists := command.OtherValues["wwfc_host"]; exists {
if hostPlatform, exists := command.OtherValues["wl:host"]; exists {
g.HostPlatform = hostPlatform
} else {
if g.UnitCode == UnitCodeDS {
@ -329,7 +329,7 @@ func (g *GameSpySession) login(command common.GameSpyCommand) {
} else {
motdUTF16 := utf16.Encode([]rune(motd))
motdByteArray := common.UTF16ToByteArray(motdUTF16)
otherValues["wwfc_motd"] = common.Base64DwcEncoding.EncodeToString(motdByteArray)
otherValues["wl:motd"] = common.Base64DwcEncoding.EncodeToString(motdByteArray)
}
}
@ -362,11 +362,11 @@ func (g *GameSpySession) exLogin(command common.GameSpyCommand) {
}
func (g *GameSpySession) verifyExLoginInfo(command common.GameSpyCommand, authToken string) uint32 {
payloadVer, payloadVerExists := command.OtherValues["payload_ver"]
signature, signatureExists := command.OtherValues["wwfc_sig"]
payloadVer, payloadVerExists := command.OtherValues["wl:ver"]
signature, signatureExists := command.OtherValues["wl:sig"]
deviceId := uint32(0)
if !payloadVerExists || payloadVer != "4" {
if !payloadVerExists || payloadVer != "5" {
g.replyError(GPError{
ErrorCode: ErrLogin.ErrorCode,
ErrorString: "The payload version is invalid.",

View File

@ -235,7 +235,7 @@ func HandlePacket(index uint64, data []byte) {
common.SendPacket(ServerName, session.ConnIndex, []byte(`\ka\\final\`))
})
commands = session.handleCommand("login", commands, session.login)
commands = session.handleCommand("wwfc_exlogin", commands, session.exLogin)
commands = session.handleCommand("wl:exlogin", commands, session.exLogin)
commands = session.ignoreCommand("logout", commands)
if len(commands) != 0 && !session.LoggedIn {
@ -244,7 +244,7 @@ func HandlePacket(index uint64, data []byte) {
return
}
commands = session.handleCommand("wwfc_report", commands, session.handleWWFCReport)
commands = session.handleCommand("wl:report", commands, session.handleWWFCReport)
commands = session.handleCommand("updatepro", commands, session.updateProfile)
commands = session.handleCommand("status", commands, session.setStatus)
commands = session.handleCommand("addbuddy", commands, session.addFriend)

View File

@ -82,7 +82,7 @@ func (g *GameSpySession) getProfile(command common.GameSpyCommand) {
}
func (g *GameSpySession) updateProfile(command common.GameSpyCommand) {
if openHost, ok := command.OtherValues["wwfc_openhost"]; ok {
if openHost, ok := command.OtherValues["wl:oh"]; ok {
enabled := openHost != "0"
if !g.User.OpenHost && enabled {
g.openHostEnabled(true, true)

View File

@ -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
}

View File

@ -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
}