Пример #1
0
        public async Task <ActionResult> Get()
        {
            DogStatsd.Increment("beatmap.searches");
            if (!GlobalConfig.EnableSearch)
            {
                return(Unauthorized("Searches are currently Disabled!"));
            }

            var raw  = Request.Query.ContainsKey("raw");
            var ruri = Request.Query.ContainsKey("ruri");

            TryGetFromQuery(new[] { "query", "q" }, string.Empty, out var query);
            TryGetFromQuery(new[] { "amount", "a" }, 100, out var amount);
            TryGetFromQuery(new[] { "offset", "o" }, 0, out var offset);
            TryGetFromQuery(new[] { "page", "p" }, 0, out var page);
            TryGetFromQuery(new[] { "mode", "m" }, (int)PlayMode.All, out var mode);
            TryGetFromQuery(new[] { "status", "r" }, null, out int?r);

            if (ruri && r.HasValue)
            {
                r = r switch {
                    4 => (int)BeatmapSetOnlineStatus.None,
                    0 => (int)BeatmapSetOnlineStatus.Ranked,
                    7 => (int)BeatmapSetOnlineStatus.Ranked,
                    8 => (int)BeatmapSetOnlineStatus.Loved,
                    3 => (int)BeatmapSetOnlineStatus.Qualified,
                    2 => (int)BeatmapSetOnlineStatus.Pending,
                    5 => (int)BeatmapSetOnlineStatus.Graveyard,

                    _ => (int)BeatmapSetOnlineStatus.Graveyard,
                };
            }

            BeatmapSetOnlineStatus?status = null;

            if (r != null)
            {
                status = (BeatmapSetOnlineStatus)r.Value;
            }

            offset += 100 * page;

            if (query.ToLower().Equals("newest") ||
                query.ToLower().Equals("top rated") || // TODO: Implementing this
                query.ToLower().Equals("most played")) // and this
            {
                query = "";
            }

            var ha = "pisstaube:cache:search" + query + amount + offset + status + mode + page + raw;

            var ca = await _cache.GetStringAsync(ha);

            if (ca != null)
            {
                return(Ok(ca));
            }

            var result = await _searchEngine.Search(query, amount, offset, status, (PlayMode)mode);

            var beatmapSets = result as BeatmapSet[] ?? result.ToArray();

            if (beatmapSets.Length == 0)
            {
                result = null;                          // Cheesegull logic ^^,
            }
            if (!raw)
            {
                ca = JsonUtil.Serialize(beatmapSets);
            }
            else
            {
                if (result == null)
                {
                    ca = "-1\nNo Beatmaps were found!";

                    goto Return;
                }

                ca = beatmapSets.Length >= 100
                    ? "101"
                    : beatmapSets.Length + "\n";

                foreach (var set in beatmapSets)
                {
                    ca += set.ToDirect();
                }
            }

Return:
            await _cache.SetStringAsync(ha, ca, new DistributedCacheEntryOptions
            {
                AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(10)
            });

            return(Ok(ca));
        }
Пример #2
0
        public ActionResult <string> Get()
        {
            DogStatsd.Increment("beatmap.searches");
            if (!GlobalConfig.EnableSearch)
            {
                return(Unauthorized("Searches are currently Disabled!"));
            }

            var raw  = Request.Query.ContainsKey("raw");
            var ruri = Request.Query.ContainsKey("ruri");

            GetTryFromQuery(new[] { "query", "q" }, string.Empty, out var query);
            GetTryFromQuery(new[] { "amount", "a" }, 100, out var amount);
            GetTryFromQuery(new[] { "offset", "o" }, 0, out var offset);
            GetTryFromQuery(new[] { "page", "p" }, 0, out var page);
            GetTryFromQuery(new[] { "mode", "m" }, (int)PlayMode.All, out var mode);
            GetTryFromQuery(new[] { "status", "r" }, null, out int?r);

            if (ruri == true && r.HasValue)
            {
                r = r switch {
                    4 => (int)BeatmapSetOnlineStatus.None,
                    0 => (int)BeatmapSetOnlineStatus.Ranked,
                    7 => (int)BeatmapSetOnlineStatus.Ranked,
                    8 => (int)BeatmapSetOnlineStatus.Loved,
                    3 => (int)BeatmapSetOnlineStatus.Qualified,
                    2 => (int)BeatmapSetOnlineStatus.Pending,
                    5 => (int)BeatmapSetOnlineStatus.Graveyard,
                };
            }

            BeatmapSetOnlineStatus?status = null;

            if (r != null)
            {
                status = (BeatmapSetOnlineStatus)r.Value;
            }

            offset += 100 * page;

            MapSearchType searchType = MapSearchType.Normal;

            if (query.ToLower().Equals("newest"))
            {
                searchType = MapSearchType.Newest;
            }
            else if (query.ToLower().Equals("most played"))
            {
                searchType = MapSearchType.TopPlays;
            }

            var ha = query + amount + offset + status + mode + page + raw;

            if (_cache.TryGet(ha, out string ca))
            {
                return(ca);
            }

            var result = _searchEngine.Search(query, amount, offset, status, (PlayMode)mode, searchType);

            var beatmapSets = result as BeatmapSet[] ?? result.ToArray();

            if (beatmapSets.Length == 0)
            {
                result = null;                          // Cheesegull logic ^^,
            }
            if (!raw)
            {
                ca = JsonUtil.Serialize(beatmapSets);
            }
            else
            {
                if (result == null)
                {
                    ca = "-1\nNo Beatmaps were found!";

                    goto Return;
                }

                ca = string.Empty;

                ca += beatmapSets.Count() >= 100 ? "101" : beatmapSets.Count().ToString();

                ca += "\n";

                foreach (var set in beatmapSets)
                {
                    ca += set.ToDirect();
                }
            }

Return:
            _cache.Set(ha, ca, TimeSpan.FromMinutes(10));
            return(ca);
        }