Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Refresh.Core/Types/Categories/CategoryService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ namespace Refresh.Core.Types.Categories;
public class CategoryService : EndpointService
{
// Level Categories
public readonly FrozenSet<GameLevelCategory> LevelCategories;
public readonly FrozenSet<GameCategory> LevelCategories;

// ReSharper disable once InconsistentNaming
private readonly List<GameLevelCategory> _levelCategories =
private readonly List<GameCategory> _levelCategories =
[
new CoolLevelsCategory(),
new TeamPickedLevelsCategory(),
Expand All @@ -38,10 +38,10 @@ public class CategoryService : EndpointService
];

// User Categories
public readonly FrozenSet<GameUserCategory> UserCategories;
public readonly FrozenSet<GameCategory> UserCategories;

// ReSharper disable once InconsistentNaming
private readonly List<GameUserCategory> _userCategories =
private readonly List<GameCategory> _userCategories =
[
new HeartedUsersByUserCategory(),
new MostHeartedUsersCategory(),
Expand Down
35 changes: 35 additions & 0 deletions Refresh.Core/Types/Categories/DatabaseResultList.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using Refresh.Database;
using Refresh.Database.Models.Levels;
using Refresh.Database.Models.Playlists;
using Refresh.Database.Models.Users;

namespace Refresh.Core.Types.Categories;

public class DatabaseResultList
{
public DatabaseList<GameLevel>? Levels { get; set; } = null;
public DatabaseList<GameUser>? Users { get; set; } = null;
public DatabaseList<GamePlaylist>? Playlists { get; set; } = null;

/// <summary>
/// All items in total
/// </summary>
public int TotalItems => (Levels?.TotalItems ?? 0)
+ (Users?.TotalItems ?? 0)
+ (Playlists?.TotalItems ?? 0);

public DatabaseResultList(DatabaseList<GameLevel> levels)
{
Levels = levels;
}

public DatabaseResultList(DatabaseList<GameUser> users)
{
Users = users;
}

public DatabaseResultList(DatabaseList<GamePlaylist> playlists)
{
Playlists = playlists;
}
}
11 changes: 10 additions & 1 deletion Refresh.Core/Types/Categories/GameCategory.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
using Bunkum.Core;
using Refresh.Core.Types.Data;
using Refresh.Database.Models.Users;
using Refresh.Database.Query;

namespace Refresh.Core.Types.Categories;

[JsonObject(MemberSerialization.OptIn)]
Expand All @@ -8,11 +13,12 @@ public abstract class GameCategory
[JsonProperty] public string IconHash { get; set; } = "0";
[JsonProperty] public string FontAwesomeIcon { get; set; } = "faCertificate";
[JsonProperty] public bool Hidden { get; set; } = false;
public ResultType PrimaryResultType { get; set; }

[JsonProperty] public readonly bool RequiresUser;
[JsonProperty] public readonly string ApiRoute;
public readonly string[] GameRoutes;

internal GameCategory(string apiRoute, string gameRoute, bool requiresUser) : this(apiRoute, [gameRoute], requiresUser) {}
internal GameCategory(string apiRoute, string[] gameRoutes, bool requiresUser)
{
Expand All @@ -21,4 +27,7 @@ internal GameCategory(string apiRoute, string[] gameRoutes, bool requiresUser)

this.RequiresUser = requiresUser;
}

public abstract DatabaseResultList? Fetch(RequestContext context, int skip, int count, DataContext dataContext,
LevelFilterSettings levelFilterSettings, GameUser? user);
}
9 changes: 4 additions & 5 deletions Refresh.Core/Types/Categories/Levels/AdventureCategory.cs
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
using Bunkum.Core;
using Refresh.Core.Types.Data;
using Refresh.Database;
using Refresh.Database.Models.Levels;
using Refresh.Database.Models.Users;
using Refresh.Database.Query;

namespace Refresh.Core.Types.Categories.Levels;

public class AdventureCategory : GameLevelCategory
public class AdventureCategory : GameCategory
{
public AdventureCategory() : base("adventure", [], false)
{
this.Name = "Adventures";
this.Description = "Storylines and other big projects by the community.";
this.FontAwesomeIcon = "book-bookmark";
this.IconHash = "g820625";
this.PrimaryResultType = ResultType.Level; // Adventures are GameLevels
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, DataContext dataContext,
public override DatabaseResultList? Fetch(RequestContext context, int skip, int count, DataContext dataContext,
LevelFilterSettings levelFilterSettings, GameUser? _)
{
return dataContext.Database.GetAdventureLevels(count, skip, dataContext.User, levelFilterSettings);
return new(dataContext.Database.GetAdventureLevels(count, skip, dataContext.User, levelFilterSettings));
}
}
8 changes: 4 additions & 4 deletions Refresh.Core/Types/Categories/Levels/ByTagCategory.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
using Bunkum.Core;
using Refresh.Core.Types.Data;
using Refresh.Database;
using Refresh.Database.Models.Levels;
using Refresh.Database.Models.Users;
using Refresh.Database.Query;

namespace Refresh.Core.Types.Categories.Levels;

public class ByTagCategory : GameLevelCategory
public class ByTagCategory : GameCategory
{
internal ByTagCategory() : base("tag", "tag", false)
{
Expand All @@ -17,9 +16,10 @@ internal ByTagCategory() : base("tag", "tag", false)
this.IconHash = "g820605";
this.FontAwesomeIcon = "tag";
this.Hidden = true; // The by-tag category is not meant to be shown, as it requires a special implementation on all frontends
this.PrimaryResultType = ResultType.Level;
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count,
public override DatabaseResultList? Fetch(RequestContext context, int skip, int count,
DataContext dataContext,
LevelFilterSettings levelFilterSettings, GameUser? user)
{
Expand All @@ -33,6 +33,6 @@ internal ByTagCategory() : base("tag", "tag", false)
if (tag == null)
return null;

return dataContext.Database.GetLevelsByTag(count, skip, user, tag.Value, levelFilterSettings);
return new(dataContext.Database.GetLevelsByTag(count, skip, user, tag.Value, levelFilterSettings));
}
}
9 changes: 4 additions & 5 deletions Refresh.Core/Types/Categories/Levels/ByUserLevelCategory.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
using Bunkum.Core;
using Refresh.Core.Types.Data;
using Refresh.Database;
using Refresh.Database.Models.Levels;
using Refresh.Database.Models.Users;
using Refresh.Database.Query;

namespace Refresh.Core.Types.Categories.Levels;

public class ByUserLevelCategory : GameLevelCategory
public class ByUserLevelCategory : GameCategory
{
internal ByUserLevelCategory() : base("byUser", "by", true)
{
Expand All @@ -16,9 +14,10 @@ internal ByUserLevelCategory() : base("byUser", "by", true)
this.Description = "Levels you've shared with the community!";
this.IconHash = "g820625";
this.FontAwesomeIcon = "user";
this.PrimaryResultType = ResultType.Level;
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count,
public override DatabaseResultList? Fetch(RequestContext context, int skip, int count,
DataContext dataContext,
LevelFilterSettings levelFilterSettings, GameUser? user)
{
Expand All @@ -28,6 +27,6 @@ internal ByUserLevelCategory() : base("byUser", "by", true)

if (user == null) return null;

return dataContext.Database.GetLevelsByUser(user, count, skip, levelFilterSettings, dataContext.User);
return new(dataContext.Database.GetLevelsByUser(user, count, skip, levelFilterSettings, dataContext.User));
}
}
9 changes: 4 additions & 5 deletions Refresh.Core/Types/Categories/Levels/ContestCategory.cs
Original file line number Diff line number Diff line change
@@ -1,24 +1,23 @@
using Bunkum.Core;
using Refresh.Core.Types.Data;
using Refresh.Database;
using Refresh.Database.Models.Contests;
using Refresh.Database.Models.Levels;
using Refresh.Database.Models.Users;
using Refresh.Database.Query;

namespace Refresh.Core.Types.Categories.Levels;

public class ContestCategory : GameLevelCategory
public class ContestCategory : GameCategory
{
public ContestCategory() : base("contest", [], false)
{
this.Name = "Contests";
this.Description = "Levels from a contest.";
this.FontAwesomeIcon = "certificate";
this.IconHash = "g820608";
this.PrimaryResultType = ResultType.Level;
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, DataContext dataContext,
public override DatabaseResultList? Fetch(RequestContext context, int skip, int count, DataContext dataContext,
LevelFilterSettings levelFilterSettings, GameUser? _)
{
// try to find a contest by the query parameter
Expand All @@ -35,6 +34,6 @@ public ContestCategory() : base("contest", [], false)
if (contest == null)
return null;

return dataContext.Database.GetLevelsFromContest(contest, count, skip, dataContext.User, levelFilterSettings);
return new(dataContext.Database.GetLevelsFromContest(contest, count, skip, dataContext.User, levelFilterSettings));
}
}
9 changes: 4 additions & 5 deletions Refresh.Core/Types/Categories/Levels/CoolLevelsCategory.cs
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
using Bunkum.Core;
using Refresh.Core.Types.Data;
using Refresh.Database;
using Refresh.Database.Models.Levels;
using Refresh.Database.Models.Users;
using Refresh.Database.Query;

namespace Refresh.Core.Types.Categories.Levels;

public class CoolLevelsCategory : GameLevelCategory
public class CoolLevelsCategory : GameCategory
{
public CoolLevelsCategory() : base("coolLevels", ["lbpcool", "lbp2cool", "cool", "hot"], false)
{
this.Name = "Cool Levels";
this.Description = "Levels trending with players like you!";
this.FontAwesomeIcon = "fire";
this.IconHash = "g820625";
this.PrimaryResultType = ResultType.Level;
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, DataContext dataContext,
public override DatabaseResultList? Fetch(RequestContext context, int skip, int count, DataContext dataContext,
LevelFilterSettings levelFilterSettings, GameUser? _)
{
return dataContext.Database.GetCoolLevels(count, skip, dataContext.User, levelFilterSettings);
return new(dataContext.Database.GetCoolLevels(count, skip, dataContext.User, levelFilterSettings));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,18 @@

namespace Refresh.Core.Types.Categories.Levels;

public class CurrentlyPlayingCategory : GameLevelCategory
public class CurrentlyPlayingCategory : GameCategory
{
internal CurrentlyPlayingCategory() : base("currentlyPlaying", "busiest", false)
{
this.Name = "Popular Now";
this.Description = "Levels people are playing right now!";
this.IconHash = "g820602";
this.FontAwesomeIcon = "users";
this.PrimaryResultType = ResultType.Level;
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count,
public override DatabaseResultList? Fetch(RequestContext context, int skip, int count,
DataContext dataContext,
LevelFilterSettings levelFilterSettings, GameUser? _)
{
Expand All @@ -27,9 +28,9 @@ internal CurrentlyPlayingCategory() : base("currentlyPlaying", "busiest", false)
.GroupBy(r => dataContext.Database.GetLevelById(r.LevelId))
.OrderBy(r => r.Sum(room => room.PlayerIds.Count));

return new DatabaseList<GameLevel>(rooms.Select(r => r.Key)
return new(new DatabaseList<GameLevel>(rooms.Select(r => r.Key)
.Where(l => l != null && l.StoryId == 0)!
.FilterByLevelFilterSettings(dataContext.User, levelFilterSettings)
.FilterByGameVersion(levelFilterSettings.GameVersion), skip, count);
.FilterByGameVersion(levelFilterSettings.GameVersion), skip, count));
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
using Bunkum.Core;
using Refresh.Core.Types.Data;
using Refresh.Database;
using Refresh.Database.Models.Levels;
using Refresh.Database.Models.Users;
using Refresh.Database.Query;

namespace Refresh.Core.Types.Categories.Levels;

public class DeveloperLevelsCategory : GameLevelCategory
public class DeveloperLevelsCategory : GameCategory
{
internal DeveloperLevelsCategory() : base("developer", [], false)
{
Expand All @@ -16,10 +14,11 @@ internal DeveloperLevelsCategory() : base("developer", [], false)
this.FontAwesomeIcon = "certificate";
this.IconHash = "g820604";
this.Hidden = true; // TODO: Set to false when we import story level names
this.PrimaryResultType = ResultType.Level;
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count,
public override DatabaseResultList? Fetch(RequestContext context, int skip, int count,
DataContext dataContext,
LevelFilterSettings levelFilterSettings, GameUser? _)
=> dataContext.Database.GetDeveloperLevels(count, skip, levelFilterSettings);
=> new(dataContext.Database.GetDeveloperLevels(count, skip, levelFilterSettings));
}
21 changes: 0 additions & 21 deletions Refresh.Core/Types/Categories/Levels/GameLevelCategory.cs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,23 +1,22 @@
using Bunkum.Core;
using Refresh.Core.Types.Data;
using Refresh.Database;
using Refresh.Database.Models.Levels;
using Refresh.Database.Models.Users;
using Refresh.Database.Query;

namespace Refresh.Core.Types.Categories.Levels;

public class HeartedLevelsByUserCategory : GameLevelCategory
public class HeartedLevelsByUserCategory : GameCategory
{
internal HeartedLevelsByUserCategory() : base("hearted", "favouriteSlots", true)
{
this.Name = "My Favorites";
this.Description = "Your personal list filled with your favourite levels!";
this.FontAwesomeIcon = "heart";
this.IconHash = "g820611";
this.PrimaryResultType = ResultType.Level;
}

public override DatabaseList<GameLevel>? Fetch(RequestContext context, int skip, int count, DataContext dataContext,
public override DatabaseResultList? Fetch(RequestContext context, int skip, int count, DataContext dataContext,
LevelFilterSettings levelFilterSettings, GameUser? user)
{
// Prefer username from query, but fallback to user passed into this category if it's missing
Expand All @@ -26,6 +25,6 @@ internal HeartedLevelsByUserCategory() : base("hearted", "favouriteSlots", true)

if (user == null) return null;

return dataContext.Database.GetLevelsFavouritedByUser(user, count, skip, levelFilterSettings, dataContext.User);
return new(dataContext.Database.GetLevelsFavouritedByUser(user, count, skip, levelFilterSettings, dataContext.User));
}
}
Loading