< Summary

Class:DCL.AvatarSceneEmoteHandler
Assembly:AvatarShape
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Avatar/AvatarSceneEmoteHandler.cs
Covered lines:10
Uncovered lines:21
Coverable lines:31
Total lines:82
Line coverage:32.2% (10 of 31)
Covered branches:0
Total branches:0
Covered methods:2
Total methods:6
Method coverage:33.3% (2 of 6)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
AvatarSceneEmoteHandler(...)0%110100%
IsSceneEmote(...)0%2100%
SetExpressionLamportTimestamp(...)0%2100%
LoadAndPlayEmote()0%42600%
TriggerEmote(...)0%6200%
CleanUp()0%4.254075%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Components/Avatar/AvatarSceneEmoteHandler.cs

#LineLine coverage
 1using AvatarAssets;
 2using AvatarSystem;
 3using Cysharp.Threading.Tasks;
 4using DCL.Emotes;
 5using DCL.Tasks;
 6using System;
 7using System.Collections.Generic;
 8using System.Threading;
 9using UnityEngine;
 10
 11namespace DCL
 12{
 13    public class AvatarSceneEmoteHandler
 14    {
 15        private readonly IAvatarEmotesController emotesController;
 16        private readonly IEmotesService emotesService;
 17        private readonly HashSet<string> equippedEmotes;
 18
 19        private long lamportTimestamp;
 20        private CancellationTokenSource cts;
 21
 31022        public AvatarSceneEmoteHandler(IAvatarEmotesController emotesController, IEmotesService emotesService)
 23        {
 31024            this.emotesController = emotesController;
 31025            this.emotesService = emotesService;
 31026            equippedEmotes = new HashSet<string>();
 31027        }
 28
 29        public bool IsSceneEmote(string emoteId) =>
 030            SceneEmoteHelper.IsSceneEmote(emoteId);
 31
 32        public void SetExpressionLamportTimestamp(long timestamp)
 33        {
 034            lamportTimestamp = timestamp;
 035        }
 36
 37        public async UniTask LoadAndPlayEmote(string bodyShapeId, string emoteId)
 38        {
 039            long timestamp = lamportTimestamp;
 040            cts ??= new CancellationTokenSource();
 41
 042            var emoteKey = new EmoteBodyId(bodyShapeId, emoteId);
 43
 044            if (equippedEmotes.Contains(emoteId))
 45            {
 046                TriggerEmote(emoteId, timestamp);
 047                return;
 48            }
 49
 50            try
 51            {
 052                var loadedEmote = await emotesService.RequestEmote(emoteKey, cts.Token);
 53
 054                emotesController.EquipEmote(emoteId, loadedEmote);
 055                equippedEmotes.Add(emoteId);
 56
 057                TriggerEmote(emoteId, timestamp);
 058            }
 059            catch (OperationCanceledException) { }
 060            catch (Exception e) { Debug.LogException(e); }
 061        }
 62
 63        private void TriggerEmote(string emoteId, long timestamp)
 64        {
 65            //avoid playing emote if timestamp has change,
 66            //meaning a new emote was trigger while this one was loading
 067            if (timestamp == lamportTimestamp)
 068                emotesController.PlayEmote(emoteId, lamportTimestamp);
 069        }
 70
 71        public void CleanUp()
 72        {
 31073            cts?.SafeCancelAndDispose();
 31074            cts = null;
 75
 62076            foreach (string emoteId in equippedEmotes)
 077                emotesController?.UnEquipEmote(emoteId);
 78
 31079            equippedEmotes.Clear();
 31080        }
 81    }
 82}