mirror of
https://github.com/OPSnet/Gazelle.git
synced 2026-01-16 18:04:34 -05:00
break out collage ranking into contributed and created
This commit is contained in:
@@ -27,6 +27,7 @@ class User extends \Gazelle\Json {
|
||||
$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;
|
||||
@@ -43,17 +44,18 @@ class User extends \Gazelle\Json {
|
||||
$rank = new \Gazelle\UserRank(
|
||||
new \Gazelle\UserRank\Configuration(RANKING_WEIGHT),
|
||||
[
|
||||
'posts' => $forumPosts,
|
||||
'votes' => $releaseVotes,
|
||||
'artists' => (int)$artistsAdded,
|
||||
'downloaded' => (int)$downloaded,
|
||||
'bounty' => (int)$totalSpent,
|
||||
'collage' => (int)$collageContribs,
|
||||
'comment-t' => (int)$torrentComments,
|
||||
'requests' => (int)$requestsFilled,
|
||||
'uploaded' => (int)$uploaded,
|
||||
'uploads' => (int)$uploads,
|
||||
'bonus' => new \Gazelle\User\Bonus($user)->pointsSpent(),
|
||||
'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(),
|
||||
]
|
||||
);
|
||||
|
||||
@@ -81,17 +83,18 @@ class User extends \Gazelle\Json {
|
||||
},
|
||||
],
|
||||
'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' => $this->valueOrNull($rank->rank('collage'), '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+'])
|
||||
'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' => [
|
||||
|
||||
@@ -20,11 +20,11 @@ class User extends \Gazelle\BaseObject {
|
||||
protected array $commentTotal;
|
||||
|
||||
public function flush(): static {
|
||||
$this->info = [];
|
||||
self::$cache->delete_multi([
|
||||
sprintf(self::CACHE_COMMENT_TOTAL, $this->id),
|
||||
sprintf(self::CACHE_GENERAL, $this->id),
|
||||
]);
|
||||
unset($this->info);
|
||||
return $this;
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ class User extends \Gazelle\BaseObject {
|
||||
* @see \Gazelle\Stats\Users::refresh()
|
||||
*/
|
||||
public function info(): array {
|
||||
if (isset($this->info) && !empty($this->info)) {
|
||||
if (isset($this->info)) {
|
||||
return $this->info;
|
||||
}
|
||||
$key = sprintf(self::CACHE_GENERAL, $this->id);
|
||||
|
||||
@@ -415,34 +415,33 @@ class Users extends \Gazelle\Base {
|
||||
self::$db->prepared_query("
|
||||
INSERT INTO user_summary_new (user_id, collage_total, collage_contrib)
|
||||
WITH c AS (
|
||||
SELECT um.ID AS user_id,
|
||||
SELECT c.UserID AS user_id,
|
||||
count(c.ID) AS total
|
||||
FROM users_main um
|
||||
LEFT JOIN collages c ON (c.UserID = um.ID AND c.Deleted = '0')
|
||||
GROUP BY um.ID
|
||||
FROM collages c
|
||||
WHERE c.Deleted = '0'
|
||||
GROUP BY c.UserID
|
||||
),
|
||||
ca AS (
|
||||
SELECT um.ID AS user_id,
|
||||
SELECT ca.UserID AS user_id,
|
||||
count(DISTINCT ca.ArtistID) AS total
|
||||
FROM users_main um
|
||||
LEFT JOIN collages_artists ca ON (ca.UserID = um.ID)
|
||||
LEFT JOIN collages c ON (c.ID = ca.CollageID AND c.Deleted = '0')
|
||||
GROUP BY um.ID
|
||||
FROM collages_artists ca
|
||||
INNER JOIN collages c ON (c.ID = ca.CollageID AND c.Deleted = '0')
|
||||
GROUP BY ca.UserID
|
||||
),
|
||||
ct AS (
|
||||
SELECT um.ID AS user_id,
|
||||
SELECT ct.UserID AS user_id,
|
||||
count(DISTINCT ct.GroupID) AS total
|
||||
FROM users_main um
|
||||
LEFT JOIN collages_torrents ct ON (ct.UserID = um.ID)
|
||||
LEFT JOIN collages c ON (c.ID = ct.CollageID AND c.Deleted = '0')
|
||||
GROUP BY um.ID
|
||||
FROM collages_torrents ct
|
||||
INNER JOIN collages c ON (c.ID = ct.CollageID AND c.Deleted = '0')
|
||||
GROUP BY ct.UserID
|
||||
)
|
||||
SELECT c.user_id, c.total, ca.total + ct.total
|
||||
FROM c
|
||||
LEFT JOIN ca USING (user_id)
|
||||
LEFT JOIN ct USING (user_id)
|
||||
SELECT um.ID, coalesce(c.total, 0), coalesce(ca.total, 0) + coalesce(ct.total, 0)
|
||||
FROM users_main um
|
||||
LEFT JOIN c ON (c.user_id = um.ID)
|
||||
LEFT JOIN ca ON (ca.user_id = um.ID)
|
||||
LEFT JOIN ct ON (ct.user_id = um.ID)
|
||||
ON DUPLICATE KEY UPDATE
|
||||
collage_total = VALUES(collage_total),
|
||||
collage_total = VALUES(collage_total),
|
||||
collage_contrib = VALUES(collage_contrib)
|
||||
");
|
||||
|
||||
|
||||
18
app/UserRank/Dimension/CollageContributed.php
Normal file
18
app/UserRank/Dimension/CollageContributed.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace Gazelle\UserRank\Dimension;
|
||||
|
||||
class CollageContributed extends \Gazelle\UserRank\AbstractUserRank {
|
||||
public function cacheKey(): string {
|
||||
return 'rank_data_collagecontrib';
|
||||
}
|
||||
|
||||
public function selector(): string {
|
||||
return "
|
||||
SELECT collage_contrib
|
||||
FROM user_summary
|
||||
WHERE collage_contrib > 0
|
||||
ORDER BY 1
|
||||
";
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Gazelle\UserRank\Dimension;
|
||||
|
||||
class CollageContribution extends \Gazelle\UserRank\AbstractUserRank {
|
||||
public function cacheKey(): string {
|
||||
return 'rank_data_collagecontrib';
|
||||
}
|
||||
|
||||
public function selector(): string {
|
||||
return "
|
||||
SELECT sum(contrib) AS n FROM (
|
||||
SELECT um.ID as id, count(*) AS contrib
|
||||
FROM collages_artists ca
|
||||
INNER JOIN collages c ON (c.ID = ca.CollageID)
|
||||
INNER JOIN users_main um ON (um.ID = ca.UserID)
|
||||
WHERE um.Enabled = '1'
|
||||
AND c.Deleted = '0'
|
||||
AND c.Locked = '0'
|
||||
GROUP BY um.ID
|
||||
UNION ALL
|
||||
SELECT um.ID as id, count(*) AS contrib
|
||||
FROM collages_torrents ct
|
||||
INNER JOIN collages c ON (c.ID = ct.CollageID)
|
||||
INNER JOIN users_main um ON (um.ID = ct.UserID)
|
||||
WHERE um.Enabled = '1'
|
||||
AND c.Deleted = '0'
|
||||
AND c.Locked = '0'
|
||||
GROUP BY um.ID
|
||||
) COLL
|
||||
GROUP BY id
|
||||
ORDER BY 1
|
||||
";
|
||||
}
|
||||
}
|
||||
18
app/UserRank/Dimension/CollageCreated.php
Normal file
18
app/UserRank/Dimension/CollageCreated.php
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace Gazelle\UserRank\Dimension;
|
||||
|
||||
class CollageCreated extends \Gazelle\UserRank\AbstractUserRank {
|
||||
public function cacheKey(): string {
|
||||
return 'rank_data_collagecontrib';
|
||||
}
|
||||
|
||||
public function selector(): string {
|
||||
return "
|
||||
SELECT collage_total
|
||||
FROM user_summary
|
||||
WHERE collage_total > 0
|
||||
ORDER BY 1
|
||||
";
|
||||
}
|
||||
}
|
||||
@@ -605,17 +605,18 @@ defined('IMAGE_HOST_RECOMMENDED') or define('IMAGE_HOST_RECOMMENDED', []);
|
||||
// What are the relative weights of user percentiles, in order to calculate
|
||||
// the overall percentile rank.
|
||||
defined('RANKING_WEIGHT') or define('RANKING_WEIGHT', [
|
||||
'uploaded' => [ 8, 'DataUpload'],
|
||||
'downloaded' => [20, 'DataDownload'],
|
||||
'uploads' => [25, 'Uploads'],
|
||||
'requests' => [10, 'RequestsFilled'],
|
||||
'posts' => [ 3, 'ForumPosts'],
|
||||
'bounty' => [ 4, 'BountySpent'],
|
||||
'artists' => [ 1, 'ArtistsAdded'],
|
||||
'collage' => [ 5, 'CollageContribution'],
|
||||
'votes' => [ 5, 'ReleaseVotes'],
|
||||
'bonus' => [ 6, 'BonusPoints'],
|
||||
'comment-t' => [18, 'CommentTorrent'],
|
||||
'uploaded' => [10, 'DataUpload'],
|
||||
'downloaded' => [25, 'DataDownload'],
|
||||
'uploads' => [25, 'Uploads'],
|
||||
'requests' => [15, 'RequestsFilled'],
|
||||
'posts' => [ 6, 'ForumPosts'],
|
||||
'bounty' => [ 4, 'BountySpent'],
|
||||
'artists' => [ 2, 'ArtistsAdded'],
|
||||
'collage-add' => [ 5, 'CollageContributed'],
|
||||
'collage-create' => [ 8, 'CollageCreated'],
|
||||
'votes' => [ 7, 'ReleaseVotes'],
|
||||
'bonus' => [ 4, 'BonusPoints'],
|
||||
'comment-t' => [16, 'CommentTorrent'],
|
||||
]);
|
||||
|
||||
// Successive login failures generate increasing delays.
|
||||
|
||||
@@ -127,17 +127,18 @@ $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,
|
||||
'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-add' => check_paranoia_here('collagecontribs+') ? $stats->collageContrib() : 0,
|
||||
'collage-create' => 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,
|
||||
],
|
||||
);
|
||||
|
||||
@@ -153,7 +154,8 @@ $statList = [
|
||||
['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'],
|
||||
['collage-add', 'collagecontribs+', 'Collage contributions', $numberFormatter, 'contributions'],
|
||||
['collage-create', 'collagecontribs+', 'Collages created', $numberFormatter, 'created'],
|
||||
['artists', 'artistsadded', 'Artists added', $numberFormatter, 'added'],
|
||||
['votes', null, 'Release votes cast', $numberFormatter, 'votes'],
|
||||
]
|
||||
|
||||
@@ -163,7 +163,7 @@ class CollageTest extends TestCase {
|
||||
|
||||
$this->assertEquals(
|
||||
1,
|
||||
$this->userList['u1']->stats()->collageTotal(),
|
||||
$this->userList['u1']->stats()->flush()->collageTotal(),
|
||||
'collage-user-total'
|
||||
);
|
||||
|
||||
|
||||
@@ -133,7 +133,7 @@ class DownloadTest extends TestCase {
|
||||
$this->assertFalse($this->torrent->isFreeleechPersonal(), 'redown-torrent-is-still-not-pfl');
|
||||
|
||||
new Stats\Users()->refresh();
|
||||
$this->assertEquals(2, $user->stats()->downloadTotal(), 'redown-user-download-total');
|
||||
$this->assertEquals(2, $user->stats()->flush()->downloadTotal(), 'redown-user-download-total');
|
||||
$this->assertEquals(1, $user->stats()->downloadUnique(), 'redown-user-download-unique');
|
||||
|
||||
$this->assertEquals(2, $user->history()->resetDownloaded(), 'redown-reset-downloaded');
|
||||
|
||||
@@ -166,7 +166,7 @@ class ForumTest extends TestCase {
|
||||
$this->assertFalse($thread->isLocked(), 'fthread-is-not-locked');
|
||||
$this->assertFalse($thread->isPinned(), 'fthread-is-not-pinned');
|
||||
|
||||
$this->assertEquals(1, $admin->stats()->forumThreadTotal(), 'fthread-user-stats-total');
|
||||
$this->assertEquals(1, $admin->stats()->flush()->forumThreadTotal(), 'fthread-user-stats-total');
|
||||
$this->assertCount(0, $this->userList['user']->forumLastReadList(1, $this->forum), 'fthread-user-unread');
|
||||
|
||||
// Forum Thread Notes
|
||||
|
||||
@@ -206,7 +206,7 @@ class RequestTest extends TestCase {
|
||||
'created-total' => 0,
|
||||
'vote-size' => 0,
|
||||
'vote-total' => 0,
|
||||
'uploaded' => $admin->uploadedSize(),
|
||||
'uploaded' => $admin->flush()->uploadedSize(),
|
||||
'total' => $statsReq->total(),
|
||||
'total-filled' => $statsReq->filledTotal(),
|
||||
];
|
||||
@@ -304,7 +304,7 @@ class RequestTest extends TestCase {
|
||||
$this->assertInstanceOf(Torrent::class, $torrent, 'request-torrent-filler');
|
||||
|
||||
$this->assertEquals(1, $this->request->fill($user, $torrent), 'request-fill');
|
||||
$this->assertEquals($fillBefore['bounty-size'] + $taxedBounty * 2, $user->stats()->requestBountySize(), 'request-fill-receive-bounty');
|
||||
$this->assertEquals($fillBefore['bounty-size'] + $taxedBounty * 2, $user->stats()->flush()->requestBountySize(), 'request-fill-receive-bounty');
|
||||
$this->assertEquals($fillBefore['bounty-total'] + 1, $user->stats()->requestBountyTotal(), 'request-fill-receive-total');
|
||||
$this->assertTrue(Helper::recentDate($this->request->fillDate()), 'request-fill-date');
|
||||
$this->assertEquals($this->request->id, $torrent->requestFills($requestMan)[0]->id, 'request-torrent-fills');
|
||||
|
||||
@@ -11,7 +11,8 @@ class UserRankTest extends TestCase {
|
||||
['ArtistsAdded'],
|
||||
['BonusPoints'],
|
||||
['BountySpent'],
|
||||
['CollageContribution'],
|
||||
['CollageContributed'],
|
||||
['CollageCreated'],
|
||||
['CommentTorrent'],
|
||||
['DataDownload'],
|
||||
['DataUpload'],
|
||||
@@ -39,17 +40,18 @@ class UserRankTest extends TestCase {
|
||||
$userRank = new UserRank(
|
||||
new UserRank\Configuration(RANKING_WEIGHT),
|
||||
[
|
||||
'downloaded' => 0,
|
||||
'uploaded' => STARTING_UPLOAD,
|
||||
'uploads' => 0,
|
||||
'requests' => 0,
|
||||
'posts' => 0,
|
||||
'bounty' => 0,
|
||||
'artists' => 0,
|
||||
'collage' => 0,
|
||||
'votes' => 0,
|
||||
'bonus' => 0,
|
||||
'comment-t' => 0,
|
||||
'downloaded' => 0,
|
||||
'uploaded' => STARTING_UPLOAD,
|
||||
'uploads' => 0,
|
||||
'requests' => 0,
|
||||
'posts' => 0,
|
||||
'bounty' => 0,
|
||||
'artists' => 0,
|
||||
'collage-add' => 0,
|
||||
'collage-create' => 0,
|
||||
'votes' => 0,
|
||||
'bonus' => 0,
|
||||
'comment-t' => 0,
|
||||
],
|
||||
);
|
||||
$this->assertSame(0, $userRank->score(), 'userrank-score');
|
||||
|
||||
@@ -333,6 +333,7 @@ class UserTest extends TestCase {
|
||||
$this->assertStringContainsString('100%', $next['goal']['Time']['percent'], 'user-next-has-time');
|
||||
|
||||
$this->user->addBounty(7 * 1024 * 1024 * 1024);
|
||||
$this->user->stats()->flush();
|
||||
$next = $this->user->nextClass($manager);
|
||||
$this->assertIsArray($next, 'user-next-requirements-next-3-array');
|
||||
$this->assertStringContainsString('100%', $next['goal']['Upload']['percent'], 'user-next-has-upload');
|
||||
@@ -536,21 +537,22 @@ class UserTest extends TestCase {
|
||||
$rank = new UserRank(
|
||||
new UserRank\Configuration(RANKING_WEIGHT),
|
||||
[
|
||||
'uploaded' => STARTING_UPLOAD,
|
||||
'downloaded' => 1,
|
||||
'uploads' => 0,
|
||||
'requests' => 0,
|
||||
'posts' => 0,
|
||||
'bounty' => 0,
|
||||
'artists' => 0,
|
||||
'collage' => 0,
|
||||
'votes' => 0,
|
||||
'bonus' => 0,
|
||||
'comment-t' => 0,
|
||||
'downloaded' => 0,
|
||||
'uploaded' => STARTING_UPLOAD,
|
||||
'uploads' => 0,
|
||||
'requests' => 0,
|
||||
'posts' => 0,
|
||||
'bounty' => 0,
|
||||
'artists' => 0,
|
||||
'collage-add' => 0,
|
||||
'collage-create' => 0,
|
||||
'votes' => 0,
|
||||
'bonus' => 0,
|
||||
'comment-t' => 0,
|
||||
]
|
||||
);
|
||||
$this->assertEquals(0, $rank->score(), 'userrank-score');
|
||||
$this->assertEquals(1, $rank->rank('downloaded'), 'userrank-rank');
|
||||
$this->assertEquals(0, $rank->rank('downloaded'), 'userrank-rank');
|
||||
}
|
||||
|
||||
public function testUserHash(): void {
|
||||
|
||||
Reference in New Issue
Block a user