CacheGenerator.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. <?php
  2. namespace ForkBB\Models\Actions;
  3. use ForkBB\Core\Container;
  4. use ForkBB\Models\User;
  5. class CacheGenerator
  6. {
  7. /**
  8. * Контейнер
  9. * @var Container
  10. */
  11. protected $c;
  12. /**
  13. * Конструктор
  14. * @param Container $container
  15. */
  16. public function __construct(Container $container)
  17. {
  18. $this->c = $container;
  19. }
  20. /**
  21. * Возвращает массив конфигурации форума
  22. * @return array
  23. */
  24. public function config()
  25. {
  26. return $this->c->DB->query('SELECT conf_name, conf_value FROM ::config')->fetchAll(\PDO::FETCH_KEY_PAIR);
  27. }
  28. /**
  29. * Возвращает массив банов
  30. * @return array
  31. */
  32. public function bans()
  33. {
  34. return $this->c->DB->query('SELECT id, username, ip, email, message, expire FROM ::bans')->fetchAll();
  35. }
  36. /**
  37. * Возвращает массив слов попадающий под цензуру
  38. * @return array
  39. */
  40. public function censoring()
  41. {
  42. $stmt = $this->c->DB->query('SELECT search_for, replace_with FROM ::censoring');
  43. $search = $replace = [];
  44. while ($row = $stmt->fetch()) {
  45. $replace[] = $row['replace_with'];
  46. $search[] = '%(?<![\p{L}\p{N}])('.str_replace('\*', '[\p{L}\p{N}]*?', preg_quote($row['search_for'], '%')).')(?![\p{L}\p{N}])%iu';
  47. }
  48. return [$search, $replace];
  49. }
  50. /**
  51. * Возвращает информацию о последнем зарегистрированном пользователе и
  52. * общем числе пользователей
  53. * @return array
  54. */
  55. public function usersInfo()
  56. {
  57. $stats = [];
  58. $stats['total_users'] = $this->c->DB->query('SELECT COUNT(id)-1 FROM ::users WHERE group_id!=?i', [$this->c->GROUP_UNVERIFIED])->fetchColumn();
  59. $stats['last_user'] = $this->c->DB->query('SELECT id, username FROM ::users WHERE group_id!=?i ORDER BY registered DESC LIMIT 1', [$this->c->GROUP_UNVERIFIED])->fetch();
  60. return $stats;
  61. }
  62. /**
  63. * Возвращает спимок id админов
  64. * @return array
  65. */
  66. public function admins()
  67. {
  68. return $this->c->DB->query('SELECT id FROM ::users WHERE group_id=?i', [$this->c->GROUP_ADMIN])->fetchAll(\PDO::FETCH_COLUMN);
  69. }
  70. /**
  71. * Возвращает массив с описанием смайлов
  72. * @return array
  73. */
  74. public function smilies()
  75. {
  76. return $this->c->DB->query('SELECT text, image FROM ::smilies ORDER BY disp_position')->fetchAll(\PDO::FETCH_KEY_PAIR); //???? text уникальное?
  77. }
  78. /**
  79. * Возвращает массив с описанием форумов для текущего пользователя
  80. * @return array
  81. */
  82. public function forums(User $user)
  83. {
  84. $stmt = $this->c->DB->query('SELECT g_read_board FROM ::groups WHERE g_id=?i:id', [':id' => $user->gId]);
  85. $read = $stmt->fetchColumn();
  86. $stmt->closeCursor();
  87. $tree = $desc = $asc = [];
  88. if ($read) {
  89. $stmt = $this->c->DB->query('SELECT c.id AS cid, c.cat_name, f.id AS fid, f.forum_name, f.redirect_url, f.parent_forum_id, f.disp_position FROM ::categories AS c INNER JOIN ::forums AS f ON c.id=f.cat_id LEFT JOIN ::forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=?i:id) WHERE fp.read_forum IS NULL OR fp.read_forum=1 ORDER BY c.disp_position, c.id, f.disp_position', [':id' => $user->gId]);
  90. while ($f = $stmt->fetch()) {
  91. $tree[$f['parent_forum_id']][$f['fid']] = $f;
  92. }
  93. $this->forumsDesc($desc, $tree);
  94. $this->forumsAsc($asc, $tree);
  95. }
  96. return [$tree, $desc, $asc];
  97. }
  98. protected function forumsDesc(&$list, $tree, $node = 0)
  99. {
  100. if (empty($tree[$node])) {
  101. return;
  102. }
  103. foreach ($tree[$node] as $id => $forum) {
  104. $list[$id] = $node ? array_merge([$node], $list[$node]) : []; //????
  105. $list[$id]['forum_name'] = $forum['forum_name'];
  106. $this->forumsDesc($list, $tree, $id);
  107. }
  108. }
  109. protected function forumsAsc(&$list, $tree, $nodes = [0])
  110. {
  111. $list[$nodes[0]][] = $nodes[0];
  112. if (empty($tree[$nodes[0]])) {
  113. return;
  114. }
  115. foreach ($tree[$nodes[0]] as $id => $forum) {
  116. $temp = [$id];
  117. foreach ($nodes as $i) {
  118. $list[$i][] = $id;
  119. $temp[] = $i;
  120. }
  121. $this->forumsAsc($list, $tree, $temp);
  122. }
  123. }
  124. }