Skip to content

Commit baaf851

Browse files
authored
Improve result filter initialization, add new filters (#926)
This PR renames `LevelFilterSettings` to `ResultFilterSettings`, adds new filters to that class and implements most of them (those being lbp3-exclusive filters like adventure filtering and the result types to filter, which is why I renamed the class, aswell as filtering levels which require move controllers), and splits the constructor into static initialization classes, one for API requests and one for game requests. The new filters I added currently only work for game requests, not for API requests, to not make this PR too long.
2 parents c5f8a92 + 7fbee47 commit baaf851

File tree

17 files changed

+319
-217
lines changed

17 files changed

+319
-217
lines changed

Refresh.Database/Extensions/LevelEnumerableExtensions.cs

Lines changed: 59 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -45,20 +45,6 @@ public static IQueryable<GameLevel> FilterByLevelFilterSettings(this IQueryable<
4545
if ((user is { ShowReuploadedContent: false } && levelFilterSettings.ShowReuploadedLevels != true) || levelFilterSettings.ShowReuploadedLevels == false)
4646
levels = levels.Where(l => !l.IsReUpload);
4747

48-
// Don't allow beta builds to use this filtering option
49-
// If the client specifies this option then it will filter out *all* levels.
50-
if (levelFilterSettings.GameVersion != TokenGame.BetaBuild)
51-
{
52-
levels = levelFilterSettings.GameFilterType switch {
53-
GameFilterType.LittleBigPlanet1 => levels.Where(l => l.GameVersion == TokenGame.LittleBigPlanet1),
54-
GameFilterType.LittleBigPlanet2 => levels.Where(l => l.GameVersion == TokenGame.LittleBigPlanet2),
55-
//NOTE: ideally this should be .Where(l => l._GameVersion == TokenGame.LittleBigPlane1 || l._GameVersion == TokenGame.LittleBigPlane2)
56-
// however, there should be no differences in all real-world cases
57-
GameFilterType.Both => levels,
58-
_ => throw new ArgumentOutOfRangeException(),
59-
};
60-
}
61-
6248
if (levelFilterSettings.Players != 0)
6349
levels = levels.Where(l => l.MaxPlayers >= levelFilterSettings.Players && l.MinPlayers <= levelFilterSettings.Players);
6450

@@ -68,14 +54,36 @@ public static IQueryable<GameLevel> FilterByLevelFilterSettings(this IQueryable<
6854
if (!levelFilterSettings.DisplayVita) levels = levels.Where(l => l.GameVersion != TokenGame.LittleBigPlanetVita);
6955
if (!levelFilterSettings.DisplayPSP) levels = levels.Where(l => l.GameVersion != TokenGame.LittleBigPlanetPSP);
7056
if (!levelFilterSettings.DisplayBeta) levels = levels.Where(l => l.GameVersion != TokenGame.BetaBuild);
71-
72-
//TODO: store move compatibility for levels
73-
// levels = levelFilterSettings.MoveFilterType switch {
74-
// MoveFilterType.True => levels,
75-
// MoveFilterType.Only => levels.Where(l => l.MoveCompatible),
76-
// MoveFilterType.False => levels.Where(l => !l.MoveCompatible),
77-
// _ => throw new ArgumentOutOfRangeException()
78-
// };
57+
58+
switch(levelFilterSettings.DisplayAdventures)
59+
{
60+
case PropertyFilterType.Include:
61+
// Do nothing
62+
break;
63+
case PropertyFilterType.Only:
64+
levels = levels.Where(l => l.IsAdventure == true);
65+
break;
66+
case PropertyFilterType.Exclude:
67+
levels = levels.Where(l => l.IsAdventure == false);
68+
break;
69+
default:
70+
throw new ArgumentOutOfRangeException(nameof(levelFilterSettings.DisplayAdventures), levelFilterSettings.DisplayAdventures, "Unsupported value");
71+
}
72+
73+
switch(levelFilterSettings.DisplayMoveLevels)
74+
{
75+
case PropertyFilterType.Include:
76+
// Do nothing
77+
break;
78+
case PropertyFilterType.Only:
79+
levels = levels.Where(l => l.RequiresMoveController == true);
80+
break;
81+
case PropertyFilterType.Exclude:
82+
levels = levels.Where(l => l.RequiresMoveController == false);
83+
break;
84+
default:
85+
throw new ArgumentOutOfRangeException(nameof(levelFilterSettings.DisplayMoveLevels), levelFilterSettings.DisplayMoveLevels, "Unsupported value");
86+
}
7987

8088
// Filter out sub levels that weren't published by self
8189
levels = levels.Where(l => !l.IsSubLevel || l.Publisher == user);
@@ -95,20 +103,6 @@ public static IEnumerable<GameLevel> FilterByLevelFilterSettings(this IEnumerabl
95103
if ((user is { ShowReuploadedContent: false } && levelFilterSettings.ShowReuploadedLevels != true) || levelFilterSettings.ShowReuploadedLevels == false)
96104
levels = levels.Where(l => !l.IsReUpload);
97105

98-
// Don't allow beta builds to use this filtering option
99-
// If the client specifies this option then it will filter out *all* levels.
100-
if (levelFilterSettings.GameVersion != TokenGame.BetaBuild)
101-
{
102-
levels = levelFilterSettings.GameFilterType switch {
103-
GameFilterType.LittleBigPlanet1 => levels.Where(l => l.GameVersion == TokenGame.LittleBigPlanet1),
104-
GameFilterType.LittleBigPlanet2 => levels.Where(l => l.GameVersion == TokenGame.LittleBigPlanet2),
105-
//NOTE: ideally this should be .Where(l => l._GameVersion == TokenGame.LittleBigPlane1 || l._GameVersion == TokenGame.LittleBigPlane2)
106-
// however, there should be no differences in all real-world cases
107-
GameFilterType.Both => levels,
108-
_ => throw new ArgumentOutOfRangeException(),
109-
};
110-
}
111-
112106
if (levelFilterSettings.Players != 0)
113107
levels = levels.Where(l => l.MaxPlayers >= levelFilterSettings.Players && l.MinPlayers <= levelFilterSettings.Players);
114108

@@ -118,14 +112,36 @@ public static IEnumerable<GameLevel> FilterByLevelFilterSettings(this IEnumerabl
118112
if (!levelFilterSettings.DisplayVita) levels = levels.Where(l => l.GameVersion != TokenGame.LittleBigPlanetVita);
119113
if (!levelFilterSettings.DisplayPSP) levels = levels.Where(l => l.GameVersion != TokenGame.LittleBigPlanetPSP);
120114
if (!levelFilterSettings.DisplayBeta) levels = levels.Where(l => l.GameVersion != TokenGame.BetaBuild);
115+
116+
switch(levelFilterSettings.DisplayAdventures)
117+
{
118+
case PropertyFilterType.Include:
119+
// Do nothing
120+
break;
121+
case PropertyFilterType.Only:
122+
levels = levels.Where(l => l.IsAdventure == true);
123+
break;
124+
case PropertyFilterType.Exclude:
125+
levels = levels.Where(l => l.IsAdventure == false);
126+
break;
127+
default:
128+
throw new ArgumentOutOfRangeException(nameof(levelFilterSettings.DisplayAdventures), levelFilterSettings.DisplayAdventures, "Unsupported value");
129+
}
121130

122-
//TODO: store move compatibility for levels
123-
// levels = levelFilterSettings.MoveFilterType switch {
124-
// MoveFilterType.True => levels,
125-
// MoveFilterType.Only => levels.Where(l => l.MoveCompatible),
126-
// MoveFilterType.False => levels.Where(l => !l.MoveCompatible),
127-
// _ => throw new ArgumentOutOfRangeException()
128-
// };
131+
switch(levelFilterSettings.DisplayMoveLevels)
132+
{
133+
case PropertyFilterType.Include:
134+
// Do nothing
135+
break;
136+
case PropertyFilterType.Only:
137+
levels = levels.Where(l => l.RequiresMoveController == true);
138+
break;
139+
case PropertyFilterType.Exclude:
140+
levels = levels.Where(l => l.RequiresMoveController == false);
141+
break;
142+
default:
143+
throw new ArgumentOutOfRangeException(nameof(levelFilterSettings.DisplayMoveLevels), levelFilterSettings.DisplayMoveLevels, "Unsupported value");
144+
}
129145

130146
// Filter out sub levels that weren't published by self
131147
levels = levels.Where(l => !l.IsSubLevel || l.Publisher == user);

Refresh.Database/Query/GameFilterType.cs

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)