From 1d5e35b3ec38ee6653b05185def597abb25983c1 Mon Sep 17 00:00:00 2001 From: Jamiras Date: Wed, 13 May 2026 13:37:43 +0000 Subject: [PATCH 1/6] add user filter to sentry page --- .../Actions/BuildConnectSniffsAction.php | 11 +++++-- resources/views/pages-legacy/sentry.blade.php | 29 +++++++++++-------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/app/Connect/Actions/BuildConnectSniffsAction.php b/app/Connect/Actions/BuildConnectSniffsAction.php index 1f490ac225..b764c90399 100644 --- a/app/Connect/Actions/BuildConnectSniffsAction.php +++ b/app/Connect/Actions/BuildConnectSniffsAction.php @@ -13,7 +13,7 @@ class BuildConnectSniffsAction { - public function execute(Carbon $date, array &$clients): array + public function execute(?Carbon $date, array &$clients, ?string $username = null): array { $sniffs = []; $usernames = []; @@ -22,8 +22,13 @@ public function execute(Carbon $date, array &$clients): array $userAgentService = new UserAgentService(); $entries = ConnectWarning::query() - ->where('created_at', '>=', $date->clone()->startOfDay()) - ->where('created_at', '<=', $date->clone()->endOfDay()) + ->when($date != null, function($query) use ($date) { + $query->where('created_at', '>=', $date->clone()->startOfDay()) + ->where('created_at', '<=', $date->clone()->endOfDay()); + }) + ->when(!empty($username), function($query) use ($username) { + $query->where('username', $username); + }) ->with('playerSession', 'playerSession.gameHash') ->orderBy('created_at') ->get(); diff --git a/resources/views/pages-legacy/sentry.blade.php b/resources/views/pages-legacy/sentry.blade.php index 4b7874ebdf..26e18299a4 100644 --- a/resources/views/pages-legacy/sentry.blade.php +++ b/resources/views/pages-legacy/sentry.blade.php @@ -52,22 +52,27 @@ function key_to_class(?string $key): string if ($selected) { $date = Carbon::parse(substr($selected, 7)); $sniffs = (new BuildConnectSniffsAction())->execute($date, $clients); +} else { + $user = requestInputSanitized('user'); + if ($user) { + $sniffs = (new BuildConnectSniffsAction())->execute(null, $clients, $user); + } +} - foreach ($sniffs as $sniff) { - $user_counts[$sniff['user']] = ($user_counts[$sniff['user']] ?? 0) + 1; - $method_counts[$sniff['method']] = ($method_counts[$sniff['method']] ?? 0) + 1; +foreach ($sniffs as $sniff) { + $user_counts[$sniff['user']] = ($user_counts[$sniff['user']] ?? 0) + 1; + $method_counts[$sniff['method']] = ($method_counts[$sniff['method']] ?? 0) + 1; - foreach ($sniff['smells'] as $smell) { - $smell_counts[$smell] = ($smell_counts[$smell] ?? 0) + 1; - } + foreach ($sniff['smells'] as $smell) { + $smell_counts[$smell] = ($smell_counts[$smell] ?? 0) + 1; } - - ksort($user_counts); - ksort($method_counts); - ksort($smell_counts); - sort($clients); } +ksort($user_counts); +ksort($method_counts); +ksort($smell_counts); +sort($clients); + $colors = [ 'bad_validation' => [ // validation hash did not match expected values 'background' => 'orange', @@ -123,7 +128,7 @@ function key_to_class(?string $key): string - +

From 216897f5b4f6e804028c6b0dd85ebb24b3e7c0c7 Mon Sep 17 00:00:00 2001 From: Jamiras Date: Wed, 13 May 2026 13:48:05 +0000 Subject: [PATCH 2/6] add link to sentry in user moderation tools --- .../views/components/user/profile/moderation-tools.blade.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/resources/views/components/user/profile/moderation-tools.blade.php b/resources/views/components/user/profile/moderation-tools.blade.php index 3883e79ccc..096e584d41 100644 --- a/resources/views/components/user/profile/moderation-tools.blade.php +++ b/resources/views/components/user/profile/moderation-tools.blade.php @@ -2,6 +2,7 @@ use App\Community\Enums\CommentableType; use App\Community\Enums\UserAction; use App\Enums\Permissions; +use App\Models\ConnectWarning; ?> @props([ @@ -27,6 +28,7 @@ $hasPatreonBadge = HasPatreonBadge($targetUser); $hasCertifiedLegendBadge = HasCertifiedLegendBadge($targetUser); +$hasConnectSmells = ConnectWarning::where('username', $targetUsername)->orWhere('username', $targetUser->display_name)->exists(); ?> {{-- TODO port to Filament and delete component --}} @@ -103,6 +105,9 @@ class="bg-embed hidden border-x border-b border-text-muted py-2 px-4 w-[calc(100 {{ $isTargetUserUntracked ? 'Untracked User' : 'Tracked User' }} + @if ($hasConnectSmells) + - Connect Smells + @endif From 79afda591a4f50a97b4648f8a22880c9c1746545 Mon Sep 17 00:00:00 2001 From: Jamiras Date: Wed, 13 May 2026 13:53:50 +0000 Subject: [PATCH 3/6] add tests --- .../Connect/BuildConnectSniffsTest.php | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/Feature/Connect/BuildConnectSniffsTest.php b/tests/Feature/Connect/BuildConnectSniffsTest.php index 19e9ad23a6..0cb58fb342 100644 --- a/tests/Feature/Connect/BuildConnectSniffsTest.php +++ b/tests/Feature/Connect/BuildConnectSniffsTest.php @@ -243,6 +243,42 @@ public static function createAchievementWarning( $this->assertNull($sniffs[0]['userinfo']['unranked_at']); }); + test('only for user by display_name', function () { + $leaderboard1 = Leaderboard::factory()->create(); + $user1 = User::factory()->create(['username' => 'UserName', 'display_name' => 'DisplayName']); + $entry1 = BuildConnectSniffsTestHelpers::createLeaderboardWarning($user1->display_name, $leaderboard1, 1234); + $entry2 = BuildConnectSniffsTestHelpers::createLeaderboardWarning('Player1', $leaderboard1, 1234); + + $clients = []; + $sniffs = (new BuildConnectSniffsAction())->execute(null, $clients, 'DisplayName'); + $this->assertEquals(1, count($sniffs)); + $this->assertEquals($user1->display_name, $sniffs[0]['user']); + $this->assertEquals($user1->id, $sniffs[0]['userinfo']['id']); + $this->assertEquals($user1->username, $sniffs[0]['userinfo']['username']); + $this->assertEquals($user1->display_name, $sniffs[0]['userinfo']['display_name']); + $this->assertEquals($user1->Permissions, $sniffs[0]['userinfo']['Permissions']); + $this->assertNull($sniffs[0]['userinfo']['deleted_at']); + $this->assertNull($sniffs[0]['userinfo']['unranked_at']); + }); + + test('only for user by username', function () { + $leaderboard1 = Leaderboard::factory()->create(); + $user1 = User::factory()->create(['username' => 'UserName', 'display_name' => 'DisplayName']); + $entry1 = BuildConnectSniffsTestHelpers::createLeaderboardWarning($user1->username, $leaderboard1, 1234); + $entry2 = BuildConnectSniffsTestHelpers::createLeaderboardWarning('Player1', $leaderboard1, 1234); + + $clients = []; + $sniffs = (new BuildConnectSniffsAction())->execute(null, $clients, 'UserName'); + $this->assertEquals(1, count($sniffs)); + $this->assertEquals($user1->username, $sniffs[0]['user']); + $this->assertEquals($user1->id, $sniffs[0]['userinfo']['id']); + $this->assertEquals($user1->username, $sniffs[0]['userinfo']['username']); + $this->assertEquals($user1->display_name, $sniffs[0]['userinfo']['display_name']); + $this->assertEquals($user1->Permissions, $sniffs[0]['userinfo']['Permissions']); + $this->assertNull($sniffs[0]['userinfo']['deleted_at']); + $this->assertNull($sniffs[0]['userinfo']['unranked_at']); + }); + test('session data', function () { $game1 = Game::factory()->create(); $gameHash1 = GameHash::factory()->create(['game_id' => $game1->id]); From 418f38ff2f7b80e287484d17fb5045998913141c Mon Sep 17 00:00:00 2001 From: Jamiras Date: Wed, 13 May 2026 13:58:50 +0000 Subject: [PATCH 4/6] composer fix --- app/Connect/Actions/BuildConnectSniffsAction.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Connect/Actions/BuildConnectSniffsAction.php b/app/Connect/Actions/BuildConnectSniffsAction.php index b764c90399..a3f66c281e 100644 --- a/app/Connect/Actions/BuildConnectSniffsAction.php +++ b/app/Connect/Actions/BuildConnectSniffsAction.php @@ -22,11 +22,11 @@ public function execute(?Carbon $date, array &$clients, ?string $username = null $userAgentService = new UserAgentService(); $entries = ConnectWarning::query() - ->when($date != null, function($query) use ($date) { + ->when($date != null, function ($query) use ($date) { $query->where('created_at', '>=', $date->clone()->startOfDay()) ->where('created_at', '<=', $date->clone()->endOfDay()); }) - ->when(!empty($username), function($query) use ($username) { + ->when(!empty($username), function ($query) use ($username) { $query->where('username', $username); }) ->with('playerSession', 'playerSession.gameHash') From 770ec7067abd6c0bda1626483e0848093fb6603b Mon Sep 17 00:00:00 2001 From: Jamiras Date: Wed, 13 May 2026 14:05:24 +0000 Subject: [PATCH 5/6] fix title for user page --- resources/views/pages-legacy/sentry.blade.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/views/pages-legacy/sentry.blade.php b/resources/views/pages-legacy/sentry.blade.php index 26e18299a4..9bfbd96e54 100644 --- a/resources/views/pages-legacy/sentry.blade.php +++ b/resources/views/pages-legacy/sentry.blade.php @@ -53,9 +53,9 @@ function key_to_class(?string $key): string $date = Carbon::parse(substr($selected, 7)); $sniffs = (new BuildConnectSniffsAction())->execute($date, $clients); } else { - $user = requestInputSanitized('user'); - if ($user) { - $sniffs = (new BuildConnectSniffsAction())->execute(null, $clients, $user); + $selected = requestInputSanitized('user'); + if ($selected) { + $sniffs = (new BuildConnectSniffsAction())->execute(null, $clients, $selected); } } @@ -128,7 +128,7 @@ function key_to_class(?string $key): string

- +

From 59cc9841b574bd03f38b5f8f0d61f43d7c58fd95 Mon Sep 17 00:00:00 2001 From: Jamiras Date: Mon, 18 May 2026 16:19:12 +0000 Subject: [PATCH 6/6] address feedback --- app/Connect/Actions/BuildConnectSniffsAction.php | 9 ++------- .../components/user/profile/moderation-tools.blade.php | 6 +++--- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/app/Connect/Actions/BuildConnectSniffsAction.php b/app/Connect/Actions/BuildConnectSniffsAction.php index a3f66c281e..9b7ee8c50f 100644 --- a/app/Connect/Actions/BuildConnectSniffsAction.php +++ b/app/Connect/Actions/BuildConnectSniffsAction.php @@ -22,13 +22,8 @@ public function execute(?Carbon $date, array &$clients, ?string $username = null $userAgentService = new UserAgentService(); $entries = ConnectWarning::query() - ->when($date != null, function ($query) use ($date) { - $query->where('created_at', '>=', $date->clone()->startOfDay()) - ->where('created_at', '<=', $date->clone()->endOfDay()); - }) - ->when(!empty($username), function ($query) use ($username) { - $query->where('username', $username); - }) + ->when($date != null, fn ($query) => $query->whereDate('created_at', $date)) + ->when(filled($username), fn ($query) => $query->where('username', $username)) ->with('playerSession', 'playerSession.gameHash') ->orderBy('created_at') ->get(); diff --git a/resources/views/components/user/profile/moderation-tools.blade.php b/resources/views/components/user/profile/moderation-tools.blade.php index 096e584d41..393077abf8 100644 --- a/resources/views/components/user/profile/moderation-tools.blade.php +++ b/resources/views/components/user/profile/moderation-tools.blade.php @@ -28,7 +28,7 @@ $hasPatreonBadge = HasPatreonBadge($targetUser); $hasCertifiedLegendBadge = HasCertifiedLegendBadge($targetUser); -$hasConnectSmells = ConnectWarning::where('username', $targetUsername)->orWhere('username', $targetUser->display_name)->exists(); +$firstConnectSmell = ConnectWarning::where('username', $targetUsername)->orWhere('username', $targetUser->display_name)->first(); ?> {{-- TODO port to Filament and delete component --}} @@ -105,8 +105,8 @@ class="bg-embed hidden border-x border-b border-text-muted py-2 px-4 w-[calc(100 {{ $isTargetUserUntracked ? 'Untracked User' : 'Tracked User' }} - @if ($hasConnectSmells) - - Connect Smells + @if ($firstConnectSmell) + - Connect Smells @endif