From e1337ef5bc9cd7741d40cd645059019b5b5b576a Mon Sep 17 00:00:00 2001 From: Roman Kelesidis Date: Tue, 29 Jul 2025 22:16:46 +0300 Subject: [PATCH] feat(vote topic): Improved functionality & implemented caching (#2063) * feat(vote topic): Improved functionality & implemented caching * Update thanks.php * Update thanks.php * Update thanks.php * Update thanks.php * Update thanks.php * Update thanks.php * Update thanks.php * Update thanks.php * Update thanks.php --- library/ajax/thanks.php | 71 +++++++++++++++++++++++++++++++++++++---- library/config.php | 4 +-- 2 files changed, 67 insertions(+), 8 deletions(-) diff --git a/library/ajax/thanks.php b/library/ajax/thanks.php index cbe29ac01..bf536cdd7 100644 --- a/library/ajax/thanks.php +++ b/library/ajax/thanks.php @@ -29,6 +29,40 @@ if (!$poster_id = (int)$this->request['poster_id']) { $this->ajax_die($lang['NO_USER_ID_SPECIFIED']); } +$cache_lifetime = 3600; +$thanks_cache_key = 'topic_thanks_' . $topic_id; + +/** + * Get thanks by topic id + * + * @param $topic_id + * @param string $thanks_cache_key + * @param int $cache_lifetime + * @return array + */ +function get_thanks_list($topic_id, string $thanks_cache_key, int $cache_lifetime) +{ + if (!$cached_thanks = CACHE('bb_cache')->get($thanks_cache_key)) { + $cached_thanks = []; + $sql = DB()->fetch_rowset('SELECT u.username, u.user_rank, u.user_id, thx.* FROM ' . BB_THX . ' thx, ' . BB_USERS . " u WHERE thx.topic_id = $topic_id AND thx.user_id = u.user_id"); + + foreach ($sql as $row) { + $cached_thanks[$row['user_id']] = [ + 'user_id' => $row['user_id'], + 'username' => $row['username'], + 'user_rank' => $row['user_rank'], + 'time' => $row['time'] + ]; + } + + if (!empty($cached_thanks)) { + CACHE('bb_cache')->set($thanks_cache_key, $cached_thanks, $cache_lifetime); + } + } + + return $cached_thanks; +} + switch ($mode) { case 'add': if (IS_GUEST) { @@ -39,7 +73,8 @@ switch ($mode) { $this->ajax_die($lang['LIKE_OWN_POST']); } - if (DB()->fetch_row('SELECT topic_id FROM ' . BB_THX . " WHERE topic_id = $topic_id AND user_id = " . $userdata['user_id'])) { + $cached_thanks = get_thanks_list($topic_id, $thanks_cache_key, $cache_lifetime); + if (isset($cached_thanks[$userdata['user_id']])) { $this->ajax_die($lang['LIKE_ALREADY']); } @@ -47,10 +82,34 @@ switch ($mode) { $values = "$topic_id, {$userdata['user_id']}, " . TIMENOW; DB()->query('INSERT IGNORE INTO ' . BB_THX . " ($columns) VALUES ($values)"); + $cached_thanks[$userdata['user_id']] = [ + 'user_id' => $userdata['user_id'], + 'username' => $userdata['username'], + 'user_rank' => $userdata['user_rank'], + 'time' => TIMENOW + ]; + // Limit voters per topic - $thanks_count = DB()->fetch_row('SELECT COUNT(*) as thx FROM ' . BB_THX . " WHERE topic_id = $topic_id")['thx']; - if ($thanks_count > (int)$bb_cfg['tor_thank_limit_per_topic']) { - DB()->query('DELETE FROM ' . BB_THX . " WHERE topic_id = $topic_id ORDER BY time ASC LIMIT 1"); + $tor_thank_limit_per_topic = (int)$bb_cfg['tor_thank_limit_per_topic']; + if ($tor_thank_limit_per_topic > 0) { + $thanks_count = count($cached_thanks); + if ($thanks_count > $tor_thank_limit_per_topic) { + $oldest_user_id = null; + foreach ($cached_thanks as $user_id => $thanks_data) { + // First value + $oldest_user_id = $thanks_data['user_id']; + break; + } + + if ($oldest_user_id) { + DB()->query('DELETE FROM ' . BB_THX . " WHERE topic_id = $topic_id AND user_id = $oldest_user_id LIMIT 1"); + unset($cached_thanks[$oldest_user_id]); + } + } + } + + if (!empty($cached_thanks)) { + CACHE('bb_cache')->set($thanks_cache_key, $cached_thanks, $cache_lifetime); } break; case 'get': @@ -58,9 +117,9 @@ switch ($mode) { $this->ajax_die($lang['NEED_TO_LOGIN_FIRST']); } + $cached_thanks = get_thanks_list($topic_id, $thanks_cache_key, $cache_lifetime); $user_list = []; - $sql = DB()->fetch_rowset('SELECT u.username, u.user_rank, u.user_id, t.* FROM ' . BB_THX . ' t, ' . BB_USERS . " u WHERE t.topic_id = $topic_id AND t.user_id = u.user_id"); - foreach ($sql as $row) { + foreach ($cached_thanks as $row) { $user_list[] = '' . profile_url($row) . ' (' . bb_date($row['time']) . ')'; } diff --git a/library/config.php b/library/config.php index 847562369..407fa2e42 100644 --- a/library/config.php +++ b/library/config.php @@ -569,7 +569,7 @@ $bb_cfg['limit_max_search_results'] = false; // Limit for number of search resul // Posting $bb_cfg['prevent_multiposting'] = true; // TODO: replace "reply" with "edit last msg" if user (not admin or mod) is last topic poster -$bb_cfg['max_smilies'] = 25; //Max number of smilies in a post (0 - unlimited) +$bb_cfg['max_smilies'] = 25; // Max number of smilies in a post (0 - unlimited) $bb_cfg['max_symbols_post'] = 5000; // TODO: Max number of symbols in a post (0 - unlimited) // PM @@ -593,7 +593,7 @@ $bb_cfg['user_not_active_days_keep'] = 180; // After how many days should I dele // Vote for torrents $bb_cfg['tor_thank'] = true; $bb_cfg['tor_thanks_list_guests'] = true; // Show voters to guests -$bb_cfg['tor_thank_limit_per_topic'] = 50; +$bb_cfg['tor_thank_limit_per_topic'] = 50; // Set "0" to disable limit // Groups $bb_cfg['group_members_per_page'] = 50; // How many groups will be displayed in a page