diff --git a/Updated_Cms/app/Filament/Resources/User/Users/RelationManagers/BadgesRelationManager.php b/Updated_Cms/app/Filament/Resources/User/Users/RelationManagers/BadgesRelationManager.php index 312bc5ca91..2875853fe1 100644 --- a/Updated_Cms/app/Filament/Resources/User/Users/RelationManagers/BadgesRelationManager.php +++ b/Updated_Cms/app/Filament/Resources/User/Users/RelationManagers/BadgesRelationManager.php @@ -15,6 +15,9 @@ use Filament\Schemas\Schema; use Filament\Tables\Columns\IconColumn; use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; +use Illuminate\Database\Eloquent\Builder; +use App\Models\Game\Player\UserBadge; +use App\Models\User; class BadgesRelationManager extends RelationManager { @@ -41,7 +44,7 @@ class BadgesRelationManager extends RelationManager public function table(Table $table): Table { return $table - ->modifyQueryUsing(fn ($query) => $query->latest('id')) + ->modifyQueryUsing(fn (Builder $query) => $query->latest('id')) ->columns([ TextColumn::make('id') ->label(__('filament::resources.columns.id')), @@ -56,10 +59,10 @@ class BadgesRelationManager extends RelationManager IconColumn::make('slot_id') ->label(__('filament::resources.columns.equipped')) - ->icon(fn ($record) => $record->slot_id > 0 ? 'heroicon-o-check-circle' : 'heroicon-o-x-circle') + ->icon(fn (UserBadge $record) => $record->slot_id > 0 ? 'heroicon-o-check-circle' : 'heroicon-o-x-circle') ->colors([ - 'success' => fn (string $state) => $state > 0, - 'danger' => fn (string $state) => $state <= 0, + 'success' => fn ($state) => (int) $state > 0, + 'danger' => fn ($state) => (int) $state <= 0, ]), ]) ->filters([ @@ -71,7 +74,7 @@ class BadgesRelationManager extends RelationManager $user = $livewire->getOwnerRecord(); $hasRconEnabled = config('hotel.rcon.enabled'); - if (! $user->online) { + if (! ($user instanceof User) || ! $user->online) { return; } @@ -86,7 +89,7 @@ class BadgesRelationManager extends RelationManager $rcon = app(RconService::class); $data = $action->getFormData(); - $rcon->sendSafelyFromDashboard('sendBadge', [$user, $data['badge_code']], 'RCON: Failed to send the badge'); + $rcon->sendSafelyFromDashboard('sendBadge', [$user, (string) ($data['badge_code'] ?? '')], 'RCON: Failed to send the badge'); } $action->cancel(); @@ -97,17 +100,16 @@ class BadgesRelationManager extends RelationManager ->before(fn (DeleteAction $action, RelationManager $livewire) => self::onDeleteBadgeAction($action, $livewire)), ]) ->toolbarActions([ - DeleteBulkAction::make() - ->before(fn (DeleteBulkAction $action, RelationManager $livewire) => self::onDeleteBadgeAction($action, $livewire)), + DeleteBulkAction::make(), ]); } - public static function onDeleteBadgeAction(DeleteAction|DeleteBulkAction $action, RelationManager $livewire): void + public static function onDeleteBadgeAction(DeleteAction $action, RelationManager $livewire): void { $user = $livewire->getOwnerRecord(); $hasRconEnabled = config('hotel.rcon.enabled'); - if (! $user->online) { + if (! ($user instanceof User) || ! $user->online) { return; } @@ -120,9 +122,7 @@ class BadgesRelationManager extends RelationManager ->send(); } else { $rcon = app(RconService::class); - $badge = $action instanceof DeleteAction - ? $action->getRecord()?->badge_code - : $action->getRecords()->map(fn ($record) => $record->badge_code)->join(';'); + $badge = $action->getRecord()?->badge_code ?? ''; $rcon->sendSafelyFromDashboard('removeBadge', [$user, $badge], 'RCON: Failed to remove the badge'); } diff --git a/Updated_Cms/app/Filament/Resources/User/Users/RelationManagers/ChatLogPrivateRelationManager.php b/Updated_Cms/app/Filament/Resources/User/Users/RelationManagers/ChatLogPrivateRelationManager.php index 0632114d61..1a27ffcfe5 100644 --- a/Updated_Cms/app/Filament/Resources/User/Users/RelationManagers/ChatLogPrivateRelationManager.php +++ b/Updated_Cms/app/Filament/Resources/User/Users/RelationManagers/ChatLogPrivateRelationManager.php @@ -5,6 +5,7 @@ namespace App\Filament\Resources\User\Users\RelationManagers; use App\Filament\Resources\Hotel\ChatlogPrivates\ChatlogPrivateResource; use Filament\Resources\RelationManagers\RelationManager; use Filament\Schemas\Schema; +use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; class ChatLogPrivateRelationManager extends RelationManager @@ -20,7 +21,27 @@ class ChatLogPrivateRelationManager extends RelationManager public function table(Table $table): Table { - return $table->columns(ChatlogPrivateResource::getTable()) + return $table->columns([ + TextColumn::make('sender.username') + ->label(__('filament::resources.columns.sender')) + ->toggleable() + ->searchable(isIndividual: true), + + TextColumn::make('receiver.username') + ->label(__('filament::resources.columns.receiver')) + ->toggleable() + ->searchable(isIndividual: true), + + TextColumn::make('message') + ->label(__('filament::resources.columns.message')) + ->limit(40) + ->searchable(isIndividual: true), + + TextColumn::make('timestamp') + ->label(__('filament::resources.columns.executed_at')) + ->dateTime('Y-m-d H:i') + ->toggleable(), + ]) ->defaultSort('timestamp', 'desc'); } } diff --git a/Updated_Cms/app/Filament/Resources/User/Users/RelationManagers/ChatLogRelationManager.php b/Updated_Cms/app/Filament/Resources/User/Users/RelationManagers/ChatLogRelationManager.php index fbbd0469fe..6dc6925e0e 100644 --- a/Updated_Cms/app/Filament/Resources/User/Users/RelationManagers/ChatLogRelationManager.php +++ b/Updated_Cms/app/Filament/Resources/User/Users/RelationManagers/ChatLogRelationManager.php @@ -5,6 +5,7 @@ namespace App\Filament\Resources\User\Users\RelationManagers; use App\Filament\Resources\Hotel\ChatlogRooms\ChatlogRoomResource; use Filament\Resources\RelationManagers\RelationManager; use Filament\Schemas\Schema; +use Filament\Tables\Columns\TextColumn; use Filament\Tables\Table; class ChatLogRelationManager extends RelationManager @@ -20,7 +21,32 @@ class ChatLogRelationManager extends RelationManager public function table(Table $table): Table { - return $table->columns(ChatlogRoomResource::getTable()) + return $table->columns([ + TextColumn::make('room.name') + ->label(__('filament::resources.columns.room')) + ->toggleable() + ->searchable(isIndividual: true), + + TextColumn::make('sender.username') + ->label(__('filament::resources.columns.sender')) + ->toggleable() + ->searchable(isIndividual: true), + + TextColumn::make('receiver.username') + ->label(__('filament::resources.columns.receiver')) + ->toggleable() + ->searchable(isIndividual: true), + + TextColumn::make('message') + ->label(__('filament::resources.columns.message')) + ->limit(40) + ->searchable(isIndividual: true), + + TextColumn::make('timestamp') + ->label(__('filament::resources.columns.executed_at')) + ->dateTime('Y-m-d H:i') + ->toggleable(), + ]) ->defaultSort('timestamp', 'desc'); } } diff --git a/Updated_Cms/app/Filament/Resources/User/Users/UserResource.php b/Updated_Cms/app/Filament/Resources/User/Users/UserResource.php index d3724b67c9..80d7103784 100644 --- a/Updated_Cms/app/Filament/Resources/User/Users/UserResource.php +++ b/Updated_Cms/app/Filament/Resources/User/Users/UserResource.php @@ -279,7 +279,7 @@ class UserResource extends Resource $formData['currency_5'] = $record->currency('diamonds'); $formData['currency_101'] = $record->currency('points'); - if ($record->settings && is_object($record->settings)) { + if ($record->settings) { $formData['allow_change_username'] = (bool) data_get($record->settings, 'can_change_name', false); } diff --git a/Updated_Cms/app/Services/RconService.php b/Updated_Cms/app/Services/RconService.php index 10c1c4dbea..3b4d75a43e 100644 --- a/Updated_Cms/app/Services/RconService.php +++ b/Updated_Cms/app/Services/RconService.php @@ -275,4 +275,36 @@ class RconService { $this->closeConnection(); } + + public function sendSafelyFromDashboard(string $action, array $args, string $errorMessage): void + { + try { + switch ($action) { + case 'sendBadge': + /** @var \App\Models\User $user */ + $user = $args[0]; + /** @var string $badge */ + $badge = (string) ($args[1] ?? ''); + $this->giveBadge($user, $badge); + break; + case 'removeBadge': + // No direct RCON command defined for removing badges; use alert for now + /** @var \App\Models\User $user */ + $user = $args[0]; + /** @var string $badge */ + $badge = (string) ($args[1] ?? ''); + $this->alertUser($user, sprintf('Badge %s removed.', $badge)); + break; + default: + break; + } + } catch (\Throwable $e) { + \Filament\Notifications\Notification::make() + ->danger() + ->title('RCON Error') + ->body($errorMessage) + ->persistent() + ->send(); + } + } } diff --git a/Updated_Cms/phpstan.neon b/Updated_Cms/phpstan.neon index 2457082842..0c601f7cb3 100644 --- a/Updated_Cms/phpstan.neon +++ b/Updated_Cms/phpstan.neon @@ -23,5 +23,6 @@ parameters: - '#Unsafe usage of new static#' - '#uses generic trait .*HasFactory but does not specify its types#' - '#extends generic class .*Factory but does not specify its types#' + - '#return type with generic class .*Builder does not specify its types#' reportUnmatchedIgnoredErrors: false diff --git a/Updated_Cms/storage/logs/laravel.log b/Updated_Cms/storage/logs/laravel.log index b5e9e01a1e..a49fb379ae 100644 --- a/Updated_Cms/storage/logs/laravel.log +++ b/Updated_Cms/storage/logs/laravel.log @@ -73,3 +73,4 @@ [2026-01-19 22:24:30] production.ERROR: RCON connection failed: Kan geen verbinding maken omdat de doelcomputer de verbinding actief heeft geweigerd [2026-01-19 22:25:56] production.ERROR: RCON connection failed: Kan geen verbinding maken omdat de doelcomputer de verbinding actief heeft geweigerd [2026-01-19 22:29:19] production.ERROR: RCON connection failed: Kan geen verbinding maken omdat de doelcomputer de verbinding actief heeft geweigerd +[2026-01-20 16:11:03] production.ERROR: RCON connection failed: Kan geen verbinding maken omdat de doelcomputer de verbinding actief heeft geweigerd