public function scores($id)
{
$beatmap = Beatmap::findOrFail($id);
$mode = Request::input('mode', Beatmap::modeStr($beatmap->playmode));
$mods = Request::input('enabledMods');
$type = Request::input('type', 'global');
$user = Auth::user();
if (!is_array($mods)) {
$mods = [];
}
if ($type !== 'global' || !empty($mods)) {
if ($user === null || !$user->isSupporter()) {
return error_popup(trans('errors.supporter_only'));
}
}
try {
$query = $beatmap->scoresBest($mode)->defaultListing()->with('user');
} catch (\InvalidArgumentException $ex) {
return error_popup($ex->getMessage());
}
$query->withMods($mods);
switch ($type) {
case 'country':
$query->fromCountry($user->country_acronym);
break;
case 'friend':
$query->friendsOf($user);
break;
}
$scoresList = json_collection($query->get(), new ScoreTransformer(), 'user');
if ($user !== null) {
$score = (clone $query)->where('user_id', $user->user_id)->first();
if ($score !== null) {
$userScore = json_item($score, new ScoreTransformer(), 'user');
$userScorePosition = 1 + (clone $query)->limit(null)->where('score', '>', $score->score)->count();
}
}
return ['scoresList' => $scoresList, 'userScore' => $userScore ?? null, 'userScorePosition' => $userScorePosition ?? null];
}