aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/FriendService.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/FriendService.cs')
-rw-r--r--src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/FriendService.cs1015
1 files changed, 1015 insertions, 0 deletions
diff --git a/src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/FriendService.cs b/src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/FriendService.cs
new file mode 100644
index 00000000..1b4c8c30
--- /dev/null
+++ b/src/Ryujinx.Horizon/Sdk/Friends/Detail/Ipc/FriendService.cs
@@ -0,0 +1,1015 @@
+using Ryujinx.Common.Logging;
+using Ryujinx.Horizon.Common;
+using Ryujinx.Horizon.Sdk.Account;
+using Ryujinx.Horizon.Sdk.OsTypes;
+using Ryujinx.Horizon.Sdk.Settings;
+using Ryujinx.Horizon.Sdk.Sf;
+using Ryujinx.Horizon.Sdk.Sf.Hipc;
+using System;
+using System.Runtime.InteropServices;
+using System.Text;
+
+namespace Ryujinx.Horizon.Sdk.Friends.Detail.Ipc
+{
+ partial class FriendService : IFriendService, IDisposable
+ {
+ private readonly IEmulatorAccountManager _accountManager;
+ private SystemEventType _completionEvent;
+
+ public FriendService(IEmulatorAccountManager accountManager, FriendsServicePermissionLevel permissionLevel)
+ {
+ _accountManager = accountManager;
+
+ Os.CreateSystemEvent(out _completionEvent, EventClearMode.ManualClear, interProcess: true).AbortOnFailure();
+ Os.SignalSystemEvent(ref _completionEvent); // TODO: Figure out where we are supposed to signal this.
+ }
+
+ [CmifCommand(0)]
+ public Result GetCompletionEvent([CopyHandle] out int completionEventHandle)
+ {
+ completionEventHandle = Os.GetReadableHandleOfSystemEvent(ref _completionEvent);
+
+ return Result.Success;
+ }
+
+ [CmifCommand(1)]
+ public Result Cancel()
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend);
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10100)]
+ public Result GetFriendListIds(
+ out int count,
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer)] Span<NetworkServiceAccountId> friendIds,
+ Uid userId,
+ int offset,
+ SizedFriendFilter filter,
+ ulong pidPlaceholder,
+ [ClientProcessId] ulong pid)
+ {
+ count = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, offset, filter, pidPlaceholder, pid });
+
+ if (userId.IsNull)
+ {
+ return FriendResult.InvalidArgument;
+ }
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10101)]
+ public Result GetFriendList(
+ out int count,
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<FriendImpl> friendList,
+ Uid userId,
+ int offset,
+ SizedFriendFilter filter,
+ ulong pidPlaceholder,
+ [ClientProcessId] ulong pid)
+ {
+ count = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, offset, filter, pidPlaceholder, pid });
+
+ if (userId.IsNull)
+ {
+ return FriendResult.InvalidArgument;
+ }
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10102)]
+ public Result UpdateFriendInfo(
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<FriendImpl> info,
+ Uid userId,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer)] ReadOnlySpan<NetworkServiceAccountId> friendIds,
+ ulong pidPlaceholder,
+ [ClientProcessId] ulong pid)
+ {
+ string friendIdList = string.Join(", ", friendIds.ToArray());
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendIdList, pidPlaceholder, pid });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10110)]
+ public Result GetFriendProfileImage(
+ out int size,
+ Uid userId,
+ NetworkServiceAccountId friendId,
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<byte> profileImage)
+ {
+ size = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10120)]
+ public Result CheckFriendListAvailability(out bool listAvailable, Uid userId)
+ {
+ listAvailable = true;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10121)]
+ public Result EnsureFriendListAvailable(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10200)]
+ public Result SendFriendRequestForApplication(
+ Uid userId,
+ NetworkServiceAccountId friendId,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0x48)] in InAppScreenName arg2,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0x48)] in InAppScreenName arg3,
+ ulong pidPlaceholder,
+ [ClientProcessId] ulong pid)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId, arg2, arg3, pidPlaceholder, pid });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10211)]
+ public Result AddFacedFriendRequestForApplication(
+ Uid userId,
+ FacedFriendRequestRegistrationKey key,
+ Nickname nickname,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.MapAlias)] ReadOnlySpan<byte> arg3,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0x48)] in InAppScreenName arg4,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0x48)] in InAppScreenName arg5,
+ ulong pidPlaceholder,
+ [ClientProcessId] ulong pid)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, key, nickname, arg4, arg5, pidPlaceholder, pid });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10400)]
+ public Result GetBlockedUserListIds(
+ out int count,
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer)] Span<NetworkServiceAccountId> blockedIds,
+ Uid userId,
+ int offset)
+ {
+ count = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, offset });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10420)]
+ public Result CheckBlockedUserListAvailability(out bool listAvailable, Uid userId)
+ {
+ listAvailable = true;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10421)]
+ public Result EnsureBlockedUserListAvailable(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10500)]
+ public Result GetProfileList(
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<ProfileImpl> profileList,
+ Uid userId,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer)] ReadOnlySpan<NetworkServiceAccountId> friendIds)
+ {
+ string friendIdList = string.Join(", ", friendIds.ToArray());
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendIdList });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10600)]
+ public Result DeclareOpenOnlinePlaySession(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ if (userId.IsNull)
+ {
+ return FriendResult.InvalidArgument;
+ }
+
+ _accountManager.OpenUserOnlinePlay(userId);
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10601)]
+ public Result DeclareCloseOnlinePlaySession(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ if (userId.IsNull)
+ {
+ return FriendResult.InvalidArgument;
+ }
+
+ _accountManager.CloseUserOnlinePlay(userId);
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10610)]
+ public Result UpdateUserPresence(
+ Uid userId,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0xE0)] in UserPresenceImpl userPresence,
+ ulong pidPlaceholder,
+ [ClientProcessId] ulong pid)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, userPresence, pidPlaceholder, pid });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10700)]
+ public Result GetPlayHistoryRegistrationKey(
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer, 0x40)] out PlayHistoryRegistrationKey registrationKey,
+ Uid userId,
+ bool arg2)
+ {
+ if (userId.IsNull)
+ {
+ registrationKey = default;
+
+ return FriendResult.InvalidArgument;
+ }
+
+ // NOTE: Calls nn::friends::detail::service::core::PlayHistoryManager::GetInstance and stores the instance.
+
+ // NOTE: Calls nn::friends::detail::service::core::UuidManager::GetInstance and stores the instance.
+ // Then calls nn::friends::detail::service::core::AccountStorageManager::GetInstance and stores the instance.
+ // Then it checks if an Uuid is already stored for the UserId, if not it generates a random Uuid,
+ // and stores it in the savedata 8000000000000080 in the friends:/uid.bin file.
+
+ /*
+
+ NOTE: The service uses the KeyIndex to get a random key from a keys buffer (since the key index is stored in the returned buffer).
+ We currently don't support play history and online services so we can use a blank key for now.
+ Code for reference:
+
+ byte[] hmacKey = new byte[0x20];
+
+ HMACSHA256 hmacSha256 = new HMACSHA256(hmacKey);
+ byte[] hmacHash = hmacSha256.ComputeHash(playHistoryRegistrationKeyBuffer);
+
+ */
+
+ Uid randomGuid = new();
+
+ Guid.NewGuid().TryWriteBytes(MemoryMarshal.AsBytes(MemoryMarshal.CreateSpan(ref randomGuid, 1)));
+
+ registrationKey = new()
+ {
+ Type = 0x101,
+ KeyIndex = (byte)(Random.Shared.Next() & 7),
+ UserIdBool = 0, // TODO: Find it.
+ UnknownBool = (byte)(arg2 ? 1 : 0), // TODO: Find it.
+ Reserved = new(),
+ Uuid = randomGuid,
+ HmacHash = new(),
+ };
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10701)]
+ public Result GetPlayHistoryRegistrationKeyWithNetworkServiceAccountId(
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer, 0x40)] out PlayHistoryRegistrationKey registrationKey,
+ NetworkServiceAccountId friendId,
+ bool arg2)
+ {
+ registrationKey = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { friendId, arg2 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(10702)]
+ public Result AddPlayHistory(
+ Uid userId,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0x40)] in PlayHistoryRegistrationKey registrationKey,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0x48)] in InAppScreenName arg2,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0x48)] in InAppScreenName arg3,
+ ulong pidPlaceholder,
+ [ClientProcessId] ulong pid)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, registrationKey, arg2, arg3, pidPlaceholder, pid });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(11000)]
+ public Result GetProfileImageUrl(out Url imageUrl, Url url, int arg2)
+ {
+ imageUrl = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { url, arg2 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20100)]
+ public Result GetFriendCount(out int count, Uid userId, SizedFriendFilter filter, ulong pidPlaceholder, [ClientProcessId] ulong pid)
+ {
+ count = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, filter, pidPlaceholder, pid });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20101)]
+ public Result GetNewlyFriendCount(out int count, Uid userId)
+ {
+ count = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20102)]
+ public Result GetFriendDetailedInfo(
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer, 0x800)] out FriendDetailedInfoImpl detailedInfo,
+ Uid userId,
+ NetworkServiceAccountId friendId)
+ {
+ detailedInfo = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20103)]
+ public Result SyncFriendList(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20104)]
+ public Result RequestSyncFriendList(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20110)]
+ public Result LoadFriendSetting(
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer, 0x40)] out FriendSettingImpl friendSetting,
+ Uid userId,
+ NetworkServiceAccountId friendId)
+ {
+ friendSetting = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20200)]
+ public Result GetReceivedFriendRequestCount(out int count, out int count2, Uid userId)
+ {
+ count = 0;
+ count2 = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20201)]
+ public Result GetFriendRequestList(
+ out int count,
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<FriendRequestImpl> requestList,
+ Uid userId,
+ int arg3,
+ int arg4)
+ {
+ count = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, arg3, arg4 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20300)]
+ public Result GetFriendCandidateList(
+ out int count,
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<FriendCandidateImpl> candidateList,
+ Uid userId,
+ int arg3)
+ {
+ count = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, arg3 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20301)]
+ public Result GetNintendoNetworkIdInfo(
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer, 0x38)] out NintendoNetworkIdUserInfo networkIdInfo,
+ out int arg1,
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<NintendoNetworkIdFriendImpl> friendInfo,
+ Uid userId,
+ int arg4)
+ {
+ networkIdInfo = default;
+ arg1 = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, arg4 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20302)]
+ public Result GetSnsAccountLinkage(out SnsAccountLinkage accountLinkage, Uid userId)
+ {
+ accountLinkage = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20303)]
+ public Result GetSnsAccountProfile(
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer, 0x380)] out SnsAccountProfile accountProfile,
+ Uid userId,
+ NetworkServiceAccountId friendId,
+ int arg3)
+ {
+ accountProfile = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId, arg3 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20304)]
+ public Result GetSnsAccountFriendList(
+ out int count,
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<SnsAccountFriendImpl> friendList,
+ Uid userId,
+ int arg3)
+ {
+ count = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, arg3 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20400)]
+ public Result GetBlockedUserList(
+ out int count,
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<BlockedUserImpl> blockedUsers,
+ Uid userId,
+ int arg3)
+ {
+ count = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, arg3 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20401)]
+ public Result SyncBlockedUserList(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20500)]
+ public Result GetProfileExtraList(
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<ProfileExtraImpl> extraList,
+ Uid userId,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer)] ReadOnlySpan<NetworkServiceAccountId> friendIds)
+ {
+ string friendIdList = string.Join(", ", friendIds.ToArray());
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendIdList });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20501)]
+ public Result GetRelationship(out Relationship relationship, Uid userId, NetworkServiceAccountId friendId)
+ {
+ relationship = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20600)]
+ public Result GetUserPresenceView([Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer, 0xE0)] out UserPresenceViewImpl userPresenceView, Uid userId)
+ {
+ userPresenceView = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20700)]
+ public Result GetPlayHistoryList(out int count, [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<PlayHistoryImpl> playHistoryList, Uid userId, int arg3)
+ {
+ count = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, arg3 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20701)]
+ public Result GetPlayHistoryStatistics(out PlayHistoryStatistics statistics, Uid userId)
+ {
+ statistics = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20800)]
+ public Result LoadUserSetting([Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer, 0x800)] out UserSettingImpl userSetting, Uid userId)
+ {
+ userSetting = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20801)]
+ public Result SyncUserSetting(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(20900)]
+ public Result RequestListSummaryOverlayNotification()
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend);
+
+ return Result.Success;
+ }
+
+ [CmifCommand(21000)]
+ public Result GetExternalApplicationCatalog(
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer, 0x4B8)] out ExternalApplicationCatalog catalog,
+ ExternalApplicationCatalogId catalogId,
+ LanguageCode language)
+ {
+ catalog = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { catalogId, language });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(22000)]
+ public Result GetReceivedFriendInvitationList(
+ out int count,
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<FriendInvitationForViewerImpl> invitationList,
+ Uid userId)
+ {
+ count = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(22001)]
+ public Result GetReceivedFriendInvitationDetailedInfo(
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias, 0x1400)] out FriendInvitationGroupImpl invicationGroup,
+ Uid userId,
+ FriendInvitationGroupId groupId)
+ {
+ invicationGroup = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, groupId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(22010)]
+ public Result GetReceivedFriendInvitationCountCache(out int count, Uid userId)
+ {
+ count = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30100)]
+ public Result DropFriendNewlyFlags(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30101)]
+ public Result DeleteFriend(Uid userId, NetworkServiceAccountId friendId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30110)]
+ public Result DropFriendNewlyFlag(Uid userId, NetworkServiceAccountId friendId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30120)]
+ public Result ChangeFriendFavoriteFlag(Uid userId, NetworkServiceAccountId friendId, bool favoriteFlag)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId, favoriteFlag });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30121)]
+ public Result ChangeFriendOnlineNotificationFlag(Uid userId, NetworkServiceAccountId friendId, bool onlineNotificationFlag)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId, onlineNotificationFlag });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30200)]
+ public Result SendFriendRequest(Uid userId, NetworkServiceAccountId friendId, int arg2)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId, arg2 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30201)]
+ public Result SendFriendRequestWithApplicationInfo(
+ Uid userId,
+ NetworkServiceAccountId friendId,
+ int arg2,
+ ApplicationInfo applicationInfo,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0x48)] in InAppScreenName arg4,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0x48)] in InAppScreenName arg5)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId, arg2, applicationInfo, arg4, arg5 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30202)]
+ public Result CancelFriendRequest(Uid userId, RequestId requestId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, requestId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30203)]
+ public Result AcceptFriendRequest(Uid userId, RequestId requestId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, requestId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30204)]
+ public Result RejectFriendRequest(Uid userId, RequestId requestId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, requestId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30205)]
+ public Result ReadFriendRequest(Uid userId, RequestId requestId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, requestId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30210)]
+ public Result GetFacedFriendRequestRegistrationKey(out FacedFriendRequestRegistrationKey registrationKey, Uid userId)
+ {
+ registrationKey = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30211)]
+ public Result AddFacedFriendRequest(
+ Uid userId,
+ FacedFriendRequestRegistrationKey registrationKey,
+ Nickname nickname,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.MapAlias)] ReadOnlySpan<byte> arg3)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, registrationKey, nickname });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30212)]
+ public Result CancelFacedFriendRequest(Uid userId, NetworkServiceAccountId friendId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30213)]
+ public Result GetFacedFriendRequestProfileImage(
+ out int size,
+ Uid userId,
+ NetworkServiceAccountId friendId,
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<byte> profileImage)
+ {
+ size = 0;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30214)]
+ public Result GetFacedFriendRequestProfileImageFromPath(
+ out int size,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer)] ReadOnlySpan<byte> path,
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias)] Span<byte> profileImage)
+ {
+ size = 0;
+
+ string pathString = Encoding.UTF8.GetString(path);
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { pathString });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30215)]
+ public Result SendFriendRequestWithExternalApplicationCatalogId(
+ Uid userId,
+ NetworkServiceAccountId friendId,
+ int arg2,
+ ExternalApplicationCatalogId catalogId,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0x48)] in InAppScreenName arg4,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0x48)] in InAppScreenName arg5)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId, arg2, catalogId, arg4, arg5 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30216)]
+ public Result ResendFacedFriendRequest(Uid userId, NetworkServiceAccountId friendId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30217)]
+ public Result SendFriendRequestWithNintendoNetworkIdInfo(
+ Uid userId,
+ NetworkServiceAccountId friendId,
+ int arg2,
+ MiiName arg3,
+ MiiImageUrlParam arg4,
+ MiiName arg5,
+ MiiImageUrlParam arg6)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId, arg2, arg3, arg4, arg5, arg6 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30300)]
+ public Result GetSnsAccountLinkPageUrl([Buffer(HipcBufferFlags.Out | HipcBufferFlags.MapAlias, 0x1000)] out WebPageUrl url, Uid userId, int arg2)
+ {
+ url = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, arg2 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30301)]
+ public Result UnlinkSnsAccount(Uid userId, int arg1)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, arg1 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30400)]
+ public Result BlockUser(Uid userId, NetworkServiceAccountId friendId, int arg2)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId, arg2 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30401)]
+ public Result BlockUserWithApplicationInfo(
+ Uid userId,
+ NetworkServiceAccountId friendId,
+ int arg2,
+ ApplicationInfo applicationInfo,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer, 0x48)] in InAppScreenName arg4)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId, arg2, applicationInfo, arg4 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30402)]
+ public Result UnblockUser(Uid userId, NetworkServiceAccountId friendId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30500)]
+ public Result GetProfileExtraFromFriendCode(
+ [Buffer(HipcBufferFlags.Out | HipcBufferFlags.Pointer, 0x400)] out ProfileExtraImpl profileExtra,
+ Uid userId,
+ FriendCode friendCode)
+ {
+ profileExtra = default;
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendCode });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30700)]
+ public Result DeletePlayHistory(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30810)]
+ public Result ChangePresencePermission(Uid userId, int permission)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, permission });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30811)]
+ public Result ChangeFriendRequestReception(Uid userId, bool reception)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, reception });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30812)]
+ public Result ChangePlayLogPermission(Uid userId, int permission)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, permission });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30820)]
+ public Result IssueFriendCode(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30830)]
+ public Result ClearPlayLog(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30900)]
+ public Result SendFriendInvitation(
+ Uid userId,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer)] ReadOnlySpan<NetworkServiceAccountId> friendIds,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.MapAlias, 0xC00)] in FriendInvitationGameModeDescription description,
+ ApplicationInfo applicationInfo,
+ [Buffer(HipcBufferFlags.In | HipcBufferFlags.MapAlias)] ReadOnlySpan<byte> arg4,
+ bool arg5)
+ {
+ string friendIdList = string.Join(", ", friendIds.ToArray());
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, friendIdList, description, applicationInfo, arg5 });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30910)]
+ public Result ReadFriendInvitation(Uid userId, [Buffer(HipcBufferFlags.In | HipcBufferFlags.Pointer)] ReadOnlySpan<FriendInvitationId> invitationIds)
+ {
+ string invitationIdList = string.Join(", ", invitationIds.ToArray());
+
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId, invitationIdList });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(30911)]
+ public Result ReadAllFriendInvitations(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(40100)]
+ public Result DeleteFriendListCache(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(40400)]
+ public Result DeleteBlockedUserListCache(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ [CmifCommand(49900)]
+ public Result DeleteNetworkServiceAccountCache(Uid userId)
+ {
+ Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { userId });
+
+ return Result.Success;
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (disposing)
+ {
+ Os.DestroySystemEvent(ref _completionEvent);
+ }
+ }
+
+ public void Dispose()
+ {
+ Dispose(disposing: true);
+ GC.SuppressFinalize(this);
+ }
+ }
+}