findById((int)$_GET['id']); if (is_null($user)) { header("Location: log.php?search=User+" . (int)$_GET['id']); exit; } $userId = $user->id; $username = $user->username(); $Class = $user->primaryClass(); $donor = new User\Donor($user); $userBonus = new User\Bonus($user); $viewerBonus = new User\Bonus($Viewer); $history = new User\History($user); $limiter = new User\UserclassRateLimit($user); $donorMan = new Manager\Donation(); $ipv4 = new Manager\IPv4(); $tgMan = new Manager\TGroup(); $resetToken = $Viewer->permitted('users_mod') ? (new Manager\UserToken())->findByUser($user, UserTokenType::password) : false; if (!empty($_POST)) { authorize(); foreach (['action', 'flsubmit', 'fltype'] as $arg) { if (!isset($_POST[$arg])) { Error403::error(); } } if ($_POST['action'] !== 'fltoken' || $_POST['flsubmit'] !== 'Send') { Error403::error(); } if (!preg_match('/^fl-(other-[1-4])$/', $_POST['fltype'], $match)) { Error403::error(); } $FL_OTHER_tokens = $viewerBonus->purchaseTokenOther($user, $match[1], $_POST['message'] ?? ''); if (!$FL_OTHER_tokens) { Error400::error( 'Purchase of tokens not concluded. Either you lacked funds or they have chosen to decline FL tokens.' ); } } if ($userId == $Viewer->id()) { $Preview = (bool)($_GET['preview'] ?? false); $OwnProfile = !$Preview; $user->forceCacheFlush(true); } else { $OwnProfile = false; // Don't allow any kind of previewing on other profiles $Preview = false; } $previewer = $Preview ? $userMan->findById(PARANOIA_PREVIEW_USER) : $Viewer; $Paranoia = $Preview ? explode(',', $_GET['paranoia']) : $user->paranoia(); function check_paranoia_here(?string $Setting): int|false { global $Paranoia, $Class, $userId, $Preview; if (!$Setting) { return PARANOIA_ALLOWED; } if ($Preview) { return check_paranoia($Setting, $Paranoia ?? [], $Class); } else { return check_paranoia($Setting, $Paranoia ?? [], $Class, $userId); } } View::show_header($username, [ 'js' => 'vendor/jquery.imagesloaded,vendor/jquery.wookmark,bbcode,comments,lastfm,requests,user' . ($Viewer->isStaff() ? ',info_paster' : '') . ($Viewer->permitted('users_view_ips') ? ',resolve-ip' : '') . ($Viewer->permitted('users_mod') ? ',reports' : ''), 'css' => 'tiles' ]); echo $Twig->render('user/header.twig', [ 'bonus' => $userBonus, 'donor' => $donor, 'freeleech' => [ 'item' => $OwnProfile ? [] : $viewerBonus->otherList(), 'other' => $FL_OTHER_tokens ?? null, 'latest' => $viewerBonus->otherLatest($user), ], 'friend' => new User\Friend($Viewer), 'preview_user' => $previewer, 'user' => $user, 'userMan' => $userMan, 'viewer' => $Viewer, ]); echo $Twig->render('user/sidebar.twig', [ 'ancestry' => $userMan->ancestry($user), 'applicant' => new Manager\Applicant(), 'invite_source' => $Viewer->permitted('admin_manage_invite_source') ? (new Manager\InviteSource())->findSourceNameByUser($user) : null, 'next_class' => $user->nextClass($userMan), 'user' => $user, 'viewer' => $Viewer, ]); // Last.fm statistics and comparability $lastfmInfo = (new Util\LastFM())->userInfo($user); if ($lastfmInfo) { echo $Twig->render('user/lastfm.twig', [ 'can_reload' => ($OwnProfile && $Cache->get_value("lastfm_clear_cache_$userId") === false) || $Viewer->permitted('users_mod'), 'info' => $lastfmInfo, 'own_profile' => $OwnProfile, ]); } $vote = new Vote($user); $stats = $user->stats(); $Uploads = check_paranoia_here('uploads+') ? $stats->uploadTotal() : 0; $rank = new UserRank( new UserRank\Configuration(RANKING_WEIGHT), [ 'uploaded' => $user->uploadedSize(), 'downloaded' => $user->downloadedSize(), 'uploads' => $Uploads, 'requests' => $stats->requestBountyTotal(), 'posts' => $stats->forumPostTotal(), 'bounty' => $stats->requestVoteSize(), 'artists' => check_paranoia_here('artistsadded') ? $stats->artistAddedTotal() : 0, 'collage' => check_paranoia_here('collagecontribs+') ? $stats->collageTotal() : 0, 'votes' => $vote->userTotal(Vote::UPVOTE | Vote::DOWNVOTE), 'bonus' => $userBonus->pointsSpent(), 'comment-t' => check_paranoia_here('torrentcomments++') ? $stats->commentTotal('torrents') : 0, ], ); $byteFormatter = fn ($value) => byte_format($value); $numberFormatter = fn ($value) => number_format($value); $statList = [ // [dimension, permission, title, formatter, tooltip suffix] ['uploaded', 'uploaded', 'Data uploaded', $byteFormatter, 'uploaded'], ['downloaded', 'downloaded', 'Data downloaded', $byteFormatter, 'downloaded'], ['uploads', 'uploads+', 'Torrents uploaded', $numberFormatter, 'uploads'], ['requests', 'requestsfilled_count', 'Requests filled', $numberFormatter, 'filled'], ['bounty', 'requestsvoted_bounty', 'Request votes', $byteFormatter, 'spent'], ['posts', null, 'Forum posts made', $numberFormatter, 'posts'], ['comment-t', 'torrentcomments++', 'Torrent comments', $numberFormatter, 'posted'], ['collage', 'collagecontribs+', 'Collage contributions', $numberFormatter, 'contributions'], ['artists', 'artistsadded', 'Artists added', $numberFormatter, 'added'], ['votes', null, 'Release votes cast', $numberFormatter, 'votes'], ] ?>
Percentile Rankings (hover for values)
permitted('users_mod') || $Viewer->permitted('users_view_ips') || $Viewer->permitted('users_view_keys')) { ?>
History
render('user/tag-snatch.twig', [ 'user' => $user, ]); } echo $Twig->render('user/sidebar-stats.twig', [ 'prl' => $limiter, 'upload_total' => $Uploads, 'user' => $user, 'viewer' => $Viewer, 'visible' => [ 'collages+' => check_paranoia_here('collages+'), 'collages' => check_paranoia_here('collages'), 'collagescontrib+' => check_paranoia_here('collagecontribs+'), 'collagecontribs' => check_paranoia_here('collagecontribs'), 'downloaded' => $OwnProfile || $Viewer->permitted('site_view_torrent_snatchlist'), 'invitedcount' => check_paranoia_here('invitedcount'), 'leeching+' => check_paranoia_here('leeching+'), 'leeching' => check_paranoia_here('leeching'), 'perfectflacs+' => check_paranoia_here('perfectflacs+'), 'perfectflacs' => check_paranoia_here('perfectflacs'), 'seeding+' => check_paranoia_here('seeding+'), 'seeding' => check_paranoia_here('seeding'), 'snatched+' => check_paranoia_here('snatched+'), 'snatched' => check_paranoia_here('snatched'), 'torrentcomments+' => check_paranoia_here('torrentcomments+'), 'torrentcomments' => check_paranoia_here('torrentcomments'), 'requestsfilled_list' => check_paranoia_here('requestsfilled_list'), 'requestsfilled_count' => check_paranoia_here('requestsfilled_count'), 'requestsfilled_bounty' => check_paranoia_here('requestsfilled_bounty'), 'requestsvoted_list' => check_paranoia_here('requestsvoted_list'), 'requestsvoted_count' => check_paranoia_here('requestsvoted_count'), 'requestsvoted_bounty' => check_paranoia_here('requestsvoted_bounty'), 'uniquegroups+' => check_paranoia_here('uniquegroups+'), 'uniquegroups' => check_paranoia_here('uniquegroups'), 'uploads+' => check_paranoia_here('uploads+'), 'uploads' => check_paranoia_here('uploads'), ], ]); if ($Viewer->permitted("users_mod") || $OwnProfile || $donor->isVisible()) { echo $Twig->render('donation/stats.twig', [ 'donor' => $donor, 'viewer' => $Viewer, ]); } ?>
permitted('users_mod') && $user->onRatioWatch()) { echo $Twig->render('user/ratio-watch.twig', [ 'user' => $user, ]); } ?>
profileTitle()) ?> Hide 
profileInfo() ? \Text::full_format($user->profileInfo()) : 'This profile is currently empty.' ?>
profileInfo($level); if (!empty($profileInfo)) { ?>
profileTitle($level) ?? "Extra Info $level") ?> Hide
render('user/recent.twig', [ 'id' => $userId, 'recent' => array_map(fn ($id) => $tgMan->findById($id), $user->snatch()->recentSnatchList()), 'title' => 'Snatches', 'type' => 'snatched', 'thing' => 'snatches', ]); } if (check_paranoia_here('uploads')) { echo $Twig->render('user/recent.twig', [ 'id' => $userId, 'recent' => array_map(fn ($id) => $tgMan->findById($id), $user->recentUploadList()), 'title' => 'Uploads', 'type' => 'uploaded', 'thing' => 'uploads', ]); } if ($OwnProfile || !$user->hasAttr('hide-vote-recent') || $Viewer->permitted('view-release-votes')) { echo $Twig->render('user/recent-vote.twig', [ 'recent' => $vote->recent($tgMan), 'show_link' => $OwnProfile || !$user->hasAttr('hide-vote-history') || $Viewer->permitted('view-release-votes'), 'user_id' => $userId, ]); } echo $Twig->render('user/collage-list.twig', [ 'list' => (new Manager\Collage())->findPersonalByUser($user), 'manager' => $tgMan, ]); // Linked accounts if ($Viewer->permitted('users_linked_users')) { echo $Twig->render('user/linked.twig', [ 'hash' => signature($comments ?? '', USER_EDIT_SALT), 'user_link' => (new User\UserLink($user))->info(), 'user' => $user, 'viewer' => $Viewer, ]); } if ($Viewer->permitted('users_view_invites')) { $tree = new User\InviteTree($user); if ($tree->hasInvitees()) { ?>
Invite Tree View
permitted('users_give_donor')) { echo $Twig->render('donation/history.twig', [ 'history' => $donor->historyList(), ]); } if (!$Viewer->disableRequests() && $user->propertyVisible($previewer, 'requestsvoted_list')) { echo $Twig->render('request/user-unfilled.twig', [ 'bounty' => $Viewer->ordinal()->value('request-bounty-vote'), 'list' => (new Manager\Request())->findUnfilledByUser($user, 100), 'viewer' => $Viewer, ]); } if ($Viewer->permitted('users_mod') || $Viewer->isStaffPMReader()) { echo $Twig->render('admin/staffpm-list.twig', [ 'list' => (new Staff($Viewer))->userStaffPmList($user), ]); } if ($Viewer->permitted('admin_reports')) { $reports = (new Manager\Report($userMan))->findByReportedUser($user); if ($reports) { echo $Twig->render('admin/user-reports-list.twig', [ 'list' => $reports ]); } } // Displays a table of forum warnings viewable only to Forum Moderators if ($Viewer->permitted('users_warn')) { $ForumWarnings = $user->forumWarning(); if ($ForumWarnings) { ?>
Forum warnings
permitted('users_auto_reports')) { $raTypeMan = new \Gazelle\Manager\ReportAutoType(); $raSearch = new Search\ReportAuto(new \Gazelle\Manager\ReportAuto($raTypeMan), $raTypeMan); $openReports = $raSearch->setUser($user)->setState(Enum\ReportAutoState::open)->userTotalList($userMan); if ($openReports && $openReports[0][1]) { ?>
render('user/main-column.twig', [ 'asn' => new Search\ASN(), 'class_list' => $userMan->classLevelList(), 'donor' => $donor, 'forum_man' => new Manager\Forum(), 'history' => $history, 'invite_source' => (new Manager\InviteSource())->inviterConfiguration($user), 'is_traced' => $Viewer->permitted('admin_tracker') && (new Tracker())->isTraced($user), 'prl' => $limiter, 'user' => $user, 'viewer' => $Viewer, ]);