*/ use HasApiTokens, HasFactory, LogsActivity, Notifiable, TwoFactorAuthenticatable; public $timestamps = false; protected $guarded = ['id']; protected $hidden = ['id', 'password', 'remember_token']; protected function casts(): array { return [ 'email_verified_at' => 'datetime', 'password' => 'hashed', 'hidden_staff' => 'boolean', 'online' => 'boolean', ]; } /** * @return HasMany */ public function currencies(): HasMany { return $this->hasMany(UserCurrency::class, 'user_id'); } /** * @return HasMany */ public function sessions(): HasMany { return $this->hasMany(Session::class); } public function currency(string $currency): int { if (! $this->relationLoaded('currencies')) { $this->load('currencies'); } $type = match ($currency) { 'duckets' => 0, 'diamonds' => 5, 'points' => 101, default => 0, }; $currency = $this->currencies->where('type', $type)->first(); return $currency ? $currency->amount : 0; } /** * @return HasOne */ public function permission(): HasOne { return $this->hasOne(Permission::class, 'id', 'rank'); } /** * @return HasMany */ public function articles(): HasMany { return $this->hasMany(WebsiteArticle::class); } /** * @return HasOne */ public function referrals(): HasOne { return $this->hasOne(UserReferral::class); } /** * @return HasMany */ public function userReferrals(): HasMany { return $this->hasMany(Referral::class); } /** * @return HasMany */ public function claimedReferralLog(): HasMany { return $this->hasMany(ClaimedReferralLog::class); } /** * @return HasMany */ public function badges(): HasMany { return $this->hasMany(UserBadge::class); } /** * @return HasMany */ public function rooms(): HasMany { return $this->hasMany(Room::class, 'owner_id'); } /** * @return HasMany */ public function friends(): HasMany { return $this->hasMany(MessengerFriendship::class, 'user_one_id'); } public function referralsNeeded(): int { $referrals = 0; if (! is_null($this->referrals)) { $referrals = $this->referrals->referrals_total; } return (int) setting('referrals_needed') - $referrals; } /** * @return HasOne */ public function ban(): HasOne { return $this->hasOne(Ban::class, 'user_id')->where('ban_expire', '>', time())->whereIn('type', ['account', 'super']); } /** * @return HasOne */ public function settings(): HasOne { return $this->hasOne(UserSetting::class); } public function ssoTicket(): string { $sso = sprintf('%s-%s', Str::replace(' ', '', setting('hotel_name')), Str::uuid()); if (User::where('auth_ticket', $sso)->exists()) { return $this->ssoTicket(); } $this->update([ 'auth_ticket' => $sso, ]); return $sso; } /** * @return HasOne */ public function betaCode(): HasOne { return $this->hasOne(WebsiteBetaCode::class); } /** * @return BelongsTo */ public function team(): BelongsTo { return $this->belongsTo(WebsiteTeam::class, 'team_id'); } /** * @return HasMany */ public function applications(): HasMany { return $this->hasMany(WebsiteStaffApplications::class, 'user_id'); } /** * @return HasOne */ public function hcSubscription(): HasOne { return $this->hasOne(UserSubscription::class); } /** * @return HasMany */ public function articleComments(): HasMany { return $this->hasMany(WebsiteArticleComment::class); } /** * @return HasMany */ public function transactions(): HasMany { return $this->hasMany(WebsitePaypalTransaction::class); } /** * @return HasMany */ public function usedShopVouchers(): HasMany { return $this->hasMany(WebsiteUsedShopVoucher::class); } /** * @return HasMany */ public function items(): HasMany { return $this->hasMany(Item::class, 'user_id'); } /** * @return HasMany */ public function tickets(): HasMany { return $this->hasMany(WebsiteHelpCenterTicket::class); } /** * @return HasMany */ public function photos(): HasMany { return $this->hasMany(CameraWeb::class); } /** * @return HasMany */ public function profileGuestbook(): HasMany { return $this->hasMany(WebsiteUserGuestbook::class, 'profile_id'); } /** * @return HasMany */ public function guestbook(): HasMany { return $this->hasMany(WebsiteUserGuestbook::class, 'user_id'); } /** * @return HasMany */ public function chatLogs(): HasMany { return $this->hasMany(ChatlogRoom::class, 'user_from_id'); } /** * @return HasMany */ public function chatLogsPrivate(): HasMany { return $this->hasMany(ChatlogPrivate::class, 'user_from_id'); } /** * @return \Illuminate\Database\Eloquent\Collection */ public function getOnlineFriends(int $total = 10): \Illuminate\Database\Eloquent\Collection { /** @var \Illuminate\Database\Eloquent\Collection $friends */ $friends = $this->friends() ->select(['user_two_id', 'users.id', 'users.username', 'users.look', 'users.motto', 'users.last_online']) ->join('users', 'users.id', '=', 'user_two_id') ->where('users.online', '1') ->inRandomOrder() ->limit($total) ->get(); return $friends; } public function confirmTwoFactorAuthentication(string $code): bool { $secret = $this->two_factor_secret; if (! is_string($secret)) { return false; } $decrypted = decrypt($secret); if (! is_string($decrypted)) { return false; } $codeIsValid = app(TwoFactorAuthenticationProvider::class) ->verify($decrypted, $code); if (! $codeIsValid) { return false; } $this->update([ 'two_factor_confirmed' => true, ]); return true; } public function hasAppliedForPosition(int $rankId): bool { return $this->applications()->where('rank_id', '=', $rankId)->exists(); } public function changePassword(string $newPassword): void { $this->password = Hash::make($newPassword); $this->save(); } public function getFilamentName(): string { return $this->username ?? 'Guest'; } public function canAccessPanel(Panel $panel): bool { return (bool) hasHousekeepingPermission('can_access_housekeeping'); } public function getActivitylogOptions(): LogOptions { return LogOptions::defaults() ->logOnly(['id', 'username', 'motto', 'rank', 'credits']) ->logOnlyDirty() ->dontSubmitEmptyLogs(); } #[\Override] public function save(array $options = []) { if (! $this->isDirty()) { return false; } return parent::save($options); } }