friends/nex/friends-wiiu/update_and_get_all_information.go
2025-02-15 23:31:32 -05:00

188 lines
7.7 KiB
Go

package nex_friends_wiiu
import (
"os"
"github.com/PretendoNetwork/friends/database"
database_wiiu "github.com/PretendoNetwork/friends/database/wiiu"
"github.com/PretendoNetwork/friends/globals"
notifications_wiiu "github.com/PretendoNetwork/friends/notifications/wiiu"
friends_types "github.com/PretendoNetwork/friends/types"
nex "github.com/PretendoNetwork/nex-go/v2"
"github.com/PretendoNetwork/nex-go/v2/types"
friends_wiiu "github.com/PretendoNetwork/nex-protocols-go/v2/friends-wiiu"
friends_wiiu_types "github.com/PretendoNetwork/nex-protocols-go/v2/friends-wiiu/types"
)
func UpdateAndGetAllInformation(err error, packet nex.PacketInterface, callID uint32, nnaInfo friends_wiiu_types.NNAInfo, presence friends_wiiu_types.NintendoPresenceV2, birthday types.DateTime) (*nex.RMCMessage, *nex.Error) {
if err != nil {
globals.Logger.Error(err.Error())
return nil, nex.NewError(nex.ResultCodes.FPD.InvalidArgument, "") // TODO - Add error message
}
connection := packet.Sender().(*nex.PRUDPConnection)
// * Get user information
pid := uint32(connection.PID())
connectedUser, ok := globals.ConnectedUsers.Get(pid)
if !ok || connectedUser == nil {
// * Failsafe
connectedUser = friends_types.NewConnectedUser()
connectedUser.PID = pid
connectedUser.Platform = friends_types.WUP
connectedUser.Connection = connection
globals.ConnectedUsers.Set(pid, connectedUser)
}
connectedUser.PresenceV2 = presence.Copy().(friends_wiiu_types.NintendoPresenceV2)
database_wiiu.UpdateNetworkAccountInfo(pid, nnaInfo, birthday)
principalPreference, err := database_wiiu.GetUserPrincipalPreference(pid)
if err != nil {
if err == database.ErrPIDNotFound {
return nil, nex.NewError(nex.ResultCodes.FPD.InvalidPrincipalID, "") // TODO - Add error message
} else {
globals.Logger.Critical(err.Error())
return nil, nex.NewError(nex.ResultCodes.FPD.Unknown, "") // TODO - Add error message
}
}
comment, err := database_wiiu.GetUserComment(pid)
if err != nil {
if err == database.ErrPIDNotFound {
return nil, nex.NewError(nex.ResultCodes.FPD.InvalidPrincipalID, "") // TODO - Add error message
} else {
globals.Logger.Critical(err.Error())
return nil, nex.NewError(nex.ResultCodes.FPD.Unknown, "") // TODO - Add error message
}
}
friendList, err := database_wiiu.GetUserFriendList(pid)
if err != nil && err != database.ErrEmptyList {
globals.Logger.Critical(err.Error())
return nil, nex.NewError(nex.ResultCodes.FPD.Unknown, "") // TODO - Add error message
}
friendRequestsOut, err := database_wiiu.GetUserFriendRequestsOut(pid)
if err != nil && err != database.ErrEmptyList {
globals.Logger.Critical(err.Error())
return nil, nex.NewError(nex.ResultCodes.FPD.Unknown, "") // TODO - Add error message
}
friendRequestsIn, err := database_wiiu.GetUserFriendRequestsIn(pid)
if err != nil && err != database.ErrEmptyList {
globals.Logger.Critical(err.Error())
return nil, nex.NewError(nex.ResultCodes.FPD.Unknown, "") // TODO - Add error message
}
blockList, err := database_wiiu.GetUserBlockList(pid)
if err != nil && err != database.ErrBlacklistNotFound {
globals.Logger.Critical(err.Error())
return nil, nex.NewError(nex.ResultCodes.FPD.Unknown, "") // TODO - Add error message
}
notifications := database_wiiu.GetUserNotifications(pid)
// * Update user information
presence.Online = types.NewBool(true) // * Force online status. I have no idea why this is always false
presence.PID = connection.PID() // * WHY IS THIS SET TO 0 BY DEFAULT??
notifications_wiiu.SendPresenceUpdate(presence)
if os.Getenv("PN_FRIENDS_CONFIG_ENABLE_BELLA") == "true" {
bella := friends_wiiu_types.NewFriendInfo()
bella.NNAInfo = friends_wiiu_types.NewNNAInfo()
bella.Presence = friends_wiiu_types.NewNintendoPresenceV2()
bella.Status = friends_wiiu_types.NewComment()
bella.BecameFriend = types.NewDateTime(0)
bella.LastOnline = types.NewDateTime(0)
bella.Unknown = types.NewUInt64(0)
bella.NNAInfo.PrincipalBasicInfo = friends_wiiu_types.NewPrincipalBasicInfo()
bella.NNAInfo.Unknown1 = types.NewUInt8(0)
bella.NNAInfo.Unknown2 = types.NewUInt8(0)
bella.NNAInfo.PrincipalBasicInfo.PID = types.NewPID(1743126339)
bella.NNAInfo.PrincipalBasicInfo.NNID = types.NewString("bells1998")
bella.NNAInfo.PrincipalBasicInfo.Mii = friends_wiiu_types.NewMiiV2()
bella.NNAInfo.PrincipalBasicInfo.Unknown = types.NewUInt8(0)
bella.NNAInfo.PrincipalBasicInfo.Mii.Name = types.NewString("bella")
bella.NNAInfo.PrincipalBasicInfo.Mii.Unknown1 = types.NewUInt8(0)
bella.NNAInfo.PrincipalBasicInfo.Mii.Unknown2 = types.NewUInt8(0)
bella.NNAInfo.PrincipalBasicInfo.Mii.MiiData = types.NewBuffer([]byte{
0x03, 0x00, 0x00, 0x40, 0xE9, 0x55, 0xA2, 0x09,
0xE7, 0xC7, 0x41, 0x82, 0xD9, 0x7D, 0x0B, 0x2D,
0x03, 0xB3, 0xB8, 0x8D, 0x27, 0xD9, 0x00, 0x00,
0x01, 0x40, 0x62, 0x00, 0x65, 0x00, 0x6C, 0x00,
0x6C, 0x00, 0x61, 0x00, 0x00, 0x00, 0x45, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40,
0x12, 0x00, 0x81, 0x01, 0x04, 0x68, 0x43, 0x18,
0x20, 0x34, 0x46, 0x14, 0x81, 0x12, 0x17, 0x68,
0x0D, 0x00, 0x00, 0x29, 0x03, 0x52, 0x48, 0x50,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x86,
})
bella.NNAInfo.PrincipalBasicInfo.Mii.Datetime = types.NewDateTime(0)
bella.Presence.ChangedFlags = types.NewUInt32(0x1EE)
bella.Presence.Online = types.NewBool(true)
bella.Presence.GameKey = friends_wiiu_types.NewGameKey()
bella.Presence.Unknown1 = types.NewUInt8(0)
bella.Presence.Message = types.NewString("Testing")
//bella.Presence.Unknown2 = 2
bella.Presence.Unknown2 = types.NewUInt32(0)
//bella.Presence.Unknown3 = 2
bella.Presence.Unknown3 = types.NewUInt8(0)
//bella.Presence.GameServerID = 0x1010EB00
bella.Presence.GameServerID = types.NewUInt32(0)
//bella.Presence.Unknown4 = 3
bella.Presence.Unknown4 = types.NewUInt32(0)
bella.Presence.PID = types.NewPID(1743126339)
//bella.Presence.GatheringID = 1743126339 // test fake ID
bella.Presence.GatheringID = types.NewUInt32(0)
//bella.Presence.ApplicationData, _ = hex.DecodeString("0000200300000000000000001843ffe567000000")
bella.Presence.ApplicationData = types.NewBuffer([]byte{0x0})
bella.Presence.Unknown5 = types.NewUInt8(0)
bella.Presence.Unknown6 = types.NewUInt8(0)
bella.Presence.Unknown7 = types.NewUInt8(0)
//bella.Presence.GameKey.TitleID = 0x000500001010EC00
bella.Presence.GameKey.TitleID = types.NewUInt64(0)
//bella.Presence.GameKey.TitleVersion = 64
bella.Presence.GameKey.TitleVersion = types.NewUInt16(0)
bella.Status.Unknown = types.NewUInt8(0)
bella.Status.Contents = types.NewString("test")
bella.Status.LastChanged = types.NewDateTime(0)
friendList = append(friendList, bella)
}
rmcResponseStream := nex.NewByteStreamOut(globals.SecureEndpoint.LibraryVersions(), globals.SecureEndpoint.ByteStreamSettings())
principalPreference.WriteTo(rmcResponseStream)
comment.WriteTo(rmcResponseStream)
friendList.WriteTo(rmcResponseStream)
friendRequestsOut.WriteTo(rmcResponseStream)
friendRequestsIn.WriteTo(rmcResponseStream)
blockList.WriteTo(rmcResponseStream)
types.NewBool(false).WriteTo(rmcResponseStream) // * Unknown
notifications.WriteTo(rmcResponseStream)
types.NewBool(false).WriteTo(rmcResponseStream) // * Unknown
rmcResponseBody := rmcResponseStream.Bytes()
rmcResponse := nex.NewRMCSuccess(globals.SecureEndpoint, rmcResponseBody)
rmcResponse.ProtocolID = friends_wiiu.ProtocolID
rmcResponse.MethodID = friends_wiiu.MethodUpdateAndGetAllInformation
rmcResponse.CallID = callID
return rmcResponse, nil
}