From 8d8a05a7e20448e870b1fd6004df62c90aa3e2ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20L=C3=B3pez=20Guimaraes?= Date: Sun, 13 Aug 2023 23:19:34 +0100 Subject: [PATCH] Add missing error handling Now database getters do error handling aswell, and in case of any error, the NEX or GRPC method throws a proper error about it. There are still some doubts on how to handle errors when a list of data is processed, so for now skip that element on the list and continue. Also add some constant errors to do better error handling. --- database/3ds/get_friend_miis.go | 12 +--- database/3ds/get_friend_persistent_infos.go | 11 ++-- database/3ds/get_user_friends.go | 13 ++-- database/3ds/remove_friendship.go | 7 +- database/database.go | 19 ++++++ ...t_friend_request_and_return_friend_info.go | 37 ++++++++--- ...te_friend_request_and_return_friend_pid.go | 16 ++++- .../wiiu/get_pids_by_friend_request_id.go | 11 ++-- database/wiiu/get_user_block_list.go | 29 +++++++-- database/wiiu/get_user_comment.go | 11 ++-- database/wiiu/get_user_friend_list.go | 50 +++++++++----- database/wiiu/get_user_friend_pids.go | 16 +++-- database/wiiu/get_user_friend_requests_in.go | 29 +++++++-- database/wiiu/get_user_friend_requests_out.go | 30 +++++++-- ...y_pid.go => get_user_info_by_pnid_data.go} | 22 +++---- database/wiiu/get_user_notifications.go | 2 +- .../wiiu/get_user_principal_preference.go | 10 +-- database/wiiu/is_friend_request_blocked.go | 8 +-- database/wiiu/remove_friendship.go | 9 ++- database/wiiu/save_friend_request.go | 8 ++- database/wiiu/set_friend_request_accepted.go | 8 ++- database/wiiu/set_friend_request_denied.go | 9 ++- database/wiiu/set_friend_request_received.go | 9 ++- database/wiiu/set_user_blocked.go | 1 + database/wiiu/unset_friend_request_denied.go | 9 ++- database/wiiu/unset_user_blocked.go | 7 +- globals/get_user_data.go | 2 - globals/password_from_pid.go | 3 +- go.mod | 4 -- go.sum | 22 ------- grpc/accept_friend_request.go | 20 +++++- grpc/deny_friend_request.go | 19 +++++- grpc/get_user_friend_pids.go | 20 +++++- grpc/get_user_friend_requests_incoming.go | 11 +++- nex/friends-3ds/get_all_friends.go | 8 ++- nex/friends-3ds/get_friend_mii.go | 8 ++- nex/friends-3ds/get_friend_persistent_info.go | 8 ++- nex/friends-3ds/remove_friend_by_pid.go | 11 +++- nex/friends-3ds/sync_friend.go | 11 +++- nex/friends-wiiu/accept_friend_request.go | 15 +++-- nex/friends-wiiu/add_blacklist.go | 19 +++++- nex/friends-wiiu/add_friend_request.go | 38 +++++++++-- nex/friends-wiiu/cancel_friend_request.go | 5 +- nex/friends-wiiu/delete_friend_request.go | 9 ++- nex/friends-wiiu/deny_friend_request.go | 24 ++++++- nex/friends-wiiu/get_basic_info.go | 13 +++- .../get_request_block_settings.go | 8 ++- nex/friends-wiiu/remove_blacklist.go | 9 ++- nex/friends-wiiu/remove_friend.go | 9 ++- .../update_and_get_all_information.go | 65 +++++++++++++++---- nex/secure-connection/register_ex.go | 32 +++++---- notifications/3ds/send_comment_update.go | 7 +- notifications/3ds/send_favorite_update.go | 7 +- notifications/3ds/send_mii_notification.go | 7 +- notifications/3ds/send_presence_update.go | 7 +- notifications/3ds/send_user_went_offline.go | 7 +- notifications/wiiu/send_presence_update.go | 6 +- notifications/wiiu/send_user_went_offline.go | 6 +- 58 files changed, 608 insertions(+), 225 deletions(-) rename database/wiiu/{get_user_info_by_pid.go => get_user_info_by_pnid_data.go} (58%) diff --git a/database/3ds/get_friend_miis.go b/database/3ds/get_friend_miis.go index 030b9ea..d4429a0 100644 --- a/database/3ds/get_friend_miis.go +++ b/database/3ds/get_friend_miis.go @@ -1,27 +1,21 @@ package database_3ds import ( - "database/sql" "time" "github.com/PretendoNetwork/friends/database" - "github.com/PretendoNetwork/friends/globals" "github.com/PretendoNetwork/nex-go" friends_3ds_types "github.com/PretendoNetwork/nex-protocols-go/friends-3ds/types" ) // GetFriendMiis returns the Mii of all friends -func GetFriendMiis(pids []uint32) []*friends_3ds_types.FriendMii { +func GetFriendMiis(pids []uint32) ([]*friends_3ds_types.FriendMii, error) { friendMiis := make([]*friends_3ds_types.FriendMii, 0) rows, err := database.Postgres.Query(` SELECT pid, mii_name, mii_data FROM "3ds".user_data WHERE pid IN ($1)`, database.PIDArrayToString(pids)) if err != nil { - if err == sql.ErrNoRows { - globals.Logger.Warning(err.Error()) - } else { - globals.Logger.Critical(err.Error()) - } + return friendMiis, err } changedTime := nex.NewDateTime(0) @@ -44,5 +38,5 @@ func GetFriendMiis(pids []uint32) []*friends_3ds_types.FriendMii { friendMiis = append(friendMiis, friendMii) } - return friendMiis + return friendMiis, nil } diff --git a/database/3ds/get_friend_persistent_infos.go b/database/3ds/get_friend_persistent_infos.go index b1c9077..862d18a 100644 --- a/database/3ds/get_friend_persistent_infos.go +++ b/database/3ds/get_friend_persistent_infos.go @@ -11,17 +11,13 @@ import ( ) // GetFriendPersistentInfos returns the persistent information of all friends -func GetFriendPersistentInfos(user1_pid uint32, pids []uint32) []*friends_3ds_types.FriendPersistentInfo { +func GetFriendPersistentInfos(user1_pid uint32, pids []uint32) ([]*friends_3ds_types.FriendPersistentInfo, error) { persistentInfos := make([]*friends_3ds_types.FriendPersistentInfo, 0) rows, err := database.Postgres.Query(` SELECT pid, region, area, language, favorite_title, favorite_title_version, comment, comment_changed, last_online FROM "3ds".user_data WHERE pid IN ($1)`, database.PIDArrayToString(pids)) if err != nil { - if err == sql.ErrNoRows { - globals.Logger.Warning(err.Error()) - } else { - globals.Logger.Critical(err.Error()) - } + return persistentInfos, err } for rows.Next() { @@ -44,6 +40,7 @@ func GetFriendPersistentInfos(user1_pid uint32, pids []uint32) []*friends_3ds_ty friendedAtTime = uint64(time.Now().Unix()) } else { globals.Logger.Critical(err.Error()) + continue } } @@ -56,5 +53,5 @@ func GetFriendPersistentInfos(user1_pid uint32, pids []uint32) []*friends_3ds_ty persistentInfos = append(persistentInfos, persistentInfo) } - return persistentInfos + return persistentInfos, nil } diff --git a/database/3ds/get_user_friends.go b/database/3ds/get_user_friends.go index ec2f53f..f86ee00 100644 --- a/database/3ds/get_user_friends.go +++ b/database/3ds/get_user_friends.go @@ -4,18 +4,21 @@ import ( "database/sql" "github.com/PretendoNetwork/friends/database" - "github.com/PretendoNetwork/friends/globals" friends_3ds_types "github.com/PretendoNetwork/nex-protocols-go/friends-3ds/types" ) // GetUserFriends returns all friend relationships of a user -func GetUserFriends(pid uint32) []*friends_3ds_types.FriendRelationship { +func GetUserFriends(pid uint32) ([]*friends_3ds_types.FriendRelationship, error) { friendRelationships := make([]*friends_3ds_types.FriendRelationship, 0) rows, err := database.Postgres.Query(` SELECT user2_pid, type FROM "3ds".friendships WHERE user1_pid=$1 AND type=1 LIMIT 100`, pid) - if err != nil && err != sql.ErrNoRows { - globals.Logger.Critical(err.Error()) + if err != nil { + if err == sql.ErrNoRows { + return friendRelationships, database.ErrEmptyList + } else { + return friendRelationships, err + } } for rows.Next() { @@ -26,5 +29,5 @@ func GetUserFriends(pid uint32) []*friends_3ds_types.FriendRelationship { friendRelationships = append(friendRelationships, relationship) } - return friendRelationships + return friendRelationships, nil } diff --git a/database/3ds/remove_friendship.go b/database/3ds/remove_friendship.go index 17110e8..cb39d81 100644 --- a/database/3ds/remove_friendship.go +++ b/database/3ds/remove_friendship.go @@ -6,12 +6,17 @@ import ( // RemoveFriendship removes a user's friend relationship func RemoveFriendship(user1_pid uint32, user2_pid uint32) error { - _, err := database.Postgres.Exec(` + result, err := database.Postgres.Exec(` DELETE FROM "3ds".friendships WHERE user1_pid=$1 AND user2_pid=$2`, user1_pid, user2_pid) if err != nil { return err } + rowsAffected, _ := result.RowsAffected() + if rowsAffected == 0 { + return database.ErrFriendshipNotFound + } + _, err = database.Postgres.Exec(` UPDATE "3ds".friendships SET type=0 WHERE user1_pid=$1 AND user2_pid=$2`, user2_pid, user1_pid) if err != nil { diff --git a/database/database.go b/database/database.go index 8a2c7f4..879ed0e 100644 --- a/database/database.go +++ b/database/database.go @@ -1,10 +1,29 @@ package database import ( + "errors" "fmt" "strings" ) +var ( + // ErrPIDNotFound is returned if a given PID is not found in the database + ErrPIDNotFound = errors.New("PID not found") + + // ErrFriendRequestNotFound is returned if a given friend request is not found in the database + ErrFriendRequestNotFound = errors.New("Friend request not found") + + // ErrFriendshipNotFound is returned if a given friendship is not found in the database + ErrFriendshipNotFound = errors.New("Friendship not found") + + // ErrBlockListNotFound is returned if a given PID does not have a blacklist + ErrBlacklistNotFound = errors.New("Blacklist not found") + + // ErrEmptyList is returned if a given PID returned an empty list on an operation + ErrEmptyList = errors.New("List is empty") +) + +// PIDArrayToString converts an array of PIDs to a string usable in Postgres queries func PIDArrayToString(array []uint32) string { return strings.Trim(strings.Replace(fmt.Sprint(array), " ", ",", -1), "[]") } diff --git a/database/wiiu/accept_friend_request_and_return_friend_info.go b/database/wiiu/accept_friend_request_and_return_friend_info.go index 8399b91..89649bc 100644 --- a/database/wiiu/accept_friend_request_and_return_friend_info.go +++ b/database/wiiu/accept_friend_request_and_return_friend_info.go @@ -1,6 +1,7 @@ package database_wiiu import ( + "database/sql" "time" "github.com/PretendoNetwork/friends/database" @@ -9,13 +10,18 @@ import ( friends_wiiu_types "github.com/PretendoNetwork/nex-protocols-go/friends-wiiu/types" ) +// AcceptFriendRequestAndReturnFriendInfo accepts the given friend reuqest and returns the friend's information func AcceptFriendRequestAndReturnFriendInfo(friendRequestID uint64) (*friends_wiiu_types.FriendInfo, error) { var senderPID uint32 var recipientPID uint32 err := database.Postgres.QueryRow(`SELECT sender_pid, recipient_pid FROM wiiu.friend_requests WHERE id=$1`, friendRequestID).Scan(&senderPID, &recipientPID) if err != nil { - return nil, err + if err == sql.ErrNoRows { + return nil, database.ErrFriendRequestNotFound + } else { + return nil, err + } } acceptedTime := nex.NewDateTime(0) @@ -66,9 +72,18 @@ func AcceptFriendRequestAndReturnFriendInfo(friendRequestID uint64) (*friends_wi lastOnline.FromTimestamp(time.Now()) } else { // Offline + userData, err := globals.GetUserData(senderPID) + if err != nil { + return nil, err + } friendInfo.NNAInfo = friends_wiiu_types.NewNNAInfo() - friendInfo.NNAInfo.PrincipalBasicInfo = GetUserInfoByPID(senderPID) + userInfo, err := GetUserInfoByPNIDData(userData) + if err != nil { + return nil, err + } + + friendInfo.NNAInfo.PrincipalBasicInfo = userInfo friendInfo.NNAInfo.Unknown1 = 0 friendInfo.NNAInfo.Unknown2 = 0 @@ -92,18 +107,24 @@ func AcceptFriendRequestAndReturnFriendInfo(friendRequestID uint64) (*friends_wi friendInfo.Presence.Unknown7 = 0 var lastOnlineTime uint64 - err := database.Postgres.QueryRow(`SELECT last_online FROM wiiu.user_data WHERE pid=$1`, senderPID).Scan(&lastOnlineTime) + err = database.Postgres.QueryRow(`SELECT last_online FROM wiiu.user_data WHERE pid=$1`, senderPID).Scan(&lastOnlineTime) if err != nil { - lastOnlineTime = nex.NewDateTime(0).Now() - - // TODO: Should we return the error here? - globals.Logger.Critical(err.Error()) + if err == sql.ErrNoRows { + return nil, database.ErrPIDNotFound + } else { + return nil, err + } } lastOnline = nex.NewDateTime(lastOnlineTime) // TODO: Change this } - friendInfo.Status = GetUserComment(senderPID) + status, err := GetUserComment(senderPID) + if err != nil { + return nil, err + } + + friendInfo.Status = status friendInfo.BecameFriend = acceptedTime friendInfo.LastOnline = lastOnline // TODO: Change this friendInfo.Unknown = 0 diff --git a/database/wiiu/delete_friend_request_and_return_friend_pid.go b/database/wiiu/delete_friend_request_and_return_friend_pid.go index 425dcf5..06bc16c 100644 --- a/database/wiiu/delete_friend_request_and_return_friend_pid.go +++ b/database/wiiu/delete_friend_request_and_return_friend_pid.go @@ -1,22 +1,34 @@ package database_wiiu import ( + "database/sql" + "github.com/PretendoNetwork/friends/database" ) +// DeleteFriendRequestAndReturnFriendPID deletes a given friend request and returns the friend's PID func DeleteFriendRequestAndReturnFriendPID(friendRequestID uint64) (uint32, error) { var recipientPID uint32 err := database.Postgres.QueryRow(`SELECT recipient_pid FROM wiiu.friend_requests WHERE id=$1`, friendRequestID).Scan(&recipientPID) if err != nil { - return 0, err + if err == sql.ErrNoRows { + return 0, database.ErrFriendRequestNotFound + } else { + return 0, err + } } - _, err = database.Postgres.Exec(` + result, err := database.Postgres.Exec(` DELETE FROM wiiu.friend_requests WHERE id=$1`, friendRequestID) if err != nil { return 0, err } + rowsAffected, _ := result.RowsAffected() + if rowsAffected == 0 { + return 0, database.ErrFriendRequestNotFound + } + return recipientPID, nil } diff --git a/database/wiiu/get_pids_by_friend_request_id.go b/database/wiiu/get_pids_by_friend_request_id.go index 16dfdfc..771f024 100644 --- a/database/wiiu/get_pids_by_friend_request_id.go +++ b/database/wiiu/get_pids_by_friend_request_id.go @@ -4,11 +4,10 @@ import ( "database/sql" "github.com/PretendoNetwork/friends/database" - "github.com/PretendoNetwork/friends/globals" ) -// Get a users outgoing friend request -func GetPIDsByFriendRequestID(friendRequestID uint64) (uint32, uint32) { +// GetPIDsByFriendRequestID returns the users outgoing friend request +func GetPIDsByFriendRequestID(friendRequestID uint64) (uint32, uint32, error) { var senderPID uint32 var recipientPID uint32 @@ -17,11 +16,11 @@ func GetPIDsByFriendRequestID(friendRequestID uint64) (uint32, uint32) { `, friendRequestID).Scan(&senderPID, &recipientPID) if err != nil { if err == sql.ErrNoRows { - globals.Logger.Warning(err.Error()) + return 0, 0, database.ErrFriendRequestNotFound } else { - globals.Logger.Critical(err.Error()) + return 0, 0, err } } - return senderPID, recipientPID + return senderPID, recipientPID, nil } diff --git a/database/wiiu/get_user_block_list.go b/database/wiiu/get_user_block_list.go index d889128..b81457c 100644 --- a/database/wiiu/get_user_block_list.go +++ b/database/wiiu/get_user_block_list.go @@ -1,20 +1,25 @@ package database_wiiu import ( + "database/sql" + "github.com/PretendoNetwork/friends/database" "github.com/PretendoNetwork/friends/globals" "github.com/PretendoNetwork/nex-go" friends_wiiu_types "github.com/PretendoNetwork/nex-protocols-go/friends-wiiu/types" ) -// Get a users blacklist -func GetUserBlockList(pid uint32) []*friends_wiiu_types.BlacklistedPrincipal { +// GetUserBlockList returns a user's blacklist +func GetUserBlockList(pid uint32) ([]*friends_wiiu_types.BlacklistedPrincipal, error) { blockList := make([]*friends_wiiu_types.BlacklistedPrincipal, 0) rows, err := database.Postgres.Query(`SELECT blocked_pid, title_id, title_version, date FROM wiiu.blocks WHERE blocker_pid=$1`, pid) if err != nil { - globals.Logger.Critical(err.Error()) - return blockList + if err == sql.ErrNoRows { + return blockList, database.ErrBlacklistNotFound + } else { + return blockList, err + } } for rows.Next() { @@ -24,9 +29,21 @@ func GetUserBlockList(pid uint32) []*friends_wiiu_types.BlacklistedPrincipal { var date *nex.DateTime rows.Scan(&pid, &titleId, &titleVersion, &date) + userData, err := globals.GetUserData(pid) + if err != nil { + globals.Logger.Critical(err.Error()) + continue + } + + userInfo, err := GetUserInfoByPNIDData(userData) + if err != nil { + globals.Logger.Critical(err.Error()) + continue + } + blacklistPrincipal := friends_wiiu_types.NewBlacklistedPrincipal() - blacklistPrincipal.PrincipalBasicInfo = GetUserInfoByPID(pid) + blacklistPrincipal.PrincipalBasicInfo = userInfo blacklistPrincipal.GameKey = friends_wiiu_types.NewGameKey() blacklistPrincipal.GameKey.TitleID = titleId @@ -36,5 +53,5 @@ func GetUserBlockList(pid uint32) []*friends_wiiu_types.BlacklistedPrincipal { blockList = append(blockList, blacklistPrincipal) } - return blockList + return blockList, nil } diff --git a/database/wiiu/get_user_comment.go b/database/wiiu/get_user_comment.go index b74d8a2..f0ef2ae 100644 --- a/database/wiiu/get_user_comment.go +++ b/database/wiiu/get_user_comment.go @@ -4,13 +4,12 @@ import ( "database/sql" "github.com/PretendoNetwork/friends/database" - "github.com/PretendoNetwork/friends/globals" "github.com/PretendoNetwork/nex-go" friends_wiiu_types "github.com/PretendoNetwork/nex-protocols-go/friends-wiiu/types" ) -// Get a users comment -func GetUserComment(pid uint32) *friends_wiiu_types.Comment { +// GetUserComment returns a user's comment +func GetUserComment(pid uint32) (*friends_wiiu_types.Comment, error) { comment := friends_wiiu_types.NewComment() comment.Unknown = 0 @@ -19,13 +18,13 @@ func GetUserComment(pid uint32) *friends_wiiu_types.Comment { err := database.Postgres.QueryRow(`SELECT comment, comment_changed FROM wiiu.user_data WHERE pid=$1`, pid).Scan(&comment.Contents, &changed) if err != nil { if err == sql.ErrNoRows { - globals.Logger.Warning(err.Error()) + return nil, database.ErrPIDNotFound } else { - globals.Logger.Critical(err.Error()) + return nil, err } } comment.LastChanged = nex.NewDateTime(changed) - return comment + return comment, nil } diff --git a/database/wiiu/get_user_friend_list.go b/database/wiiu/get_user_friend_list.go index c46029d..cd71a6d 100644 --- a/database/wiiu/get_user_friend_list.go +++ b/database/wiiu/get_user_friend_list.go @@ -1,6 +1,7 @@ package database_wiiu import ( + "database/sql" "fmt" "time" @@ -8,17 +9,19 @@ import ( "github.com/PretendoNetwork/friends/globals" "github.com/PretendoNetwork/nex-go" friends_wiiu_types "github.com/PretendoNetwork/nex-protocols-go/friends-wiiu/types" - "github.com/gocql/gocql" ) -// Get a users friend list -func GetUserFriendList(pid uint32) []*friends_wiiu_types.FriendInfo { +// GetUserFriendList returns a user's friend list +func GetUserFriendList(pid uint32) ([]*friends_wiiu_types.FriendInfo, error) { friendList := make([]*friends_wiiu_types.FriendInfo, 0) rows, err := database.Postgres.Query(`SELECT user2_pid, date FROM wiiu.friendships WHERE user1_pid=$1 AND active=true LIMIT 100`, pid) if err != nil { - globals.Logger.Critical(err.Error()) - return friendList + if err == sql.ErrNoRows { + return friendList, database.ErrEmptyList + } else { + return friendList, err + } } for rows.Next() { @@ -52,8 +55,21 @@ func GetUserFriendList(pid uint32) []*friends_wiiu_types.FriendInfo { } else { // Offline + userData, err := globals.GetUserData(friendPID) + if err != nil { + globals.Logger.Critical(err.Error()) + continue + } + + userInfo, err := GetUserInfoByPNIDData(userData) + if err != nil { + globals.Logger.Critical(err.Error()) + continue + } + friendInfo.NNAInfo = friends_wiiu_types.NewNNAInfo() - friendInfo.NNAInfo.PrincipalBasicInfo = GetUserInfoByPID(friendPID) + + friendInfo.NNAInfo.PrincipalBasicInfo = userInfo friendInfo.NNAInfo.Unknown1 = 0 friendInfo.NNAInfo.Unknown2 = 0 @@ -77,21 +93,23 @@ func GetUserFriendList(pid uint32) []*friends_wiiu_types.FriendInfo { friendInfo.Presence.Unknown7 = 0 var lastOnlineTime uint64 - err := database.Postgres.QueryRow(`SELECT last_online FROM wiiu.user_data WHERE pid=$1`, friendPID).Scan(&lastOnlineTime) + err = database.Postgres.QueryRow(`SELECT last_online FROM wiiu.user_data WHERE pid=$1`, friendPID).Scan(&lastOnlineTime) if err != nil { - lastOnlineTime = nex.NewDateTime(0).Now() - - if err == gocql.ErrNotFound { - globals.Logger.Error(err.Error()) - } else { - globals.Logger.Critical(err.Error()) - } + globals.Logger.Critical(err.Error()) + continue } lastOnline = nex.NewDateTime(lastOnlineTime) // TODO: Change this } - friendInfo.Status = GetUserComment(friendPID) + status, err := GetUserComment(friendPID) + if err != nil { + globals.Logger.Critical(err.Error()) + continue + } + + friendInfo.Status = status + friendInfo.BecameFriend = nex.NewDateTime(date) friendInfo.LastOnline = lastOnline friendInfo.Unknown = 0 @@ -99,5 +117,5 @@ func GetUserFriendList(pid uint32) []*friends_wiiu_types.FriendInfo { friendList = append(friendList, friendInfo) } - return friendList + return friendList, nil } diff --git a/database/wiiu/get_user_friend_pids.go b/database/wiiu/get_user_friend_pids.go index 475aa97..ad9e264 100644 --- a/database/wiiu/get_user_friend_pids.go +++ b/database/wiiu/get_user_friend_pids.go @@ -1,18 +1,22 @@ package database_wiiu import ( + "database/sql" + "github.com/PretendoNetwork/friends/database" - "github.com/PretendoNetwork/friends/globals" ) -// Get a users friend PIDs list -func GetUserFriendPIDs(pid uint32) []uint32 { +// GetUserFriendPIDs returns a user's friend PIDs list +func GetUserFriendPIDs(pid uint32) ([]uint32, error) { pids := make([]uint32, 0) rows, err := database.Postgres.Query(`SELECT user2_pid FROM wiiu.friendships WHERE user1_pid=$1 AND active=true LIMIT 100`, pid) if err != nil { - globals.Logger.Critical(err.Error()) - return pids + if err == sql.ErrNoRows { + return pids, database.ErrEmptyList + } else { + return pids, err + } } defer rows.Close() @@ -23,5 +27,5 @@ func GetUserFriendPIDs(pid uint32) []uint32 { pids = append(pids, pid) } - return pids + return pids, nil } diff --git a/database/wiiu/get_user_friend_requests_in.go b/database/wiiu/get_user_friend_requests_in.go index 2fcdd15..7f3987a 100644 --- a/database/wiiu/get_user_friend_requests_in.go +++ b/database/wiiu/get_user_friend_requests_in.go @@ -1,6 +1,7 @@ package database_wiiu import ( + "database/sql" "time" "github.com/PretendoNetwork/friends/database" @@ -9,14 +10,17 @@ import ( friends_wiiu_types "github.com/PretendoNetwork/nex-protocols-go/friends-wiiu/types" ) -// Get a users received friend requests -func GetUserFriendRequestsIn(pid uint32) []*friends_wiiu_types.FriendRequest { +// GetUserFriendRequestsIn returns the friend requests received by a user +func GetUserFriendRequestsIn(pid uint32) ([]*friends_wiiu_types.FriendRequest, error) { friendRequestsIn := make([]*friends_wiiu_types.FriendRequest, 0) rows, err := database.Postgres.Query(`SELECT id, sender_pid, sent_on, expires_on, message, received FROM wiiu.friend_requests WHERE recipient_pid=$1 AND accepted=false AND denied=false`, pid) if err != nil { - globals.Logger.Critical(err.Error()) - return friendRequestsIn + if err == sql.ErrNoRows { + return friendRequestsIn, database.ErrEmptyList + } else { + return friendRequestsIn, err + } } for rows.Next() { @@ -28,10 +32,21 @@ func GetUserFriendRequestsIn(pid uint32) []*friends_wiiu_types.FriendRequest { var received bool rows.Scan(&id, &senderPID, &sentOn, &expiresOn, &message, &received) + userData, err := globals.GetUserData(senderPID) + if err != nil { + globals.Logger.Critical(err.Error()) + continue + } + + userInfo, err := GetUserInfoByPNIDData(userData) + if err != nil { + globals.Logger.Critical(err.Error()) + continue + } + friendRequest := friends_wiiu_types.NewFriendRequest() - friendRequest.PrincipalInfo = GetUserInfoByPID(senderPID) - + friendRequest.PrincipalInfo = userInfo friendRequest.Message = friends_wiiu_types.NewFriendRequestMessage() friendRequest.Message.FriendRequestID = id friendRequest.Message.Received = received @@ -52,5 +67,5 @@ func GetUserFriendRequestsIn(pid uint32) []*friends_wiiu_types.FriendRequest { } } - return friendRequestsIn + return friendRequestsIn, nil } diff --git a/database/wiiu/get_user_friend_requests_out.go b/database/wiiu/get_user_friend_requests_out.go index 8a2cdee..b494054 100644 --- a/database/wiiu/get_user_friend_requests_out.go +++ b/database/wiiu/get_user_friend_requests_out.go @@ -1,20 +1,25 @@ package database_wiiu import ( + "database/sql" + "github.com/PretendoNetwork/friends/database" "github.com/PretendoNetwork/friends/globals" "github.com/PretendoNetwork/nex-go" friends_wiiu_types "github.com/PretendoNetwork/nex-protocols-go/friends-wiiu/types" ) -// Get a users sent friend requests -func GetUserFriendRequestsOut(pid uint32) []*friends_wiiu_types.FriendRequest { +// GetUserFriendRequestsOut returns the friend requests sent by a user +func GetUserFriendRequestsOut(pid uint32) ([]*friends_wiiu_types.FriendRequest, error) { friendRequestsOut := make([]*friends_wiiu_types.FriendRequest, 0) rows, err := database.Postgres.Query(`SELECT id, recipient_pid, sent_on, expires_on, message, received FROM wiiu.friend_requests WHERE sender_pid=$1 AND accepted=false`, pid) if err != nil { - globals.Logger.Critical(err.Error()) - return friendRequestsOut + if err == sql.ErrNoRows { + return friendRequestsOut, database.ErrEmptyList + } else { + return friendRequestsOut, err + } } for rows.Next() { @@ -26,10 +31,21 @@ func GetUserFriendRequestsOut(pid uint32) []*friends_wiiu_types.FriendRequest { var received bool rows.Scan(&id, &recipientPID, &sentOn, &expiresOn, &message, &received) + userData, err := globals.GetUserData(recipientPID) + if err != nil { + globals.Logger.Critical(err.Error()) + continue + } + + userInfo, err := GetUserInfoByPNIDData(userData) + if err != nil { + globals.Logger.Critical(err.Error()) + continue + } + friendRequest := friends_wiiu_types.NewFriendRequest() - friendRequest.PrincipalInfo = GetUserInfoByPID(recipientPID) - + friendRequest.PrincipalInfo = userInfo friendRequest.Message = friends_wiiu_types.NewFriendRequestMessage() friendRequest.Message.FriendRequestID = id friendRequest.Message.Received = received @@ -47,5 +63,5 @@ func GetUserFriendRequestsOut(pid uint32) []*friends_wiiu_types.FriendRequest { friendRequestsOut = append(friendRequestsOut, friendRequest) } - return friendRequestsOut + return friendRequestsOut, nil } diff --git a/database/wiiu/get_user_info_by_pid.go b/database/wiiu/get_user_info_by_pnid_data.go similarity index 58% rename from database/wiiu/get_user_info_by_pid.go rename to database/wiiu/get_user_info_by_pnid_data.go index d3a3f3b..d6c26c4 100644 --- a/database/wiiu/get_user_info_by_pid.go +++ b/database/wiiu/get_user_info_by_pnid_data.go @@ -3,29 +3,25 @@ package database_wiiu import ( "encoding/base64" - "github.com/PretendoNetwork/friends/globals" + pb "github.com/PretendoNetwork/grpc-go/account" "github.com/PretendoNetwork/nex-go" friends_wiiu_types "github.com/PretendoNetwork/nex-protocols-go/friends-wiiu/types" ) -func GetUserInfoByPID(pid uint32) *friends_wiiu_types.PrincipalBasicInfo { +// GetUserInfoByPNIDData converts the account's PNID data into user info for friends +func GetUserInfoByPNIDData(userData *pb.GetUserDataResponse) (*friends_wiiu_types.PrincipalBasicInfo, error) { info := friends_wiiu_types.NewPrincipalBasicInfo() - userData, err := globals.GetUserData(pid) - - if err != nil { - globals.Logger.Critical(err.Error()) - - return info - } - - info.PID = pid + info.PID = userData.Pid info.NNID = userData.Username info.Mii = friends_wiiu_types.NewMiiV2() info.Unknown = 2 encodedMiiData := userData.Mii.Data - decodedMiiData, _ := base64.StdEncoding.DecodeString(encodedMiiData) + decodedMiiData, err := base64.StdEncoding.DecodeString(encodedMiiData) + if err != nil { + return nil, err + } info.Mii.Name = userData.Mii.Name info.Mii.Unknown1 = 0 @@ -33,5 +29,5 @@ func GetUserInfoByPID(pid uint32) *friends_wiiu_types.PrincipalBasicInfo { info.Mii.MiiData = decodedMiiData info.Mii.Datetime = nex.NewDateTime(0) - return info + return info, nil } diff --git a/database/wiiu/get_user_notifications.go b/database/wiiu/get_user_notifications.go index 7440c20..fae7eeb 100644 --- a/database/wiiu/get_user_notifications.go +++ b/database/wiiu/get_user_notifications.go @@ -2,7 +2,7 @@ package database_wiiu import friends_wiiu_types "github.com/PretendoNetwork/nex-protocols-go/friends-wiiu/types" -// Get notifications for a user +// GetUserNotifications returns notifications for a user func GetUserNotifications(pid uint32) []*friends_wiiu_types.PersistentNotification { return make([]*friends_wiiu_types.PersistentNotification, 0) } diff --git a/database/wiiu/get_user_principal_preference.go b/database/wiiu/get_user_principal_preference.go index 8c3e125..8824673 100644 --- a/database/wiiu/get_user_principal_preference.go +++ b/database/wiiu/get_user_principal_preference.go @@ -4,21 +4,21 @@ import ( "database/sql" "github.com/PretendoNetwork/friends/database" - "github.com/PretendoNetwork/friends/globals" friends_wiiu_types "github.com/PretendoNetwork/nex-protocols-go/friends-wiiu/types" ) -func GetUserPrincipalPreference(pid uint32) *friends_wiiu_types.PrincipalPreference { +// GetUserPrincipalPreference returns the user preferences +func GetUserPrincipalPreference(pid uint32) (*friends_wiiu_types.PrincipalPreference, error) { preference := friends_wiiu_types.NewPrincipalPreference() err := database.Postgres.QueryRow(`SELECT show_online, show_current_game, block_friend_requests FROM wiiu.user_data WHERE pid=$1`, pid).Scan(&preference.ShowOnlinePresence, &preference.ShowCurrentTitle, &preference.BlockFriendRequests) if err != nil { if err == sql.ErrNoRows { - globals.Logger.Warning(err.Error()) + return nil, database.ErrPIDNotFound } else { - globals.Logger.Critical(err.Error()) + return nil, err } } - return preference + return preference, nil } diff --git a/database/wiiu/is_friend_request_blocked.go b/database/wiiu/is_friend_request_blocked.go index 310aa06..2ec62bf 100644 --- a/database/wiiu/is_friend_request_blocked.go +++ b/database/wiiu/is_friend_request_blocked.go @@ -2,15 +2,15 @@ package database_wiiu import ( "github.com/PretendoNetwork/friends/database" - "github.com/PretendoNetwork/friends/globals" ) -func IsFriendRequestBlocked(requesterPID uint32, requestedPID uint32) bool { +// IsFriendRequestBlocked determines if a requester PID has blocked a requested PID +func IsFriendRequestBlocked(requesterPID uint32, requestedPID uint32) (bool, error) { var found bool err := database.Postgres.QueryRow(`SELECT COUNT(*) FROM wiiu.blocks WHERE blocker_pid=$1 AND blocked_pid=$2 LIMIT 1`, requesterPID, requestedPID).Scan(&found) if err != nil { - globals.Logger.Critical(err.Error()) + return false, err } - return found + return found, nil } diff --git a/database/wiiu/remove_friendship.go b/database/wiiu/remove_friendship.go index 8c2d607..b35d0f6 100644 --- a/database/wiiu/remove_friendship.go +++ b/database/wiiu/remove_friendship.go @@ -4,14 +4,19 @@ import ( "github.com/PretendoNetwork/friends/database" ) -// Remove a user's friend relationship +// RemoveFriendship removes a user's friend relationship func RemoveFriendship(user1_pid uint32, user2_pid uint32) error { - _, err := database.Postgres.Exec(` + result, err := database.Postgres.Exec(` DELETE FROM wiiu.friendships WHERE user1_pid=$1 AND user2_pid=$2`, user1_pid, user2_pid) if err != nil { return err } + rowsAffected, _ := result.RowsAffected() + if rowsAffected == 0 { + return database.ErrFriendshipNotFound + } + _, err = database.Postgres.Exec(` UPDATE wiiu.friendships SET active=false WHERE user1_pid=$1 AND user2_pid=$2`, user2_pid, user1_pid) if err != nil { diff --git a/database/wiiu/save_friend_request.go b/database/wiiu/save_friend_request.go index 921230d..9b22207 100644 --- a/database/wiiu/save_friend_request.go +++ b/database/wiiu/save_friend_request.go @@ -6,13 +6,17 @@ import ( "github.com/PretendoNetwork/friends/database" ) +// SaveFriendRequest registers a new friend request func SaveFriendRequest(senderPID uint32, recipientPID uint32, sentTime uint64, expireTime uint64, message string) (uint64, error) { var id uint64 - friendRequestBlocked := IsFriendRequestBlocked(recipientPID, senderPID) + friendRequestBlocked, err := IsFriendRequestBlocked(recipientPID, senderPID) + if err != nil { + return 0, err + } // Make sure we don't already have that friend request! If we do, give them the one we already have. - err := database.Postgres.QueryRow(`SELECT id FROM wiiu.friend_requests WHERE sender_pid=$1 AND recipient_pid=$2`, senderPID, recipientPID).Scan(&id) + err = database.Postgres.QueryRow(`SELECT id FROM wiiu.friend_requests WHERE sender_pid=$1 AND recipient_pid=$2`, senderPID, recipientPID).Scan(&id) if err != nil && err != sql.ErrNoRows { return 0, err } else if id != 0 { diff --git a/database/wiiu/set_friend_request_accepted.go b/database/wiiu/set_friend_request_accepted.go index 5cbde7c..bddc299 100644 --- a/database/wiiu/set_friend_request_accepted.go +++ b/database/wiiu/set_friend_request_accepted.go @@ -4,11 +4,17 @@ import ( "github.com/PretendoNetwork/friends/database" ) +// SetFriendRequestAccepted marks a friend request as accepted func SetFriendRequestAccepted(friendRequestID uint64) error { - _, err := database.Postgres.Exec(`UPDATE wiiu.friend_requests SET accepted=true WHERE id=$1`, friendRequestID) + result, err := database.Postgres.Exec(`UPDATE wiiu.friend_requests SET accepted=true WHERE id=$1`, friendRequestID) if err != nil { return err } + rowsAffected, _ := result.RowsAffected() + if rowsAffected == 0 { + return database.ErrFriendRequestNotFound + } + return nil } diff --git a/database/wiiu/set_friend_request_denied.go b/database/wiiu/set_friend_request_denied.go index 7204aac..989183e 100644 --- a/database/wiiu/set_friend_request_denied.go +++ b/database/wiiu/set_friend_request_denied.go @@ -4,12 +4,17 @@ import ( "github.com/PretendoNetwork/friends/database" ) +// SetFriendRequestDenied marks a friend request as denied func SetFriendRequestDenied(friendRequestID uint64) error { - _, err := database.Postgres.Exec(`UPDATE wiiu.friend_requests SET denied=true WHERE id=$1`, friendRequestID) - + result, err := database.Postgres.Exec(`UPDATE wiiu.friend_requests SET denied=true WHERE id=$1`, friendRequestID) if err != nil { return err } + rowsAffected, _ := result.RowsAffected() + if rowsAffected == 0 { + return database.ErrFriendRequestNotFound + } + return nil } diff --git a/database/wiiu/set_friend_request_received.go b/database/wiiu/set_friend_request_received.go index 7fc9537..e31e4dd 100644 --- a/database/wiiu/set_friend_request_received.go +++ b/database/wiiu/set_friend_request_received.go @@ -4,12 +4,17 @@ import ( "github.com/PretendoNetwork/friends/database" ) +// SetFriendRequestReceived marks a friend request as received func SetFriendRequestReceived(friendRequestID uint64) error { - _, err := database.Postgres.Exec(`UPDATE wiiu.friend_requests SET received=true WHERE id=$1`, friendRequestID) - + result, err := database.Postgres.Exec(`UPDATE wiiu.friend_requests SET received=true WHERE id=$1`, friendRequestID) if err != nil { return err } + rowsAffected, _ := result.RowsAffected() + if rowsAffected == 0 { + return database.ErrFriendRequestNotFound + } + return nil } diff --git a/database/wiiu/set_user_blocked.go b/database/wiiu/set_user_blocked.go index 73c7518..67cdf33 100644 --- a/database/wiiu/set_user_blocked.go +++ b/database/wiiu/set_user_blocked.go @@ -7,6 +7,7 @@ import ( "github.com/PretendoNetwork/nex-go" ) +// SetUserBlocked marks a blocked PID as blocked on a bloker PID block list func SetUserBlocked(blockerPID uint32, blockedPID uint32, titleId uint64, titleVersion uint16) error { date := nex.NewDateTime(0) date.FromTimestamp(time.Now()) diff --git a/database/wiiu/unset_friend_request_denied.go b/database/wiiu/unset_friend_request_denied.go index 2b66254..1592c20 100644 --- a/database/wiiu/unset_friend_request_denied.go +++ b/database/wiiu/unset_friend_request_denied.go @@ -4,12 +4,17 @@ import ( "github.com/PretendoNetwork/friends/database" ) +// UnsetFriendRequestDenied unmarks a friend request as denied func UnsetFriendRequestDenied(friendRequestID uint64) error { - _, err := database.Postgres.Exec(`UPDATE wiiu.friend_requests SET denied=false WHERE id=$1`, friendRequestID) - + result, err := database.Postgres.Exec(`UPDATE wiiu.friend_requests SET denied=false WHERE id=$1`, friendRequestID) if err != nil { return err } + rowsAffected, _ := result.RowsAffected() + if rowsAffected == 0 { + return database.ErrFriendRequestNotFound + } + return nil } diff --git a/database/wiiu/unset_user_blocked.go b/database/wiiu/unset_user_blocked.go index 07b5093..755ef00 100644 --- a/database/wiiu/unset_user_blocked.go +++ b/database/wiiu/unset_user_blocked.go @@ -6,11 +6,16 @@ import ( // Remove a block from a user func UnsetUserBlocked(user1_pid uint32, user2_pid uint32) error { - _, err := database.Postgres.Exec(` + result, err := database.Postgres.Exec(` DELETE FROM wiiu.blocks WHERE blocker_pid=$1 AND blocked_pid=$2`, user1_pid, user2_pid) if err != nil { return err } + rowsAffected, _ := result.RowsAffected() + if rowsAffected == 0 { + return database.ErrPIDNotFound + } + return nil } diff --git a/globals/get_user_data.go b/globals/get_user_data.go index adc867e..0f2ce27 100644 --- a/globals/get_user_data.go +++ b/globals/get_user_data.go @@ -4,7 +4,6 @@ import ( "context" pb "github.com/PretendoNetwork/grpc-go/account" - "github.com/PretendoNetwork/nex-protocols-go/globals" "google.golang.org/grpc/metadata" ) @@ -13,7 +12,6 @@ func GetUserData(pid uint32) (*pb.GetUserDataResponse, error) { response, err := GRPCAccountClient.GetUserData(ctx, &pb.GetUserDataRequest{Pid: pid}) if err != nil { - globals.Logger.Error(err.Error()) return nil, err } diff --git a/globals/password_from_pid.go b/globals/password_from_pid.go index f59823c..9870177 100644 --- a/globals/password_from_pid.go +++ b/globals/password_from_pid.go @@ -5,7 +5,6 @@ import ( pb "github.com/PretendoNetwork/grpc-go/account" "github.com/PretendoNetwork/nex-go" - "github.com/PretendoNetwork/nex-protocols-go/globals" "google.golang.org/grpc/metadata" ) @@ -14,7 +13,7 @@ func PasswordFromPID(pid uint32) (string, uint32) { response, err := GRPCAccountClient.GetNEXPassword(ctx, &pb.GetNEXPasswordRequest{Pid: pid}) if err != nil { - globals.Logger.Error(err.Error()) + Logger.Error(err.Error()) return "", nex.Errors.RendezVous.InvalidUsername } diff --git a/go.mod b/go.mod index 8c88c50..b941044 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,6 @@ require ( github.com/PretendoNetwork/nex-protocols-common-go v1.0.25 github.com/PretendoNetwork/nex-protocols-go v1.0.49 github.com/PretendoNetwork/plogger-go v1.0.4 - github.com/gocql/gocql v1.5.2 github.com/golang/protobuf v1.5.3 github.com/joho/godotenv v1.5.1 github.com/lib/pq v1.10.9 @@ -18,8 +17,6 @@ require ( require ( github.com/fatih/color v1.15.0 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect github.com/jwalton/go-supportscolor v1.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect @@ -30,5 +27,4 @@ require ( golang.org/x/text v0.12.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230807174057-1744710a1577 // indirect google.golang.org/protobuf v1.31.0 // indirect - gopkg.in/inf.v0 v0.9.1 // indirect ) diff --git a/go.sum b/go.sum index e6c9acf..1633da9 100644 --- a/go.sum +++ b/go.sum @@ -8,34 +8,17 @@ github.com/PretendoNetwork/nex-protocols-go v1.0.49 h1:CIAjb9H11uTLj4JT2/4eedX1N github.com/PretendoNetwork/nex-protocols-go v1.0.49/go.mod h1:ztsrVFHaJc5MDBpL1rv4PgriLsTjl3R8u5XVxJHUzCk= github.com/PretendoNetwork/plogger-go v1.0.4 h1:PF7xHw9eDRHH+RsAP9tmAE7fG0N0p6H4iPwHKnsoXwc= github.com/PretendoNetwork/plogger-go v1.0.4/go.mod h1:7kD6M4vPq1JL4LTuPg6kuB1OvUBOwQOtAvTaUwMbwvU= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/gocql/gocql v1.5.2 h1:WnKf8xRQImcT/KLaEWG2pjEeryDB7K0qQN9mPs1C58Q= -github.com/gocql/gocql v1.5.2/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jwalton/go-supportscolor v1.2.0 h1:g6Ha4u7Vm3LIsQ5wmeBpS4gazu0UP1DRDE8y6bre4H8= github.com/jwalton/go-supportscolor v1.2.0/go.mod h1:hFVUAZV2cWg+WFFC4v8pT2X/S2qUUBYMioBD9AINXGs= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -43,9 +26,6 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/superwhiskers/crunch/v3 v3.5.7 h1:N9RLxaR65C36i26BUIpzPXGy2f6pQ7wisu2bawbKNqg= github.com/superwhiskers/crunch/v3 v3.5.7/go.mod h1:4ub2EKgF1MAhTjoOCTU4b9uLMsAweHEa89aRrfAypXA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= @@ -72,5 +52,3 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= diff --git a/grpc/accept_friend_request.go b/grpc/accept_friend_request.go index 47e822d..2600457 100644 --- a/grpc/accept_friend_request.go +++ b/grpc/accept_friend_request.go @@ -2,22 +2,36 @@ package grpc import ( "context" - "database/sql" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "github.com/PretendoNetwork/friends/database" database_wiiu "github.com/PretendoNetwork/friends/database/wiiu" + "github.com/PretendoNetwork/friends/globals" pb "github.com/PretendoNetwork/grpc-go/friends" ) func (s *gRPCFriendsServer) AcceptFriendRequest(ctx context.Context, in *pb.AcceptFriendRequestRequest) (*pb.AcceptFriendRequestResponse, error) { friendInfo, err := database_wiiu.AcceptFriendRequestAndReturnFriendInfo(in.GetFriendRequestId()) - if err == sql.ErrNoRows { + if err != nil { + if err == database.ErrFriendRequestNotFound { + return &pb.AcceptFriendRequestResponse{ + Success: false, + }, status.Errorf(codes.NotFound, "friend request not found") + } + + if err == database.ErrPIDNotFound { + return &pb.AcceptFriendRequestResponse{ + Success: false, + }, status.Errorf(codes.FailedPrecondition, "friend request has invalid PID") + } + + globals.Logger.Critical(err.Error()) return &pb.AcceptFriendRequestResponse{ Success: false, - }, status.Errorf(codes.NotFound, "friend request not found") + }, status.Errorf(codes.Internal, "internal server error") } return &pb.AcceptFriendRequestResponse{ diff --git a/grpc/deny_friend_request.go b/grpc/deny_friend_request.go index 32ae211..9879c1e 100644 --- a/grpc/deny_friend_request.go +++ b/grpc/deny_friend_request.go @@ -3,14 +3,31 @@ package grpc import ( "context" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/PretendoNetwork/friends/database" database_wiiu "github.com/PretendoNetwork/friends/database/wiiu" + "github.com/PretendoNetwork/friends/globals" pb "github.com/PretendoNetwork/grpc-go/friends" ) func (s *gRPCFriendsServer) DenyFriendRequest(ctx context.Context, in *pb.DenyFriendRequestRequest) (*pb.DenyFriendRequestResponse, error) { err := database_wiiu.SetFriendRequestDenied(in.GetFriendRequestId()) + if err != nil { + if err == database.ErrFriendRequestNotFound { + return &pb.DenyFriendRequestResponse{ + Success: false, + }, status.Errorf(codes.NotFound, "friend request not found") + } + + globals.Logger.Critical(err.Error()) + return &pb.DenyFriendRequestResponse{ + Success: false, + }, status.Errorf(codes.Internal, "internal server error") + } return &pb.DenyFriendRequestResponse{ - Success: err == nil, + Success: true, }, nil } diff --git a/grpc/get_user_friend_pids.go b/grpc/get_user_friend_pids.go index 4780e26..c568a98 100644 --- a/grpc/get_user_friend_pids.go +++ b/grpc/get_user_friend_pids.go @@ -3,16 +3,26 @@ package grpc import ( "context" - database_wiiu "github.com/PretendoNetwork/friends/database/wiiu" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/PretendoNetwork/friends/database" database_3ds "github.com/PretendoNetwork/friends/database/3ds" + database_wiiu "github.com/PretendoNetwork/friends/database/wiiu" + "github.com/PretendoNetwork/friends/globals" pb "github.com/PretendoNetwork/grpc-go/friends" ) func (s *gRPCFriendsServer) GetUserFriendPIDs(ctx context.Context, in *pb.GetUserFriendPIDsRequest) (*pb.GetUserFriendPIDsResponse, error) { var pids []uint32 + var err error // * Try Wii U database first - pids = database_wiiu.GetUserFriendPIDs(in.GetPid()) + pids, err = database_wiiu.GetUserFriendPIDs(in.GetPid()) + if err != nil && err != database.ErrEmptyList { + globals.Logger.Critical(err.Error()) + return nil, status.Errorf(codes.Internal, "internal server error") + } if len(pids) > 0 { return &pb.GetUserFriendPIDsResponse{ @@ -21,7 +31,11 @@ func (s *gRPCFriendsServer) GetUserFriendPIDs(ctx context.Context, in *pb.GetUse } // * If no PIDs are given, try with 3DS database instead - relationships := database_3ds.GetUserFriends(in.GetPid()) + relationships, err := database_3ds.GetUserFriends(in.GetPid()) + if err != nil && err != database.ErrEmptyList { + globals.Logger.Critical(err.Error()) + return nil, status.Errorf(codes.Internal, "internal server error") + } for _, relationship := range relationships { // * Only add complete relationships to the list diff --git a/grpc/get_user_friend_requests_incoming.go b/grpc/get_user_friend_requests_incoming.go index a4f3e1e..942fb13 100644 --- a/grpc/get_user_friend_requests_incoming.go +++ b/grpc/get_user_friend_requests_incoming.go @@ -3,13 +3,22 @@ package grpc import ( "context" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + + "github.com/PretendoNetwork/friends/database" database_wiiu "github.com/PretendoNetwork/friends/database/wiiu" + "github.com/PretendoNetwork/friends/globals" pb "github.com/PretendoNetwork/grpc-go/friends" ) func (s *gRPCFriendsServer) GetUserFriendRequestsIncoming(ctx context.Context, in *pb.GetUserFriendRequestsIncomingRequest) (*pb.GetUserFriendRequestsIncomingResponse, error) { - friendRequestsIn := database_wiiu.GetUserFriendRequestsIn(in.GetPid()) + friendRequestsIn, err := database_wiiu.GetUserFriendRequestsIn(in.GetPid()) + if err != nil && err != database.ErrEmptyList { + globals.Logger.Critical(err.Error()) + return nil, status.Errorf(codes.Internal, "internal server error") + } friendRequests := make([]*pb.FriendRequest, 0, len(friendRequestsIn)) diff --git a/nex/friends-3ds/get_all_friends.go b/nex/friends-3ds/get_all_friends.go index 3015c13..5be1fb8 100644 --- a/nex/friends-3ds/get_all_friends.go +++ b/nex/friends-3ds/get_all_friends.go @@ -1,6 +1,8 @@ package nex_friends_3ds import ( + "database/sql" + database_3ds "github.com/PretendoNetwork/friends/database/3ds" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -13,7 +15,11 @@ func GetAllFriends(err error, client *nex.Client, callID uint32) uint32 { return nex.Errors.FPD.Unknown } - friendRelationships := database_3ds.GetUserFriends(client.PID()) + friendRelationships, err := database_3ds.GetUserFriends(client.PID()) + if err != nil && err != sql.ErrNoRows { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } rmcResponseStream := nex.NewStreamOut(globals.SecureServer) diff --git a/nex/friends-3ds/get_friend_mii.go b/nex/friends-3ds/get_friend_mii.go index 7896284..4768dc9 100644 --- a/nex/friends-3ds/get_friend_mii.go +++ b/nex/friends-3ds/get_friend_mii.go @@ -1,6 +1,8 @@ package nex_friends_3ds import ( + "database/sql" + database_3ds "github.com/PretendoNetwork/friends/database/3ds" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -13,7 +15,11 @@ func GetFriendMii(err error, client *nex.Client, callID uint32, pids []uint32) u return nex.Errors.FPD.InvalidArgument } - miiList := database_3ds.GetFriendMiis(pids) + miiList, err := database_3ds.GetFriendMiis(pids) + if err != nil && err != sql.ErrNoRows { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } rmcResponseStream := nex.NewStreamOut(globals.SecureServer) diff --git a/nex/friends-3ds/get_friend_persistent_info.go b/nex/friends-3ds/get_friend_persistent_info.go index e8f5386..6cc63ff 100644 --- a/nex/friends-3ds/get_friend_persistent_info.go +++ b/nex/friends-3ds/get_friend_persistent_info.go @@ -1,6 +1,8 @@ package nex_friends_3ds import ( + "database/sql" + database_3ds "github.com/PretendoNetwork/friends/database/3ds" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -13,7 +15,11 @@ func GetFriendPersistentInfo(err error, client *nex.Client, callID uint32, pids return nex.Errors.FPD.Unknown } - infoList := database_3ds.GetFriendPersistentInfos(client.PID(), pids) + infoList, err := database_3ds.GetFriendPersistentInfos(client.PID(), pids) + if err != nil && err != sql.ErrNoRows { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } rmcResponseStream := nex.NewStreamOut(globals.SecureServer) diff --git a/nex/friends-3ds/remove_friend_by_pid.go b/nex/friends-3ds/remove_friend_by_pid.go index ab2eb3b..c2a8de3 100644 --- a/nex/friends-3ds/remove_friend_by_pid.go +++ b/nex/friends-3ds/remove_friend_by_pid.go @@ -1,6 +1,7 @@ package nex_friends_3ds import ( + "github.com/PretendoNetwork/friends/database" database_3ds "github.com/PretendoNetwork/friends/database/3ds" "github.com/PretendoNetwork/friends/globals" notifications_3ds "github.com/PretendoNetwork/friends/notifications/3ds" @@ -16,8 +17,14 @@ func RemoveFriendByPrincipalID(err error, client *nex.Client, callID uint32, pid err = database_3ds.RemoveFriendship(client.PID(), pid) if err != nil { - globals.Logger.Critical(err.Error()) - return nex.Errors.FPD.Unknown + if err == database.ErrFriendshipNotFound { + // * Official servers don't actually check this, but + // * we'll do it ourselves + return nex.Errors.FPD.NotFriend + } else { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } } go notifications_3ds.SendUserWentOffline(client, pid) diff --git a/nex/friends-3ds/sync_friend.go b/nex/friends-3ds/sync_friend.go index 41b9947..97de7dc 100644 --- a/nex/friends-3ds/sync_friend.go +++ b/nex/friends-3ds/sync_friend.go @@ -1,6 +1,9 @@ package nex_friends_3ds import ( + "database/sql" + + "github.com/PretendoNetwork/friends/database" database_3ds "github.com/PretendoNetwork/friends/database/3ds" "github.com/PretendoNetwork/friends/globals" notifications_3ds "github.com/PretendoNetwork/friends/notifications/3ds" @@ -16,12 +19,16 @@ func SyncFriend(err error, client *nex.Client, callID uint32, lfc uint64, pids [ return nex.Errors.FPD.InvalidArgument } - friendRelationships := database_3ds.GetUserFriends(client.PID()) + friendRelationships, err := database_3ds.GetUserFriends(client.PID()) + if err != nil && err != sql.ErrNoRows { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } for i := 0; i < len(friendRelationships); i++ { if !slices.Contains(pids, friendRelationships[i].PID) { err := database_3ds.RemoveFriendship(client.PID(), friendRelationships[i].PID) - if err != nil { + if err != nil && err != database.ErrFriendshipNotFound { globals.Logger.Critical(err.Error()) return nex.Errors.FPD.Unknown } diff --git a/nex/friends-wiiu/accept_friend_request.go b/nex/friends-wiiu/accept_friend_request.go index bf6937d..d6459ef 100644 --- a/nex/friends-wiiu/accept_friend_request.go +++ b/nex/friends-wiiu/accept_friend_request.go @@ -1,8 +1,7 @@ package nex_friends_wiiu import ( - "database/sql" - + "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" @@ -19,7 +18,7 @@ func AcceptFriendRequest(err error, client *nex.Client, callID uint32, id uint64 friendInfo, err := database_wiiu.AcceptFriendRequestAndReturnFriendInfo(id) if err != nil { - if err == sql.ErrNoRows { + if err == database.ErrFriendRequestNotFound { return nex.Errors.FPD.InvalidMessageID } else { globals.Logger.Critical(err.Error()) @@ -38,7 +37,15 @@ func AcceptFriendRequest(err error, client *nex.Client, callID uint32, id uint64 senderFriendInfo.NNAInfo = senderConnectedUser.NNAInfo senderFriendInfo.Presence = senderConnectedUser.PresenceV2 - senderFriendInfo.Status = database_wiiu.GetUserComment(senderPID) + status, err := database_wiiu.GetUserComment(senderPID) + if err != nil { + globals.Logger.Critical(err.Error()) + senderFriendInfo.Status = friends_wiiu_types.NewComment() + senderFriendInfo.Status.LastChanged = nex.NewDateTime(0) + } else { + senderFriendInfo.Status = status + } + senderFriendInfo.BecameFriend = friendInfo.BecameFriend senderFriendInfo.LastOnline = friendInfo.LastOnline // TODO: Change this senderFriendInfo.Unknown = 0 diff --git a/nex/friends-wiiu/add_blacklist.go b/nex/friends-wiiu/add_blacklist.go index 1a850f8..ff03017 100644 --- a/nex/friends-wiiu/add_blacklist.go +++ b/nex/friends-wiiu/add_blacklist.go @@ -3,6 +3,9 @@ package nex_friends_wiiu import ( "time" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + database_wiiu "github.com/PretendoNetwork/friends/database/wiiu" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -25,10 +28,20 @@ func AddBlacklist(err error, client *nex.Client, callID uint32, blacklistPrincip date := nex.NewDateTime(0) date.FromTimestamp(time.Now()) - userInfo := database_wiiu.GetUserInfoByPID(currentBlacklistPrincipal.PrincipalBasicInfo.PID) + userData, err := globals.GetUserData(currentBlacklistPrincipal.PrincipalBasicInfo.PID) + if err != nil { + if status.Code(err) == codes.InvalidArgument { + return nex.Errors.FPD.InvalidPrincipalID // TODO: Not sure if this is the correct error. + } else { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } + } - if userInfo.PID == 0 { - return nex.Errors.FPD.InvalidPrincipalID // TODO: Not sure if this is the correct error. + userInfo, err := database_wiiu.GetUserInfoByPNIDData(userData) + if err != nil { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown } currentBlacklistPrincipal.PrincipalBasicInfo = userInfo diff --git a/nex/friends-wiiu/add_friend_request.go b/nex/friends-wiiu/add_friend_request.go index d7f7ec2..6a19742 100644 --- a/nex/friends-wiiu/add_friend_request.go +++ b/nex/friends-wiiu/add_friend_request.go @@ -3,6 +3,9 @@ package nex_friends_wiiu import ( "time" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + database_wiiu "github.com/PretendoNetwork/friends/database/wiiu" "github.com/PretendoNetwork/friends/globals" notifications_wiiu "github.com/PretendoNetwork/friends/notifications/wiiu" @@ -20,10 +23,33 @@ func AddFriendRequest(err error, client *nex.Client, callID uint32, pid uint32, senderPID := client.PID() recipientPID := pid - recipient := database_wiiu.GetUserInfoByPID(recipientPID) - if recipient.PID == 0 { - globals.Logger.Errorf("User %d has sent friend request to invalid PID %d", senderPID, pid) - return nex.Errors.FPD.InvalidPrincipalID + senderUserData, err := globals.GetUserData(senderPID) + if err != nil { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } + + senderPrincipalInfo, err := database_wiiu.GetUserInfoByPNIDData(senderUserData) + if err != nil { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } + + recipientUserData, err := globals.GetUserData(recipientPID) + if err != nil { + if status.Code(err) == codes.InvalidArgument { + globals.Logger.Errorf("User %d has sent friend request to invalid PID %d", senderPID, pid) + return nex.Errors.FPD.InvalidPrincipalID // TODO: Not sure if this is the correct error. + } else { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } + } + + recipientPrincipalInfo, err := database_wiiu.GetUserInfoByPNIDData(recipientUserData) + if err != nil { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown } currentTimestamp := time.Now() @@ -43,7 +69,7 @@ func AddFriendRequest(err error, client *nex.Client, callID uint32, pid uint32, friendRequest := friends_wiiu_types.NewFriendRequest() - friendRequest.PrincipalInfo = database_wiiu.GetUserInfoByPID(recipientPID) + friendRequest.PrincipalInfo = recipientPrincipalInfo friendRequest.Message = friends_wiiu_types.NewFriendRequestMessage() friendRequest.Message.FriendRequestID = friendRequestID @@ -106,7 +132,7 @@ func AddFriendRequest(err error, client *nex.Client, callID uint32, pid uint32, friendRequestNotificationData := friends_wiiu_types.NewFriendRequest() - friendRequestNotificationData.PrincipalInfo = database_wiiu.GetUserInfoByPID(senderPID) + friendRequestNotificationData.PrincipalInfo = senderPrincipalInfo friendRequestNotificationData.Message = friends_wiiu_types.NewFriendRequestMessage() friendRequestNotificationData.Message.FriendRequestID = friendRequestID diff --git a/nex/friends-wiiu/cancel_friend_request.go b/nex/friends-wiiu/cancel_friend_request.go index 99f4f9c..1f011f6 100644 --- a/nex/friends-wiiu/cancel_friend_request.go +++ b/nex/friends-wiiu/cancel_friend_request.go @@ -1,8 +1,7 @@ package nex_friends_wiiu import ( - "database/sql" - + "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" @@ -18,7 +17,7 @@ func CancelFriendRequest(err error, client *nex.Client, callID uint32, id uint64 pid, err := database_wiiu.DeleteFriendRequestAndReturnFriendPID(id) if err != nil { - if err == sql.ErrNoRows { + if err == database.ErrFriendRequestNotFound { return nex.Errors.FPD.InvalidMessageID } else { globals.Logger.Critical(err.Error()) diff --git a/nex/friends-wiiu/delete_friend_request.go b/nex/friends-wiiu/delete_friend_request.go index 5ee5ce7..c60aa87 100644 --- a/nex/friends-wiiu/delete_friend_request.go +++ b/nex/friends-wiiu/delete_friend_request.go @@ -1,6 +1,7 @@ package nex_friends_wiiu import ( + "github.com/PretendoNetwork/friends/database" database_wiiu "github.com/PretendoNetwork/friends/database/wiiu" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -15,8 +16,12 @@ func DeleteFriendRequest(err error, client *nex.Client, callID uint32, id uint64 err = database_wiiu.SetFriendRequestDenied(id) if err != nil { - globals.Logger.Critical(err.Error()) - return nex.Errors.FPD.Unknown + if err == database.ErrFriendRequestNotFound { + return nex.Errors.FPD.InvalidMessageID + } else { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } } rmcResponse := nex.NewRMCResponse(friends_wiiu.ProtocolID, callID) diff --git a/nex/friends-wiiu/deny_friend_request.go b/nex/friends-wiiu/deny_friend_request.go index b40bbb5..8a0d5f7 100644 --- a/nex/friends-wiiu/deny_friend_request.go +++ b/nex/friends-wiiu/deny_friend_request.go @@ -3,6 +3,7 @@ package nex_friends_wiiu import ( "time" + "github.com/PretendoNetwork/friends/database" database_wiiu "github.com/PretendoNetwork/friends/database/wiiu" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -22,14 +23,33 @@ func DenyFriendRequest(err error, client *nex.Client, callID uint32, id uint64) return nex.Errors.FPD.Unknown } - senderPID, _ := database_wiiu.GetPIDsByFriendRequestID(id) + senderPID, _, err := database_wiiu.GetPIDsByFriendRequestID(id) + if err != nil { + if err == database.ErrFriendRequestNotFound { + return nex.Errors.FPD.InvalidMessageID + } else { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } + } + err = database_wiiu.SetUserBlocked(client.PID(), senderPID, 0, 0) if err != nil { globals.Logger.Critical(err.Error()) return nex.Errors.FPD.Unknown } - info := database_wiiu.GetUserInfoByPID(senderPID) + userData, err := globals.GetUserData(senderPID) + if err != nil { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } + + info, err := database_wiiu.GetUserInfoByPNIDData(userData) + if err != nil { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } date := nex.NewDateTime(0) date.FromTimestamp(time.Now()) diff --git a/nex/friends-wiiu/get_basic_info.go b/nex/friends-wiiu/get_basic_info.go index b1b805d..021d690 100644 --- a/nex/friends-wiiu/get_basic_info.go +++ b/nex/friends-wiiu/get_basic_info.go @@ -18,7 +18,18 @@ func GetBasicInfo(err error, client *nex.Client, callID uint32, pids []uint32) u for i := 0; i < len(pids); i++ { pid := pids[i] - info := database_wiiu.GetUserInfoByPID(pid) + + userData, err := globals.GetUserData(pid) + if err != nil { + globals.Logger.Critical(err.Error()) + continue + } + + info, err := database_wiiu.GetUserInfoByPNIDData(userData) + if err != nil { + globals.Logger.Critical(err.Error()) + continue + } if info.PID != 0 { infos = append(infos, info) diff --git a/nex/friends-wiiu/get_request_block_settings.go b/nex/friends-wiiu/get_request_block_settings.go index ba8008b..381c255 100644 --- a/nex/friends-wiiu/get_request_block_settings.go +++ b/nex/friends-wiiu/get_request_block_settings.go @@ -23,7 +23,13 @@ func GetRequestBlockSettings(err error, client *nex.Client, callID uint32, pids setting := friends_wiiu_types.NewPrincipalRequestBlockSetting() setting.PID = requestedPID - setting.IsBlocked = database_wiiu.IsFriendRequestBlocked(client.PID(), requestedPID) + isBlocked, err := database_wiiu.IsFriendRequestBlocked(client.PID(), requestedPID) + if err != nil { + globals.Logger.Critical(err.Error()) + continue + } + + setting.IsBlocked = isBlocked settings = append(settings, setting) } diff --git a/nex/friends-wiiu/remove_blacklist.go b/nex/friends-wiiu/remove_blacklist.go index 1b99acf..711ecdc 100644 --- a/nex/friends-wiiu/remove_blacklist.go +++ b/nex/friends-wiiu/remove_blacklist.go @@ -1,6 +1,7 @@ package nex_friends_wiiu import ( + "github.com/PretendoNetwork/friends/database" database_wiiu "github.com/PretendoNetwork/friends/database/wiiu" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -15,8 +16,12 @@ func RemoveBlacklist(err error, client *nex.Client, callID uint32, blockedPID ui err = database_wiiu.UnsetUserBlocked(client.PID(), blockedPID) if err != nil { - globals.Logger.Critical(err.Error()) - return nex.Errors.FPD.Unknown + if err == database.ErrPIDNotFound { + return nex.Errors.FPD.NotInMyBlacklist + } else { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } } rmcResponse := nex.NewRMCResponse(friends_wiiu.ProtocolID, callID) diff --git a/nex/friends-wiiu/remove_friend.go b/nex/friends-wiiu/remove_friend.go index f385010..c7ebbf0 100644 --- a/nex/friends-wiiu/remove_friend.go +++ b/nex/friends-wiiu/remove_friend.go @@ -1,6 +1,7 @@ package nex_friends_wiiu import ( + "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" @@ -16,8 +17,12 @@ func RemoveFriend(err error, client *nex.Client, callID uint32, pid uint32) uint err = database_wiiu.RemoveFriendship(client.PID(), pid) if err != nil { - globals.Logger.Critical(err.Error()) - return nex.Errors.FPD.Unknown + if err == database.ErrFriendshipNotFound { + return nex.Errors.FPD.NotInMyFriendList + } else { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } } connectedUser := globals.ConnectedUsers[pid] diff --git a/nex/friends-wiiu/update_and_get_all_information.go b/nex/friends-wiiu/update_and_get_all_information.go index 9c2eaeb..5ac428d 100644 --- a/nex/friends-wiiu/update_and_get_all_information.go +++ b/nex/friends-wiiu/update_and_get_all_information.go @@ -3,6 +3,7 @@ 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" @@ -18,13 +19,6 @@ func UpdateAndGetAllInformation(err error, client *nex.Client, callID uint32, nn return nex.Errors.FPD.InvalidArgument } - // Update user information - - presence.Online = true // Force online status. I have no idea why this is always false - presence.PID = client.PID() // WHY IS THIS SET TO 0 BY DEFAULT?? - - notifications_wiiu.SendPresenceUpdate(presence) - // Get user information pid := client.PID() @@ -41,14 +35,59 @@ func UpdateAndGetAllInformation(err error, client *nex.Client, callID uint32, nn globals.ConnectedUsers[pid].NNAInfo = nnaInfo globals.ConnectedUsers[pid].PresenceV2 = presence - principalPreference := database_wiiu.GetUserPrincipalPreference(pid) - comment := database_wiiu.GetUserComment(pid) - friendList := database_wiiu.GetUserFriendList(pid) - friendRequestsOut := database_wiiu.GetUserFriendRequestsOut(pid) - friendRequestsIn := database_wiiu.GetUserFriendRequestsIn(pid) - blockList := database_wiiu.GetUserBlockList(pid) + principalPreference, err := database_wiiu.GetUserPrincipalPreference(pid) + if err != nil { + if err == database.ErrPIDNotFound { + return nex.Errors.FPD.InvalidPrincipalID + } else { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } + } + + comment, err := database_wiiu.GetUserComment(pid) + if err != nil { + if err == database.ErrPIDNotFound { + return nex.Errors.FPD.InvalidPrincipalID + } else { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } + } + + friendList, err := database_wiiu.GetUserFriendList(pid) + if err != nil && err != database.ErrEmptyList { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } + + friendRequestsOut, err := database_wiiu.GetUserFriendRequestsOut(pid) + if err != nil && err != database.ErrEmptyList { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } + + friendRequestsIn, err := database_wiiu.GetUserFriendRequestsIn(pid) + if err != nil && err != database.ErrEmptyList { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } + + blockList, err := database_wiiu.GetUserBlockList(pid) + if err != nil && err != database.ErrBlacklistNotFound { + globals.Logger.Critical(err.Error()) + return nex.Errors.FPD.Unknown + } + notifications := database_wiiu.GetUserNotifications(pid) + // Update user information + + presence.Online = true // Force online status. I have no idea why this is always false + presence.PID = 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() diff --git a/nex/secure-connection/register_ex.go b/nex/secure-connection/register_ex.go index 4a61320..1d446af 100644 --- a/nex/secure-connection/register_ex.go +++ b/nex/secure-connection/register_ex.go @@ -18,6 +18,9 @@ func RegisterEx(err error, client *nex.Client, callID uint32, stationUrls []*nex return nex.Errors.Core.InvalidArgument } + retval := nex.NewResultSuccess(nex.Errors.Core.Unknown) + rmcResponseStream := nex.NewStreamOut(globals.SecureServer) + // TODO: Validate loginData pid := client.PID() user := globals.ConnectedUsers[pid] @@ -36,25 +39,28 @@ func RegisterEx(err error, client *nex.Client, callID uint32, stationUrls []*nex database_3ds.UpdateUserLastOnlineTime(pid, lastOnline) default: globals.Logger.Errorf("Unknown loginData data type %s!", loginDataType) - return nex.Errors.Authentication.TokenParseError + retval = nex.NewResultError(nex.Errors.Authentication.ValidationFailed) } - localStation := stationUrls[0] + if retval.IsSuccess() { + localStation := stationUrls[0] - address := client.Address().IP.String() - port := strconv.Itoa(client.Address().Port) + address := client.Address().IP.String() + port := strconv.Itoa(client.Address().Port) - localStation.SetAddress(address) - localStation.SetPort(port) + localStation.SetAddress(address) + localStation.SetPort(port) - localStationURL := localStation.EncodeToString() + localStationURL := localStation.EncodeToString() - rmcResponseStream := nex.NewStreamOut(globals.SecureServer) - - retval := nex.NewResultSuccess(nex.Errors.Core.Unknown) - rmcResponseStream.WriteResult(retval) - rmcResponseStream.WriteUInt32LE(globals.SecureServer.ConnectionIDCounter().Increment()) - rmcResponseStream.WriteString(localStationURL) + rmcResponseStream.WriteResult(retval) + rmcResponseStream.WriteUInt32LE(globals.SecureServer.ConnectionIDCounter().Increment()) + rmcResponseStream.WriteString(localStationURL) + } else { + rmcResponseStream.WriteResult(retval) + rmcResponseStream.WriteUInt32LE(0) + rmcResponseStream.WriteString("prudp:/") + } rmcResponseBody := rmcResponseStream.Bytes() diff --git a/notifications/3ds/send_comment_update.go b/notifications/3ds/send_comment_update.go index e1e53f4..834d4b4 100644 --- a/notifications/3ds/send_comment_update.go +++ b/notifications/3ds/send_comment_update.go @@ -1,6 +1,8 @@ package notifications_3ds import ( + "database/sql" + database_3ds "github.com/PretendoNetwork/friends/database/3ds" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -30,7 +32,10 @@ func SendCommentUpdate(client *nex.Client, comment string) { rmcRequestBytes := rmcRequest.Bytes() - friendsList := database_3ds.GetUserFriends(client.PID()) + friendsList, err := database_3ds.GetUserFriends(client.PID()) + if err != nil && err != sql.ErrNoRows { + globals.Logger.Critical(err.Error()) + } for i := 0; i < len(friendsList); i++ { diff --git a/notifications/3ds/send_favorite_update.go b/notifications/3ds/send_favorite_update.go index 36cb3fb..fd9eef0 100644 --- a/notifications/3ds/send_favorite_update.go +++ b/notifications/3ds/send_favorite_update.go @@ -1,6 +1,8 @@ package notifications_3ds import ( + "database/sql" + database_3ds "github.com/PretendoNetwork/friends/database/3ds" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -28,7 +30,10 @@ func SendFavoriteUpdate(client *nex.Client, gameKey *friends_3ds_types.GameKey) rmcRequestBytes := rmcRequest.Bytes() - friendsList := database_3ds.GetUserFriends(client.PID()) + friendsList, err := database_3ds.GetUserFriends(client.PID()) + if err != nil && err != sql.ErrNoRows { + globals.Logger.Critical(err.Error()) + } for i := 0; i < len(friendsList); i++ { diff --git a/notifications/3ds/send_mii_notification.go b/notifications/3ds/send_mii_notification.go index 552590c..9a30df0 100644 --- a/notifications/3ds/send_mii_notification.go +++ b/notifications/3ds/send_mii_notification.go @@ -1,6 +1,8 @@ package notifications_3ds import ( + "database/sql" + database_3ds "github.com/PretendoNetwork/friends/database/3ds" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -29,7 +31,10 @@ func SendMiiUpdateNotification(client *nex.Client) { rmcRequestBytes := rmcRequest.Bytes() - friendsList := database_3ds.GetUserFriends(client.PID()) + friendsList, err := database_3ds.GetUserFriends(client.PID()) + if err != nil && err != sql.ErrNoRows { + globals.Logger.Critical(err.Error()) + } for i := 0; i < len(friendsList); i++ { diff --git a/notifications/3ds/send_presence_update.go b/notifications/3ds/send_presence_update.go index 41f35cb..2620606 100644 --- a/notifications/3ds/send_presence_update.go +++ b/notifications/3ds/send_presence_update.go @@ -1,6 +1,8 @@ package notifications_3ds import ( + "database/sql" + database_3ds "github.com/PretendoNetwork/friends/database/3ds" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -28,7 +30,10 @@ func SendPresenceUpdate(client *nex.Client, presence *friends_3ds_types.Nintendo rmcRequestBytes := rmcRequest.Bytes() - friendsList := database_3ds.GetUserFriends(client.PID()) + friendsList, err := database_3ds.GetUserFriends(client.PID()) + if err != nil && err != sql.ErrNoRows { + globals.Logger.Critical(err.Error()) + } for i := 0; i < len(friendsList); i++ { diff --git a/notifications/3ds/send_user_went_offline.go b/notifications/3ds/send_user_went_offline.go index c27490a..9e3982a 100644 --- a/notifications/3ds/send_user_went_offline.go +++ b/notifications/3ds/send_user_went_offline.go @@ -1,6 +1,8 @@ package notifications_3ds import ( + "database/sql" + database_3ds "github.com/PretendoNetwork/friends/database/3ds" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -9,7 +11,10 @@ import ( ) func SendUserWentOfflineGlobally(client *nex.Client) { - friendsList := database_3ds.GetUserFriends(client.PID()) + friendsList, err := database_3ds.GetUserFriends(client.PID()) + if err != nil && err != sql.ErrNoRows { + globals.Logger.Critical(err.Error()) + } for i := 0; i < len(friendsList); i++ { SendUserWentOffline(client, friendsList[i].PID) diff --git a/notifications/wiiu/send_presence_update.go b/notifications/wiiu/send_presence_update.go index f05705f..9eef5e2 100644 --- a/notifications/wiiu/send_presence_update.go +++ b/notifications/wiiu/send_presence_update.go @@ -3,6 +3,7 @@ package notifications_wiiu import ( "fmt" + "github.com/PretendoNetwork/friends/database" database_wiiu "github.com/PretendoNetwork/friends/database/wiiu" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -30,7 +31,10 @@ func SendPresenceUpdate(presence *friends_wiiu_types.NintendoPresenceV2) { rmcRequestBytes := rmcRequest.Bytes() - friendList := database_wiiu.GetUserFriendList(presence.PID) + friendList, err := database_wiiu.GetUserFriendList(presence.PID) + if err != nil && err != database.ErrEmptyList { + globals.Logger.Critical(err.Error()) + } for i := 0; i < len(friendList); i++ { if friendList[i] == nil || friendList[i].NNAInfo == nil || friendList[i].NNAInfo.PrincipalBasicInfo == nil { diff --git a/notifications/wiiu/send_user_went_offline.go b/notifications/wiiu/send_user_went_offline.go index 775b394..d82c16d 100644 --- a/notifications/wiiu/send_user_went_offline.go +++ b/notifications/wiiu/send_user_went_offline.go @@ -3,6 +3,7 @@ package notifications_wiiu import ( "time" + "github.com/PretendoNetwork/friends/database" database_wiiu "github.com/PretendoNetwork/friends/database/wiiu" "github.com/PretendoNetwork/friends/globals" nex "github.com/PretendoNetwork/nex-go" @@ -11,7 +12,10 @@ import ( ) func SendUserWentOfflineGlobally(client *nex.Client) { - friendsList := database_wiiu.GetUserFriendList(client.PID()) + friendsList, err := database_wiiu.GetUserFriendList(client.PID()) + if err != nil && err != database.ErrEmptyList { + globals.Logger.Critical(err.Error()) + } for i := 0; i < len(friendsList); i++ { SendUserWentOffline(client, friendsList[i].NNAInfo.PrincipalBasicInfo.PID)