🆙 More fixes 🆙

This commit is contained in:
Remco
2026-01-20 17:11:21 +01:00
parent a628b140c1
commit d3ef41c9dd
7 changed files with 97 additions and 16 deletions
@@ -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');
}
@@ -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');
}
}
@@ -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');
}
}
@@ -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);
}
+32
View File
@@ -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();
}
}
}
+1
View File
@@ -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
+1
View File
@@ -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