hasMany(Ban::class); } public function playerData(): PlayerData|Model { // Shared Lock alone didn't prevent sometimes duplicate playerData entries. // Hopefully this lock will work. $lock = Cache::lock(static::PLAYER_DATA_LOCK . $this->id, 5); try { $lock->block(5); $playerData = $this->hasOne(PlayerData::class)->sharedLock()->firstOrCreate(); $lock->release(); return $playerData; } catch (LockTimeoutException $e) { Log::channel('daily')->emergency('Could not Acquire Player data lock, this should not happen.'); } return $this->hasOne(PlayerData::class)->sharedLock()->firstOrCreate(); } public function games(): BelongsToMany { return $this->belongsToMany(Game::class)->withPivot('side')->withTimestamps(); } public function activeGames(): BelongsToMany { return $this->belongsToMany(Game::class) ->withPivot('side') ->whereIn('status', [MatchStatus::Created->value, MatchStatus::Opened->value])->withTimestamps(); } public function inboxMessages(): HasMany { return $this->hasMany(InboxMessage::class); } public static function findBySteamID(int $steamId): User|null { return static::where('steam_id', $steamId)->first(); } }