public DestinyUserActivity(DestinyActivity destinyActivity, DestinyActivityDefinition definition, DestinyActivityModeDefinition modeDefinition, string characterId) { /* * Download and unpack world database * /common/destiny2_content/sqlite/en/world_sql_content_7227d0c5fd50443c8dd9e2e35f353f69.content * mode maps to modeType in DestinyActivityModeDefinition (game type) * referenceId maps to hash in DestinyActivityDefinition (map) * directoryActivityHash maps to hash in DestinyActivityDefinition (playlist) * * activity definitions * https://bungie-net.github.io/multi/schema_Destiny-HistoricalStats-Definitions-DestinyActivityModeType.html#schema_Destiny-HistoricalStats-Definitions-DestinyActivityModeType */ var activityId = destinyActivity.ActivityDetails.InstanceId; var contentUrl = $"https://www.bungie.net/en/PGCR/{activityId}?character={characterId}"; var gameTypeIconUrl = $"https://www.bungie.net{modeDefinition.DisplayProperties.Icon}"; var gameType = modeDefinition.DisplayProperties.Name; var map = definition.DisplayProperties.Name; var startTime = destinyActivity.Period; var endTime = destinyActivity.Period.AddSeconds(destinyActivity.Values["activityDurationSeconds"].Basic.Value); var mapImageUrl = $"https://www.bungie.net{definition.PgcrImage}"; var placement = destinyActivity.Values["standing"].Basic.DisplayValue; var placementColour = placement == "Victory" || placement == "1" ? AdaptiveTextColor.Good : AdaptiveTextColor.Attention; var stat1Name = "Efficiency"; var stat1Value = destinyActivity.Values["efficiency"].Basic.DisplayValue; var stat2Name = "Opponents Defeated"; var stat2Value = destinyActivity.Values["opponentsDefeated"].Basic.DisplayValue; Activity = BuildActivity(activityId, contentUrl, gameTypeIconUrl, gameType, map, startTime, endTime, mapImageUrl, placementColour, placement, stat1Name, stat1Value, stat2Name, stat2Value); }
public static IEnumerable <DestinyInventoryItemDefinition> GetRewards(this DestinyActivityDefinition activity) { var rewardHashes = activity.Rewards?.SelectMany(r => r.RewardItems).Select(r => r.ItemHash); if (rewardHashes != null && rewardHashes.Any()) { return(ManifestCacheProvider.Instance.GetDefinitionsFromCache <DestinyInventoryItemDefinition>(rewardHashes.ToArray())); } return(new List <DestinyInventoryItemDefinition>()); }
/// <summary> /// Converts the given unsigned int hash into a signed int hash and looks up the Activity name in the manifest Database. /// Returns "Unknown" if no entry in the Manifest could be found for the given Hash /// </summary> /// <param name="hash">Activity Hash</param> /// <returns></returns> public string GetNameFromHash(uint hash) { // Convert unsigned Hash into signed Hash int signedHash = (int)hash; // Prepare SQL Query SQLiteCommand query = new SQLiteCommand(sqlConnection) { CommandText = $"SELECT json FROM DestinyActivityDefinition WHERE ID = {signedHash}" }; // Read result object into string variable String jsonString = String.Empty; var sqliteDataReader = query.ExecuteReader(); while (sqliteDataReader.Read()) { byte[] jsonData = (byte[])sqliteDataReader["json"]; jsonString = Encoding.Default.GetString(jsonData); } // Dispose Command query.Dispose(); // If no JSON was found, the activity ID doesn't exist in Manifest. Return "Unknown" if (String.IsNullOrEmpty(jsonString)) { return("INVALID"); } // Bungies naming scheme got inconsistent with Ordeals, so we have to do some string manipulation here to get proper results DestinyActivityDefinition dad = DestinyActivityDefinition.FromJson(jsonString); if (dad.DisplayProperties.Name.Contains("QUEST", StringComparison.InvariantCulture)) { return("INVALID"); } if (dad.DisplayProperties.Name.Contains("Nightfall: The Ordeal", StringComparison.InvariantCulture)) { return($"{dad.DisplayProperties.Description} (Ordeal - {dad.DisplayProperties.Name.Split("Ordeal: ")[1].ToUpper(CultureInfo.InvariantCulture)})"); } else { return(dad.DisplayProperties.Name.Split("Nightfall: ")[1]); } }