findById((int)($_GET['id'] ?? 0));
if (is_null($User)) {
Error404::error();
}
if (!$User->propertyVisible($Viewer, 'torrentcomments')) {
Error403::error();
}
}
$UserID = $User->id();
$Username = $User->username();
if ($Viewer->id() == $UserID) {
$ownProfile = true;
$linkId = '';
} else {
$ownProfile = false;
$linkId = "&id=$UserID";
}
$Action = $_REQUEST['action'] ?? 'torrents';
$Type = $_REQUEST['type'] ?? 'default';
$BaseLink = "comments.php?action=$Action$linkId";
// SQL components
$condArgs = [];
$condition = [];
$Join = [];
$joinArgs = [];
$TypeLinks = [];
switch ($Action) {
case 'artist':
$Title = '%s › Artist comments';
$table = 'artists_group ag INNER JOIN artists_alias aa ON (ag.PrimaryAlias = aa.AliasID)';
$idField = 'ag.ArtistID';
$nameField = 'aa.Name';
$condition[] = "C.AuthorID = ?";
$condArgs[] = $UserID;
break;
case 'collages':
$table = 'collages AS cl';
$idField = 'cl.ID';
$nameField = 'cl.Name';
$condition[] = "cl.Deleted = '0'";
switch ($Type) {
case 'created':
$Title = "%s › Comments on their collages";
array_push($condition, "cl.UserID = ?", "C.AuthorID != ?");
array_push($condArgs, $UserID, $UserID);
$TypeLinks = [
[$BaseLink, "$Username › Collage comments"],
["$BaseLink&type=contributed", "$Username › Contributed collage comments"],
];
break;
case 'contributed':
$Title = '%s › Contributed collage comments';
$condition[] = "C.AuthorID != ? AND cl.ID IN (
SELECT DISTINCT CollageID FROM collages_torrents ct WHERE ct.UserID = ?
UNION ALL
SELECT DISTINCT CollageID FROM collages_artists ca WHERE ca.UserID = ?)";
$condArgs = array_merge($condArgs, [$UserID, $UserID, $UserID]);
$TypeLinks = [
[$BaseLink, "$Username › Collage comments"],
["$BaseLink&type=created", "$Username › Comments on their collages"],
];
break;
default:
$Title = "%s › Collage comments";
$condition[] = "C.AuthorID = ?";
$condArgs[] = $UserID;
$TypeLinks = [
["$BaseLink&type=contributed", "$Username › Contributed collage comments"],
["$BaseLink&type=created", "$Username › Comments on their collages"],
];
break;
}
break;
case 'requests':
$table = 'requests AS r';
$idField = 'r.ID';
$nameField = 'r.Title';
switch ($Type) {
case 'created':
$Title = "%s › Comments on their requests";
array_push($condition, "r.UserID = ?", "C.AuthorID != ?");
array_push($condArgs, $UserID, $UserID);
$TypeLinks = [
[$BaseLink, "$Username › Request comments"],
["$BaseLink&type=contributed", "$Username › Voted-on request comments"],
];
break;
case 'voted':
$Title = "%s › Comments on voted-on requests";
$Join[] = 'INNER JOIN requests_votes rv ON (rv.RequestID = r.ID)';
array_push($condition, "rv.UserID = ?", "C.AuthorID != ?");
array_push($condArgs, $UserID, $UserID);
$TypeLinks = [
[$BaseLink, "$Username › Request comments"],
["$BaseLink&type=created", "$Username › Created request comments"],
];
break;
default:
$Title = "%s › Request comments";
$condition[] = "C.AuthorID = ?";
$condArgs[] = $UserID;
$TypeLinks = $ownProfile
? [
["$BaseLink&type=created", "Comments on your created requests"],
["$BaseLink&type=contributed", "Your comments on requests"],
]
: [
["$BaseLink&type=created", "$Username › Created request comments"],
["$BaseLink&type=contributed", "$Username › Request comments"],
];
break;
}
break;
case 'torrents':
$table = 'torrents_group AS tg';
$idField = 'tg.ID';
$nameField = 'tg.Name';
switch ($Type) {
case 'uploaded':
$Title = "%s › Comments on their uploads";
$Join[] = 'INNER JOIN torrents t ON (t.GroupID = tg.ID)';
array_push($condition, "C.AuthorID != ?", "t.UserID = ?", 'C.AddedTime > t.created');
array_push($condArgs, $UserID, $UserID);
$TypeLinks[] = [
$BaseLink,
$ownProfile ? "Your torrent comments" : "$Username › Torrent comments"
];
break;
default:
$Title = "%s › Torrent comments";
$condition[] = "C.AuthorID = ?";
$condArgs[] = $UserID;
$TypeLinks[] = [
"$BaseLink&type=uploaded",
$ownProfile ? "Comments on your uploads" : "$Username › Comments on their uploads"
];
break;
}
break;
default:
Error400::error('What are you trying to comment on?');
}
$Join[] = "INNER JOIN comments C ON (C.Page = ? AND C.PageID = $idField)";
$joinArgs[] = $Action;
$Join = implode("\n", $Join);
$cond = 'WHERE ' . implode(" AND ", $condition);
$db = DB::DB();
// Posts per page limit stuff
$paginator = new Util\Paginator($Viewer->postsPerPage(), (int)($_GET['page'] ?? 1));
$paginator->setTotal(
(int)$db->scalar("
SELECT count(DISTINCT C.ID) FROM $table $Join $cond", ...array_merge($joinArgs, $condArgs)
)
);
$Comments = $db->prepared_query("
SELECT C.AuthorID,
C.Page,
C.PageID,
$nameField,
C.ID,
C.Body,
C.AddedTime,
C.EditedTime,
C.EditedUserID
FROM $table
$Join
$cond
GROUP BY C.ID
ORDER BY C.ID DESC
LIMIT ? OFFSET ?
", ...[...$joinArgs, ...$condArgs, $paginator->limit(), $paginator->offset()]
);
$requestList = [];
$tgroupList = [];
if ($Action == 'requests') {
$requestMan = new Manager\Request();
foreach (array_flip(array_flip($db->collect('PageID'))) as $id) {
$id = (int)$id;
$requestList[$id] = $requestMan->findById($id);
}
} elseif ($Action == 'torrents') {
$tgMan = new Manager\TGroup();
foreach (array_flip(array_flip($db->collect('PageID'))) as $id) {
$id = (int)$id;
$tgroupList[$id] = $tgMan->findById($id);
}
}
$Links = implode(' ',
// show links to the other types of pages having comments
array_map(fn ($a) => "" . ucfirst(rtrim($a, 's')) . ' comments',
array_filter(['artist', 'collages', 'requests', 'torrents'], fn ($a) => $a != $Action)
)
);
if ($TypeLinks) {
// and any extra links for this page type
$Links .= '
' . implode(' ', array_map(
fn ($link) => sprintf('%s', $link[0], $link[1]), $TypeLinks
));
}
View::show_header(sprintf($Title, $Username), ['js' => 'bbcode,comments']);
?>