< Summary

Class:DCL.Quests.QuestsController
Assembly:Quests
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/Quests/QuestsController.cs
Covered lines:0
Uncovered lines:113
Coverable lines:113
Total lines:255
Line coverage:0% (0 of 113)
Covered branches:0
Total branches:0
Covered methods:0
Total methods:13
Method coverage:0% (0 of 13)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
QuestsController(...)0%12300%
AbandonQuest(...)0%6200%
JumpIn(...)0%2100%
ChangePinnedQuest(...)0%2100%
ChangePinnedQuest(...)0%56700%
ConfigureQuestLogInFullscreenMenuChanged(...)0%2100%
StartTrackingQuests()0%1561200%
StartTrackingStartedQuests()0%1821300%
GetQuestSteps(...)0%2401500%
AddOrUpdateQuestToLog(...)0%12300%
ShowQuestCompleted()0%42600%
Dispose()0%6200%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/HUD/Quests/QuestsController.cs

#LineLine coverage
 1using Cysharp.Threading.Tasks;
 2using DCL.Helpers;
 3using DCL.Tasks;
 4using DCLServices.QuestsService;
 5using Decentraland.Quests;
 6using System;
 7using System.Collections.Generic;
 8using System.Linq;
 9using System.Threading;
 10using UnityEngine;
 11using Action = Decentraland.Quests.Action;
 12using Task = Decentraland.Quests.Task;
 13
 14namespace DCL.Quests
 15{
 16    public class QuestsController : IDisposable
 17    {
 18        private const string PINNED_QUEST_KEY = "PinnedQuestId";
 19
 20        private readonly IQuestsService questsService;
 21        private readonly IQuestTrackerComponentView questTrackerComponentView;
 22        private readonly IQuestCompletedComponentView questCompletedComponentView;
 23        private readonly IQuestStartedPopupComponentView questStartedPopupComponentView;
 24        private readonly QuestLogController questLogController;
 25        private readonly IUserProfileBridge userProfileBridge;
 26        private readonly IPlayerPrefs playerPrefs;
 27        private readonly DataStore dataStore;
 28        private readonly ITeleportController teleportController;
 29        private readonly IQuestAnalyticsService questAnalyticsService;
 30        private Service<IWebRequestController> webRequestController;
 31
 32        private CancellationTokenSource disposeCts = null;
 33        private CancellationTokenSource profileCts = null;
 34
 035        private BaseVariable<string> pinnedQuestId => dataStore.Quests.pinnedQuest;
 36        private Dictionary<string, QuestInstance> quests;
 37
 038        public QuestsController(
 39            IQuestsService questsService,
 40            IQuestTrackerComponentView questTrackerComponentView,
 41            IQuestCompletedComponentView questCompletedComponentView,
 42            IQuestStartedPopupComponentView questStartedPopupComponentView,
 43            IUserProfileBridge userProfileBridge,
 44            IPlayerPrefs playerPrefs,
 45            DataStore dataStore,
 46            ITeleportController teleportController,
 47            QuestLogController questLogController,
 48            IQuestAnalyticsService questAnalyticsService)
 49        {
 050            this.questsService = questsService;
 051            this.questTrackerComponentView = questTrackerComponentView;
 052            this.questCompletedComponentView = questCompletedComponentView;
 053            this.questStartedPopupComponentView = questStartedPopupComponentView;
 054            this.userProfileBridge = userProfileBridge;
 055            this.playerPrefs = playerPrefs;
 056            this.dataStore = dataStore;
 057            this.teleportController = teleportController;
 058            this.questLogController = questLogController;
 059            this.questAnalyticsService = questAnalyticsService;
 60
 061            disposeCts = new CancellationTokenSource();
 062            quests = new ();
 63
 064            StartTrackingQuests(disposeCts.Token).Forget();
 065            StartTrackingStartedQuests(disposeCts.Token).Forget();
 66
 067            questLogController.SetIsGuest(userProfileBridge.GetOwn().isGuest);
 68
 069            questStartedPopupComponentView.OnOpenQuestLog += () => { dataStore.HUDs.questsPanelVisible.Set(true); };
 070            dataStore.exploreV2.configureQuestInFullscreenMenu.OnChange += ConfigureQuestLogInFullscreenMenuChanged;
 071            ConfigureQuestLogInFullscreenMenuChanged(dataStore.exploreV2.configureQuestInFullscreenMenu.Get(), null);
 072            questLogController.OnPinChange += ChangePinnedQuest;
 073            questLogController.OnQuestAbandon += AbandonQuest;
 074            questTrackerComponentView.OnJumpIn += JumpIn;
 075            questLogController.OnJumpIn += JumpIn;
 76
 077            foreach (var questsServiceQuestInstance in questsService.QuestInstances)
 078                AddOrUpdateQuestToLog(questsServiceQuestInstance.Value);
 79
 080            ChangePinnedQuest(playerPrefs.GetString(PINNED_QUEST_KEY, ""), true, false);
 081        }
 82
 83        private void AbandonQuest(string questId)
 84        {
 085            if(pinnedQuestId.Get().Equals(questId))
 086                ChangePinnedQuest(questId, false);
 087            questsService.AbortQuest(questId).Forget();
 088            questLogController.RemoveQuestIfExists(questId);
 089            questAnalyticsService.SendQuestCancelled(questId);
 090        }
 91
 92        private void JumpIn(Vector2Int obj) =>
 093            teleportController.Teleport(obj.x, obj.y);
 94
 95        private void ChangePinnedQuest(string questId, bool isPinned) =>
 096            ChangePinnedQuest(questId, isPinned, true);
 97
 98        private void ChangePinnedQuest(string questId, bool isPinned, bool sendAnalytics)
 99        {
 0100            if(sendAnalytics)
 0101                questAnalyticsService.SendPinnedQuest(questId, isPinned);
 102
 0103            string previousPinnedQuestId = pinnedQuestId.Get();
 104
 0105            pinnedQuestId.Set(isPinned ? questId : "");
 106
 0107            playerPrefs.Set(PINNED_QUEST_KEY, pinnedQuestId.Get());
 0108            playerPrefs.Save();
 109
 0110            if (!string.IsNullOrEmpty(previousPinnedQuestId))
 0111                AddOrUpdateQuestToLog(quests[previousPinnedQuestId]);
 112
 0113            if (string.IsNullOrEmpty(pinnedQuestId.Get()) || !quests.ContainsKey(questId))
 114            {
 0115                questTrackerComponentView.SetVisible(false);
 0116                return;
 117            }
 118
 0119            questTrackerComponentView.SetVisible(true);
 0120            questTrackerComponentView.SetQuestTitle(quests[questId].Quest.Name);
 0121            questTrackerComponentView.SetQuestSteps(GetQuestSteps(quests[questId]));
 122
 0123            AddOrUpdateQuestToLog(quests[pinnedQuestId.Get()]);
 0124        }
 125
 126        private void ConfigureQuestLogInFullscreenMenuChanged(Transform current, Transform previous)
 127        {
 0128            questLogController.SetAsFullScreenMenuMode(current);
 0129        }
 130
 131        private async UniTaskVoid StartTrackingQuests(CancellationToken ct)
 132        {
 0133            await foreach (var questInstance in questsService.QuestUpdated.WithCancellation(ct))
 134            {
 0135                await UniTask.SwitchToMainThread(ct);
 0136                AddOrUpdateQuestToLog(questInstance, true);
 0137                if (questInstance.Id != pinnedQuestId.Get())
 138                    continue;
 139
 0140                questTrackerComponentView.SetQuestTitle(questInstance.Quest.Name);
 0141                questTrackerComponentView.SetQuestSteps(GetQuestSteps(questInstance));
 0142            }
 0143        }
 144
 145        private async UniTaskVoid StartTrackingStartedQuests(CancellationToken ct)
 146        {
 0147            await foreach (var questStateUpdate in questsService.QuestStarted.WithCancellation(ct))
 148            {
 0149                await UniTask.SwitchToMainThread(ct);
 0150                AddOrUpdateQuestToLog(questStateUpdate);
 0151                questStartedPopupComponentView.SetQuestName(questStateUpdate.Quest.Name);
 0152                questStartedPopupComponentView.SetVisible(true);
 0153                questAnalyticsService.SendQuestStarted(questStateUpdate.Quest.Id);
 154
 0155                if(string.IsNullOrEmpty(pinnedQuestId.Get()) || quests.ContainsKey(pinnedQuestId.Get()))
 0156                    ChangePinnedQuest(questStateUpdate.Id, true, false);
 0157            }
 0158        }
 159
 160        private List<QuestStepComponentModel> GetQuestSteps(QuestInstance questInstance, bool includePreviousSteps = fal
 161        {
 0162            List<QuestStepComponentModel> questSteps = new List<QuestStepComponentModel>();
 163
 0164            if(includePreviousSteps)
 0165                foreach (var step in questInstance.State.StepsCompleted)
 0166                    questSteps.Add(new QuestStepComponentModel { isCompleted = true, text = step });
 167
 0168            foreach (var step in questInstance.State.CurrentSteps)
 169            {
 0170                foreach (Task task in step.Value.TasksCompleted)
 0171                    questSteps.Add(new QuestStepComponentModel { isCompleted = true, text = task.Id });
 172
 0173                foreach (Task task in step.Value.ToDos)
 174                {
 0175                    var supportsJumpIn = false;
 0176                    Vector2Int coordinates = Vector2Int.zero;
 0177                    foreach (Action taskActionItem in task.ActionItems)
 178                    {
 0179                        if (taskActionItem.Type == "LOCATION" && taskActionItem.Parameters.TryGetValue("x", out string x
 180                        {
 0181                            supportsJumpIn = true;
 0182                            coordinates = new Vector2Int(int.Parse(xCoordinate), int.Parse(yCoordinate));
 183                        }
 184                    }
 185
 0186                    questSteps.Add(new QuestStepComponentModel { isCompleted = false, text = task.Id, supportsJumpIn = s
 187                }
 188            }
 189
 0190            return questSteps;
 191        }
 192
 193        private void AddOrUpdateQuestToLog(QuestInstance questInstance, bool showCompletedQuestHUD = false, bool isQuest
 194        {
 0195            quests.TryAdd(questInstance.Id, questInstance);
 196
 0197            QuestDetailsComponentModel quest = new QuestDetailsComponentModel()
 198            {
 199                questName = questInstance.Quest.Name,
 200                questCreator = questInstance.Quest.CreatorAddress,
 201                questDescription = questInstance.Quest.Description,
 202                questId = questInstance.Id,
 203                questDefinitionId = questInstance.Quest.Id,
 204                isPinned = questInstance.Id == pinnedQuestId.Get(),
 205                questImageUri = questInstance.Quest.ImageUrl,
 206                questSteps = GetQuestSteps(questInstance, true),
 207                questRewards = new List<QuestRewardComponentModel>()
 208            };
 209
 0210            if (questInstance.State.CurrentSteps.Count > 0)
 211            {
 0212                questLogController.AddActiveQuest(quest).Forget();
 0213                questAnalyticsService.SendQuestProgressed(questInstance.Quest.Id, questInstance.State.CurrentSteps.Keys.
 214            }
 215            else
 216            {
 0217                ChangePinnedQuest(questInstance.Id, false, false);
 218
 0219                if (showCompletedQuestHUD)
 220                {
 0221                    ShowQuestCompleted(questInstance, disposeCts.Token).Forget();
 222                }
 223
 0224                questLogController.AddCompletedQuest(quest).Forget();
 225            }
 0226        }
 227
 228        private async UniTaskVoid ShowQuestCompleted(QuestInstance questInstance, CancellationToken ct)
 229        {
 0230            List<QuestRewardComponentModel> questRewards = new List<QuestRewardComponentModel>();
 0231            foreach (QuestReward questReward in await questsService.GetQuestRewards(questInstance.Quest.Id, ct))
 232            {
 0233                questRewards.Add(new QuestRewardComponentModel()
 234                {
 235                    imageUri = questReward.image_link,
 236                    name = questReward.name
 237                });
 238            }
 0239            questAnalyticsService.SendQuestCompleted(questInstance.Quest.Id);
 0240            questCompletedComponentView.SetTitle(questInstance.Quest.Name);
 0241            questCompletedComponentView.SetRewards(questRewards);
 0242            questCompletedComponentView.SetIsGuest(userProfileBridge.GetOwn().isGuest);
 0243            questCompletedComponentView.SetVisible(true);
 0244        }
 245
 246        public void Dispose()
 247        {
 0248            questLogController.OnPinChange -= ChangePinnedQuest;
 0249            questTrackerComponentView.OnJumpIn -= JumpIn;
 0250            questLogController.OnJumpIn -= JumpIn;
 0251            dataStore.exploreV2.configureQuestInFullscreenMenu.OnChange -= ConfigureQuestLogInFullscreenMenuChanged;
 0252            disposeCts?.SafeCancelAndDispose();
 0253        }
 254    }
 255}