Beispiel #1
0
        private void LoadFromDisk()
        {
            int gameCount = 0;
            int staticRichPresenceCount = 0;
            int leaderboardCount        = 0;
            int achievementCount        = 0;
            var oldestFile = DateTime.MaxValue;
            var authors    = new HashSet <string>();
            var systems    = new HashSet <int>();

            _gamesWithAchievements.Clear();
            _gamesWithLeaderboards.Clear();
            _gamesWithRichPresence.Clear();

            var directory = _settings.DumpDirectory;
            var files     = Directory.GetFiles(directory, "*.json");

            _progress.Reset(files.Length);
            _progress.Label     = "Processing cached files";
            _progress.IsEnabled = true;

            foreach (var file in files)
            {
                if (!_progress.IsEnabled)
                {
                    break;
                }

                _progress.Current++;

                var contents  = File.ReadAllText(file);
                var json      = new Jamiras.IO.Serialization.JsonObject(contents);
                var patchData = json.GetField("PatchData");
                if (patchData.Type != Jamiras.IO.Serialization.JsonFieldType.Object)
                {
                    File.Delete(file);
                    continue;
                }

                int gameId = patchData.ObjectValue.GetField("ID").IntegerValue.GetValueOrDefault();
                if (gameId == 0)
                {
                    File.Delete(file);
                    continue;
                }

                var lastUpdated = File.GetLastWriteTimeUtc(file);
                if (lastUpdated < oldestFile)
                {
                    oldestFile = lastUpdated;
                }

                gameCount++;

                var richPresence = patchData.ObjectValue.GetField("RichPresencePatch").StringValue;
                if (richPresence != null)
                {
                    int index = richPresence.IndexOf("Display:");
                    if (index != -1)
                    {
                        _gamesWithRichPresence.Add(gameId);

                        bool dynamic = false;
                        foreach (var line in richPresence.Substring(index).Split('\n'))
                        {
                            if (line.Trim().Length == 0)
                            {
                                break;
                            }

                            if (line.Contains("@"))
                            {
                                dynamic = true;
                                break;
                            }
                        }

                        if (!dynamic)
                        {
                            staticRichPresenceCount++;
                        }
                    }
                }

                var leaderboards = patchData.ObjectValue.GetField("Leaderboards").ObjectArrayValue;
                if (leaderboards != null && leaderboards.Any())
                {
                    _gamesWithLeaderboards.Add(gameId);
                    leaderboardCount += leaderboards.Count();
                }

                var achievements = patchData.ObjectValue.GetField("Achievements").ObjectArrayValue;
                if (achievements != null && achievements.Any())
                {
                    _gamesWithAchievements.Add(gameId);
                    achievementCount += achievements.Count();

                    foreach (var achievement in achievements)
                    {
                        authors.Add(achievement.GetField("Author").StringValue);
                    }
                }

                systems.Add(patchData.ObjectValue.GetField("ConsoleID").IntegerValue.GetValueOrDefault());
            }

            SetValue(GameCountProperty, gameCount);
            SetValue(AchievementCountProperty, achievementCount);
            SetValue(AchievementGameCountProperty, _gamesWithAchievements.Count);
            SetValue(LeaderboardCountProperty, leaderboardCount);
            SetValue(LeaderboardGameCountProperty, _gamesWithLeaderboards.Count);
            SetValue(RichPresenceCountProperty, _gamesWithRichPresence.Count);
            SetValue(StaticRichPresenceCountProperty, staticRichPresenceCount);
            SetValue(AuthorCountProperty, authors.Count);
            SetValue(SystemCountProperty, systems.Count);

            SetValue(LastUpdatedTextProperty, (oldestFile != DateTime.MaxValue) ? oldestFile.ToLocalTime().ToString() : LastUpdatedTextProperty.DefaultValue);

            _progress.IsEnabled = false;
            _progress.Label     = String.Empty;

            if (DataRefreshed != null)
            {
                DataRefreshed(this, EventArgs.Empty);
            }
        }
Beispiel #2
0
        internal void RefreshFromServer()
        {
            var rand = new Random();

#if ONLY_WITH_HASHES
            var ids = new List <int>();
#else
            var minId = 1;
            var maxId = 0;
#endif

            var fileSystemService  = ServiceRepository.Instance.FindService <IFileSystemService>();
            var httpRequestService = ServiceRepository.Instance.FindService <IHttpRequestService>();

            if (_progress != null)
            {
                _progress.IsEnabled = true;
                _progress.Reset(1000);
                _progress.Label = "Fetching data...";
            }

            // fetch all games that have hashes associated to them (can't earn achievements without a hash)
            {
                var data   = RAWebCache.Instance.GetAllHashes();
                var json   = new Jamiras.IO.Serialization.JsonObject(data);
                var hashes = json.GetField("MD5List").ObjectValue;
                foreach (var pair in hashes)
                {
#if ONLY_WITH_HASHES
                    if (!ids.Contains(pair.IntegerValue.GetValueOrDefault()))
                    {
                        ids.Add(pair.IntegerValue.GetValueOrDefault());
                    }
#else
                    if (pair.IntegerValue.GetValueOrDefault() > maxId)
                    {
                        maxId = pair.IntegerValue.GetValueOrDefault();
                    }
#endif
                }
            }

#if ONLY_WITH_HASHES
            ids.Sort();

            if (_progress != null)
            {
                _progress.Reset(ids.Count);
            }

            foreach (var gameId in ids)
#else
            if (_progress != null)
            {
                _progress.Reset(maxId - minId + 1);
            }

            for (var gameId = minId; gameId <= maxId; ++gameId)
#endif
            {
                if (_progress != null)
                {
                    if (!_progress.IsEnabled) // error encountered
                    {
                        return;
                    }

                    _progress.Current++;
                }

                RefreshFromServer(gameId, fileSystemService, httpRequestService);

                System.Threading.Thread.Sleep(rand.Next(300) + 100);
            }

            // download completed, refresh the stats
            if (_progress != null)
            {
                LoadFromDisk();
            }
        }
Beispiel #3
0
        private void DoSearch()
        {
            var criteria = new SearchCriteria();

            ((RangeFilterFieldViewModel)NumConditions).Parse(out criteria.NumConditions, out criteria.NumConditionsComparison);
            ((RangeFilterFieldViewModel)NumAltGroups).Parse(out criteria.NumAltGroups, out criteria.NumAltGroupsComparison);

            criteria.Flag       = (RequirementType)Flag.SelectedId;
            criteria.SourceType = (FieldType)SourceType.SelectedId;
            ((RangeFilterFieldViewModel)SourceValue).Parse(out criteria.SourceValue, out criteria.SourceValueComparison);
            criteria.Comparison = (RequirementOperator)Comparison.SelectedId;
            criteria.TargetType = (FieldType)TargetType.SelectedId;
            ((RangeFilterFieldViewModel)TargetValue).Parse(out criteria.TargetValue, out criteria.TargetValueComparison);
            ((RangeFilterFieldViewModel)HitCount).Parse(out criteria.HitCount, out criteria.HitCountComparison);

            var directory = _settings.DumpDirectory;

            var filesToRead = 0;

            if (IsCoreAchievementsScanned || IsNonCoreAchievementsScanned)
            {
                filesToRead += Snapshot.AchievementGameCount;
            }
            if (IsLeaderboardCancelScanned || IsLeaderboardStartScanned || IsLeaderboardSubmitScanned)
            {
                filesToRead += Snapshot.LeaderboardGameCount;
            }
            if (IsRichPresenceScanned)
            {
                filesToRead += Snapshot.RichPresenceCount;
            }

            Progress.Reset(filesToRead);
            Progress.IsEnabled = true;

            var results = new List <Result>();

            if (IsCoreAchievementsScanned || IsNonCoreAchievementsScanned)
            {
                Progress.Label = "Processing Achievements...";

                foreach (var gameId in Snapshot.GamesWithAchievements)
                {
                    Progress.Current++;
                    if (!Progress.IsEnabled)
                    {
                        break;
                    }

                    var file      = Path.Combine(directory, gameId + ".json");
                    var contents  = File.ReadAllText(file);
                    var json      = new Jamiras.IO.Serialization.JsonObject(contents);
                    var patchData = json.GetField("PatchData");

                    var achievements = patchData.ObjectValue.GetField("Achievements").ObjectArrayValue;
                    if (achievements == null)
                    {
                        continue;
                    }

                    var gameName = patchData.ObjectValue.GetField("Title").StringValue;

                    foreach (var achievement in achievements)
                    {
                        var flags = achievement.GetField("Flags").IntegerValue;
                        if (!IsCoreAchievementsScanned)
                        {
                            if (flags == 3)
                            {
                                continue;
                            }
                        }
                        else if (!IsNonCoreAchievementsScanned)
                        {
                            if (flags != 3)
                            {
                                continue;
                            }
                        }

                        var memAddr = achievement.GetField("MemAddr").StringValue;
                        if (Matches(memAddr, criteria))
                        {
                            results.Add(new Result
                            {
                                GameId        = gameId,
                                GameName      = gameName,
                                AchievementId = achievement.GetField("ID").IntegerValue.GetValueOrDefault(),
                                ItemName      = achievement.GetField("Title").StringValue,
                                Details       = memAddr,
                                IsUnofficial  = flags == 5
                            });
                        }
                    }
                }
            }

            if (IsLeaderboardStartScanned || IsLeaderboardSubmitScanned || IsLeaderboardCancelScanned)
            {
                Progress.Label = "Processing Leaderboards...";

                foreach (var gameId in Snapshot.GamesWithLeaderboards)
                {
                    Progress.Current++;
                    if (!Progress.IsEnabled)
                    {
                        break;
                    }

                    var file      = Path.Combine(directory, gameId + ".json");
                    var contents  = File.ReadAllText(file);
                    var json      = new Jamiras.IO.Serialization.JsonObject(contents);
                    var patchData = json.GetField("PatchData");

                    var leaderboards = patchData.ObjectValue.GetField("Leaderboards").ObjectArrayValue;
                    if (leaderboards == null)
                    {
                        continue;
                    }

                    var gameName = patchData.ObjectValue.GetField("Title").StringValue;

                    foreach (var leaderboard in leaderboards)
                    {
                        var details = String.Empty;

                        var token   = Token.Empty;
                        var memAddr = leaderboard.GetField("Mem").StringValue;
                        foreach (var part in Tokenizer.Split(memAddr, ':'))
                        {
                            if (part == "STA" && IsLeaderboardStartScanned)
                            {
                                token = part;
                                continue;
                            }
                            if (part == "CAN" && IsLeaderboardCancelScanned)
                            {
                                token = part;
                                continue;
                            }
                            if (part == "SUB" && IsLeaderboardSubmitScanned)
                            {
                                token = part;
                                continue;
                            }
                            if (token.IsEmpty)
                            {
                                continue;
                            }

                            if (Matches(part.ToString(), criteria))
                            {
                                if (details.Length > 0)
                                {
                                    details += ", ";
                                }
                                details += token.ToString();
                                details += ':';
                                details += part.ToString();
                            }

                            token = Token.Empty;
                        }

                        if (details.Length > 0)
                        {
                            results.Add(new Result
                            {
                                GameId        = gameId,
                                GameName      = gameName,
                                LeaderboardId = leaderboard.GetField("ID").IntegerValue.GetValueOrDefault(),
                                ItemName      = "Leaderboard: " + leaderboard.GetField("Title").StringValue,
                                Details       = details,
                            });
                        }
                    }
                }
            }

            if (IsRichPresenceScanned)
            {
                Progress.Label = "Processing Rich Presence...";

                foreach (var gameId in Snapshot.GamesWithRichPresence)
                {
                    Progress.Current++;
                    if (!Progress.IsEnabled)
                    {
                        break;
                    }

                    var file      = Path.Combine(directory, gameId + ".json");
                    var contents  = File.ReadAllText(file);
                    var json      = new Jamiras.IO.Serialization.JsonObject(contents);
                    var patchData = json.GetField("PatchData");

                    var richPresence = patchData.ObjectValue.GetField("RichPresencePatch").StringValue;
                    if (richPresence != null)
                    {
                        int index = richPresence.IndexOf("Display:");
                        if (index != -1)
                        {
                            var details = String.Empty;

                            foreach (var line in richPresence.Substring(index).Split('\n'))
                            {
                                if (line.Trim().Length == 0)
                                {
                                    break;
                                }

                                if (line.StartsWith("?"))
                                {
                                    index = line.IndexOf('?', 1);
                                    if (index != -1)
                                    {
                                        var memAddr = line.Substring(1, index - 1);
                                        if (Matches(memAddr, criteria))
                                        {
                                            if (details.Length > 0)
                                            {
                                                details += ", ";
                                            }
                                            details += '?';
                                            details += memAddr;
                                            details += '?';
                                        }
                                    }
                                }
                            }

                            if (details.Length > 0)
                            {
                                results.Add(new Result
                                {
                                    GameId   = gameId,
                                    GameName = patchData.ObjectValue.GetField("Title").StringValue,
                                    ItemName = "Rich Presence",
                                    Details  = details,
                                });
                            }
                        }
                    }
                }
            }

            if (Progress.IsEnabled)
            {
                results.Sort((l, r) =>
                {
                    var diff = String.Compare(l.GameName, r.GameName);
                    if (diff == 0)
                    {
                        diff = String.Compare(l.ItemName, r.ItemName);
                    }

                    return(diff);
                });

                _backgroundWorkerService.InvokeOnUiThread(() =>
                {
                    Results.Clear();
                    foreach (var result in results)
                    {
                        Results.Add(result);
                    }
                });

                Progress.IsEnabled = false;
                Progress.Label     = String.Empty;
            }
        }