示例#1
0
        public async Task <NexusApiClient.GetModFilesResponse> GetModFiles(string GameName, string ModId)
        {
            var result = await Db.NexusModFiles.FindOneAsync(info => info.Game == GameName && info.ModId == ModId);

            string method = "CACHED";

            if (result == null)
            {
                var api = await NexusApiClient.Get(Request.Headers["apikey"].FirstOrDefault());

                var path = $"/v1/games/{GameName}/mods/{ModId}/files.json";
                var body = await api.Get <NexusApiClient.GetModFilesResponse>(path);

                result = new NexusCacheData <NexusApiClient.GetModFilesResponse>
                {
                    Data = body, Path = path, Game = GameName, ModId = ModId
                };
                try
                {
                    await Db.NexusModFiles.InsertOneAsync(result);
                }
                catch (MongoWriteException)
                {
                }

                method = "NOT_CACHED";
            }

            Response.Headers.Add("x-cache-result", method);
            return(result.Data);
        }
示例#2
0
        public override async Task <JobResult> Execute(SqlService sql, AppSettings settings)
        {
            var api = await NexusApiClient.Get();

            var gameTasks = GameRegistry.Games.Values
                            .Where(game => game.NexusName != null)
                            .Select(async game =>
            {
                var mods = await api.Get <List <NexusUpdateEntry> >(
                    $"https://api.nexusmods.com/v1/games/{game.NexusName}/mods/updated.json?period=1m");

                var entry  = new NexusCacheData <List <NexusUpdateEntry> >();
                entry.Game = game.NexusName;
                entry.Path = $"/v1/games/{game.NexusName}/mods/updated.json?period=1m";
                entry.Data = mods;

                return(game, mods);
            })
                            .Select(async rTask =>
            {
                var(game, mods) = await rTask;
                return(mods.Select(mod => new { game = game, mod = mod }));
            }).ToList();

            Utils.Log($"Getting update list for {gameTasks.Count} games");

            var purge = (await Task.WhenAll(gameTasks))
                        .SelectMany(i => i)
                        .ToList();

            Utils.Log($"Found {purge.Count} updated mods in the last month");
            using (var queue = new WorkQueue())
            {
                var collected = purge.Select(d =>
                {
                    var a = d.mod.LatestFileUpdate.AsUnixTime();
                    // Mod activity could hide files
                    var b = d.mod.LastestModActivity.AsUnixTime();

                    return(new { Game = d.game.Game, Date = (a > b ? a : b), ModId = d.mod.ModId });
                });

                var purged = await collected.PMap(queue, async t =>
                {
                    var resultA = await sql.DeleteNexusModInfosUpdatedBeforeDate(t.Game, t.ModId, t.Date);
                    var resultB = await sql.DeleteNexusModFilesUpdatedBeforeDate(t.Game, t.ModId, t.Date);
                    return(resultA + resultB);
                });

                Utils.Log($"Purged {purged.Sum()} cache entries");
            }

            return(JobResult.Success());
        }