PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/CleanUp.php

https://bitbucket.org/nexea/x00n
PHP | 232 lines | 193 code | 31 blank | 8 comment | 41 complexity | 8f7ccd9717ebcf1efb9b7552267c2283 MD5 | raw file
Possible License(s): GPL-2.0
  1. <?php
  2. function autoclean() {
  3. global $autoclean_interval;
  4. $now = time();
  5. $docleanup = 0;
  6. $res = mysql_query("SELECT value_u FROM avps WHERE arg = 'lastcleantime'");
  7. $row = mysql_fetch_array($res);
  8. if (!$row) {
  9. mysql_query("INSERT INTO avps (arg, value_u) VALUES ('lastcleantime',$now)");
  10. return;
  11. }
  12. $ts = $row[0];
  13. if ($ts + $autoclean_interval > $now)
  14. return;
  15. mysql_query("UPDATE avps SET value_u=$now WHERE arg='lastcleantime' AND value_u = $ts");
  16. if (!mysql_affected_rows())
  17. return;
  18. docleanup();
  19. }
  20. function docleanup() {
  21. global $torrent_dir, $signup_timeout, $max_dead_torrent_time, $autoclean_interval;
  22. set_time_limit(0);
  23. ignore_user_abort(1);
  24. do {
  25. $res = mysql_query("SELECT id FROM torrents");
  26. $ar = array();
  27. while ($row = mysql_fetch_array($res)) {
  28. $id = $row[0];
  29. $ar[$id] = 1;
  30. }
  31. if (!count($ar))
  32. break;
  33. $dp = @opendir($torrent_dir);
  34. if (!$dp)
  35. break;
  36. $ar2 = array();
  37. while (($file = readdir($dp)) !== false) {
  38. if (!preg_match('/^(\d+)\.torrent$/', $file, $m))
  39. continue;
  40. $id = $m[1];
  41. $ar2[$id] = 1;
  42. if (isset($ar[$id]) && $ar[$id])
  43. continue;
  44. $ff = $torrent_dir . "/$file";
  45. unlink($ff);
  46. }
  47. closedir($dp);
  48. if (!count($ar2))
  49. break;
  50. $delids = array();
  51. foreach (array_keys($ar) as $k) {
  52. if (isset($ar2[$k]) && $ar2[$k])
  53. continue;
  54. $delids[] = $k;
  55. unset($ar[$k]);
  56. }
  57. if (count($delids))
  58. mysql_query("DELETE FROM torrents WHERE id IN (" . join(",", $delids) . ")");
  59. $res = mysql_query("SELECT torrent FROM peers GROUP BY torrent");
  60. $delids = array();
  61. while ($row = mysql_fetch_array($res)) {
  62. $id = $row[0];
  63. if (isset($ar[$id]) && $ar[$id])
  64. continue;
  65. $delids[] = $id;
  66. }
  67. if (count($delids))
  68. mysql_query("DELETE FROM peers WHERE torrent IN (" . join(",", $delids) . ")");
  69. $res = mysql_query("SELECT torrent FROM files GROUP BY torrent");
  70. $delids = array();
  71. while ($row = mysql_fetch_array($res)) {
  72. $id = $row[0];
  73. if ($ar[$id])
  74. continue;
  75. $delids[] = $id;
  76. }
  77. if (count($delids))
  78. mysql_query("DELETE FROM files WHERE torrent IN (" . join(",", $delids) . ")");
  79. } while (0);
  80. $deadtime = deadtime();
  81. mysql_query("DELETE FROM peers WHERE last_action < FROM_UNIXTIME($deadtime)");
  82. $deadtime -= $max_dead_torrent_time;
  83. mysql_query("UPDATE torrents SET visible='no' WHERE visible='yes' AND last_action < FROM_UNIXTIME($deadtime)");
  84. $deadtime = time() - $signup_timeout;
  85. mysql_query("DELETE FROM users WHERE status = 'pending' AND added < FROM_UNIXTIME($deadtime) AND last_login < FROM_UNIXTIME($deadtime) AND last_access < FROM_UNIXTIME($deadtime)");
  86. $torrents = array();
  87. $res = mysql_query("SELECT torrent, seeder, COUNT(*) AS c FROM peers GROUP BY torrent, seeder");
  88. while ($row = mysql_fetch_assoc($res)) {
  89. if ($row["seeder"] == "yes")
  90. $key = "seeders";
  91. else
  92. $key = "leechers";
  93. $torrents[$row["torrent"]][$key] = $row["c"];
  94. }
  95. $res = mysql_query("SELECT torrent, COUNT(*) AS c FROM comments GROUP BY torrent");
  96. while ($row = mysql_fetch_assoc($res)) {
  97. $torrents[$row["torrent"]]["comments"] = $row["c"];
  98. }
  99. $fields = explode(":", "comments:leechers:seeders");
  100. $res = mysql_query("SELECT id, seeders, leechers, comments FROM torrents");
  101. while ($row = mysql_fetch_assoc($res)) {
  102. $id = $row["id"];
  103. $torr = $torrents[$id];
  104. foreach ($fields as $field) {
  105. if (!isset($torr[$field]))
  106. $torr[$field] = 0;
  107. }
  108. $update = array();
  109. foreach ($fields as $field) {
  110. if ($torr[$field] != $row[$field])
  111. $update[] = "$field = " . $torr[$field];
  112. }
  113. if (count($update))
  114. mysql_query("UPDATE torrents SET " . implode(",", $update) . " WHERE id = $id");
  115. }
  116. //delete inactive user accounts
  117. $secs = 42*86400;
  118. $dt = sqlesc(get_date_time(gmtime() - $secs));
  119. $maxclass = UC_POWER_USER;
  120. mysql_query("DELETE FROM users WHERE status='confirmed' AND class <= $maxclass AND last_access < $dt");
  121. // lock topics where last post was made more than x days ago
  122. $secs = 7*86400;
  123. $res = mysql_query("SELECT topics.id FROM topics JOIN posts ON topics.lastpost = posts.id AND topics.sticky = 'no' WHERE " . gmtime() . " - UNIX_TIMESTAMP(posts.added) > $secs") or mysql_error();
  124. while ($arr = mysql_fetch_assoc($res))
  125. mysql_query("UPDATE topics SET locked='yes' WHERE id=$arr[id]") or mysql_error();
  126. //remove expired warnings
  127. $res = mysql_query("SELECT id FROM users WHERE warned='yes' AND warneduntil < NOW() AND warneduntil <> '0000-00-00 00:00:00'") or mysql_error();
  128. if (mysql_num_rows($res) > 0)
  129. {
  130. $dt = sqlesc(get_date_time());
  131. $msg = sqlesc("Your warning has been removed. Please keep in your best behaviour from now on.\n");
  132. while ($arr = mysql_fetch_assoc($res))
  133. {
  134. mysql_query("UPDATE users SET warned = 'no', warneduntil = '0000-00-00 00:00:00' WHERE id = $arr[id]") or mysql_error();
  135. mysql_query("INSERT INTO messages (sender, receiver, added, msg, poster) VALUES(0, $arr[id], $dt, $msg, 0)") or mysql_error();
  136. }
  137. }
  138. // promote power users
  139. $limit = 25*1024*1024*1024;
  140. $minratio = 1.05;
  141. $maxdt = sqlesc(get_date_time(gmtime() - 86400*28));
  142. $res = mysql_query("SELECT id FROM users WHERE class = 0 AND uploaded >= $limit AND uploaded / downloaded >= $minratio AND added < $maxdt") or mysql_error();
  143. if (mysql_num_rows($res) > 0)
  144. {
  145. $dt = sqlesc(get_date_time());
  146. $msg = sqlesc("Congratulations, you have been auto-promoted to [b]Power User[/b]. :)\nYou can now download dox over 1 meg and view torrent NFOs.\n");
  147. while ($arr = mysql_fetch_assoc($res))
  148. {
  149. mysql_query("UPDATE users SET class = 1 WHERE id = $arr[id]") or mysql_error();
  150. mysql_query("INSERT INTO messages (sender, receiver, added, msg, poster) VALUES(0, $arr[id], $dt, $msg, 0)") or mysql_error();
  151. }
  152. }
  153. // demote power users
  154. $minratio = 0.95;
  155. $res = mysql_query("SELECT id FROM users WHERE class = 1 AND uploaded / downloaded < $minratio") or mysql_error();
  156. if (mysql_num_rows($res) > 0)
  157. {
  158. $dt = sqlesc(get_date_time());
  159. $msg = sqlesc("You have been auto-demoted from [b]Power User[/b] to [b]User[/b] because your share ratio has dropped below $minratio.\n");
  160. while ($arr = mysql_fetch_assoc($res))
  161. {
  162. mysql_query("UPDATE users SET class = 0 WHERE id = $arr[id]") or mysql_error();
  163. mysql_query("INSERT INTO messages (sender, receiver, added, msg, poster) VALUES(0, $arr[id], $dt, $msg, 0)") or mysql_error();
  164. }
  165. }
  166. // Update stats
  167. $seeders = get_row_count("peers", "WHERE seeder='yes'");
  168. $leechers = get_row_count("peers", "WHERE seeder='no'");
  169. mysql_query("UPDATE avps SET value_u=$seeders WHERE arg='seeders'") or mysql_error();
  170. mysql_query("UPDATE avps SET value_u=$leechers WHERE arg='leechers'") or mysql_error();
  171. // update forum post/topic count
  172. $forums = mysql_query("select id from forums");
  173. while ($forum = mysql_fetch_assoc($forums))
  174. {
  175. $postcount = 0;
  176. $topiccount = 0;
  177. $topics = mysql_query("select id from topics where forumid=$forum[id]");
  178. while ($topic = mysql_fetch_assoc($topics))
  179. {
  180. $res = mysql_query("select count(*) from posts where topicid=$topic[id]");
  181. $arr = mysql_fetch_row($res);
  182. $postcount += $arr[0];
  183. ++$topiccount;
  184. }
  185. mysql_query("update forums set postcount=$postcount, topiccount=$topiccount where id=$forum[id]");
  186. }
  187. // delete old torrents
  188. $days = 28;
  189. $dt = sqlesc(get_date_time(gmtime() - ($days * 86400)));
  190. $res = mysql_query("SELECT id, name FROM torrents WHERE added < $dt");
  191. while ($arr = mysql_fetch_assoc($res))
  192. {
  193. @unlink("$torrent_dir/$arr[id].torrent");
  194. mysql_query("DELETE FROM torrents WHERE id=$arr[id]");
  195. mysql_query("DELETE FROM peers WHERE torrent=$arr[id]");
  196. mysql_query("DELETE FROM comments WHERE torrent=$arr[id]");
  197. mysql_query("DELETE FROM files WHERE torrent=$arr[id]");
  198. write_log("Torrent $arr[id] ($arr[name]) was deleted by system (older than $days days)");
  199. }
  200. }
  201. ?>