mirror of
https://github.com/WiiLink24/wfc-server.git
synced 2026-04-24 15:37:58 -05:00
Merge remote-tracking branch 'upstream/main'
This commit is contained in:
commit
433ade0293
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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.",
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
16
qr2/group.go
16
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
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user