| | 1 | | using Cysharp.Threading.Tasks; |
| | 2 | | using DCL; |
| | 3 | | using DCL.Social.Friends; |
| | 4 | | using Decentraland.Renderer.Common; |
| | 5 | | using Decentraland.Renderer.KernelServices; |
| | 6 | | using Decentraland.Renderer.RendererServices; |
| | 7 | | using RPC; |
| | 8 | | using rpc_csharp; |
| | 9 | | using System; |
| | 10 | | using System.Linq; |
| | 11 | | using System.Threading; |
| | 12 | | using RendererCancelFriendRequestPayload = Decentraland.Renderer.RendererServices.CancelFriendRequestPayload; |
| | 13 | | using RendererCancelFriendRequestReply = Decentraland.Renderer.RendererServices.CancelFriendRequestReply; |
| | 14 | | using KernelGetFriendRequestsPayload = Decentraland.Renderer.KernelServices.GetFriendRequestsPayload; |
| | 15 | | using KernelCancelFriendRequestReply = Decentraland.Renderer.KernelServices.CancelFriendRequestReply; |
| | 16 | | using KernelCancelFriendRequestPayload = Decentraland.Renderer.KernelServices.CancelFriendRequestPayload; |
| | 17 | | using RendererRejectFriendRequestPayload = Decentraland.Renderer.RendererServices.RejectFriendRequestPayload; |
| | 18 | | using RendererRejectFriendRequestReply = Decentraland.Renderer.RendererServices.RejectFriendRequestReply; |
| | 19 | |
|
| | 20 | | namespace DCl.Social.Friends |
| | 21 | | { |
| | 22 | | public class RPCFriendsApiBridge : IFriendsApiBridge, IFriendRequestRendererService<RPCContext> |
| | 23 | | { |
| | 24 | | private static RPCFriendsApiBridge i; |
| | 25 | |
|
| | 26 | | private readonly IRPC rpc; |
| | 27 | | private readonly IFriendsApiBridge fallbackApiBridge; |
| | 28 | |
|
| | 29 | | public event Action<FriendshipInitializationMessage> OnInitialized |
| | 30 | | { |
| 0 | 31 | | add => fallbackApiBridge.OnInitialized += value; |
| 0 | 32 | | remove => fallbackApiBridge.OnInitialized -= value; |
| | 33 | | } |
| | 34 | |
|
| | 35 | | public event Action<string> OnFriendNotFound |
| | 36 | | { |
| 0 | 37 | | add => fallbackApiBridge.OnFriendNotFound += value; |
| 0 | 38 | | remove => fallbackApiBridge.OnFriendNotFound -= value; |
| | 39 | | } |
| | 40 | |
|
| | 41 | | public event Action<AddFriendsPayload> OnFriendsAdded |
| | 42 | | { |
| 0 | 43 | | add => fallbackApiBridge.OnFriendsAdded += value; |
| 0 | 44 | | remove => fallbackApiBridge.OnFriendsAdded -= value; |
| | 45 | | } |
| | 46 | |
|
| | 47 | | public event Action<AddFriendRequestsPayload> OnFriendRequestsAdded |
| | 48 | | { |
| 0 | 49 | | add => fallbackApiBridge.OnFriendRequestsAdded += value; |
| 0 | 50 | | remove => fallbackApiBridge.OnFriendRequestsAdded -= value; |
| | 51 | | } |
| | 52 | |
|
| | 53 | | public event Action<AddFriendsWithDirectMessagesPayload> OnFriendWithDirectMessagesAdded |
| | 54 | | { |
| 0 | 55 | | add => fallbackApiBridge.OnFriendWithDirectMessagesAdded += value; |
| 0 | 56 | | remove => fallbackApiBridge.OnFriendWithDirectMessagesAdded -= value; |
| | 57 | | } |
| | 58 | |
|
| | 59 | | public event Action<UserStatus> OnUserPresenceUpdated |
| | 60 | | { |
| 0 | 61 | | add => fallbackApiBridge.OnUserPresenceUpdated += value; |
| 0 | 62 | | remove => fallbackApiBridge.OnUserPresenceUpdated -= value; |
| | 63 | | } |
| | 64 | |
|
| | 65 | | public event Action<FriendshipUpdateStatusMessage> OnFriendshipStatusUpdated |
| | 66 | | { |
| 0 | 67 | | add => fallbackApiBridge.OnFriendshipStatusUpdated += value; |
| 0 | 68 | | remove => fallbackApiBridge.OnFriendshipStatusUpdated -= value; |
| | 69 | | } |
| | 70 | |
|
| | 71 | | public event Action<UpdateTotalFriendRequestsPayload> OnTotalFriendRequestCountUpdated |
| | 72 | | { |
| 0 | 73 | | add => fallbackApiBridge.OnTotalFriendRequestCountUpdated += value; |
| 0 | 74 | | remove => fallbackApiBridge.OnTotalFriendRequestCountUpdated -= value; |
| | 75 | | } |
| | 76 | |
|
| | 77 | | public event Action<UpdateTotalFriendsPayload> OnTotalFriendCountUpdated |
| | 78 | | { |
| 0 | 79 | | add => fallbackApiBridge.OnTotalFriendCountUpdated += value; |
| 0 | 80 | | remove => fallbackApiBridge.OnTotalFriendCountUpdated -= value; |
| | 81 | | } |
| | 82 | |
|
| | 83 | | public event Action<FriendRequestPayload> OnFriendRequestAdded; |
| | 84 | |
|
| | 85 | | public static RPCFriendsApiBridge CreateSharedInstance(IRPC rpc, IFriendsApiBridge fallbackApiBridge) |
| | 86 | | { |
| 0 | 87 | | i = new RPCFriendsApiBridge(rpc, fallbackApiBridge); |
| 0 | 88 | | return i; |
| | 89 | | } |
| | 90 | |
|
| | 91 | | public static void RegisterService(RpcServerPort<RPCContext> port) |
| | 92 | | { |
| 0 | 93 | | FriendRequestRendererServiceCodeGen.RegisterService(port, i); |
| 0 | 94 | | } |
| | 95 | |
|
| 0 | 96 | | public RPCFriendsApiBridge(IRPC rpc, IFriendsApiBridge fallbackApiBridge) |
| | 97 | | { |
| 0 | 98 | | this.rpc = rpc; |
| 0 | 99 | | this.fallbackApiBridge = fallbackApiBridge; |
| 0 | 100 | | } |
| | 101 | |
|
| | 102 | | public void RejectFriendship(string userId) => |
| 0 | 103 | | fallbackApiBridge.RejectFriendship(userId); |
| | 104 | |
|
| | 105 | | public void RemoveFriend(string userId) => |
| 0 | 106 | | fallbackApiBridge.RemoveFriend(userId); |
| | 107 | |
|
| | 108 | | public void GetFriends(int limit, int skip) => |
| 0 | 109 | | fallbackApiBridge.GetFriends(limit, skip); |
| | 110 | |
|
| | 111 | | public void GetFriends(string usernameOrId, int limit) => |
| 0 | 112 | | fallbackApiBridge.GetFriends(usernameOrId, limit); |
| | 113 | |
|
| | 114 | | public void GetFriendRequests(int sentLimit, int sentSkip, int receivedLimit, int receivedSkip) => |
| 0 | 115 | | fallbackApiBridge.GetFriendRequests(sentLimit, sentSkip, receivedLimit, receivedSkip); |
| | 116 | |
|
| | 117 | | public async UniTask<AddFriendRequestsV2Payload> GetFriendRequestsAsync(int sentLimit, int sentSkip, int receive |
| | 118 | | { |
| 0 | 119 | | GetFriendRequestsReply response = await rpc.FriendRequests() |
| | 120 | | .GetFriendRequests(new KernelGetFriendRequestsPayload |
| | 121 | | { |
| | 122 | | SentLimit = sentLimit, |
| | 123 | | SentSkip = sentSkip, |
| | 124 | | ReceivedLimit = receivedLimit, |
| | 125 | | ReceivedSkip = receivedSkip |
| | 126 | | }); |
| | 127 | |
|
| 0 | 128 | | return response.MessageCase == GetFriendRequestsReply.MessageOneofCase.Error |
| | 129 | | ? throw new FriendshipException(ToErrorCode(response.Error)) |
| | 130 | | : new AddFriendRequestsV2Payload |
| | 131 | | { |
| | 132 | | requestedTo = response.Reply.RequestedTo.Select(ToFriendRequestPayload).ToArray(), |
| | 133 | | requestedFrom = response.Reply.RequestedFrom.Select(ToFriendRequestPayload).ToArray(), |
| | 134 | | totalReceivedFriendRequests = response.Reply.TotalReceivedFriendRequests, |
| | 135 | | totalSentFriendRequests = response.Reply.TotalSentFriendRequests, |
| | 136 | | }; |
| 0 | 137 | | } |
| | 138 | |
|
| | 139 | | public void GetFriendsWithDirectMessages(string usernameOrId, int limit, int skip) => |
| 0 | 140 | | fallbackApiBridge.GetFriendsWithDirectMessages(usernameOrId, limit, skip); |
| | 141 | |
|
| | 142 | | public void RequestFriendship(string friendUserId) => |
| 0 | 143 | | fallbackApiBridge.RequestFriendship(friendUserId); |
| | 144 | |
|
| | 145 | | public async UniTask<RequestFriendshipConfirmationPayload> RequestFriendshipAsync(string userId, string messageB |
| | 146 | | { |
| 0 | 147 | | SendFriendRequestReply reply = await rpc.FriendRequests() |
| | 148 | | .SendFriendRequest(new SendFriendRequestPayload |
| | 149 | | { |
| | 150 | | MessageBody = messageBody, |
| | 151 | | UserId = userId, |
| | 152 | | }); |
| | 153 | |
|
| 0 | 154 | | return reply.MessageCase == SendFriendRequestReply.MessageOneofCase.Reply |
| | 155 | | ? new RequestFriendshipConfirmationPayload |
| | 156 | | { |
| | 157 | | friendRequest = ToFriendRequestPayload(reply.Reply.FriendRequest), |
| | 158 | | } |
| | 159 | | : throw new FriendshipException(ToErrorCode(reply.Error)); |
| 0 | 160 | | } |
| | 161 | |
|
| | 162 | | public async UniTask<CancelFriendshipConfirmationPayload> CancelRequestAsync(string friendRequestId) |
| | 163 | | { |
| 0 | 164 | | KernelCancelFriendRequestReply reply = await rpc.FriendRequests() |
| | 165 | | .CancelFriendRequest(new KernelCancelFriendRequestPayload |
| | 166 | | { |
| | 167 | | FriendRequestId = friendRequestId |
| | 168 | | }); |
| | 169 | |
|
| 0 | 170 | | return reply.MessageCase == KernelCancelFriendRequestReply.MessageOneofCase.Reply |
| | 171 | | ? new CancelFriendshipConfirmationPayload |
| | 172 | | { |
| | 173 | | friendRequest = ToFriendRequestPayload(reply.Reply.FriendRequest), |
| | 174 | | } |
| | 175 | | : throw new FriendshipException(ToErrorCode(reply.Error)); |
| 0 | 176 | | } |
| | 177 | |
|
| | 178 | | public UniTask CancelRequestByUserIdAsync(string userId) => |
| 0 | 179 | | fallbackApiBridge.CancelRequestByUserIdAsync(userId); |
| | 180 | |
|
| | 181 | | public void CancelRequestByUserId(string userId) => |
| 0 | 182 | | fallbackApiBridge.CancelRequestByUserId(userId); |
| | 183 | |
|
| | 184 | | public void CancelRequest(string userId) => |
| 0 | 185 | | fallbackApiBridge.CancelRequestAsync(userId); |
| | 186 | |
|
| | 187 | | public void AcceptFriendship(string userId) => |
| 0 | 188 | | fallbackApiBridge.AcceptFriendship(userId); |
| | 189 | |
|
| | 190 | | public UniTask<ApproveFriendRequestReply> ApproveFriendRequest(ApproveFriendRequestPayload request, RPCContext c |
| 0 | 191 | | throw new NotImplementedException("implemented on feat/receive-friend-requests branch"); |
| | 192 | |
|
| | 193 | | public UniTask<RendererRejectFriendRequestReply> RejectFriendRequest(RendererRejectFriendRequestPayload request, |
| 0 | 194 | | throw new NotImplementedException("implemented on feat/receive-friend-requests branch"); |
| | 195 | |
|
| | 196 | | public UniTask<RendererCancelFriendRequestReply> CancelFriendRequest(RendererCancelFriendRequestPayload request, |
| 0 | 197 | | throw new NotImplementedException("implemented on feat/receive-friend-requests branch"); |
| | 198 | |
|
| | 199 | | public UniTask<ReceiveFriendRequestReply> ReceiveFriendRequest(ReceiveFriendRequestPayload request, RPCContext c |
| 0 | 200 | | throw new NotImplementedException("implemented on feat/receive-friend-requests branch"); |
| | 201 | |
|
| | 202 | | private static FriendRequestPayload ToFriendRequestPayload(FriendRequestInfo request) => |
| 0 | 203 | | new FriendRequestPayload |
| | 204 | | { |
| | 205 | | from = request.From, |
| | 206 | | timestamp = (long)request.Timestamp, |
| | 207 | | to = request.To, |
| | 208 | | messageBody = request.MessageBody, |
| | 209 | | friendRequestId = request.FriendRequestId |
| | 210 | | }; |
| | 211 | |
|
| | 212 | | private FriendRequestErrorCodes ToErrorCode(FriendshipErrorCode code) |
| | 213 | | { |
| | 214 | | switch (code) |
| | 215 | | { |
| | 216 | | default: |
| | 217 | | case FriendshipErrorCode.FecUnknown: |
| 0 | 218 | | return FriendRequestErrorCodes.Unknown; |
| | 219 | | case FriendshipErrorCode.FecBlockedUser: |
| 0 | 220 | | return FriendRequestErrorCodes.BlockedUser; |
| | 221 | | case FriendshipErrorCode.FecInvalidRequest: |
| 0 | 222 | | return FriendRequestErrorCodes.InvalidRequest; |
| | 223 | | case FriendshipErrorCode.FecNonExistingUser: |
| 0 | 224 | | return FriendRequestErrorCodes.NonExistingUser; |
| | 225 | | case FriendshipErrorCode.FecNotEnoughTimePassed: |
| 0 | 226 | | return FriendRequestErrorCodes.NotEnoughTimePassed; |
| | 227 | | case FriendshipErrorCode.FecTooManyRequestsSent: |
| 0 | 228 | | return FriendRequestErrorCodes.TooManyRequestsSent; |
| | 229 | | } |
| | 230 | | } |
| | 231 | | } |
| | 232 | | } |