< 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:84
Uncovered lines:22
Coverable lines:106
Total lines:248
Line coverage:79.2% (84 of 106)
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%
GetAllocatedFriends()0%2100%
RejectFriendship(...)0%2100%
IsFriend(...)0%220100%
RemoveFriend(...)0%2100%
GetFriends(...)0%2100%
GetFriends(...)0%2100%
GetFriendRequests(...)0%2100%
GetFriendsWithDirectMessages(...)0%2100%
GetFriendsWithDirectMessages(...)0%2100%
RequestFriendship(...)0%2100%
CancelRequest(...)0%2100%
AcceptFriendship(...)0%2100%
FriendNotFound(...)0%6200%
AddFriends(...)0%220100%
AddFriendRequests(...)0%440100%
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%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using DCl.Social.Friends;
 5
 6namespace DCL.Social.Friends
 7{
 8    public class FriendsController : IFriendsController
 9    {
 15010        public static FriendsController i { get; private set; }
 11
 12        private readonly IFriendsApiBridge apiBridge;
 13
 14        public event Action<int> OnTotalFriendsUpdated;
 015        public int AllocatedFriendCount => friends.Count(f => f.Value.friendshipStatus == FriendshipStatus.FRIEND);
 616        public bool IsInitialized { get; private set; }
 17
 18        public int ReceivedRequestCount =>
 119            friends.Values.Count(status => status.friendshipStatus == FriendshipStatus.REQUESTED_FROM);
 20
 721        public int TotalFriendCount { get; private set; }
 122        public int TotalFriendRequestCount => TotalReceivedFriendRequestCount + TotalSentFriendRequestCount;
 4123        public int TotalReceivedFriendRequestCount { get; private set; }
 624        public int TotalSentFriendRequestCount { get; private set; }
 125        public int TotalFriendsWithDirectMessagesCount { get; private set; }
 26
 4727        public readonly Dictionary<string, UserStatus> friends = new Dictionary<string, UserStatus>();
 28
 29        public event Action<string, UserStatus> OnUpdateUserStatus;
 30        public event Action<string, FriendshipAction> OnUpdateFriendship;
 31        public event Action<string> OnFriendNotFound;
 32        public event Action OnInitialized;
 33        public event Action<List<FriendWithDirectMessages>> OnAddFriendsWithDirectMessages;
 34        public event Action<int, int> OnTotalFriendRequestUpdated;
 35
 36        public static void CreateSharedInstance(IFriendsApiBridge apiBridge)
 37        {
 3338            i = new FriendsController(apiBridge);
 3339        }
 40
 4741        public FriendsController(IFriendsApiBridge apiBridge)
 42        {
 4743            this.apiBridge = apiBridge;
 4744            apiBridge.OnInitialized += Initialize;
 4745            apiBridge.OnFriendNotFound += FriendNotFound;
 4746            apiBridge.OnFriendsAdded += AddFriends;
 4747            apiBridge.OnFriendRequestsAdded += AddFriendRequests;
 4748            apiBridge.OnFriendWithDirectMessagesAdded += AddFriendsWithDirectMessages;
 4749            apiBridge.OnUserPresenceUpdated += UpdateUserPresence;
 4750            apiBridge.OnFriendshipStatusUpdated += UpdateFriendshipStatus;
 4751            apiBridge.OnTotalFriendRequestCountUpdated += UpdateTotalFriendRequests;
 4752            apiBridge.OnTotalFriendCountUpdated += UpdateTotalFriends;
 4753        }
 54
 55        private void Initialize(FriendshipInitializationMessage msg)
 56        {
 157            if (IsInitialized) return;
 58
 159            IsInitialized = true;
 60
 161            TotalReceivedFriendRequestCount = msg.totalReceivedRequests;
 162            OnTotalFriendRequestUpdated?.Invoke(TotalReceivedFriendRequestCount, TotalSentFriendRequestCount);
 163            OnInitialized?.Invoke();
 164        }
 65
 66        public UserStatus GetUserStatus(string userId)
 67        {
 068            if (!friends.ContainsKey(userId))
 069                return new UserStatus {userId = userId, friendshipStatus = FriendshipStatus.NOT_FRIEND};
 70
 071            return friends[userId];
 72        }
 73
 74        public bool ContainsStatus(string friendId, FriendshipStatus status)
 75        {
 076            if (!friends.ContainsKey(friendId)) return false;
 077            return friends[friendId].friendshipStatus == status;
 78        }
 79
 80        public Dictionary<string, UserStatus> GetAllocatedFriends()
 81        {
 082            return new Dictionary<string, UserStatus>(friends);
 83        }
 84
 085        public void RejectFriendship(string friendUserId) => apiBridge.RejectFriendship(friendUserId);
 86
 87        public bool IsFriend(string userId) =>
 188            friends.ContainsKey(userId) && friends[userId].friendshipStatus == FriendshipStatus.FRIEND;
 89
 090        public void RemoveFriend(string friendId) => apiBridge.RemoveFriend(friendId);
 91
 092        public void GetFriends(int limit, int skip) => apiBridge.GetFriends(limit, skip);
 93
 094        public void GetFriends(string usernameOrId, int limit) =>apiBridge.GetFriends(usernameOrId, limit);
 95
 96        public void GetFriendRequests(int sentLimit, int sentSkip, int receivedLimit,
 97            int receivedSkip) =>
 098            apiBridge.GetFriendRequests(sentLimit, sentSkip, receivedLimit, receivedSkip);
 99
 100        public void GetFriendsWithDirectMessages(int limit, int skip) =>
 0101            apiBridge.GetFriendsWithDirectMessages("", limit, skip);
 102
 103        public void GetFriendsWithDirectMessages(string userNameOrId, int limit) =>
 0104            apiBridge.GetFriendsWithDirectMessages(userNameOrId, limit, 0);
 105
 106        public void RequestFriendship(string friendUserId) =>
 0107            apiBridge.RequestFriendship(friendUserId);
 108
 109        public void CancelRequest(string friendUserId) =>
 0110            apiBridge.CancelRequest(friendUserId);
 111
 112        public void AcceptFriendship(string friendUserId) =>
 0113            apiBridge.AcceptFriendship(friendUserId);
 114
 0115        private void FriendNotFound(string name) => OnFriendNotFound?.Invoke(name);
 116
 117        private void AddFriends(AddFriendsPayload msg)
 118        {
 2119            TotalFriendCount = msg.totalFriends;
 2120            OnTotalFriendsUpdated?.Invoke(TotalFriendCount);
 2121            AddFriends(msg.friends);
 2122        }
 123
 124        private void AddFriendRequests(AddFriendRequestsPayload msg)
 125        {
 1126            TotalReceivedFriendRequestCount = msg.totalReceivedFriendRequests;
 1127            TotalSentFriendRequestCount = msg.totalSentFriendRequests;
 1128            OnTotalFriendRequestUpdated?.Invoke(TotalReceivedFriendRequestCount, TotalSentFriendRequestCount);
 129
 8130            foreach (var userId in msg.requestedFrom)
 131            {
 3132                UpdateFriendshipStatus(new FriendshipUpdateStatusMessage
 133                    {action = FriendshipAction.REQUESTED_FROM, userId = userId});
 134            }
 135
 6136            foreach (var userId in msg.requestedTo)
 137            {
 2138                UpdateFriendshipStatus(new FriendshipUpdateStatusMessage
 139                    {action = FriendshipAction.REQUESTED_TO, userId = userId});
 140            }
 1141        }
 142
 143        private void AddFriendsWithDirectMessages(AddFriendsWithDirectMessagesPayload friendsWithDMs)
 144        {
 1145            TotalFriendsWithDirectMessagesCount = friendsWithDMs.totalFriendsWithDirectMessages;
 4146            AddFriends(friendsWithDMs.currentFriendsWithDirectMessages.Select(messages => messages.userId));
 1147            OnAddFriendsWithDirectMessages?.Invoke(friendsWithDMs.currentFriendsWithDirectMessages.ToList());
 1148        }
 149
 150        private void UpdateUserPresence(UserStatus newUserStatus)
 151        {
 1152            if (!friends.ContainsKey(newUserStatus.userId)) return;
 153            // Kernel doesn't send the friendship status on this call, we have to keep it or it gets defaulted
 1154            newUserStatus.friendshipStatus = friends[newUserStatus.userId].friendshipStatus;
 1155            UpdateUserStatus(newUserStatus);
 1156        }
 157
 158        private void UpdateTotalFriendRequests(UpdateTotalFriendRequestsPayload msg)
 159        {
 1160            TotalReceivedFriendRequestCount = msg.totalReceivedRequests;
 1161            TotalSentFriendRequestCount = msg.totalSentRequests;
 1162            OnTotalFriendRequestUpdated?.Invoke(TotalReceivedFriendRequestCount, TotalSentFriendRequestCount);
 1163        }
 164
 165        private void UpdateTotalFriends(UpdateTotalFriendsPayload msg)
 166        {
 1167            TotalFriendCount = msg.totalFriends;
 1168            OnTotalFriendsUpdated?.Invoke(TotalFriendCount);
 1169        }
 170
 171        private void UpdateUserStatus(UserStatus newUserStatus)
 172        {
 1173            if (!friends.ContainsKey(newUserStatus.userId))
 174            {
 0175                friends.Add(newUserStatus.userId, newUserStatus);
 0176                OnUpdateUserStatus?.Invoke(newUserStatus.userId, newUserStatus);
 177            }
 178            else
 179            {
 1180                if (!friends[newUserStatus.userId].Equals(newUserStatus))
 181                {
 1182                    friends[newUserStatus.userId] = newUserStatus;
 1183                    OnUpdateUserStatus?.Invoke(newUserStatus.userId, newUserStatus);
 184                }
 185            }
 1186        }
 187
 188        private void UpdateFriendshipStatus(FriendshipUpdateStatusMessage msg)
 189        {
 24190            var friendshipStatus = ToFriendshipStatus(msg.action);
 24191            var userId = msg.userId;
 192
 24193            if (friends.ContainsKey(userId) && friends[userId].friendshipStatus == friendshipStatus)
 0194                return;
 195
 24196            if (!friends.ContainsKey(userId))
 20197                friends.Add(userId, new UserStatus {userId = userId});
 198
 24199            if (ItsAnOutdatedUpdate(userId, friendshipStatus))
 0200                return;
 201
 24202            friends[userId].friendshipStatus = friendshipStatus;
 203
 24204            if (friendshipStatus == FriendshipStatus.NOT_FRIEND)
 6205                friends.Remove(userId);
 206
 24207            OnUpdateFriendship?.Invoke(userId, msg.action);
 23208        }
 209
 210        private bool ItsAnOutdatedUpdate(string userId, FriendshipStatus friendshipStatus)
 211        {
 24212            return friendshipStatus == FriendshipStatus.REQUESTED_FROM
 213                   && friends[userId].friendshipStatus == FriendshipStatus.FRIEND;
 214        }
 215
 216        private static FriendshipStatus ToFriendshipStatus(FriendshipAction action)
 217        {
 218            switch (action)
 219            {
 220                case FriendshipAction.NONE:
 221                    break;
 222                case FriendshipAction.APPROVED:
 9223                    return FriendshipStatus.FRIEND;
 224                case FriendshipAction.REJECTED:
 1225                    return FriendshipStatus.NOT_FRIEND;
 226                case FriendshipAction.CANCELLED:
 1227                    return FriendshipStatus.NOT_FRIEND;
 228                case FriendshipAction.REQUESTED_FROM:
 4229                    return FriendshipStatus.REQUESTED_FROM;
 230                case FriendshipAction.REQUESTED_TO:
 5231                    return FriendshipStatus.REQUESTED_TO;
 232                case FriendshipAction.DELETED:
 3233                    return FriendshipStatus.NOT_FRIEND;
 234            }
 235
 1236            return FriendshipStatus.NOT_FRIEND;
 237        }
 238
 239        private void AddFriends(IEnumerable<string> friendIds)
 240        {
 18241            foreach (var friendId in friendIds)
 242            {
 6243                UpdateFriendshipStatus(new FriendshipUpdateStatusMessage
 244                    {action = FriendshipAction.APPROVED, userId = friendId});
 245            }
 3246        }
 247    }
 248}

Methods/Properties

i()
i(DCL.Social.Friends.FriendsController)
AllocatedFriendCount()
IsInitialized()
IsInitialized(System.Boolean)
ReceivedRequestCount()
TotalFriendCount()
TotalFriendCount(System.Int32)
TotalFriendRequestCount()
TotalReceivedFriendRequestCount()
TotalReceivedFriendRequestCount(System.Int32)
TotalSentFriendRequestCount()
TotalSentFriendRequestCount(System.Int32)
TotalFriendsWithDirectMessagesCount()
TotalFriendsWithDirectMessagesCount(System.Int32)
FriendsController(DCl.Social.Friends.IFriendsApiBridge)
CreateSharedInstance(DCl.Social.Friends.IFriendsApiBridge)
Initialize(DCL.Social.Friends.FriendshipInitializationMessage)
GetUserStatus(System.String)
ContainsStatus(System.String, DCL.Social.Friends.FriendshipStatus)
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)
GetFriendsWithDirectMessages(System.Int32, System.Int32)
GetFriendsWithDirectMessages(System.String, System.Int32)
RequestFriendship(System.String)
CancelRequest(System.String)
AcceptFriendship(System.String)
FriendNotFound(System.String)
AddFriends(DCL.Social.Friends.AddFriendsPayload)
AddFriendRequests(DCL.Social.Friends.AddFriendRequestsPayload)
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])