< Summary

Class:DCL.Social.Friends.FriendsController
Assembly:FriendsController
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/FriendsController/FriendsController.cs
Covered lines:96
Uncovered lines:55
Coverable lines:151
Total lines:358
Line coverage:63.5% (96 of 151)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
FriendsController(...)0%110100%
CreateSharedInstance(...)0%110100%
Initialize(...)0%4.054085.71%
GetUserStatus(...)0%6200%
ContainsStatus(...)0%6200%
RequestFriendshipAsync()0%12300%
RequestFriendship(...)0%2100%
GetAllocatedFriends()0%2100%
RejectFriendship(...)0%2100%
IsFriend(...)0%220100%
RemoveFriend(...)0%2100%
GetFriends(...)0%2100%
GetFriends(...)0%2100%
GetFriendRequests(...)0%2100%
GetFriendRequestsAsync()0%6.026091.3%
GetFriendsWithDirectMessages(...)0%2100%
GetFriendsWithDirectMessages(...)0%2100%
GetAllocatedFriendRequest(...)0%6200%
GetAllocatedFriendRequestByUser(...)0%2100%
CancelRequestByUserIdAsync()0%42600%
CancelRequestByUserId(...)0%2100%
CancelRequestAsync()0%12300%
AcceptFriendship(...)0%2100%
FriendNotFound(...)0%6200%
AddFriends(...)0%220100%
AddFriendsWithDirectMessages(...)0%330100%
UpdateUserPresence(...)0%2.032080%
UpdateTotalFriendRequests(...)0%220100%
UpdateTotalFriends(...)0%220100%
UpdateUserStatus(...)0%5.585071.43%
UpdateFriendshipStatus(...)0%7.187084.62%
ItsAnOutdatedUpdate(...)0%220100%
ToFriendshipStatus(...)0%880100%
AddFriends(...)0%330100%
ToFriendRequest(...)0%110100%
AddFriendRequests(...)0%20400%
AddFriendRequest(...)0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/FriendsController/FriendsController.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCl.Social.Friends;
 3using System;
 4using System.Collections.Generic;
 5using System.Linq;
 6
 7namespace DCL.Social.Friends
 8{
 9    public class FriendsController : IFriendsController
 10    {
 14611        public static FriendsController i { get; private set; }
 12
 13        private readonly IFriendsApiBridge apiBridge;
 4714        private readonly Dictionary<string, FriendRequest> friendRequests = new ();
 15
 16        public event Action<int> OnTotalFriendsUpdated;
 017        public int AllocatedFriendCount => friends.Count(f => f.Value.friendshipStatus == FriendshipStatus.FRIEND);
 618        public bool IsInitialized { get; private set; }
 19
 120        public int ReceivedRequestCount => friends.Values.Count(status => status.friendshipStatus == FriendshipStatus.RE
 21
 722        public int TotalFriendCount { get; private set; }
 123        public int TotalFriendRequestCount => TotalReceivedFriendRequestCount + TotalSentFriendRequestCount;
 4124        public int TotalReceivedFriendRequestCount { get; private set; }
 625        public int TotalSentFriendRequestCount { get; private set; }
 126        public int TotalFriendsWithDirectMessagesCount { get; private set; }
 27
 4728        public readonly Dictionary<string, UserStatus> friends = new Dictionary<string, UserStatus>();
 29
 30        public event Action<string, UserStatus> OnUpdateUserStatus;
 31        public event Action<string, FriendshipAction> OnUpdateFriendship;
 32        public event Action<string> OnFriendNotFound;
 33        public event Action OnInitialized;
 34        public event Action<List<FriendWithDirectMessages>> OnAddFriendsWithDirectMessages;
 35        public event Action<int, int> OnTotalFriendRequestUpdated;
 36        public event Action<FriendRequest> OnAddFriendRequest;
 37
 38        public static void CreateSharedInstance(IFriendsApiBridge apiBridge)
 39        {
 3340            i = new FriendsController(apiBridge);
 3341        }
 42
 4743        public FriendsController(IFriendsApiBridge apiBridge)
 44        {
 4745            this.apiBridge = apiBridge;
 4746            apiBridge.OnInitialized += Initialize;
 4747            apiBridge.OnFriendNotFound += FriendNotFound;
 4748            apiBridge.OnFriendsAdded += AddFriends;
 4749            apiBridge.OnFriendWithDirectMessagesAdded += AddFriendsWithDirectMessages;
 4750            apiBridge.OnUserPresenceUpdated += UpdateUserPresence;
 4751            apiBridge.OnFriendshipStatusUpdated += UpdateFriendshipStatus;
 4752            apiBridge.OnTotalFriendRequestCountUpdated += UpdateTotalFriendRequests;
 4753            apiBridge.OnTotalFriendCountUpdated += UpdateTotalFriends;
 4754            apiBridge.OnFriendRequestsAdded += AddFriendRequests; // TODO (NEW FRIEND REQUESTS): remove when we don't ne
 4755            apiBridge.OnFriendRequestAdded += AddFriendRequest;
 4756        }
 57
 58        private void Initialize(FriendshipInitializationMessage msg)
 59        {
 160            if (IsInitialized) return;
 61
 162            IsInitialized = true;
 63
 164            TotalReceivedFriendRequestCount = msg.totalReceivedRequests;
 165            OnTotalFriendRequestUpdated?.Invoke(TotalReceivedFriendRequestCount, TotalSentFriendRequestCount);
 166            OnInitialized?.Invoke();
 167        }
 68
 69        public UserStatus GetUserStatus(string userId)
 70        {
 071            if (!friends.ContainsKey(userId))
 072                return new UserStatus { userId = userId, friendshipStatus = FriendshipStatus.NOT_FRIEND };
 73
 074            return friends[userId];
 75        }
 76
 77        public bool ContainsStatus(string friendId, FriendshipStatus status)
 78        {
 079            if (!friends.ContainsKey(friendId)) return false;
 080            return friends[friendId].friendshipStatus == status;
 81        }
 82
 83        public async UniTask<FriendRequest> RequestFriendshipAsync(string friendUserId, string messageBody)
 84        {
 085            var payload = await apiBridge.RequestFriendshipAsync(friendUserId, messageBody);
 086            var friendRequestPayload = payload.friendRequest;
 87
 088            var friendRequest = new FriendRequest(friendRequestPayload.friendRequestId,
 89                friendRequestPayload.timestamp,
 90                friendRequestPayload.from,
 91                friendRequestPayload.to,
 92                friendRequestPayload.messageBody);
 93
 094            friendRequests[friendRequest.FriendRequestId] = friendRequest;
 95
 096            return friendRequest;
 097        }
 98
 99        public void RequestFriendship(string friendUserId)
 100        {
 0101            apiBridge.RequestFriendship(friendUserId);
 0102        }
 103
 104        public Dictionary<string, UserStatus> GetAllocatedFriends()
 105        {
 0106            return new Dictionary<string, UserStatus>(friends);
 107        }
 108
 109        public void RejectFriendship(string friendUserId) =>
 0110            apiBridge.RejectFriendship(friendUserId);
 111
 112        public bool IsFriend(string userId) =>
 1113            friends.ContainsKey(userId) && friends[userId].friendshipStatus == FriendshipStatus.FRIEND;
 114
 115        public void RemoveFriend(string friendId) =>
 0116            apiBridge.RemoveFriend(friendId);
 117
 118        public void GetFriends(int limit, int skip) =>
 0119            apiBridge.GetFriends(limit, skip);
 120
 121        public void GetFriends(string usernameOrId, int limit) =>
 0122            apiBridge.GetFriends(usernameOrId, limit);
 123
 124        // TODO (NEW FRIEND REQUESTS): remove when we don't need to keep the retro-compatibility with the old version
 125        public void GetFriendRequests(int sentLimit, int sentSkip, int receivedLimit, int receivedSkip) =>
 0126            apiBridge.GetFriendRequests(sentLimit, sentSkip, receivedLimit, receivedSkip);
 127
 128        public async UniTask<List<FriendRequest>> GetFriendRequestsAsync(int sentLimit, int sentSkip, int receivedLimit,
 129        {
 1130            var payload = await apiBridge.GetFriendRequestsAsync(sentLimit, sentSkip, receivedLimit, receivedSkip);
 131
 1132            TotalReceivedFriendRequestCount = payload.totalReceivedFriendRequests;
 1133            TotalSentFriendRequestCount = payload.totalSentFriendRequests;
 1134            OnTotalFriendRequestUpdated?.Invoke(TotalReceivedFriendRequestCount, TotalSentFriendRequestCount);
 135
 1136            List<FriendRequest> receivedFriendRequestsToAdd = new List<FriendRequest>();
 137
 8138            foreach (var friendRequest in payload.requestedFrom)
 139            {
 3140                var request = ToFriendRequest(friendRequest);
 3141                friendRequests[request.FriendRequestId] = request;
 3142                receivedFriendRequestsToAdd.Add(request);
 143
 3144                UpdateFriendshipStatus(new FriendshipUpdateStatusMessage
 145                    { action = FriendshipAction.REQUESTED_FROM, userId = friendRequest.from });
 146            }
 147
 6148            foreach (var friendRequest in payload.requestedTo)
 149            {
 2150                var request = ToFriendRequest(friendRequest);
 2151                friendRequests[request.FriendRequestId] = request;
 2152                receivedFriendRequestsToAdd.Add(request);
 153
 2154                UpdateFriendshipStatus(new FriendshipUpdateStatusMessage
 155                    { action = FriendshipAction.REQUESTED_TO, userId = friendRequest.to });
 156            }
 157
 1158            return receivedFriendRequestsToAdd;
 1159        }
 160
 161        public void GetFriendsWithDirectMessages(int limit, int skip) =>
 0162            apiBridge.GetFriendsWithDirectMessages("", limit, skip);
 163
 164        public void GetFriendsWithDirectMessages(string userNameOrId, int limit) =>
 0165            apiBridge.GetFriendsWithDirectMessages(userNameOrId, limit, 0);
 166
 167        public FriendRequest GetAllocatedFriendRequest(string friendRequestId) =>
 0168            friendRequests.ContainsKey(friendRequestId) ? friendRequests[friendRequestId] : null;
 169
 170        public FriendRequest GetAllocatedFriendRequestByUser(string userId) =>
 0171            friendRequests.Values.FirstOrDefault(request => request.From == userId || request.To == userId);
 172
 173        public async UniTask<FriendRequest> CancelRequestByUserIdAsync(string friendUserId)
 174        {
 0175            FriendRequest request = GetAllocatedFriendRequestByUser(friendUserId);
 176
 0177            if (request != null)
 178            {
 0179                await apiBridge.CancelRequestAsync(request.FriendRequestId);
 0180                friendRequests.Remove(request.FriendRequestId);
 0181                return request;
 182            }
 183
 0184            await apiBridge.CancelRequestByUserIdAsync(friendUserId);
 185
 0186            return new FriendRequest("", 0, "", friendUserId, "");
 0187        }
 188
 189        public void CancelRequestByUserId(string friendUserId) =>
 0190            apiBridge.CancelRequestByUserId(friendUserId);
 191
 192        public async UniTask<FriendRequest> CancelRequestAsync(string friendRequestId)
 193        {
 0194            CancelFriendshipConfirmationPayload payload = await apiBridge.CancelRequestAsync(friendRequestId);
 0195            var friendRequest = ToFriendRequest(payload.friendRequest);
 0196            friendRequestId = friendRequest.FriendRequestId;
 0197            friendRequests.Remove(friendRequestId);
 0198            return friendRequest;
 0199        }
 200
 201        public void AcceptFriendship(string friendUserId) =>
 0202            apiBridge.AcceptFriendship(friendUserId);
 203
 204        private void FriendNotFound(string name) =>
 0205            OnFriendNotFound?.Invoke(name);
 206
 207        private void AddFriends(AddFriendsPayload msg)
 208        {
 2209            TotalFriendCount = msg.totalFriends;
 2210            OnTotalFriendsUpdated?.Invoke(TotalFriendCount);
 2211            AddFriends(msg.friends);
 2212        }
 213
 214        private void AddFriendsWithDirectMessages(AddFriendsWithDirectMessagesPayload friendsWithDMs)
 215        {
 1216            TotalFriendsWithDirectMessagesCount = friendsWithDMs.totalFriendsWithDirectMessages;
 4217            AddFriends(friendsWithDMs.currentFriendsWithDirectMessages.Select(messages => messages.userId));
 1218            OnAddFriendsWithDirectMessages?.Invoke(friendsWithDMs.currentFriendsWithDirectMessages.ToList());
 1219        }
 220
 221        private void UpdateUserPresence(UserStatus newUserStatus)
 222        {
 1223            if (!friends.ContainsKey(newUserStatus.userId)) return;
 224
 225            // Kernel doesn't send the friendship status on this call, we have to keep it or it gets defaulted
 1226            newUserStatus.friendshipStatus = friends[newUserStatus.userId].friendshipStatus;
 1227            UpdateUserStatus(newUserStatus);
 1228        }
 229
 230        private void UpdateTotalFriendRequests(UpdateTotalFriendRequestsPayload msg)
 231        {
 1232            TotalReceivedFriendRequestCount = msg.totalReceivedRequests;
 1233            TotalSentFriendRequestCount = msg.totalSentRequests;
 1234            OnTotalFriendRequestUpdated?.Invoke(TotalReceivedFriendRequestCount, TotalSentFriendRequestCount);
 1235        }
 236
 237        private void UpdateTotalFriends(UpdateTotalFriendsPayload msg)
 238        {
 1239            TotalFriendCount = msg.totalFriends;
 1240            OnTotalFriendsUpdated?.Invoke(TotalFriendCount);
 1241        }
 242
 243        private void UpdateUserStatus(UserStatus newUserStatus)
 244        {
 1245            if (!friends.ContainsKey(newUserStatus.userId))
 246            {
 0247                friends.Add(newUserStatus.userId, newUserStatus);
 0248                OnUpdateUserStatus?.Invoke(newUserStatus.userId, newUserStatus);
 249            }
 250            else
 251            {
 1252                if (!friends[newUserStatus.userId].Equals(newUserStatus))
 253                {
 1254                    friends[newUserStatus.userId] = newUserStatus;
 1255                    OnUpdateUserStatus?.Invoke(newUserStatus.userId, newUserStatus);
 256                }
 257            }
 1258        }
 259
 260        private void UpdateFriendshipStatus(FriendshipUpdateStatusMessage msg)
 261        {
 24262            var friendshipStatus = ToFriendshipStatus(msg.action);
 24263            var userId = msg.userId;
 264
 24265            if (friends.ContainsKey(userId) && friends[userId].friendshipStatus == friendshipStatus)
 0266                return;
 267
 24268            if (!friends.ContainsKey(userId))
 20269                friends.Add(userId, new UserStatus { userId = userId });
 270
 24271            if (ItsAnOutdatedUpdate(userId, friendshipStatus))
 0272                return;
 273
 24274            friends[userId].friendshipStatus = friendshipStatus;
 275
 24276            if (friendshipStatus == FriendshipStatus.NOT_FRIEND)
 6277                friends.Remove(userId);
 278
 24279            OnUpdateFriendship?.Invoke(userId, msg.action);
 23280        }
 281
 282        private bool ItsAnOutdatedUpdate(string userId, FriendshipStatus friendshipStatus)
 283        {
 24284            return friendshipStatus == FriendshipStatus.REQUESTED_FROM
 285                   && friends[userId].friendshipStatus == FriendshipStatus.FRIEND;
 286        }
 287
 288        private static FriendshipStatus ToFriendshipStatus(FriendshipAction action)
 289        {
 290            switch (action)
 291            {
 292                case FriendshipAction.NONE:
 293                    break;
 294                case FriendshipAction.APPROVED:
 9295                    return FriendshipStatus.FRIEND;
 296                case FriendshipAction.REJECTED:
 1297                    return FriendshipStatus.NOT_FRIEND;
 298                case FriendshipAction.CANCELLED:
 1299                    return FriendshipStatus.NOT_FRIEND;
 300                case FriendshipAction.REQUESTED_FROM:
 4301                    return FriendshipStatus.REQUESTED_FROM;
 302                case FriendshipAction.REQUESTED_TO:
 5303                    return FriendshipStatus.REQUESTED_TO;
 304                case FriendshipAction.DELETED:
 3305                    return FriendshipStatus.NOT_FRIEND;
 306            }
 307
 1308            return FriendshipStatus.NOT_FRIEND;
 309        }
 310
 311        private void AddFriends(IEnumerable<string> friendIds)
 312        {
 18313            foreach (var friendId in friendIds)
 314            {
 6315                UpdateFriendshipStatus(new FriendshipUpdateStatusMessage
 316                    { action = FriendshipAction.APPROVED, userId = friendId });
 317            }
 3318        }
 319
 320        private FriendRequest ToFriendRequest(FriendRequestPayload friendRequest) =>
 5321            new FriendRequest(
 322                friendRequest.friendRequestId,
 323                friendRequest.timestamp,
 324                friendRequest.@from,
 325                friendRequest.to,
 326                friendRequest.messageBody);
 327
 328        // TODO (NEW FRIEND REQUESTS): remove when we don't need to keep the retro-compatibility with the old version
 329        private void AddFriendRequests(AddFriendRequestsPayload msg)
 330        {
 0331            TotalReceivedFriendRequestCount = msg.totalReceivedFriendRequests;
 0332            TotalSentFriendRequestCount = msg.totalSentFriendRequests;
 0333            OnTotalFriendRequestUpdated?.Invoke(TotalReceivedFriendRequestCount, TotalSentFriendRequestCount);
 334
 0335            foreach (var userId in msg.requestedFrom)
 336            {
 0337                UpdateFriendshipStatus(new FriendshipUpdateStatusMessage
 338                    { action = FriendshipAction.REQUESTED_FROM, userId = userId });
 339            }
 340
 0341            foreach (var userId in msg.requestedTo)
 342            {
 0343                UpdateFriendshipStatus(new FriendshipUpdateStatusMessage
 344                    { action = FriendshipAction.REQUESTED_TO, userId = userId });
 345            }
 0346        }
 347
 348        private void AddFriendRequest(FriendRequestPayload friendRequest)
 349        {
 0350            OnAddFriendRequest?.Invoke(new FriendRequest(
 351                friendRequest.friendRequestId,
 352                friendRequest.timestamp,
 353                friendRequest.from,
 354                friendRequest.to,
 355                friendRequest.messageBody));
 0356        }
 357    }
 358}

Methods/Properties

i()
i(DCL.Social.Friends.FriendsController)
FriendsController(DCl.Social.Friends.IFriendsApiBridge)
AllocatedFriendCount()
IsInitialized()
IsInitialized(System.Boolean)
ReceivedRequestCount()
TotalFriendCount()
TotalFriendCount(System.Int32)
TotalFriendRequestCount()
TotalReceivedFriendRequestCount()
TotalReceivedFriendRequestCount(System.Int32)
TotalSentFriendRequestCount()
TotalSentFriendRequestCount(System.Int32)
TotalFriendsWithDirectMessagesCount()
TotalFriendsWithDirectMessagesCount(System.Int32)
CreateSharedInstance(DCl.Social.Friends.IFriendsApiBridge)
Initialize(DCL.Social.Friends.FriendshipInitializationMessage)
GetUserStatus(System.String)
ContainsStatus(System.String, DCL.Social.Friends.FriendshipStatus)
RequestFriendshipAsync()
RequestFriendship(System.String)
GetAllocatedFriends()
RejectFriendship(System.String)
IsFriend(System.String)
RemoveFriend(System.String)
GetFriends(System.Int32, System.Int32)
GetFriends(System.String, System.Int32)
GetFriendRequests(System.Int32, System.Int32, System.Int32, System.Int32)
GetFriendRequestsAsync()
GetFriendsWithDirectMessages(System.Int32, System.Int32)
GetFriendsWithDirectMessages(System.String, System.Int32)
GetAllocatedFriendRequest(System.String)
GetAllocatedFriendRequestByUser(System.String)
CancelRequestByUserIdAsync()
CancelRequestByUserId(System.String)
CancelRequestAsync()
AcceptFriendship(System.String)
FriendNotFound(System.String)
AddFriends(DCL.Social.Friends.AddFriendsPayload)
AddFriendsWithDirectMessages(DCL.Social.Friends.AddFriendsWithDirectMessagesPayload)
UpdateUserPresence(UserStatus)
UpdateTotalFriendRequests(DCl.Social.Friends.UpdateTotalFriendRequestsPayload)
UpdateTotalFriends(DCL.Social.Friends.UpdateTotalFriendsPayload)
UpdateUserStatus(UserStatus)
UpdateFriendshipStatus(DCL.Social.Friends.FriendshipUpdateStatusMessage)
ItsAnOutdatedUpdate(System.String, DCL.Social.Friends.FriendshipStatus)
ToFriendshipStatus(DCL.Social.Friends.FriendshipAction)
AddFriends(System.Collections.Generic.IEnumerable[String])
ToFriendRequest(DCL.Social.Friends.FriendRequestPayload)
AddFriendRequests(DCL.Social.Friends.AddFriendRequestsPayload)
AddFriendRequest(DCL.Social.Friends.FriendRequestPayload)