Initial commit

This commit is contained in:
root
2026-05-09 17:28:23 +02:00
commit 9d73f82529
5575 changed files with 281989 additions and 0 deletions
@@ -0,0 +1,139 @@
<?php
namespace App\Filament\Resources\User\Users\RelationManagers;
use App\Filament\Tables\Columns\HabboBadgeColumn;
use App\Filament\Traits\TranslatableResource;
use App\Models\Game\Player\UserBadge;
use App\Models\User;
use App\Services\RconService;
use Filament\Actions\CreateAction;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class BadgesRelationManager extends RelationManager
{
use TranslatableResource;
#[\Override]
protected static string $relationship = 'badges';
#[\Override]
protected static ?string $recordTitleAttribute = 'badge_code';
protected static ?string $translateIdentifier = 'badges';
#[\Override]
public function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('badge_code')
->label(__('filament::resources.inputs.badge_code'))
->required()
->maxLength(255)
->columnSpanFull(),
]);
}
public function table(Table $table): Table
{
return $table
->modifyQueryUsing(fn ($query) => $query->latest('id'))
->columns([
TextColumn::make('id')
->label(__('filament::resources.columns.id')),
HabboBadgeColumn::make('badge')
->alignCenter()
->label(__('filament::resources.columns.image')),
TextColumn::make('badge_code')
->label(__('filament::resources.columns.badge_code'))
->searchable(),
IconColumn::make('slot_id')
->label(__('filament::resources.columns.equipped'))
->icon(fn ($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,
]),
])
->filters([
//
])
->headerActions([
CreateAction::make()
->before(function (CreateAction $action, RelationManager $livewire): void {
/** @var User $user */
$user = $livewire->getOwnerRecord();
$hasRconEnabled = config('hotel.rcon.enabled');
if (! $user->online) {
return;
}
if (! $hasRconEnabled) {
Notification::make()
->danger()
->title('RCON is not enabled!')
->body("You can't send badges to online users if RCON is not enabled.")
->persistent()
->send();
} else {
$rcon = app(RconService::class);
$data = $action->getFormData();
$rcon->sendSafelyFromDashboard('sendBadge', [$user, $data['badge_code']], 'RCON: Failed to send the badge');
}
$action->cancel();
}),
])
->recordActions([
DeleteAction::make()
->before(fn (DeleteAction $action, RelationManager $livewire) => self::onDeleteBadgeAction($action, $livewire)),
])
->toolbarActions([
DeleteBulkAction::make()
->before(fn (DeleteBulkAction $action, RelationManager $livewire) => self::onDeleteBadgeAction($action, $livewire)),
]);
}
public static function onDeleteBadgeAction(DeleteAction|DeleteBulkAction $action, RelationManager $livewire): void
{
/** @var User $user */
$user = $livewire->getOwnerRecord();
$hasRconEnabled = config('hotel.rcon.enabled');
if (! $user->online) {
return;
}
if (! $hasRconEnabled) {
Notification::make()
->danger()
->title('RCON is not enabled!')
->body("You can't remove badges to online users if RCON is not enabled.")
->persistent()
->send();
} else {
$rcon = app(RconService::class);
$badge = $action instanceof DeleteAction
? $action->getRecord()?->badge_code
: $action->getRecords()->map(fn (UserBadge $record) => $record->badge_code)->join(';');
$rcon->sendSafelyFromDashboard('removeBadge', [$user, $badge], 'RCON: Failed to remove the badge');
}
$action->cancel();
}
}
@@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
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\Table;
class ChatLogPrivateRelationManager extends RelationManager
{
#[\Override]
protected static string $relationship = 'chatLogsPrivate';
protected static $targetResource = ChatlogPrivateResource::class;
#[\Override]
public function form(Schema $schema): Schema
{
return $schema;
}
public function table(Table $table): Table
{
return $table->columns(ChatlogPrivateResource::getTable())
->defaultSort('timestamp', 'desc');
}
}
@@ -0,0 +1,30 @@
<?php
declare(strict_types=1);
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\Table;
class ChatLogRelationManager extends RelationManager
{
#[\Override]
protected static string $relationship = 'chatLogs';
protected static $targetResource = ChatlogRoomResource::class;
#[\Override]
public function form(Schema $schema): Schema
{
return $schema;
}
public function table(Table $table): Table
{
return $table->columns(ChatlogRoomResource::getTable())
->defaultSort('timestamp', 'desc');
}
}
@@ -0,0 +1,192 @@
<?php
namespace App\Filament\Resources\User\Users\RelationManagers;
use App\Filament\Traits\TranslatableResource;
use App\Models\User;
use Carbon\CarbonInterval;
use Filament\Actions\Action;
use Filament\Actions\EditAction;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Schemas\Components\Tabs;
use Filament\Schemas\Components\Tabs\Tab;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
class SettingsRelationManager extends RelationManager
{
use TranslatableResource;
#[\Override]
protected static string $relationship = 'settings';
protected static string $translateIdentifier = 'settings';
#[\Override]
public function form(Schema $schema): Schema
{
return $schema
->components([
Tabs::make('Settings')
->schema([
Tab::make(__('filament::resources.tabs.Account Data'))
->schema([
TextInput::make('achievement_score')
->label(__('filament::resources.inputs.achievement_score'))
->disabled()
->required(),
TextInput::make('respects_received')
->label(__('filament::resources.inputs.respects_received'))
->disabled()
->required(),
Select::make('can_trade')
->native(false)
->label(__('filament::resources.inputs.can_trade'))
->options([
'0' => __('filament::resources.common.No'),
'1' => __('filament::resources.common.Yes'),
])
->required(),
Select::make('block_following')
->native(false)
->label(__('filament::resources.inputs.block_following'))
->options([
'0' => __('filament::resources.common.No'),
'1' => __('filament::resources.common.Yes'),
])
->required(),
Select::make('block_friendrequests')
->native(false)
->label(__('filament::resources.inputs.block_friendrequests'))
->options([
'0' => __('filament::resources.common.No'),
'1' => __('filament::resources.common.Yes'),
])
->required(),
Select::make('block_roominvites')
->native(false)
->label(__('filament::resources.inputs.block_roominvites'))
->options([
'0' => __('filament::resources.common.No'),
'1' => __('filament::resources.common.Yes'),
])
->required(),
TextInput::make('max_rooms')
->label(__('filament::resources.inputs.max_rooms'))
->numeric()
->required(),
TextInput::make('max_friends')
->label(__('filament::resources.inputs.max_friends'))
->numeric()
->required(),
])
->columns(['sm' => 2]),
Tab::make(__('filament::resources.tabs.Extra Settings'))
->schema([
Select::make('old_chat')
->native(false)
->label(__('filament::resources.inputs.old_chat'))
->options([
'0' => __('filament::resources.common.No'),
'1' => __('filament::resources.common.Yes'),
])
->required(),
Select::make('block_camera_follow')
->native(false)
->label(__('filament::resources.inputs.block_camera_follow'))
->options([
'0' => __('filament::resources.common.No'),
'1' => __('filament::resources.common.Yes'),
])
->required(),
Select::make('ignore_bots')
->native(false)
->label(__('filament::resources.inputs.ignore_bots'))
->options([
'0' => __('filament::resources.common.No'),
'1' => __('filament::resources.common.Yes'),
])
->required(),
Select::make('ignore_pets')
->native(false)
->label(__('filament::resources.inputs.ignore_pets'))
->options([
'0' => __('filament::resources.common.No'),
'1' => __('filament::resources.common.Yes'),
])
->required(),
])->columns(['sm' => 2]),
])->columnSpanFull(),
]);
}
public function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('achievement_score')
->label(__('filament::resources.columns.achievement_score'))
->toggleable(),
TextColumn::make('respects_received')
->label(__('filament::resources.columns.respects_received'))
->toggleable(),
TextColumn::make('online_time')
->label(__('filament::resources.columns.online_time'))
->formatStateUsing(fn (string $state) => __(':m minutes', ['m' => round(CarbonInterval::seconds($state)->totalMinutes)]))
->toggleable(),
IconColumn::make('can_trade')
->label(__('filament::resources.columns.can_trade'))
->icon(fn (string $state) => $state === '1' ? 'heroicon-o-check-circle' : 'heroicon-o-x-circle')
->colors([
'success' => '1',
'danger' => '0',
]),
IconColumn::make('can_change_name')
->label(__('filament::resources.columns.can_change_name'))
->icon(fn (string $state) => $state === '1' ? 'heroicon-o-check-circle' : 'heroicon-o-x-circle')
->colors([
'success' => '1',
'danger' => '0',
]),
])
->filters([
//
])
->headerActions([
Action::make('helper')
->label('Settings Tip')
->icon('heroicon-o-exclamation-triangle')
->tooltip('You can only change the offline user settings.')
->extraAttributes(['style' => 'cursor: default !important']),
])
->recordActions([
EditAction::make()
->disabled(function (RelationManager $livewire): bool {
/** @var User $user */
$user = $livewire->getOwnerRecord();
return $user->online;
}),
])
->toolbarActions([]);
}
}