Refactor room visibility logic: enhance filtering criteria for public rooms and update related comments for clarity

This commit is contained in:
Alexa
2026-06-05 20:52:35 +03:00
parent 3aa5739691
commit 399930c6ab
3 changed files with 40 additions and 30 deletions
@@ -134,14 +134,18 @@ public class PublicSiteController(
{ {
var clamped = Math.Clamp(take, 1, 50); var clamped = Math.Clamp(take, 1, 50);
var qq = (q ?? string.Empty).Trim(); var qq = (q ?? string.Empty).Trim();
// Public rooms list: hide dorms (per-player private space), and // Public rooms list: hide archived, private/friends-only,
// hide rooms that have only ever been visited by their creator // dorm, and admin-hidden rows. Also hide rooms that have only
// (VisitorCount < 2). This keeps "^dwadwad" style throwaway // ever been visited by their creator (VisitorCount < 2). This
// builds off the public-facing site without an explicit // keeps throwaway builds off the public-facing site without an
// "publish" toggle. Admins can still see them via the Rooms // explicit "publish" toggle. Admins can still see them via the
// admin page and delete them from there if they want. // Rooms admin page and delete them from there if they want.
var rows = await db.Rooms var rows = await db.Rooms
.Where(r => !r.IsDormRoom && r.VisitorCount >= 2 && .Where(r => r.State == 0 &&
r.Accessibility == 1 &&
!r.IsDormRoom &&
!r.HiddenFromBrowse &&
r.VisitorCount >= 2 &&
(qq == "" || r.Name.Contains(qq) || r.Description.Contains(qq))) (qq == "" || r.Name.Contains(qq) || r.Description.Contains(qq)))
.OrderByDescending(r => r.HotScore) .OrderByDescending(r => r.HotScore)
.Take(clamped) .Take(clamped)
@@ -171,7 +175,11 @@ public class PublicSiteController(
public async Task<IActionResult> Stats() public async Task<IActionResult> Stats()
{ {
var playerCount = await db.Players.CountAsync(); var playerCount = await db.Players.CountAsync();
var roomCount = await db.Rooms.CountAsync(r => !r.IsDormRoom); var roomCount = await db.Rooms.CountAsync(r =>
r.State == 0 &&
r.Accessibility == 1 &&
!r.IsDormRoom &&
!r.HiddenFromBrowse);
var photoCount = await db.Photos.CountAsync(p => p.IsPublic && p.DeletedAt == null); var photoCount = await db.Photos.CountAsync(p => p.IsPublic && p.DeletedAt == null);
var inventionCount = await db.Inventions.CountAsync(i => !i.IsDeleted); var inventionCount = await db.Inventions.CountAsync(i => !i.IsDeleted);
return Ok(new { playerCount, roomCount, photoCount, inventionCount }); return Ok(new { playerCount, roomCount, photoCount, inventionCount });
@@ -212,7 +220,11 @@ public class PublicSiteController(
.Select(p => new { p.Id, p.Username, p.DisplayName, p.ProfileImageName }) .Select(p => new { p.Id, p.Username, p.DisplayName, p.ProfileImageName })
.ToListAsync(); .ToListAsync();
var rooms = await db.Rooms var rooms = await db.Rooms
.Where(r => roomIds.Contains(r.Id)) .Where(r => roomIds.Contains(r.Id) &&
r.State == 0 &&
r.Accessibility == 1 &&
!r.IsDormRoom &&
!r.HiddenFromBrowse)
.Select(r => new { r.Id, r.Name }) .Select(r => new { r.Id, r.Name })
.ToListAsync(); .ToListAsync();
+2 -18
View File
@@ -2043,15 +2043,6 @@
"item_outfit_type": 0, "item_outfit_type": 0,
"mask_guid": "" "mask_guid": ""
}, },
{
"swatch_name": "CheerDress_Blue_Swatch",
"swatch_guid": "faedf215-289b-40f7-90cc-f5b98517d133",
"color": "Blue",
"item_name": "(FemaleCheerTorso)",
"item_guid": "657efe89-620a-46a2-8b58-cafd855c7cd5",
"item_outfit_type": 101,
"mask_guid": "93987d32-7a6e-45df-af56-76f912969ce7"
},
{ {
"swatch_name": "PirateCaptain_Hat_SRank_Swatch", "swatch_name": "PirateCaptain_Hat_SRank_Swatch",
"swatch_guid": "jQwNBXyoU0Gk4FyNw6jFxg", "swatch_guid": "jQwNBXyoU0Gk4FyNw6jFxg",
@@ -2385,15 +2376,6 @@
"item_outfit_type": 0, "item_outfit_type": 0,
"mask_guid": "efeb07ab-6253-436d-bb66-991ddad72e58" "mask_guid": "efeb07ab-6253-436d-bb66-991ddad72e58"
}, },
{
"swatch_name": "CheerDress_Red_Swatch",
"swatch_guid": "1773d5d8-4714-4721-b30c-97e25d6f2a5a",
"color": "Red",
"item_name": "(FemaleCheerTorso)",
"item_guid": "657efe89-620a-46a2-8b58-cafd855c7cd5",
"item_outfit_type": 101,
"mask_guid": "93987d32-7a6e-45df-af56-76f912969ce7"
},
{ {
"swatch_name": "Golfer_Glove_Blue_Swatch", "swatch_name": "Golfer_Glove_Blue_Swatch",
"swatch_guid": "32a5e42d-2b60-40b1-a145-ed96fc91af8e", "swatch_guid": "32a5e42d-2b60-40b1-a145-ed96fc91af8e",
@@ -3837,6 +3819,7 @@
"Cyber_Junk_City_Swatch", "Cyber_Junk_City_Swatch",
"BicycleJacket_DarkBlue_Swatch", "BicycleJacket_DarkBlue_Swatch",
"Torso_SeaCaptainBlueWhite_Swatch", "Torso_SeaCaptainBlueWhite_Swatch",
"CheerDress_Blue_Swatch",
"Denim_Swatch", "Denim_Swatch",
"RoyalLady_Contest_White_Swatch", "RoyalLady_Contest_White_Swatch",
"Neck_VampiteHunter_Diamond_Swatch", "Neck_VampiteHunter_Diamond_Swatch",
@@ -3852,6 +3835,7 @@
"GoldYellow_Swatch", "GoldYellow_Swatch",
"Happy_Tree_Purple_Swatch", "Happy_Tree_Purple_Swatch",
"Barber_Torso_Green_Swatch", "Barber_Torso_Green_Swatch",
"CheerDress_Red_Swatch",
"TShirt_RECS_Logo_Blue_Swatch", "TShirt_RECS_Logo_Blue_Swatch",
"Scout_Shirt_Blue_Swatch", "Scout_Shirt_Blue_Swatch",
"Windbreaker_Wrist_Red_Swatch", "Windbreaker_Wrist_Red_Swatch",
+17 -3
View File
@@ -558,11 +558,18 @@ public class RoomService(DorkNetDbContext db)
// and have no business appearing in the watch's public room // and have no business appearing in the watch's public room
// browser (Trending / Search / BaseRooms all reach this query). // browser (Trending / Search / BaseRooms all reach this query).
// Same filter applied below to SearchAsync and CreatedByAsync. // Same filter applied below to SearchAsync and CreatedByAsync.
// Accessibility=1 is Public. Private/Friends-only rooms should
// still be reachable by direct goto/invite/owned-room APIs, but
// must not leak into public discovery.
// HiddenFromBrowse keeps admin-utility rooms (MakerRoom, // HiddenFromBrowse keeps admin-utility rooms (MakerRoom,
// EventRoom) and rooms-folded-into-others (Paintball maps, // EventRoom) and rooms-folded-into-others (Paintball maps,
// LaserTag Hangar) out of every public discovery surface. // LaserTag Hangar) out of every public discovery surface.
// /goto-by-name and admin tools still find them via GetByNameAsync. // /goto-by-name and admin tools still find them via GetByNameAsync.
IQueryable<RoomEntity> q = db.Rooms.Where(r => r.State == 0 && !r.IsDormRoom && !r.HiddenFromBrowse); IQueryable<RoomEntity> q = db.Rooms.Where(r =>
r.State == 0 &&
r.Accessibility == 1 &&
!r.IsDormRoom &&
!r.HiddenFromBrowse);
if (!string.IsNullOrWhiteSpace(tag)) if (!string.IsNullOrWhiteSpace(tag))
{ {
var bareTag = tag.TrimStart('#').Trim(); var bareTag = tag.TrimStart('#').Trim();
@@ -621,7 +628,11 @@ public class RoomService(DorkNetDbContext db)
if (accountId is long aid) if (accountId is long aid)
{ {
return await db.Rooms return await db.Rooms
.Where(r => r.CreatorPlayerId == aid && !r.IsDormRoom && r.State == 0) .Where(r => r.CreatorPlayerId == aid &&
r.State == 0 &&
r.Accessibility == 1 &&
!r.IsDormRoom &&
!r.HiddenFromBrowse)
.OrderByDescending(r => r.UpdatedAt) .OrderByDescending(r => r.UpdatedAt)
.Take(take) .Take(take)
.ToListAsync(); .ToListAsync();
@@ -634,7 +645,10 @@ public class RoomService(DorkNetDbContext db)
var needle = $"%{query}%"; var needle = $"%{query}%";
return await db.Rooms return await db.Rooms
.Where(r => r.State == 0 && !r.IsDormRoom && !r.HiddenFromBrowse && ( .Where(r => r.State == 0 &&
r.Accessibility == 1 &&
!r.IsDormRoom &&
!r.HiddenFromBrowse && (
EF.Functions.Like(r.Name, needle) || EF.Functions.Like(r.Name, needle) ||
EF.Functions.Like(r.Description, needle) || EF.Functions.Like(r.Description, needle) ||
EF.Functions.Like(r.TagsCsv, needle))) EF.Functions.Like(r.TagsCsv, needle)))