public async Task <IActionResult> Details(int type, long id, long characterId) { var membershipType = (BungieMembershipType)type; _logger.LogInformation($"{membershipType}/{id}/{characterId}"); var accessToken = await _contextAccessor.HttpContext.GetTokenAsync("access_token"); var info = await _destiny2.GetProfile(accessToken, membershipType, id, DestinyComponentType.Characters, DestinyComponentType.CharacterEquipment, DestinyComponentType.ItemInstances, DestinyComponentType.ItemStats, DestinyComponentType.ItemSockets, DestinyComponentType.ProfileInventories); var(mods, shaders) = await _perkFactory.LoadAllMods(info.ProfileInventory.Data.Items); var allItems = await _itemFactory.LoadItems(info.CharacterEquipment.Data[characterId].Items, info.ItemComponents.Instances.Data, info.ItemComponents.Stats.Data, info.ItemComponents.Sockets.Data, mods, shaders); var items = allItems.ToDictionary(item => item.Slot.Hash); var stats = GetStats(items.Values); var activePerks = GetActivePerks(items.Values); var character = info.Characters.Data[characterId]; var model = new CharacterViewModel() { Type = membershipType, AccountId = id, CharacterId = characterId, Items = items, EmblemPath = _bungie.BaseUrl + character.EmblemPath, EmblemBackgroundPath = _bungie.BaseUrl + character.EmblemBackgroundPath, Stats = stats, ActivePerks = activePerks }; return(View(model)); }