Files
ops-Gazelle/app/Json/User.php

134 lines
7.3 KiB
PHP

<?php
namespace Gazelle\Json;
use Gazelle\User\Vote;
class User extends \Gazelle\Json {
public function __construct(
protected \Gazelle\User $user,
protected \Gazelle\User $viewer,
) {}
protected function valueOrNull(int $value, string $property): ?int {
return $this->user->propertyVisible($this->viewer, $property) ? $value : null;
}
public function payload(): array {
$user = $this->user;
$viewer = $this->viewer;
$stats = $user->stats();
$forumPosts = $stats->forumPostTotal();
$releaseVotes = new Vote($user)->userTotal(Vote::UPVOTE | Vote::DOWNVOTE);
$uploaded = $this->valueOrNull($user->uploadedSize(), 'uploaded');
$downloaded = $this->valueOrNull($user->downloadedSize(), 'downloaded');
$uploads = $this->valueOrNull($stats->uploadTotal(), 'uploads+');
$artistsAdded = $this->valueOrNull($stats->artistAddedTotal(), 'artistsadded');
$torrentComments = $this->valueOrNull($stats->commentTotal('torrents'), 'torrentcomments++');
$collageContribs = $this->valueOrNull($stats->collageContrib(), 'collagecontribs+');
$collageTotal = $this->valueOrNull($stats->collageTotal(), 'collagecontribs+');
if (!$user->propertyVisibleMulti($viewer, ['requestsfilled_count', 'requestsfilled_bounty'])) {
$requestsFilled = null;
$totalBounty = null;
$requestsVoted = null;
$totalSpent = null;
} else {
$requestsFilled = $stats->requestBountyTotal();
$totalBounty = $stats->requestBountySize();
$requestsVoted = $stats->requestVoteTotal();
$totalSpent = $stats->requestVoteSize();
}
$rank = new \Gazelle\UserRank(
new \Gazelle\UserRank\Configuration(RANKING_WEIGHT),
[
'posts' => $forumPosts,
'votes' => $releaseVotes,
'artists' => (int)$artistsAdded,
'downloaded' => (int)$downloaded,
'bounty' => (int)$totalSpent,
'collage-create' => (int)$collageContribs,
'collage-add' => (int)$collageTotal,
'comment-t' => (int)$torrentComments,
'requests' => (int)$requestsFilled,
'uploaded' => (int)$uploaded,
'uploads' => (int)$uploads,
'bonus' => new \Gazelle\User\Bonus($user)->pointsSpent(),
]
);
return [
'username' => $user->username(),
'avatar' => $user->avatar(),
'isFriend' => new \Gazelle\User\Friend($user)->isFriend($viewer),
'profileText' => \Text::full_format($user->profileInfo()),
'stats' => [
'joinedDate' => $user->created(),
'lastAccess' => match (true) {
$viewer->id() == $user->id => $user->lastAccessRealtime(),
$viewer->isStaff() => $user->lastAccessRealtime(),
$user->propertyVisible($viewer, 'lastseen') => $user->lastAccess(),
default => null,
},
'uploaded' => $uploaded,
'downloaded' => $downloaded,
'requiredRatio' => $user->propertyVisible($viewer, 'requiredratio') ? $user->requiredRatio() : null,
'ratio' => match (true) {
is_null($uploaded) || is_null($downloaded)
=> null,
!$downloaded => 0.0,
default => (float)ratio($uploaded, $downloaded, 5),
},
],
'ranks' => [
'uploaded' => $this->valueOrNull($rank->rank('uploaded'), 'uploaded'),
'downloaded' => $this->valueOrNull($rank->rank('downloaded'), 'downloaded'),
'uploads' => $this->valueOrNull($rank->rank('uploads'), 'uploads+'),
'requests' => $this->valueOrNull($rank->rank('requests'), 'requestsfilled_count'),
'bounty' => $this->valueOrNull($rank->rank('bounty'), 'requestsvoted_bounty'),
'artists' => $this->valueOrNull($rank->rank('artists'), 'artistsadded'),
'collage-add' => $this->valueOrNull($rank->rank('collage-add'), 'collagecontribs+'),
'collage-create' => $this->valueOrNull($rank->rank('collage-create'), 'collagecontribs+'),
'posts' => $rank->rank('posts'),
'votes' => $rank->rank('votes'),
'bonus' => $rank->rank('bonus'),
'overall' => $user->propertyVisibleMulti($viewer, ['uploaded', 'downloaded', 'uploads+', 'requestsfilled_count', 'requestsvoted_bounty', 'artistsadded', 'collagecontribs+'])
? $rank->score() * $user->rankFactor() : null,
],
'personal' => [
'class' => $user->userclassName(),
'paranoia' => $user->paranoiaLevel(),
'paranoiaText' => $user->paranoiaLabel(),
'donor' => new \Gazelle\User\Donor($user)->isDonor(),
'warned' => $user->isWarned(),
'enabled' => $user->isEnabled(),
'passkey' => ($user->id === $viewer->id() || $viewer->isStaff()) ? $user->announceKey() : null,
],
'community' => [
'posts' => $forumPosts,
'torrentComments' => $torrentComments,
'collagesContrib' => $collageContribs,
'requestsFilled' => $requestsFilled,
'bountyEarned' => $totalBounty,
'requestsVoted' => $requestsVoted,
'bountySpent' => $totalSpent,
'releaseVotes' => $releaseVotes,
'uploaded' => $uploads,
'artistsAdded' => $artistsAdded,
'artistComments' => $this->valueOrNull($stats->commentTotal('artists'), 'torrentcomments++'),
'collageComments' => $this->valueOrNull($stats->commentTotal('collages'), 'torrentcomments++'),
'requestComments' => $this->valueOrNull($stats->commentTotal('requests'), 'torrentcomments++'),
'collagesStarted' => $this->valueOrNull($user->collagesCreated(), 'collages+'),
'perfectFlacs' => $this->valueOrNull($stats->perfectFlacTotal(), 'perfectflacs+'),
'groups' => $this->valueOrNull($stats->uniqueGroupTotal(), 'uniquegroups+'),
'seeding' => $this->valueOrNull($stats->seedingTotal(), 'seeding+'),
'leeching' => $this->valueOrNull($stats->leechTotal(), 'leeching+'),
'snatched' => $this->valueOrNull($stats->snatchTotal(), 'snatched+'),
'invited' => $this->valueOrNull($stats->invitedTotal(), 'invitedcount'),
]
];
}
}