BioTorrents.de’s version of Gazelle
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

userrank.class.php 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <?php
  2. declare(strict_types=1);
  3. class UserRank
  4. {
  5. # Prefix for memcache keys, to make life easier
  6. const PREFIX = 'percentiles_';
  7. /**
  8. * Returns a 101 row array (101 percentiles: 0-100),
  9. * with the minimum value for that percentile as the value for each row.
  10. *
  11. * BTW - ingenious
  12. */
  13. private static function build_table($MemKey, $Query)
  14. {
  15. $QueryID = G::$DB->get_query_id();
  16. G::$DB->prepare_query("
  17. DROP TEMPORARY TABLE IF EXISTS
  18. `temp_stats`
  19. ");
  20. G::$DB->exec_prepared_query();
  21. G::$DB->prepare_query("
  22. CREATE TEMPORARY TABLE `temp_stats`(
  23. `id` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  24. `value` BIGINT NOT NULL
  25. );
  26. ");
  27. G::$DB->exec_prepared_query();
  28. G::$DB->prepare_query("
  29. INSERT INTO `temp_stats`(`value`) "
  30. . $Query
  31. );
  32. G::$DB->exec_prepared_query();
  33. G::$DB->prepare_query("
  34. SELECT
  35. COUNT(`id`)
  36. FROM
  37. `temp_stats`
  38. ");
  39. G::$DB->exec_prepared_query();
  40. list($UserCount) = G::$DB->next_record();
  41. $UserCount = (int) $UserCount;
  42. G::$DB->query("
  43. SELECT
  44. MIN(`value`)
  45. FROM
  46. `temp_stats`
  47. GROUP BY
  48. CEIL(`id` /($UserCount / 100));
  49. ");
  50. G::$DB->exec_prepared_query();
  51. $Table = G::$DB->to_array();
  52. G::$DB->set_query_id($QueryID);
  53. # Give a little variation to the cache length, so all the tables don't expire at the same time
  54. G::$Cache->cache_value($MemKey, $Table, 3600 * 24 * rand(800, 1000) * 0.001);
  55. return $Table;
  56. }
  57. /**
  58. * table_query
  59. */
  60. private static function table_query($TableName)
  61. {
  62. switch ($TableName) {
  63. case 'uploaded':
  64. $Query = "
  65. SELECT
  66. `Uploaded`
  67. FROM
  68. `users_main`
  69. WHERE
  70. `Enabled` = '1' AND `Uploaded` > 0
  71. ORDER BY
  72. `Uploaded`;
  73. ";
  74. break;
  75. case 'downloaded':
  76. $Query = "
  77. SELECT
  78. `Downloaded`
  79. FROM
  80. `users_main`
  81. WHERE
  82. `Enabled` = '1' AND `Downloaded` > 0
  83. ORDER BY
  84. `Downloaded`;
  85. ";
  86. break;
  87. case 'uploads':
  88. $Query = "
  89. SELECT
  90. COUNT(t.`ID`) AS `Uploads`
  91. FROM
  92. `users_main` AS um
  93. JOIN `torrents` AS t
  94. ON
  95. t.`UserID` = um.`ID`
  96. WHERE
  97. um.`Enabled` = '1'
  98. GROUP BY
  99. um.`ID`
  100. ORDER BY
  101. `Uploads`;
  102. ";
  103. break;
  104. case 'requests':
  105. $Query = "
  106. SELECT
  107. COUNT(r.`ID`) AS `Requests`
  108. FROM
  109. `users_main` AS um
  110. JOIN `requests` AS r
  111. ON
  112. r.`FillerID` = um.`ID`
  113. WHERE
  114. um.`Enabled` = '1'
  115. GROUP BY
  116. um.`ID`
  117. ORDER BY
  118. `Requests`;
  119. ";
  120. break;
  121. case 'posts':
  122. $Query = "
  123. SELECT
  124. COUNT(p.`ID`) AS `Posts`
  125. FROM
  126. `users_main` AS um
  127. JOIN `forums_posts` AS p
  128. ON
  129. p.`AuthorID` = um.`ID`
  130. WHERE
  131. um.`Enabled` = '1'
  132. GROUP BY
  133. um.`ID`
  134. ORDER BY
  135. `Posts`;
  136. ";
  137. break;
  138. case 'bounty':
  139. $Query = "
  140. SELECT
  141. SUM(rv.`Bounty`) AS `Bounty`
  142. FROM
  143. `users_main` AS um
  144. JOIN `requests_votes` AS rv
  145. ON
  146. rv.`UserID` = um.`ID`
  147. WHERE
  148. um.`Enabled` = '1'
  149. GROUP BY
  150. um.`ID`
  151. ORDER BY
  152. `Bounty`;
  153. ";
  154. break;
  155. case 'artists':
  156. $Query = "
  157. SELECT
  158. COUNT(ta.`ArtistID`) AS `Artists`
  159. FROM
  160. `torrents_artists` AS ta
  161. JOIN `torrents_group` AS tg
  162. ON
  163. tg.`id` = ta.`GroupID`
  164. JOIN `torrents` AS t
  165. ON
  166. t.`GroupID` = tg.`id`
  167. WHERE
  168. t.`UserID` != ta.`UserID`
  169. GROUP BY
  170. tg.`id`
  171. ORDER BY
  172. `Artists` ASC
  173. ";
  174. break;
  175. }
  176. return $Query;
  177. }
  178. /**
  179. * get_rank
  180. */
  181. public static function get_rank($TableName, $Value)
  182. {
  183. if ($Value === 0) {
  184. return 0;
  185. }
  186. $Table = G::$Cache->get_value(self::PREFIX.$TableName);
  187. if (!$Table) {
  188. # Cache lock!
  189. $Lock = G::$Cache->get_value(self::PREFIX.$TableName.'_lock');
  190. if ($Lock) {
  191. return false;
  192. } else {
  193. G::$Cache->cache_value(self::PREFIX.$TableName.'_lock', '1', 300);
  194. $Table = self::build_table(self::PREFIX.$TableName, self::table_query($TableName));
  195. G::$Cache->delete_value(self::PREFIX.$TableName.'_lock');
  196. }
  197. }
  198. $LastPercentile = 0;
  199. foreach ($Table as $Row) {
  200. list($CurValue) = $Row;
  201. if ($CurValue >= $Value) {
  202. return $LastPercentile;
  203. }
  204. $LastPercentile++;
  205. }
  206. # 100th percentile
  207. return 100;
  208. }
  209. /**
  210. * overall_score
  211. */
  212. public static function overall_score($Uploaded, $Downloaded, $Uploads, $Requests, $Posts, $Bounty, $Artists, $Ratio)
  213. {
  214. # We can do this all in 1 line, but it's easier to read this way
  215. if ($Ratio > 1) {
  216. $Ratio = 1;
  217. }
  218. $TotalScore = 0;
  219. if (in_array(false, func_get_args(), true)) {
  220. return false;
  221. }
  222. $TotalScore += $Uploaded * 15;
  223. $TotalScore += $Downloaded * 8;
  224. $TotalScore += $Uploads * 25;
  225. $TotalScore += $Requests * 2;
  226. $TotalScore += $Posts;
  227. $TotalScore += $Bounty;
  228. $TotalScore += $Artists;
  229. $TotalScore /= (15 + 8 + 25 + 2 + 1 + 1 + 1);
  230. $TotalScore *= $Ratio;
  231. return $TotalScore;
  232. }
  233. }