diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d4fd0b722..88eacf309 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,3 +43,32 @@ jobs: with: name: TorrentPier-master path: ${{ steps.create-zip.outputs.ZIP_NAME }} + + deploy: + name: 🎉 Deploy + runs-on: ubuntu-22.04 + steps: + - name: 🚚 Get latest code + uses: actions/checkout@v4 + + - name: 🔩 Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.2' + + - name: 🖇 Install Composer dependencies + run: composer install --no-dev --no-progress --prefer-dist --optimize-autoloader + + - name: 📂 Sync files + uses: SamKirkland/FTP-Deploy-Action@v4.3.5 + with: + server: ${{ secrets.FTP_SERVER }} + username: ${{ secrets.FTP_USERNAME }} + password: ${{ secrets.FTP_PASSWORD }} + server-dir: ${{ secrets.FTP_DIR }} + protocol: ${{ secrets.FTP_PROTOCOL }} + port: ${{ secrets.FTP_PORT }} + exclude: | + **/.git* + **/.git*/** + .env diff --git a/CHANGELOG.md b/CHANGELOG.md index deebe3d07..7229399e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,29 +2,6 @@ # 📖 Change Log -## [v2.8.3](https://github.com/torrentpier/torrentpier/compare/v2.8.2..v2.8.3) (2025-07-03) - -### 🚀 Features - -- *(lang)* Added `RTL` languages support ([#2031](https://github.com/torrentpier/torrentpier/pull/2031)) - ([fd46d3d](https://github.com/torrentpier/torrentpier/commit/fd46d3d04ad3ab1453256b2ab620508e2ba33586)) -- *(updater)* Added exceptions logging ([#2026](https://github.com/torrentpier/torrentpier/pull/2026)) - ([51f2c70](https://github.com/torrentpier/torrentpier/commit/51f2c70d81b910012cdecd111b5b92c1dfd0d6f6)) - -### 🚜 Refactor - -- *(TorrentFileList)* Reduce duplication in root directory unset logic ([#2027](https://github.com/torrentpier/torrentpier/pull/2027)) - ([d4d8210](https://github.com/torrentpier/torrentpier/commit/d4d82101dd67c9f4cd86e0f6f909495696974354)) - - -## [v2.8.2](https://github.com/torrentpier/torrentpier/compare/v2.8.1..v2.8.2) (2025-06-30) - -### 🐛 Bug Fixes - -- *(TorrentFileList)* Avoid `array_merge` reindexing for numeric folder names ([#2014](https://github.com/torrentpier/torrentpier/pull/2014)) - ([915e1d8](https://github.com/torrentpier/torrentpier/commit/915e1d817c61d2a4f0691b24ec1bc6577a9cd44b)) - -### 🚜 Refactor - -- Use `DEFAULT_CHARSET` constant instead of hardcoded string ([#2011](https://github.com/torrentpier/torrentpier/pull/2011)) - ([7ac3359](https://github.com/torrentpier/torrentpier/commit/7ac335974baa44a8575bebb71ae2fbc0902d10e7)) - - ## [v2.8.1](https://github.com/torrentpier/torrentpier/compare/v2.8.0..v2.8.1) (2025-06-24) ### 🐛 Bug Fixes diff --git a/admin/index.php b/admin/index.php index 33cb3411d..3d3ddba58 100644 --- a/admin/index.php +++ b/admin/index.php @@ -90,7 +90,7 @@ if (isset($_GET['pane']) && $_GET['pane'] == 'left') { 'NEW_VERSION_SIZE' => $update_data['latest_version_size'], 'NEW_VERSION_DL_LINK' => $update_data['latest_version_dl_link'], 'NEW_VERSION_LINK' => $update_data['latest_version_link'], - 'NEW_VERSION_HASH' => $update_data['latest_version_checksum'] + 'NEW_VERSION_MD5' => $update_data['latest_version_checksum'] ]); } diff --git a/bt/announce.php b/bt/announce.php index 3c74e554f..ea1cca19a 100644 --- a/bt/announce.php +++ b/bt/announce.php @@ -115,7 +115,7 @@ $stopped = ($event === 'stopped'); // Check info_hash length if (strlen($info_hash) !== 20) { - msg_die('Invalid info_hash: ' . (mb_check_encoding($info_hash, DEFAULT_CHARSET) ? $info_hash : $info_hash_hex)); + msg_die('Invalid info_hash: ' . (mb_check_encoding($info_hash, 'UTF8') ? $info_hash : $info_hash_hex)); } /** @@ -257,7 +257,7 @@ if ($lp_info) { // Verify if torrent registered on tracker and user authorized if (empty($row['topic_id'])) { - msg_die('Torrent not registered, info_hash = ' . (mb_check_encoding($info_hash, DEFAULT_CHARSET) ? $info_hash : $info_hash_hex)); + msg_die('Torrent not registered, info_hash = ' . (mb_check_encoding($info_hash, 'UTF8') ? $info_hash : $info_hash_hex)); } if (empty($row['user_id'])) { msg_die('Please LOG IN and RE-DOWNLOAD this torrent (user not found)'); diff --git a/bt/scrape.php b/bt/scrape.php index d11ea0981..dd94ab8ff 100644 --- a/bt/scrape.php +++ b/bt/scrape.php @@ -32,7 +32,7 @@ $info_hash_hex = bin2hex($info_hash); // Check info_hash length if (strlen($info_hash) !== 20) { - msg_die('Invalid info_hash: ' . (mb_check_encoding($info_hash, DEFAULT_CHARSET) ? $info_hash : $info_hash_hex)); + msg_die('Invalid info_hash: ' . (mb_check_encoding($info_hash, 'UTF8') ? $info_hash : $info_hash_hex)); } // Handle multiple hashes @@ -97,7 +97,7 @@ if (!empty($info_hash_count)) { // Verify if torrent registered on tracker if (empty($torrents)) { - msg_die('Torrent not registered, info_hash = ' . (mb_check_encoding($info_hash, DEFAULT_CHARSET) ? $info_hash : $info_hash_hex)); + msg_die('Torrent not registered, info_hash = ' . (mb_check_encoding($info_hash, 'UTF8') ? $info_hash : $info_hash_hex)); } die(\Arokettu\Bencode\Bencode::encode($torrents)); diff --git a/library/config.php b/library/config.php index 75732614c..4837186f0 100644 --- a/library/config.php +++ b/library/config.php @@ -18,8 +18,8 @@ $reserved_port = env('TP_PORT', 80); $bb_cfg = []; // Version info -$bb_cfg['tp_version'] = 'v2.8.3'; -$bb_cfg['tp_release_date'] = '03-07-2025'; +$bb_cfg['tp_version'] = 'v2.8.1'; +$bb_cfg['tp_release_date'] = '24-06-2025'; $bb_cfg['tp_release_codename'] = 'Cattle'; // Increase version number after changing JS or CSS @@ -204,7 +204,6 @@ $bb_cfg['lang'] = [ 'ar' => [ 'name' => 'Arabic', 'locale' => 'ar_SA.UTF-8', - 'rtl' => true, ], 'hy' => [ 'name' => 'Armenian', @@ -281,7 +280,6 @@ $bb_cfg['lang'] = [ 'he' => [ 'name' => 'Hebrew', 'locale' => 'he_IL.UTF-8', - 'rtl' => true, ], 'hi' => [ 'name' => 'Hindi', diff --git a/library/includes/datastore/build_check_updates.php b/library/includes/datastore/build_check_updates.php index bdad01400..416a9d4f7 100644 --- a/library/includes/datastore/build_check_updates.php +++ b/library/includes/datastore/build_check_updates.php @@ -16,16 +16,9 @@ if (!config()->get('tp_updater_settings.enabled')) { } $data = []; -$data[] = ['latest_check_timestamp' => TIMENOW]; -try { - $updaterDownloader = new \TorrentPier\Updater(); - $updaterDownloader = $updaterDownloader->getLastVersion(config()->get('tp_updater_settings.allow_pre_releases')); -} catch (Exception $exception) { - bb_log('[Updater] Exception: ' . $exception->getMessage() . LOG_LF); - $this->store('check_updates', $data); - return; -} +$updaterDownloader = new \TorrentPier\Updater(); +$updaterDownloader = $updaterDownloader->getLastVersion(config()->get('tp_updater_settings.allow_pre_releases')); $getVersion = \TorrentPier\Helpers\VersionHelper::removerPrefix($updaterDownloader['tag_name']); $currentVersion = \TorrentPier\Helpers\VersionHelper::removerPrefix(config()->get('tp_version')); @@ -33,7 +26,6 @@ $currentVersion = \TorrentPier\Helpers\VersionHelper::removerPrefix(config()->ge // Has update! if (\z4kn4fein\SemVer\Version::greaterThan($getVersion, $currentVersion)) { $latestBuildFileLink = $updaterDownloader['assets'][0]['browser_download_url']; - $SHAFileHash = $updaterDownloader['assets'][0]['digest'] ?? ''; // Check updater file $updaterFile = readUpdaterFile(); @@ -47,12 +39,10 @@ if (\z4kn4fein\SemVer\Version::greaterThan($getVersion, $currentVersion)) { ]), UPDATER_FILE, replace_content: true); } - // Get MD5 / sha256 checksum + // Get MD5 checksum $buildFileChecksum = ''; - if (!empty($SHAFileHash)) { - $buildFileChecksum = $SHAFileHash; - } else { - $buildFileChecksum = 'MD5: ' . strtoupper(md5_file($latestBuildFileLink)); + if (isset($latestBuildFileLink)) { + $buildFileChecksum = strtoupper(md5_file($latestBuildFileLink)); } // Build data array @@ -66,4 +56,5 @@ if (\z4kn4fein\SemVer\Version::greaterThan($getVersion, $currentVersion)) { ]; } +$data[] = ['latest_check_timestamp' => TIMENOW]; $this->store('check_updates', $data); diff --git a/library/includes/functions.php b/library/includes/functions.php index c0302e66b..79c187db0 100644 --- a/library/includes/functions.php +++ b/library/includes/functions.php @@ -2212,10 +2212,10 @@ function infoByIP(string $ipAddress, int $port = 0): array ]; } } else { - bb_log("[FreeIPAPI] Failed to get IP info for: $ipAddress" . LOG_LF); + bb_log("[FreeIPAPI] Failed to get IP info for: $ipAddress"); } } catch (Exception $e) { - bb_log("[FreeIPAPI] " . $e->getMessage() . LOG_LF); + bb_log("[FreeIPAPI] " . $e->getMessage()); } if (empty($data)) { diff --git a/library/includes/page_header.php b/library/includes/page_header.php index 1ecfbafe6..e3bdc3e12 100644 --- a/library/includes/page_header.php +++ b/library/includes/page_header.php @@ -117,7 +117,6 @@ $template->assign_vars([ 'USER_HIDE_CAT' => (BB_SCRIPT == 'index'), 'USER_LANG' => $userdata['user_lang'], - 'USER_LANG_DIRECTION' => (isset($bb_cfg['lang'][$userdata['user_lang']]['rtl']) && $bb_cfg['lang'][$userdata['user_lang']]['rtl'] === true) ? 'rtl' : 'ltr', 'INCLUDE_BBCODE_JS' => !empty($page_cfg['include_bbcode_js']), 'USER_OPTIONS_JS' => IS_GUEST ? '{}' : json_encode($user->opt_js, JSON_THROW_ON_ERROR), diff --git a/library/includes/ucp/register.php b/library/includes/ucp/register.php index 62f1f7ed0..53d5bae2b 100644 --- a/library/includes/ucp/register.php +++ b/library/includes/ucp/register.php @@ -142,7 +142,6 @@ switch ($mode) { if (!$pr_data = DB()->fetch_row($sql)) { bb_die($lang['PROFILE_NOT_FOUND']); } - $pr_data['user_birthday'] = $pr_data['user_birthday']->format('Y-m-d'); if (IN_DEMO_MODE && isset($_COOKIE['user_lang'])) { $pr_data['user_lang'] = $_COOKIE['user_lang']; } diff --git a/library/includes/ucp/viewprofile.php b/library/includes/ucp/viewprofile.php index e9f8903a7..3d4605e68 100644 --- a/library/includes/ucp/viewprofile.php +++ b/library/includes/ucp/viewprofile.php @@ -30,8 +30,6 @@ if (!$profiledata = get_userdata($_GET[POST_USERS_URL], profile_view: true)) { bb_die($lang['NO_USER_ID_SPECIFIED']); } -$profiledata['user_birthday'] = $profiledata['user_birthday']->format('Y-m-d'); - if (!$ranks = $datastore->get('ranks')) { $datastore->update('ranks'); $ranks = $datastore->get('ranks'); diff --git a/src/Legacy/Common/User.php b/src/Legacy/Common/User.php index 77e844004..52bfafc01 100644 --- a/src/Legacy/Common/User.php +++ b/src/Legacy/Common/User.php @@ -232,7 +232,6 @@ class User } } - $this->data['user_birthday'] = $this->data['user_birthday']->format('Y-m-d'); return $this->data; } diff --git a/src/Legacy/TorrentFileList.php b/src/Legacy/TorrentFileList.php index 26617a595..b3fcaeccc 100644 --- a/src/Legacy/TorrentFileList.php +++ b/src/Legacy/TorrentFileList.php @@ -53,10 +53,8 @@ class TorrentFileList $this->build_filelist_array(); if ($this->multiple) { - if (isset($this->files_ary['/'])) { - if (!empty($this->files_ary['/'])) { - $this->files_ary = $this->files_ary + $this->files_ary['/']; - } + if (!empty($this->files_ary['/'])) { + $this->files_ary = array_merge($this->files_ary, $this->files_ary['/']); unset($this->files_ary['/']); } $filelist = $html->array2html($this->files_ary); diff --git a/src/Updater.php b/src/Updater.php index 3d64db47d..5ccba7843 100644 --- a/src/Updater.php +++ b/src/Updater.php @@ -38,13 +38,6 @@ class Updater */ public string $savePath; - /** - * LTS version pattern (v2.8.*) - * - * @var string - */ - private const LTS_VERSION_PATTERN = '/^v2\.8\.\d+$/'; - /** * Stream context * @@ -137,67 +130,23 @@ class Updater } /** - * Returns information of latest TorrentPier LTS version (v2.8.*) available + * Returns information of latest TorrentPier version available * * @param bool $allowPreReleases * @return array - * @throws Exception */ public function getLastVersion(bool $allowPreReleases = true): array { - // Filter releases to get only LTS versions (v2.8.*) - $ltsVersions = array_filter($this->jsonResponse, function ($release) { - return preg_match(self::LTS_VERSION_PATTERN, $release['tag_name']); - }); - - if (empty($ltsVersions)) { - throw new Exception('No LTS versions (v2.8.*) found'); - } - - // Sort LTS versions by version number (descending) - usort($ltsVersions, function ($a, $b) { - return version_compare($b['tag_name'], $a['tag_name']); - }); - if (!$allowPreReleases) { - foreach ($ltsVersions as $release) { - if (isset($release['prerelease']) && $release['prerelease']) { + foreach ($this->jsonResponse as $index) { + if (isset($index['prerelease']) && $index['prerelease']) { continue; } - return $release; - } - // If no stable LTS versions found - throw new Exception('No stable LTS versions (v2.8.*) found'); + return $index; + } } - return $ltsVersions[0]; - } - - /** - * Get all available LTS versions (v2.8.*) - * - * @param bool $allowPreReleases - * @return array - */ - public function getAllLTSVersions(bool $allowPreReleases = true): array - { - // Filter releases to get only LTS versions (v2.8.*) - $ltsVersions = array_filter($this->jsonResponse, function ($release) use ($allowPreReleases) { - $isLTSVersion = preg_match(self::LTS_VERSION_PATTERN, $release['tag_name']); - - if (!$allowPreReleases && isset($release['prerelease']) && $release['prerelease']) { - return false; - } - - return $isLTSVersion; - }); - - // Sort LTS versions by version number (descending) - usort($ltsVersions, function ($a, $b) { - return version_compare($b['tag_name'], $a['tag_name']); - }); - - return array_values($ltsVersions); + return $this->jsonResponse[0]; } } diff --git a/styles/templates/admin/index.tpl b/styles/templates/admin/index.tpl index f29030591..3c8f30941 100644 --- a/styles/templates/admin/index.tpl +++ b/styles/templates/admin/index.tpl @@ -1,7 +1,7 @@ - + @@ -160,7 +160,7 @@ {L_UPDATE_AVAILABLE}: - {updater.NEW_VERSION_NUMBER} ({L_SIZE}: {updater.NEW_VERSION_SIZE}) · {L_DOWNLOAD} · {L_CHANGELOG} · {updater.NEW_VERSION_HASH} + {updater.NEW_VERSION_NUMBER} ({L_SIZE}: {updater.NEW_VERSION_SIZE}) · {L_DOWNLOAD} · {L_CHANGELOG} · MD5: {updater.NEW_VERSION_MD5} diff --git a/styles/templates/default/page_header.tpl b/styles/templates/default/page_header.tpl index a4b2db8bf..0ec5fb8f5 100644 --- a/styles/templates/default/page_header.tpl +++ b/styles/templates/default/page_header.tpl @@ -1,5 +1,5 @@ - + diff --git a/viewtopic.php b/viewtopic.php index 6e7a2b9d2..806327ded 100644 --- a/viewtopic.php +++ b/viewtopic.php @@ -565,7 +565,6 @@ for ($i = 0; $i < $total_posts; $i++) { $poster_from = ($postrow[$i]['user_from'] && !$poster_guest) ? $postrow[$i]['user_from'] : ''; $poster_joined = !$poster_guest ? $lang['JOINED'] . ': ' . bb_date($postrow[$i]['user_regdate'], 'Y-m-d H:i') : ''; $poster_longevity = !$poster_guest ? delta_time($postrow[$i]['user_regdate']) : ''; - $poster_birthday = $postrow[$i]['user_birthday']->format('Y-m-d'); $post_id = $postrow[$i]['post_id']; $mc_type = (int)$postrow[$i]['mc_type']; $mc_comment = $postrow[$i]['mc_comment']; @@ -716,7 +715,7 @@ for ($i = 0; $i < $total_posts; $i++) { 'DELETE' => $delpost_btn, 'IP' => $ip_btn, - 'POSTER_BIRTHDAY' => user_birthday_icon($poster_birthday, $postrow[$i]['user_id']), + 'POSTER_BIRTHDAY' => user_birthday_icon($postrow[$i]['user_birthday'], $postrow[$i]['user_id']), 'MC_COMMENT' => $mc_type ? bbcode2html($mc_comment) : '', 'MC_BBCODE' => $mc_type ? $mc_comment : '',