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>());
        }
Пример #3
0
        /// <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]);
            }
        }