< Summary

Class:FriendsController
Assembly:FriendsController
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/FriendsController/FriendsController.cs
Covered lines:18
Uncovered lines:52
Coverable lines:70
Total lines:239
Line coverage:25.7% (18 of 70)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Awake()0%110100%
FriendsController()0%110100%
GetUserStatus(...)0%6200%
GetFriends()0%110100%
FriendNotFound(...)0%6200%
InitializeFriends(...)0%1561200%
UpdateUserStatus(...)0%12300%
UpdateUserPresence(...)0%6200%
UpdateFriendshipStatus(...)0%18.1712065%
UpdateFriendshipStatus(...)0%2100%

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 UnityEngine;
 5
 6public interface IFriendsController
 7{
 8    int friendCount { get; }
 9    bool isInitialized { get; }
 10    Dictionary<string, FriendsController.UserStatus> GetFriends();
 11
 12    event Action OnInitialized;
 13    event Action<string, FriendshipAction> OnUpdateFriendship;
 14    event Action<string, FriendsController.UserStatus> OnUpdateUserStatus;
 15    event Action<string> OnFriendNotFound;
 16}
 17
 18public enum PresenceStatus
 19{
 20    NONE,
 21    OFFLINE,
 22    ONLINE,
 23    UNAVAILABLE,
 24}
 25
 26public enum FriendshipStatus
 27{
 28    NONE,
 29    FRIEND,
 30    REQUESTED_FROM,
 31    REQUESTED_TO
 32}
 33
 34public enum FriendshipAction
 35{
 36    NONE,
 37    APPROVED,
 38    REJECTED,
 39    CANCELLED,
 40    REQUESTED_FROM,
 41    REQUESTED_TO,
 42    DELETED
 43}
 44
 45public class FriendsController : MonoBehaviour, IFriendsController
 46{
 47    public static bool VERBOSE = false;
 048    public static FriendsController i { get; private set; }
 49
 150    public int friendCount => friends.Count(f => f.Value.friendshipStatus == FriendshipStatus.FRIEND);
 51
 26052    void Awake() { i = this; }
 53
 54    private const bool KERNEL_CAN_REMOVE_ENTRIES = false;
 255    public bool isInitialized { get; private set; } = false;
 25356    public Dictionary<string, UserStatus> friends = new Dictionary<string, UserStatus>();
 57
 58    [System.Serializable]
 59    public class UserStatus
 60    {
 61        [System.Serializable]
 62        public class Realm
 63        {
 64            public string serverName;
 65            public string layer;
 66        }
 67
 68        public Realm realm;
 69        public Vector2 position;
 70        public string userId;
 71        public FriendshipStatus friendshipStatus;
 72        public PresenceStatus presence;
 73    }
 74
 75    [System.Serializable]
 76    public class FriendshipInitializationMessage
 77    {
 78        public string[] currentFriends;
 79        public string[] requestedTo;
 80        public string[] requestedFrom;
 81    }
 82
 83    [System.Serializable]
 84    public class FriendshipUpdateStatusMessage
 85    {
 86        public string userId;
 87        public FriendshipAction action;
 88    }
 89
 90    public UserStatus GetUserStatus(string userId)
 91    {
 092        if (!friends.ContainsKey(userId))
 093            return new UserStatus() { userId = userId, friendshipStatus = FriendshipStatus.NONE };
 94
 095        return friends[userId];
 96    }
 97
 98    public event System.Action<string, UserStatus> OnUpdateUserStatus;
 99    public event System.Action<string, FriendshipAction> OnUpdateFriendship;
 100    public event Action<string> OnFriendNotFound;
 101    public event Action OnInitialized;
 102
 22103    public Dictionary<string, UserStatus> GetFriends() { return new Dictionary<string, UserStatus>(friends); }
 104
 0105    public void FriendNotFound(string name) { OnFriendNotFound?.Invoke(name); }
 106
 107    public void InitializeFriends(string json)
 108    {
 0109        isInitialized = true;
 110
 0111        FriendshipInitializationMessage msg = JsonUtility.FromJson<FriendshipInitializationMessage>(json);
 0112        HashSet<string> processedIds = new HashSet<string>();
 113
 0114        foreach (var userId in msg.currentFriends)
 115        {
 0116            UpdateFriendshipStatus(new FriendshipUpdateStatusMessage()
 117                { action = FriendshipAction.APPROVED, userId = userId });
 0118            if (!processedIds.Contains(userId))
 0119                processedIds.Add(userId);
 120        }
 121
 0122        foreach (var userId in msg.requestedFrom)
 123        {
 0124            UpdateFriendshipStatus(new FriendshipUpdateStatusMessage()
 125                { action = FriendshipAction.REQUESTED_FROM, userId = userId });
 0126            if (!processedIds.Contains(userId))
 0127                processedIds.Add(userId);
 128        }
 129
 0130        foreach (var userId in msg.requestedTo)
 131        {
 0132            UpdateFriendshipStatus(new FriendshipUpdateStatusMessage()
 133                { action = FriendshipAction.REQUESTED_TO, userId = userId });
 0134            if (!processedIds.Contains(userId))
 0135                processedIds.Add(userId);
 136        }
 137
 0138        Queue<string> newFriends = new Queue<string>();
 139
 0140        foreach (var kvp in friends)
 141        {
 0142            if (!processedIds.Contains(kvp.Key))
 143            {
 0144                newFriends.Enqueue(kvp.Key);
 145            }
 146        }
 147
 0148        while (newFriends.Count > 0)
 149        {
 0150            var userId = newFriends.Dequeue();
 151
 152            if (KERNEL_CAN_REMOVE_ENTRIES)
 153            {
 154                UpdateFriendshipStatus(new FriendshipUpdateStatusMessage()
 155                    { action = FriendshipAction.NONE, userId = userId });
 156            }
 157
 0158            if (friends.ContainsKey(userId))
 0159                friends.Remove(userId);
 160        }
 161
 0162        OnInitialized?.Invoke();
 0163    }
 164
 165    public void UpdateUserStatus(UserStatus newUserStatus)
 166    {
 0167        if (!friends.ContainsKey(newUserStatus.userId))
 168        {
 0169            friends.Add(newUserStatus.userId, newUserStatus);
 0170        }
 171        else
 172        {
 0173            friends[newUserStatus.userId] = newUserStatus;
 174        }
 175
 0176        OnUpdateUserStatus?.Invoke(newUserStatus.userId, newUserStatus);
 0177    }
 178
 179    public void UpdateUserPresence(string json)
 180    {
 0181        UserStatus newUserStatus = JsonUtility.FromJson<UserStatus>(json);
 182
 0183        if (!friends.ContainsKey(newUserStatus.userId))
 0184            return;
 185
 186        // Kernel doesn't send the friendship status on this call, we have to keep it or it gets defaulted
 0187        newUserStatus.friendshipStatus = friends[newUserStatus.userId].friendshipStatus;
 188
 0189        UpdateUserStatus(newUserStatus);
 0190    }
 191
 192    public void UpdateFriendshipStatus(FriendshipUpdateStatusMessage msg)
 193    {
 6194        if (!friends.ContainsKey(msg.userId))
 195        {
 2196            friends.Add(msg.userId, new UserStatus() { });
 197        }
 198
 6199        switch (msg.action)
 200        {
 201            case FriendshipAction.NONE:
 202                break;
 203            case FriendshipAction.APPROVED:
 2204                friends[msg.userId].friendshipStatus = FriendshipStatus.FRIEND;
 2205                break;
 206            case FriendshipAction.REJECTED:
 0207                friends[msg.userId].friendshipStatus = FriendshipStatus.NONE;
 0208                break;
 209            case FriendshipAction.CANCELLED:
 0210                friends[msg.userId].friendshipStatus = FriendshipStatus.NONE;
 0211                break;
 212            case FriendshipAction.REQUESTED_FROM:
 0213                friends[msg.userId].friendshipStatus = FriendshipStatus.REQUESTED_FROM;
 0214                break;
 215            case FriendshipAction.REQUESTED_TO:
 2216                friends[msg.userId].friendshipStatus = FriendshipStatus.REQUESTED_TO;
 2217                break;
 218            case FriendshipAction.DELETED:
 2219                friends[msg.userId].friendshipStatus = FriendshipStatus.NONE;
 220                break;
 221        }
 222
 6223        if (VERBOSE)
 0224            Debug.Log($"Change friend status of {msg.userId} to {friends[msg.userId].friendshipStatus}");
 225
 6226        if (friends[msg.userId].friendshipStatus == FriendshipStatus.NONE)
 227        {
 2228            friends.Remove(msg.userId);
 229        }
 230
 6231        OnUpdateFriendship?.Invoke(msg.userId, msg.action);
 6232    }
 233
 234    public void UpdateFriendshipStatus(string json)
 235    {
 0236        FriendshipUpdateStatusMessage msg = JsonUtility.FromJson<FriendshipUpdateStatusMessage>(json);
 0237        UpdateFriendshipStatus(msg);
 0238    }
 239}