diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index c3a7bf266..799818d98 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -1,7 +1,7 @@
name: Bug Report
description: File a bug report
title: "[Bug]"
-labels: [Bug]
+labels: Bug
body:
- type: markdown
attributes:
@@ -21,7 +21,7 @@ body:
attributes:
label: PHP & Platform
description: Exact PHP and Platform (OS) versions your using.
- placeholder: 8.2.2 - Ubuntu 22.04 x64
+ placeholder: 8.1.2 - Ubuntu 22.04 x64
validations:
required: true
- type: checkboxes
diff --git a/.github/ISSUE_TEMPLATE/feature---enhancement-request.md b/.github/ISSUE_TEMPLATE/feature---enhancement-request.md
index 9f68fc3a6..dafdbd2ec 100644
--- a/.github/ISSUE_TEMPLATE/feature---enhancement-request.md
+++ b/.github/ISSUE_TEMPLATE/feature---enhancement-request.md
@@ -2,6 +2,6 @@
name: Feature / Enhancement request
about: Suggest an idea for TorrentPier
title: "[Feature]"
-labels: [Feature, Enhancement]
+labels: Feature, Enhancement
assignees: ''
---
diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml
index f257360c6..8e3c8daf8 100644
--- a/.github/workflows/cd.yml
+++ b/.github/workflows/cd.yml
@@ -41,10 +41,13 @@ jobs:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
- php-version: '8.2'
+ php-version: '8.1'
+
+ - name: Update composer.lock file
+ run: composer update --no-install
- name: Install Composer dependencies
- run: composer install --no-dev --no-progress --prefer-dist --optimize-autoloader
+ run: composer install --no-progress --prefer-dist --optimize-autoloader
- name: Cleanup
run: php _cleanup.php && rm _cleanup.php
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d4fd0b722..e38c0ad2a 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -3,7 +3,7 @@ name: Continuous Integration
on:
push:
branches:
- - master
+ - v2.4
jobs:
nightly:
@@ -17,10 +17,13 @@ jobs:
- name: Setup PHP 🔩
uses: shivammathur/setup-php@v2
with:
- php-version: '8.2'
+ php-version: '8.1'
+
+ - name: Update composer.lock file
+ run: composer update --no-install
- name: Install Composer dependencies 🪚
- run: composer install --no-dev --no-progress --prefer-dist --optimize-autoloader
+ run: composer install --no-progress --prefer-dist --optimize-autoloader
- name: Get commit hash 🔗
id: get-commit-hash
@@ -41,5 +44,5 @@ jobs:
- name: Upload Archive 📤
uses: actions/upload-artifact@v4
with:
- name: TorrentPier-master
+ name: TorrentPier-v2.4
path: ${{ steps.create-zip.outputs.ZIP_NAME }}
diff --git a/.github/workflows/phpmd.yml b/.github/workflows/phpmd.yml
index 3e06d7538..0bc28da28 100644
--- a/.github/workflows/phpmd.yml
+++ b/.github/workflows/phpmd.yml
@@ -17,10 +17,10 @@ name: PHPMD
on:
push:
- branches: [ "master" ]
+ branches: [ "v2.4" ]
pull_request:
# The branches below must be a subset of the branches above
- branches: [ "master" ]
+ branches: [ "v2.4" ]
schedule:
- cron: '40 0 * * 3'
diff --git a/.github/workflows/schedule.yml b/.github/workflows/schedule.yml
index c1ad4f3c1..d0ab3b5a9 100644
--- a/.github/workflows/schedule.yml
+++ b/.github/workflows/schedule.yml
@@ -14,7 +14,7 @@ jobs:
uses: actions/checkout@v4
with:
fetch-depth: 0
- ref: master
+ ref: v2.4
token: ${{ secrets.REPO_TOKEN }}
- name: Generate a changelog
@@ -22,7 +22,7 @@ jobs:
id: git-cliff
with:
config: cliff.toml
- args: v2.4.6-alpha.4.. --verbose
+ args: v2.4.5-rc.2.. --verbose
env:
OUTPUT: CHANGELOG.md
GITHUB_REPO: ${{ github.repository }}
@@ -32,10 +32,10 @@ jobs:
- name: Commit changelog
run: |
- git checkout master
+ git checkout v2.4
git config --local user.name 'belomaxorka'
git config --local user.email 'roman25052006.kelesh@gmail.com'
set +e
git add CHANGELOG.md
git commit -m "changelog: Update CHANGELOG.md 📖"
- git push https://${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git master
+ git push https://${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git v2.4
diff --git a/CHANGELOG.md b/CHANGELOG.md
index deebe3d07..27ed9c8e6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,112 +2,382 @@
# 📖 Change Log
-## [v2.8.3](https://github.com/torrentpier/torrentpier/compare/v2.8.2..v2.8.3) (2025-07-03)
+## [v2.4.9](https://github.com/torrentpier/torrentpier/compare/v2.4.8..v2.4.9) (2025-07-02)
### 🚀 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))
+- *(updater)* Added exceptions logging ([#2026](https://github.com/torrentpier/torrentpier/pull/2026)) - ([57d0d59](https://github.com/torrentpier/torrentpier/commit/57d0d59b5379600f63cf7d5f774e3ec000e39473))
### 🚜 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))
+- *(TorrentFileList)* Reduce duplication in root directory unset logic ([#2027](https://github.com/torrentpier/torrentpier/pull/2027)) - ([6840376](https://github.com/torrentpier/torrentpier/commit/68403760c1e9e01133536bb5021b08d9101d323e))
-## [v2.8.2](https://github.com/torrentpier/torrentpier/compare/v2.8.1..v2.8.2) (2025-06-30)
+## [v2.4.8](https://github.com/torrentpier/torrentpier/compare/v2.4.7..v2.4.8) (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))
+- *(TorrentFileList)* Avoid `array_merge` reindexing for numeric folder names ([#2014](https://github.com/torrentpier/torrentpier/pull/2014)) - ([a5fbc2f](https://github.com/torrentpier/torrentpier/commit/a5fbc2ffc7389c30ffbb98d253ff8e936528fec1))
+- *(redirect)* Add no-cache headers to prevent browser caching of redirects ([#2010](https://github.com/torrentpier/torrentpier/pull/2010)) - ([134b3df](https://github.com/torrentpier/torrentpier/commit/134b3dfa5cd8e8e5ce3f10912b58afecc4f118e0))
### 🚜 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))
+- Use `DEFAULT_CHARSET` constant instead of hardcoded string ([#2011](https://github.com/torrentpier/torrentpier/pull/2011)) - ([c2cbc77](https://github.com/torrentpier/torrentpier/commit/c2cbc77b144057d3d37cd58b635eabc6280fe137))
-## [v2.8.1](https://github.com/torrentpier/torrentpier/compare/v2.8.0..v2.8.1) (2025-06-24)
+## [v2.4.7](https://github.com/torrentpier/torrentpier/compare/v2.4.6..v2.4.7) (2025-06-24)
### 🐛 Bug Fixes
-- *(filelist)* `Undefined property: FileTree::$length` when v2 torrent only ([#2004](https://github.com/torrentpier/torrentpier/pull/2004)) - ([7f4cc9d](https://github.com/torrentpier/torrentpier/commit/7f4cc9d3b9a5b87100f710cc60f636d6e7d5a34e))
-- *(ip-api)* Add error handling and logging for freeipapi.com requests ([#2006](https://github.com/torrentpier/torrentpier/pull/2006)) - ([f1d6e74](https://github.com/torrentpier/torrentpier/commit/f1d6e74e5d4c74b6e12e9e742f60f62e71783d11))
+- *(filelist)* `Undefined property: FileTree::$length` when v2 torrent only ([#2004](https://github.com/torrentpier/torrentpier/pull/2004)) - ([8c161ce](https://github.com/torrentpier/torrentpier/commit/8c161ceae0f80a3ffe57da06dbadd1f9a53272f3))
+- *(ip-api)* Add error handling and logging for freeipapi.com requests ([#2006](https://github.com/torrentpier/torrentpier/pull/2006)) - ([12ce6e7](https://github.com/torrentpier/torrentpier/commit/12ce6e783ec97a6c3df0e11273944a3e6cfe466d))
+
+### 📚 Documentation
+
+- Changed nightly.link url in `README.md` ([#1977](https://github.com/torrentpier/torrentpier/pull/1977)) - ([dc64426](https://github.com/torrentpier/torrentpier/commit/dc64426574087e69bc7e056a89ff367438e37344))
+- Updated `Requirements` sections in README.md ([#1975](https://github.com/torrentpier/torrentpier/pull/1975)) - ([b7bc7f9](https://github.com/torrentpier/torrentpier/commit/b7bc7f91662b050082843d18b03376dc67efa3e0))
+- Fixed some typos in `README.md` ([#1974](https://github.com/torrentpier/torrentpier/pull/1974)) - ([403fcf2](https://github.com/torrentpier/torrentpier/commit/403fcf2aca4b2d70bfca194107f4b4f5c5ba7f03))
-## [v2.8.0](https://github.com/torrentpier/torrentpier/compare/v2.7.0..v2.8.0) (2025-06-21)
+## [v2.4.6](https://github.com/torrentpier/torrentpier/compare/v2.4.6-alpha.4..v2.4.6) (2025-06-19)
### 🐛 Bug Fixes
-- *(template)* Handle L_ variables in template vars when not found in lang vars ([#1998](https://github.com/torrentpier/torrentpier/pull/1998)) - ([c6076c2](https://github.com/torrentpier/torrentpier/commit/c6076c2c278e9a423f3862670236b75bddeadd87))
-
-
-## [v2.7.0](https://github.com/torrentpier/torrentpier/compare/v2.6.0..v2.7.0) (2025-06-21)
-
-### 🚀 Features
-
-- *(database)* Add visual markers for Nette Explorer queries in debug panel ([#1965](https://github.com/torrentpier/torrentpier/pull/1965)) - ([2fd3067](https://github.com/torrentpier/torrentpier/commit/2fd306704f21febee7d53f4b4531601ce0cb81ce))
-- *(language)* Add new language variable for migration file and enhance template fallback logic ([#1984](https://github.com/torrentpier/torrentpier/pull/1984)) - ([a33574c](https://github.com/torrentpier/torrentpier/commit/a33574c28f2eb6267a74fa6c9d97fea86527157a))
-- *(migrations)* Implement Phinx database migration system ([#1976](https://github.com/torrentpier/torrentpier/pull/1976)) - ([fbde8cd](https://github.com/torrentpier/torrentpier/commit/fbde8cd421c9048afe70ddb41d0a9ed26d3fbef5))
-- *(test)* [**breaking**] Add comprehensive testing infrastructure with Pest PHP ([#1979](https://github.com/torrentpier/torrentpier/pull/1979)) - ([cc9d412](https://github.com/torrentpier/torrentpier/commit/cc9d412522938a023bd2b8eb880c4d2dd307c82a))
-- [**breaking**] Implement Language singleton with shorthand functions ([#1966](https://github.com/torrentpier/torrentpier/pull/1966)) - ([49717d3](https://github.com/torrentpier/torrentpier/commit/49717d3a687b95885fe9773f2597354aed4b2b60))
-
-### 🐛 Bug Fixes
-
-- *(database)* Update affected rows tracking in Database class ([#1980](https://github.com/torrentpier/torrentpier/pull/1980)) - ([4f9cc9f](https://github.com/torrentpier/torrentpier/commit/4f9cc9fe0f7f4a85c90001a3f5514efdf04836da))
-
-### 🚜 Refactor
-
-- *(database)* Enhance error logging and various fixes ([#1978](https://github.com/torrentpier/torrentpier/pull/1978)) - ([7aed6bc](https://github.com/torrentpier/torrentpier/commit/7aed6bc7d89f4ed31e7ed6c6eeecc6e08d348c24))
-- *(database)* Rename DB to Database and extract debug functionality ([#1964](https://github.com/torrentpier/torrentpier/pull/1964)) - ([6c0219d](https://github.com/torrentpier/torrentpier/commit/6c0219d53c7544b7d8a6374c0d0848945d32ae17))
-- *(stats)* Improve database row fetching in tr_stats.php ([#1985](https://github.com/torrentpier/torrentpier/pull/1985)) - ([728116d](https://github.com/torrentpier/torrentpier/commit/728116d6dc9cf4476cce572ced5e8a7ef529ead8))
-
-### ⚙️ Miscellaneous
-
-- Update minimum `PHP` requirement to `8.2` ([#1987](https://github.com/torrentpier/torrentpier/pull/1987)) - ([9b322c7](https://github.com/torrentpier/torrentpier/commit/9b322c7093a634669e9f17a32ac42500f44f2496))
-- Removed useless `composer update` from workflows & installer ([#1986](https://github.com/torrentpier/torrentpier/pull/1986)) - ([423424e](https://github.com/torrentpier/torrentpier/commit/423424e9478e0772957014fb30f5e84158067af7))
-- Added --no-dev composer flag for some workflows ([#1982](https://github.com/torrentpier/torrentpier/pull/1982)) - ([e9a9e09](https://github.com/torrentpier/torrentpier/commit/e9a9e095768ba68aa5d5058a3e152ffaec916117))
-- Added `--no-dev` composer flag for some workflows ([#1981](https://github.com/torrentpier/torrentpier/pull/1981)) - ([e8cba5d](https://github.com/torrentpier/torrentpier/commit/e8cba5dd3fc83b616f83c24991f79dc7258c5df3))
-
-
-## [v2.6.0](https://github.com/torrentpier/torrentpier/compare/v2.5.0..v2.6.0) (2025-06-18)
-
-### 🚀 Features
-
-- [**breaking**] Implement unified cache system with Nette Caching ([#1963](https://github.com/torrentpier/torrentpier/pull/1963)) - ([07a06a3](https://github.com/torrentpier/torrentpier/commit/07a06a33cd97b37f68b533a87cdb5f7578f2c86f))
-- Replace legacy database layer with Nette Database implementation ([#1961](https://github.com/torrentpier/torrentpier/pull/1961)) - ([f50b914](https://github.com/torrentpier/torrentpier/commit/f50b914cc18f777d92002baf2c812a635d5eed4b))
-
-### 🐛 Bug Fixes
-
-- *(User)* Add null and array checks before session data operations ([#1962](https://github.com/torrentpier/torrentpier/pull/1962)) - ([e458109](https://github.com/torrentpier/torrentpier/commit/e458109eefc54d86a78a1ddb3954581524852516))
-
-
-## [v2.5.0](https://github.com/torrentpier/torrentpier/compare/v2.4.6-alpha.4..v2.5.0) (2025-06-18)
-
-### 🚀 Features
-
-- [**breaking**] Implement centralized Config class to replace global $bb_cfg array ([#1953](https://github.com/torrentpier/torrentpier/pull/1953)) - ([bf9100f](https://github.com/torrentpier/torrentpier/commit/bf9100fbfa74768edb01c62636198a44739d9923))
-
-### 🐛 Bug Fixes
-
-- *(installer)* Strip protocol from TP_HOST to keep only hostname ([#1952](https://github.com/torrentpier/torrentpier/pull/1952)) - ([81bf67c](https://github.com/torrentpier/torrentpier/commit/81bf67c2be85d49e988b7802ca7e9738ff580031))
-- *(sql)* Resolve only_full_group_by compatibility issues in tracker cleanup ([#1951](https://github.com/torrentpier/torrentpier/pull/1951)) - ([37a0675](https://github.com/torrentpier/torrentpier/commit/37a0675adfb02014e7068f4aa82301e29f39eab6))
+- *(installer)* Strip protocol from TP_HOST to keep only hostname ([#1969](https://github.com/torrentpier/torrentpier/pull/1969)) - ([15f9948](https://github.com/torrentpier/torrentpier/commit/15f994840331b135cd64c0cd61de95fecfc29db8))
+- *(sql)* Resolve `only_full_group_by` compatibility issues in tracker cleanup - ([faf3d79](https://github.com/torrentpier/torrentpier/commit/faf3d7919249d869d8ca8d41617dd4356dc0ac48))
+- Duplicate column SQL query issues in `viewtopic.php` ([#1973](https://github.com/torrentpier/torrentpier/pull/1973)) - ([6a1d682](https://github.com/torrentpier/torrentpier/commit/6a1d6823856dd7c3cef45bea2681828526d1b9f8))
+- SQL queries in online_userlist.php to use MAX() for session data and adjusted GROUP BY clause for better accuracy ([#1971](https://github.com/torrentpier/torrentpier/pull/1971)) - ([2a8b6da](https://github.com/torrentpier/torrentpier/commit/2a8b6daecf63752b8a852c950e9a7fd08e17f57c))
### 📦 Dependencies
- *(deps)* Bump filp/whoops from 2.18.2 to 2.18.3 ([#1948](https://github.com/torrentpier/torrentpier/pull/1948)) - ([b477680](https://github.com/torrentpier/torrentpier/commit/b4776804a408217229caa327c79849cf13ce2aa5))
-### 🚜 Refactor
-
-- *(censor)* [**breaking**] Migrate Censor class to singleton pattern ([#1954](https://github.com/torrentpier/torrentpier/pull/1954)) - ([74a564d](https://github.com/torrentpier/torrentpier/commit/74a564d7954c6f8745ebcffdcd9c8997e371d47a))
-- *(config)* [**breaking**] Encapsulate global $bb_cfg array in Config class ([#1950](https://github.com/torrentpier/torrentpier/pull/1950)) - ([5842994](https://github.com/torrentpier/torrentpier/commit/5842994782dfa62788f8427c55045abdbfb5b8e9))
-
-### 📚 Documentation
-
-- Add Select class migration guide ([#1960](https://github.com/torrentpier/torrentpier/pull/1960)) - ([86abafb](https://github.com/torrentpier/torrentpier/commit/86abafb11469d14a746d12725b15cf6b7015ec44))
-
### ⚙️ Miscellaneous
- *(_release.php)* Finally! Removed some useless params ([#1947](https://github.com/torrentpier/torrentpier/pull/1947)) - ([9c7d270](https://github.com/torrentpier/torrentpier/commit/9c7d270598c0153fb82f4b7ad96f5b59399b2159))
-- *(cliff)* Add conventional commit prefix to changelog message ([#1957](https://github.com/torrentpier/torrentpier/pull/1957)) - ([b1b2618](https://github.com/torrentpier/torrentpier/commit/b1b26187579f6981165d85c316a3c5b7199ce2ee))
+- *(cliff)* Add conventional commit prefix to changelog message ([#1970](https://github.com/torrentpier/torrentpier/pull/1970)) - ([7d9594e](https://github.com/torrentpier/torrentpier/commit/7d9594eedab1b2c81d888dfba68ded1b8a142282))
+- Changed active branch name in `_release.php` ([#1972](https://github.com/torrentpier/torrentpier/pull/1972)) - ([7dc69ba](https://github.com/torrentpier/torrentpier/commit/7dc69ba699c75d87c709a799291c4b544b3e92aa))
+- Changed branch name from `master` to `v2.4` ([#1968](https://github.com/torrentpier/torrentpier/pull/1968)) - ([a8e252f](https://github.com/torrentpier/torrentpier/commit/a8e252f64f7205b7bb24739ab637144c6fb022d6))
+
+## New Contributors ❤️
+
+* @belomaxorka made their first contribution
+* @dependabot[bot] made their first contribution in [#1948](https://github.com/torrentpier/torrentpier/pull/1948)
+
+## [v2.4.6-alpha.4](https://github.com/torrentpier/torrentpier/compare/v2.4.6-alpha.3..v2.4.6-alpha.4) (2025-06-13)
+
+### ⚙️ Miscellaneous
+
+- *(_release.php)* Use `GPG` sign for tags by default ([#1946](https://github.com/torrentpier/torrentpier/pull/1946)) - ([0271b21](https://github.com/torrentpier/torrentpier/commit/0271b21a5e8c9dce918da9954547d81dae2a1d4b))
+## [v2.4.6-alpha.3](https://github.com/torrentpier/torrentpier/compare/v2.4.6-alpha.2..v2.4.6-alpha.3) (2025-06-13)
+
+### ⚙️ Miscellaneous
+
+- *(_release.php)* Minor improvements ([#1945](https://github.com/torrentpier/torrentpier/pull/1945)) - ([e5811f9](https://github.com/torrentpier/torrentpier/commit/e5811f9c66eef7f228b51fb82ffda3bcddeb915d))
+
+
+## [v2.4.6-alpha.2](https://github.com/torrentpier/torrentpier/compare/v2.4.6-alpha.1..v2.4.6-alpha.2) (2025-06-12)
+
+### 🚀 Features
+
+- *(ajax)* Log full ajax request/response data to console in explain mode ([#1942](https://github.com/torrentpier/torrentpier/pull/1942)) - ([bcf4eb4](https://github.com/torrentpier/torrentpier/commit/bcf4eb4e9baacf27e23a2b7c7135918ec3356c1a))
+- Improved ajax debug ([#1941](https://github.com/torrentpier/torrentpier/pull/1941)) - ([6f03f75](https://github.com/torrentpier/torrentpier/commit/6f03f750bab400f5e8a74bd05c9ee167343959ab))
+- Add console log for ajax actions when explain cookie is set ([#1940](https://github.com/torrentpier/torrentpier/pull/1940)) - ([345dd1b](https://github.com/torrentpier/torrentpier/commit/345dd1bc20928e25dc72befb705502156e47f1d7))
+
+### 🐛 Bug Fixes
+
+- Set `$datastore->enqueue` before `$datastore->get` ([#1937](https://github.com/torrentpier/torrentpier/pull/1937)) - ([bf328dd](https://github.com/torrentpier/torrentpier/commit/bf328dd69ec42e417275f037dc59a15a2867d7f4))
+
+### 📦 Dependencies
+
+- *(deps)* Bump filp/whoops from 2.18.1 to 2.18.2 ([#1943](https://github.com/torrentpier/torrentpier/pull/1943)) - ([9a52955](https://github.com/torrentpier/torrentpier/commit/9a529558b41f620e8347cc1091f59b1f2d864ca9))
+
+### 🗑️ Removed
+
+- `'cat_forums'` from enqueue list in `get_forum_mods` ajax ([#1939](https://github.com/torrentpier/torrentpier/pull/1939)) - ([28e38aa](https://github.com/torrentpier/torrentpier/commit/28e38aa78103c8233e15439ecd886187a55d5e12))
+- Extra `CFG_DIR` constant ([#1936](https://github.com/torrentpier/torrentpier/pull/1936)) - ([4b16b84](https://github.com/torrentpier/torrentpier/commit/4b16b847f542e3608c8bb4d97d1f27f7fd6c97b7))
+
+### ⚙️ Miscellaneous
+
+- *(_release.php)* Minor improvements ([#1938](https://github.com/torrentpier/torrentpier/pull/1938)) - ([f9db78d](https://github.com/torrentpier/torrentpier/commit/f9db78d266ff3707e96b1b9d3d2330a507181012))
+- *(_release.php)* Temporary removed automatic `push origin` ([#1935](https://github.com/torrentpier/torrentpier/pull/1935)) - ([dcd7002](https://github.com/torrentpier/torrentpier/commit/dcd7002c2aa09ec187f3afd91fb7e3f5e03630e0))
+- *(_release.php)* Added ability to set version emoji ([#1934](https://github.com/torrentpier/torrentpier/pull/1934)) - ([75ef574](https://github.com/torrentpier/torrentpier/commit/75ef57474c3a32e86ecc98a5ff2fab39a9a66282))
+- *(_release.php)* Added automatic `CHANGELOG.md` update ([#1933](https://github.com/torrentpier/torrentpier/pull/1933)) - ([867359a](https://github.com/torrentpier/torrentpier/commit/867359a89e480071cfd927e2cb6ef4fd761c0172))
+- *(_release.php)* Added `push origin` command ([#1932](https://github.com/torrentpier/torrentpier/pull/1932)) - ([5561e00](https://github.com/torrentpier/torrentpier/commit/5561e0022ca6a0a668f2dc5aee541609bb6c4d1e))
+- *(cliff.toml)* Use correct nightly link ([#1944](https://github.com/torrentpier/torrentpier/pull/1944)) - ([5e6fb3e](https://github.com/torrentpier/torrentpier/commit/5e6fb3ef424cbc84bb5e25625dcd22fd73ec98fa))
+
+
+## [v2.4.6-alpha.1](https://github.com/torrentpier/torrentpier/compare/v2.4.5..v2.4.6-alpha.1) (2025-06-09)
+
+### 🚀 Features
+
+- *(ACP)* Added `robots.txt` editor ([#1913](https://github.com/torrentpier/torrentpier/pull/1913)) - ([79bb13e](https://github.com/torrentpier/torrentpier/commit/79bb13e17d07505be4d3a3c67223b4f591b66bfb))
+- *(bbcode)* Added `[nfo]` and `[pre]` tags ([#1923](https://github.com/torrentpier/torrentpier/pull/1923)) - ([f64c340](https://github.com/torrentpier/torrentpier/commit/f64c340563378a364e1f00c64b17ac1c79531302))
+- *(bbcode)* Implement color customization for `[box]` tag ([#1920](https://github.com/torrentpier/torrentpier/pull/1920)) - ([4c24cb6](https://github.com/torrentpier/torrentpier/commit/4c24cb65bfebf307b717e985b169ea5d27df64f8))
+- *(install)* Autofill `Host` in `robots.txt` file ([#1916](https://github.com/torrentpier/torrentpier/pull/1916)) - ([03eeb08](https://github.com/torrentpier/torrentpier/commit/03eeb08ad185b6dcc99563f567297e41f4a56117))
+- *(meta)* Minor improvements to description generation ([#1926](https://github.com/torrentpier/torrentpier/pull/1926)) - ([4d0b294](https://github.com/torrentpier/torrentpier/commit/4d0b2941e3ef6703ac2cd4c03524a93e688e0c39))
+- Added ability to set page meta description ([#1917](https://github.com/torrentpier/torrentpier/pull/1917)) - ([7b8b9a0](https://github.com/torrentpier/torrentpier/commit/7b8b9a0bbabc1dfbf56cac8c105ad158ae78c3a7))
+
+### 🈳 New translations
+
+- New Crowdin updates ([#1925](https://github.com/torrentpier/torrentpier/pull/1925)) - ([2487d13](https://github.com/torrentpier/torrentpier/commit/2487d130bb23bd82cedf0d114843bb48f6d2e61c))
+- New Crowdin updates ([#1924](https://github.com/torrentpier/torrentpier/pull/1924)) - ([0515670](https://github.com/torrentpier/torrentpier/commit/0515670bee99faa5f0979162096114bc9d3ddf98))
+- New translations main.php (Russian) ([#1922](https://github.com/torrentpier/torrentpier/pull/1922)) - ([8e965fb](https://github.com/torrentpier/torrentpier/commit/8e965fb1ceb5e82201c43b33fcdb044256646191))
+- New Crowdin updates ([#1921](https://github.com/torrentpier/torrentpier/pull/1921)) - ([daeb7fe](https://github.com/torrentpier/torrentpier/commit/daeb7fe87e8da53745fe7aac0708cefa3392ffdc))
+- New Crowdin updates ([#1915](https://github.com/torrentpier/torrentpier/pull/1915)) - ([a3da6f5](https://github.com/torrentpier/torrentpier/commit/a3da6f538658fbfe4e57aad10046d8c459a1a498))
+- New Crowdin updates ([#1914](https://github.com/torrentpier/torrentpier/pull/1914)) - ([a15baef](https://github.com/torrentpier/torrentpier/commit/a15baef69a2955b6dc9cd6e8fdf467550d0b5d09))
+- New Crowdin updates ([#1911](https://github.com/torrentpier/torrentpier/pull/1911)) - ([174f441](https://github.com/torrentpier/torrentpier/commit/174f44160e1f33bed9422f0c4eab9d73b7025036))
+- New Crowdin updates ([#1910](https://github.com/torrentpier/torrentpier/pull/1910)) - ([c40aad2](https://github.com/torrentpier/torrentpier/commit/c40aad20ad865849d3088498f1ba95a5fb0a0621))
+- New Crowdin updates ([#1907](https://github.com/torrentpier/torrentpier/pull/1907)) - ([999ae1e](https://github.com/torrentpier/torrentpier/commit/999ae1eff9f3a4c951fc48efbf94c0cea2a5f8d2))
+- Updated translations ([#1909](https://github.com/torrentpier/torrentpier/pull/1909)) - ([897edfc](https://github.com/torrentpier/torrentpier/commit/897edfc371087427c574776472cbbf3f1f933273))
+- Updated translations ([#1908](https://github.com/torrentpier/torrentpier/pull/1908)) - ([6d0499d](https://github.com/torrentpier/torrentpier/commit/6d0499dd0229d454d3af00f10151adc26a9e96a7))
+- New translations ([#1906](https://github.com/torrentpier/torrentpier/pull/1906)) - ([8a3b12c](https://github.com/torrentpier/torrentpier/commit/8a3b12c1192678552a3186c1f58df9b4d7e5ba1b))
+
+### 📦 Dependencies
+
+- *(deps)* Bump filp/whoops from 2.18.0 to 2.18.1 ([#1919](https://github.com/torrentpier/torrentpier/pull/1919)) - ([1253661](https://github.com/torrentpier/torrentpier/commit/125366147c6257abadd489f3802e4a0dab37a89c))
+- *(deps)* Bump arokettu/bencode from 4.3.0 to 4.3.1 ([#1912](https://github.com/torrentpier/torrentpier/pull/1912)) - ([f76e351](https://github.com/torrentpier/torrentpier/commit/f76e351b32cfa2932bc1afde6c3c522cd993b8af))
+
+### ⚙️ Miscellaneous
+
+- *(_release.php)* Added `GPG` sign for tags ([#1931](https://github.com/torrentpier/torrentpier/pull/1931)) - ([8ecc617](https://github.com/torrentpier/torrentpier/commit/8ecc61719acb61e9a2ce115b28f1a82580c01110))
+- *(cliff)* Added automated script for releases creation ([#1930](https://github.com/torrentpier/torrentpier/pull/1930)) - ([6adde35](https://github.com/torrentpier/torrentpier/commit/6adde35849811648bcb8fa1a72c3be0a886b7919))
+- *(cliff)* Completely removed `cliff-releases.toml` ([#1929](https://github.com/torrentpier/torrentpier/pull/1929)) - ([cef041c](https://github.com/torrentpier/torrentpier/commit/cef041c0d128dca480ca40770f52385f868706b0))
+- *(cliff)* Updated config ([#1928](https://github.com/torrentpier/torrentpier/pull/1928)) - ([212e5c5](https://github.com/torrentpier/torrentpier/commit/212e5c52832f32e8864850bf520b5c73f27f1609))
+- Minor improvements ([#1918](https://github.com/torrentpier/torrentpier/pull/1918)) - ([46f29bc](https://github.com/torrentpier/torrentpier/commit/46f29bc68a18fdefad81e26a60fe44f122407ea7))
+
+
+## [v2.4.5](https://github.com/torrentpier/torrentpier/compare/v2.4.5-rc.5..v2.4.5) (2025-05-11)
+
+### 🚀 Features
+
+- *(admin_smilies)* Added confirmation on smilie deleting ([#1895](https://github.com/torrentpier/torrentpier/pull/1895)) - ([b51820e](https://github.com/torrentpier/torrentpier/commit/b51820e1861044143321fcde5239c22abc3de984))
+- *(announcer)* Check for frozen torrents ([#1770](https://github.com/torrentpier/torrentpier/pull/1770)) - ([6e0786b](https://github.com/torrentpier/torrentpier/commit/6e0786bdee8f1a2557f9ac1dc628983bcafe3f5f))
+- *(freeipapi)* Added ability to use own API token ([#1901](https://github.com/torrentpier/torrentpier/pull/1901)) - ([513e306](https://github.com/torrentpier/torrentpier/commit/513e3065d34409931c4198c03b080f232f1d809b))
+- Added ability to hide peer username in peer list ([#1903](https://github.com/torrentpier/torrentpier/pull/1903)) - ([3a64f85](https://github.com/torrentpier/torrentpier/commit/3a64f8595cafd99b9cb821d52ec5d3b3e8e467c0))
+- Added ability to hide peer country in peer list ([#1891](https://github.com/torrentpier/torrentpier/pull/1891)) - ([2555ebc](https://github.com/torrentpier/torrentpier/commit/2555ebce4717f871922495e48cbca9e22da78bd5))
+- Added ability to hide BitTorrent client in peers list ([#1890](https://github.com/torrentpier/torrentpier/pull/1890)) - ([f5d65b8](https://github.com/torrentpier/torrentpier/commit/f5d65b8911c5e864f000348a6d1aefbb4c09c2b4))
+
+### 🐛 Bug Fixes
+
+- *(peers list)* `IPv6` showing ([#1902](https://github.com/torrentpier/torrentpier/pull/1902)) - ([4b7203f](https://github.com/torrentpier/torrentpier/commit/4b7203f8aeeeffc1b163bd3db1dd6b2cac33c923))
+- Incorrect rounding in execution time counter ([#1899](https://github.com/torrentpier/torrentpier/pull/1899)) - ([781b724](https://github.com/torrentpier/torrentpier/commit/781b7240c41ddd141cfb057480c10d9cee30e6d7))
+- `Undefined array key "smile"` when are no smilies ([#1896](https://github.com/torrentpier/torrentpier/pull/1896)) - ([36d3992](https://github.com/torrentpier/torrentpier/commit/36d399220e2c16a582e1e400df0002c164f5ec3b))
+- Peer country flag not shown in peers list ([#1894](https://github.com/torrentpier/torrentpier/pull/1894)) - ([8edba72](https://github.com/torrentpier/torrentpier/commit/8edba72f09f037225ede058cf09c830b1a01e78f))
+
+### 📦 Dependencies
+
+- *(deps)* Bump symfony/polyfill from 1.31.0 to 1.32.0 ([#1900](https://github.com/torrentpier/torrentpier/pull/1900)) - ([a4793f6](https://github.com/torrentpier/torrentpier/commit/a4793f6ce103f22941d72793e2bf8cdf9f78d494))
+
+### ⚙️ Miscellaneous
+
+- Minor improvements ([#1904](https://github.com/torrentpier/torrentpier/pull/1904)) - ([3cdf843](https://github.com/torrentpier/torrentpier/commit/3cdf843a0442d4cdf9b70702c6092d05df86c7e0))
+- Minor improvements ([#1898](https://github.com/torrentpier/torrentpier/pull/1898)) - ([2f02692](https://github.com/torrentpier/torrentpier/commit/2f026921ee331226900b3cd4f1bb238f6562b48d))
+- Minor improvements ([#1897](https://github.com/torrentpier/torrentpier/pull/1897)) - ([14086a0](https://github.com/torrentpier/torrentpier/commit/14086a0ed6181a0ff4496ee2e56f4fb70bfe18d5))
+- Minor improvements ([#1893](https://github.com/torrentpier/torrentpier/pull/1893)) - ([90ece5c](https://github.com/torrentpier/torrentpier/commit/90ece5c7621789f170246b2898841b347e264674))
+- Minor improvements ([#1892](https://github.com/torrentpier/torrentpier/pull/1892)) - ([1e5b93d](https://github.com/torrentpier/torrentpier/commit/1e5b93d2c072c5c35feef7567b3fcdb4b3597935))
+
+
+## [v2.4.5-rc.5](https://github.com/torrentpier/torrentpier/compare/v2.4.5-rc.4..v2.4.5-rc.5) (2025-05-03)
+
+### 🚀 Features
+
+- *(admin_ranks)* Added confirmation on rank deleting ([#1888](https://github.com/torrentpier/torrentpier/pull/1888)) - ([e510ebc](https://github.com/torrentpier/torrentpier/commit/e510ebc3ba30be7bf99769b1e5540353bd53c333))
+- *(atom)* Hide topics from private forums ([#1889](https://github.com/torrentpier/torrentpier/pull/1889)) - ([75e9d5e](https://github.com/torrentpier/torrentpier/commit/75e9d5e4a8c5ec20f438e7b24a5469d219959a8c))
+- *(avatar upload)* Added `accept="image/*"` attribute ([#1841](https://github.com/torrentpier/torrentpier/pull/1841)) - ([56d531a](https://github.com/torrentpier/torrentpier/commit/56d531aa5ddb778d08a2796fa9fb865e5b3040ce))
+- *(emailer)* Added ability to configure `sendmail` - ([5ad4a70](https://github.com/torrentpier/torrentpier/commit/5ad4a7019d996d468650ab608ab53d6cf3ebb4f5))
+- *(magnet)* Added `xl` (eXact Length) parametr ([#1883](https://github.com/torrentpier/torrentpier/pull/1883)) - ([c0cdcff](https://github.com/torrentpier/torrentpier/commit/c0cdcff48825ce5fb0c89c0ec44eb95686aee74c))
+- *(playback_m3u.php)* Added checking auth to download ([#1848](https://github.com/torrentpier/torrentpier/pull/1848)) - ([0b8d8a5](https://github.com/torrentpier/torrentpier/commit/0b8d8a5210ee761dddaa57fc48bb48b0ede1ec3c))
+
+### 🐛 Bug Fixes
+
+- *(cache)* Implicitly marking parameter `$name` as nullable is deprecated ([#1877](https://github.com/torrentpier/torrentpier/pull/1877)) - ([c3b4000](https://github.com/torrentpier/torrentpier/commit/c3b40003b778a725e958cebee6446bcfd6a68b10))
+- Displaying `Network news` and `Latest news` for guests when foums are private ([#1879](https://github.com/torrentpier/torrentpier/pull/1879)) - ([9f96090](https://github.com/torrentpier/torrentpier/commit/9f96090cc419f828e54e69a91a906a3f3d92c255))
+- Pagination issue in `Report on action` page ([#1872](https://github.com/torrentpier/torrentpier/pull/1872)) - ([8358aa0](https://github.com/torrentpier/torrentpier/commit/8358aa00de2ec9efd4c51b8bef11bd700a56c19c))
+- `tablesorting` issues & incorrect `user_role` for pending users ([#1871](https://github.com/torrentpier/torrentpier/pull/1871)) - ([595adbe](https://github.com/torrentpier/torrentpier/commit/595adbe4da5296b0f3ebde6628e58e878c0fb7d5))
+- Fixed TorrentPier build-in emojis showing in ACP ([#1870](https://github.com/torrentpier/torrentpier/pull/1870)) - ([12792e7](https://github.com/torrentpier/torrentpier/commit/12792e74f71a57448277dda46471563a7fea71db))
+
+### 📦 Dependencies
+
+- *(deps)* Bump vlucas/phpdotenv from 5.6.1 to 5.6.2 ([#1887](https://github.com/torrentpier/torrentpier/pull/1887)) - ([7a14464](https://github.com/torrentpier/torrentpier/commit/7a14464d20fe8d2f8b980a82647c6b9ec081f621))
+- *(deps)* Bump php-curl-class/php-curl-class from 11.1.0 to 12.0.0 ([#1868](https://github.com/torrentpier/torrentpier/pull/1868)) - ([bd5aa2a](https://github.com/torrentpier/torrentpier/commit/bd5aa2a5e71560409bc630ea2334e33c77458ab3))
+- *(deps)* Bump monolog/monolog from 3.8.1 to 3.9.0 ([#1865](https://github.com/torrentpier/torrentpier/pull/1865)) - ([6440162](https://github.com/torrentpier/torrentpier/commit/64401621879af0cc445c38687c571d2fec184410))
+- *(deps)* Bump php-curl-class/php-curl-class from 11.0.5 to 11.1.0 ([#1864](https://github.com/torrentpier/torrentpier/pull/1864)) - ([de2fcea](https://github.com/torrentpier/torrentpier/commit/de2fceabedefd07441ba6801417157a9828e0e2a))
+- *(deps)* Bump egulias/email-validator from 4.0.3 to 4.0.4 ([#1858](https://github.com/torrentpier/torrentpier/pull/1858)) - ([3ced460](https://github.com/torrentpier/torrentpier/commit/3ced460640e4bfe27a91acd0408e73c3c49e1534))
+- *(deps)* Bump filp/whoops from 2.17.0 to 2.18.0 ([#1853](https://github.com/torrentpier/torrentpier/pull/1853)) - ([7ca0582](https://github.com/torrentpier/torrentpier/commit/7ca058256186b7b690003308d660a3a6271e84d2))
+- *(deps)* Bump php-curl-class/php-curl-class from 11.0.4 to 11.0.5 ([#1849](https://github.com/torrentpier/torrentpier/pull/1849)) - ([37ad07a](https://github.com/torrentpier/torrentpier/commit/37ad07a40c1adf29f712f469d2850753d32a5eb9))
+- *(deps)* Bump belomaxorka/captcha from 1.2.3 to 1.2.4 - ([4641b0a](https://github.com/torrentpier/torrentpier/commit/4641b0a0d0e055d684ec36d41bfaf22b4d4b2ee1))
+- *(deps)* Bump belomaxorka/captcha from 1.2.2 to 1.2.3 ([#1842](https://github.com/torrentpier/torrentpier/pull/1842)) - ([be65f7c](https://github.com/torrentpier/torrentpier/commit/be65f7c55cbf81d889d5083c9344ccef400e8e19))
+
+### 🚜 Refactor
+
+- Password generation ([#1847](https://github.com/torrentpier/torrentpier/pull/1847)) - ([af2403f](https://github.com/torrentpier/torrentpier/commit/af2403f1918845e8af3d9fa7708623eef6aa427e))
+- Moved `Select` class into `Legacy\Common` ([#1846](https://github.com/torrentpier/torrentpier/pull/1846)) - ([bd0ef06](https://github.com/torrentpier/torrentpier/commit/bd0ef063fac328ed16537aacbc12e287a8d8206b))
+
+### ⚙️ Miscellaneous
+
+- *(.cliffignore)* Added one more commit ([#1860](https://github.com/torrentpier/torrentpier/pull/1860)) - ([974d359](https://github.com/torrentpier/torrentpier/commit/974d3590c1fb11c6314da4a4b8115a2229e32bbd))
+- *(README)* Removed `Build actions` badge ([#1861](https://github.com/torrentpier/torrentpier/pull/1861)) - ([e9920ab](https://github.com/torrentpier/torrentpier/commit/e9920ab59803552e3a1a00b603962208a62efe4e))
+- *(cliff)* Added `.cliffignore` file to ignore reverted commits ([#1859](https://github.com/torrentpier/torrentpier/pull/1859)) - ([2eab551](https://github.com/torrentpier/torrentpier/commit/2eab551bd75e7acfd6f4dabe13b2a30ac09db880))
+- *(nightly builds)* Added cleanup step ([#1851](https://github.com/torrentpier/torrentpier/pull/1851)) - ([299d9a1](https://github.com/torrentpier/torrentpier/commit/299d9a1f6c4f244e435803212e763c252e5bd396))
+- *(password_hash)* Changed `cost` to `12` by default ([#1886](https://github.com/torrentpier/torrentpier/pull/1886)) - ([1663e19](https://github.com/torrentpier/torrentpier/commit/1663e19c3f80ae15792d6ffe4ce64e40129b14db))
+- *(render_flag)* Hide names for specified (`$nameIgnoreList`) flags ([#1862](https://github.com/torrentpier/torrentpier/pull/1862)) - ([83e42bc](https://github.com/torrentpier/torrentpier/commit/83e42bc5db086f60a6038b3fffca5982ceeced51))
+- *(text captcha)* Disabled scatter effect by default - ([3af5202](https://github.com/torrentpier/torrentpier/commit/3af5202f7b2a4ea5d14bbc4808b7a380de2e0dc0))
+- Updated nightly builds link ([#1885](https://github.com/torrentpier/torrentpier/pull/1885)) - ([6bd000b](https://github.com/torrentpier/torrentpier/commit/6bd000bc0d6176dbe1f0a573f081c9daefd3718b))
+- Composer dependencies are installed according to the minimum supported PHP version ([#1884](https://github.com/torrentpier/torrentpier/pull/1884)) - ([5fe7700](https://github.com/torrentpier/torrentpier/commit/5fe770070e1cd71ea50ea3ad3825a322774f0baf))
+- Corrected `php` version in `composer.json` ([#1882](https://github.com/torrentpier/torrentpier/pull/1882)) - ([bc1713a](https://github.com/torrentpier/torrentpier/commit/bc1713abdd28d04e8e1da3c3eabeb5170a35a460))
+- Composer dependencies are installed according to the minimum supported PHP version ([#1881](https://github.com/torrentpier/torrentpier/pull/1881)) - ([5c4972e](https://github.com/torrentpier/torrentpier/commit/5c4972ec12340cbffb8ac941d390ee6c2c89b635))
+- Minor improvements ([#1880](https://github.com/torrentpier/torrentpier/pull/1880)) - ([de8f192](https://github.com/torrentpier/torrentpier/commit/de8f1925bae3b38db18b86eb4a10337853638ad7))
+- Minor improvements ([#1876](https://github.com/torrentpier/torrentpier/pull/1876)) - ([eeb391d](https://github.com/torrentpier/torrentpier/commit/eeb391da6a16440492a3b803f63be301ba3d02d3))
+- Minor improvements ([#1875](https://github.com/torrentpier/torrentpier/pull/1875)) - ([41a78dd](https://github.com/torrentpier/torrentpier/commit/41a78ddbcbc628f0592c59879df0170bf48664aa))
+- Minor improvements ([#1874](https://github.com/torrentpier/torrentpier/pull/1874)) - ([0f1a69e](https://github.com/torrentpier/torrentpier/commit/0f1a69e32d8d5eb5053b021844845911c619d8cd))
+- Fetch only necessary sitemap parameters in `admin_sitemap.php` ([#1873](https://github.com/torrentpier/torrentpier/pull/1873)) - ([f9c8160](https://github.com/torrentpier/torrentpier/commit/f9c8160f8e897950a038a74ad7ee30b116f7b2b8))
+- Changed placeholder IP address from `7f000001` to `0` ([#1869](https://github.com/torrentpier/torrentpier/pull/1869)) - ([84e2392](https://github.com/torrentpier/torrentpier/commit/84e23928968f943826bdc4390c52365357d56f32))
+- Minor improvements ([#1866](https://github.com/torrentpier/torrentpier/pull/1866)) - ([7237653](https://github.com/torrentpier/torrentpier/commit/72376532b32395eda04dc032c07ca08b27346c6b))
+- Some minor improvements ([#1855](https://github.com/torrentpier/torrentpier/pull/1855)) - ([3cc880e](https://github.com/torrentpier/torrentpier/commit/3cc880eeb8be41596d5e8eaf19297046500afcf7))
+
+### ◀️ Revert
+
+- Added `TorrentPier instance hash` generation - ([eabf851](https://github.com/torrentpier/torrentpier/commit/eabf851ee60d29835d1979f46dcf2b9d82576c1b))
+- Added `IndexNow` protocol support 🤖 - ([1b288a9](https://github.com/torrentpier/torrentpier/commit/1b288a96e443e06c4f4e9ea374037d3b0af8a639))
+
+
+## [v2.4.5-rc.4](https://github.com/torrentpier/torrentpier/compare/v2.4.5-rc.3..v2.4.5-rc.4) (2025-03-09)
+
+### 🚀 Features
+
+- *(captcha)* Added `Text Captcha` provider ([#1839](https://github.com/torrentpier/torrentpier/pull/1839)) - ([74ea157](https://github.com/torrentpier/torrentpier/commit/74ea1573b298be5a935caaca0b3cc57cb1e9264a))
+- *(show post bbcode)* Added `'only_for_first_post'` param ([#1830](https://github.com/torrentpier/torrentpier/pull/1830)) - ([4dcd1fb](https://github.com/torrentpier/torrentpier/commit/4dcd1fb16e4e84acd1231ad821a2f05658b849ad))
+- *(sitemap)* Update `lastmod` when a new reply in topic ([#1737](https://github.com/torrentpier/torrentpier/pull/1737)) - ([bc95e14](https://github.com/torrentpier/torrentpier/commit/bc95e14be328303bb37e31299661b03045e37d07))
+- Added `$bb_cfg['auto_language_detection']` parametr ([#1835](https://github.com/torrentpier/torrentpier/pull/1835)) - ([b550fa5](https://github.com/torrentpier/torrentpier/commit/b550fa59f9ee96ca89e5b6db880147bc72841e93))
+- Easter egg for the 20th anniversary of the TorrentPier! ([#1831](https://github.com/torrentpier/torrentpier/pull/1831)) - ([f2e513d](https://github.com/torrentpier/torrentpier/commit/f2e513dd8b0f82f4f02474db4b83d83904a93f29))
+- Added configuration files for `nginx` & `caddy` ([#1787](https://github.com/torrentpier/torrentpier/pull/1787)) - ([f7d3946](https://github.com/torrentpier/torrentpier/commit/f7d394607e4ea5bb9b7f2b33692204a226a4d78b))
+
+### 🐛 Bug Fixes
+
+- *(info.php)* Undefined array key "show" ([#1836](https://github.com/torrentpier/torrentpier/pull/1836)) - ([f8c4e8f](https://github.com/torrentpier/torrentpier/commit/f8c4e8fb14090bc7403f24e363603bad9e231351))
+- *(tr_seed_bonus.php)* Incorrect `GROUP BY` ([#1820](https://github.com/torrentpier/torrentpier/pull/1820)) - ([dfd4e5e](https://github.com/torrentpier/torrentpier/commit/dfd4e5ebc9df916868210a7844f2a6f35e7b8aca))
+
+### 📦 Dependencies
+
+- *(deps)* Bump bugsnag/bugsnag from 3.29.2 to 3.29.3 ([#1837](https://github.com/torrentpier/torrentpier/pull/1837)) - ([b954815](https://github.com/torrentpier/torrentpier/commit/b954815f5d0dce9520f65679e834d8bd49e571e0))
+- *(deps)* Bump php-curl-class/php-curl-class from 11.0.3 to 11.0.4 ([#1823](https://github.com/torrentpier/torrentpier/pull/1823)) - ([1c323a4](https://github.com/torrentpier/torrentpier/commit/1c323a45d777b033155da9a2becec506215bd94c))
+- *(deps)* Bump php-curl-class/php-curl-class from 11.0.1 to 11.0.3 ([#1821](https://github.com/torrentpier/torrentpier/pull/1821)) - ([dedf35b](https://github.com/torrentpier/torrentpier/commit/dedf35b794196034eb27d4125dff0798aed5f315))
+
+### 🗑️ Removed
+
+- *(posting.php)* Unused `'U_VIEWTOPIC` variable ([#1818](https://github.com/torrentpier/torrentpier/pull/1818)) - ([03ebbda](https://github.com/torrentpier/torrentpier/commit/03ebbda6be567d82d2a49fefe02356544fbd07cb))
+- Integrity checker 🥺🪦 ([#1827](https://github.com/torrentpier/torrentpier/pull/1827)) - ([ba3ce88](https://github.com/torrentpier/torrentpier/commit/ba3ce885c8d84ae939a0ce9c79b97877d3aaab41))
+- Redundant `.htaccess` files ([#1826](https://github.com/torrentpier/torrentpier/pull/1826)) - ([912b080](https://github.com/torrentpier/torrentpier/commit/912b080b16438b09f82fbc72a363589cc2f6209e))
+
+### ⚙️ Miscellaneous
+
+- *(Caddyfile)* Some minor fixes ([#1822](https://github.com/torrentpier/torrentpier/pull/1822)) - ([6f641aa](https://github.com/torrentpier/torrentpier/commit/6f641aa9d8d7afb30920c054a43347393ea05cc4))
+- *(README)* Fixed all grammatical errors, sentence structure and readibility ([#1812](https://github.com/torrentpier/torrentpier/pull/1812)) - ([bea3b0b](https://github.com/torrentpier/torrentpier/commit/bea3b0bccf335970ea5826543d8fa223329ef077))
+- *(_cleanup.php)* Added CLI mode check ([#1834](https://github.com/torrentpier/torrentpier/pull/1834)) - ([5dc9a54](https://github.com/torrentpier/torrentpier/commit/5dc9a5475c051911c579ea732ef52d7feb78e8ac))
+- *(announcer)* Some minor improvements ([#1819](https://github.com/torrentpier/torrentpier/pull/1819)) - ([bdefed4](https://github.com/torrentpier/torrentpier/commit/bdefed4dab3cc65330fcb9cb9750cc8e84beda1d))
+- *(cliff)* Removed TorrentPier logo ([#1817](https://github.com/torrentpier/torrentpier/pull/1817)) - ([7794242](https://github.com/torrentpier/torrentpier/commit/7794242750b44183312a2a45c9f54c6afde12f0e))
+- *(cliff)* Synced `cliff-releases.toml` with `cliff.toml` changes ([#1815](https://github.com/torrentpier/torrentpier/pull/1815)) - ([f2aea92](https://github.com/torrentpier/torrentpier/commit/f2aea92b3d79d72254e696fde31ad9b4bec5dcd0))
+- *(cliff)* Added missing line breaks after `body` ([#1814](https://github.com/torrentpier/torrentpier/pull/1814)) - ([2593f09](https://github.com/torrentpier/torrentpier/commit/2593f093a389a9c450725290862b99d911fbef5d))
+- *(installer)* Added cleanup step (for master builds) ([#1838](https://github.com/torrentpier/torrentpier/pull/1838)) - ([dd72136](https://github.com/torrentpier/torrentpier/commit/dd721367c7dc9956861fcd33af7f9f822cf80011))
+- *(installer)* Some minor improvements ([#1825](https://github.com/torrentpier/torrentpier/pull/1825)) - ([4f89685](https://github.com/torrentpier/torrentpier/commit/4f896854d3bb67300027f7542704f41c4869837f))
+- *(installer)* Some minor improvements ([#1824](https://github.com/torrentpier/torrentpier/pull/1824)) - ([f3714f0](https://github.com/torrentpier/torrentpier/commit/f3714f02f2c8fbfaccfdafb8f25a269664c48950))
+- *(workflow)* Short `release_name` ([#1816](https://github.com/torrentpier/torrentpier/pull/1816)) - ([c57db21](https://github.com/torrentpier/torrentpier/commit/c57db2104d7b8363d0b8ce8872ce90fc7410c724))
+- *(workflow)* Added `workflow_dispatch` for `schedule.yml` ([#1813](https://github.com/torrentpier/torrentpier/pull/1813)) - ([d54c07b](https://github.com/torrentpier/torrentpier/commit/d54c07b3da00fc8bcba5413cd4ae3f3c9f6007bb))
+- *(workflow)* Some improvements ([#1811](https://github.com/torrentpier/torrentpier/pull/1811)) - ([3a9dd6a](https://github.com/torrentpier/torrentpier/commit/3a9dd6a3c931cfbd682257c283a3296c4914548f))
+- *(workflow)* Some improvements ([#1810](https://github.com/torrentpier/torrentpier/pull/1810)) - ([c168c39](https://github.com/torrentpier/torrentpier/commit/c168c3956cf77886c14133ac10ec33aa0ae5bc4e))
+- Replaced `gregwar/captcha` with my own fork ([#1840](https://github.com/torrentpier/torrentpier/pull/1840)) - ([8585560](https://github.com/torrentpier/torrentpier/commit/858556043d3e45218ea8e803786d6b6de6d485d0))
+- Created cleanup script (for releases preparation) ([#1833](https://github.com/torrentpier/torrentpier/pull/1833)) - ([68bf26d](https://github.com/torrentpier/torrentpier/commit/68bf26d0f4ab33f5394d26f425e53817f3464ac8))
+- Bring back missing `cache` & `log` directories ([#1832](https://github.com/torrentpier/torrentpier/pull/1832)) - ([249c988](https://github.com/torrentpier/torrentpier/commit/249c9889890291d56317dd703414bdb57ecaa41f))
+- Some minor improvements ([#1829](https://github.com/torrentpier/torrentpier/pull/1829)) - ([3b8ee4c](https://github.com/torrentpier/torrentpier/commit/3b8ee4c4d3ab4631425fbe44f197b6a9bd7d158c))
+
+## New Contributors ❤️
+
+* @xeddmc made their first contribution in [#1812](https://github.com/torrentpier/torrentpier/pull/1812)
+
+## [v2.4.5-rc.3](https://github.com/torrentpier/torrentpier/compare/v2.4.5-rc.2..v2.4.5-rc.3) (2025-02-06)
+
+### 🚀 Features
+
+- *(announcer)* Added some disallowed ports by default ([#1767](https://github.com/torrentpier/torrentpier/pull/1767)) - ([46288ec](https://github.com/torrentpier/torrentpier/commit/46288ec19830c84aedb156e1f30d7ec8a0803e0d))
+- *(announcer)* Added `is_numeric()` checking for some fields ([#1766](https://github.com/torrentpier/torrentpier/pull/1766)) - ([096bb51](https://github.com/torrentpier/torrentpier/commit/096bb5124fa27d27c3e60031edc432d877f1c507))
+- *(announcer)* Added `event` verifying ([#1765](https://github.com/torrentpier/torrentpier/pull/1765)) - ([6a19323](https://github.com/torrentpier/torrentpier/commit/6a1932313801e55fbcfb047fdcef87266f472c33))
+- *(announcer)* Block browser by checking the `User-Agent` ([#1764](https://github.com/torrentpier/torrentpier/pull/1764)) - ([7b64b50](https://github.com/torrentpier/torrentpier/commit/7b64b508199af568472fe6ac2edf333a3e274a00))
+- *(announcer)* Block `User-Agent` strings that are too long ([#1763](https://github.com/torrentpier/torrentpier/pull/1763)) - ([a98f8f1](https://github.com/torrentpier/torrentpier/commit/a98f8f102a8253b0b22c80ef444fed1ec29177f3))
+- *(announcer)* Blocking all ports lower then `1024` ([#1762](https://github.com/torrentpier/torrentpier/pull/1762)) - ([1bc7e09](https://github.com/torrentpier/torrentpier/commit/1bc7e09ddbeaf680b86095eed9a80b8ebf6169b3))
+- *(cache)* Checking if extensions are installed ([#1759](https://github.com/torrentpier/torrentpier/pull/1759)) - ([7f31022](https://github.com/torrentpier/torrentpier/commit/7f31022cfca2acb28a5cba06961eeaf8d2c9de51))
+- *(captcha)* Added some new services 🤖 ([#1771](https://github.com/torrentpier/torrentpier/pull/1771)) - ([d413c71](https://github.com/torrentpier/torrentpier/commit/d413c717188c9bd906f715e7137955dc9a42a003))
+- *(environment)* Make configurable `TP_HOST` and `TP_PORT` ([#1780](https://github.com/torrentpier/torrentpier/pull/1780)) - ([e51e091](https://github.com/torrentpier/torrentpier/commit/e51e09159333382a77b809b5f1da5e152a713143))
+- *(installer)* Fully show non-installed extensions ([#1761](https://github.com/torrentpier/torrentpier/pull/1761)) - ([8fcc62d](https://github.com/torrentpier/torrentpier/commit/8fcc62d2a2fd41927b2f5dae215fe5bbf95f2c96))
+- *(installer)* More explanations ([#1758](https://github.com/torrentpier/torrentpier/pull/1758)) - ([48ab52a](https://github.com/torrentpier/torrentpier/commit/48ab52ac8674afcb607c8e49134316a3e117236a))
+- *(installer)* Check `Composer` dependencies after installing ([#1756](https://github.com/torrentpier/torrentpier/pull/1756)) - ([262b887](https://github.com/torrentpier/torrentpier/commit/262b8872a5b14068eb73d745adea6203c557e192))
+- *(installer)* More explanations ([#1754](https://github.com/torrentpier/torrentpier/pull/1754)) - ([fd6f1f8](https://github.com/torrentpier/torrentpier/commit/fd6f1f86a5e9216469cd648601ecb9ba875f9eb6))
+- *(installer)* Create `config.local.php` on local environment ([#1745](https://github.com/torrentpier/torrentpier/pull/1745)) - ([0d93b2c](https://github.com/torrentpier/torrentpier/commit/0d93b2c768c2965c12ac62e2f3b2886dc1ef31c2))
+- *(torrent)* Bring back old torrent file naming ([#1783](https://github.com/torrentpier/torrentpier/pull/1783)) - ([314c592](https://github.com/torrentpier/torrentpier/commit/314c592affbef4b8db48d562b9633aad27059a76))
+- *(workflow)* Automated deploy actual changes to `TorrentPier Demo` ([#1788](https://github.com/torrentpier/torrentpier/pull/1788)) - ([4333d6a](https://github.com/torrentpier/torrentpier/commit/4333d6aca4aeb8584ff8a8ef0bf76c537a3f371a))
+- Used `TORRENT_MIMETYPE` constant instead of hardcoded string ([#1757](https://github.com/torrentpier/torrentpier/pull/1757)) - ([4b0d270](https://github.com/torrentpier/torrentpier/commit/4b0d270c89ec06abed590504f6a0cb70076a9e59))
+
+### 🐛 Bug Fixes
+
+- *(announcer)* Null `event` exception ([#1784](https://github.com/torrentpier/torrentpier/pull/1784)) - ([b06e327](https://github.com/torrentpier/torrentpier/commit/b06e327cbb285a676814699eb5fb1fbc0e1f22e8))
+- *(bb_die)* HTML characters converting ([#1744](https://github.com/torrentpier/torrentpier/pull/1744)) - ([4f1c7e4](https://github.com/torrentpier/torrentpier/commit/4f1c7e40d82e52f81eba44ead501e1f01058cc4f))
+- *(debug)* Disabled `Bugsnag` reporting on local environment ([#1751](https://github.com/torrentpier/torrentpier/pull/1751)) - ([1f3b629](https://github.com/torrentpier/torrentpier/commit/1f3b629e9cea4d11fbf3cf29f575ba730bad898d))
+- *(installer)* Missing `gd` extension ([#1749](https://github.com/torrentpier/torrentpier/pull/1749)) - ([a1c519d](https://github.com/torrentpier/torrentpier/commit/a1c519d938b848edffcbf7fbbe6a3fdb9a5394f1))
+- *(youtube player)* Mixed content issue ([#1795](https://github.com/torrentpier/torrentpier/pull/1795)) - ([3c0a1d5](https://github.com/torrentpier/torrentpier/commit/3c0a1d5d0018daa87ad3914ea04078a9a6d05fc2))
+- Incorrect peer country flag ([#1768](https://github.com/torrentpier/torrentpier/pull/1768)) - ([0f091eb](https://github.com/torrentpier/torrentpier/commit/0f091eb546e34923d9d1ab34be5faf92080ec198))
+
+### 📦 Dependencies
+
+- *(deps)* Bump jacklul/monolog-telegram from 3.1.0 to 3.2.0 ([#1776](https://github.com/torrentpier/torrentpier/pull/1776)) - ([420c92c](https://github.com/torrentpier/torrentpier/commit/420c92c0addf4dee91f3ae872517cb3224827a1f))
+- *(deps)* Bump filp/whoops from 2.16.0 to 2.17.0 ([#1777](https://github.com/torrentpier/torrentpier/pull/1777)) - ([a71609b](https://github.com/torrentpier/torrentpier/commit/a71609ba67a89480fabb7b62de450d9be09373fa))
+- *(deps)* Bump php-curl-class/php-curl-class from 11.0.0 to 11.0.1 ([#1753](https://github.com/torrentpier/torrentpier/pull/1753)) - ([ce32031](https://github.com/torrentpier/torrentpier/commit/ce32031a0fb14cdf6c3f4ba379b530cbb52b0fea))
+- *(deps)* Bump bugsnag/bugsnag from 3.29.1 to 3.29.2 ([#1752](https://github.com/torrentpier/torrentpier/pull/1752)) - ([f63d15c](https://github.com/torrentpier/torrentpier/commit/f63d15c49e3992837413b2c7a0160d599b44f2ef))
+
+### 🗑️ Removed
+
+- *(environment)* Extra `DB_CONNECTION` variable ([#1775](https://github.com/torrentpier/torrentpier/pull/1775)) - ([cd2786b](https://github.com/torrentpier/torrentpier/commit/cd2786bb69c74cec88a447f66750d014fc4d3612))
+- Some unused tracker config variables ([#1769](https://github.com/torrentpier/torrentpier/pull/1769)) - ([7f9df35](https://github.com/torrentpier/torrentpier/commit/7f9df35d3bd0e9d23284b8bd9c36a0f52158f5d7))
+
+### 📚 Documentation
+
+- Minor improvements ([#1750](https://github.com/torrentpier/torrentpier/pull/1750)) - ([3e850ac](https://github.com/torrentpier/torrentpier/commit/3e850ac724c43e813aa077b272b498e2b0477260))
+
+### ⚙️ Miscellaneous
+
+- *(cd workflow)* Fixed release body creation ([#1809](https://github.com/torrentpier/torrentpier/pull/1809)) - ([7378cb3](https://github.com/torrentpier/torrentpier/commit/7378cb3af5cc56343c667a9d920038b05327e97b))
+- *(cd workflow)* Fixed release body creation ([#1807](https://github.com/torrentpier/torrentpier/pull/1807)) - ([cc679a8](https://github.com/torrentpier/torrentpier/commit/cc679a80246f3ff65136653025d826bf1458db3a))
+- *(changelog workflow)* Minor improvements ([#1802](https://github.com/torrentpier/torrentpier/pull/1802)) - ([15ca21f](https://github.com/torrentpier/torrentpier/commit/15ca21f03840281f7d4402959aa8bfb7d407b45b))
+- *(checksum workflow)* Fixed incorrect file path ([#1799](https://github.com/torrentpier/torrentpier/pull/1799)) - ([4eb5a9a](https://github.com/torrentpier/torrentpier/commit/4eb5a9adc61c4e116feb09208091efb914275da2))
+- *(cliff)* Changed emoji for dependencies ([#1755](https://github.com/torrentpier/torrentpier/pull/1755)) - ([55d4670](https://github.com/torrentpier/torrentpier/commit/55d467048370b51cd592982c8026702dca8813d5))
+- *(cliff)* Use blockquote for notice ([#1748](https://github.com/torrentpier/torrentpier/pull/1748)) - ([61e5592](https://github.com/torrentpier/torrentpier/commit/61e55925f312417bdb63c88a7c8939c3b2eb2ac5))
+- *(cliff)* Fixed typo ([#1747](https://github.com/torrentpier/torrentpier/pull/1747)) - ([4936af7](https://github.com/torrentpier/torrentpier/commit/4936af7d3d10f553d8586a14de249c32e50f3494))
+- *(cliff)* Notice about previous changelog file ([#1746](https://github.com/torrentpier/torrentpier/pull/1746)) - ([85395be](https://github.com/torrentpier/torrentpier/commit/85395be5e7c6a891c79ec72cf215894af097f819))
+- *(copyright)* Updated copyright year ([#1760](https://github.com/torrentpier/torrentpier/pull/1760)) - ([6697410](https://github.com/torrentpier/torrentpier/commit/6697410c1df6c8d9d7f511b1e984ae90d888ae0e))
+- *(database)* Use `DEFAULT ''` for `privmsgs_subject` ([#1786](https://github.com/torrentpier/torrentpier/pull/1786)) - ([387a258](https://github.com/torrentpier/torrentpier/commit/387a25870abd37b641b55ffd98e13f4aaecb73b1))
+- *(deploy action)* Specify some missing params ([#1789](https://github.com/torrentpier/torrentpier/pull/1789)) - ([6115900](https://github.com/torrentpier/torrentpier/commit/6115900b765752209a6ed1dfb83e4f0cbee2ae77))
+- *(emailer)* Use constants for email types ([#1794](https://github.com/torrentpier/torrentpier/pull/1794)) - ([c95d414](https://github.com/torrentpier/torrentpier/commit/c95d414ef63ca37118f1f660880cd58b4480c414))
+- *(integrity checker)* Disabled by default in `Demo mode` ([#1804](https://github.com/torrentpier/torrentpier/pull/1804)) - ([44be40c](https://github.com/torrentpier/torrentpier/commit/44be40c2e849c60eb4f10ca7e0bae0463791355e))
+- *(integrity checker)* Some enhancements ([#1797](https://github.com/torrentpier/torrentpier/pull/1797)) - ([09cafc2](https://github.com/torrentpier/torrentpier/commit/09cafc2285dd171cb2213ece9549993a3321527c))
+- *(issue template)* Improved `Feature request` template ([#1774](https://github.com/torrentpier/torrentpier/pull/1774)) - ([268f79d](https://github.com/torrentpier/torrentpier/commit/268f79d7259de67aa8877fcf7130ff0069469ab2))
+- *(issue template)* Improved `Bug report` template ([#1773](https://github.com/torrentpier/torrentpier/pull/1773)) - ([53ebfef](https://github.com/torrentpier/torrentpier/commit/53ebfef32c0e9016257e03b96ef96349e22d3e9b))
+- *(notify)* Hide notify checkbox in topic for guests ([#1793](https://github.com/torrentpier/torrentpier/pull/1793)) - ([8e4cd97](https://github.com/torrentpier/torrentpier/commit/8e4cd97734fc46f33459c4b00a0fe38b0597f92b))
+- *(readme)* Improved installation guide ([#1781](https://github.com/torrentpier/torrentpier/pull/1781)) - ([e579b81](https://github.com/torrentpier/torrentpier/commit/e579b816b4dc346b3242cb3d9db292ad05596c1f))
+- *(readme)* Minor improvements ([#1779](https://github.com/torrentpier/torrentpier/pull/1779)) - ([5b0ed02](https://github.com/torrentpier/torrentpier/commit/5b0ed020890a8f938df912f9215cccbda42b0317))
+- *(readme)* Added Caddy webserver ([#1778](https://github.com/torrentpier/torrentpier/pull/1778)) - ([970a028](https://github.com/torrentpier/torrentpier/commit/970a0282e3631c403029c959ffd46b21c5cad0cd))
+- *(workflow)* Refactored all workflows ([#1803](https://github.com/torrentpier/torrentpier/pull/1803)) - ([a29d57b](https://github.com/torrentpier/torrentpier/commit/a29d57b2f8673733bbfbea3fb96eebe841078d49))
+- *(workflow)* Trying combine `changelog workflow` with `checksums workflow` ([#1800](https://github.com/torrentpier/torrentpier/pull/1800)) - ([60c6057](https://github.com/torrentpier/torrentpier/commit/60c605778412335ce97d41489c3b6ee9c051454b))
+- Automated releases generation ([#1808](https://github.com/torrentpier/torrentpier/pull/1808)) - ([6c9372c](https://github.com/torrentpier/torrentpier/commit/6c9372c407327c9bb443b2ecf16eff64c0245c4b))
+- Automated releases generation ([#1806](https://github.com/torrentpier/torrentpier/pull/1806)) - ([bc74550](https://github.com/torrentpier/torrentpier/commit/bc745502940207f3f24c83057cd680fe69355961))
+- Automated releases generation ([#1805](https://github.com/torrentpier/torrentpier/pull/1805)) - ([425e2e8](https://github.com/torrentpier/torrentpier/commit/425e2e87d5a7f097b961b1a14fbafcdabb9d1666))
+- Minor improvements ([#1796](https://github.com/torrentpier/torrentpier/pull/1796)) - ([8650ad3](https://github.com/torrentpier/torrentpier/commit/8650ad30f429ab14a03f44b26d7be7701f1985f1))
+- Update `cliff.toml` - ([254dca2](https://github.com/torrentpier/torrentpier/commit/254dca2b27c2d92421d3e639c80b0adf1172202f))
+- Minor improvements ([#1743](https://github.com/torrentpier/torrentpier/pull/1743)) - ([e73d650](https://github.com/torrentpier/torrentpier/commit/e73d65011fff0a8b8e1368eef61bbfb67e87eab8))
+- Enabled `$bb_cfg['integrity_check']` by defaul ([#1742](https://github.com/torrentpier/torrentpier/pull/1742)) - ([7e3601e](https://github.com/torrentpier/torrentpier/commit/7e3601e63aff73be1428969ca37dda3da2537d9b))
+
+## New Contributors ❤️
+
+* @actions-user made their first contribution
+
diff --git a/CLAUDE.md b/CLAUDE.md
deleted file mode 100644
index 68bd96ae8..000000000
--- a/CLAUDE.md
+++ /dev/null
@@ -1,144 +0,0 @@
-# CLAUDE.md
-
-This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
-
-## Project Overview
-
-TorrentPier is a BitTorrent tracker engine written in PHP, designed for hosting BitTorrent communities with forum functionality. The project is in active modernization, transitioning from legacy code to modern PHP practices while maintaining backward compatibility.
-
-## Technology Stack & Architecture
-
-- **PHP 8.2+** with modern features
-- **MySQL/MariaDB/Percona** database
-- **Nette Database** with backward-compatible wrapper
-- **Composer** for dependency management
-- **Custom BitTorrent tracker** implementation
-
-## Key Directory Structure
-
-- `/src/` - Modern PHP classes (PSR-4 autoloaded as `TorrentPier\`)
-- `/library/` - Core application logic and legacy code
-- `/admin/` - Administrative interface
-- `/bt/` - BitTorrent tracker functionality (announce.php, scrape.php)
-- `/styles/` - Templates, CSS, JS, images
-- `/internal_data/` - Cache, logs, compiled templates
-- `/install/` - Installation scripts and configuration examples
-- `/migrations/` - Database migration files (Phinx)
-
-## Entry Points & Key Files
-
-- `index.php` - Main forum homepage
-- `tracker.php` - Torrent search/browse interface
-- `bt/announce.php` - BitTorrent announce endpoint
-- `bt/scrape.php` - BitTorrent scrape endpoint
-- `admin/index.php` - Administrative panel
-- `cron.php` - Background task runner (CLI only)
-- `install.php` - Installation script (CLI only)
-
-## Development Commands
-
-### Installation & Setup
-```bash
-# Automated installation (CLI)
-php install.php
-
-# Install dependencies
-composer install
-
-# Update dependencies
-composer update
-```
-
-### Maintenance & Operations
-```bash
-# Run background maintenance tasks
-php cron.php
-```
-
-### Code Quality
-The project uses **StyleCI** with PSR-2 preset for code style enforcement. StyleCI configuration is in `.styleci.yml` targeting `src/` directory.
-
-## Modern Architecture Components
-
-### Database Layer (`/src/Database/`)
-- **Nette Database** with full old SqlDb backward compatibility
-- Singleton pattern accessible via `DB()` function
-- Support for multiple database connections and debug functionality
-- Migration path to ORM-style Explorer queries
-
-### Cache System (`/src/Cache/`)
-- **Unified caching** using Nette Caching internally
-- 100% backward compatibility with existing `CACHE()` and $datastore calls
-- Supports file, SQLite, memory, and Memcached storage
-- Advanced features: memoization, cache dependencies
-
-### Configuration Management
-- Environment-based config with `.env` files
-- Singleton `Config` class accessible via `config()` function
-- Local overrides supported via `library/config.local.php`
-
-## Configuration Files
-- `.env` - Environment variables (copy from `.env.example`)
-- `library/config.php` - Main application configuration
-- `library/config.local.php` - Local configuration overrides
-- `composer.json` - Dependencies and PSR-4 autoloading
-
-## Development Workflow
-
-### CI/CD Pipeline
-- **GitHub Actions** for automated testing and deployment
-- **StyleCI** for code style enforcement
-- **Dependabot** for dependency updates
-- **FTP deployment** to demo environment
-
-### Installation Methods
-1. **Automated**: `php install.php` (recommended)
-2. **Composer**: `composer create-project torrentpier/torrentpier`
-3. **Manual**: Git clone + `composer install` + database setup
-
-## Database & Schema
-
-- **Database migrations** managed via Phinx in `/migrations/` directory
-- Initial schema: `20250619000001_initial_schema.php`
-- Initial seed data: `20250619000002_seed_initial_data.php`
-- UTF-8 (utf8mb4) character set required
-- Multiple database alias support for different components
-
-### Migration Commands
-```bash
-# Run all pending migrations
-php vendor/bin/phinx migrate --configuration=phinx.php
-
-# Check migration status
-php vendor/bin/phinx status --configuration=phinx.php
-
-# Mark migrations as applied (for existing installations)
-php vendor/bin/phinx migrate --fake --configuration=phinx.php
-```
-
-## Legacy Compatibility Strategy
-
-The codebase maintains 100% backward compatibility while introducing modern alternatives:
-
-- **Database layer**: Existing old SqlDb calls work while new code can use Nette Database
-- **Cache system**: All existing `CACHE()` and $datastore calls preserved while adding modern features
-- **Configuration**: Legacy config access maintained alongside new singleton pattern
-
-This approach allows gradual modernization without breaking existing functionality - critical for a mature application with existing deployments.
-
-## Security & Performance
-
-- **Environment-based secrets** management via `.env`
-- **CDN/proxy support** (Cloudflare, Fastly)
-- **Input sanitization** and CSRF protection
-- **Advanced caching** with multiple storage backends
-- **Rate limiting** and IP-based restrictions
-
-## BitTorrent Tracker Features
-
-- **BitTorrent v1 & v2** support
-- **TorrServer integration** capability
-- **Client ban system** for problematic torrent clients
-- **Scrape support** for tracker statistics
-
-When working with this codebase, prioritize understanding the legacy compatibility approach and modern architecture patterns. Always test both legacy and modern code paths when making changes to core systems.
diff --git a/HISTORY.md b/HISTORY.md
new file mode 100644
index 000000000..6862444c4
--- /dev/null
+++ b/HISTORY.md
@@ -0,0 +1,1131 @@
+# 📖 Change Log (History)
+
+> [!NOTE]
+> Changelog from **v2.0.0** to **v2.4.5-rc.2**.
+
+## [v2.4.5-rc.2](https://github.com/torrentpier/torrentpier/tree/v2.4.5-rc.2) (2025-01-10)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.5-rc.1...v2.4.5-rc.2)
+
+**Merged pull requests:**
+
+- Release 2.4.5-rc.2 🍧️ ([belomaxorka](https://github.com/belomaxorka))
+- Added `IndexNow` protocol support 🤖 [\#1736](https://github.com/torrentpier/torrentpier/pull/1736) ([belomaxorka](https://github.com/belomaxorka))
+- Added `TorrentPier instance hash` generation [\#1726](https://github.com/torrentpier/torrentpier/pull/1726) ([belomaxorka](https://github.com/belomaxorka))
+- Added `m4a` extension support in M3U playback [\#1724](https://github.com/torrentpier/torrentpier/pull/1724) ([belomaxorka](https://github.com/belomaxorka))
+- Created `VersionHelper.php` [\#1731](https://github.com/torrentpier/torrentpier/pull/1731) ([belomaxorka](https://github.com/belomaxorka))
+- Removed sitemap ping because is deprecated [\#1738](https://github.com/torrentpier/torrentpier/pull/1738) ([belomaxorka](https://github.com/belomaxorka))
+- Drop Ocelot announcer support 🫡 [\#1727](https://github.com/torrentpier/torrentpier/pull/1727) ([belomaxorka](https://github.com/belomaxorka))
+- Use `DEFAULT_CHARSET` constant instead of hardcoded string [\#1734](https://github.com/torrentpier/torrentpier/pull/1734) ([belomaxorka](https://github.com/belomaxorka))
+- Replaced some string functions to `mbstring` alternatives [\#1735](https://github.com/torrentpier/torrentpier/pull/1735) ([belomaxorka](https://github.com/belomaxorka))
+- Replaced some `html_entity_decode` to engine's built-in function [\#1733](https://github.com/torrentpier/torrentpier/pull/1733) ([belomaxorka](https://github.com/belomaxorka))
+- Show torrent's announcers list in `filelist.php` page [\#1708](https://github.com/torrentpier/torrentpier/pull/1708) ([belomaxorka](https://github.com/belomaxorka))
+- [PHP 8.4] Fixed some deprecations [\#1718](https://github.com/torrentpier/torrentpier/pull/1718) ([belomaxorka](https://github.com/belomaxorka))
+- [Configurable] Show magnet-links for guests [\#1712](https://github.com/torrentpier/torrentpier/pull/1712) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed issues with searching by username [\#1722](https://github.com/torrentpier/torrentpier/pull/1722) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed searching by username in `memberlist.php` [\#1721](https://github.com/torrentpier/torrentpier/pull/1721) ([belomaxorka](https://github.com/belomaxorka))
+- Set `cursor: pointer;` for buttons, inputs (buttons) [\#1710](https://github.com/torrentpier/torrentpier/pull/1710), [\#1711](https://github.com/torrentpier/torrentpier/pull/1711) ([belomaxorka](https://github.com/belomaxorka))
+- Some updater improvements [\#1725](https://github.com/torrentpier/torrentpier/pull/1725) ([belomaxorka](https://github.com/belomaxorka))
+- Minor improvements [\#1705](https://github.com/torrentpier/torrentpier/pull/1705), [\#1713](https://github.com/torrentpier/torrentpier/pull/1713), [\#1715](https://github.com/torrentpier/torrentpier/pull/1715), [\#1717](https://github.com/torrentpier/torrentpier/pull/1717), [\#1719](https://github.com/torrentpier/torrentpier/pull/1719), [\#1720](https://github.com/torrentpier/torrentpier/pull/1720), [\#1728](https://github.com/torrentpier/torrentpier/pull/1728), [\#1730](https://github.com/torrentpier/torrentpier/pull/1730), [\#1739](https://github.com/torrentpier/torrentpier/pull/1739) ([belomaxorka](https://github.com/belomaxorka))
+- Updated deps [\#1723](https://github.com/torrentpier/torrentpier/pull/1723) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#1704](https://github.com/torrentpier/torrentpier/pull/1704), [\#1706](https://github.com/torrentpier/torrentpier/pull/1706), [\#1714](https://github.com/torrentpier/torrentpier/pull/1714), [\#1716](https://github.com/torrentpier/torrentpier/pull/1716) ([Exileum](https://github.com/Exileum))
+
+## [v2.4.5-rc.1](https://github.com/torrentpier/torrentpier/tree/v2.4.5-rc.1) (2024-12-08)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.4...v2.4.5-rc.1)
+
+**Merged pull requests:**
+
+- Release 2.4.5-rc.1 🦕 ([belomaxorka](https://github.com/belomaxorka))
+- [CLI] TorrentPier installer ☕️ [\#1576](https://github.com/torrentpier/torrentpier/pull/1576), [\#1582](https://github.com/torrentpier/torrentpier/pull/1582), [\#1585](https://github.com/torrentpier/torrentpier/pull/1585), [\#1591](https://github.com/torrentpier/torrentpier/pull/1591) ([belomaxorka](https://github.com/belomaxorka))
+- Added avif images support 🌄 [\#1660](https://github.com/torrentpier/torrentpier/pull/1660) ([belomaxorka](https://github.com/belomaxorka))
+- Added some new HTML meta-tags [\#1562](https://github.com/torrentpier/torrentpier/pull/1562) ([belomaxorka](https://github.com/belomaxorka))
+- Added robots meta-tag support 🤖 [\#1587](https://github.com/torrentpier/torrentpier/pull/1587) ([belomaxorka](https://github.com/belomaxorka))
+- Added [TorrServer](https://github.com/YouROK/TorrServer) instance support! 🎞 [\#1603](https://github.com/torrentpier/torrentpier/pull/1603), [\#1623](https://github.com/torrentpier/torrentpier/pull/1623), [\#1624](https://github.com/torrentpier/torrentpier/pull/1624), [\#1628](https://github.com/torrentpier/torrentpier/pull/1628) ([belomaxorka](https://github.com/belomaxorka))
+- Newtopic: Added configuring robots indexing [\#1599](https://github.com/torrentpier/torrentpier/pull/1599) ([belomaxorka](https://github.com/belomaxorka))
+- Added showing releaser stats in profile [\#1568](https://github.com/torrentpier/torrentpier/pull/1568) ([belomaxorka](https://github.com/belomaxorka))
+- Added ability to set country name manually [\#1652](https://github.com/torrentpier/torrentpier/pull/1652) ([belomaxorka](https://github.com/belomaxorka))
+- Added new constant `TOR_TYPE_DEFAULT` [\#1698](https://github.com/torrentpier/torrentpier/pull/1698) ([belomaxorka](https://github.com/belomaxorka))
+- Improved BitTorrent clients ban functionality [\#1657](https://github.com/torrentpier/torrentpier/pull/1657) ([belomaxorka](https://github.com/belomaxorka))
+- Improved `filelist.php` [\#1586](https://github.com/torrentpier/torrentpier/pull/1586) ([belomaxorka](https://github.com/belomaxorka))
+- Invites: Permanent invites feature [\#1670](https://github.com/torrentpier/torrentpier/pull/1670) ([belomaxorka](https://github.com/belomaxorka))
+- Show torrent unregister action in log actions [\#1696](https://github.com/torrentpier/torrentpier/pull/1696) ([belomaxorka](https://github.com/belomaxorka))
+- Show torrent status changes in actions log [\#1688](https://github.com/torrentpier/torrentpier/pull/1688) ([belomaxorka](https://github.com/belomaxorka))
+- Show torrent type (gold / silver) changes in actions log [\#1689](https://github.com/torrentpier/torrentpier/pull/1689) ([belomaxorka](https://github.com/belomaxorka))
+- Bring back `DBG_USER` (old debug method), fixed bugsnag handler [\#1701](https://github.com/torrentpier/torrentpier/pull/1701) ([belomaxorka](https://github.com/belomaxorka))
+- Merged some fixes from `new-attachments` branch [\#1700](https://github.com/torrentpier/torrentpier/pull/1700) ([belomaxorka](https://github.com/belomaxorka))
+- Changed database encoding to `utf8mb4_unicode_ci` [\#1684](https://github.com/torrentpier/torrentpier/pull/1684) ([belomaxorka](https://github.com/belomaxorka))
+- Demo mode: Save user language in cookies [\#1584](https://github.com/torrentpier/torrentpier/pull/1584) ([belomaxorka](https://github.com/belomaxorka))
+- Make `get_torrent_info()` as public method for re-use [\#1697](https://github.com/torrentpier/torrentpier/pull/1697) ([belomaxorka](https://github.com/belomaxorka))
+- BBCode: Fixed relative links working [\#1613](https://github.com/torrentpier/torrentpier/pull/1613) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed empty `topic_id` in log actions after topic rename [\#1687](https://github.com/torrentpier/torrentpier/pull/1687) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken torrent stats displaying [\#1672](https://github.com/torrentpier/torrentpier/pull/1672), [\#1673](https://github.com/torrentpier/torrentpier/pull/1673) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed template caching issue [\#1622](https://github.com/torrentpier/torrentpier/pull/1622) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed `md5()` deprecated in PHP 8.4 [\#1561](https://github.com/torrentpier/torrentpier/pull/1561) ([belomaxorka](https://github.com/belomaxorka))
+- Increased `USEREMAIL_MAX_LENGTH` [\#1566](https://github.com/torrentpier/torrentpier/pull/1566) ([belomaxorka](https://github.com/belomaxorka))
+- Disabled resizing for textarea tag [\#1638](https://github.com/torrentpier/torrentpier/pull/1638) ([belomaxorka](https://github.com/belomaxorka))
+- Revert "Datastore improvements" ([belomaxorka](https://github.com/belomaxorka))
+- Minor improvements [\#1570](https://github.com/torrentpier/torrentpier/pull/1570), [\#1571](https://github.com/torrentpier/torrentpier/pull/1571), [\#1575](https://github.com/torrentpier/torrentpier/pull/1575), [\#1589](https://github.com/torrentpier/torrentpier/pull/1589), [\#1592](https://github.com/torrentpier/torrentpier/pull/1592), [\#1605](https://github.com/torrentpier/torrentpier/pull/1605), [\#1611](https://github.com/torrentpier/torrentpier/pull/1611), [\#1612](https://github.com/torrentpier/torrentpier/pull/1612), [\#1615](https://github.com/torrentpier/torrentpier/pull/1615), [\#1627](https://github.com/torrentpier/torrentpier/pull/1627), [\#1633](https://github.com/torrentpier/torrentpier/pull/1633), [\#1641](https://github.com/torrentpier/torrentpier/pull/1641), [\#1651](https://github.com/torrentpier/torrentpier/pull/1651), [\#1658](https://github.com/torrentpier/torrentpier/pull/1658), [\#1674](https://github.com/torrentpier/torrentpier/pull/1674), [\#1675](https://github.com/torrentpier/torrentpier/pull/1675), [\#1676](https://github.com/torrentpier/torrentpier/pull/1676), [\#1679](https://github.com/torrentpier/torrentpier/pull/1679), [\#1681](https://github.com/torrentpier/torrentpier/pull/1681), [\#1683](https://github.com/torrentpier/torrentpier/pull/1683), [\#1685](https://github.com/torrentpier/torrentpier/pull/1685), [\#1686](https://github.com/torrentpier/torrentpier/pull/1686), [\#1702](https://github.com/torrentpier/torrentpier/pull/1702), [\#1703](https://github.com/torrentpier/torrentpier/pull/1703) ([belomaxorka](https://github.com/belomaxorka))
+- Updated `modern-normalize` to `v3.0.1` [\#1669](https://github.com/torrentpier/torrentpier/pull/1669) ([belomaxorka](https://github.com/belomaxorka))
+- Updated deps [\#1563](https://github.com/torrentpier/torrentpier/pull/1563), [\#1564](https://github.com/torrentpier/torrentpier/pull/1564), [\#1608](https://github.com/torrentpier/torrentpier/pull/1608), [\#1609](https://github.com/torrentpier/torrentpier/pull/1609), [\#1610](https://github.com/torrentpier/torrentpier/pull/1610), [\#1637](https://github.com/torrentpier/torrentpier/pull/1637), [\#1646](https://github.com/torrentpier/torrentpier/pull/1646), [\#1647](https://github.com/torrentpier/torrentpier/pull/1647), [\#1650](https://github.com/torrentpier/torrentpier/pull/1650), [\#1656](https://github.com/torrentpier/torrentpier/pull/1656), [\#1677](https://github.com/torrentpier/torrentpier/pull/1677), [\#1682](https://github.com/torrentpier/torrentpier/pull/1682), [\#1699](https://github.com/torrentpier/torrentpier/pull/1699) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#1569](https://github.com/torrentpier/torrentpier/pull/1569), [\#1572](https://github.com/torrentpier/torrentpier/pull/1572), [\#1573](https://github.com/torrentpier/torrentpier/pull/1573), [\#1574](https://github.com/torrentpier/torrentpier/pull/1574), [\#1588](https://github.com/torrentpier/torrentpier/pull/1588), [\#1590](https://github.com/torrentpier/torrentpier/pull/1590), [\#1600](https://github.com/torrentpier/torrentpier/pull/1600), [\#1601](https://github.com/torrentpier/torrentpier/pull/1601), [\#1606](https://github.com/torrentpier/torrentpier/pull/1606), [\#1607](https://github.com/torrentpier/torrentpier/pull/1607), [\#1625](https://github.com/torrentpier/torrentpier/pull/1625), [\#1626](https://github.com/torrentpier/torrentpier/pull/1626), [\#1629](https://github.com/torrentpier/torrentpier/pull/1629), [\#1630](https://github.com/torrentpier/torrentpier/pull/1630), [\#1631](https://github.com/torrentpier/torrentpier/pull/1631), [\#1632](https://github.com/torrentpier/torrentpier/pull/1632), [\#1639](https://github.com/torrentpier/torrentpier/pull/1639), [\#1640](https://github.com/torrentpier/torrentpier/pull/1640), [\#1654](https://github.com/torrentpier/torrentpier/pull/1654), [\#1655](https://github.com/torrentpier/torrentpier/pull/1655) ([Exileum](https://github.com/Exileum))
+
+## [v2.4.4](https://github.com/torrentpier/torrentpier/tree/v2.4.4) (2024-07-22)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.3...v2.4.4)
+
+**Merged pull requests:**
+
+- Release 2.4.4 🦩 ([belomaxorka](https://github.com/belomaxorka))
+- Supports PHP 8.2 / PHP 8.3 ([belomaxorka](https://github.com/belomaxorka))
+- CVE-2024-40624: Deserialization of untrusted data ([belomaxorka](https://github.com/belomaxorka))
+- Refactored cache drivers 🗃 [\#1553](https://github.com/torrentpier/torrentpier/pull/1553), [\#1557](https://github.com/torrentpier/torrentpier/pull/1557) ([belomaxorka](https://github.com/belomaxorka))
+- Create tech stack docs (`techstack.yml` and `techstack.md`) [\#1521](https://github.com/torrentpier/torrentpier/pull/1521), [\#1522](https://github.com/torrentpier/torrentpier/pull/1522) ([belomaxorka](https://github.com/belomaxorka))
+- Added MonsterID avatars support 🎇 [\#1546](https://github.com/torrentpier/torrentpier/pull/1546) ([belomaxorka](https://github.com/belomaxorka))
+- Added ability to reset ratio [\#1545](https://github.com/torrentpier/torrentpier/pull/1545) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed: function `utf8_encode()` is deprecated [\#1556](https://github.com/torrentpier/torrentpier/pull/1556) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken "Disable Board" function [\#1529](https://github.com/torrentpier/torrentpier/pull/1529) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed seed bonus accrual [\#1518](https://github.com/torrentpier/torrentpier/pull/1518) ([belomaxorka](https://github.com/belomaxorka))
+- [BETA] Added emojis support 😄😁 [\#1514](https://github.com/torrentpier/torrentpier/pull/1514) ([belomaxorka](https://github.com/belomaxorka))
+- Pagination with `rel="next"` and `rel="prev"` support [\#1551](https://github.com/torrentpier/torrentpier/pull/1551) ([belomaxorka](https://github.com/belomaxorka))
+- Resize user/group avatar image if too large 🌆 [\#1512](https://github.com/torrentpier/torrentpier/pull/1512) ([belomaxorka](https://github.com/belomaxorka))
+- Increased `PASSWORD_MAX_LENGTH` [\#1510](https://github.com/torrentpier/torrentpier/pull/1510) ([belomaxorka](https://github.com/belomaxorka))
+- Bring back forum description in `viewforum.php` [\#1540](https://github.com/torrentpier/torrentpier/pull/1540) ([belomaxorka](https://github.com/belomaxorka))
+- Some security improvements 🔑 [\#1503](https://github.com/torrentpier/torrentpier/pull/1503), [\#1505](https://github.com/torrentpier/torrentpier/pull/1505) ([belomaxorka](https://github.com/belomaxorka))
+- Some improvements for integrity checker [\#1501](https://github.com/torrentpier/torrentpier/pull/1501) ([belomaxorka](https://github.com/belomaxorka))
+- Some improvements for ratio functionality [\#1552](https://github.com/torrentpier/torrentpier/pull/1552) ([belomaxorka](https://github.com/belomaxorka))
+- Hide in topic: Added country hiding [\#1535](https://github.com/torrentpier/torrentpier/pull/1535) ([belomaxorka](https://github.com/belomaxorka))
+- Hide vote button in topic for guests [\#1507](https://github.com/torrentpier/torrentpier/pull/1507) ([belomaxorka](https://github.com/belomaxorka))
+- Word censor code optimization [\#1537](https://github.com/torrentpier/torrentpier/pull/1537) ([belomaxorka](https://github.com/belomaxorka))
+- Minor improvements [\#1502](https://github.com/torrentpier/torrentpier/pull/1502), [\#1506](https://github.com/torrentpier/torrentpier/pull/1506), [\#1509](https://github.com/torrentpier/torrentpier/pull/1509), [\#1511](https://github.com/torrentpier/torrentpier/pull/1511), [\#1515](https://github.com/torrentpier/torrentpier/pull/1515), [\#1516](https://github.com/torrentpier/torrentpier/pull/1516), [\#1517](https://github.com/torrentpier/torrentpier/pull/1517), [\#1519](https://github.com/torrentpier/torrentpier/pull/1519), [\#1523](https://github.com/torrentpier/torrentpier/pull/1523), [\#1525](https://github.com/torrentpier/torrentpier/pull/1525), [\#1530](https://github.com/torrentpier/torrentpier/pull/1530), [\#1532](https://github.com/torrentpier/torrentpier/pull/1532), [\#1536](https://github.com/torrentpier/torrentpier/pull/1536), [\#1539](https://github.com/torrentpier/torrentpier/pull/1539), [\#1542](https://github.com/torrentpier/torrentpier/pull/1542), [\#1544](https://github.com/torrentpier/torrentpier/pull/1544), [\#1548](https://github.com/torrentpier/torrentpier/pull/1548), [\#1550](https://github.com/torrentpier/torrentpier/pull/1550), [\#1558](https://github.com/torrentpier/torrentpier/pull/1558) ([belomaxorka](https://github.com/belomaxorka))
+- Updated deps [\#1526](https://github.com/torrentpier/torrentpier/pull/1526), [\#1527](https://github.com/torrentpier/torrentpier/pull/1527), [\#1528](https://github.com/torrentpier/torrentpier/pull/1528), [\#1554](https://github.com/torrentpier/torrentpier/pull/1554), [\#1555](https://github.com/torrentpier/torrentpier/pull/1555) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#1504](https://github.com/torrentpier/torrentpier/pull/1504), [\#1513](https://github.com/torrentpier/torrentpier/pull/1513), [\#1524](https://github.com/torrentpier/torrentpier/pull/1524), [\#1541](https://github.com/torrentpier/torrentpier/pull/1541), [\#1543](https://github.com/torrentpier/torrentpier/pull/1543), [\#1547](https://github.com/torrentpier/torrentpier/pull/1547), [\#1549](https://github.com/torrentpier/torrentpier/pull/1549), [\#1559](https://github.com/torrentpier/torrentpier/pull/1559), [\#1560](https://github.com/torrentpier/torrentpier/pull/1560) ([Exileum](https://github.com/Exileum))
+
+## [v2.4.3](https://github.com/torrentpier/torrentpier/tree/v2.4.3) (2024-06-09)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.2...v2.4.3)
+
+**Merged pull requests:**
+
+- Release 2.4.3 🐎 ([belomaxorka](https://github.com/belomaxorka))
+- Added restoring corrupt TorrentPier files 🪛 [\#1493](https://github.com/torrentpier/torrentpier/pull/1493) ([belomaxorka](https://github.com/belomaxorka))
+- Added TorrentPier files integrity check 📦 [\#1491](https://github.com/torrentpier/torrentpier/pull/1491) ([belomaxorka](https://github.com/belomaxorka))
+- Added updates checker ⚙️ [\#1451](https://github.com/torrentpier/torrentpier/pull/1451), [\#1475](https://github.com/torrentpier/torrentpier/pull/1475) ([belomaxorka](https://github.com/belomaxorka))
+- Added preview for country flags while editing [\#1448](https://github.com/torrentpier/torrentpier/pull/1448) ([belomaxorka](https://github.com/belomaxorka))
+- Added support for APCu caching method [\#1442](https://github.com/torrentpier/torrentpier/pull/1442) ([belomaxorka](https://github.com/belomaxorka))
+- Added support for attribute to ignoring auto spoilers opening [\#1466](https://github.com/torrentpier/torrentpier/pull/1466) ([belomaxorka](https://github.com/belomaxorka))
+- Some enhancements [\#1445](https://github.com/torrentpier/torrentpier/pull/1445) ([belomaxorka](https://github.com/belomaxorka))
+- Some cleanup...😣 [\#1488](https://github.com/torrentpier/torrentpier/pull/1488) ([belomaxorka](https://github.com/belomaxorka))
+- Guests can view polls [\#1464](https://github.com/torrentpier/torrentpier/pull/1464) ([belomaxorka](https://github.com/belomaxorka))
+- Improved app debug [\#1438](https://github.com/torrentpier/torrentpier/pull/1438) ([belomaxorka](https://github.com/belomaxorka))
+- Show client country in seeders / leechers list 🌍 [\#1478](https://github.com/torrentpier/torrentpier/pull/1478) ([belomaxorka](https://github.com/belomaxorka))
+- Some enhancements for flags [\#1470](https://github.com/torrentpier/torrentpier/pull/1470), [\#1471](https://github.com/torrentpier/torrentpier/pull/1471) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed quote selection for smiles [\#1457](https://github.com/torrentpier/torrentpier/pull/1457) ([belomaxorka](https://github.com/belomaxorka))
+- Demo mode: Allow registering torrents by default [\#1440](https://github.com/torrentpier/torrentpier/pull/1440) ([belomaxorka](https://github.com/belomaxorka))
+- Temp: Removed showing forum description in `viewforum.php` [\#1465](https://github.com/torrentpier/torrentpier/pull/1465) ([belomaxorka](https://github.com/belomaxorka))
+- Code refactoring [\#1441](https://github.com/torrentpier/torrentpier/pull/1441) ([belomaxorka](https://github.com/belomaxorka))
+- Minor improvements [\#1435](https://github.com/torrentpier/torrentpier/pull/1435), [\#1443](https://github.com/torrentpier/torrentpier/pull/1443), [\#1446](https://github.com/torrentpier/torrentpier/pull/1446), [\#1450](https://github.com/torrentpier/torrentpier/pull/1450), [\#1452](https://github.com/torrentpier/torrentpier/pull/1452), [\#1458](https://github.com/torrentpier/torrentpier/pull/1458), [\#1461](https://github.com/torrentpier/torrentpier/pull/1461), [\#1462](https://github.com/torrentpier/torrentpier/pull/1462), [\#1467](https://github.com/torrentpier/torrentpier/pull/1467), [\#1469](https://github.com/torrentpier/torrentpier/pull/1469), [\#1472](https://github.com/torrentpier/torrentpier/pull/1472), [\#1477](https://github.com/torrentpier/torrentpier/pull/1477), [\#1480](https://github.com/torrentpier/torrentpier/pull/1480), [\#1481](https://github.com/torrentpier/torrentpier/pull/1481), [\#1482](https://github.com/torrentpier/torrentpier/pull/1482), [\#1484](https://github.com/torrentpier/torrentpier/pull/1484), [\#1490](https://github.com/torrentpier/torrentpier/pull/1490), [\#1494](https://github.com/torrentpier/torrentpier/pull/1494), [\#1497](https://github.com/torrentpier/torrentpier/pull/1497), [\#1499](https://github.com/torrentpier/torrentpier/pull/1499), [\#1500](https://github.com/torrentpier/torrentpier/pull/1500) ([belomaxorka](https://github.com/belomaxorka))
+- Updated deps [\#1454](https://github.com/torrentpier/torrentpier/pull/1454), [\#1455](https://github.com/torrentpier/torrentpier/pull/1455), [\#1459](https://github.com/torrentpier/torrentpier/pull/1459), [\#1460](https://github.com/torrentpier/torrentpier/pull/1460), [\#1485](https://github.com/torrentpier/torrentpier/pull/1485), [\#1486](https://github.com/torrentpier/torrentpier/pull/1486) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#1444](https://github.com/torrentpier/torrentpier/pull/1444), [\#1447](https://github.com/torrentpier/torrentpier/pull/1447), [\#1453](https://github.com/torrentpier/torrentpier/pull/1453), [\#1468](https://github.com/torrentpier/torrentpier/pull/1468), [\#1473](https://github.com/torrentpier/torrentpier/pull/1473), [\#1476](https://github.com/torrentpier/torrentpier/pull/1476), [\#1479](https://github.com/torrentpier/torrentpier/pull/1479), [\#1487](https://github.com/torrentpier/torrentpier/pull/1487), [\#1489](https://github.com/torrentpier/torrentpier/pull/1489), [\#1492](https://github.com/torrentpier/torrentpier/pull/1492), [\#1495](https://github.com/torrentpier/torrentpier/pull/1495), [\#1496](https://github.com/torrentpier/torrentpier/pull/1496), [\#1498](https://github.com/torrentpier/torrentpier/pull/1498) ([Exileum](https://github.com/Exileum))
+
+## [v2.4.2](https://github.com/torrentpier/torrentpier/tree/v2.4.2) (2024-03-30)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.1...v2.4.2)
+
+**Merged pull requests:**
+
+- Release 2.4.2 🐯 ([belomaxorka](https://github.com/belomaxorka))
+- Added demo mode 📺 [\#1399](https://github.com/torrentpier/torrentpier/pull/1399) ([belomaxorka](https://github.com/belomaxorka))
+- Added BBCode Acronym tag [\#1419](https://github.com/torrentpier/torrentpier/pull/1419), [\#1425](https://github.com/torrentpier/torrentpier/pull/1425) ([belomaxorka](https://github.com/belomaxorka))
+- Added showing poll status in `topic_watch.php` [\#1413](https://github.com/torrentpier/torrentpier/pull/1413) ([belomaxorka](https://github.com/belomaxorka))
+- Added ability to view post_text of topic [\#1401](https://github.com/torrentpier/torrentpier/pull/1401) ([belomaxorka](https://github.com/belomaxorka))
+- Added support for rutracker font BBCode tag [\#1397](https://github.com/torrentpier/torrentpier/pull/1397) ([belomaxorka](https://github.com/belomaxorka))
+- Added mod "Reason to move topic" [\#1388](https://github.com/torrentpier/torrentpier/pull/1388) ([belomaxorka](https://github.com/belomaxorka))
+- Created template file for AJAX quick actions [\#1381](https://github.com/torrentpier/torrentpier/pull/1381) ([belomaxorka](https://github.com/belomaxorka))
+- Don't requires fill textarea for mod comment deleting [\#1433](https://github.com/torrentpier/torrentpier/pull/1433) ([belomaxorka](https://github.com/belomaxorka))
+- Make post date clickable in `posting.php` [\#1427](https://github.com/torrentpier/torrentpier/pull/1427) ([belomaxorka](https://github.com/belomaxorka))
+- Removed `wbr()` [\#1387](https://github.com/torrentpier/torrentpier/pull/1387) ([belomaxorka](https://github.com/belomaxorka))
+- Removed converting for legacy md5 passwords [\#1386](https://github.com/torrentpier/torrentpier/pull/1386) ([belomaxorka](https://github.com/belomaxorka))
+- PHP 8.2: Fixed creation of dynamic property [\#1432](https://github.com/torrentpier/torrentpier/pull/1432) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken searching of attachments via ACP [\#1431](https://github.com/torrentpier/torrentpier/pull/1431) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed issue with poll_users cleaning at every cron job startup [\#1390](https://github.com/torrentpier/torrentpier/pull/1390) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed Undefined variable $wordCensor [\#1400](https://github.com/torrentpier/torrentpier/pull/1400) ([belomaxorka](https://github.com/belomaxorka))
+- Improved word censor 🤐 [\#1393](https://github.com/torrentpier/torrentpier/pull/1393) ([belomaxorka](https://github.com/belomaxorka))
+- Show poll prefix for guests [\#1417](https://github.com/torrentpier/torrentpier/pull/1417) ([belomaxorka](https://github.com/belomaxorka))
+- Used hashing for filenames generation [\#1385](https://github.com/torrentpier/torrentpier/pull/1385) ([belomaxorka](https://github.com/belomaxorka))
+- Hide quote button if topic locked [\#1416](https://github.com/torrentpier/torrentpier/pull/1416) ([belomaxorka](https://github.com/belomaxorka))
+- log_error(): Hide Referer string if empty [\#1430](https://github.com/torrentpier/torrentpier/pull/1430) ([belomaxorka](https://github.com/belomaxorka))
+- Minor improvements [\#1382](https://github.com/torrentpier/torrentpier/pull/1382), [\#1383](https://github.com/torrentpier/torrentpier/pull/1383), [\#1391](https://github.com/torrentpier/torrentpier/pull/1391), [\#1398](https://github.com/torrentpier/torrentpier/pull/1398), [\#1405](https://github.com/torrentpier/torrentpier/pull/1405), [\#1406](https://github.com/torrentpier/torrentpier/pull/1406), [\#1408](https://github.com/torrentpier/torrentpier/pull/1408), [\#1409](https://github.com/torrentpier/torrentpier/pull/1409), [\#1410](https://github.com/torrentpier/torrentpier/pull/1410), [\#1411](https://github.com/torrentpier/torrentpier/pull/1411), [\#1418](https://github.com/torrentpier/torrentpier/pull/1418), [\#1422](https://github.com/torrentpier/torrentpier/pull/1422) ([belomaxorka](https://github.com/belomaxorka))
+- Some bugfixes [\#1380](https://github.com/torrentpier/torrentpier/pull/1380) ([belomaxorka](https://github.com/belomaxorka))
+- Updated deps [\#1414](https://github.com/torrentpier/torrentpier/pull/1414), [\#1415](https://github.com/torrentpier/torrentpier/pull/1415), [\#1421](https://github.com/torrentpier/torrentpier/pull/1421), [\#1424](https://github.com/torrentpier/torrentpier/pull/1424) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#1384](https://github.com/torrentpier/torrentpier/pull/1384), [\#1389](https://github.com/torrentpier/torrentpier/pull/1389), [\#1392](https://github.com/torrentpier/torrentpier/pull/1392), [\#1402](https://github.com/torrentpier/torrentpier/pull/1402), [\#1403](https://github.com/torrentpier/torrentpier/pull/1403), [\#1412](https://github.com/torrentpier/torrentpier/pull/1412), [\#1420](https://github.com/torrentpier/torrentpier/pull/1420), [\#1429](https://github.com/torrentpier/torrentpier/pull/1429), [\#1434](https://github.com/torrentpier/torrentpier/pull/1434) ([Exileum](https://github.com/Exileum))
+
+## [v2.4.1](https://github.com/torrentpier/torrentpier/tree/v2.4.1) (2024-02-04)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.0...v2.4.1)
+
+**Merged pull requests:**
+
+- Release 2.4.1 🦉 ([belomaxorka](https://github.com/belomaxorka), [kovalensky](https://github.com/kovalensky))
+- Timeline — 2.4.1 [\#1340](https://github.com/torrentpier/torrentpier/pull/1340), [\#1341](https://github.com/torrentpier/torrentpier/pull/1341), [\#1342](https://github.com/torrentpier/torrentpier/pull/1342), [\#1343](https://github.com/torrentpier/torrentpier/pull/1343), [\#1362](https://github.com/torrentpier/torrentpier/pull/1362) ([kovalensky](https://github.com/kovalensky))
+- [BEP47] sha1 hash files are binary by default [\#1348](https://github.com/torrentpier/torrentpier/pull/1348) ([kovalensky](https://github.com/kovalensky))
+- Flatten file list for hybrid files [\#1350](https://github.com/torrentpier/torrentpier/pull/1350) ([kovalensky](https://github.com/kovalensky))
+- Counter is not precise [\#1360](https://github.com/torrentpier/torrentpier/pull/1360) ([kovalensky](https://github.com/kovalensky))
+- Add referrer "origin" policy to repository links [\#1357](https://github.com/torrentpier/torrentpier/pull/1357) ([kovalensky](https://github.com/kovalensky))
+- Added new flag 🕊 [\#1347](https://github.com/torrentpier/torrentpier/pull/1347) ([belomaxorka](https://github.com/belomaxorka))
+- Added ability to view "Watching topics" of other people's (For admins only) [\#1336](https://github.com/torrentpier/torrentpier/pull/1336) ([belomaxorka](https://github.com/belomaxorka))
+- Added `[box]` BBCode tag [\#1368](https://github.com/torrentpier/torrentpier/pull/1368) ([belomaxorka](https://github.com/belomaxorka))
+- Added `[indent]` BBCode tag [\#1375](https://github.com/torrentpier/torrentpier/pull/1375) ([belomaxorka](https://github.com/belomaxorka))
+- Added `bt_announce_url` autofill via cron [\#1331](https://github.com/torrentpier/torrentpier/pull/1331), [\#1364](https://github.com/torrentpier/torrentpier/pull/1364) ([belomaxorka](https://github.com/belomaxorka))
+- Added ability to send debug via Telegram [\#1323](https://github.com/torrentpier/torrentpier/pull/1323), [\#1372](https://github.com/torrentpier/torrentpier/pull/1372) ([belomaxorka](https://github.com/belomaxorka))
+- Added "Random release" button in tracker.php [\#1334](https://github.com/torrentpier/torrentpier/pull/1334) ([belomaxorka](https://github.com/belomaxorka))
+- Added support for fastly cdn [\#1327](https://github.com/torrentpier/torrentpier/pull/1327) ([belomaxorka](https://github.com/belomaxorka), [kovalensky](https://github.com/kovalensky))
+- Use `target="_blank"` in admin for profile_url() redirects [\#1330](https://github.com/torrentpier/torrentpier/pull/1330) ([belomaxorka](https://github.com/belomaxorka))
+- Used declensions for days in some cases [\#1310](https://github.com/torrentpier/torrentpier/pull/1310) ([belomaxorka](https://github.com/belomaxorka))
+- Used `modern-normalize` instead of outdated `nornalize-css` [\#1363](https://github.com/torrentpier/torrentpier/pull/1363) ([belomaxorka](https://github.com/belomaxorka))
+- Used datastore to show statistic for more performance [\#1309](https://github.com/torrentpier/torrentpier/pull/1309) ([belomaxorka](https://github.com/belomaxorka))
+- Used `humn_size()` to count average of releases in tr_stats.php [\#1313](https://github.com/torrentpier/torrentpier/pull/1313) ([belomaxorka](https://github.com/belomaxorka))
+- Some enhancements in default template [\#1312](https://github.com/torrentpier/torrentpier/pull/1312) ([belomaxorka](https://github.com/belomaxorka))
+- Some enhancements in default template (Part 2) [\#1322](https://github.com/torrentpier/torrentpier/pull/1322) ([belomaxorka](https://github.com/belomaxorka))
+- Set response code in some cases [\#1319](https://github.com/torrentpier/torrentpier/pull/1319) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed PM quick reply issue [\#1379](https://github.com/torrentpier/torrentpier/pull/1379) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed negative integer seed bonus accrual [\#1377](https://github.com/torrentpier/torrentpier/pull/1377) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed `admin_terms.php` textarea reset in preview mode [\#1371](https://github.com/torrentpier/torrentpier/pull/1371) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken user dl status [\#1351](https://github.com/torrentpier/torrentpier/pull/1351) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed: mb_strlen(): Passing null parameter [\#1374](https://github.com/torrentpier/torrentpier/pull/1374) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed auth(): empty $f_access [\#1329](https://github.com/torrentpier/torrentpier/pull/1329) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed download counter for torrents [\#1346](https://github.com/torrentpier/torrentpier/pull/1346) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed HTTP 500 while cron running in server-side [\#1321](https://github.com/torrentpier/torrentpier/pull/1321) ([belomaxorka](https://github.com/belomaxorka))
+- Some enhancements for topic_tpl [\#1356](https://github.com/torrentpier/torrentpier/pull/1356) ([belomaxorka](https://github.com/belomaxorka))
+- Don't update downloads counter if attachment not exists [\#1345](https://github.com/torrentpier/torrentpier/pull/1345) ([belomaxorka](https://github.com/belomaxorka))
+- Minor improvements [\#1306](https://github.com/torrentpier/torrentpier/pull/1306), [\#1307](https://github.com/torrentpier/torrentpier/pull/1307), [\#1308](https://github.com/torrentpier/torrentpier/pull/1308), [\#1315](https://github.com/torrentpier/torrentpier/pull/1315), [\#1328](https://github.com/torrentpier/torrentpier/pull/1328), [\#1338](https://github.com/torrentpier/torrentpier/pull/1338), [\#1353](https://github.com/torrentpier/torrentpier/pull/1353), [\#1355](https://github.com/torrentpier/torrentpier/pull/1355), [\#1358](https://github.com/torrentpier/torrentpier/pull/1358), [\#1369](https://github.com/torrentpier/torrentpier/pull/1369) ([belomaxorka](https://github.com/belomaxorka))
+- Some bugfixes [\#1326](https://github.com/torrentpier/torrentpier/pull/1326), [\#1378](https://github.com/torrentpier/torrentpier/pull/1378) ([belomaxorka](https://github.com/belomaxorka))
+- Updated deps [\#1304](https://github.com/torrentpier/torrentpier/pull/1304), [\#1305](https://github.com/torrentpier/torrentpier/pull/1305), [\#1305](https://github.com/torrentpier/torrentpier/pull/1305), [\#1367](https://github.com/torrentpier/torrentpier/pull/1367), [\#1366](https://github.com/torrentpier/torrentpier/pull/1366), [\#1365](https://github.com/torrentpier/torrentpier/pull/1365) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#1311](https://github.com/torrentpier/torrentpier/pull/1311), [\#1314](https://github.com/torrentpier/torrentpier/pull/1314), [\#1335](https://github.com/torrentpier/torrentpier/pull/1335), [\#1337](https://github.com/torrentpier/torrentpier/pull/1337), [\#1344](https://github.com/torrentpier/torrentpier/pull/1344), [\#1376](https://github.com/torrentpier/torrentpier/pull/1376) ([Exileum](https://github.com/Exileum))
+
+## [v2.4.0](https://github.com/torrentpier/torrentpier/tree/v2.4.0) (2024-01-01)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.0-rc2...v2.4.0)
+
+**Merged pull requests:**
+
+- Release 2.4.0 ☃️ ([belomaxorka](https://github.com/belomaxorka), [kovalensky](https://github.com/kovalensky))
+- Updated copyright year [\#1201](https://github.com/torrentpier/torrentpier/pull/1201) ([belomaxorka](https://github.com/belomaxorka))
+- Update file_list_v2.php [\#1202](https://github.com/torrentpier/torrentpier/pull/1202), [\#1256](https://github.com/torrentpier/torrentpier/pull/1256) ([kovalensky](https://github.com/kovalensky))
+- Updated TorrentPier footer text (: [\#1204](https://github.com/torrentpier/torrentpier/pull/1204) ([kovalensky](https://github.com/kovalensky))
+- Repository link in page footer instead of forum [\#1205](https://github.com/torrentpier/torrentpier/pull/1205) ([kovalensky](https://github.com/kovalensky))
+- Some enhancements for dl.php [\#1209](https://github.com/torrentpier/torrentpier/pull/1209) ([belomaxorka](https://github.com/belomaxorka))
+- Cleanup for attach_mod [\#1210](https://github.com/torrentpier/torrentpier/pull/1210) ([belomaxorka](https://github.com/belomaxorka))
+- Removed useless condition in viewtopic_attach.tpl [\#1208](https://github.com/torrentpier/torrentpier/pull/1208) ([belomaxorka](https://github.com/belomaxorka))
+- Minor improvements for announcer [\#1207](https://github.com/torrentpier/torrentpier/pull/1207) ([belomaxorka](https://github.com/belomaxorka))
+- tracker.php parameter sanitizing [\#1212](https://github.com/torrentpier/torrentpier/pull/1212) ([kovalensky](https://github.com/kovalensky))
+- search.php parameter sanitizing [\#1213](https://github.com/torrentpier/torrentpier/pull/1213) ([kovalensky](https://github.com/kovalensky), [belomaxorka](https://github.com/belomaxorka))
+- Limit execution time for forum file-listing [\#1211](https://github.com/torrentpier/torrentpier/pull/1211) ([kovalensky](https://github.com/kovalensky), [belomaxorka](https://github.com/belomaxorka))
+- Some reported bugfixes [\#1214](https://github.com/torrentpier/torrentpier/pull/1214), [\#1275](https://github.com/torrentpier/torrentpier/pull/1275) ([belomaxorka](https://github.com/belomaxorka))
+- Minor improvements [\#1206](https://github.com/torrentpier/torrentpier/pull/1206), [\#1215](https://github.com/torrentpier/torrentpier/pull/1215), [\#1217](https://github.com/torrentpier/torrentpier/pull/1217), [\#1219](https://github.com/torrentpier/torrentpier/pull/1219), [\#1220](https://github.com/torrentpier/torrentpier/pull/1220), [\#1224](https://github.com/torrentpier/torrentpier/pull/1224), [\#1228](https://github.com/torrentpier/torrentpier/pull/1228), [\#1229](https://github.com/torrentpier/torrentpier/pull/1229), [\#1230](https://github.com/torrentpier/torrentpier/pull/1230), [\#1234](https://github.com/torrentpier/torrentpier/pull/1234), [\#1236](https://github.com/torrentpier/torrentpier/pull/1236), [\#1243](https://github.com/torrentpier/torrentpier/pull/1243), [\#1248](https://github.com/torrentpier/torrentpier/pull/1248), [\#1253](https://github.com/torrentpier/torrentpier/pull/1253), [\#1254](https://github.com/torrentpier/torrentpier/pull/1254), [\#1259](https://github.com/torrentpier/torrentpier/pull/1259), [\#1263](https://github.com/torrentpier/torrentpier/pull/1263), [\#1265](https://github.com/torrentpier/torrentpier/pull/1265), [\#1266](https://github.com/torrentpier/torrentpier/pull/1266), [\#1271](https://github.com/torrentpier/torrentpier/pull/1271), [\#1273](https://github.com/torrentpier/torrentpier/pull/1273), [\#1279](https://github.com/torrentpier/torrentpier/pull/1279), [\#1281](https://github.com/torrentpier/torrentpier/pull/1281), [\#1285](https://github.com/torrentpier/torrentpier/pull/1285), [\#1286](https://github.com/torrentpier/torrentpier/pull/1286), [\#1289](https://github.com/torrentpier/torrentpier/pull/1289), [\#1294](https://github.com/torrentpier/torrentpier/pull/1294), [\#1298](https://github.com/torrentpier/torrentpier/pull/1298), [\#1301](https://github.com/torrentpier/torrentpier/pull/1301), [\#1302](https://github.com/torrentpier/torrentpier/pull/1302) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed extensions issue [\#1218](https://github.com/torrentpier/torrentpier/pull/1218) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken sorting in group.php [\#1221](https://github.com/torrentpier/torrentpier/pull/1221) ([belomaxorka](https://github.com/belomaxorka))
+- Code re-formatting [\#1225](https://github.com/torrentpier/torrentpier/pull/1225) ([kovalensky](https://github.com/kovalensky))
+- Introduce limit setting for max number of files to be processed in separate index file-listing [\#1223](https://github.com/torrentpier/torrentpier/pull/1223) ([kovalensky](https://github.com/kovalensky))
+- Fixed set auth cookie issue [\#1227](https://github.com/torrentpier/torrentpier/pull/1227) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken captcha check on login.php [\#1233](https://github.com/torrentpier/torrentpier/pull/1233) ([belomaxorka](https://github.com/belomaxorka))
+- Hide vote button in poll if user already voted [\#1235](https://github.com/torrentpier/torrentpier/pull/1235) ([belomaxorka](https://github.com/belomaxorka))
+- Exception handling for Bencode errors [\#1237](https://github.com/torrentpier/torrentpier/pull/1237), [\#1239](https://github.com/torrentpier/torrentpier/pull/1239) ([kovalensky](https://github.com/kovalensky))
+- Handle & show upload_max_filesize occurrences [\#1241](https://github.com/torrentpier/torrentpier/pull/1241) ([kovalensky](https://github.com/kovalensky))
+- Little improvements [\#1244](https://github.com/torrentpier/torrentpier/pull/1244), [\#1272](https://github.com/torrentpier/torrentpier/pull/1272) ([kovalensky](https://github.com/kovalensky))
+- Improved handling errors while uploading [\#1246](https://github.com/torrentpier/torrentpier/pull/1246)
+- Use hardcoded dictionary names for better counting result in file listing [\#1247](https://github.com/torrentpier/torrentpier/pull/1247) ([kovalensky](https://github.com/kovalensky))
+- Refactored thumbnail creation 🌄 [\#1249](https://github.com/torrentpier/torrentpier/pull/1249) ([belomaxorka](https://github.com/belomaxorka))
+- Some cleanup for attach mod [\#1250](https://github.com/torrentpier/torrentpier/pull/1250), [\#1255](https://github.com/torrentpier/torrentpier/pull/1255) ([belomaxorka](https://github.com/belomaxorka))
+- Use "Views" string for thumbnails [\#1257](https://github.com/torrentpier/torrentpier/pull/1257) ([kovalensky](https://github.com/kovalensky))
+- Show user's ban status [\#1258](https://github.com/torrentpier/torrentpier/pull/1258) ([kovalensky](https://github.com/kovalensky))
+- Changed default upload path [\#1261](https://github.com/torrentpier/torrentpier/pull/1261) ([belomaxorka](https://github.com/belomaxorka))
+- Some improvements for Ban functionality [\#1262](https://github.com/torrentpier/torrentpier/pull/1262) ([belomaxorka](https://github.com/belomaxorka))
+- Striked username if user banned [\#1267](https://github.com/torrentpier/torrentpier/pull/1267) ([belomaxorka](https://github.com/belomaxorka))
+- Move filelist feature to another file [\#1268](https://github.com/torrentpier/torrentpier/pull/1268) ([kovalensky](https://github.com/kovalensky))
+- Make caching for ban list [\#1269](https://github.com/torrentpier/torrentpier/pull/1269) ([belomaxorka](https://github.com/belomaxorka))
+- Some display correction [\#1288](https://github.com/torrentpier/torrentpier/pull/1288) ([kovalensky](https://github.com/kovalensky))
+- Some enhancements [\#1278](https://github.com/torrentpier/torrentpier/pull/1278) ([belomaxorka](https://github.com/belomaxorka))
+- Replaced some file_exists() to is_file() [\#1276](https://github.com/torrentpier/torrentpier/pull/1276) ([belomaxorka](https://github.com/belomaxorka))
+- Translations [\#1274](https://github.com/torrentpier/torrentpier/pull/1274) ([kovalensky](https://github.com/kovalensky))
+- Announcer integer limits & Country flags display [\#1277](https://github.com/torrentpier/torrentpier/pull/1277) ([kovalensky](https://github.com/kovalensky))
+- Some .png file optimizations [\#1283](https://github.com/torrentpier/torrentpier/pull/1283) ([kovalensky](https://github.com/kovalensky))
+- Few cosmetic improvements [\#1284](https://github.com/torrentpier/torrentpier/pull/1284) ([belomaxorka](https://github.com/belomaxorka))
+- Some CSS additions [\#1280](https://github.com/torrentpier/torrentpier/pull/1280) ([kovalensky](https://github.com/kovalensky))
+- Block uploading more than one torrent file [\#1293](https://github.com/torrentpier/torrentpier/pull/1293) ([belomaxorka](https://github.com/belomaxorka))
+- Added missing lang variable [\#1295](https://github.com/torrentpier/torrentpier/pull/1295) ([belomaxorka](https://github.com/belomaxorka))
+- Moved file_list_v2.php back to includes [\#1303](https://github.com/torrentpier/torrentpier/pull/1303) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#1203](https://github.com/torrentpier/torrentpier/pull/1203), [\#1222](https://github.com/torrentpier/torrentpier/pull/1222), [\#1251](https://github.com/torrentpier/torrentpier/pull/1251), [\#1260](https://github.com/torrentpier/torrentpier/pull/1260), [\#1264](https://github.com/torrentpier/torrentpier/pull/1264), [\#1282](https://github.com/torrentpier/torrentpier/pull/1282), [\#1287](https://github.com/torrentpier/torrentpier/pull/1287), [\#1296](https://github.com/torrentpier/torrentpier/pull/1296), [\#1297](https://github.com/torrentpier/torrentpier/pull/1297), [\#1299](https://github.com/torrentpier/torrentpier/pull/1299), [\#1300](https://github.com/torrentpier/torrentpier/pull/1300) ([Exileum](https://github.com/Exileum))
+
+## [v2.4.0-rc2](https://github.com/torrentpier/torrentpier/tree/v2.4.0-rc2) (2023-12-12)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.0-rc1...v2.4.0-rc2)
+
+**Merged pull requests:**
+
+- Fixed void function result used [\#1170](https://github.com/torrentpier/torrentpier/pull/1170) ([belomaxorka](https://github.com/belomaxorka))
+- Improved cookie management 🍪 [\#1171](https://github.com/torrentpier/torrentpier/pull/1171) ([belomaxorka](https://github.com/belomaxorka))
+- Replaced strpos() with simplified realization [\#1172](https://github.com/torrentpier/torrentpier/pull/1172) ([belomaxorka](https://github.com/belomaxorka))
+- Replaced some 'switch' with the 'match' expression [\#1173](https://github.com/torrentpier/torrentpier/pull/1173) ([belomaxorka](https://github.com/belomaxorka))
+- Feature to ban specific torrent clients [\#1175](https://github.com/torrentpier/torrentpier/pull/1175) ([kovalensky](https://github.com/kovalensky))
+- Code re-formatting [\#1176](https://github.com/torrentpier/torrentpier/pull/1176) ([kovalensky](https://github.com/kovalensky))
+- Removed useless width for BBCode buttons [\#1180](https://github.com/torrentpier/torrentpier/pull/1180) ([belomaxorka](https://github.com/belomaxorka))
+- Refactored memberlist.php 🎓 [\#1181](https://github.com/torrentpier/torrentpier/pull/1181) ([belomaxorka](https://github.com/belomaxorka))
+- Peer ID was erased if it contained non-latin characters [\#1185](https://github.com/torrentpier/torrentpier/pull/1185) ([kovalensky](https://github.com/kovalensky))
+- Removed verify_id() function [\#1187](https://github.com/torrentpier/torrentpier/pull/1187) ([belomaxorka](https://github.com/belomaxorka))
+- Removed sys_getloadavg() [\#1188](https://github.com/torrentpier/torrentpier/pull/1188) ([belomaxorka](https://github.com/belomaxorka))
+- RC2 timeline [\#1186](https://github.com/torrentpier/torrentpier/pull/1186) ([kovalensky](https://github.com/kovalensky))
+- Get SERVER_NAME variable for cron tasks [\#1190](https://github.com/torrentpier/torrentpier/pull/1190) ([kovalensky](https://github.com/kovalensky))
+- Remove unnecessary file hashes for in-forum file-listing [\#1192](https://github.com/torrentpier/torrentpier/pull/1192) ([kovalensky](https://github.com/kovalensky))
+- Use one GET variable for filelisting [\#1193](https://github.com/torrentpier/torrentpier/pull/1193) ([kovalensky](https://github.com/kovalensky))
+- Refactored poll.php [\#1194](https://github.com/torrentpier/torrentpier/pull/1194) ([belomaxorka](https://github.com/belomaxorka))
+- Removed useless global $lang; from info.php [\#1195](https://github.com/torrentpier/torrentpier/pull/1195) ([belomaxorka](https://github.com/belomaxorka))
+- Update file_list_v2.php [\#1196](https://github.com/torrentpier/torrentpier/pull/1196), [\#1197](https://github.com/torrentpier/torrentpier/pull/1197), [\#1199](https://github.com/torrentpier/torrentpier/pull/1199) ([kovalensky](https://github.com/kovalensky))
+- Small code re-format for scrape.php [\#1198](https://github.com/torrentpier/torrentpier/pull/1198) ([kovalensky](https://github.com/kovalensky))
+- Some reported bugfixes [\#1200](https://github.com/torrentpier/torrentpier/pull/1200) ([belomaxorka](https://github.com/belomaxorka))
+- Updated deps [\#1177](https://github.com/torrentpier/torrentpier/pull/1177), [\#1178](https://github.com/torrentpier/torrentpier/pull/1178),[\#1183](https://github.com/torrentpier/torrentpier/pull/1183), [\#1184](https://github.com/torrentpier/torrentpier/pull/1184) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#1179](https://github.com/torrentpier/torrentpier/pull/1179), [\#1182](https://github.com/torrentpier/torrentpier/pull/1182), [\#1191](https://github.com/torrentpier/torrentpier/pull/1191) ([Exileum](https://github.com/Exileum))
+
+## [v2.4.0-rc1](https://github.com/torrentpier/torrentpier/tree/v2.4.0-rc1) (2023-11-25)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.0-beta4...v2.4.0-rc1)
+
+**Merged pull requests:**
+
+- Revert "Fix sql group (#128)" [1753db1](https://github.com/torrentpier/torrentpier/commit/1753db1fcef7d50eb8f8ba4b1f5a4ad7585ffaa4) ([belomaxorka](https://github.com/belomaxorka))
+- Simplified gender function [\#1167](https://github.com/torrentpier/torrentpier/pull/1167) ([belomaxorka](https://github.com/belomaxorka))
+- Revert "Fixed input types in some cases (#697)" [20ce8ca](https://github.com/torrentpier/torrentpier/commit/20ce8cae9cf6447f5100ab2d8f4a5299254f5412) ([belomaxorka](https://github.com/belomaxorka))
+- Revert "Fixed input types in some cases (#693)" [74aa6ff](https://github.com/torrentpier/torrentpier/commit/74aa6ff29991186ffc6484980972d5f74e4d0393) ([belomaxorka](https://github.com/belomaxorka))
+- Support simultaneous id & username inputs for browsing profiles [\#1166](https://github.com/torrentpier/torrentpier/pull/1166) ([kovalensky](https://github.com/kovalensky))
+- Tighten registration requirements for torrent files [\#1165](https://github.com/torrentpier/torrentpier/pull/1165) ([kovalensky](https://github.com/kovalensky))
+- File listing — use browser cache [\#1164](https://github.com/torrentpier/torrentpier/pull/1164) ([kovalensky](https://github.com/kovalensky))
+- Legacy code comment translations [\#1163](https://github.com/torrentpier/torrentpier/pull/1163) ([kovalensky](https://github.com/kovalensky))
+- Invites config re-formatting [\#1162](https://github.com/torrentpier/torrentpier/pull/1162) ([belomaxorka](https://github.com/belomaxorka))
+- Use external cookie library to prevent incorrect cookie setting [\#1160](https://github.com/torrentpier/torrentpier/pull/1160), [\#1161](https://github.com/torrentpier/torrentpier/pull/1161) ([belomaxorka](https://github.com/belomaxorka))
+- Some improvements in default template [\#1159](https://github.com/torrentpier/torrentpier/pull/1159) ([belomaxorka](https://github.com/belomaxorka))
+- Use sent port instead of source [\#1158](https://github.com/torrentpier/torrentpier/pull/1158) ([kovalensky](https://github.com/kovalensky))
+- Remove unnecessary meta tags from file listing [\#1157](https://github.com/torrentpier/torrentpier/pull/1157) ([kovalensky](https://github.com/kovalensky))
+- Use different file listing url parameters for effective indexing by search engines [\#1156](https://github.com/torrentpier/torrentpier/pull/1156) ([kovalensky](https://github.com/kovalensky))
+- Check topic_id existence while searching in tracker mode [\#1155](https://github.com/torrentpier/torrentpier/pull/1155) ([kovalensky](https://github.com/kovalensky))
+- Some improvement [\#1151](https://github.com/torrentpier/torrentpier/pull/1151) ([kovalensky](https://github.com/kovalensky))
+- Disable invites by default [\#1150](https://github.com/torrentpier/torrentpier/pull/1150) ([kovalensky](https://github.com/kovalensky))
+- Event based invite system [\#1149](https://github.com/torrentpier/torrentpier/pull/1149) ([kovalensky](https://github.com/kovalensky))
+- Some code quality improvements [\#1148](https://github.com/torrentpier/torrentpier/pull/1148) ([belomaxorka](https://github.com/belomaxorka))
+- Vote button code improvements [\#1140](https://github.com/torrentpier/torrentpier/pull/1140), [\#1142](https://github.com/torrentpier/torrentpier/pull/1142), [\#1143](https://github.com/torrentpier/torrentpier/pull/1143), [\#1146](https://github.com/torrentpier/torrentpier/pull/1146) ([belomaxorka](https://github.com/belomaxorka))
+- Vote button and v2 file list topic url display [\#1138](https://github.com/torrentpier/torrentpier/pull/1138) ([kovalensky](https://github.com/kovalensky))
+- Removed topic watch useless code [\#1137](https://github.com/torrentpier/torrentpier/pull/1137) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed topic_watch array key name [\#1136](https://github.com/torrentpier/torrentpier/pull/1136) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed announce-list indexes ordering [\#1135](https://github.com/torrentpier/torrentpier/pull/1135) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed $bb_cfg['file_id_ext'] ordering [\#1134](https://github.com/torrentpier/torrentpier/pull/1134) ([belomaxorka](https://github.com/belomaxorka))
+- Normalizing announce-list [\#1133](https://github.com/torrentpier/torrentpier/pull/1133) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed announcer-list issue [\#1129](https://github.com/torrentpier/torrentpier/pull/1129), [\#1130](https://github.com/torrentpier/torrentpier/pull/1130), [\#1131](https://github.com/torrentpier/torrentpier/pull/1131), [\#1132](https://github.com/torrentpier/torrentpier/pull/1132) ([belomaxorka](https://github.com/belomaxorka))
+- Removed client column from bb_bt_tracker table [\#1128](https://github.com/torrentpier/torrentpier/pull/1128) ([belomaxorka](https://github.com/belomaxorka))
+- Removed one-time used variables [\#1120](https://github.com/torrentpier/torrentpier/pull/1120) ([belomaxorka](https://github.com/belomaxorka))
+- Don't create empty announce-list dict, if ann_urls are empty [\#1119](https://github.com/torrentpier/torrentpier/pull/1119) ([kovalensky](https://github.com/kovalensky))
+- Improve code for retracker addition [\#1118](https://github.com/torrentpier/torrentpier/pull/1118) ([kovalensky](https://github.com/kovalensky))
+- Don't use main announce url inside announce-list [\#1117](https://github.com/torrentpier/torrentpier/pull/1117) ([kovalensky](https://github.com/kovalensky))
+- Don't check for announce-list while adding new urls [\#1116](https://github.com/torrentpier/torrentpier/pull/1116) ([kovalensky](https://github.com/kovalensky))
+- Cleanup: Removed useless global variable [\#1115](https://github.com/torrentpier/torrentpier/pull/1115) ([belomaxorka](https://github.com/belomaxorka))
+- Unset debug cookies if SQL_DEBUG disabled [\#1114](https://github.com/torrentpier/torrentpier/pull/1114) ([belomaxorka](https://github.com/belomaxorka))
+- Announcer's code re-formatting [\#1112](https://github.com/torrentpier/torrentpier/pull/1112) ([kovalensky](https://github.com/kovalensky))
+- Used new-style [] array constructions in some cases [\#1111](https://github.com/torrentpier/torrentpier/pull/1111) ([belomaxorka](https://github.com/belomaxorka))
+- Use http_response_code() functions instead of old header() functions [\#1110](https://github.com/torrentpier/torrentpier/pull/1110) ([belomaxorka](https://github.com/belomaxorka))
+- Fix bypassing cache if IP changed while using cache [\#1109](https://github.com/torrentpier/torrentpier/pull/1109) ([kovalensky](https://github.com/kovalensky))
+- Use one variable to determine update status for hybrids [\#1108](https://github.com/torrentpier/torrentpier/pull/1108) ([kovalensky](https://github.com/kovalensky))
+- Don't re-announce even if peer cache is present [\#1107](https://github.com/torrentpier/torrentpier/pull/1107) ([kovalensky](https://github.com/kovalensky))
+- Used br2nl() in ajax alert messages [\#1106](https://github.com/torrentpier/torrentpier/pull/1106) ([belomaxorka](https://github.com/belomaxorka))
+- Replaced some html_entity_decode to engine's built-in function [\#1105](https://github.com/torrentpier/torrentpier/pull/1105) ([belomaxorka](https://github.com/belomaxorka))
+- Fix typo [\#1104](https://github.com/torrentpier/torrentpier/pull/1104), [\#1124](https://github.com/torrentpier/torrentpier/pull/1124), [\#1153](https://github.com/torrentpier/torrentpier/pull/1153), [\#1168](https://github.com/torrentpier/torrentpier/pull/1168) ([kovalensky](https://github.com/kovalensky))
+- Change default engine language to en [\#1103](https://github.com/torrentpier/torrentpier/pull/1103) ([kovalensky](https://github.com/kovalensky))
+- Record changed port while re-announcing [\#1102](https://github.com/torrentpier/torrentpier/pull/1102) ([kovalensky](https://github.com/kovalensky))
+- Translations for config.php, raised scrape interval [\#1100](https://github.com/torrentpier/torrentpier/pull/1100) ([kovalensky](https://github.com/kovalensky))
+- Don't re-announce for hybrids if the event is "stopped" [\#1099](https://github.com/torrentpier/torrentpier/pull/1099) ([kovalensky](https://github.com/kovalensky))
+- Security measures [\#1098](https://github.com/torrentpier/torrentpier/pull/1098), [\#1113](https://github.com/torrentpier/torrentpier/pull/1113) ([kovalensky](https://github.com/kovalensky), [belomaxorka](https://github.com/belomaxorka))
+- Minor improvements [\#1121](https://github.com/torrentpier/torrentpier/pull/1121), [\#1122](https://github.com/torrentpier/torrentpier/pull/1122), [\#1123](https://github.com/torrentpier/torrentpier/pull/1123), [\#1125](https://github.com/torrentpier/torrentpier/pull/1125), [\#1141](https://github.com/torrentpier/torrentpier/pull/1141) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#1097](https://github.com/torrentpier/torrentpier/pull/1097), [\#1101](https://github.com/torrentpier/torrentpier/pull/1101), [\#1144](https://github.com/torrentpier/torrentpier/pull/1144), [\#1154](https://github.com/torrentpier/torrentpier/pull/1154) ([Exileum](https://github.com/Exileum))
+
+## [v2.4.0-beta4](https://github.com/torrentpier/torrentpier/tree/v2.4.0-beta4) (2023-11-14)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.0-beta3...v2.4.0-beta4)
+
+**Merged pull requests:**
+
+- Use TORRENT_EXT constants for definition torrent extension [\#1096](https://github.com/torrentpier/torrentpier/pull/1096) ([belomaxorka](https://github.com/belomaxorka))
+- Remove html entities for file names [\#1094](https://github.com/torrentpier/torrentpier/pull/1094) ([kovalensky](https://github.com/kovalensky))
+- Fix for html entities being displayed in magnet links [\#1092](https://github.com/torrentpier/torrentpier/pull/1092) ([kovalensky](https://github.com/kovalensky))
+- Calling make_jumpbox() where it needed [\#1091](https://github.com/torrentpier/torrentpier/pull/1091) ([belomaxorka](https://github.com/belomaxorka))
+- Include full url for client icon displaying [\#1088](https://github.com/torrentpier/torrentpier/pull/1088) ([kovalensky](https://github.com/kovalensky))
+- Fix not working code [\#1087](https://github.com/torrentpier/torrentpier/pull/1087) ([kovalensky](https://github.com/kovalensky))
+- Fixed data types for seeder_last_seen [\#1086](https://github.com/torrentpier/torrentpier/pull/1086) ([belomaxorka](https://github.com/belomaxorka))
+- Fix broken PM (Private messages) [\#1085](https://github.com/torrentpier/torrentpier/pull/1085) ([kovalensky](https://github.com/kovalensky))
+- Fixed a bug causing inability to view file contents for some torrents [\#1084](https://github.com/torrentpier/torrentpier/pull/1084) ([kovalensky](https://github.com/kovalensky))
+- Show file count while listing [\#1082](https://github.com/torrentpier/torrentpier/pull/1082) ([kovalensky](https://github.com/kovalensky))
+- Simplified jumpbox 📜 [\#815](https://github.com/torrentpier/torrentpier/pull/815) ([belomaxorka](https://github.com/belomaxorka))
+- Removed sorting for torrent clients in table [\#1080](https://github.com/torrentpier/torrentpier/pull/1080) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken table in tracker [\#1079](https://github.com/torrentpier/torrentpier/pull/1079) ([belomaxorka](https://github.com/belomaxorka))
+- CSS improvement for file listing [\#1077](https://github.com/torrentpier/torrentpier/pull/1077), [\#1081](https://github.com/torrentpier/torrentpier/pull/1081), [\#1083](https://github.com/torrentpier/torrentpier/pull/1083) ([kovalensky](https://github.com/kovalensky))
+- Minor improvements [\#1078](https://github.com/torrentpier/torrentpier/pull/1078), [\#1095](https://github.com/torrentpier/torrentpier/pull/1095) ([belomaxorka](https://github.com/belomaxorka))
+- Updated deps [\#1089](https://github.com/torrentpier/torrentpier/pull/1089), [\#1090](https://github.com/torrentpier/torrentpier/pull/1090) ([belomaxorka](https://github.com/belomaxorka))
+
+## [v2.4.0-beta3](https://github.com/torrentpier/torrentpier/tree/v2.4.0-beta3) (2023-11-11)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.0-beta2...v2.4.0-beta3)
+
+**Merged pull requests:**
+
+- Use built-in delta_time for age display [\#1075](https://github.com/torrentpier/torrentpier/pull/1075) ([kovalensky](https://github.com/kovalensky))
+- List with numbers in tracker stats [\#1074](https://github.com/torrentpier/torrentpier/pull/1074) ([kovalensky](https://github.com/kovalensky))
+- Sort clients from higher to lower in tracker stats [\#1073](https://github.com/torrentpier/torrentpier/pull/1073) ([kovalensky](https://github.com/kovalensky))
+- Use more reliable original file names for attachments [\#1070](https://github.com/torrentpier/torrentpier/pull/1070) ([kovalensky](https://github.com/kovalensky))
+- Tracker client stats cache, more robust file list functions, permissions for file list access [\#1069](https://github.com/torrentpier/torrentpier/pull/1069) ([kovalensky](https://github.com/kovalensky))
+- Some code improvements for file listing [\#1068](https://github.com/torrentpier/torrentpier/pull/1068) ([kovalensky](https://github.com/kovalensky))
+- Update styles for file list [\#1067](https://github.com/torrentpier/torrentpier/pull/1067) ([kovalensky](https://github.com/kovalensky))
+- Show client information for file list [\#1066](https://github.com/torrentpier/torrentpier/pull/1066) ([kovalensky](https://github.com/kovalensky))
+- File list tables for v2 compatible torrents [\#1064](https://github.com/torrentpier/torrentpier/pull/1064) ([kovalensky](https://github.com/kovalensky))
+- Show options for version debugging of user clients [\#1061](https://github.com/torrentpier/torrentpier/pull/1061) ([kovalensky](https://github.com/kovalensky))
+- Fixed broken avatar ajax action for users [\#1060](https://github.com/torrentpier/torrentpier/pull/1060) ([belomaxorka](https://github.com/belomaxorka))
+- Show icons for clients while in the tracker statistics [\#1057](https://github.com/torrentpier/torrentpier/pull/1057) ([kovalensky](https://github.com/kovalensky))
+- Show user clients percentage in tracker statistics [\#1057](https://github.com/torrentpier/torrentpier/pull/1057) ([kovalensky](https://github.com/kovalensky))
+- Fixed undefined tpl variable SHOW_GROUP_MEMBERSHIP [\#1055](https://github.com/torrentpier/torrentpier/pull/1055) ([belomaxorka](https://github.com/belomaxorka))
+- Show guests for last seeders [\#1053](https://github.com/torrentpier/torrentpier/pull/1053) ([kovalensky](https://github.com/kovalensky))
+- Last seeder display improvements [\#1052](https://github.com/torrentpier/torrentpier/pull/1052) ([kovalensky](https://github.com/kovalensky))
+- Show the last seeder's username in topics [\#1051](https://github.com/torrentpier/torrentpier/pull/1051) ([kovalensky](https://github.com/kovalensky))
+- Minor improvements for template [\#1050](https://github.com/torrentpier/torrentpier/pull/1050) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed: Moderators can't see self IP addresses [\#1049](https://github.com/torrentpier/torrentpier/pull/1049) ([belomaxorka](https://github.com/belomaxorka))
+- View user's profile also by it's username [\#1048](https://github.com/torrentpier/torrentpier/pull/1048) ([kovalensky](https://github.com/kovalensky))
+- Scrape.php code reformatting [\#1047](https://github.com/torrentpier/torrentpier/pull/1047) ([kovalensky](https://github.com/kovalensky))
+- Scraping improvements [\#1046](https://github.com/torrentpier/torrentpier/pull/1046) ([kovalensky](https://github.com/kovalensky))
+- Small tracker improvements [\#1043](https://github.com/torrentpier/torrentpier/pull/1043) ([kovalensky](https://github.com/kovalensky))
+- Small improvements to scraping [\#1042](https://github.com/torrentpier/torrentpier/pull/1042) ([kovalensky](https://github.com/kovalensky))
+- Added v2 hash search to the scraping [\#1040](https://github.com/torrentpier/torrentpier/pull/1040) ([kovalensky](https://github.com/kovalensky))
+- Update magnet icon [\#1038](https://github.com/torrentpier/torrentpier/pull/1038) ([kovalensky](https://github.com/kovalensky))
+- Magnet link tweaks [\#1035](https://github.com/torrentpier/torrentpier/pull/1035) ([kovalensky](https://github.com/kovalensky))
+- Use built-in binary hash feature [\#1032](https://github.com/torrentpier/torrentpier/pull/1032) ([kovalensky](https://github.com/kovalensky))
+- Some v2 hashes were not found in the announcer [\#1031](https://github.com/torrentpier/torrentpier/pull/1031) ([kovalensky](https://github.com/kovalensky))
+- Fix issues related to file list display and torrent registration [\#1028](https://github.com/torrentpier/torrentpier/pull/1028) ([kovalensky](https://github.com/kovalensky))
+- NAT users' real port [\#1027](https://github.com/torrentpier/torrentpier/pull/1027) ([kovalensky](https://github.com/kovalensky))
+- Removed time zone auto detection [\#1025](https://github.com/torrentpier/torrentpier/pull/1025) ([belomaxorka](https://github.com/belomaxorka))
+- Added ability to debug ajax_die() calls [\#1023](https://github.com/torrentpier/torrentpier/pull/1023) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed incorrect displaying post actions buttons [\#1021](https://github.com/torrentpier/torrentpier/pull/1021) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed undefined offset of $action_params [\#1020](https://github.com/torrentpier/torrentpier/pull/1020) ([belomaxorka](https://github.com/belomaxorka))
+- Transfer from array to ArrayObject data type [\#1019](https://github.com/torrentpier/torrentpier/pull/1019) ([kovalensky](https://github.com/kovalensky))
+- Multiple Scrape [\#1018](https://github.com/torrentpier/torrentpier/pull/1018) ([kovalensky](https://github.com/kovalensky))
+- Announce IPv4 && IPv6 of peers! [\#1017](https://github.com/torrentpier/torrentpier/pull/1017) ([kovalensky](https://github.com/kovalensky))
+- Bind peer_hash to auth_key to avoid double announces via IPv4 and IPv6 at the same time [\#1016](https://github.com/torrentpier/torrentpier/pull/1016) ([kovalensky](https://github.com/kovalensky))
+- Increase auth_key char length [\#1014](https://github.com/torrentpier/torrentpier/pull/1014) ([kovalensky](https://github.com/kovalensky))
+- More performance optimized/random string generation, removed passkey length limit from the announcer [\#1013](https://github.com/torrentpier/torrentpier/pull/1013) ([kovalensky](https://github.com/kovalensky))
+- More performance optimized/random string generation, removed limit from for announce key in the announcer [\#1012](https://github.com/torrentpier/torrentpier/pull/1012) ([kovalensky](https://github.com/kovalensky))
+- Fixed broken ordering in memberlist.php [\#1010](https://github.com/torrentpier/torrentpier/pull/1010) ([belomaxorka](https://github.com/belomaxorka))
+- Some fixes in admin_attach_cp.php [\#1009](https://github.com/torrentpier/torrentpier/pull/1009) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed undefined $lang['PREVIOUS'] [\#1008](https://github.com/torrentpier/torrentpier/pull/1008) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken letter marking in memberlist.php [\#1007](https://github.com/torrentpier/torrentpier/pull/1007) ([belomaxorka](https://github.com/belomaxorka))
+- Moved htmlCHR() in common.php [\#1006](https://github.com/torrentpier/torrentpier/pull/1006) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed error while trying to delete posts by bot [\#1004](https://github.com/torrentpier/torrentpier/pull/1004) ([belomaxorka](https://github.com/belomaxorka))
+- Escape HTML characters for peer_id once to avoid load [\#1002](https://github.com/torrentpier/torrentpier/pull/1002) ([kovalensky](https://github.com/kovalensky))
+- 😅💙 1000th PR Merged! 💙😅 [\#1001](https://github.com/torrentpier/torrentpier/pull/1001) ([belomaxorka](https://github.com/belomaxorka))
+- Added the ability to add additional announce URLs into torrent files [\#999](https://github.com/torrentpier/torrentpier/pull/999) ([belomaxorka](https://github.com/belomaxorka))
+- Expression can be replaced by '??' version [\#998](https://github.com/torrentpier/torrentpier/pull/998) ([belomaxorka](https://github.com/belomaxorka))
+- Added check $bb_cfg['magnet_links_enabled'] in create_magnet() [\#996](https://github.com/torrentpier/torrentpier/pull/996) ([belomaxorka](https://github.com/belomaxorka))
+- Added $lang['BT_UNREGISTERED_ALREADY'] lang key [\#994](https://github.com/torrentpier/torrentpier/pull/994) ([belomaxorka](https://github.com/belomaxorka))
+- Removed useless "Subject:" from email templates [\#993](https://github.com/torrentpier/torrentpier/pull/993) ([belomaxorka](https://github.com/belomaxorka))
+- SQL: Increase speed_up & speed_down type limits [\#992](https://github.com/torrentpier/torrentpier/pull/992) ([belomaxorka](https://github.com/belomaxorka))
+- Use strip_tags() for message in prompt_for_confirm() [\#991](https://github.com/torrentpier/torrentpier/pull/991) ([belomaxorka](https://github.com/belomaxorka))
+- Use strip_tags() for error message in ajax_die() [\#990](https://github.com/torrentpier/torrentpier/pull/990) ([belomaxorka](https://github.com/belomaxorka))
+- Use lang variable $lang['BT_REG_FAIL'] instead of text [\#989](https://github.com/torrentpier/torrentpier/pull/989) ([belomaxorka](https://github.com/belomaxorka))
+- Use announce messages even after using redundant cache for output [\#987](https://github.com/torrentpier/torrentpier/pull/987) ([kovalensky](https://github.com/kovalensky))
+- Fix currently not working peer icons [\#986](https://github.com/torrentpier/torrentpier/pull/986) ([kovalensky](https://github.com/kovalensky))
+- Variable collision fix [\#984](https://github.com/torrentpier/torrentpier/pull/984), [\#985](https://github.com/torrentpier/torrentpier/pull/985) ([kovalensky](https://github.com/kovalensky))
+- Fixed percentage calculation for SQL debug [\#980](https://github.com/torrentpier/torrentpier/pull/980) ([belomaxorka](https://github.com/belomaxorka))
+- Refactoring: Use isset() with multiple parameters [\#978](https://github.com/torrentpier/torrentpier/pull/978) ([belomaxorka](https://github.com/belomaxorka))
+- Check $tpl_vars['QUESTION'] in print_confirmation() [\#977](https://github.com/torrentpier/torrentpier/pull/977) ([belomaxorka](https://github.com/belomaxorka))
+- Peer client display support [\#968](https://github.com/torrentpier/torrentpier/pull/968) ([kovalensky](https://github.com/kovalensky))
+- Fixed undefined array key group_description [\#969](https://github.com/torrentpier/torrentpier/pull/969) ([belomaxorka](https://github.com/belomaxorka))
+- Added my name to the list of authors [\#963](https://github.com/torrentpier/torrentpier/pull/963) ([kovalensky](https://github.com/kovalensky))
+- Better way to prioritize peers [\#962](https://github.com/torrentpier/torrentpier/pull/962) ([kovalensky](https://github.com/kovalensky))
+- Prioritize returning leecher list for seeder announces [\#961](https://github.com/torrentpier/torrentpier/pull/961) ([kovalensky](https://github.com/kovalensky))
+- Generate .torrent file names based on topic titles [\#958](https://github.com/torrentpier/torrentpier/pull/958) ([kovalensky](https://github.com/kovalensky))
+- long2ip_extended() missing function [\#948](https://github.com/torrentpier/torrentpier/pull/948) ([kovalensky](https://github.com/kovalensky))
+- Use humn_size() for AVATAR_EXPLAIN [\#943](https://github.com/torrentpier/torrentpier/pull/943) ([belomaxorka](https://github.com/belomaxorka))
+- Added missing template var in group.php [\#939](https://github.com/torrentpier/torrentpier/pull/939) ([belomaxorka](https://github.com/belomaxorka))
+- BEP-7 & BEP-24 & IPv6 functions [\#934](https://github.com/torrentpier/torrentpier/pull/934) ([kovalensky](https://github.com/kovalensky))
+- Prevent infinity user adding into group [\#937](https://github.com/torrentpier/torrentpier/pull/937) ([belomaxorka](https://github.com/belomaxorka))
+- Maked configurable email visibility for everybody [\#936](https://github.com/torrentpier/torrentpier/pull/936) ([belomaxorka](https://github.com/belomaxorka))
+- Respond with loopback if peer list is empty [\#933](https://github.com/torrentpier/torrentpier/pull/933) ([kovalensky](https://github.com/kovalensky))
+- Use \Arokettu\Bencode\ instead \SandFox\Bencode\ [\#932](https://github.com/torrentpier/torrentpier/pull/932) ([belomaxorka](https://github.com/belomaxorka))
+- Added support for bmp images [\#931](https://github.com/torrentpier/torrentpier/pull/931) ([belomaxorka](https://github.com/belomaxorka))
+- ACP: Changed extensions sorting [\#930](https://github.com/torrentpier/torrentpier/pull/930) ([belomaxorka](https://github.com/belomaxorka))
+- Added missing bmp extension in SQL dump [\#929](https://github.com/torrentpier/torrentpier/pull/929) ([belomaxorka](https://github.com/belomaxorka))
+- Use IMAGETYPE_* constants [\#928](https://github.com/torrentpier/torrentpier/pull/928) ([belomaxorka](https://github.com/belomaxorka))
+- Small refactoring in Upload class [\#927](https://github.com/torrentpier/torrentpier/pull/927) ([belomaxorka](https://github.com/belomaxorka))
+- Added support for webp avatars [\#926](https://github.com/torrentpier/torrentpier/pull/926) ([belomaxorka](https://github.com/belomaxorka))
+- Added check up_allowed in Upload.php class [\#924](https://github.com/torrentpier/torrentpier/pull/924) ([belomaxorka](https://github.com/belomaxorka))
+- Added support for webp images 🌆 [\#919](https://github.com/torrentpier/torrentpier/pull/919) ([belomaxorka](https://github.com/belomaxorka))
+- Switched from md5 to a faster xxHash hash function [\#921](https://github.com/torrentpier/torrentpier/pull/921) ([belomaxorka](https://github.com/belomaxorka), [kovalensky](https://github.com/kovalensky))
+- Added support 7z archives [\#923](https://github.com/torrentpier/torrentpier/pull/923) ([belomaxorka](https://github.com/belomaxorka))
+- Added missing EXCLUDED_USERS in tr_stats.php [\#922](https://github.com/torrentpier/torrentpier/pull/922) ([belomaxorka](https://github.com/belomaxorka))
+- Announcer support for responding to stopped events [\#918](https://github.com/torrentpier/torrentpier/pull/918) ([kovalensky](https://github.com/kovalensky))
+- Added missing !defined('BB_ROOT') check [\#917](https://github.com/torrentpier/torrentpier/pull/917) ([belomaxorka](https://github.com/belomaxorka))
+- Support for IDN domains [\#909](https://github.com/torrentpier/torrentpier/pull/909) ([kovalensky](https://github.com/kovalensky))
+- Some cleanup [\#1003](https://github.com/torrentpier/torrentpier/pull/1003) ([belomaxorka](https://github.com/belomaxorka))
+- Code formatting [\#1026](https://github.com/torrentpier/torrentpier/pull/1026), [\#1030](https://github.com/torrentpier/torrentpier/pull/1030), [\#1044](https://github.com/torrentpier/torrentpier/pull/1044), [\#1056](https://github.com/torrentpier/torrentpier/pull/1056), [\#1059](https://github.com/torrentpier/torrentpier/pull/1059), [\#1062](https://github.com/torrentpier/torrentpier/pull/1062), [\#1063](https://github.com/torrentpier/torrentpier/pull/1063), [\#1065](https://github.com/torrentpier/torrentpier/pull/1065), [\#1071](https://github.com/torrentpier/torrentpier/pull/1071), [\#1076](https://github.com/torrentpier/torrentpier/pull/1076) ([belomaxorka](https://github.com/belomaxorka), [kovalensky](https://github.com/kovalensky))
+- Minor code changes [\#967](https://github.com/torrentpier/torrentpier/pull/967), [\#970](https://github.com/torrentpier/torrentpier/pull/970) ([kovalensky](https://github.com/kovalensky))
+- Minor improvements [\#902](https://github.com/torrentpier/torrentpier/pull/902), [\#903](https://github.com/torrentpier/torrentpier/pull/903), [\#904](https://github.com/torrentpier/torrentpier/pull/904), [\#905](https://github.com/torrentpier/torrentpier/pull/905), [\#906](https://github.com/torrentpier/torrentpier/pull/906), [\#907](https://github.com/torrentpier/torrentpier/pull/907), [\#908](https://github.com/torrentpier/torrentpier/pull/908), [\#910](https://github.com/torrentpier/torrentpier/pull/910), [\#911](https://github.com/torrentpier/torrentpier/pull/911), [\#913](https://github.com/torrentpier/torrentpier/pull/913), [\#914](https://github.com/torrentpier/torrentpier/pull/914), [\#915](https://github.com/torrentpier/torrentpier/pull/915), [\#920](https://github.com/torrentpier/torrentpier/pull/920), [\#935](https://github.com/torrentpier/torrentpier/pull/935), [\#946](https://github.com/torrentpier/torrentpier/pull/946), [\#950](https://github.com/torrentpier/torrentpier/pull/950), [\#951](https://github.com/torrentpier/torrentpier/pull/951), [\#952](https://github.com/torrentpier/torrentpier/pull/952), [\#953](https://github.com/torrentpier/torrentpier/pull/953), [\#954](https://github.com/torrentpier/torrentpier/pull/954), [\#956](https://github.com/torrentpier/torrentpier/pull/956), [\#959](https://github.com/torrentpier/torrentpier/pull/959), [\#960](https://github.com/torrentpier/torrentpier/pull/960), [\#965](https://github.com/torrentpier/torrentpier/pull/965), [\#966](https://github.com/torrentpier/torrentpier/pull/966), [\#972](https://github.com/torrentpier/torrentpier/pull/972), [\#973](https://github.com/torrentpier/torrentpier/pull/973), [\#974](https://github.com/torrentpier/torrentpier/pull/974), [\#975](https://github.com/torrentpier/torrentpier/pull/975), [\#976](https://github.com/torrentpier/torrentpier/pull/976), [\#982](https://github.com/torrentpier/torrentpier/pull/982), [\#988](https://github.com/torrentpier/torrentpier/pull/988), [\#997](https://github.com/torrentpier/torrentpier/pull/997) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#912](https://github.com/torrentpier/torrentpier/pull/912), [\#916](https://github.com/torrentpier/torrentpier/pull/916), [\#925](https://github.com/torrentpier/torrentpier/pull/925), [\#947](https://github.com/torrentpier/torrentpier/pull/947), [\#957](https://github.com/torrentpier/torrentpier/pull/957), [\#971](https://github.com/torrentpier/torrentpier/pull/971), [\#979](https://github.com/torrentpier/torrentpier/pull/979), [\#995](https://github.com/torrentpier/torrentpier/pull/995), [\#1000](https://github.com/torrentpier/torrentpier/pull/1000), [\#1037](https://github.com/torrentpier/torrentpier/pull/1037), [\#1054](https://github.com/torrentpier/torrentpier/pull/1054), [\#1072](https://github.com/torrentpier/torrentpier/pull/1072) ([Exileum](https://github.com/Exileum))
+- Updated deps [\#964](https://github.com/torrentpier/torrentpier/pull/964), [\#983](https://github.com/torrentpier/torrentpier/pull/983), [\#1011](https://github.com/torrentpier/torrentpier/pull/1011), [\#1015](https://github.com/torrentpier/torrentpier/pull/1015), [\#1045](https://github.com/torrentpier/torrentpier/pull/1045) ([belomaxorka](https://github.com/belomaxorka))
+
+## [v2.4.0-beta2](https://github.com/torrentpier/torrentpier/tree/v2.4.0-beta2) (2023-09-16)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.0-beta1...v2.4.0-beta2)
+
+**Merged pull requests:**
+
+- Tracker announce & scrape improvements 🥳 [\#901](https://github.com/torrentpier/torrentpier/pull/901) ([belomaxorka](https://github.com/belomaxorka), [kovalensky](https://github.com/kovalensky))
+- Fixed downloaded counter [\#894](https://github.com/torrentpier/torrentpier/pull/894) ([belomaxorka](https://github.com/belomaxorka), [kovalensky](https://github.com/kovalensky))
+- Fixed null seeders & leechers in announcer [\#891](https://github.com/torrentpier/torrentpier/pull/891) ([belomaxorka](https://github.com/belomaxorka), [kovalensky](https://github.com/kovalensky))
+- BitTorrent v2 support enhancements 🥳 [\#876](https://github.com/torrentpier/torrentpier/pull/876) ([belomaxorka](https://github.com/belomaxorka), [kovalensky](https://github.com/kovalensky))
+- Added showing info_hash v2 in viewtopic.php [\#870](https://github.com/torrentpier/torrentpier/pull/870) ([belomaxorka](https://github.com/belomaxorka), [kovalensky](https://github.com/kovalensky))
+- Added search by info_hash v2 🐯 [\#869](https://github.com/torrentpier/torrentpier/pull/869) ([belomaxorka](https://github.com/belomaxorka), [kovalensky](https://github.com/kovalensky))
+- BitTorrent v2 support 🐸 [\#866](https://github.com/torrentpier/torrentpier/pull/866) ([belomaxorka](https://github.com/belomaxorka), [kovalensky](https://github.com/kovalensky))
+- Replace all double quotes with single quotes [\#888](https://github.com/torrentpier/torrentpier/pull/888) ([belomaxorka](https://github.com/belomaxorka))
+- Removed unused lang variables [\#885](https://github.com/torrentpier/torrentpier/pull/885) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed empty $row['pm_count'] [\#880](https://github.com/torrentpier/torrentpier/pull/880) ([belomaxorka](https://github.com/belomaxorka))
+- Created function get_banned_users() [\#878](https://github.com/torrentpier/torrentpier/pull/878) ([belomaxorka](https://github.com/belomaxorka))
+- Moved callseed to ajax actions [\#877](https://github.com/torrentpier/torrentpier/pull/877) ([belomaxorka](https://github.com/belomaxorka))
+- Added ability to remove topic templates [\#862](https://github.com/torrentpier/torrentpier/pull/862) ([belomaxorka](https://github.com/belomaxorka))
+- Added missing translation in admin_ug_auth [\#861](https://github.com/torrentpier/torrentpier/pull/861) ([belomaxorka](https://github.com/belomaxorka))
+- Show renamed topic actions in log actions [\#860](https://github.com/torrentpier/torrentpier/pull/860) ([belomaxorka](https://github.com/belomaxorka))
+- Show set/unset downloaded actions in log actions [\#858](https://github.com/torrentpier/torrentpier/pull/858) ([belomaxorka](https://github.com/belomaxorka))
+- Show pin & unpin actions in log actions [\#857](https://github.com/torrentpier/torrentpier/pull/857) ([belomaxorka](https://github.com/belomaxorka))
+- Increase post_text & privmsgs_text limits [\#848](https://github.com/torrentpier/torrentpier/pull/848) ([belomaxorka](https://github.com/belomaxorka))
+- Added show password button [\#841](https://github.com/torrentpier/torrentpier/pull/841) ([belomaxorka](https://github.com/belomaxorka))
+- Passkey rework 🔫 [\#839](https://github.com/torrentpier/torrentpier/pull/839) ([belomaxorka](https://github.com/belomaxorka))
+- Rename passkeyExists() -> getPasskey() [\#838](https://github.com/torrentpier/torrentpier/pull/838) ([belomaxorka](https://github.com/belomaxorka))
+- Added method passkeyExists() [\#837](https://github.com/torrentpier/torrentpier/pull/837) ([belomaxorka](https://github.com/belomaxorka))
+- Refactored get_userdata() function [\#836](https://github.com/torrentpier/torrentpier/pull/836) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed $bb_cfg['pm_days_keep'] [\#834](https://github.com/torrentpier/torrentpier/pull/834) ([belomaxorka](https://github.com/belomaxorka))
+- Minor improvements [\#833](https://github.com/torrentpier/torrentpier/pull/833), [\#842](https://github.com/torrentpier/torrentpier/pull/842), [\#843](https://github.com/torrentpier/torrentpier/pull/843), [\#844](https://github.com/torrentpier/torrentpier/pull/844), [\#845](https://github.com/torrentpier/torrentpier/pull/845), [\#846](https://github.com/torrentpier/torrentpier/pull/846), [\#852](https://github.com/torrentpier/torrentpier/pull/852), [\#853](https://github.com/torrentpier/torrentpier/pull/853), [\#854](https://github.com/torrentpier/torrentpier/pull/854), [\#855](https://github.com/torrentpier/torrentpier/pull/855), [\#856](https://github.com/torrentpier/torrentpier/pull/856), [\#863](https://github.com/torrentpier/torrentpier/pull/863), [\#867](https://github.com/torrentpier/torrentpier/pull/867), [\#868](https://github.com/torrentpier/torrentpier/pull/868), [\#879](https://github.com/torrentpier/torrentpier/pull/879), [\#882](https://github.com/torrentpier/torrentpier/pull/882), [\#884](https://github.com/torrentpier/torrentpier/pull/884), [\#887](https://github.com/torrentpier/torrentpier/pull/887), [\#889](https://github.com/torrentpier/torrentpier/pull/889), [\#890](https://github.com/torrentpier/torrentpier/pull/890), [\#892](https://github.com/torrentpier/torrentpier/pull/892), [\#893](https://github.com/torrentpier/torrentpier/pull/893), [\#895](https://github.com/torrentpier/torrentpier/pull/895), [\#897](https://github.com/torrentpier/torrentpier/pull/897), [\#898](https://github.com/torrentpier/torrentpier/pull/898), [\#900](https://github.com/torrentpier/torrentpier/pull/900) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#840](https://github.com/torrentpier/torrentpier/pull/840), [\#850](https://github.com/torrentpier/torrentpier/pull/850), [\#859](https://github.com/torrentpier/torrentpier/pull/859), [\#871](https://github.com/torrentpier/torrentpier/pull/871), [\#881](https://github.com/torrentpier/torrentpier/pull/881), [\#886](https://github.com/torrentpier/torrentpier/pull/886) ([Exileum](https://github.com/Exileum), [belomaxorka](https://github.com/belomaxorka))
+- Updated deps [\#847](https://github.com/torrentpier/torrentpier/pull/847), [\#849](https://github.com/torrentpier/torrentpier/pull/849), [\#875](https://github.com/torrentpier/torrentpier/pull/875), [\#874](https://github.com/torrentpier/torrentpier/pull/874), [\#873](https://github.com/torrentpier/torrentpier/pull/873), [\#872](https://github.com/torrentpier/torrentpier/pull/872) ([belomaxorka](https://github.com/belomaxorka))
+
+## [v2.4.0-beta1](https://github.com/torrentpier/torrentpier/tree/v2.4.0-beta1) (2023-07-18)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.0-alpha4...v2.4.0-beta1)
+
+**Merged pull requests:**
+
+- Fixed broken smilies replacing [\#832](https://github.com/torrentpier/torrentpier/pull/832) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed mailer exception exposing stack trace [\#831](https://github.com/torrentpier/torrentpier/pull/831) ([belomaxorka](https://github.com/belomaxorka), [Lange](https://torrentpier.com/members/lange.55/))
+- Maked max smilies in PM configurable [\#829](https://github.com/torrentpier/torrentpier/pull/829) ([belomaxorka](https://github.com/belomaxorka))
+- Fix RFC 1918 RegExp [\#828](https://github.com/torrentpier/torrentpier/pull/828) ([belomaxorka](https://github.com/belomaxorka), [MetalWarrior88](https://github.com/MetalWarrior88))
+- Fixed broken reset autologin [\#825](https://github.com/torrentpier/torrentpier/pull/825) ([belomaxorka](https://github.com/belomaxorka))
+- Improved debug 🐛 [\#822](https://github.com/torrentpier/torrentpier/pull/822) ([belomaxorka](https://github.com/belomaxorka))
+- Redirect to viewprofile.php if profile.php hasn't arguments [\#821](https://github.com/torrentpier/torrentpier/pull/821) ([belomaxorka](https://github.com/belomaxorka))
+- Show smilies in post for guests [\#817](https://github.com/torrentpier/torrentpier/pull/817) ([belomaxorka](https://github.com/belomaxorka))
+- Added ability to set MySQLi error reporting [\#813](https://github.com/torrentpier/torrentpier/pull/813) ([belomaxorka](https://github.com/belomaxorka))
+- Added ability to generate passkey after registration [\#810](https://github.com/torrentpier/torrentpier/pull/810) ([belomaxorka](https://github.com/belomaxorka))
+- Added search by torrent status [\#805](https://github.com/torrentpier/torrentpier/pull/805) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed pagination [\#800](https://github.com/torrentpier/torrentpier/pull/800) ([belomaxorka](https://github.com/belomaxorka))
+- Removed unused lang variables [\#802](https://github.com/torrentpier/torrentpier/pull/802) ([belomaxorka](https://github.com/belomaxorka))
+- Minor improvements [\#796](https://github.com/torrentpier/torrentpier/pull/796), [\#797](https://github.com/torrentpier/torrentpier/pull/797), [\#798](https://github.com/torrentpier/torrentpier/pull/798), [\#799](https://github.com/torrentpier/torrentpier/pull/799), [\#801](https://github.com/torrentpier/torrentpier/pull/801), [\#804](https://github.com/torrentpier/torrentpier/pull/804), [\#806](https://github.com/torrentpier/torrentpier/pull/806), [\#808](https://github.com/torrentpier/torrentpier/pull/808), [\#809](https://github.com/torrentpier/torrentpier/pull/809), [\#811](https://github.com/torrentpier/torrentpier/pull/811), [\#812](https://github.com/torrentpier/torrentpier/pull/812), [\#814](https://github.com/torrentpier/torrentpier/pull/814), [\#816](https://github.com/torrentpier/torrentpier/pull/816), [\#819](https://github.com/torrentpier/torrentpier/pull/819), [\#823](https://github.com/torrentpier/torrentpier/pull/823), [\#824](https://github.com/torrentpier/torrentpier/pull/824), [\#826](https://github.com/torrentpier/torrentpier/pull/826) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#803](https://github.com/torrentpier/torrentpier/pull/803), [\#807](https://github.com/torrentpier/torrentpier/pull/807) ([Exileum](https://github.com/Exileum))
+- Updated deps [\#818](https://github.com/torrentpier/torrentpier/pull/818), [\#830](https://github.com/torrentpier/torrentpier/pull/830) ([belomaxorka](https://github.com/belomaxorka))
+
+## [v2.4.0-alpha4](https://github.com/torrentpier/torrentpier/tree/v2.4.0-alpha4) (2023-06-08)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.0-alpha3...v2.4.0-alpha4)
+
+**Merged pull requests:**
+
+- Maked max post length configurable [\#793](https://github.com/torrentpier/torrentpier/pull/793) ([belomaxorka](https://github.com/belomaxorka))
+- Used new Bencoder library 🔩 [\#791](https://github.com/torrentpier/torrentpier/pull/791) ([belomaxorka](https://github.com/belomaxorka), [kovalensky](https://github.com/kovalensky))
+- Added some placeholders for input fields [\#789](https://github.com/torrentpier/torrentpier/pull/789) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed empty user search box [\#785](https://github.com/torrentpier/torrentpier/pull/785) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed null $u_data if user not found [\#783](https://github.com/torrentpier/torrentpier/pull/783) ([belomaxorka](https://github.com/belomaxorka))
+- Added missing properties in User class [\#782](https://github.com/torrentpier/torrentpier/pull/782) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed some deprecations [\#777](https://github.com/torrentpier/torrentpier/pull/777) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed: preg_match(): Passing null to parameter [\#776](https://github.com/torrentpier/torrentpier/pull/776) ([belomaxorka](https://github.com/belomaxorka))
+- Reformated JS [\#770](https://github.com/torrentpier/torrentpier/pull/770), [\#794](https://github.com/torrentpier/torrentpier/pull/794) ([belomaxorka](https://github.com/belomaxorka))
+- Implemented password_hash API 🥳 [\#768](https://github.com/torrentpier/torrentpier/pull/768) ([belomaxorka](https://github.com/belomaxorka))
+- Updated deps [\#763](https://github.com/torrentpier/torrentpier/pull/763) ([belomaxorka](https://github.com/belomaxorka))
+- Minor improvements [\#769](https://github.com/torrentpier/torrentpier/pull/769), [\#773](https://github.com/torrentpier/torrentpier/pull/773), [\#784](https://github.com/torrentpier/torrentpier/pull/784), [\#787](https://github.com/torrentpier/torrentpier/pull/787), [\#788](https://github.com/torrentpier/torrentpier/pull/788), [\#795](https://github.com/torrentpier/torrentpier/pull/795) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#786](https://github.com/torrentpier/torrentpier/pull/786) ([Exileum](https://github.com/Exileum))
+
+## [v2.4.0-alpha3](https://github.com/torrentpier/torrentpier/tree/v2.4.0-alpha3) (2023-06-02)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.0-alpha2...v2.4.0-alpha3)
+
+**Merged pull requests:**
+
+- Maked jumpbox optional [\#727](https://github.com/torrentpier/torrentpier/pull/727) ([belomaxorka](https://github.com/belomaxorka))
+- Code Inspection: Ternary expression can be replaced with condition [\#728](https://github.com/torrentpier/torrentpier/pull/728) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed: [Deprecated] number_format(): Passing null to parameter [\#729](https://github.com/torrentpier/torrentpier/pull/729) ([belomaxorka](https://github.com/belomaxorka))
+- Replaced prn_r() function with dump() [\#730](https://github.com/torrentpier/torrentpier/pull/730) ([belomaxorka](https://github.com/belomaxorka))
+- Replaced bb_exit() with native [\#731](https://github.com/torrentpier/torrentpier/pull/731) ([belomaxorka](https://github.com/belomaxorka))
+- Added exception if .env not found [\#734](https://github.com/torrentpier/torrentpier/pull/734) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken file_write() function [\#737](https://github.com/torrentpier/torrentpier/pull/737) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken $replace_content [\#738](https://github.com/torrentpier/torrentpier/pull/738) ([belomaxorka](https://github.com/belomaxorka))
+- Moved poll functions to Poll class [\#739](https://github.com/torrentpier/torrentpier/pull/739) ([belomaxorka](https://github.com/belomaxorka))
+- Replaced bb_realpath() with native [\#740](https://github.com/torrentpier/torrentpier/pull/740) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed methods types in Admin/Cron.php [\#743](https://github.com/torrentpier/torrentpier/pull/743) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed empty $_SERVER['SERVER_PROTOCOL'] in cron [\#744](https://github.com/torrentpier/torrentpier/pull/744) ([belomaxorka](https://github.com/belomaxorka))
+- Moved $bb_cfg['show_board_start_date'] to admin panel [\#745](https://github.com/torrentpier/torrentpier/pull/745) ([belomaxorka](https://github.com/belomaxorka))
+- Added sup & sub tags in BBCode [\#746](https://github.com/torrentpier/torrentpier/pull/746) ([belomaxorka](https://github.com/belomaxorka))
+- Unified checkForm() JS [\#747](https://github.com/torrentpier/torrentpier/pull/747) ([belomaxorka](https://github.com/belomaxorka))
+- [TEMP] Removed Http class [\#748](https://github.com/torrentpier/torrentpier/pull/748) ([belomaxorka](https://github.com/belomaxorka))
+- Added reset button in posting editor [\#749](https://github.com/torrentpier/torrentpier/pull/749) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed: Automatic conversion of false to array is deprecated [\#750](https://github.com/torrentpier/torrentpier/pull/750) ([belomaxorka](https://github.com/belomaxorka))
+- Reformated JS [\#753](https://github.com/torrentpier/torrentpier/pull/753), [\#754](https://github.com/torrentpier/torrentpier/pull/754) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#700](https://github.com/torrentpier/torrentpier/pull/700) ([Exileum](https://github.com/Exileum))
+- Minor improvements [\#732](https://github.com/torrentpier/torrentpier/pull/732), [\#735](https://github.com/torrentpier/torrentpier/pull/735), [\#741](https://github.com/torrentpier/torrentpier/pull/741), [\#742](https://github.com/torrentpier/torrentpier/pull/742), [\#751](https://github.com/torrentpier/torrentpier/pull/751), [\#752](https://github.com/torrentpier/torrentpier/pull/752), [\#755](https://github.com/torrentpier/torrentpier/pull/755), [\#756](https://github.com/torrentpier/torrentpier/pull/756), [\#757](https://github.com/torrentpier/torrentpier/pull/757), [\#761](https://github.com/torrentpier/torrentpier/pull/761) ([belomaxorka](https://github.com/belomaxorka))
+- Updated deps [\#733](https://github.com/torrentpier/torrentpier/pull/733), [\#758](https://github.com/torrentpier/torrentpier/pull/758) ([belomaxorka](https://github.com/belomaxorka))
+
+## [v2.4.0-alpha2](https://github.com/torrentpier/torrentpier/tree/v2.4.0-alpha2) (2023-05-28)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.4.0-alpha1...v2.4.0-alpha2)
+
+**Merged pull requests:**
+
+- Show cut button in debug panel only if sql_log [\#696](https://github.com/torrentpier/torrentpier/pull/696) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed input types in some cases [\#697](https://github.com/torrentpier/torrentpier/pull/697) ([belomaxorka](https://github.com/belomaxorka))
+- Refactored is_gold & gender_image functions [\#698](https://github.com/torrentpier/torrentpier/pull/698) ([belomaxorka](https://github.com/belomaxorka))
+- Added translations for debug panel [\#699](https://github.com/torrentpier/torrentpier/pull/699) ([belomaxorka](https://github.com/belomaxorka))
+- Use native __DIR__ for BB_PATH [\#702](https://github.com/torrentpier/torrentpier/pull/702) ([belomaxorka](https://github.com/belomaxorka))
+- Removed APP_NAME variable [\#708](https://github.com/torrentpier/torrentpier/pull/708) ([belomaxorka](https://github.com/belomaxorka))
+- Removed unused globals [\#709](https://github.com/torrentpier/torrentpier/pull/709) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed issue with DB_PORT not applying [\#710](https://github.com/torrentpier/torrentpier/pull/710) ([belomaxorka](https://github.com/belomaxorka))
+- Simplified IPHelper [\#712](https://github.com/torrentpier/torrentpier/pull/712) ([belomaxorka](https://github.com/belomaxorka))
+- Changed syntax for constants definition [\#714](https://github.com/torrentpier/torrentpier/pull/714) ([belomaxorka](https://github.com/belomaxorka))
+- Improvements for SEO [\#718](https://github.com/torrentpier/torrentpier/pull/718) ([belomaxorka](https://github.com/belomaxorka))
+- Added password required symbols check [\#713](https://github.com/torrentpier/torrentpier/pull/713) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed: htmlspecialchars(): Passing null to parameter [\#719](https://github.com/torrentpier/torrentpier/pull/719) ([belomaxorka](https://github.com/belomaxorka))
+- Added 'samesite' option for setcookie() [\#720](https://github.com/torrentpier/torrentpier/pull/720) ([belomaxorka](https://github.com/belomaxorka))
+- Removed deprecated type="text/css" [\#721](https://github.com/torrentpier/torrentpier/pull/721) ([belomaxorka](https://github.com/belomaxorka))
+- Added some new meta tags [\#722](https://github.com/torrentpier/torrentpier/pull/722) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed: Required parameter $mode follows optional parameter $submit [\#724](https://github.com/torrentpier/torrentpier/pull/724) ([belomaxorka](https://github.com/belomaxorka))
+- Added show board start date on index page [\#725](https://github.com/torrentpier/torrentpier/pull/725) ([belomaxorka](https://github.com/belomaxorka))
+- Use define instead of tpl variable [\#726](https://github.com/torrentpier/torrentpier/pull/726) ([belomaxorka](https://github.com/belomaxorka))
+- Updated deps [\#704](https://github.com/torrentpier/torrentpier/pull/704), [\#705](https://github.com/torrentpier/torrentpier/pull/705) ([belomaxorka](https://github.com/belomaxorka))
+- Minor improvements in admin templates [\#706](https://github.com/torrentpier/torrentpier/pull/706) ([belomaxorka](https://github.com/belomaxorka))
+- Minor improvements [\#707](https://github.com/torrentpier/torrentpier/pull/707), [\#711](https://github.com/torrentpier/torrentpier/pull/711), [\#715](https://github.com/torrentpier/torrentpier/pull/715), [\#716](https://github.com/torrentpier/torrentpier/pull/716), [\#717](https://github.com/torrentpier/torrentpier/pull/717), [\#723](https://github.com/torrentpier/torrentpier/pull/723) ([belomaxorka](https://github.com/belomaxorka))
+
+## [v2.4.0-alpha1](https://github.com/torrentpier/torrentpier/tree/v2.4.0-alpha1) (2023-05-20)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.3.1...v2.4.0-alpha1)
+
+**Merged pull requests:**
+
+- Added ability to select email type in mass email [\#624](https://github.com/torrentpier/torrentpier/pull/624) ([belomaxorka](https://github.com/belomaxorka))
+- Added password method in validator [\#625](https://github.com/torrentpier/torrentpier/pull/625) ([belomaxorka](https://github.com/belomaxorka))
+- Show default avatar after delete, instead of hide [\#628](https://github.com/torrentpier/torrentpier/pull/628) ([belomaxorka](https://github.com/belomaxorka))
+- Switching to Symfony Mailer [\#629](https://github.com/torrentpier/torrentpier/pull/629) ([Exileum](https://github.com/Exileum))
+- Added missing comments into Env class [\#633](https://github.com/torrentpier/torrentpier/pull/633) ([belomaxorka](https://github.com/belomaxorka))
+- Apply fixes from StyleCI [\#634](https://github.com/torrentpier/torrentpier/pull/634), [\#635](https://github.com/torrentpier/torrentpier/pull/635) ([Exileum](https://github.com/Exileum))
+- Added missing comments Emailer [\#637](https://github.com/torrentpier/torrentpier/pull/637) ([belomaxorka](https://github.com/belomaxorka))
+- Various fixes after composer deps update [\#638](https://github.com/torrentpier/torrentpier/pull/638) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed undefined value() functions [\#640](https://github.com/torrentpier/torrentpier/pull/640) ([belomaxorka](https://github.com/belomaxorka))
+- Added IPHelper implementation [\#631](https://github.com/torrentpier/torrentpier/pull/631) ([belomaxorka](https://github.com/belomaxorka))
+- Fixing the .env load [\#643](https://github.com/torrentpier/torrentpier/pull/643) ([Exileum](https://github.com/Exileum))
+- Added Http class implementation [\#632](https://github.com/torrentpier/torrentpier/pull/632) ([belomaxorka](https://github.com/belomaxorka))
+- Refactored Validate class [\#646](https://github.com/torrentpier/torrentpier/pull/646) ([belomaxorka](https://github.com/belomaxorka))
+- Added system check requirements and more [\#645](https://github.com/torrentpier/torrentpier/pull/645) ([belomaxorka](https://github.com/belomaxorka))
+- Removed useless email empty check in register.php [\#647](https://github.com/torrentpier/torrentpier/pull/647) ([belomaxorka](https://github.com/belomaxorka))
+- Refactored Sitemap class [\#648](https://github.com/torrentpier/torrentpier/pull/648) ([belomaxorka](https://github.com/belomaxorka))
+- Refactored Dev class [\#649](https://github.com/torrentpier/torrentpier/pull/649) ([belomaxorka](https://github.com/belomaxorka))
+- Refactored Ajax class [\#650](https://github.com/torrentpier/torrentpier/pull/650) ([belomaxorka](https://github.com/belomaxorka))
+- Added SQLite3 installed check [Cache/Datastore] [\#652](https://github.com/torrentpier/torrentpier/pull/652) ([belomaxorka](https://github.com/belomaxorka))
+- Added missing default statement in switch case [\#653](https://github.com/torrentpier/torrentpier/pull/653) ([belomaxorka](https://github.com/belomaxorka))
+- Refactored Sessions class [\#656](https://github.com/torrentpier/torrentpier/pull/656) ([belomaxorka](https://github.com/belomaxorka))
+- Refactored CronHelper class [\#657](https://github.com/torrentpier/torrentpier/pull/657) ([belomaxorka](https://github.com/belomaxorka))
+- Minor edits to the localization [\#655](https://github.com/torrentpier/torrentpier/pull/655) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken pin first post [\#660](https://github.com/torrentpier/torrentpier/pull/660) ([belomaxorka](https://github.com/belomaxorka))
+- Reworked info.php [\#664](https://github.com/torrentpier/torrentpier/pull/664) ([belomaxorka](https://github.com/belomaxorka))
+- Removed useless copy actions [\#661](https://github.com/torrentpier/torrentpier/pull/661) ([belomaxorka](https://github.com/belomaxorka))
+- New implementation of IPHelper [\#665](https://github.com/torrentpier/torrentpier/pull/665) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken flood control [\#666](https://github.com/torrentpier/torrentpier/pull/666) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed empty $auth_key after gen passkey [\#670](https://github.com/torrentpier/torrentpier/pull/670) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken predicting birthday year [\#668](https://github.com/torrentpier/torrentpier/pull/668) ([belomaxorka](https://github.com/belomaxorka))
+- Prevent issue with broken deleting posts [\#673](https://github.com/torrentpier/torrentpier/pull/673) ([belomaxorka](https://github.com/belomaxorka))
+- Removed isAJAX check [So buggy] [\#675](https://github.com/torrentpier/torrentpier/pull/675) ([belomaxorka](https://github.com/belomaxorka))
+- Show correct info about password requirements [\#676](https://github.com/torrentpier/torrentpier/pull/676) ([belomaxorka](https://github.com/belomaxorka))
+- Updated sidebar links [\#678](https://github.com/torrentpier/torrentpier/pull/678) ([belomaxorka](https://github.com/belomaxorka))
+- Added theme exists check [\#679](https://github.com/torrentpier/torrentpier/pull/679) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken get gethostbyaddr [\#681](https://github.com/torrentpier/torrentpier/pull/681) ([belomaxorka](https://github.com/belomaxorka))
+- Cumulative update ☕ [\#685](https://github.com/torrentpier/torrentpier/pull/685) ([belomaxorka](https://github.com/belomaxorka))
+- Remove unused use statement [\#687](https://github.com/torrentpier/torrentpier/pull/687) ([belomaxorka](https://github.com/belomaxorka))
+- Prevent issue with empty $disallowed_id removing [\#692](https://github.com/torrentpier/torrentpier/pull/692) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed input types in some cases [\#693](https://github.com/torrentpier/torrentpier/pull/693) ([belomaxorka](https://github.com/belomaxorka))
+- [TEMP] Prevent issue with undefined lang variable [\#694](https://github.com/torrentpier/torrentpier/pull/694) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#626](https://github.com/torrentpier/torrentpier/pull/626), [\#695](https://github.com/torrentpier/torrentpier/pull/695) ([Exileum](https://github.com/Exileum))
+- Minor adjustments [\#644](https://github.com/torrentpier/torrentpier/pull/644) ([belomaxorka](https://github.com/belomaxorka))
+- Minor fixes [\#654](https://github.com/torrentpier/torrentpier/pull/654), [\#659](https://github.com/torrentpier/torrentpier/pull/659), [\#662](https://github.com/torrentpier/torrentpier/pull/662), [\#663](https://github.com/torrentpier/torrentpier/pull/663), [\#667](https://github.com/torrentpier/torrentpier/pull/667), [\#670](https://github.com/torrentpier/torrentpier/pull/670), [\#674](https://github.com/torrentpier/torrentpier/pull/674), [\#682](https://github.com/torrentpier/torrentpier/pull/682), [\#686](https://github.com/torrentpier/torrentpier/pull/686) ([belomaxorka](https://github.com/belomaxorka))
+
+## [v2.3.1](https://github.com/torrentpier/torrentpier/tree/v2.3.1) (2023-03-18)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.3.1-rc1...v2.3.1)
+
+**Merged pull requests:**
+
+- Make activate key length configurable [\#590](https://github.com/torrentpier/torrentpier/pull/590) ([belomaxorka](https://github.com/belomaxorka))
+- Minor adjustments [\#593](https://github.com/torrentpier/torrentpier/pull/593), [\#607](https://github.com/torrentpier/torrentpier/pull/607), [\#610](https://github.com/torrentpier/torrentpier/pull/610) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed typo in src/Cache/File.php [\#596](https://github.com/torrentpier/torrentpier/pull/596) ([belomaxorka](https://github.com/belomaxorka))
+- Use APP_NAME instead lang variables [\#604](https://github.com/torrentpier/torrentpier/pull/604) ([belomaxorka](https://github.com/belomaxorka))
+- New Crowdin updates [\#577](https://github.com/torrentpier/torrentpier/pull/577), [\#605](https://github.com/torrentpier/torrentpier/pull/605), [\#616](https://github.com/torrentpier/torrentpier/pull/616) ([Exileum](https://github.com/Exileum))
+- Use translations instead of untranslatable strings [\#606](https://github.com/torrentpier/torrentpier/pull/606) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed undefined $subject in register.php [\#608](https://github.com/torrentpier/torrentpier/pull/608) ([belomaxorka](https://github.com/belomaxorka))
+- Removed length limits for search_id & autologin_id [\#609](https://github.com/torrentpier/torrentpier/pull/609) ([belomaxorka](https://github.com/belomaxorka))
+- Small refactoring for avatar.php [AJAX] [\#611](https://github.com/torrentpier/torrentpier/pull/611), [\#612](https://github.com/torrentpier/torrentpier/pull/612) ([belomaxorka](https://github.com/belomaxorka))
+- Added PM counter in title [\#613](https://github.com/torrentpier/torrentpier/pull/613) ([belomaxorka](https://github.com/belomaxorka))
+- Redesigned AJAX system styles [\#614](https://github.com/torrentpier/torrentpier/pull/614) ([belomaxorka](https://github.com/belomaxorka), [Exileum](https://github.com/Exileum))
+- Minor edits to the localization [\#615](https://github.com/torrentpier/torrentpier/pull/615) ([Exileum](https://github.com/Exileum))
+- New cron initialization and minor edits [\#619](https://github.com/torrentpier/torrentpier/pull/619) ([Exileum](https://github.com/Exileum))
+- Fixed broken avatar ajax action for users [\#618](https://github.com/torrentpier/torrentpier/pull/618) ([belomaxorka](https://github.com/belomaxorka))
+- Added ability to hide ajax loading alert [\#617](https://github.com/torrentpier/torrentpier/pull/617) ([belomaxorka](https://github.com/belomaxorka))
+- Added passkey check in get_bt_userdata [\#621](https://github.com/torrentpier/torrentpier/pull/621) ([belomaxorka](https://github.com/belomaxorka))
+- Miscellaneous static analysis improvements for php 7.1 [\#620](https://github.com/torrentpier/torrentpier/pull/620) ([Exileum](https://github.com/Exileum))
+- Fixed getting online info from cache [\#622](https://github.com/torrentpier/torrentpier/pull/622) ([belomaxorka](https://github.com/belomaxorka), [Exileum](https://github.com/Exileum))
+- Globally improved log system [\#623](https://github.com/torrentpier/torrentpier/pull/623) ([belomaxorka](https://github.com/belomaxorka))
+
+## [v2.3.1-rc1](https://github.com/torrentpier/torrentpier/tree/v2.3.1-rc1) (2023-03-10)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.3.0.4-beta2...v2.3.1-rc1)
+
+**Merged pull requests:**
+
+- Minor adjustments in sql dumps [\#560](https://github.com/torrentpier/torrentpier/pull/560), [\#561](https://github.com/torrentpier/torrentpier/pull/561) ([belomaxorka](https://github.com/belomaxorka))
+- New BB_PATH implementation [\#562](https://github.com/torrentpier/torrentpier/pull/562) ([belomaxorka](https://github.com/belomaxorka))
+- Use constants instead of string literals [\#563](https://github.com/torrentpier/torrentpier/pull/563), [\#573](https://github.com/torrentpier/torrentpier/pull/573) ([belomaxorka](https://github.com/belomaxorka))
+- Hide feed button if feed file doesn't exist [\#564](https://github.com/torrentpier/torrentpier/pull/564) ([belomaxorka](https://github.com/belomaxorka))
+- Added some new fonts in bbcode editor [\#565](https://github.com/torrentpier/torrentpier/pull/565) ([belomaxorka](https://github.com/belomaxorka))
+- Added some new font sizes in bbcode editor [\#566](https://github.com/torrentpier/torrentpier/pull/566) ([belomaxorka](https://github.com/belomaxorka))
+- Added optional parameter in $valid_actions [AJAX] [\#567](https://github.com/torrentpier/torrentpier/pull/567) ([belomaxorka](https://github.com/belomaxorka))
+- Check if request is ajax [\#569](https://github.com/torrentpier/torrentpier/pull/569) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed code-style in some files [\#570](https://github.com/torrentpier/torrentpier/pull/570) ([belomaxorka](https://github.com/belomaxorka))
+- Minor adjustments [\#571](https://github.com/torrentpier/torrentpier/pull/571), [\#584](https://github.com/torrentpier/torrentpier/pull/584) ([belomaxorka](https://github.com/belomaxorka))
+- Added link to forum in admin_forumauth.tpl [\#574](https://github.com/torrentpier/torrentpier/pull/574) ([belomaxorka](https://github.com/belomaxorka))
+- Simplified make_rand_str function [\#575](https://github.com/torrentpier/torrentpier/pull/575) ([belomaxorka](https://github.com/belomaxorka))
+- Redesigned admin_ug_auth [\#576](https://github.com/torrentpier/torrentpier/pull/576) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken "user_viewonline" in admin panel [\#579](https://github.com/torrentpier/torrentpier/pull/579) ([belomaxorka](https://github.com/belomaxorka))
+- Make sitemap sending configurable [\#585](https://github.com/torrentpier/torrentpier/pull/585) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed get_avatar method [\#586](https://github.com/torrentpier/torrentpier/pull/586) ([belomaxorka](https://github.com/belomaxorka))
+- Added show avatar in memberlist [\#587](https://github.com/torrentpier/torrentpier/pull/587) ([belomaxorka](https://github.com/belomaxorka))
+
+## [v2.3.0.4-beta2](https://github.com/torrentpier/torrentpier/tree/v2.3.0.4-beta2) (2023-03-04)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.3.0.4-beta...v2.3.0.4-beta2)
+
+**Merged pull requests:**
+
+- Updated treeview up to 1.4.2 [\#549](https://github.com/torrentpier/torrentpier/pull/549) ([belomaxorka](https://github.com/belomaxorka))
+- Removed ugly copyright in indexer [\#546](https://github.com/torrentpier/torrentpier/pull/546) ([belomaxorka](https://github.com/belomaxorka))
+- Added ability to print page [\#544](https://github.com/torrentpier/torrentpier/pull/544) ([belomaxorka](https://github.com/belomaxorka))
+- Removed deprecated SQL_CACHE [\#554](https://github.com/torrentpier/torrentpier/pull/554) ([belomaxorka](https://github.com/belomaxorka))
+- Added min required mysql / mariadb version [\#555](https://github.com/torrentpier/torrentpier/pull/555) ([belomaxorka](https://github.com/belomaxorka))
+- Added needed "ORDER BY" in sql query [\#557](https://github.com/torrentpier/torrentpier/pull/557) ([belomaxorka](https://github.com/belomaxorka))
+- Added missing sql query in changes.txt [\#558](https://github.com/torrentpier/torrentpier/pull/558) ([belomaxorka](https://github.com/belomaxorka))
+
+## [v2.3.0.4-beta](https://github.com/torrentpier/torrentpier/tree/v2.3.0.4-beta) (2023-02-22)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.3.0.3...v2.3.0.4-beta)
+
+**Merged pull requests:**
+
+- docs: change official forum path [\#532](https://github.com/torrentpier/torrentpier/pull/532) ([Exileum](https://github.com/Exileum))
+- Fixed broken sql log selecting in debug-panel [\#533](https://github.com/torrentpier/torrentpier/pull/533) ([belomaxorka](https://github.com/belomaxorka))
+- New implementation of old browser detector [\#534](https://github.com/torrentpier/torrentpier/pull/534) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed SQLite caching issue [\#535](https://github.com/torrentpier/torrentpier/pull/535) ([belomaxorka](https://github.com/belomaxorka))
+- Extended email validation [\#536](https://github.com/torrentpier/torrentpier/pull/536) ([belomaxorka](https://github.com/belomaxorka))
+- Admin panel adjustments [\#538](https://github.com/torrentpier/torrentpier/pull/538) ([belomaxorka](https://github.com/belomaxorka))
+- Added user birthday icon in profile [\#539](https://github.com/torrentpier/torrentpier/pull/539) ([belomaxorka](https://github.com/belomaxorka))
+- Added forum description in viewforum page [\#540](https://github.com/torrentpier/torrentpier/pull/540) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken copy log from debug-panel [\#541](https://github.com/torrentpier/torrentpier/pull/541) ([belomaxorka](https://github.com/belomaxorka))
+- Added copy button in viewforum page [\#542](https://github.com/torrentpier/torrentpier/pull/542) ([belomaxorka](https://github.com/belomaxorka))
+- Added current topic url copy button in viewtopic [\#543](https://github.com/torrentpier/torrentpier/pull/543) ([belomaxorka](https://github.com/belomaxorka))
+- Added ``$bb_cfg['emailer']['enabled']`` check in admin_mass_email.php [\#545](https://github.com/torrentpier/torrentpier/pull/545) ([belomaxorka](https://github.com/belomaxorka))
+- Updated scrollTo up to 1.4.6 [\#547](https://github.com/torrentpier/torrentpier/pull/547) ([belomaxorka](https://github.com/belomaxorka))
+- Updated quicksearch up to Feb 21, 2018 commit [\#548](https://github.com/torrentpier/torrentpier/pull/548) ([belomaxorka](https://github.com/belomaxorka))
+
+## [v2.3.0.3](https://github.com/torrentpier/torrentpier/tree/v2.3.0.3) (2023-02-18)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.3.0.2...v2.3.0.3)
+
+**Merged pull requests:**
+
+- Updated copyright year [\#525](https://github.com/torrentpier/torrentpier/pull/525) ([belomaxorka](https://github.com/belomaxorka))
+- Update README.md (Fixed incorrect logo path) [\#526](https://github.com/torrentpier/torrentpier/pull/526) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken getting avatars directory size [\#527](https://github.com/torrentpier/torrentpier/pull/527) ([belomaxorka](https://github.com/belomaxorka))
+- Added declensions for count of downloads [\#528](https://github.com/torrentpier/torrentpier/pull/528) ([belomaxorka](https://github.com/belomaxorka))
+- Use XS_TPL_PREFIX instead of 'tpl_' [\#529](https://github.com/torrentpier/torrentpier/pull/529) ([belomaxorka](https://github.com/belomaxorka))
+- Removed useless .htaccess files [\#530](https://github.com/torrentpier/torrentpier/pull/530) ([belomaxorka](https://github.com/belomaxorka))
+- Replaced "deny from all" with "Require all denied" [\#531](https://github.com/torrentpier/torrentpier/pull/531) ([belomaxorka](https://github.com/belomaxorka))
+
+## [v2.3.0.2](https://github.com/torrentpier/torrentpier/tree/v2.3.0.2) (2023-01-23)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.3.0.1...v2.3.0.2)
+
+**Merged pull requests:**
+
+- Fixed PHP 7.3: Deprecate FILTER_FLAG_SCHEME_REQUIRED and FILTER_FLAG_HOST_REQUIRED flags used with FILTER_VALIDATE_URL [\#507](https://github.com/torrentpier/torrentpier/pull/507) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken user search in admin_groups [\#508](https://github.com/torrentpier/torrentpier/pull/508) ([belomaxorka](https://github.com/belomaxorka))
+- Fix some bugs with MySQL strict mode [\#509](https://github.com/torrentpier/torrentpier/pull/509) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed and improvements for SQL [\#510](https://github.com/torrentpier/torrentpier/pull/510) ([belomaxorka](https://github.com/belomaxorka))
+- Added showing post number in viewtopic [\#511](https://github.com/torrentpier/torrentpier/pull/511) ([belomaxorka](https://github.com/belomaxorka))
+- Updated composer dependencies [\#512](https://github.com/torrentpier/torrentpier/pull/512) ([belomaxorka](https://github.com/belomaxorka))
+- Added symfony/polyfill [\#513](https://github.com/torrentpier/torrentpier/pull/513) ([belomaxorka](https://github.com/belomaxorka))
+- Updated jQuery up to 1.12.4 [\#514](https://github.com/torrentpier/torrentpier/pull/514) ([belomaxorka](https://github.com/belomaxorka))
+- Updated normalize css up to 8.0.1 [\#515](https://github.com/torrentpier/torrentpier/pull/515) ([belomaxorka](https://github.com/belomaxorka))
+- Misc code improvements [\#516](https://github.com/torrentpier/torrentpier/pull/516) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed broken file_write() function [\#517](https://github.com/torrentpier/torrentpier/pull/517) ([belomaxorka](https://github.com/belomaxorka))
+- Fixed array multi sorting [\#518](https://github.com/torrentpier/torrentpier/pull/518) ([belomaxorka](https://github.com/belomaxorka))
+
+## [v2.3.0.1](https://github.com/torrentpier/torrentpier/tree/v2.3.0.1) (2018-06-27)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.3.0...v2.3.0.1)
+
+**Merged pull requests:**
+
+- Fix cron jobs fail without global config variable [\#471](https://github.com/torrentpier/torrentpier/pull/471) ([Exileum](https://github.com/Exileum))
+- Cleanup BBCode class [\#470](https://github.com/torrentpier/torrentpier/pull/470) ([Exileum](https://github.com/Exileum))
+
+## [v2.3.0](https://github.com/torrentpier/torrentpier/tree/v2.3.0) (2018-06-26)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.2.3...v2.3.0)
+
+**Merged pull requests:**
+
+- Release preparation. Crowdin language pack update [\#468](https://github.com/torrentpier/torrentpier/pull/468) ([Exileum](https://github.com/Exileum))
+- PHP 7+ deprecations of old cache systems [\#467](https://github.com/torrentpier/torrentpier/pull/467) ([Exileum](https://github.com/Exileum))
+- Fix global atom feed name [\#466](https://github.com/torrentpier/torrentpier/pull/466) ([Exileum](https://github.com/Exileum))
+- Configurable download torrent url [\#465](https://github.com/torrentpier/torrentpier/pull/465) ([Exileum](https://github.com/Exileum))
+- Fix some bugs with MySQL strict mode [\#464](https://github.com/torrentpier/torrentpier/pull/464) ([Exileum](https://github.com/Exileum))
+- Fix release template editor [\#463](https://github.com/torrentpier/torrentpier/pull/463) ([Exileum](https://github.com/Exileum))
+- Fix multiple variable cleanup in private messaging [\#462](https://github.com/torrentpier/torrentpier/pull/462) ([Exileum](https://github.com/Exileum))
+- Fix magnet link passkey creation for new users [\#461](https://github.com/torrentpier/torrentpier/pull/461) ([Exileum](https://github.com/Exileum))
+- Update required PHP version to 7.1.3 [\#460](https://github.com/torrentpier/torrentpier/pull/460) ([Exileum](https://github.com/Exileum))
+- Split functions to the composer autoloading [\#459](https://github.com/torrentpier/torrentpier/pull/459) ([Exileum](https://github.com/Exileum))
+- Update copyright to the short syntax [\#458](https://github.com/torrentpier/torrentpier/pull/458) ([Exileum](https://github.com/Exileum))
+- Fix \#451. Undefined index: L\_CRON\_EDIT\_HEAD [\#457](https://github.com/torrentpier/torrentpier/pull/457) ([Exileum](https://github.com/Exileum))
+- Merge head branches [\#456](https://github.com/torrentpier/torrentpier/pull/456) ([Exileum](https://github.com/Exileum))
+- Default value for user\_birthday causes exception on user password change [\#449](https://github.com/torrentpier/torrentpier/pull/449) ([yukoff](https://github.com/yukoff))
+- Add back roave/security-advisories [\#446](https://github.com/torrentpier/torrentpier/pull/446) ([yukoff](https://github.com/yukoff))
+
+## [v2.2.3](https://github.com/torrentpier/torrentpier/tree/v2.2.3) (2017-08-07)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.2.2...v2.2.3)
+
+**Merged pull requests:**
+
+- Release 2.2.3 🔥 [\#443](https://github.com/torrentpier/torrentpier/pull/443) ([Exileum](https://github.com/Exileum))
+- Release preparation. Crowdin language pack update [\#442](https://github.com/torrentpier/torrentpier/pull/442) ([Exileum](https://github.com/Exileum))
+- Unique topic page title, undefined language variables fix [\#441](https://github.com/torrentpier/torrentpier/pull/441) ([Exileum](https://github.com/Exileum))
+- Remove matching users with default IP from profile list [\#440](https://github.com/torrentpier/torrentpier/pull/440) ([Exileum](https://github.com/Exileum))
+- Broken announcer fix, announcer debug removed [\#439](https://github.com/torrentpier/torrentpier/pull/439) ([Exileum](https://github.com/Exileum))
+- Fix broken ajax [\#436](https://github.com/torrentpier/torrentpier/pull/436) ([Exileum](https://github.com/Exileum))
+- Some deprecations, normalize.css, torrent file content sort fix [\#434](https://github.com/torrentpier/torrentpier/pull/434) ([Exileum](https://github.com/Exileum))
+- Incorrect log file rotation regex [\#432](https://github.com/torrentpier/torrentpier/pull/432) ([Exileum](https://github.com/Exileum))
+- Various bug fixes described on the forum [\#431](https://github.com/torrentpier/torrentpier/pull/431) ([Exileum](https://github.com/Exileum))
+- Fixes \#412 - bug with dynamic language variables [\#430](https://github.com/torrentpier/torrentpier/pull/430) ([Exileum](https://github.com/Exileum))
+- Update .htaccess for new Apache 2.4 syntax [\#429](https://github.com/torrentpier/torrentpier/pull/429) ([Exileum](https://github.com/Exileum))
+- Crowdin language pack update for new project domain name [\#415](https://github.com/torrentpier/torrentpier/pull/415) ([Exileum](https://github.com/Exileum))
+- Composer support section error [\#414](https://github.com/torrentpier/torrentpier/pull/414) ([Exileum](https://github.com/Exileum))
+- New project domain name [\#413](https://github.com/torrentpier/torrentpier/pull/413) ([Exileum](https://github.com/Exileum))
+
+## [v2.2.2](https://github.com/torrentpier/torrentpier/tree/v2.2.2) (2017-06-22)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.2.1...v2.2.2)
+
+**Merged pull requests:**
+
+- Release 2.2.2 🌞 [\#410](https://github.com/torrentpier/torrentpier/pull/410) ([Exileum](https://github.com/Exileum))
+- Release preparation Crowdin language pack update [\#409](https://github.com/torrentpier/torrentpier/pull/409) ([Exileum](https://github.com/Exileum))
+- Display source language if no user language variable [\#408](https://github.com/torrentpier/torrentpier/pull/408) ([Exileum](https://github.com/Exileum))
+- Disable Bugsnag by default [\#407](https://github.com/torrentpier/torrentpier/pull/407) ([Exileum](https://github.com/Exileum))
+- Fix empty birthday list [\#406](https://github.com/torrentpier/torrentpier/pull/406) ([Exileum](https://github.com/Exileum))
+- Remove unused ranks functionality [\#405](https://github.com/torrentpier/torrentpier/pull/405) ([Exileum](https://github.com/Exileum))
+- Complete renewal of the Ukrainian language from our toloka.to friends [\#404](https://github.com/torrentpier/torrentpier/pull/404) ([Exileum](https://github.com/Exileum))
+- Some fixes, auto language removal \(so buggy\) and replenishable status [\#403](https://github.com/torrentpier/torrentpier/pull/403) ([Exileum](https://github.com/Exileum))
+
+## [v2.2.1](https://github.com/torrentpier/torrentpier/tree/v2.2.1) (2017-06-16)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.2.0...v2.2.1)
+
+**Merged pull requests:**
+
+- Release 2.2.1 🐛 [\#392](https://github.com/torrentpier/torrentpier/pull/392) ([Exileum](https://github.com/Exileum))
+- Partial renewal of the Ukrainian language from our toloka.to friends [\#391](https://github.com/torrentpier/torrentpier/pull/391) ([Exileum](https://github.com/Exileum))
+- Create CODE\_OF\_CONDUCT.md [\#390](https://github.com/torrentpier/torrentpier/pull/390) ([Exileum](https://github.com/Exileum))
+- Fix default users language in dump [\#389](https://github.com/torrentpier/torrentpier/pull/389) ([Exileum](https://github.com/Exileum))
+- Tracker search forum list simplification [\#388](https://github.com/torrentpier/torrentpier/pull/388) ([Exileum](https://github.com/Exileum))
+- Fix some notices in admin panel reported by BugSnag [\#387](https://github.com/torrentpier/torrentpier/pull/387) ([Exileum](https://github.com/Exileum))
+- Fixed SQL. Remove limit from update [\#368](https://github.com/torrentpier/torrentpier/pull/368) ([VasyOk](https://github.com/VasyOk))
+
+## [v2.2.0](https://github.com/torrentpier/torrentpier/tree/v2.2.0) (2017-06-12)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.1.5...v2.2.0)
+
+**Merged pull requests:**
+
+- Release 2.2.0 ☘️ [\#328](https://github.com/torrentpier/torrentpier/pull/328) ([Exileum](https://github.com/Exileum))
+- Release preparation. Crowdin language pack update [\#322](https://github.com/torrentpier/torrentpier/pull/322) ([Exileum](https://github.com/Exileum))
+- TorrentPier Aurochs release preparation [\#321](https://github.com/torrentpier/torrentpier/pull/321) ([Exileum](https://github.com/Exileum))
+- Release preparation. Small bugfixes and readme translation [\#318](https://github.com/torrentpier/torrentpier/pull/318) ([Exileum](https://github.com/Exileum))
+- Crowdin language pack update [\#314](https://github.com/torrentpier/torrentpier/pull/314) ([Exileum](https://github.com/Exileum))
+- IP storage and attachment system bugfix. PHP 5.6+ [\#313](https://github.com/torrentpier/torrentpier/pull/313) ([Exileum](https://github.com/Exileum))
+- Bootstrap update & beginning of the develop branch partial merge [\#303](https://github.com/torrentpier/torrentpier/pull/303) ([Exileum](https://github.com/Exileum))
+- Fix avatars display bug [\#302](https://github.com/torrentpier/torrentpier/pull/302) ([Exileum](https://github.com/Exileum))
+- Cron subsystem rework. Environments [\#301](https://github.com/torrentpier/torrentpier/pull/301) ([Exileum](https://github.com/Exileum))
+- New logotype, favicon and css split & reformat [\#293](https://github.com/torrentpier/torrentpier/pull/293) ([Exileum](https://github.com/Exileum))
+- Whoops error handler for debug users [\#291](https://github.com/torrentpier/torrentpier/pull/291) ([Exileum](https://github.com/Exileum))
+- Replace sitemap to the new external component [\#252](https://github.com/torrentpier/torrentpier/pull/252) ([Exileum](https://github.com/Exileum))
+- Crowdin language pack update. Removed some languages [\#250](https://github.com/torrentpier/torrentpier/pull/250) ([Exileum](https://github.com/Exileum))
+- IP detect subsystem replace. Trash cleanup. Defines [\#249](https://github.com/torrentpier/torrentpier/pull/249) ([Exileum](https://github.com/Exileum))
+- Old ads module removal [\#244](https://github.com/torrentpier/torrentpier/pull/244) ([Exileum](https://github.com/Exileum))
+- External bencode library and some other changes [\#243](https://github.com/torrentpier/torrentpier/pull/243) ([Exileum](https://github.com/Exileum))
+- Added new logo to readme [\#242](https://github.com/torrentpier/torrentpier/pull/242) ([VasyOk](https://github.com/VasyOk))
+- Bugsnag integration and some bugfixes in for cycles [\#239](https://github.com/torrentpier/torrentpier/pull/239) ([Exileum](https://github.com/Exileum))
+- Bug with variables replacement and Crowdin localization fix [\#238](https://github.com/torrentpier/torrentpier/pull/238) ([Exileum](https://github.com/Exileum))
+- PSR-4 compatible legacy code autoloading [\#237](https://github.com/torrentpier/torrentpier/pull/237) ([Exileum](https://github.com/Exileum))
+- UFT-8 autocorrection removal from standart package [\#236](https://github.com/torrentpier/torrentpier/pull/236) ([Exileum](https://github.com/Exileum))
+- New localization strings and full Crowdin language pack update [\#235](https://github.com/torrentpier/torrentpier/pull/235) ([Exileum](https://github.com/Exileum))
+- Replace own emailer to SwiftMailer [\#234](https://github.com/torrentpier/torrentpier/pull/234) ([Exileum](https://github.com/Exileum))
+- Force email charset and Crowdin language pack update [\#232](https://github.com/torrentpier/torrentpier/pull/232) ([Exileum](https://github.com/Exileum))
+- Crowdin language pack update [\#231](https://github.com/torrentpier/torrentpier/pull/231) ([Exileum](https://github.com/Exileum))
+- Static code analyzer inspection, part 2 [\#230](https://github.com/torrentpier/torrentpier/pull/230) ([Exileum](https://github.com/Exileum))
+- Static code analyzer cherry picked from \#228 [\#229](https://github.com/torrentpier/torrentpier/pull/229) ([VasyOk](https://github.com/VasyOk))
+- Fix compare php version. [\#226](https://github.com/torrentpier/torrentpier/pull/226) ([VasyOk](https://github.com/VasyOk))
+- Fixed compare version PHP [\#225](https://github.com/torrentpier/torrentpier/pull/225) ([VasyOk](https://github.com/VasyOk))
+- Deprecated each\(\) function in php 7.2 [\#211](https://github.com/torrentpier/torrentpier/pull/211) ([Exileum](https://github.com/Exileum))
+- Performance refactoring. Remove test code. Fix path in config [\#208](https://github.com/torrentpier/torrentpier/pull/208) ([VasyOk](https://github.com/VasyOk))
+- Fix many notices in admin\_attach\_cp.php [\#183](https://github.com/torrentpier/torrentpier/pull/183) ([Exileum](https://github.com/Exileum))
+- Add check lang [\#178](https://github.com/torrentpier/torrentpier/pull/178) ([VasyOk](https://github.com/VasyOk))
+- Remove order from sql [\#177](https://github.com/torrentpier/torrentpier/pull/177) ([VasyOk](https://github.com/VasyOk))
+- Fix path to viewtorrent.php [\#176](https://github.com/torrentpier/torrentpier/pull/176) ([VasyOk](https://github.com/VasyOk))
+- New Crowdin translations [\#168](https://github.com/torrentpier/torrentpier/pull/168) ([Exileum](https://github.com/Exileum))
+- Localization trash cleanup [\#167](https://github.com/torrentpier/torrentpier/pull/167) ([Exileum](https://github.com/Exileum))
+- New Crowdin translations \(develop\) [\#165](https://github.com/torrentpier/torrentpier/pull/165) ([Exileum](https://github.com/Exileum))
+- New Crowdin translations \(master\) [\#164](https://github.com/torrentpier/torrentpier/pull/164) ([Exileum](https://github.com/Exileum))
+- Crowdin localization integration prepare and stopwords removal [\#163](https://github.com/torrentpier/torrentpier/pull/163) ([Exileum](https://github.com/Exileum))
+- Crowdin localization integration [\#162](https://github.com/torrentpier/torrentpier/pull/162) ([Exileum](https://github.com/Exileum))
+- New Crowdin translations \(develop\) [\#161](https://github.com/torrentpier/torrentpier/pull/161) ([Exileum](https://github.com/Exileum))
+- \#157. Fix Error in GET /bt/announce.php [\#159](https://github.com/torrentpier/torrentpier/pull/159) ([VasyOk](https://github.com/VasyOk))
+- Added check composer install [\#148](https://github.com/torrentpier/torrentpier/pull/148) ([VasyOk](https://github.com/VasyOk))
+- Fix operators [\#147](https://github.com/torrentpier/torrentpier/pull/147) ([VasyOk](https://github.com/VasyOk))
+- \#144 Files should not be executable [\#145](https://github.com/torrentpier/torrentpier/pull/145) ([VasyOk](https://github.com/VasyOk))
+- Change paths to absolute pathname [\#143](https://github.com/torrentpier/torrentpier/pull/143) ([VasyOk](https://github.com/VasyOk))
+- Redundant pagination, mysql 5.7+ issue, release template option [\#141](https://github.com/torrentpier/torrentpier/pull/141) ([Exileum](https://github.com/Exileum))
+- Transfer announce to the php7-optimized database layer [\#140](https://github.com/torrentpier/torrentpier/pull/140) ([Exileum](https://github.com/Exileum))
+- Cleanup repository from old deprecated scripts and server configs [\#139](https://github.com/torrentpier/torrentpier/pull/139) ([Exileum](https://github.com/Exileum))
+- Torrent ajax file list fixes and small reformat [\#138](https://github.com/torrentpier/torrentpier/pull/138) ([Exileum](https://github.com/Exileum))
+- Codacy / Scrutinizer / Code Climate / Coveralls integration, Slack hook to Travis CI [\#137](https://github.com/torrentpier/torrentpier/pull/137) ([Exileum](https://github.com/Exileum))
+- Add a Codacy badge to README.md [\#136](https://github.com/torrentpier/torrentpier/pull/136) ([codacy-badger](https://github.com/codacy-badger))
+- Replace Sphinx API to the composer version [\#135](https://github.com/torrentpier/torrentpier/pull/135) ([Exileum](https://github.com/Exileum))
+- Incorrect case close operators \(develop\) [\#134](https://github.com/torrentpier/torrentpier/pull/134) ([Exileum](https://github.com/Exileum))
+- Incorrect case close operators \(master\) [\#133](https://github.com/torrentpier/torrentpier/pull/133) ([Exileum](https://github.com/Exileum))
+- Composer init, editor config, some cleanup and much more [\#132](https://github.com/torrentpier/torrentpier/pull/132) ([Exileum](https://github.com/Exileum))
+- Remove eval from admin\_attachments and emailer [\#129](https://github.com/torrentpier/torrentpier/pull/129) ([VasyOk](https://github.com/VasyOk))
+- Fix sql group [\#128](https://github.com/torrentpier/torrentpier/pull/128) ([VasyOk](https://github.com/VasyOk))
+- Remove Zend [\#127](https://github.com/torrentpier/torrentpier/pull/127) ([VasyOk](https://github.com/VasyOk))
+- Small fix to the upgrade schema [\#126](https://github.com/torrentpier/torrentpier/pull/126) ([Exileum](https://github.com/Exileum))
+- Fixed id sqllog table and name select db [\#125](https://github.com/torrentpier/torrentpier/pull/125) ([VasyOk](https://github.com/VasyOk))
+- New external service for look up IP address [\#122](https://github.com/torrentpier/torrentpier/pull/122) ([Exileum](https://github.com/Exileum))
+- New branding and copyright [\#121](https://github.com/torrentpier/torrentpier/pull/121) ([Exileum](https://github.com/Exileum))
+- Poster birthday with no birthday date fix [\#120](https://github.com/torrentpier/torrentpier/pull/120) ([Exileum](https://github.com/Exileum))
+- Tidy deprecated option merge-spans remove [\#119](https://github.com/torrentpier/torrentpier/pull/119) ([Exileum](https://github.com/Exileum))
+- Db logging [\#118](https://github.com/torrentpier/torrentpier/pull/118) ([leroy0](https://github.com/leroy0))
+- CircleCi, CodeCoverage and composer dependencies [\#117](https://github.com/torrentpier/torrentpier/pull/117) ([Exileum](https://github.com/Exileum))
+- Db exceptions, query with binding [\#116](https://github.com/torrentpier/torrentpier/pull/116) ([leroy0](https://github.com/leroy0))
+- PHP 7+ requirements, Travis and other small fixes [\#115](https://github.com/torrentpier/torrentpier/pull/115) ([Exileum](https://github.com/Exileum))
+- New compatible with php7 classes: Db, Config [\#114](https://github.com/torrentpier/torrentpier/pull/114) ([Exileum](https://github.com/Exileum))
+- Refactoring posting\_attachments [\#112](https://github.com/torrentpier/torrentpier/pull/112) ([VasyOk](https://github.com/VasyOk))
+- Update the current year in the license text [\#110](https://github.com/torrentpier/torrentpier/pull/110) ([Exileum](https://github.com/Exileum))
+- Reformat master branch to PSR-2 and MIT license [\#109](https://github.com/torrentpier/torrentpier/pull/109) ([Exileum](https://github.com/Exileum))
+- Master branch up to php 7 compatibility [\#107](https://github.com/torrentpier/torrentpier/pull/107) ([VasyOk](https://github.com/VasyOk))
+- Removal of unused scripts and server configs [\#105](https://github.com/torrentpier/torrentpier/pull/105) ([Exileum](https://github.com/Exileum))
+- New license - MIT [\#104](https://github.com/torrentpier/torrentpier/pull/104) ([Exileum](https://github.com/Exileum))
+- New coding standart: PSR-2 [\#103](https://github.com/torrentpier/torrentpier/pull/103) ([Exileum](https://github.com/Exileum))
+- Improvements in code and work cache [\#101](https://github.com/torrentpier/torrentpier/pull/101) ([VasyOk](https://github.com/VasyOk))
+- Migration to the new config subsystem [\#100](https://github.com/torrentpier/torrentpier/pull/100) ([Exileum](https://github.com/Exileum))
+- php-lang-correct removed [\#99](https://github.com/torrentpier/torrentpier/pull/99) ([Exileum](https://github.com/Exileum))
+- Logical operators should be avoided [\#98](https://github.com/torrentpier/torrentpier/pull/98) ([Exileum](https://github.com/Exileum))
+- Migration to the new cache subsystem [\#97](https://github.com/torrentpier/torrentpier/pull/97) ([Exileum](https://github.com/Exileum))
+- Rework of feed.php and some other files [\#94](https://github.com/torrentpier/torrentpier/pull/94) ([Exileum](https://github.com/Exileum))
+- Refactoring Cache [\#92](https://github.com/torrentpier/torrentpier/pull/92) ([VasyOk](https://github.com/VasyOk))
+- Add new tests and refactoring [\#89](https://github.com/torrentpier/torrentpier/pull/89) ([VasyOk](https://github.com/VasyOk))
+- Add tests [\#88](https://github.com/torrentpier/torrentpier/pull/88) ([VasyOk](https://github.com/VasyOk))
+- Some fix after removed @ [\#87](https://github.com/torrentpier/torrentpier/pull/87) ([VasyOk](https://github.com/VasyOk))
+- \#77 Add monolog [\#86](https://github.com/torrentpier/torrentpier/pull/86) ([VasyOk](https://github.com/VasyOk))
+- Remove at [\#85](https://github.com/torrentpier/torrentpier/pull/85) ([VasyOk](https://github.com/VasyOk))
+- Переделка файла dl.php на работу с новой базой [\#83](https://github.com/torrentpier/torrentpier/pull/83) ([Exileum](https://github.com/Exileum))
+- Added use profiler and in\(de\)crement methods. [\#82](https://github.com/torrentpier/torrentpier/pull/82) ([VasyOk](https://github.com/VasyOk))
+- Remove response service provider [\#80](https://github.com/torrentpier/torrentpier/pull/80) ([VasyOk](https://github.com/VasyOk))
+- DI usage example [\#79](https://github.com/torrentpier/torrentpier/pull/79) ([Exileum](https://github.com/Exileum))
+- Added methods to simplify the work with the database [\#75](https://github.com/torrentpier/torrentpier/pull/75) ([VasyOk](https://github.com/VasyOk))
+- Captcha service provider [\#72](https://github.com/torrentpier/torrentpier/pull/72) ([Exileum](https://github.com/Exileum))
+- Fixed a getting value from config through method toArray [\#71](https://github.com/torrentpier/torrentpier/pull/71) ([VasyOk](https://github.com/VasyOk))
+- \#69 Fixed crypt notice [\#70](https://github.com/torrentpier/torrentpier/pull/70) ([VasyOk](https://github.com/VasyOk))
+- \#58 Expansion Zend Config [\#68](https://github.com/torrentpier/torrentpier/pull/68) ([VasyOk](https://github.com/VasyOk))
+- change preset to prs2 [\#61](https://github.com/torrentpier/torrentpier/pull/61) ([VasyOk](https://github.com/VasyOk))
+- Applied fixes from StyleCI [\#60](https://github.com/torrentpier/torrentpier/pull/60) ([Exileum](https://github.com/Exileum))
+
+## [v2.1.5](https://github.com/torrentpier/torrentpier/tree/v2.1.5) (2015-05-23)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.1.4...v2.1.5)
+
+**Merged pull requests:**
+
+- Add a Gitter chat badge to README.md [\#47](https://github.com/torrentpier/torrentpier/pull/47) ([gitter-badger](https://github.com/gitter-badger))
+- Фикс подтверждения пароля [\#43](https://github.com/torrentpier/torrentpier/pull/43) ([dreddred](https://github.com/dreddred))
+- Fix port Ocelot [\#42](https://github.com/torrentpier/torrentpier/pull/42) ([Altairko](https://github.com/Altairko))
+- Develop [\#40](https://github.com/torrentpier/torrentpier/pull/40) ([Exileum](https://github.com/Exileum))
+
+## [v2.1.4](https://github.com/torrentpier/torrentpier/tree/v2.1.4) (2014-11-26)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.1.3...v2.1.4)
+
+**Merged pull requests:**
+
+- Develop [\#39](https://github.com/torrentpier/torrentpier/pull/39) ([Exileum](https://github.com/Exileum))
+
+## [v2.1.3](https://github.com/torrentpier/torrentpier/tree/v2.1.3) (2014-10-24)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.1.2...v2.1.3)
+
+**Merged pull requests:**
+
+- Версия 2.1.3 ALPHA-3 [\#38](https://github.com/torrentpier/torrentpier/pull/38) ([Exileum](https://github.com/Exileum))
+
+## [v2.1.2](https://github.com/torrentpier/torrentpier/tree/v2.1.2) (2014-10-20)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.1.1...v2.1.2)
+
+**Merged pull requests:**
+
+- Версия 2.1.2 ALPHA-2 [\#37](https://github.com/torrentpier/torrentpier/pull/37) ([Exileum](https://github.com/Exileum))
+
+## [v2.1.1](https://github.com/torrentpier/torrentpier/tree/v2.1.1) (2014-09-11)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.1.0...v2.1.1)
+
+**Merged pull requests:**
+
+- Версия 2.1.1 ALPHA-1 [\#34](https://github.com/torrentpier/torrentpier/pull/34) ([Exileum](https://github.com/Exileum))
+
+## [v2.1.0](https://github.com/torrentpier/torrentpier/tree/v2.1.0) (2014-09-07)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.599b...v2.1.0)
+
+**Merged pull requests:**
+
+- Версия 2.1 \(R600\) [\#32](https://github.com/torrentpier/torrentpier/pull/32) ([Exileum](https://github.com/Exileum))
+
+## [v2.0.599b](https://github.com/torrentpier/torrentpier/tree/v2.0.599b) (2014-08-30)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.599...v2.0.599b)
+
+**Merged pull requests:**
+
+- Develop [\#31](https://github.com/torrentpier/torrentpier/pull/31) ([Exileum](https://github.com/Exileum))
+- Feature/terms [\#30](https://github.com/torrentpier/torrentpier/pull/30) ([Exileum](https://github.com/Exileum))
+
+## [v2.0.599](https://github.com/torrentpier/torrentpier/tree/v2.0.599) (2014-08-29)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.598...v2.0.599)
+
+**Merged pull requests:**
+
+- R599 [\#29](https://github.com/torrentpier/torrentpier/pull/29) ([Exileum](https://github.com/Exileum))
+
+## [v2.0.598](https://github.com/torrentpier/torrentpier/tree/v2.0.598) (2014-08-27)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.597...v2.0.598)
+
+**Merged pull requests:**
+
+- R598 [\#28](https://github.com/torrentpier/torrentpier/pull/28) ([Exileum](https://github.com/Exileum))
+
+## [v2.0.597](https://github.com/torrentpier/torrentpier/tree/v2.0.597) (2014-08-24)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.596...v2.0.597)
+
+**Merged pull requests:**
+
+- R597 [\#27](https://github.com/torrentpier/torrentpier/pull/27) ([Exileum](https://github.com/Exileum))
+
+## [v2.0.596](https://github.com/torrentpier/torrentpier/tree/v2.0.596) (2014-08-20)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.595...v2.0.596)
+
+**Merged pull requests:**
+
+- Develop [\#26](https://github.com/torrentpier/torrentpier/pull/26) ([Exileum](https://github.com/Exileum))
+
+## [v2.0.595](https://github.com/torrentpier/torrentpier/tree/v2.0.595) (2014-08-14)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.594b...v2.0.595)
+
+**Merged pull requests:**
+
+- Develop [\#22](https://github.com/torrentpier/torrentpier/pull/22) ([Exileum](https://github.com/Exileum))
+
+## [v2.0.594b](https://github.com/torrentpier/torrentpier/tree/v2.0.594b) (2014-08-07)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.594...v2.0.594b)
+
+**Merged pull requests:**
+
+- Develop [\#17](https://github.com/torrentpier/torrentpier/pull/17) ([Exileum](https://github.com/Exileum))
+- Hotfix/bbcode [\#16](https://github.com/torrentpier/torrentpier/pull/16) ([Exileum](https://github.com/Exileum))
+
+## [v2.0.594](https://github.com/torrentpier/torrentpier/tree/v2.0.594) (2014-08-07)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.593b...v2.0.594)
+
+**Merged pull requests:**
+
+- Develop [\#15](https://github.com/torrentpier/torrentpier/pull/15) ([Exileum](https://github.com/Exileum))
+
+## [v2.0.593b](https://github.com/torrentpier/torrentpier/tree/v2.0.593b) (2014-08-05)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.593...v2.0.593b)
+
+## [v2.0.593](https://github.com/torrentpier/torrentpier/tree/v2.0.593) (2014-08-05)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.592...v2.0.593)
+
+**Merged pull requests:**
+
+- Develop [\#13](https://github.com/torrentpier/torrentpier/pull/13) ([Exileum](https://github.com/Exileum))
+
+## [v2.0.592](https://github.com/torrentpier/torrentpier/tree/v2.0.592) (2014-08-01)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.591...v2.0.592)
+
+## [v2.0.591](https://github.com/torrentpier/torrentpier/tree/v2.0.591) (2014-07-13)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.590...v2.0.591)
+
+## [v2.0.590](https://github.com/torrentpier/torrentpier/tree/v2.0.590) (2014-06-21)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.589...v2.0.590)
+
+## [v2.0.589](https://github.com/torrentpier/torrentpier/tree/v2.0.589) (2014-06-19)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.588...v2.0.589)
+
+## [v2.0.588](https://github.com/torrentpier/torrentpier/tree/v2.0.588) (2014-06-17)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.587...v2.0.588)
+
+## [v2.0.587](https://github.com/torrentpier/torrentpier/tree/v2.0.587) (2014-06-15)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.586...v2.0.587)
+
+## [v2.0.586](https://github.com/torrentpier/torrentpier/tree/v2.0.586) (2014-06-13)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.585...v2.0.586)
+
+## [v2.0.585](https://github.com/torrentpier/torrentpier/tree/v2.0.585) (2014-05-14)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.584...v2.0.585)
+
+## [v2.0.584](https://github.com/torrentpier/torrentpier/tree/v2.0.584) (2014-03-07)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.583...v2.0.584)
+
+## [v2.0.583](https://github.com/torrentpier/torrentpier/tree/v2.0.583) (2014-02-10)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.581...v2.0.583)
+
+## [v2.0.581](https://github.com/torrentpier/torrentpier/tree/v2.0.581) (2014-02-03)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.572...v2.0.581)
+
+## [v2.0.572](https://github.com/torrentpier/torrentpier/tree/v2.0.572) (2014-01-28)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.564...v2.0.572)
+
+## [v2.0.564](https://github.com/torrentpier/torrentpier/tree/v2.0.564) (2014-01-20)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.560...v2.0.564)
+
+## [v2.0.560](https://github.com/torrentpier/torrentpier/tree/v2.0.560) (2014-01-17)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.556...v2.0.560)
+
+## [v2.0.556](https://github.com/torrentpier/torrentpier/tree/v2.0.556) (2014-01-12)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.552...v2.0.556)
+
+## [v2.0.552](https://github.com/torrentpier/torrentpier/tree/v2.0.552) (2013-09-05)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.506...v2.0.552)
+
+## [v2.0.506](https://github.com/torrentpier/torrentpier/tree/v2.0.506) (2013-06-23)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.500...v2.0.506)
+
+## [v2.0.500](https://github.com/torrentpier/torrentpier/tree/v2.0.500) (2013-05-14)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.491...v2.0.500)
+
+## [v2.0.491](https://github.com/torrentpier/torrentpier/tree/v2.0.491) (2013-01-12)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.477...v2.0.491)
+
+## [v2.0.477](https://github.com/torrentpier/torrentpier/tree/v2.0.477) (2012-11-14)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.463...v2.0.477)
+
+## [v2.0.463](https://github.com/torrentpier/torrentpier/tree/v2.0.463) (2012-10-16)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.456...v2.0.463)
+
+## [v2.0.456](https://github.com/torrentpier/torrentpier/tree/v2.0.456) (2012-09-07)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.400...v2.0.456)
+
+## [v2.0.400](https://github.com/torrentpier/torrentpier/tree/v2.0.400) (2012-04-13)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.300...v2.0.400)
+
+## [v2.0.300](https://github.com/torrentpier/torrentpier/tree/v2.0.300) (2011-10-14)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.261...v2.0.300)
+
+## [v2.0.261](https://github.com/torrentpier/torrentpier/tree/v2.0.261) (2011-08-28)
+[Full Changelog](https://github.com/torrentpier/torrentpier/compare/v2.0.0...v2.0.261)
+
+## [v2.0.0](https://github.com/torrentpier/torrentpier/tree/v2.0.0) (2011-08-08)
+
+
+\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
diff --git a/README.md b/README.md
index 96b27a825..3a699f78a 100644
--- a/README.md
+++ b/README.md
@@ -9,12 +9,12 @@
-
+
-
+
php ' . basename(__FILE__) . '
in CLI mode');
}
@@ -114,7 +114,7 @@ if ($bytesWritten === 0) {
out("\n- Config file has been updated!", 'success');
// Update CHANGELOG.md
-runProcess('npx git-cliff v2.4.6-alpha.4.. --config cliff.toml --tag "' . $version . '" > CHANGELOG.md');
+runProcess('npx git-cliff v2.4.5-rc.2.. --config cliff.toml --tag "' . $version . '" > CHANGELOG.md');
// Git add & commit
runProcess('git add -A && git commit -m "release: ' . escapeshellarg($version) . (!empty($versionEmoji) ? (' ' . $versionEmoji) : '') . '"');
@@ -124,7 +124,8 @@ runProcess("git tag -a \"$version\" -m \"Release $version\"");
runProcess("git tag -v \"$version\"");
// Git push
-runProcess("git push origin master");
+runProcess("git checkout v2.4");
+runProcess("git push origin v2.4");
runProcess("git push origin $version");
out("\n- Release $version has been successfully prepared, committed and pushed!", 'success');
diff --git a/admin/admin_attach_cp.php b/admin/admin_attach_cp.php
index a7f1ab498..6928a253b 100644
--- a/admin/admin_attach_cp.php
+++ b/admin/admin_attach_cp.php
@@ -69,44 +69,44 @@ $order_by = '';
if ($view === 'username') {
switch ($mode) {
case 'username':
- $order_by = 'ORDER BY u.username ' . $sort_order . ' LIMIT ' . $start . ', ' . config()->get('topics_per_page');
+ $order_by = 'ORDER BY u.username ' . $sort_order . ' LIMIT ' . $start . ', ' . $bb_cfg['topics_per_page'];
break;
case 'attachments':
- $order_by = 'ORDER BY total_attachments ' . $sort_order . ' LIMIT ' . $start . ', ' . config()->get('topics_per_page');
+ $order_by = 'ORDER BY total_attachments ' . $sort_order . ' LIMIT ' . $start . ', ' . $bb_cfg['topics_per_page'];
break;
case 'filesize':
- $order_by = 'ORDER BY total_size ' . $sort_order . ' LIMIT ' . $start . ', ' . config()->get('topics_per_page');
+ $order_by = 'ORDER BY total_size ' . $sort_order . ' LIMIT ' . $start . ', ' . $bb_cfg['topics_per_page'];
break;
default:
$mode = 'attachments';
$sort_order = 'DESC';
- $order_by = 'ORDER BY total_attachments ' . $sort_order . ' LIMIT ' . $start . ', ' . config()->get('topics_per_page');
+ $order_by = 'ORDER BY total_attachments ' . $sort_order . ' LIMIT ' . $start . ', ' . $bb_cfg['topics_per_page'];
break;
}
} elseif ($view === 'attachments') {
switch ($mode) {
case 'real_filename':
- $order_by = 'ORDER BY a.real_filename ' . $sort_order . ' LIMIT ' . $start . ', ' . config()->get('topics_per_page');
+ $order_by = 'ORDER BY a.real_filename ' . $sort_order . ' LIMIT ' . $start . ', ' . $bb_cfg['topics_per_page'];
break;
case 'comment':
- $order_by = 'ORDER BY a.comment ' . $sort_order . ' LIMIT ' . $start . ', ' . config()->get('topics_per_page');
+ $order_by = 'ORDER BY a.comment ' . $sort_order . ' LIMIT ' . $start . ', ' . $bb_cfg['topics_per_page'];
break;
case 'extension':
- $order_by = 'ORDER BY a.extension ' . $sort_order . ' LIMIT ' . $start . ', ' . config()->get('topics_per_page');
+ $order_by = 'ORDER BY a.extension ' . $sort_order . ' LIMIT ' . $start . ', ' . $bb_cfg['topics_per_page'];
break;
case 'filesize':
- $order_by = 'ORDER BY a.filesize ' . $sort_order . ' LIMIT ' . $start . ', ' . config()->get('topics_per_page');
+ $order_by = 'ORDER BY a.filesize ' . $sort_order . ' LIMIT ' . $start . ', ' . $bb_cfg['topics_per_page'];
break;
case 'downloads':
- $order_by = 'ORDER BY a.download_count ' . $sort_order . ' LIMIT ' . $start . ', ' . config()->get('topics_per_page');
+ $order_by = 'ORDER BY a.download_count ' . $sort_order . ' LIMIT ' . $start . ', ' . $bb_cfg['topics_per_page'];
break;
case 'post_time':
- $order_by = 'ORDER BY a.filetime ' . $sort_order . ' LIMIT ' . $start . ', ' . config()->get('topics_per_page');
+ $order_by = 'ORDER BY a.filetime ' . $sort_order . ' LIMIT ' . $start . ', ' . $bb_cfg['topics_per_page'];
break;
default:
$mode = 'a.real_filename';
$sort_order = 'ASC';
- $order_by = 'ORDER BY a.real_filename ' . $sort_order . ' LIMIT ' . $start . ', ' . config()->get('topics_per_page');
+ $order_by = 'ORDER BY a.real_filename ' . $sort_order . ' LIMIT ' . $start . ', ' . $bb_cfg['topics_per_page'];
break;
}
}
@@ -470,8 +470,8 @@ if ($view === 'attachments') {
}
// Generate Pagination
-if ($do_pagination && $total_rows > config()->get('topics_per_page')) {
- generate_pagination('admin_attach_cp.php?view=' . $view . '&mode=' . $mode . '&order=' . $sort_order . '&uid=' . $uid, $total_rows, config()->get('topics_per_page'), $start);
+if ($do_pagination && $total_rows > $bb_cfg['topics_per_page']) {
+ generate_pagination('admin_attach_cp.php?view=' . $view . '&mode=' . $mode . '&order=' . $sort_order . '&uid=' . $uid, $total_rows, $bb_cfg['topics_per_page'], $start);
}
print_page('admin_attach_cp.tpl', 'admin');
diff --git a/admin/admin_log.php b/admin/admin_log.php
index 89f0e8b0b..517a4b9bb 100644
--- a/admin/admin_log.php
+++ b/admin/admin_log.php
@@ -151,7 +151,7 @@ if ($var =& $_REQUEST[$daysback_key] && $var != $def_days) {
$url = url_arg($url, $daysback_key, $daysback_val);
}
if ($var =& $_REQUEST[$datetime_key] && $var != $def_datetime) {
- $tz = TIMENOW + (3600 * config()->get('board_timezone'));
+ $tz = TIMENOW + (3600 * $bb_cfg['board_timezone']);
if (($tmp_timestamp = strtotime($var, $tz)) > 0) {
$datetime_val = $tmp_timestamp;
$url = url_arg($url, $datetime_key, date($dt_format, $datetime_val));
diff --git a/admin/admin_mass_email.php b/admin/admin_mass_email.php
index 51902d960..d2765f9d6 100644
--- a/admin/admin_mass_email.php
+++ b/admin/admin_mass_email.php
@@ -14,7 +14,7 @@ if (!empty($setmodules)) {
require __DIR__ . '/pagestart.php';
-if (!config()->get('emailer.enabled')) {
+if (!$bb_cfg['emailer']['enabled']) {
bb_die($lang['EMAILER_DISABLED']);
}
@@ -23,7 +23,7 @@ set_time_limit(1200);
$subject = trim(request_var('subject', ''));
$message = (string)request_var('message', '');
$group_id = (int)request_var(POST_GROUPS_URL, 0);
-$reply_to = (string)request_var('reply_to', config()->get('board_email'));
+$reply_to = (string)request_var('reply_to', $bb_cfg['board_email']);
$message_type = (string)request_var('message_type', '');
$errors = $user_id_sql = [];
diff --git a/admin/admin_migrations.php b/admin/admin_migrations.php
deleted file mode 100644
index e416d81fb..000000000
--- a/admin/admin_migrations.php
+++ /dev/null
@@ -1,79 +0,0 @@
-getMigrationStatus();
-$schemaInfo = $migrationStatus->getSchemaInfo();
-
-// Template variables
-$template->assign_vars([
- 'PAGE_TITLE' => __('MIGRATIONS_STATUS'),
- 'CURRENT_TIME' => date('Y-m-d H:i:s'),
-
- // Migration status individual fields
- 'MIGRATION_TABLE_EXISTS' => $status['table_exists'],
- 'MIGRATION_CURRENT_VERSION' => $status['current_version'],
- 'MIGRATION_APPLIED_COUNT' => count($status['applied_migrations']),
- 'MIGRATION_PENDING_COUNT' => count($status['pending_migrations']),
-
- // Setup status fields
- 'SETUP_REQUIRES_SETUP' => $status['requires_setup'] ?? false,
- 'SETUP_TYPE' => $status['setup_status']['type'] ?? __('UNKNOWN'),
- 'SETUP_MESSAGE' => $status['setup_status']['message'] ?? '',
- 'SETUP_ACTION_REQUIRED' => $status['setup_status']['action_required'] ?? false,
- 'SETUP_INSTRUCTIONS' => $status['setup_status']['instructions'] ?? '',
-
- // Schema info individual fields
- 'SCHEMA_DATABASE_NAME' => $schemaInfo['database_name'],
- 'SCHEMA_TABLE_COUNT' => $schemaInfo['table_count'],
- 'SCHEMA_SIZE_MB' => $schemaInfo['size_mb'],
-]);
-
-// Assign migration data for template
-if (!empty($status['applied_migrations'])) {
- foreach ($status['applied_migrations'] as $i => $migration) {
- $template->assign_block_vars('applied_migrations', [
- 'VERSION' => $migration['version'],
- 'NAME' => $migration['migration_name'] ?? __('UNKNOWN'),
- 'START_TIME' => $migration['start_time'] ?? __('UNKNOWN'),
- 'END_TIME' => $migration['end_time'] ?? __('UNKNOWN'),
- 'ROW_CLASS' => ($i % 2) ? 'row1' : 'row2'
- ]);
- }
-}
-
-if (!empty($status['pending_migrations'])) {
- foreach ($status['pending_migrations'] as $i => $migration) {
- $template->assign_block_vars('pending_migrations', [
- 'VERSION' => $migration['version'],
- 'NAME' => $migration['name'],
- 'FILENAME' => $migration['filename'],
- 'ROW_CLASS' => ($i % 2) ? 'row1' : 'row2'
- ]);
- }
-}
-
-// Output template using standard admin pattern
-print_page('admin_migrations.tpl', 'admin');
diff --git a/admin/admin_sitemap.php b/admin/admin_sitemap.php
index 66e2f800b..3e3fd1fb6 100644
--- a/admin/admin_sitemap.php
+++ b/admin/admin_sitemap.php
@@ -39,7 +39,7 @@ if (!$result = DB()->sql_query($sql)) {
}
}
-$s_mess = $lang['SITEMAP_CREATED'] . ': ' . bb_date($new['sitemap_time'], config()->get('post_date_format')) . ' ' . $lang['SITEMAP_AVAILABLE'] . ': ' . make_url('sitemap/sitemap.xml') . '';
+$s_mess = $lang['SITEMAP_CREATED'] . ': ' . bb_date($new['sitemap_time'], $bb_cfg['post_date_format']) . ' ' . $lang['SITEMAP_AVAILABLE'] . ': ' . make_url('sitemap/sitemap.xml') . '';
$message = is_file(SITEMAP_DIR . '/sitemap.xml') ? $s_mess : $lang['SITEMAP_NOT_CREATED'];
$template->assign_vars([
diff --git a/admin/admin_smilies.php b/admin/admin_smilies.php
index 9e84c3ea0..e53c24223 100644
--- a/admin/admin_smilies.php
+++ b/admin/admin_smilies.php
@@ -26,7 +26,7 @@ if ($mode == 'delete' && isset($_POST['cancel'])) {
$mode = '';
}
-$pathToSmilesDir = BB_ROOT . config()->get('smilies_path');
+$pathToSmilesDir = BB_ROOT . $bb_cfg['smilies_path'];
$delimeter = '=+:';
$s_hidden_fields = '';
$smiley_paks = $smiley_images = [];
diff --git a/admin/admin_terms.php b/admin/admin_terms.php
index 45acd875c..4e294c3a5 100644
--- a/admin/admin_terms.php
+++ b/admin/admin_terms.php
@@ -17,15 +17,15 @@ require INC_DIR . '/bbcode.php';
$preview = isset($_POST['preview']);
-if (isset($_POST['post']) && (config()->get('terms') !== $_POST['message'])) {
+if (isset($_POST['post']) && ($bb_cfg['terms'] !== $_POST['message'])) {
bb_update_config(['terms' => $_POST['message']]);
bb_die($lang['TERMS_UPDATED_SUCCESSFULLY'] . '{$lang['TR_STATS'][$i]} | $row | "; } diff --git a/admin/stats/tracker.php b/admin/stats/tracker.php index 677373d78..977856b4c 100644 --- a/admin/stats/tracker.php +++ b/admin/stats/tracker.php @@ -21,7 +21,7 @@ if (!IS_ADMIN) { $peers_in_last_minutes = [30, 15, 5, 1]; $peers_in_last_sec_limit = 300; -$announce_interval = (int)config()->get('announce_interval'); +$announce_interval = (int)$bb_cfg['announce_interval']; $stat = []; define('TMP_TRACKER_TABLE', 'tmp_tracker'); diff --git a/bt/announce.php b/bt/announce.php index 3c74e554f..245b7c0dd 100644 --- a/bt/announce.php +++ b/bt/announce.php @@ -11,6 +11,8 @@ define('IN_TRACKER', true); define('BB_ROOT', './../'); require dirname(__DIR__) . '/common.php'; +global $bb_cfg; + // Check User-Agent for existence $userAgent = (string)$_SERVER['HTTP_USER_AGENT']; if (empty($userAgent)) { @@ -18,8 +20,8 @@ if (empty($userAgent)) { die; } -$announce_interval = config()->get('announce_interval'); -$passkey_key = config()->get('passkey_key'); +$announce_interval = $bb_cfg['announce_interval']; +$passkey_key = $bb_cfg['passkey_key']; // Recover info_hash if (isset($_GET['?info_hash']) && !isset($_GET['info_hash'])) { @@ -65,10 +67,10 @@ if (strlen($peer_id) !== 20) { } // Check for client ban -if (config()->get('client_ban.enabled')) { +if ($bb_cfg['client_ban']['enabled']) { $targetClient = []; - foreach (config()->get('client_ban.clients') as $clientId => $banReason) { + foreach ($bb_cfg['client_ban']['clients'] as $clientId => $banReason) { if (str_starts_with($peer_id, $clientId)) { $targetClient = [ 'peer_id' => $clientId, @@ -78,7 +80,7 @@ if (config()->get('client_ban.enabled')) { } } - if (config()->get('client_ban.only_allow_mode')) { + if ($bb_cfg['client_ban']['only_allow_mode']) { if (empty($targetClient['peer_id'])) { msg_die('Your BitTorrent client has been banned!'); } @@ -129,7 +131,7 @@ if ( || !is_numeric($port) || ($port < 1024 && !$stopped) || $port > 0xFFFF - || (!empty(config()->get('disallowed_ports')) && in_array($port, config()->get('disallowed_ports'))) + || (!empty($bb_cfg['disallowed_ports']) && in_array($port, $bb_cfg['disallowed_ports'])) ) { msg_die('Invalid port: ' . $port); } @@ -168,13 +170,13 @@ if (preg_match('/(Mozilla|Browser|Chrome|Safari|AppleWebKit|Opera|Links|Lynx|Bot $ip = $_SERVER['REMOTE_ADDR']; // 'ip' query handling -if (!config()->get('ignore_reported_ip') && isset($_GET['ip']) && $ip !== $_GET['ip']) { - if (!config()->get('verify_reported_ip') && isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { +if (!$bb_cfg['ignore_reported_ip'] && isset($_GET['ip']) && $ip !== $_GET['ip']) { + if (!$bb_cfg['verify_reported_ip'] && isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $x_ip = $_SERVER['HTTP_X_FORWARDED_FOR']; if ($x_ip === $_GET['ip']) { $filteredIp = filter_var($x_ip, FILTER_VALIDATE_IP); - if ($filteredIp !== false && (config()->get('allow_internal_ip') || !filter_var($filteredIp, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE))) { + if ($filteredIp !== false && ($bb_cfg['allow_internal_ip'] || !filter_var($filteredIp, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE))) { $ip = $filteredIp; } } @@ -270,7 +272,7 @@ if ($lp_info) { define('IS_MOD', !IS_GUEST && (int)$row['user_level'] === MOD); define('IS_GROUP_MEMBER', !IS_GUEST && (int)$row['user_level'] === GROUP_MEMBER); define('IS_USER', !IS_GUEST && (int)$row['user_level'] === USER); - define('IS_SUPER_ADMIN', IS_ADMIN && isset(config()->get('super_admins')[$user_id])); + define('IS_SUPER_ADMIN', IS_ADMIN && isset($bb_cfg['super_admins'][$user_id])); define('IS_AM', IS_ADMIN || IS_MOD); $topic_id = $row['topic_id']; $releaser = (int)($user_id == $row['poster_id']); @@ -278,13 +280,13 @@ if ($lp_info) { $tor_status = $row['tor_status']; // Check tor status - if (!IS_AM && isset(config()->get('tor_frozen')[$tor_status]) && !(isset(config()->get('tor_frozen_author_download')[$tor_status]) && $releaser)) { + if (!IS_AM && isset($bb_cfg['tor_frozen'][$tor_status]) && !(isset($bb_cfg['tor_frozen_author_download'][$tor_status]) && $releaser)) { msg_die('Torrent frozen and cannot be downloaded'); } // Check hybrid status if (!empty($row['info_hash']) && !empty($row['info_hash_v2'])) { - $stat_protocol = match ((int)config()->get('tracker.hybrid_stat_protocol')) { + $stat_protocol = match ((int)$bb_cfg['tracker']['hybrid_stat_protocol']) { 2 => substr($row['info_hash_v2'], 0, 20), default => $row['info_hash'] // 1 }; @@ -294,7 +296,7 @@ if ($lp_info) { } // Ratio limits - if ((RATIO_ENABLED || config()->get('tracker.limit_concurrent_ips')) && !$stopped) { + if ((RATIO_ENABLED || $bb_cfg['tracker']['limit_concurrent_ips']) && !$stopped) { $user_ratio = get_bt_ratio($row); if ($user_ratio === null) { $user_ratio = 1; @@ -302,10 +304,10 @@ if ($lp_info) { $rating_msg = ''; if (!$seeder) { - foreach (config()->get('rating') as $ratio => $limit) { + foreach ($bb_cfg['rating'] as $ratio => $limit) { if ($user_ratio < $ratio) { - config()->set('tracker.limit_active_tor', 1); - config()->set('tracker.limit_leech_count', $limit); + $bb_cfg['tracker']['limit_active_tor'] = 1; + $bb_cfg['tracker']['limit_leech_count'] = $limit; $rating_msg = " (ratio < $ratio)"; break; } @@ -313,29 +315,29 @@ if ($lp_info) { } // Limit active torrents - if (!isset(config()->get('unlimited_users')[$user_id]) && config()->get('tracker.limit_active_tor') && ((config()->get('tracker.limit_seed_count') && $seeder) || (config()->get('tracker.limit_leech_count') && !$seeder))) { + if (!isset($bb_cfg['unlimited_users'][$user_id]) && $bb_cfg['tracker']['limit_active_tor'] && (($bb_cfg['tracker']['limit_seed_count'] && $seeder) || ($bb_cfg['tracker']['limit_leech_count'] && !$seeder))) { $sql = "SELECT COUNT(DISTINCT topic_id) AS active_torrents FROM " . BB_BT_TRACKER . " WHERE user_id = $user_id AND seeder = $seeder AND topic_id != $topic_id"; - if (!$seeder && config()->get('tracker.leech_expire_factor') && $user_ratio < 0.5) { - $sql .= " AND update_time > " . (TIMENOW - 60 * config()->get('tracker.leech_expire_factor')); + if (!$seeder && $bb_cfg['tracker']['leech_expire_factor'] && $user_ratio < 0.5) { + $sql .= " AND update_time > " . (TIMENOW - 60 * $bb_cfg['tracker']['leech_expire_factor']); } $sql .= " GROUP BY user_id"; if ($row = DB()->fetch_row($sql)) { - if ($seeder && config()->get('tracker.limit_seed_count') && $row['active_torrents'] >= config()->get('tracker.limit_seed_count')) { - msg_die('Only ' . config()->get('tracker.limit_seed_count') . ' torrent(s) allowed for seeding'); - } elseif (!$seeder && config()->get('tracker.limit_leech_count') && $row['active_torrents'] >= config()->get('tracker.limit_leech_count')) { - msg_die('Only ' . config()->get('tracker.limit_leech_count') . ' torrent(s) allowed for leeching' . $rating_msg); + if ($seeder && $bb_cfg['tracker']['limit_seed_count'] && $row['active_torrents'] >= $bb_cfg['tracker']['limit_seed_count']) { + msg_die('Only ' . $bb_cfg['tracker']['limit_seed_count'] . ' torrent(s) allowed for seeding'); + } elseif (!$seeder && $bb_cfg['tracker']['limit_leech_count'] && $row['active_torrents'] >= $bb_cfg['tracker']['limit_leech_count']) { + msg_die('Only ' . $bb_cfg['tracker']['limit_leech_count'] . ' torrent(s) allowed for leeching' . $rating_msg); } } } // Limit concurrent IPs - if (config()->get('tracker.limit_concurrent_ips') && ((config()->get('tracker.limit_seed_ips') && $seeder) || (config()->get('tracker.limit_leech_ips') && !$seeder))) { + if ($bb_cfg['tracker']['limit_concurrent_ips'] && (($bb_cfg['tracker']['limit_seed_ips'] && $seeder) || ($bb_cfg['tracker']['limit_leech_ips'] && !$seeder))) { $sql = "SELECT COUNT(DISTINCT ip) AS ips FROM " . BB_BT_TRACKER . " WHERE topic_id = $topic_id @@ -343,16 +345,16 @@ if ($lp_info) { AND seeder = $seeder AND $ip_version != '$ip_sql'"; - if (!$seeder && config()->get('tracker.leech_expire_factor')) { - $sql .= " AND update_time > " . (TIMENOW - 60 * config()->get('tracker.leech_expire_factor')); + if (!$seeder && $bb_cfg['tracker']['leech_expire_factor']) { + $sql .= " AND update_time > " . (TIMENOW - 60 * $bb_cfg['tracker']['leech_expire_factor']); } $sql .= " GROUP BY topic_id"; if ($row = DB()->fetch_row($sql)) { - if ($seeder && config()->get('tracker.limit_seed_ips') && $row['ips'] >= config()->get('tracker.limit_seed_ips')) { - msg_die('You can seed only from ' . config()->get('tracker.limit_seed_ips') . " IP's"); - } elseif (!$seeder && config()->get('tracker.limit_leech_ips') && $row['ips'] >= config()->get('tracker.limit_leech_ips')) { - msg_die('You can leech only from ' . config()->get('tracker.limit_leech_ips') . " IP's"); + if ($seeder && $bb_cfg['tracker']['limit_seed_ips'] && $row['ips'] >= $bb_cfg['tracker']['limit_seed_ips']) { + msg_die('You can seed only from ' . $bb_cfg['tracker']['limit_seed_ips'] . " IP's"); + } elseif (!$seeder && $bb_cfg['tracker']['limit_leech_ips'] && $row['ips'] >= $bb_cfg['tracker']['limit_leech_ips']) { + msg_die('You can leech only from ' . $bb_cfg['tracker']['limit_leech_ips'] . " IP's"); } } } @@ -376,7 +378,7 @@ $up_add = ($lp_info && $uploaded > $lp_info['uploaded']) ? $uploaded - $lp_info[ $down_add = ($lp_info && $downloaded > $lp_info['downloaded']) ? $downloaded - $lp_info['downloaded'] : 0; // Gold/Silver releases -if (config()->get('tracker.gold_silver_enabled') && $down_add) { +if ($bb_cfg['tracker']['gold_silver_enabled'] && $down_add) { if ($tor_type == TOR_TYPE_GOLD) { $down_add = 0; } // Silver releases @@ -386,7 +388,7 @@ if (config()->get('tracker.gold_silver_enabled') && $down_add) { } // Freeleech -if (config()->get('tracker.freeleech') && $down_add) { +if ($bb_cfg['tracker']['freeleech'] && $down_add) { $down_add = 0; } @@ -464,8 +466,8 @@ $output = CACHE('tr_cache')->get(PEERS_LIST_PREFIX . $topic_id); if (!$output) { // Retrieve peers - $numwant = (int)config()->get('tracker.numwant'); - $compact_mode = (config()->get('tracker.compact_mode') || !empty($compact)); + $numwant = (int)$bb_cfg['tracker']['numwant']; + $compact_mode = ($bb_cfg['tracker']['compact_mode'] || !empty($compact)); $rowset = DB()->fetch_rowset(" SELECT ip, ipv6, port @@ -510,7 +512,7 @@ if (!$output) { $seeders = $leechers = $client_completed = 0; - if (config()->get('tracker.scrape')) { + if ($bb_cfg['tracker']['scrape']) { $row = DB()->fetch_row(" SELECT seeders, leechers, completed FROM " . BB_BT_TRACKER_SNAP . " diff --git a/bt/includes/init_tr.php b/bt/includes/init_tr.php index 283c71ede..43e6bf43b 100644 --- a/bt/includes/init_tr.php +++ b/bt/includes/init_tr.php @@ -11,9 +11,11 @@ if (!defined('IN_TRACKER')) { die(basename(__FILE__)); } +global $bb_cfg; + // Exit if tracker is disabled -if (config()->get('tracker.bt_off')) { - msg_die(config()->get('tracker.bt_off_reason')); +if ($bb_cfg['tracker']['bt_off']) { + msg_die($bb_cfg['tracker']['bt_off_reason']); } // diff --git a/bt/scrape.php b/bt/scrape.php index d11ea0981..e2c2676ec 100644 --- a/bt/scrape.php +++ b/bt/scrape.php @@ -11,7 +11,9 @@ define('IN_TRACKER', true); define('BB_ROOT', './../'); require dirname(__DIR__) . '/common.php'; -if (!config()->get('tracker.scrape')) { +global $bb_cfg; + +if (!$bb_cfg['tracker']['scrape']) { msg_die('Please disable SCRAPE!'); } @@ -58,8 +60,8 @@ foreach ($info_hash_array[1] as $hash) { $info_hash_count = count($info_hashes); if (!empty($info_hash_count)) { - if ($info_hash_count > config()->get('max_scrapes')) { - $info_hashes = array_slice($info_hashes, 0, config()->get('max_scrapes')); + if ($info_hash_count > $bb_cfg['max_scrapes']) { + $info_hashes = array_slice($info_hashes, 0, $bb_cfg['max_scrapes']); } $info_hashes_sql = implode('\', \'', $info_hashes); diff --git a/cliff.toml b/cliff.toml index 1798567f1..858d0a4db 100644 --- a/cliff.toml +++ b/cliff.toml @@ -23,7 +23,7 @@ body = """ {%- endmacro -%} {%- macro nightly_url() -%} - https://nightly.link/{{ remote.github.owner }}/{{ remote.github.repo }}/workflows/ci/master/TorrentPier-master + https://nightly.link/{{ remote.github.owner }}/{{ remote.github.repo }}/workflows/ci/v2.4/TorrentPier-v2.4 {%- endmacro -%} {% macro print_commit(commit) -%} diff --git a/common.php b/common.php index de0a8cab4..a455a7de2 100644 --- a/common.php +++ b/common.php @@ -86,137 +86,68 @@ if (is_file(BB_PATH . '/library/config.local.php')) { require_once BB_PATH . '/library/config.local.php'; } -/** @noinspection PhpUndefinedVariableInspection */ -// Initialize Config singleton, bb_cfg from global file config -$config = \TorrentPier\Config::init($bb_cfg); - -/** - * Get the Config instance - * - * @return \TorrentPier\Config - */ -function config(): \TorrentPier\Config -{ - return \TorrentPier\Config::getInstance(); -} - -/** - * Get the Censor instance - * - * @return \TorrentPier\Censor - */ -function censor(): \TorrentPier\Censor -{ - return \TorrentPier\Censor::getInstance(); -} - -/** - * Get the Dev instance - * - * @return \TorrentPier\Dev - */ -function dev(): \TorrentPier\Dev -{ - return \TorrentPier\Dev::getInstance(); -} - -/** - * Get the Language instance - * - * @return \TorrentPier\Language - */ -function lang(): \TorrentPier\Language -{ - return \TorrentPier\Language::getInstance(); -} - -/** - * Get a language string (shorthand for lang()->get()) - * - * @param string $key Language key, supports dot notation (e.g., 'DATETIME.TODAY') - * @param mixed $default Default value if key doesn't exist - * @return mixed Language string or default value - */ -function __(string $key, mixed $default = null): mixed -{ - return \TorrentPier\Language::getInstance()->get($key, $default); -} - -/** - * Echo a language string (shorthand for echo __()) - * - * @param string $key Language key, supports dot notation - * @param mixed $default Default value if key doesn't exist - * @return void - */ -function _e(string $key, mixed $default = null): void -{ - echo \TorrentPier\Language::getInstance()->get($key, $default); -} - /** * Initialize debug */ define('APP_ENV', env('APP_ENV', 'production')); -if (APP_ENV === 'development') { +if (APP_ENV === 'local') { define('DBG_USER', true); // forced debug } else { define('DBG_USER', isset($_COOKIE[COOKIE_DBG])); } -(\TorrentPier\Dev::init()); +(new \TorrentPier\Dev()); /** * Server variables initialize */ -$server_protocol = config()->get('cookie_secure') ? 'https://' : 'http://'; -$server_port = in_array((int)config()->get('server_port'), [80, 443], true) ? '' : ':' . config()->get('server_port'); -define('FORUM_PATH', config()->get('script_path')); -define('FULL_URL', $server_protocol . config()->get('server_name') . $server_port . config()->get('script_path')); +$server_protocol = $bb_cfg['cookie_secure'] ? 'https://' : 'http://'; +$server_port = in_array((int)$bb_cfg['server_port'], [80, 443], true) ? '' : ':' . $bb_cfg['server_port']; +define('FORUM_PATH', $bb_cfg['script_path']); +define('FULL_URL', $server_protocol . $bb_cfg['server_name'] . $server_port . $bb_cfg['script_path']); unset($server_protocol, $server_port); -// Initialize the new DB factory with database configuration -TorrentPier\Database\DatabaseFactory::init(config()->get('db'), config()->get('db_alias', [])); - /** - * Get the Database instance - * - * @param string $db_alias - * @return \TorrentPier\Database\Database + * Database */ -function DB(string $db_alias = 'db'): \TorrentPier\Database\Database -{ - return TorrentPier\Database\DatabaseFactory::getInstance($db_alias); -} +$DBS = new TorrentPier\Legacy\Dbs($bb_cfg); -// Initialize Unified Cache System -TorrentPier\Cache\UnifiedCacheSystem::getInstance(config()->all()); - -/** - * Get cache manager instance (replaces legacy cache system) - * - * @param string $cache_name - * @return \TorrentPier\Cache\CacheManager - */ -function CACHE(string $cache_name): \TorrentPier\Cache\CacheManager +function DB(string $db_alias = 'db') { - return TorrentPier\Cache\UnifiedCacheSystem::getInstance()->get_cache_obj($cache_name); + global $DBS; + return $DBS->get_db_obj($db_alias); } /** - * Get datastore manager instance (replaces legacy datastore system) - * - * @return \TorrentPier\Cache\DatastoreManager + * Cache */ -function datastore(): \TorrentPier\Cache\DatastoreManager +$CACHES = new TorrentPier\Legacy\Caches($bb_cfg); + +function CACHE(string $cache_name) { - return TorrentPier\Cache\UnifiedCacheSystem::getInstance()->getDatastore(config()->get('datastore_type', 'file')); + global $CACHES; + return $CACHES->get_cache_obj($cache_name); } /** - * Backward compatibility: Global datastore variable - * This allows existing code to continue using global $datastore + * Datastore */ -$datastore = datastore(); +switch ($bb_cfg['datastore_type']) { + case 'apcu': + $datastore = new TorrentPier\Legacy\Datastore\APCu($bb_cfg['cache']['prefix']); + break; + case 'memcached': + $datastore = new TorrentPier\Legacy\Datastore\Memcached($bb_cfg['cache']['memcached'], $bb_cfg['cache']['prefix']); + break; + case 'sqlite': + $datastore = new TorrentPier\Legacy\Datastore\Sqlite($bb_cfg['cache']['db_dir'] . 'datastore', $bb_cfg['cache']['prefix']); + break; + case 'redis': + $datastore = new TorrentPier\Legacy\Datastore\Redis($bb_cfg['cache']['redis'], $bb_cfg['cache']['prefix']); + break; + case 'filecache': + default: + $datastore = new TorrentPier\Legacy\Datastore\File($bb_cfg['cache']['db_dir'] . 'datastore/', $bb_cfg['cache']['prefix']); +} // Functions function utime() @@ -433,9 +364,9 @@ if (!defined('IN_TRACKER')) { } else { define('DUMMY_PEER', pack('Nn', \TorrentPier\Helpers\IPHelper::ip2long($_SERVER['REMOTE_ADDR']), !empty($_GET['port']) ? (int)$_GET['port'] : random_int(1000, 65000))); - define('PEER_HASH_EXPIRE', round(config()->get('announce_interval') * (0.85 * config()->get('tracker.expire_factor')))); - define('PEERS_LIST_EXPIRE', round(config()->get('announce_interval') * 0.7)); - define('SCRAPE_LIST_EXPIRE', round(config()->get('scrape_interval') * 0.7)); + define('PEER_HASH_EXPIRE', round($bb_cfg['announce_interval'] * (0.85 * $bb_cfg['tracker']['expire_factor']))); + define('PEERS_LIST_EXPIRE', round($bb_cfg['announce_interval'] * 0.7)); + define('SCRAPE_LIST_EXPIRE', round($bb_cfg['scrape_interval'] * 0.7)); define('PEER_HASH_PREFIX', 'peer_'); define('PEERS_LIST_PREFIX', 'peers_list_'); diff --git a/composer.json b/composer.json index 85ef6217d..a15ef15cc 100644 --- a/composer.json +++ b/composer.json @@ -46,57 +46,51 @@ "forum": "https://torrentpier.com" }, "require": { - "php": ">=8.2", - "arokettu/bencode": "^4.1.0", - "arokettu/monsterid": "^4.1.0", + "php": ">=8.1", "arokettu/random-polyfill": "1.0.2", + "arokettu/bencode": "^4.1.0", + "arokettu/monsterid": "dev-master", "arokettu/torrent-file": "^5.2.1", - "belomaxorka/captcha": "1.*", "bugsnag/bugsnag": "^v3.29.1", "claviska/simpleimage": "^4.0", + "belomaxorka/captcha": "1.*", "egulias/email-validator": "^4.0.1", "filp/whoops": "^2.15", - "gemorroj/m3u-parser": "^6.0.1", + "z4kn4fein/php-semver": "^v3.0.0", "gigablah/sphinxphp": "2.0.8", "google/recaptcha": "^1.3", "jacklul/monolog-telegram": "^3.1", "josantonius/cookie": "^2.0", + "gemorroj/m3u-parser": "dev-master", + "php-curl-class/php-curl-class": "^12.0.0", "league/flysystem": "^3.28", "longman/ip-tools": "1.2.1", + "matthiasmullie/scrapbook": "^1.5.4", "monolog/monolog": "^3.4", - "nette/caching": "^3.3", - "nette/database": "^3.2", - "php-curl-class/php-curl-class": "^12.0.0", - "robmorgan/phinx": "^0.16.9", "samdark/sitemap": "2.4.1", - "symfony/mailer": "^7.3", + "symfony/finder": "^6.4", + "symfony/filesystem": "^6.4", + "symfony/event-dispatcher": "^6.4", + "symfony/mime": "^6.4", + "symfony/mailer": "^6.4", "symfony/polyfill": "v1.32.0", - "vlucas/phpdotenv": "^5.5", - "z4kn4fein/php-semver": "^v3.0.0" + "vlucas/phpdotenv": "^5.5" }, "require-dev": { - "mockery/mockery": "^1.6", - "pestphp/pest": "^3.8", - "symfony/var-dumper": "^7.3" + "symfony/var-dumper": "^6.4" }, "autoload": { "psr-4": { "TorrentPier\\": "src/" } }, - "autoload-dev": { - "psr-4": { - "Tests\\": "tests/" - } - }, "config": { "sort-packages": true, "optimize-autoloader": true, "allow-plugins": { - "pestphp/pest-plugin": true, "php-http/discovery": true } }, - "minimum-stability": "stable", + "minimum-stability": "dev", "prefer-stable": true } diff --git a/composer.lock b/composer.lock index 095574af1..9bf9af62c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "7c0b87c0c30183dc306f763c724beafc", + "content-hash": "2acad3dafd9fd57bc8c26303df22dd15", "packages": [ { "name": "arokettu/bencode", @@ -141,7 +141,7 @@ }, { "name": "arokettu/monsterid", - "version": "4.1.0", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/arokettu/monsterid.git", @@ -171,6 +171,7 @@ "squizlabs/php_codesniffer": "*", "vimeo/psalm": "^5.4 || ^6.0" }, + "default-branch": true, "type": "library", "extra": { "discovery": { @@ -285,16 +286,16 @@ }, { "name": "arokettu/torrent-file", - "version": "5.3.1", + "version": "5.3.2", "source": { "type": "git", "url": "https://github.com/arokettu/torrent-file.git", - "reference": "650ed7109bcd01dd6c4f47d129f120eb1f82ca07" + "reference": "0fba9ed15b8f60beb33a590a36db9b97d28ce171" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/arokettu/torrent-file/zipball/650ed7109bcd01dd6c4f47d129f120eb1f82ca07", - "reference": "650ed7109bcd01dd6c4f47d129f120eb1f82ca07", + "url": "https://api.github.com/repos/arokettu/torrent-file/zipball/0fba9ed15b8f60beb33a590a36db9b97d28ce171", + "reference": "0fba9ed15b8f60beb33a590a36db9b97d28ce171", "shasum": "" }, "require": { @@ -312,9 +313,9 @@ "league/event": "^3.0", "phpunit/phpunit": "^10.5.3", "psy/psysh": "*", - "sandfox.dev/code-standard": "^1.2024.07.05", + "sandfox.dev/code-standard": "^1.2025.05.07", "squizlabs/php_codesniffer": "*", - "vimeo/psalm": "^5.2" + "vimeo/psalm": "^5.2 | ^6" }, "suggest": { "ext-openssl": "for signature logic" @@ -350,7 +351,7 @@ "issues": "https://gitlab.com/sandfox/torrent-file/-/issues", "source": "https://gitlab.com/sandfox/torrent-file" }, - "time": "2024-07-28T21:43:34+00:00" + "time": "2025-06-28T21:41:10+00:00" }, { "name": "arokettu/unsigned", @@ -543,330 +544,6 @@ }, "time": "2025-03-06T12:03:07+00:00" }, - { - "name": "cakephp/chronos", - "version": "3.1.0", - "source": { - "type": "git", - "url": "https://github.com/cakephp/chronos.git", - "reference": "786d69e1ee4b735765cbdb5521b9603e9b98d650" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/chronos/zipball/786d69e1ee4b735765cbdb5521b9603e9b98d650", - "reference": "786d69e1ee4b735765cbdb5521b9603e9b98d650", - "shasum": "" - }, - "require": { - "php": ">=8.1", - "psr/clock": "^1.0" - }, - "provide": { - "psr/clock-implementation": "1.0" - }, - "require-dev": { - "cakephp/cakephp-codesniffer": "^5.0", - "phpunit/phpunit": "^10.1.0 || ^11.1.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Cake\\Chronos\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Nesbitt", - "email": "brian@nesbot.com", - "homepage": "http://nesbot.com" - }, - { - "name": "The CakePHP Team", - "homepage": "https://cakephp.org" - } - ], - "description": "A simple API extension for DateTime.", - "homepage": "https://cakephp.org", - "keywords": [ - "date", - "datetime", - "time" - ], - "support": { - "issues": "https://github.com/cakephp/chronos/issues", - "source": "https://github.com/cakephp/chronos" - }, - "time": "2024-07-18T03:18:04+00:00" - }, - { - "name": "cakephp/core", - "version": "5.2.5", - "source": { - "type": "git", - "url": "https://github.com/cakephp/core.git", - "reference": "a0a92ee7fbb7b7555dbf4ea7ff3fd4e779693da6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/core/zipball/a0a92ee7fbb7b7555dbf4ea7ff3fd4e779693da6", - "reference": "a0a92ee7fbb7b7555dbf4ea7ff3fd4e779693da6", - "shasum": "" - }, - "require": { - "cakephp/utility": "5.2.*@dev", - "league/container": "^4.2", - "php": ">=8.1", - "psr/container": "^1.1 || ^2.0" - }, - "provide": { - "psr/container-implementation": "^2.0" - }, - "suggest": { - "cakephp/cache": "To use Configure::store() and restore().", - "cakephp/event": "To use PluginApplicationInterface or plugin applications.", - "league/container": "To use Container and ServiceProvider classes" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-5.x": "5.2.x-dev" - } - }, - "autoload": { - "files": [ - "functions.php" - ], - "psr-4": { - "Cake\\Core\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/core/graphs/contributors" - } - ], - "description": "CakePHP Framework Core classes", - "homepage": "https://cakephp.org", - "keywords": [ - "cakephp", - "core", - "framework" - ], - "support": { - "forum": "https://stackoverflow.com/tags/cakephp", - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/cakephp/issues", - "source": "https://github.com/cakephp/core" - }, - "time": "2025-04-19T12:34:03+00:00" - }, - { - "name": "cakephp/database", - "version": "5.2.5", - "source": { - "type": "git", - "url": "https://github.com/cakephp/database.git", - "reference": "a6bf606b1bab532d04ea504fef8a272a1aeba287" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/database/zipball/a6bf606b1bab532d04ea504fef8a272a1aeba287", - "reference": "a6bf606b1bab532d04ea504fef8a272a1aeba287", - "shasum": "" - }, - "require": { - "cakephp/chronos": "^3.1", - "cakephp/core": "5.2.*@dev", - "cakephp/datasource": "5.2.*@dev", - "php": ">=8.1", - "psr/log": "^3.0" - }, - "require-dev": { - "cakephp/i18n": "5.2.*@dev", - "cakephp/log": "5.2.*@dev" - }, - "suggest": { - "cakephp/i18n": "If you are using locale-aware datetime formats.", - "cakephp/log": "If you want to use query logging without providing a logger yourself." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-5.x": "5.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Cake\\Database\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/database/graphs/contributors" - } - ], - "description": "Flexible and powerful Database abstraction library with a familiar PDO-like API", - "homepage": "https://cakephp.org", - "keywords": [ - "abstraction", - "cakephp", - "database", - "database abstraction", - "pdo" - ], - "support": { - "forum": "https://stackoverflow.com/tags/cakephp", - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/cakephp/issues", - "source": "https://github.com/cakephp/database" - }, - "time": "2025-06-18T02:55:13+00:00" - }, - { - "name": "cakephp/datasource", - "version": "5.2.5", - "source": { - "type": "git", - "url": "https://github.com/cakephp/datasource.git", - "reference": "f7dc4292bec0ec746db3200a5b18bb371d50dab3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/datasource/zipball/f7dc4292bec0ec746db3200a5b18bb371d50dab3", - "reference": "f7dc4292bec0ec746db3200a5b18bb371d50dab3", - "shasum": "" - }, - "require": { - "cakephp/core": "5.2.*@dev", - "php": ">=8.1", - "psr/simple-cache": "^2.0 || ^3.0" - }, - "require-dev": { - "cakephp/cache": "5.2.*@dev", - "cakephp/collection": "5.2.*@dev", - "cakephp/utility": "5.2.*@dev" - }, - "suggest": { - "cakephp/cache": "If you decide to use Query caching.", - "cakephp/collection": "If you decide to use ResultSetInterface.", - "cakephp/utility": "If you decide to use EntityTrait." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-5.x": "5.2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Cake\\Datasource\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/datasource/graphs/contributors" - } - ], - "description": "Provides connection managing and traits for Entities and Queries that can be reused for different datastores", - "homepage": "https://cakephp.org", - "keywords": [ - "cakephp", - "connection management", - "datasource", - "entity", - "query" - ], - "support": { - "forum": "https://stackoverflow.com/tags/cakephp", - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/cakephp/issues", - "source": "https://github.com/cakephp/datasource" - }, - "time": "2025-04-26T23:00:26+00:00" - }, - { - "name": "cakephp/utility", - "version": "5.2.5", - "source": { - "type": "git", - "url": "https://github.com/cakephp/utility.git", - "reference": "7eaef40766bf671332adfacdc2d6fb9ea8aea5de" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/utility/zipball/7eaef40766bf671332adfacdc2d6fb9ea8aea5de", - "reference": "7eaef40766bf671332adfacdc2d6fb9ea8aea5de", - "shasum": "" - }, - "require": { - "cakephp/core": "5.2.*@dev", - "php": ">=8.1" - }, - "suggest": { - "ext-intl": "To use Text::transliterate() or Text::slug()", - "lib-ICU": "To use Text::transliterate() or Text::slug()" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-5.x": "5.2.x-dev" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Cake\\Utility\\": "." - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/utility/graphs/contributors" - } - ], - "description": "CakePHP Utility classes such as Inflector, String, Hash, and Security", - "homepage": "https://cakephp.org", - "keywords": [ - "cakephp", - "hash", - "inflector", - "security", - "string", - "utility" - ], - "support": { - "forum": "https://stackoverflow.com/tags/cakephp", - "irc": "irc://irc.freenode.org/cakephp", - "issues": "https://github.com/cakephp/cakephp/issues", - "source": "https://github.com/cakephp/utility" - }, - "time": "2025-05-21T14:35:19+00:00" - }, { "name": "claviska/simpleimage", "version": "4.2.1", @@ -1213,16 +890,16 @@ }, { "name": "gemorroj/m3u-parser", - "version": "6.0.1", + "version": "dev-master", "source": { "type": "git", "url": "https://github.com/Gemorroj/M3uParser.git", - "reference": "92fc0fe236d77e1b5a26c735ffcb6fc637eb298a" + "reference": "95c62fd837e7adad1694d86dd8f6b31b603ab819" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Gemorroj/M3uParser/zipball/92fc0fe236d77e1b5a26c735ffcb6fc637eb298a", - "reference": "92fc0fe236d77e1b5a26c735ffcb6fc637eb298a", + "url": "https://api.github.com/repos/Gemorroj/M3uParser/zipball/95c62fd837e7adad1694d86dd8f6b31b603ab819", + "reference": "95c62fd837e7adad1694d86dd8f6b31b603ab819", "shasum": "" }, "require": { @@ -1233,6 +910,7 @@ "phpstan/phpstan": "^2.1", "phpunit/phpunit": "^9.6.22" }, + "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -1256,9 +934,9 @@ ], "support": { "issues": "https://github.com/Gemorroj/M3uParser/issues", - "source": "https://github.com/Gemorroj/M3uParser/tree/6.0.1" + "source": "https://github.com/Gemorroj/M3uParser/tree/master" }, - "time": "2025-03-25T19:21:43+00:00" + "time": "2025-05-04T19:36:03+00:00" }, { "name": "gigablah/sphinxphp", @@ -1317,16 +995,16 @@ }, { "name": "google/recaptcha", - "version": "1.3.0", + "version": "1.3.1", "source": { "type": "git", "url": "https://github.com/google/recaptcha.git", - "reference": "d59a801e98a4e9174814a6d71bbc268dff1202df" + "reference": "56522c261d2e8c58ba416c90f81a4cd9f2ed89b9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/google/recaptcha/zipball/d59a801e98a4e9174814a6d71bbc268dff1202df", - "reference": "d59a801e98a4e9174814a6d71bbc268dff1202df", + "url": "https://api.github.com/repos/google/recaptcha/zipball/56522c261d2e8c58ba416c90f81a4cd9f2ed89b9", + "reference": "56522c261d2e8c58ba416c90f81a4cd9f2ed89b9", "shasum": "" }, "require": { @@ -1365,7 +1043,7 @@ "issues": "https://github.com/google/recaptcha/issues", "source": "https://github.com/google/recaptcha" }, - "time": "2023-02-18T17:41:46+00:00" + "time": "2025-06-26T22:21:57+00:00" }, { "name": "graham-campbell/result-type", @@ -1940,100 +1618,18 @@ }, "time": "2022-09-24T15:57:16+00:00" }, - { - "name": "league/container", - "version": "4.2.5", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/container.git", - "reference": "d3cebb0ff4685ff61c749e54b27db49319e2ec00" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/container/zipball/d3cebb0ff4685ff61c749e54b27db49319e2ec00", - "reference": "d3cebb0ff4685ff61c749e54b27db49319e2ec00", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "psr/container": "^1.1 || ^2.0" - }, - "provide": { - "psr/container-implementation": "^1.0" - }, - "replace": { - "orno/di": "~2.0" - }, - "require-dev": { - "nette/php-generator": "^3.4", - "nikic/php-parser": "^4.10", - "phpstan/phpstan": "^0.12.47", - "phpunit/phpunit": "^8.5.17", - "roave/security-advisories": "dev-latest", - "scrutinizer/ocular": "^1.8", - "squizlabs/php_codesniffer": "^3.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev", - "dev-2.x": "2.x-dev", - "dev-3.x": "3.x-dev", - "dev-4.x": "4.x-dev", - "dev-master": "4.x-dev" - } - }, - "autoload": { - "psr-4": { - "League\\Container\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Phil Bennett", - "email": "mail@philbennett.co.uk", - "role": "Developer" - } - ], - "description": "A fast and intuitive dependency injection container.", - "homepage": "https://github.com/thephpleague/container", - "keywords": [ - "container", - "dependency", - "di", - "injection", - "league", - "provider", - "service" - ], - "support": { - "issues": "https://github.com/thephpleague/container/issues", - "source": "https://github.com/thephpleague/container/tree/4.2.5" - }, - "funding": [ - { - "url": "https://github.com/philipobenito", - "type": "github" - } - ], - "time": "2025-05-20T12:55:37+00:00" - }, { "name": "league/flysystem", - "version": "3.29.1", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319" + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/edc1bb7c86fab0776c3287dbd19b5fa278347319", - "reference": "edc1bb7c86fab0776c3287dbd19b5fa278347319", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/2203e3151755d874bb2943649dae1eb8533ac93e", + "reference": "2203e3151755d874bb2943649dae1eb8533ac93e", "shasum": "" }, "require": { @@ -2057,13 +1653,13 @@ "composer/semver": "^3.0", "ext-fileinfo": "*", "ext-ftp": "*", - "ext-mongodb": "^1.3", + "ext-mongodb": "^1.3|^2", "ext-zip": "*", "friendsofphp/php-cs-fixer": "^3.5", "google/cloud-storage": "^1.23", "guzzlehttp/psr7": "^2.6", "microsoft/azure-storage-blob": "^1.1", - "mongodb/mongodb": "^1.2", + "mongodb/mongodb": "^1.2|^2", "phpseclib/phpseclib": "^3.0.36", "phpstan/phpstan": "^1.10", "phpunit/phpunit": "^9.5.11|^10.0", @@ -2101,22 +1697,22 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.29.1" + "source": "https://github.com/thephpleague/flysystem/tree/3.30.0" }, - "time": "2024-10-08T08:58:34+00:00" + "time": "2025-06-25T13:29:59+00:00" }, { "name": "league/flysystem-local", - "version": "3.29.0", + "version": "3.30.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem-local.git", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27" + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/e0e8d52ce4b2ed154148453d321e97c8e931bd27", - "reference": "e0e8d52ce4b2ed154148453d321e97c8e931bd27", + "url": "https://api.github.com/repos/thephpleague/flysystem-local/zipball/6691915f77c7fb69adfb87dcd550052dc184ee10", + "reference": "6691915f77c7fb69adfb87dcd550052dc184ee10", "shasum": "" }, "require": { @@ -2150,9 +1746,9 @@ "local" ], "support": { - "source": "https://github.com/thephpleague/flysystem-local/tree/3.29.0" + "source": "https://github.com/thephpleague/flysystem-local/tree/3.30.0" }, - "time": "2024-08-09T21:24:39+00:00" + "time": "2025-05-21T10:34:19+00:00" }, { "name": "league/mime-type-detection", @@ -2270,6 +1866,105 @@ }, "time": "2016-10-23T20:08:46+00:00" }, + { + "name": "matthiasmullie/scrapbook", + "version": "1.5.4", + "source": { + "type": "git", + "url": "https://github.com/matthiasmullie/scrapbook.git", + "reference": "6ca64d54d7106deffbb98cb9c6a6f5fdb13ce1f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/matthiasmullie/scrapbook/zipball/6ca64d54d7106deffbb98cb9c6a6f5fdb13ce1f1", + "reference": "6ca64d54d7106deffbb98cb9c6a6f5fdb13ce1f1", + "shasum": "" + }, + "require": { + "php": ">=8.0.0", + "psr/cache": "^2.0||^3.0", + "psr/simple-cache": "^2.0||^3.0" + }, + "provide": { + "psr/cache-implementation": "^1.0||^2.0||^3.0", + "psr/simple-cache-implementation": "^1.0||^2.0||^3.0" + }, + "require-dev": { + "ext-pcntl": "*", + "friendsofphp/php-cs-fixer": ">=3.0", + "phpunit/phpunit": ">=10.0" + }, + "suggest": { + "couchbase/couchbase": ">=3.0", + "ext-apcu": ">=4.0.0", + "ext-couchbase": ">=3.0.0", + "ext-memcached": ">=2.0.0", + "ext-pdo": ">=0.1.0", + "ext-redis": ">=2.2.0||0.0.0.0", + "league/flysystem": ">=1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "MatthiasMullie\\Scrapbook\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthias Mullie", + "email": "scrapbook@mullie.eu", + "homepage": "https://www.mullie.eu", + "role": "Developer" + } + ], + "description": "Scrapbook is a PHP cache library, with adapters for e.g. Memcached, Redis, Couchbase, APCu, SQL and additional capabilities (e.g. transactions, stampede protection) built on top.", + "homepage": "https://scrapbook.cash", + "keywords": [ + "Buffer", + "Flysystem", + "apc", + "buffered", + "cache", + "caching", + "commit", + "couchbase", + "filesystem", + "key", + "memcached", + "mitigation", + "mysql", + "postgresql", + "protection", + "psr-16", + "psr-6", + "psr-cache", + "psr-simple-cache", + "redis", + "rollback", + "sql", + "sqlite", + "stampede", + "store", + "transaction", + "transactional", + "value" + ], + "support": { + "issues": "https://github.com/matthiasmullie/scrapbook/issues", + "source": "https://github.com/matthiasmullie/scrapbook/tree/1.5.4" + }, + "funding": [ + { + "url": "https://github.com/matthiasmullie", + "type": "github" + } + ], + "time": "2024-12-20T11:47:12+00:00" + }, { "name": "monolog/monolog", "version": "3.9.0", @@ -2373,241 +2068,6 @@ ], "time": "2025-03-24T10:02:05+00:00" }, - { - "name": "nette/caching", - "version": "v3.3.1", - "source": { - "type": "git", - "url": "https://github.com/nette/caching.git", - "reference": "b37d2c9647b41a9d04f099f10300dc5496c4eb77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/caching/zipball/b37d2c9647b41a9d04f099f10300dc5496c4eb77", - "reference": "b37d2c9647b41a9d04f099f10300dc5496c4eb77", - "shasum": "" - }, - "require": { - "nette/utils": "^4.0", - "php": "8.0 - 8.4" - }, - "conflict": { - "latte/latte": ">=3.0.0 <3.0.12" - }, - "require-dev": { - "latte/latte": "^2.11 || ^3.0.12", - "nette/di": "^3.1 || ^4.0", - "nette/tester": "^2.4", - "phpstan/phpstan": "^1.0", - "psr/simple-cache": "^2.0 || ^3.0", - "tracy/tracy": "^2.9" - }, - "suggest": { - "ext-pdo_sqlite": "to use SQLiteStorage or SQLiteJournal" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "⏱ Nette Caching: library with easy-to-use API and many cache backends.", - "homepage": "https://nette.org", - "keywords": [ - "cache", - "journal", - "memcached", - "nette", - "sqlite" - ], - "support": { - "issues": "https://github.com/nette/caching/issues", - "source": "https://github.com/nette/caching/tree/v3.3.1" - }, - "time": "2024-08-07T00:01:58+00:00" - }, - { - "name": "nette/database", - "version": "v3.2.7", - "source": { - "type": "git", - "url": "https://github.com/nette/database.git", - "reference": "10a7c76e314a06bb5f92d447d82170b5dde7392f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/database/zipball/10a7c76e314a06bb5f92d447d82170b5dde7392f", - "reference": "10a7c76e314a06bb5f92d447d82170b5dde7392f", - "shasum": "" - }, - "require": { - "ext-pdo": "*", - "nette/caching": "^3.2", - "nette/utils": "^4.0", - "php": "8.1 - 8.4" - }, - "require-dev": { - "jetbrains/phpstorm-attributes": "^1.0", - "mockery/mockery": "^1.6", - "nette/di": "^3.1", - "nette/tester": "^2.5", - "phpstan/phpstan-nette": "^1.0", - "tracy/tracy": "^2.9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "💾 Nette Database: layer with a familiar PDO-like API but much more powerful. Building queries, advanced joins, drivers for MySQL, PostgreSQL, SQLite, MS SQL Server and Oracle.", - "homepage": "https://nette.org", - "keywords": [ - "database", - "mssql", - "mysql", - "nette", - "notorm", - "oracle", - "pdo", - "postgresql", - "queries", - "sqlite" - ], - "support": { - "issues": "https://github.com/nette/database/issues", - "source": "https://github.com/nette/database/tree/v3.2.7" - }, - "time": "2025-06-03T05:00:20+00:00" - }, - { - "name": "nette/utils", - "version": "v4.0.7", - "source": { - "type": "git", - "url": "https://github.com/nette/utils.git", - "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/e67c4061eb40b9c113b218214e42cb5a0dda28f2", - "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2", - "shasum": "" - }, - "require": { - "php": "8.0 - 8.4" - }, - "conflict": { - "nette/finder": "<3", - "nette/schema": "<1.2.2" - }, - "require-dev": { - "jetbrains/phpstorm-attributes": "dev-master", - "nette/tester": "^2.5", - "phpstan/phpstan": "^1.0", - "tracy/tracy": "^2.9" - }, - "suggest": { - "ext-gd": "to use Image", - "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", - "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", - "ext-json": "to use Nette\\Utils\\Json", - "ext-mbstring": "to use Strings::lower() etc...", - "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0-only", - "GPL-3.0-only" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "https://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "https://nette.org/contributors" - } - ], - "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", - "homepage": "https://nette.org", - "keywords": [ - "array", - "core", - "datetime", - "images", - "json", - "nette", - "paginator", - "password", - "slugify", - "string", - "unicode", - "utf-8", - "utility", - "validation" - ], - "support": { - "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.7" - }, - "time": "2025-06-03T04:55:08+00:00" - }, { "name": "nikic/iter", "version": "v2.4.1", @@ -2816,26 +2276,31 @@ "time": "2024-07-20T21:41:07+00:00" }, { - "name": "psr/clock", - "version": "1.0.0", + "name": "psr/cache", + "version": "3.0.0", "source": { "type": "git", - "url": "https://github.com/php-fig/clock.git", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", - "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", "shasum": "" }, "require": { - "php": "^7.0 || ^8.0" + "php": ">=8.0.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, "autoload": { "psr-4": { - "Psr\\Clock\\": "src/" + "Psr\\Cache\\": "src/" } }, "notification-url": "https://packagist.org/downloads/", @@ -2848,20 +2313,16 @@ "homepage": "https://www.php-fig.org/" } ], - "description": "Common interface for reading the clock.", - "homepage": "https://github.com/php-fig/clock", + "description": "Common interface for caching libraries", "keywords": [ - "clock", - "now", + "cache", "psr", - "psr-20", - "time" + "psr-6" ], "support": { - "issues": "https://github.com/php-fig/clock/issues", - "source": "https://github.com/php-fig/clock/tree/1.0.0" + "source": "https://github.com/php-fig/cache/tree/3.0.0" }, - "time": "2022-11-25T14:36:26+00:00" + "time": "2021-02-03T23:26:27+00:00" }, { "name": "psr/container", @@ -3271,93 +2732,6 @@ }, "time": "2019-03-08T08:55:37+00:00" }, - { - "name": "robmorgan/phinx", - "version": "0.16.9", - "source": { - "type": "git", - "url": "https://github.com/cakephp/phinx.git", - "reference": "524ebdeb0e1838a845d752a3418726b38cd1e654" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/cakephp/phinx/zipball/524ebdeb0e1838a845d752a3418726b38cd1e654", - "reference": "524ebdeb0e1838a845d752a3418726b38cd1e654", - "shasum": "" - }, - "require": { - "cakephp/database": "^5.0.2", - "composer-runtime-api": "^2.0", - "php-64bit": ">=8.1", - "psr/container": "^1.1|^2.0", - "symfony/config": "^4.0|^5.0|^6.0|^7.0", - "symfony/console": "^6.0|^7.0" - }, - "require-dev": { - "cakephp/cakephp-codesniffer": "^5.0", - "cakephp/i18n": "^5.0", - "ext-json": "*", - "ext-pdo": "*", - "phpunit/phpunit": "^9.5.19", - "symfony/yaml": "^4.0|^5.0|^6.0|^7.0" - }, - "suggest": { - "ext-json": "Install if using JSON configuration format", - "ext-pdo": "PDO extension is needed", - "symfony/yaml": "Install if using YAML configuration format" - }, - "bin": [ - "bin/phinx" - ], - "type": "library", - "autoload": { - "psr-4": { - "Phinx\\": "src/Phinx/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rob Morgan", - "email": "robbym@gmail.com", - "homepage": "https://robmorgan.id.au", - "role": "Lead Developer" - }, - { - "name": "Woody Gilk", - "email": "woody.gilk@gmail.com", - "homepage": "https://shadowhand.me", - "role": "Developer" - }, - { - "name": "Richard Quadling", - "email": "rquadling@gmail.com", - "role": "Developer" - }, - { - "name": "CakePHP Community", - "homepage": "https://github.com/cakephp/phinx/graphs/contributors", - "role": "Developer" - } - ], - "description": "Phinx makes it ridiculously easy to manage the database migrations for your PHP app.", - "homepage": "https://phinx.org", - "keywords": [ - "database", - "database migrations", - "db", - "migrations", - "phinx" - ], - "support": { - "issues": "https://github.com/cakephp/phinx/issues", - "source": "https://github.com/cakephp/phinx/tree/0.16.9" - }, - "time": "2025-05-25T16:07:44+00:00" - }, { "name": "samdark/sitemap", "version": "2.4.1", @@ -3417,175 +2791,6 @@ ], "time": "2023-11-01T08:41:34+00:00" }, - { - "name": "symfony/config", - "version": "v7.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "ba62ae565f1327c2f6366726312ed828c85853bc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/ba62ae565f1327c2f6366726312ed828c85853bc", - "reference": "ba62ae565f1327c2f6366726312ed828c85853bc", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/filesystem": "^7.1", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/finder": "<6.4", - "symfony/service-contracts": "<2.5" - }, - "require-dev": { - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/finder": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/yaml": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/config/tree/v7.3.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-05-15T09:04:05+00:00" - }, - { - "name": "symfony/console", - "version": "v7.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/console.git", - "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/66c1440edf6f339fd82ed6c7caa76cb006211b44", - "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3", - "symfony/polyfill-mbstring": "~1.0", - "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^7.2" - }, - "conflict": { - "symfony/dependency-injection": "<6.4", - "symfony/dotenv": "<6.4", - "symfony/event-dispatcher": "<6.4", - "symfony/lock": "<6.4", - "symfony/process": "<6.4" - }, - "provide": { - "psr/log-implementation": "1.0|2.0|3.0" - }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/lock": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/stopwatch": "^6.4|^7.0", - "symfony/var-dumper": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Console\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Eases the creation of beautiful and testable command line interfaces", - "homepage": "https://symfony.com", - "keywords": [ - "cli", - "command-line", - "console", - "terminal" - ], - "support": { - "source": "https://github.com/symfony/console/tree/v7.3.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-05-24T10:34:04+00:00" - }, { "name": "symfony/deprecation-contracts", "version": "v3.6.0", @@ -3655,24 +2860,24 @@ }, { "name": "symfony/event-dispatcher", - "version": "v7.3.0", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "497f73ac996a598c92409b44ac43b6690c4f666d" + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d", - "reference": "497f73ac996a598c92409b44ac43b6690c4f666d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", "symfony/event-dispatcher-contracts": "^2.5|^3" }, "conflict": { - "symfony/dependency-injection": "<6.4", + "symfony/dependency-injection": "<5.4", "symfony/service-contracts": "<2.5" }, "provide": { @@ -3681,13 +2886,13 @@ }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/error-handler": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", "symfony/service-contracts": "^2.5|^3", - "symfony/stopwatch": "^6.4|^7.0" + "symfony/stopwatch": "^5.4|^6.0|^7.0" }, "type": "library", "autoload": { @@ -3715,7 +2920,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.13" }, "funding": [ { @@ -3731,7 +2936,7 @@ "type": "tidelift" } ], - "time": "2025-04-22T09:11:45+00:00" + "time": "2024-09-25T14:18:03+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -3811,25 +3016,25 @@ }, { "name": "symfony/filesystem", - "version": "v7.3.0", + "version": "v6.4.13", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb" + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb", - "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/4856c9cf585d5a0313d8d35afd681a526f038dd3", + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-mbstring": "~1.8" }, "require-dev": { - "symfony/process": "^6.4|^7.0" + "symfony/process": "^5.4|^6.4|^7.0" }, "type": "library", "autoload": { @@ -3857,7 +3062,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v7.3.0" + "source": "https://github.com/symfony/filesystem/tree/v6.4.13" }, "funding": [ { @@ -3873,27 +3078,27 @@ "type": "tidelift" } ], - "time": "2024-10-25T15:15:23+00:00" + "time": "2024-10-25T15:07:50+00:00" }, { "name": "symfony/finder", - "version": "v7.3.0", + "version": "v6.4.17", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d" + "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ec2344cf77a48253bbca6939aa3d2477773ea63d", - "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d", + "url": "https://api.github.com/repos/symfony/finder/zipball/1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7", + "reference": "1d0e8266248c5d9ab6a87e3789e6dc482af3c9c7", "shasum": "" }, "require": { - "php": ">=8.2" + "php": ">=8.1" }, "require-dev": { - "symfony/filesystem": "^6.4|^7.0" + "symfony/filesystem": "^6.0|^7.0" }, "type": "library", "autoload": { @@ -3921,7 +3126,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.3.0" + "source": "https://github.com/symfony/finder/tree/v6.4.17" }, "funding": [ { @@ -3937,43 +3142,43 @@ "type": "tidelift" } ], - "time": "2024-12-30T19:00:26+00:00" + "time": "2024-12-29T13:51:37+00:00" }, { "name": "symfony/mailer", - "version": "v7.3.0", + "version": "v6.4.23", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "0f375bbbde96ae8c78e4aa3e63aabd486e33364c" + "reference": "a480322ddf8e54de262c9bca31fdcbe26b553de5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/0f375bbbde96ae8c78e4aa3e63aabd486e33364c", - "reference": "0f375bbbde96ae8c78e4aa3e63aabd486e33364c", + "url": "https://api.github.com/repos/symfony/mailer/zipball/a480322ddf8e54de262c9bca31fdcbe26b553de5", + "reference": "a480322ddf8e54de262c9bca31fdcbe26b553de5", "shasum": "" }, "require": { "egulias/email-validator": "^2.1.10|^3|^4", - "php": ">=8.2", + "php": ">=8.1", "psr/event-dispatcher": "^1", "psr/log": "^1|^2|^3", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/mime": "^7.2", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/mime": "^6.2|^7.0", "symfony/service-contracts": "^2.5|^3" }, "conflict": { "symfony/http-client-contracts": "<2.5", - "symfony/http-kernel": "<6.4", - "symfony/messenger": "<6.4", - "symfony/mime": "<6.4", - "symfony/twig-bridge": "<6.4" + "symfony/http-kernel": "<5.4", + "symfony/messenger": "<6.2", + "symfony/mime": "<6.2", + "symfony/twig-bridge": "<6.2.1" }, "require-dev": { - "symfony/console": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/messenger": "^6.4|^7.0", - "symfony/twig-bridge": "^6.4|^7.0" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/messenger": "^6.2|^7.0", + "symfony/twig-bridge": "^6.2|^7.0" }, "type": "library", "autoload": { @@ -4001,7 +3206,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.3.0" + "source": "https://github.com/symfony/mailer/tree/v6.4.23" }, "funding": [ { @@ -4017,24 +3222,25 @@ "type": "tidelift" } ], - "time": "2025-04-04T09:51:09+00:00" + "time": "2025-06-26T21:24:02+00:00" }, { "name": "symfony/mime", - "version": "v7.3.0", + "version": "v6.4.21", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9" + "reference": "fec8aa5231f3904754955fad33c2db50594d22d1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9", - "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9", + "url": "https://api.github.com/repos/symfony/mime/zipball/fec8aa5231f3904754955fad33c2db50594d22d1", + "reference": "fec8aa5231f3904754955fad33c2db50594d22d1", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0" }, @@ -4042,17 +3248,17 @@ "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<6.4", + "symfony/mailer": "<5.4", "symfony/serializer": "<6.4.3|>7.0,<7.0.3" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/property-access": "^6.4|^7.0", - "symfony/property-info": "^6.4|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", "symfony/serializer": "^6.4.3|^7.0.3" }, "type": "library", @@ -4085,7 +3291,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.3.0" + "source": "https://github.com/symfony/mime/tree/v6.4.21" }, "funding": [ { @@ -4101,7 +3307,7 @@ "type": "tidelift" } ], - "time": "2025-02-19T08:51:26+00:00" + "time": "2025-04-27T13:27:38+00:00" }, { "name": "symfony/polyfill", @@ -4303,93 +3509,6 @@ ], "time": "2025-04-25T09:37:31+00:00" }, - { - "name": "symfony/string", - "version": "v7.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/string.git", - "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125", - "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-intl-grapheme": "~1.0", - "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0" - }, - "conflict": { - "symfony/translation-contracts": "<2.5" - }, - "require-dev": { - "symfony/emoji": "^7.1", - "symfony/error-handler": "^6.4|^7.0", - "symfony/http-client": "^6.4|^7.0", - "symfony/intl": "^6.4|^7.0", - "symfony/translation-contracts": "^2.5|^3.0", - "symfony/var-exporter": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "files": [ - "Resources/functions.php" - ], - "psr-4": { - "Symfony\\Component\\String\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", - "homepage": "https://symfony.com", - "keywords": [ - "grapheme", - "i18n", - "string", - "unicode", - "utf-8", - "utf8" - ], - "support": { - "source": "https://github.com/symfony/string/tree/v7.3.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-04-20T20:19:01+00:00" - }, { "name": "vlucas/phpdotenv", "version": "v5.6.2", @@ -4530,2886 +3649,36 @@ } ], "packages-dev": [ - { - "name": "brianium/paratest", - "version": "v7.8.3", - "source": { - "type": "git", - "url": "https://github.com/paratestphp/paratest.git", - "reference": "a585c346ddf1bec22e51e20b5387607905604a71" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/a585c346ddf1bec22e51e20b5387607905604a71", - "reference": "a585c346ddf1bec22e51e20b5387607905604a71", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-simplexml": "*", - "fidry/cpu-core-counter": "^1.2.0", - "jean85/pretty-package-versions": "^2.1.0", - "php": "~8.2.0 || ~8.3.0 || ~8.4.0", - "phpunit/php-code-coverage": "^11.0.9 || ^12.0.4", - "phpunit/php-file-iterator": "^5.1.0 || ^6", - "phpunit/php-timer": "^7.0.1 || ^8", - "phpunit/phpunit": "^11.5.11 || ^12.0.6", - "sebastian/environment": "^7.2.0 || ^8", - "symfony/console": "^6.4.17 || ^7.2.1", - "symfony/process": "^6.4.19 || ^7.2.4" - }, - "require-dev": { - "doctrine/coding-standard": "^12.0.0", - "ext-pcov": "*", - "ext-posix": "*", - "phpstan/phpstan": "^2.1.6", - "phpstan/phpstan-deprecation-rules": "^2.0.1", - "phpstan/phpstan-phpunit": "^2.0.4", - "phpstan/phpstan-strict-rules": "^2.0.3", - "squizlabs/php_codesniffer": "^3.11.3", - "symfony/filesystem": "^6.4.13 || ^7.2.0" - }, - "bin": [ - "bin/paratest", - "bin/paratest_for_phpstorm" - ], - "type": "library", - "autoload": { - "psr-4": { - "ParaTest\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Brian Scaturro", - "email": "scaturrob@gmail.com", - "role": "Developer" - }, - { - "name": "Filippo Tessarotto", - "email": "zoeslam@gmail.com", - "role": "Developer" - } - ], - "description": "Parallel testing for PHP", - "homepage": "https://github.com/paratestphp/paratest", - "keywords": [ - "concurrent", - "parallel", - "phpunit", - "testing" - ], - "support": { - "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.8.3" - }, - "funding": [ - { - "url": "https://github.com/sponsors/Slamdunk", - "type": "github" - }, - { - "url": "https://paypal.me/filippotessarotto", - "type": "paypal" - } - ], - "time": "2025-03-05T08:29:11+00:00" - }, - { - "name": "doctrine/deprecations", - "version": "1.1.5", - "source": { - "type": "git", - "url": "https://github.com/doctrine/deprecations.git", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "phpunit/phpunit": "<=7.5 || >=13" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^12 || ^13", - "phpstan/phpstan": "1.4.10 || 2.1.11", - "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", - "psr/log": "^1 || ^2 || ^3" - }, - "suggest": { - "psr/log": "Allows logging deprecations via PSR-3 logger implementation" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Deprecations\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", - "homepage": "https://www.doctrine-project.org/", - "support": { - "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.5" - }, - "time": "2025-04-07T20:06:18+00:00" - }, - { - "name": "fidry/cpu-core-counter", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/theofidry/cpu-core-counter.git", - "reference": "8520451a140d3f46ac33042715115e290cf5785f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", - "reference": "8520451a140d3f46ac33042715115e290cf5785f", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "require-dev": { - "fidry/makefile": "^0.2.0", - "fidry/php-cs-fixer-config": "^1.1.2", - "phpstan/extension-installer": "^1.2.0", - "phpstan/phpstan": "^1.9.2", - "phpstan/phpstan-deprecation-rules": "^1.0.0", - "phpstan/phpstan-phpunit": "^1.2.2", - "phpstan/phpstan-strict-rules": "^1.4.4", - "phpunit/phpunit": "^8.5.31 || ^9.5.26", - "webmozarts/strict-phpunit": "^7.5" - }, - "type": "library", - "autoload": { - "psr-4": { - "Fidry\\CpuCoreCounter\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Théo FIDRY", - "email": "theo.fidry@gmail.com" - } - ], - "description": "Tiny utility to get the number of CPU cores.", - "keywords": [ - "CPU", - "core" - ], - "support": { - "issues": "https://github.com/theofidry/cpu-core-counter/issues", - "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" - }, - "funding": [ - { - "url": "https://github.com/theofidry", - "type": "github" - } - ], - "time": "2024-08-06T10:04:20+00:00" - }, - { - "name": "hamcrest/hamcrest-php", - "version": "v2.1.1", - "source": { - "type": "git", - "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", - "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", - "shasum": "" - }, - "require": { - "php": "^7.4|^8.0" - }, - "replace": { - "cordoval/hamcrest-php": "*", - "davedevelopment/hamcrest-php": "*", - "kodova/hamcrest-php": "*" - }, - "require-dev": { - "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.1-dev" - } - }, - "autoload": { - "classmap": [ - "hamcrest" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "This is the PHP port of Hamcrest Matchers", - "keywords": [ - "test" - ], - "support": { - "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" - }, - "time": "2025-04-30T06:54:44+00:00" - }, - { - "name": "jean85/pretty-package-versions", - "version": "2.1.1", - "source": { - "type": "git", - "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/4d7aa5dab42e2a76d99559706022885de0e18e1a", - "reference": "4d7aa5dab42e2a76d99559706022885de0e18e1a", - "shasum": "" - }, - "require": { - "composer-runtime-api": "^2.1.0", - "php": "^7.4|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "jean85/composer-provided-replaced-stub-package": "^1.0", - "phpstan/phpstan": "^2.0", - "phpunit/phpunit": "^7.5|^8.5|^9.6", - "rector/rector": "^2.0", - "vimeo/psalm": "^4.3 || ^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Jean85\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alessandro Lai", - "email": "alessandro.lai85@gmail.com" - } - ], - "description": "A library to get pretty versions strings of installed dependencies", - "keywords": [ - "composer", - "package", - "release", - "versions" - ], - "support": { - "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/2.1.1" - }, - "time": "2025-03-19T14:43:43+00:00" - }, - { - "name": "mockery/mockery", - "version": "1.6.12", - "source": { - "type": "git", - "url": "https://github.com/mockery/mockery.git", - "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/1f4efdd7d3beafe9807b08156dfcb176d18f1699", - "reference": "1f4efdd7d3beafe9807b08156dfcb176d18f1699", - "shasum": "" - }, - "require": { - "hamcrest/hamcrest-php": "^2.0.1", - "lib-pcre": ">=7.0", - "php": ">=7.3" - }, - "conflict": { - "phpunit/phpunit": "<8.0" - }, - "require-dev": { - "phpunit/phpunit": "^8.5 || ^9.6.17", - "symplify/easy-coding-standard": "^12.1.14" - }, - "type": "library", - "autoload": { - "files": [ - "library/helpers.php", - "library/Mockery.php" - ], - "psr-4": { - "Mockery\\": "library/Mockery" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Pádraic Brady", - "email": "padraic.brady@gmail.com", - "homepage": "https://github.com/padraic", - "role": "Author" - }, - { - "name": "Dave Marshall", - "email": "dave.marshall@atstsolutions.co.uk", - "homepage": "https://davedevelopment.co.uk", - "role": "Developer" - }, - { - "name": "Nathanael Esayeas", - "email": "nathanael.esayeas@protonmail.com", - "homepage": "https://github.com/ghostwriter", - "role": "Lead Developer" - } - ], - "description": "Mockery is a simple yet flexible PHP mock object framework", - "homepage": "https://github.com/mockery/mockery", - "keywords": [ - "BDD", - "TDD", - "library", - "mock", - "mock objects", - "mockery", - "stub", - "test", - "test double", - "testing" - ], - "support": { - "docs": "https://docs.mockery.io/", - "issues": "https://github.com/mockery/mockery/issues", - "rss": "https://github.com/mockery/mockery/releases.atom", - "security": "https://github.com/mockery/mockery/security/advisories", - "source": "https://github.com/mockery/mockery" - }, - "time": "2024-05-16T03:13:13+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.13.1", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2025-04-29T12:36:36+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v5.5.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "ae59794362fe85e051a58ad36b289443f57be7a9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9", - "reference": "ae59794362fe85e051a58ad36b289443f57be7a9", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0" - }, - "time": "2025-05-31T08:24:38+00:00" - }, - { - "name": "nunomaduro/collision", - "version": "v8.8.1", - "source": { - "type": "git", - "url": "https://github.com/nunomaduro/collision.git", - "reference": "44ccb82e3e21efb5446748d2a3c81a030ac22bd5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/44ccb82e3e21efb5446748d2a3c81a030ac22bd5", - "reference": "44ccb82e3e21efb5446748d2a3c81a030ac22bd5", - "shasum": "" - }, - "require": { - "filp/whoops": "^2.18.1", - "nunomaduro/termwind": "^2.3.1", - "php": "^8.2.0", - "symfony/console": "^7.3.0" - }, - "conflict": { - "laravel/framework": "<11.44.2 || >=13.0.0", - "phpunit/phpunit": "<11.5.15 || >=13.0.0" - }, - "require-dev": { - "brianium/paratest": "^7.8.3", - "larastan/larastan": "^3.4.2", - "laravel/framework": "^11.44.2 || ^12.18", - "laravel/pint": "^1.22.1", - "laravel/sail": "^1.43.1", - "laravel/sanctum": "^4.1.1", - "laravel/tinker": "^2.10.1", - "orchestra/testbench-core": "^9.12.0 || ^10.4", - "pestphp/pest": "^3.8.2", - "sebastian/environment": "^7.2.1 || ^8.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" - ] - }, - "branch-alias": { - "dev-8.x": "8.x-dev" - } - }, - "autoload": { - "files": [ - "./src/Adapters/Phpunit/Autoload.php" - ], - "psr-4": { - "NunoMaduro\\Collision\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Cli error handling for console/command-line PHP applications.", - "keywords": [ - "artisan", - "cli", - "command-line", - "console", - "dev", - "error", - "handling", - "laravel", - "laravel-zero", - "php", - "symfony" - ], - "support": { - "issues": "https://github.com/nunomaduro/collision/issues", - "source": "https://github.com/nunomaduro/collision" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" - } - ], - "time": "2025-06-11T01:04:21+00:00" - }, - { - "name": "nunomaduro/termwind", - "version": "v2.3.1", - "source": { - "type": "git", - "url": "https://github.com/nunomaduro/termwind.git", - "reference": "dfa08f390e509967a15c22493dc0bac5733d9123" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/dfa08f390e509967a15c22493dc0bac5733d9123", - "reference": "dfa08f390e509967a15c22493dc0bac5733d9123", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": "^8.2", - "symfony/console": "^7.2.6" - }, - "require-dev": { - "illuminate/console": "^11.44.7", - "laravel/pint": "^1.22.0", - "mockery/mockery": "^1.6.12", - "pestphp/pest": "^2.36.0 || ^3.8.2", - "phpstan/phpstan": "^1.12.25", - "phpstan/phpstan-strict-rules": "^1.6.2", - "symfony/var-dumper": "^7.2.6", - "thecodingmachine/phpstan-strict-rules": "^1.0.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Termwind\\Laravel\\TermwindServiceProvider" - ] - }, - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "files": [ - "src/Functions.php" - ], - "psr-4": { - "Termwind\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Its like Tailwind CSS, but for the console.", - "keywords": [ - "cli", - "console", - "css", - "package", - "php", - "style" - ], - "support": { - "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.3.1" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://github.com/xiCO2k", - "type": "github" - } - ], - "time": "2025-05-08T08:14:37+00:00" - }, - { - "name": "pestphp/pest", - "version": "v3.8.2", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest.git", - "reference": "c6244a8712968dbac88eb998e7ff3b5caa556b0d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/c6244a8712968dbac88eb998e7ff3b5caa556b0d", - "reference": "c6244a8712968dbac88eb998e7ff3b5caa556b0d", - "shasum": "" - }, - "require": { - "brianium/paratest": "^7.8.3", - "nunomaduro/collision": "^8.8.0", - "nunomaduro/termwind": "^2.3.0", - "pestphp/pest-plugin": "^3.0.0", - "pestphp/pest-plugin-arch": "^3.1.0", - "pestphp/pest-plugin-mutate": "^3.0.5", - "php": "^8.2.0", - "phpunit/phpunit": "^11.5.15" - }, - "conflict": { - "filp/whoops": "<2.16.0", - "phpunit/phpunit": ">11.5.15", - "sebastian/exporter": "<6.0.0", - "webmozart/assert": "<1.11.0" - }, - "require-dev": { - "pestphp/pest-dev-tools": "^3.4.0", - "pestphp/pest-plugin-type-coverage": "^3.5.0", - "symfony/process": "^7.2.5" - }, - "bin": [ - "bin/pest" - ], - "type": "library", - "extra": { - "pest": { - "plugins": [ - "Pest\\Mutate\\Plugins\\Mutate", - "Pest\\Plugins\\Configuration", - "Pest\\Plugins\\Bail", - "Pest\\Plugins\\Cache", - "Pest\\Plugins\\Coverage", - "Pest\\Plugins\\Init", - "Pest\\Plugins\\Environment", - "Pest\\Plugins\\Help", - "Pest\\Plugins\\Memory", - "Pest\\Plugins\\Only", - "Pest\\Plugins\\Printer", - "Pest\\Plugins\\ProcessIsolation", - "Pest\\Plugins\\Profile", - "Pest\\Plugins\\Retry", - "Pest\\Plugins\\Snapshot", - "Pest\\Plugins\\Verbose", - "Pest\\Plugins\\Version", - "Pest\\Plugins\\Parallel" - ] - }, - "phpstan": { - "includes": [ - "extension.neon" - ] - } - }, - "autoload": { - "files": [ - "src/Functions.php", - "src/Pest.php" - ], - "psr-4": { - "Pest\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "The elegant PHP Testing Framework.", - "keywords": [ - "framework", - "pest", - "php", - "test", - "testing", - "unit" - ], - "support": { - "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v3.8.2" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - } - ], - "time": "2025-04-17T10:53:02+00:00" - }, - { - "name": "pestphp/pest-plugin", - "version": "v3.0.0", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest-plugin.git", - "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/e79b26c65bc11c41093b10150c1341cc5cdbea83", - "reference": "e79b26c65bc11c41093b10150c1341cc5cdbea83", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^2.0.0", - "composer-runtime-api": "^2.2.2", - "php": "^8.2" - }, - "conflict": { - "pestphp/pest": "<3.0.0" - }, - "require-dev": { - "composer/composer": "^2.7.9", - "pestphp/pest": "^3.0.0", - "pestphp/pest-dev-tools": "^3.0.0" - }, - "type": "composer-plugin", - "extra": { - "class": "Pest\\Plugin\\Manager" - }, - "autoload": { - "psr-4": { - "Pest\\Plugin\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The Pest plugin manager", - "keywords": [ - "framework", - "manager", - "pest", - "php", - "plugin", - "test", - "testing", - "unit" - ], - "support": { - "source": "https://github.com/pestphp/pest-plugin/tree/v3.0.0" - }, - "funding": [ - { - "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - }, - { - "url": "https://www.patreon.com/nunomaduro", - "type": "patreon" - } - ], - "time": "2024-09-08T23:21:41+00:00" - }, - { - "name": "pestphp/pest-plugin-arch", - "version": "v3.1.1", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest-plugin-arch.git", - "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/db7bd9cb1612b223e16618d85475c6f63b9c8daa", - "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa", - "shasum": "" - }, - "require": { - "pestphp/pest-plugin": "^3.0.0", - "php": "^8.2", - "ta-tikoma/phpunit-architecture-test": "^0.8.4" - }, - "require-dev": { - "pestphp/pest": "^3.8.1", - "pestphp/pest-dev-tools": "^3.4.0" - }, - "type": "library", - "extra": { - "pest": { - "plugins": [ - "Pest\\Arch\\Plugin" - ] - } - }, - "autoload": { - "files": [ - "src/Autoload.php" - ], - "psr-4": { - "Pest\\Arch\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "The Arch plugin for Pest PHP.", - "keywords": [ - "arch", - "architecture", - "framework", - "pest", - "php", - "plugin", - "test", - "testing", - "unit" - ], - "support": { - "source": "https://github.com/pestphp/pest-plugin-arch/tree/v3.1.1" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - } - ], - "time": "2025-04-16T22:59:48+00:00" - }, - { - "name": "pestphp/pest-plugin-mutate", - "version": "v3.0.5", - "source": { - "type": "git", - "url": "https://github.com/pestphp/pest-plugin-mutate.git", - "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-mutate/zipball/e10dbdc98c9e2f3890095b4fe2144f63a5717e08", - "reference": "e10dbdc98c9e2f3890095b4fe2144f63a5717e08", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^5.2.0", - "pestphp/pest-plugin": "^3.0.0", - "php": "^8.2", - "psr/simple-cache": "^3.0.0" - }, - "require-dev": { - "pestphp/pest": "^3.0.8", - "pestphp/pest-dev-tools": "^3.0.0", - "pestphp/pest-plugin-type-coverage": "^3.0.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Pest\\Mutate\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Sandro Gehri", - "email": "sandrogehri@gmail.com" - } - ], - "description": "Mutates your code to find untested cases", - "keywords": [ - "framework", - "mutate", - "mutation", - "pest", - "php", - "plugin", - "test", - "testing", - "unit" - ], - "support": { - "source": "https://github.com/pestphp/pest-plugin-mutate/tree/v3.0.5" - }, - "funding": [ - { - "url": "https://www.paypal.com/paypalme/enunomaduro", - "type": "custom" - }, - { - "url": "https://github.com/gehrisandro", - "type": "github" - }, - { - "url": "https://github.com/nunomaduro", - "type": "github" - } - ], - "time": "2024-09-22T07:54:40+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" - }, - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.6.2", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", - "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.1", - "ext-filter": "*", - "php": "^7.4 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.7", - "phpstan/phpdoc-parser": "^1.7|^2.0", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.5 || ~1.6.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-webmozart-assert": "^1.2", - "phpunit/phpunit": "^9.5", - "psalm/phar": "^5.26" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2" - }, - "time": "2025-04-13T19:20:35+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a", - "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a", - "shasum": "" - }, - "require": { - "doctrine/deprecations": "^1.0", - "php": "^7.3 || ^8.0", - "phpdocumentor/reflection-common": "^2.0", - "phpstan/phpdoc-parser": "^1.18|^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "phpbench/phpbench": "^1.2", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.13.9", - "vimeo/psalm": "^4.25" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0" - }, - "time": "2024-11-09T15:12:26+00:00" - }, - { - "name": "phpstan/phpdoc-parser", - "version": "2.1.0", - "source": { - "type": "git", - "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", - "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68", - "shasum": "" - }, - "require": { - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "doctrine/annotations": "^2.0", - "nikic/php-parser": "^5.3.0", - "php-parallel-lint/php-parallel-lint": "^1.2", - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^2.0", - "phpstan/phpstan-phpunit": "^2.0", - "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^9.6", - "symfony/process": "^5.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPStan\\PhpDocParser\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "PHPDoc parser with support for nullable, intersection and generic types", - "support": { - "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0" - }, - "time": "2025-02-19T13:28:12+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "11.0.10", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "1a800a7446add2d79cc6b3c01c45381810367d76" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1a800a7446add2d79cc6b3c01c45381810367d76", - "reference": "1a800a7446add2d79cc6b3c01c45381810367d76", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^5.4.0", - "php": ">=8.2", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-text-template": "^4.0.1", - "sebastian/code-unit-reverse-lookup": "^4.0.1", - "sebastian/complexity": "^4.0.1", - "sebastian/environment": "^7.2.0", - "sebastian/lines-of-code": "^3.0.1", - "sebastian/version": "^5.0.2", - "theseer/tokenizer": "^1.2.3" - }, - "require-dev": { - "phpunit/phpunit": "^11.5.2" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "11.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/show" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", - "type": "tidelift" - } - ], - "time": "2025-06-18T08:56:18+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "5.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-08-27T05:02:59+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "5.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^11.0" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:07:44+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:08:43+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "7.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "7.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:09:35+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "11.5.15", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c", - "reference": "4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.0", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.9", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-invoker": "^5.0.1", - "phpunit/php-text-template": "^4.0.1", - "phpunit/php-timer": "^7.0.1", - "sebastian/cli-parser": "^3.0.2", - "sebastian/code-unit": "^3.0.3", - "sebastian/comparator": "^6.3.1", - "sebastian/diff": "^6.0.2", - "sebastian/environment": "^7.2.0", - "sebastian/exporter": "^6.3.0", - "sebastian/global-state": "^7.0.2", - "sebastian/object-enumerator": "^6.0.1", - "sebastian/type": "^5.1.2", - "sebastian/version": "^5.0.2", - "staabm/side-effects-detector": "^1.0.5" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "11.5-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.15" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "time": "2025-03-23T16:02:11+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:41:36+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "security": "https://github.com/sebastianbergmann/code-unit/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2025-03-19T07:56:08+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:45:54+00:00" - }, - { - "name": "sebastian/comparator", - "version": "6.3.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/24b8fbc2c8e201bb1308e7b05148d6ab393b6959", - "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/diff": "^6.0", - "sebastian/exporter": "^6.0" - }, - "require-dev": { - "phpunit/phpunit": "^11.4" - }, - "suggest": { - "ext-bcmath": "For comparing BcMath\\Number objects" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2025-03-07T06:57:01+00:00" - }, - { - "name": "sebastian/complexity", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^5.0", - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:49:50+00:00" - }, - { - "name": "sebastian/diff", - "version": "6.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0", - "symfony/process": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:53:05+00:00" - }, - { - "name": "sebastian/environment", - "version": "7.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.3" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "7.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", - "type": "tidelift" - } - ], - "time": "2025-05-21T11:55:47+00:00" - }, - { - "name": "sebastian/exporter", - "version": "6.3.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/recursion-context": "^6.0" - }, - "require-dev": { - "phpunit/phpunit": "^11.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-12-05T09:17:50+00:00" - }, - { - "name": "sebastian/global-state", - "version": "7.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "7.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:57:36+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^5.0", - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:58:38+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "6.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:00:13+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:01:32+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "6.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:10:34+00:00" - }, - { - "name": "sebastian/type", - "version": "5.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", - "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.1.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2025-03-18T13:35:50+00:00" - }, - { - "name": "sebastian/version", - "version": "5.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-10-09T05:16:32+00:00" - }, - { - "name": "staabm/side-effects-detector", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/staabm/side-effects-detector.git", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12.6", - "phpunit/phpunit": "^9.6.21", - "symfony/var-dumper": "^5.4.43", - "tomasvotruba/type-coverage": "1.0.0", - "tomasvotruba/unused-public": "1.0.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "lib/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A static analysis tool to detect side effects in PHP code", - "keywords": [ - "static analysis" - ], - "support": { - "issues": "https://github.com/staabm/side-effects-detector/issues", - "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" - }, - "funding": [ - { - "url": "https://github.com/staabm", - "type": "github" - } - ], - "time": "2024-10-20T05:08:20+00:00" - }, - { - "name": "symfony/process", - "version": "v7.3.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", - "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Process\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Executes commands in sub-processes", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/process/tree/v7.3.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-04-17T09:11:12+00:00" - }, { "name": "symfony/var-dumper", - "version": "v7.3.0", + "version": "v6.4.23", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "548f6760c54197b1084e1e5c71f6d9d523f2f78e" + "reference": "d55b1834cdbfcc31bc2cd7e095ba5ed9a88f6600" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/548f6760c54197b1084e1e5c71f6d9d523f2f78e", - "reference": "548f6760c54197b1084e1e5c71f6d9d523f2f78e", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/d55b1834cdbfcc31bc2cd7e095ba5ed9a88f6600", + "reference": "d55b1834cdbfcc31bc2cd7e095ba5ed9a88f6600", "shasum": "" }, "require": { - "php": ">=8.2", + "php": ">=8.1", "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { - "symfony/console": "<6.4" + "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^6.4|^7.0", - "symfony/http-kernel": "^6.4|^7.0", - "symfony/process": "^6.4|^7.0", - "symfony/uid": "^6.4|^7.0", - "twig/twig": "^3.12" + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^6.3|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/uid": "^5.4|^6.0|^7.0", + "twig/twig": "^2.13|^3.0.4" }, "bin": [ "Resources/bin/var-dump-server" @@ -7447,7 +3716,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.3.0" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.23" }, "funding": [ { @@ -7463,183 +3732,19 @@ "type": "tidelift" } ], - "time": "2025-04-27T18:39:23+00:00" - }, - { - "name": "ta-tikoma/phpunit-architecture-test", - "version": "0.8.5", - "source": { - "type": "git", - "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", - "reference": "cf6fb197b676ba716837c886baca842e4db29005" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/cf6fb197b676ba716837c886baca842e4db29005", - "reference": "cf6fb197b676ba716837c886baca842e4db29005", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^4.18.0 || ^5.0.0", - "php": "^8.1.0", - "phpdocumentor/reflection-docblock": "^5.3.0", - "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0", - "symfony/finder": "^6.4.0 || ^7.0.0" - }, - "require-dev": { - "laravel/pint": "^1.13.7", - "phpstan/phpstan": "^1.10.52" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPUnit\\Architecture\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Ni Shi", - "email": "futik0ma011@gmail.com" - }, - { - "name": "Nuno Maduro", - "email": "enunomaduro@gmail.com" - } - ], - "description": "Methods for testing application architecture", - "keywords": [ - "architecture", - "phpunit", - "stucture", - "test", - "testing" - ], - "support": { - "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", - "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.5" - }, - "time": "2025-04-20T20:23:40+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.3", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:36:25+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.11.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", - "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.11.0" - }, - "time": "2022-06-03T18:03:27+00:00" + "time": "2025-06-27T15:05:27+00:00" } ], "aliases": [], - "minimum-stability": "stable", - "stability-flags": {}, + "minimum-stability": "dev", + "stability-flags": { + "arokettu/monsterid": 20, + "gemorroj/m3u-parser": 20 + }, "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": ">=8.2" + "php": ">=8.1" }, "platform-dev": {}, "plugin-api-version": "2.6.0" diff --git a/dl.php b/dl.php index bfc0ef678..2812f1fa0 100644 --- a/dl.php +++ b/dl.php @@ -25,7 +25,7 @@ $m3u = isset($_GET['m3u']) && $_GET['m3u']; // Send file to browser function send_file_to_browser($attachment, $upload_dir) { - global $lang; + global $bb_cfg, $lang; $filename = $upload_dir . '/' . $attachment['physical_filename']; $gotit = false; @@ -170,7 +170,7 @@ if (!IS_AM && ($attachment['mimetype'] === TORRENT_MIMETYPE)) { $row = DB()->sql_fetchrow($result); - if (isset(config()->get('tor_frozen')[$row['tor_status']]) && !(isset(config()->get('tor_frozen_author_download')[$row['tor_status']]) && $userdata['user_id'] === $row['poster_id'])) { + if (isset($bb_cfg['tor_frozen'][$row['tor_status']]) && !(isset($bb_cfg['tor_frozen_author_download'][$row['tor_status']]) && $userdata['user_id'] === $row['poster_id'])) { bb_die($lang['TOR_STATUS_FORBIDDEN'] . $lang['TOR_STATUS_NAME'][$row['tor_status']]); } @@ -219,7 +219,7 @@ switch ($download_mode) { header('Location: ' . $url); exit; case INLINE_LINK: - if (IS_GUEST && !config()->get('captcha.disabled') && !bb_captcha('check')) { + if (IS_GUEST && !$bb_cfg['captcha']['disabled'] && !bb_captcha('check')) { global $template; $redirect_url = $_POST['redirect_url'] ?? $_SERVER['HTTP_REFERER'] ?? '/'; diff --git a/feed.php b/feed.php index bbd9eb3e0..366518ef0 100644 --- a/feed.php +++ b/feed.php @@ -34,11 +34,11 @@ if ($mode === 'get_feed_url' && ($type === 'f' || $type === 'u') && $id >= 0) { bb_simple_die($lang['ATOM_ERROR'] . ' #1'); } } - if (is_file(config()->get('atom.path') . '/f/' . $id . '.atom') && filemtime(config()->get('atom.path') . '/f/' . $id . '.atom') > $timecheck) { - redirect(config()->get('atom.url') . '/f/' . $id . '.atom'); + if (is_file($bb_cfg['atom']['path'] . '/f/' . $id . '.atom') && filemtime($bb_cfg['atom']['path'] . '/f/' . $id . '.atom') > $timecheck) { + redirect($bb_cfg['atom']['url'] . '/f/' . $id . '.atom'); } else { if (\TorrentPier\Legacy\Atom::update_forum_feed($id, $forum_data)) { - redirect(config()->get('atom.url') . '/f/' . $id . '.atom'); + redirect($bb_cfg['atom']['url'] . '/f/' . $id . '.atom'); } else { bb_simple_die($lang['ATOM_NO_FORUM']); } @@ -52,11 +52,11 @@ if ($mode === 'get_feed_url' && ($type === 'f' || $type === 'u') && $id >= 0) { if (!$username = get_username($id)) { bb_simple_die($lang['ATOM_ERROR'] . ' #3'); } - if (is_file(config()->get('atom.path') . '/u/' . floor($id / 5000) . '/' . ($id % 100) . '/' . $id . '.atom') && filemtime(config()->get('atom.path') . '/u/' . floor($id / 5000) . '/' . ($id % 100) . '/' . $id . '.atom') > $timecheck) { - redirect(config()->get('atom.url') . '/u/' . floor($id / 5000) . '/' . ($id % 100) . '/' . $id . '.atom'); + if (is_file($bb_cfg['atom']['path'] . '/u/' . floor($id / 5000) . '/' . ($id % 100) . '/' . $id . '.atom') && filemtime($bb_cfg['atom']['path'] . '/u/' . floor($id / 5000) . '/' . ($id % 100) . '/' . $id . '.atom') > $timecheck) { + redirect($bb_cfg['atom']['url'] . '/u/' . floor($id / 5000) . '/' . ($id % 100) . '/' . $id . '.atom'); } else { if (\TorrentPier\Legacy\Atom::update_user_feed($id, $username)) { - redirect(config()->get('atom.url') . '/u/' . floor($id / 5000) . '/' . ($id % 100) . '/' . $id . '.atom'); + redirect($bb_cfg['atom']['url'] . '/u/' . floor($id / 5000) . '/' . ($id % 100) . '/' . $id . '.atom'); } else { bb_simple_die($lang['ATOM_NO_USER']); } diff --git a/filelist.php b/filelist.php index b07e319c6..2cfd9d418 100644 --- a/filelist.php +++ b/filelist.php @@ -14,7 +14,7 @@ require __DIR__ . '/common.php'; // Start session management $user->session_start(); -if (config()->get('bt_disable_dht') && IS_GUEST) { +if ($bb_cfg['bt_disable_dht'] && IS_GUEST) { bb_die($lang['BT_PRIVATE_TRACKER'], 403); } @@ -55,7 +55,7 @@ if (!is_file($file_path)) { } $file_contents = file_get_contents($file_path); -if (config()->get('flist_max_files')) { +if ($bb_cfg['flist_max_files']) { $filetree_pos = $meta_v2 ? strpos($file_contents, '9:file tree') : false; $files_pos = $meta_v1 ? strpos($file_contents, '5:files', $filetree_pos) : false; @@ -65,8 +65,8 @@ if (config()->get('flist_max_files')) { $file_count = substr_count($file_contents, '6:length', $files_pos); } - if ($file_count > config()->get('flist_max_files')) { - bb_die(sprintf($lang['BT_FLIST_LIMIT'], config()->get('flist_max_files'), $file_count), 410); + if ($file_count > $bb_cfg['flist_max_files']) { + bb_die(sprintf($lang['BT_FLIST_LIMIT'], $bb_cfg['flist_max_files'], $file_count), 410); } } diff --git a/group.php b/group.php index e88bb6de7..b674c823d 100644 --- a/group.php +++ b/group.php @@ -24,7 +24,7 @@ set_die_append_msg(); $group_id = isset($_REQUEST[POST_GROUPS_URL]) ? (int)$_REQUEST[POST_GROUPS_URL] : null; $start = isset($_REQUEST['start']) ? abs((int)$_REQUEST['start']) : 0; -$per_page = config()->get('group_members_per_page'); +$per_page = $bb_cfg['group_members_per_page']; $view_mode = isset($_REQUEST['view']) ? (string)$_REQUEST['view'] : null; $rel_limit = 50; @@ -168,7 +168,7 @@ if (!$group_id) { \TorrentPier\Legacy\Group::add_user_into_group($group_id, $userdata['user_id'], 1, TIMENOW); - if (config()->get('group_send_email')) { + if ($bb_cfg['group_send_email']) { // Sending email $emailer = new TorrentPier\Emailer(); @@ -224,7 +224,7 @@ if (!$group_id) { \TorrentPier\Legacy\Group::add_user_into_group($group_id, $row['user_id']); - if (config()->get('group_send_email')) { + if ($bb_cfg['group_send_email']) { // Sending email $emailer = new TorrentPier\Emailer(); @@ -273,10 +273,10 @@ if (!$group_id) { } } // Email users when they are approved - if (!empty($_POST['approve']) && config()->get('group_send_email')) { + if (!empty($_POST['approve']) && $bb_cfg['group_send_email']) { $sql_select = "SELECT username, user_email, user_lang - FROM " . BB_USERS . " - WHERE user_id IN($sql_in)"; + FROM " . BB_USERS . " + WHERE user_id IN($sql_in)"; if (!$result = DB()->sql_query($sql_select)) { bb_die('Could not get user email information'); diff --git a/group_edit.php b/group_edit.php index 041365bf4..f98e69aed 100644 --- a/group_edit.php +++ b/group_edit.php @@ -35,10 +35,10 @@ if ($group_id) { if ($is_moderator) { // Avatar if ($submit) { - if (!empty($_FILES['avatar']['name']) && config()->get('group_avatars.up_allowed')) { + if (!empty($_FILES['avatar']['name']) && $bb_cfg['group_avatars']['up_allowed']) { $upload = new TorrentPier\Legacy\Common\Upload(); - if ($upload->init(config()->get('group_avatars'), $_FILES['avatar']) and $upload->store('avatar', ['user_id' => GROUP_AVATAR_MASK . $group_id, 'avatar_ext_id' => $group_info['avatar_ext_id']])) { + if ($upload->init($bb_cfg['group_avatars'], $_FILES['avatar']) and $upload->store('avatar', ['user_id' => GROUP_AVATAR_MASK . $group_id, 'avatar_ext_id' => $group_info['avatar_ext_id']])) { $avatar_ext_id = (int)$upload->file_ext_id; DB()->query("UPDATE " . BB_GROUPS . " SET avatar_ext_id = $avatar_ext_id WHERE group_id = $group_id LIMIT 1"); } else { @@ -76,7 +76,7 @@ if ($is_moderator) { 'S_HIDDEN_FIELDS' => $s_hidden_fields, 'S_GROUP_CONFIG_ACTION' => "group_edit.php?" . POST_GROUPS_URL . "=$group_id", - 'AVATAR_EXPLAIN' => sprintf($lang['AVATAR_EXPLAIN'], config()->get('group_avatars.max_width'), config()->get('group_avatars.max_height'), humn_size(config()->get('group_avatars.max_size'))), + 'AVATAR_EXPLAIN' => sprintf($lang['AVATAR_EXPLAIN'], $bb_cfg['group_avatars']['max_width'], $bb_cfg['group_avatars']['max_height'], humn_size($bb_cfg['group_avatars']['max_size'])), 'AVATAR_IMG' => get_avatar(GROUP_AVATAR_MASK . $group_id, $group_info['avatar_ext_id']), ]); diff --git a/index.php b/index.php index 2cf22e305..2c752341c 100644 --- a/index.php +++ b/index.php @@ -31,12 +31,12 @@ $datastore->enqueue([ 'cat_forums' ]); -if (config()->get('show_latest_news')) { +if ($bb_cfg['show_latest_news']) { $datastore->enqueue([ 'latest_news' ]); } -if (config()->get('show_network_news')) { +if ($bb_cfg['show_network_news']) { $datastore->enqueue([ 'network_news' ]); @@ -46,7 +46,7 @@ if (config()->get('show_network_news')) { $user->session_start(); // Set meta description -$page_cfg['meta_description'] = config()->get('site_desc'); +$page_cfg['meta_description'] = $bb_cfg['site_desc']; // Init main vars $viewcat = isset($_GET[POST_CAT_URL]) ? (int)$_GET[POST_CAT_URL] : 0; @@ -57,7 +57,7 @@ $req_page = 'index_page'; $req_page .= $viewcat ? "_c{$viewcat}" : ''; define('REQUESTED_PAGE', $req_page); -caching_output(IS_GUEST, 'send', REQUESTED_PAGE . '_guest_' . config()->get('default_lang')); +caching_output(IS_GUEST, 'send', REQUESTED_PAGE . '_guest_' . $bb_cfg['default_lang']); $hide_cat_opt = isset($user->opt_js['h_cat']) ? (string)$user->opt_js['h_cat'] : 0; $hide_cat_user = array_flip(explode('-', $hide_cat_opt)); @@ -68,15 +68,13 @@ $tracking_topics = get_tracks('topic'); $tracking_forums = get_tracks('forum'); // Statistics -$stats = $datastore->get('stats'); -if ($stats === false) { +if (!$stats = $datastore->get('stats')) { $datastore->update('stats'); $stats = $datastore->get('stats'); } // Forums data -$forums = $datastore->get('cat_forums'); -if ($forums === false) { +if (!$forums = $datastore->get('cat_forums')) { $datastore->update('cat_forums'); $forums = $datastore->get('cat_forums'); } @@ -179,8 +177,7 @@ if (!$cat_forums = CACHE('bb_cache')->get($cache_name)) { // Obtain list of moderators $moderators = []; -$mod = $datastore->get('moderators'); -if ($mod === false) { +if (!$mod = $datastore->get('moderators')) { $datastore->update('moderators'); $mod = $datastore->get('moderators'); } @@ -262,7 +259,7 @@ foreach ($cat_forums as $cid => $c) { 'LAST_TOPIC_ID' => $f['last_topic_id'], 'LAST_TOPIC_TIP' => $f['last_topic_title'], 'LAST_TOPIC_TITLE' => str_short($f['last_topic_title'], $last_topic_max_len), - 'LAST_POST_TIME' => bb_date($f['last_post_time'], config()->get('last_post_date_format')), + 'LAST_POST_TIME' => bb_date($f['last_post_time'], $bb_cfg['last_post_date_format']), 'LAST_POST_USER' => profile_url(['username' => str_short($f['last_post_username'], 15), 'user_id' => $f['last_post_user_id'], 'user_rank' => $f['last_post_user_rank']]), ]); } @@ -278,7 +275,7 @@ $template->assign_vars([ 'TOTAL_TOPICS' => sprintf($lang['POSTED_TOPICS_TOTAL'], $stats['topiccount']), 'TOTAL_POSTS' => sprintf($lang['POSTED_ARTICLES_TOTAL'], $stats['postcount']), 'TOTAL_USERS' => sprintf($lang['REGISTERED_USERS_TOTAL'], $stats['usercount']), - 'TOTAL_GENDER' => config()->get('gender') ? sprintf( + 'TOTAL_GENDER' => $bb_cfg['gender'] ? sprintf( $lang['USERS_TOTAL_GENDER'], $stats['male'], $stats['female'], @@ -287,22 +284,22 @@ $template->assign_vars([ 'NEWEST_USER' => sprintf($lang['NEWEST_USER'], profile_url($stats['newestuser'])), // Tracker stats - 'TORRENTS_STAT' => config()->get('tor_stats') ? sprintf( + 'TORRENTS_STAT' => $bb_cfg['tor_stats'] ? sprintf( $lang['TORRENTS_STAT'], $stats['torrentcount'], humn_size($stats['size']) ) : '', - 'PEERS_STAT' => config()->get('tor_stats') ? sprintf( + 'PEERS_STAT' => $bb_cfg['tor_stats'] ? sprintf( $lang['PEERS_STAT'], $stats['peers'], $stats['seeders'], $stats['leechers'] ) : '', - 'SPEED_STAT' => config()->get('tor_stats') ? sprintf( + 'SPEED_STAT' => $bb_cfg['tor_stats'] ? sprintf( $lang['SPEED_STAT'], humn_size($stats['speed']) . '/s' ) : '', - 'SHOW_MOD_INDEX' => config()->get('show_mod_index'), + 'SHOW_MOD_INDEX' => $bb_cfg['show_mod_index'], 'FORUM_IMG' => $images['forum'], 'FORUM_NEW_IMG' => $images['forum_new'], 'FORUM_LOCKED_IMG' => $images['forum_locked'], @@ -315,21 +312,20 @@ $template->assign_vars([ 'U_SEARCH_SELF_BY_MY' => "search.php?uid={$userdata['user_id']}&o=1", 'U_SEARCH_LATEST' => 'search.php?search_id=latest', 'U_SEARCH_UNANSWERED' => 'search.php?search_id=unanswered', - 'U_ATOM_FEED' => is_file(config()->get('atom.path') . '/f/0.atom') ? make_url(config()->get('atom.url') . '/f/0.atom') : false, + 'U_ATOM_FEED' => is_file($bb_cfg['atom']['path'] . '/f/0.atom') ? make_url($bb_cfg['atom']['url'] . '/f/0.atom') : false, 'SHOW_LAST_TOPIC' => $show_last_topic, - 'BOARD_START' => config()->get('show_board_start_index') ? ($lang['BOARD_STARTED'] . ': ' . '' . bb_date(config()->get('board_startdate')) . '') : false, + 'BOARD_START' => $bb_cfg['show_board_start_index'] ? ($lang['BOARD_STARTED'] . ': ' . '' . bb_date($bb_cfg['board_startdate']) . '') : false, ]); // Set tpl vars for bt_userdata -if (config()->get('bt_show_dl_stat_on_index') && !IS_GUEST) { +if ($bb_cfg['bt_show_dl_stat_on_index'] && !IS_GUEST) { show_bt_userdata($userdata['user_id']); } // Latest news -if (config()->get('show_latest_news')) { - $latest_news = $datastore->get('latest_news'); - if ($latest_news === false) { +if ($bb_cfg['show_latest_news']) { + if (!$latest_news = $datastore->get('latest_news')) { $datastore->update('latest_news'); $latest_news = $datastore->get('latest_news'); } @@ -343,7 +339,7 @@ if (config()->get('show_latest_news')) { $template->assign_block_vars('news', [ 'NEWS_TOPIC_ID' => $news['topic_id'], - 'NEWS_TITLE' => str_short(censor()->censorString($news['topic_title']), config()->get('max_news_title')), + 'NEWS_TITLE' => str_short($wordCensor->censorString($news['topic_title']), $bb_cfg['max_news_title']), 'NEWS_TIME' => bb_date($news['topic_time'], 'd-M', false), 'NEWS_IS_NEW' => is_unread($news['topic_time'], $news['topic_id'], $news['forum_id']), ]); @@ -351,9 +347,8 @@ if (config()->get('show_latest_news')) { } // Network news -if (config()->get('show_network_news')) { - $network_news = $datastore->get('network_news'); - if ($network_news === false) { +if ($bb_cfg['show_network_news']) { + if (!$network_news = $datastore->get('network_news')) { $datastore->update('network_news'); $network_news = $datastore->get('network_news'); } @@ -367,14 +362,14 @@ if (config()->get('show_network_news')) { $template->assign_block_vars('net', [ 'NEWS_TOPIC_ID' => $net['topic_id'], - 'NEWS_TITLE' => str_short(censor()->censorString($net['topic_title']), config()->get('max_net_title')), + 'NEWS_TITLE' => str_short($wordCensor->censorString($net['topic_title']), $bb_cfg['max_net_title']), 'NEWS_TIME' => bb_date($net['topic_time'], 'd-M', false), 'NEWS_IS_NEW' => is_unread($net['topic_time'], $net['topic_id'], $net['forum_id']), ]); } } -if (config()->get('birthday_check_day') && config()->get('birthday_enabled')) { +if ($bb_cfg['birthday_check_day'] && $bb_cfg['birthday_enabled']) { $week_list = $today_list = []; $week_all = $today_all = false; @@ -388,9 +383,9 @@ if (config()->get('birthday_check_day') && config()->get('birthday_enabled')) { $week_list[] = profile_url($week) . ' (' . birthday_age(date('Y-m-d', strtotime('-1 year', strtotime($week['user_birthday'])))) . ')'; } $week_all = $week_all ? ' ...' : ''; - $week_list = sprintf($lang['BIRTHDAY_WEEK'], config()->get('birthday_check_day'), implode(', ', $week_list)) . $week_all; + $week_list = sprintf($lang['BIRTHDAY_WEEK'], $bb_cfg['birthday_check_day'], implode(', ', $week_list)) . $week_all; } else { - $week_list = sprintf($lang['NOBIRTHDAY_WEEK'], config()->get('birthday_check_day')); + $week_list = sprintf($lang['NOBIRTHDAY_WEEK'], $bb_cfg['birthday_check_day']); } if (!empty($stats['birthday_today_list'])) { diff --git a/install.php b/install.php index b04535eda..327c0fb5d 100644 --- a/install.php +++ b/install.php @@ -11,7 +11,7 @@ define('BB_ROOT', __DIR__ . DIRECTORY_SEPARATOR); define('BB_PATH', BB_ROOT); // Check CLI mode -if (PHP_SAPI != 'cli') { +if (php_sapi_name() !== 'cli') { die('Please run' . $lang['UPLOADED'] . ' | ' . $lang['RELEASED'] . ' | ' . $lang['BONUS'] . ' | '; - $html .= config()->get('seed_bonus_enabled') ? '' . $lang['SEED_BONUS'] . ' | ' : ''; + $html .= $bb_cfg['seed_bonus_enabled'] ? '' . $lang['SEED_BONUS'] . ' | ' : ''; $html .= '
---|---|---|---|---|---|---|
' . $lang['TOTAL_TRAF'] . ' | @@ -180,17 +180,17 @@ switch ($mode) {' . humn_size($btu['u_up_total']) . ' | ' . humn_size($btu['u_up_release']) . ' | ' . humn_size($btu['u_up_bonus']) . ' | '; - $html .= config()->get('seed_bonus_enabled') ? '' . $profiledata['user_points'] . ' | ' : ''; + $html .= $bb_cfg['seed_bonus_enabled'] ? '' . $profiledata['user_points'] . ' | ' : ''; $html .= '|
' . $lang['MAX_SPEED'] . ' | ' . $lang['DL_DL_SPEED'] . ': ' . $speed_down . ' | ' . $lang['DL_UL_SPEED'] . ': ' . $speed_up . ' | '; - $html .= config()->get('seed_bonus_enabled') ? '' : ''; + $html .= $bb_cfg['seed_bonus_enabled'] ? ' | ' : ''; $html .= ' | ' . $lang['USER_RATIO'] . ': | +' . $lang['USER_RATIO'] . ': | ' . $user_ratio . ' | '; break; diff --git a/library/ajax/manage_admin.php b/library/ajax/manage_admin.php index 29ecbb3bc..cb0249239 100644 --- a/library/ajax/manage_admin.php +++ b/library/ajax/manage_admin.php @@ -11,7 +11,7 @@ if (!defined('IN_AJAX')) { die(basename(__FILE__)); } -global $userdata, $lang; +global $userdata, $lang, $bb_cfg; if (!$mode = (string)$this->request['mode']) { $this->ajax_die('invalid mode (empty)'); @@ -19,7 +19,7 @@ if (!$mode = (string)$this->request['mode']) { switch ($mode) { case 'clear_cache': - foreach (config()->get('cache.engines') as $cache_name => $cache_val) { + foreach ($bb_cfg['cache']['engines'] as $cache_name => $cache_val) { CACHE($cache_name)->rm(); } @@ -48,20 +48,20 @@ switch ($mode) { $this->response['template_cache_html'] = '' . $lang['ALL_TEMPLATE_CLEARED'] . ''; break; case 'indexer': - exec("indexer --config " . config()->get('sphinx_config_path') . " --all --rotate", $result); + exec("indexer --config {$bb_cfg['sphinx_config_path']} --all --rotate", $result); - if (!is_file(config()->get('sphinx_config_path') . ".log")) { - file_put_contents(config()->get('sphinx_config_path') . ".log", "##############################" . date("H:i:s", TIMENOW) . "##############################\r\n\r\n\r\n\r\n", FILE_APPEND); + if (!is_file($bb_cfg['sphinx_config_path'] . ".log")) { + file_put_contents($bb_cfg['sphinx_config_path'] . ".log", "##############################" . date("H:i:s", TIMENOW) . "##############################\r\n\r\n\r\n\r\n", FILE_APPEND); } - file_put_contents(config()->get('sphinx_config_path') . ".log", "##############################" . date("H:i:s", TIMENOW) . "##############################\r\n", FILE_APPEND); + file_put_contents($bb_cfg['sphinx_config_path'] . ".log", "##############################" . date("H:i:s", TIMENOW) . "##############################\r\n", FILE_APPEND); foreach ($result as $row) { - file_put_contents(config()->get('sphinx_config_path') . ".log", $row . "\r\n", FILE_APPEND); + file_put_contents($bb_cfg['sphinx_config_path'] . ".log", $row . "\r\n", FILE_APPEND); } - file_put_contents(config()->get('sphinx_config_path') . ".log", "\r\n", FILE_APPEND); - file_put_contents(config()->get('sphinx_config_path') . ".log", "\r\n", FILE_APPEND); + file_put_contents($bb_cfg['sphinx_config_path'] . ".log", "\r\n", FILE_APPEND); + file_put_contents($bb_cfg['sphinx_config_path'] . ".log", "\r\n", FILE_APPEND); $this->response['indexer_html'] = '' . $lang['INDEXER'] . ''; break; diff --git a/library/ajax/manage_user.php b/library/ajax/manage_user.php index 3925b739f..8a1e4b25e 100644 --- a/library/ajax/manage_user.php +++ b/library/ajax/manage_user.php @@ -11,7 +11,7 @@ if (!defined('IN_AJAX')) { die(basename(__FILE__)); } -global $userdata, $lang; +global $userdata, $lang, $bb_cfg; if (!$mode = (string)$this->request['mode']) { $this->ajax_die('invalid mode (empty)'); diff --git a/library/ajax/mod_action.php b/library/ajax/mod_action.php index a82c122a0..0817f7e4e 100644 --- a/library/ajax/mod_action.php +++ b/library/ajax/mod_action.php @@ -11,7 +11,7 @@ if (!defined('IN_AJAX')) { die(basename(__FILE__)); } -global $userdata, $lang, $datastore, $log_action; +global $userdata, $bb_cfg, $lang, $datastore, $log_action; if (!$mode = (string)$this->request['mode']) { $this->ajax_die('invalid mode (empty)'); @@ -44,7 +44,7 @@ switch ($mode) { \TorrentPier\Legacy\Torrent::change_tor_status($attach_id, $status); // Log action - $log_msg = sprintf($lang['TOR_STATUS_LOG_ACTION'], config()->get('tor_icons')[$status] . ' ' . $lang['TOR_STATUS_NAME'][$status] . '', config()->get('tor_icons')[$tor['tor_status']] . ' ' . $lang['TOR_STATUS_NAME'][$tor['tor_status']] . ''); + $log_msg = sprintf($lang['TOR_STATUS_LOG_ACTION'], $bb_cfg['tor_icons'][$status] . ' ' . $lang['TOR_STATUS_NAME'][$status] . '', $bb_cfg['tor_icons'][$tor['tor_status']] . ' ' . $lang['TOR_STATUS_NAME'][$tor['tor_status']] . ''); $log_action->mod('mod_topic_change_tor_status', [ 'forum_id' => $tor['forum_id'], 'topic_id' => $tor['topic_id'], @@ -52,7 +52,7 @@ switch ($mode) { 'log_msg' => $log_msg . '
' . ($dbg['src'] ?? $dbg['trace']) . ' [' . sprintf('%.3f', $dbg['time']) . ' s] ' . $this->db->query_info() . ' | -' . "[{$this->db->engine}] {$this->db->db_server}.{$this->db->selected_db}" . ' :: Query #' . ($this->db->num_queries + 1) . ' | -
---|---|
' . $this->explain_hold . ' |
' . htmlspecialchars($val) . ' | '; - } - $this->explain_hold .= '
' . str_replace(["{$this->db->selected_db}.", ',', ';'], ['', ', ', '; '], htmlspecialchars($val ?? '')) . ' | ';
- }
- $this->explain_hold .= '
' . $dbg['src'] . ' [' . sprintf('%.3f', $dbg['time']) . ' s] ' . $dbg['info'] . ' | +' . "[$this->engine] $this->db_server.$this->selected_db" . ' :: Query #' . ($this->num_queries + 1) . ' | +
---|---|
' . $this->explain_hold . ' |
' . $val . ' | '; + } + $this->explain_hold .= '|||
' . str_replace(["{$this->selected_db}.", ',', ';'], ['', ', ', '; '], $val ?? '') . ' | ';
+ }
+ $this->explain_hold .= '
{L_MIGRATIONS_DATABASE_INFO} | -|
---|---|
{L_MIGRATIONS_DATABASE_NAME}: | -{SCHEMA_DATABASE_NAME} | -
{L_MIGRATIONS_DATABASE_TOTAL}: | -{SCHEMA_TABLE_COUNT} | -
{L_MIGRATIONS_DATABASE_SIZE}: | -{SCHEMA_SIZE_MB} MB | -
{L_LAST_UPDATED}: | -{CURRENT_TIME} | -
{L_MIGRATIONS_STATUS} | -|
---|---|
{L_MIGRATIONS_SYSTEM}: | -- - - ⚠ {L_MIGRATIONS_NEEDS_SETUP} - - ✓ {L_MIGRATIONS_ACTIVE} - - - ✗ {L_MIGRATIONS_NOT_INITIALIZED} - - | -
{L_MIGRATIONS_SETUP_STATUS}: | -
-
- {L_MIGRATIONS_ACTION_REQUIRED}: {SETUP_MESSAGE}
- - - {L_MIGRATIONS_INSTRUCTIONS}: {SETUP_INSTRUCTIONS} - - {L_MIGRATIONS_SETUP_GUIDE} - |
-
Current Version: | -- - {MIGRATION_CURRENT_VERSION} - - {L_MIGRATIONS_NOT_APPLIED} - - | -
{L_MIGRATIONS_APPLIED}: | -{MIGRATION_APPLIED_COUNT} | -
{L_MIGRATIONS_PENDING}: | -- - {MIGRATION_PENDING_COUNT} {L_MIGRATIONS_PENDING_COUNT} - - {L_MIGRATIONS_UP_TO_DATE} - - | -
{L_MIGRATIONS_APPLIED} | -|||
---|---|---|---|
{L_MIGRATIONS_VERSION} | -{L_MIGRATIONS_NAME} | -{L_MIGRATIONS_APPLIED_AT} | -{L_MIGRATIONS_COMPLETED_AT} | -
{applied_migrations.VERSION} | -{applied_migrations.NAME} | -{applied_migrations.START_TIME} | -{applied_migrations.END_TIME} | -
{L_MIGRATIONS_PENDING} | -||
---|---|---|
{L_MIGRATIONS_VERSION} | -{L_MIGRATIONS_NAME} | -{L_MIGRATIONS_FILE} | -
{pending_migrations.VERSION} | -{pending_migrations.NAME} | -{pending_migrations.FILENAME} |
-
php vendor/bin/phinx migrate
-This panel provides read-only information about the database migration status. - To manage migrations, use the command line interface:
- -php vendor/bin/phinx status
php vendor/bin/phinx migrate
php vendor/bin/phinx create MigrationName
php vendor/bin/phinx rollback
⚠️ Important: Always backup your database before running migrations in production!
-Your installation has existing data but hasn't been set up for migrations yet. Follow these steps:
- -mysqldump -u username -p database_name > backup_$(date +%Y%m%d_%H%M%S).sql- -
php vendor/bin/phinx init- -
php vendor/bin/phinx migrate --fake --target=20250619000001 -php vendor/bin/phinx migrate --fake --target=20250619000002- -
php vendor/bin/phinx status- -
What this does: The --fake
flag marks migrations as applied without actually
- running them,
- since your database already has the schema. This allows future migrations to work normally.
📖 Need help? See the complete guide in the - UPGRADE_GUIDE.md
-explain data |
{L_MIGRATIONS_FILE} | '; - $compiled = $this->template->_compile_text($template); - $output = executeTemplate($compiled); - - // Should show the fallback without braces instead of throwing an error - expect($output)->toContain('L_MIGRATIONS_FILE'); - expect($output)->toContain('template->_compile_text($template);
- $output = executeTemplate($compiled);
-
- // Empty braces should remain as literal text
- expect($output)->toBe('{}');
- });
-
- it('handles variables with special characters in names', function () {
- $template = '{VAR_WITH_UNDERSCORES} {VAR-WITH-DASHES} {VAR123NUMBERS}';
- $compiled = $this->template->_compile_text($template);
- $output = executeTemplate($compiled, [
- 'VAR_WITH_UNDERSCORES' => 'underscore value',
- 'VAR123NUMBERS' => 'number value'
- ]);
-
- // Verify the compiled code contains proper fallback logic for special chars
- expect($compiled)->toContain("isset(\$V['VAR_WITH_UNDERSCORES'])");
- expect($compiled)->toContain("isset(\$V['VAR123NUMBERS'])");
-
- // Underscores and numbers should work, dashes might not be valid variable names
- expect($output)->toContain('underscore value');
- expect($output)->toContain('number value');
- });
-
- it('handles HTML entities and special characters in template content', function () {
- $template = ' & {TEST_VAR} <script> ';
- $compiled = $this->template->_compile_text($template);
- $output = executeTemplate($compiled, ['TEST_VAR' => 'safe content']);
-
- // HTML entities should be preserved, variable should be substituted
- expect($output)->toBe('& safe content <script> ');
-
- // Verify fallback logic is present
- expect($compiled)->toContain("isset(\$V['TEST_VAR'])");
- });
-
- it('handles quotes and escaping in variable values', function () {
- $template = 'Value: {QUOTED_VAR}';
- $compiled = $this->template->_compile_text($template);
- $output = executeTemplate($compiled, [
- 'QUOTED_VAR' => 'Contains "quotes" and \'apostrophes\''
- ]);
-
- expect($output)->toBe('Value: Contains "quotes" and \'apostrophes\'');
- expect($compiled)->toContain("isset(\$V['QUOTED_VAR'])");
- });
-
- it('handles very long variable names', function () {
- $longVarName = 'VERY_LONG_VARIABLE_NAME_THAT_TESTS_BUFFER_LIMITS_AND_PARSING_' . str_repeat('X', 100);
- $template = '{' . $longVarName . '}';
- $compiled = $this->template->_compile_text($template);
- $output = executeTemplate($compiled, [$longVarName => 'long var value']);
-
- expect($output)->toBe('long var value');
- expect($compiled)->toContain("isset(\$V['$longVarName'])");
- });
-
- it('handles nested braces and malformed syntax', function () {
- $template = '{{NESTED}} {UNCLOSED {NORMAL_VAR} }EXTRA}';
- $compiled = $this->template->_compile_text($template);
- $output = executeTemplate($compiled, ['NORMAL_VAR' => 'works']);
-
- // Should handle the valid variable and leave malformed parts as literals
- expect($output)->toContain('works');
- expect($compiled)->toContain("isset(\$V['NORMAL_VAR'])");
- });
-
- it('handles empty string values with proper fallback', function () {
- $template = 'Before:{EMPTY_VAR}:After';
- $compiled = $this->template->_compile_text($template);
- $output = executeTemplate($compiled, ['EMPTY_VAR' => '']);
-
- expect($output)->toBe('Before::After');
- expect($compiled)->toContain("isset(\$V['EMPTY_VAR'])");
- });
-
- it('handles null and false values correctly', function () {
- $template = 'Null:{NULL_VAR} False:{FALSE_VAR} Zero:{ZERO_VAR}';
- $compiled = $this->template->_compile_text($template);
- $output = executeTemplate($compiled, [
- 'NULL_VAR' => null,
- 'FALSE_VAR' => false,
- 'ZERO_VAR' => 0
- ]);
-
- // PHP's string conversion: null='', false='', 0='0'
- expect($output)->toBe('Null: False: Zero:0');
- expect($compiled)->toContain("isset(\$V['NULL_VAR'])");
- expect($compiled)->toContain("isset(\$V['FALSE_VAR'])");
- expect($compiled)->toContain("isset(\$V['ZERO_VAR'])");
- });
-
- it('handles whitespace around variable names', function () {
- $template = '{ SPACED_VAR } {NORMAL_VAR}';
- $compiled = $this->template->_compile_text($template);
- $output = executeTemplate($compiled, [
- 'SPACED_VAR' => 'should not work',
- 'NORMAL_VAR' => 'should work'
- ]);
-
- // Spaces inside braces should make it not match as a variable pattern
- expect($output)->toContain('should work');
- expect($compiled)->toContain("isset(\$V['NORMAL_VAR'])");
- });
-
- it('handles multiple consecutive variables', function () {
- $template = '{VAR1}{VAR2}{VAR3}';
- $compiled = $this->template->_compile_text($template);
- $output = executeTemplate($compiled, [
- 'VAR1' => 'A',
- 'VAR2' => 'B',
- 'VAR3' => 'C'
- ]);
-
- expect($output)->toBe('ABC');
- expect($compiled)->toContain("isset(\$V['VAR1'])");
- expect($compiled)->toContain("isset(\$V['VAR2'])");
- expect($compiled)->toContain("isset(\$V['VAR3'])");
- });
-
- it('handles variables with numeric suffixes', function () {
- $template = '{VAR1} {VAR2} {VAR10} {VAR100}';
- $compiled = $this->template->_compile_text($template);
- $output = executeTemplate($compiled, [
- 'VAR1' => 'one',
- 'VAR2' => 'two',
- 'VAR10' => 'ten',
- 'VAR100' => 'hundred'
- ]);
-
- expect($output)->toBe('one two ten hundred');
- expect($compiled)->toContain("isset(\$V['VAR1'])");
- expect($compiled)->toContain("isset(\$V['VAR2'])");
- expect($compiled)->toContain("isset(\$V['VAR10'])");
- expect($compiled)->toContain("isset(\$V['VAR100'])");
- });
-
- it('handles mixed case sensitivity correctly', function () {
- $template = '{lowercase} {UPPERCASE} {MixedCase}';
- $compiled = $this->template->_compile_text($template);
- $output = executeTemplate($compiled, [
- 'lowercase' => 'lower',
- 'UPPERCASE' => 'upper',
- 'MixedCase' => 'mixed'
- ]);
-
- expect($output)->toBe('lower upper mixed');
- expect($compiled)->toContain("isset(\$V['lowercase'])");
- expect($compiled)->toContain("isset(\$V['UPPERCASE'])");
- expect($compiled)->toContain("isset(\$V['MixedCase'])");
- });
-
- it('handles language variables with special prefixes', function () {
- global $lang;
- $originalLang = $lang;
-
- // Add some special test language variables
- $lang['TEST_SPECIAL_CHARS'] = 'Special: &<>"\'';
- $lang['TEST_UNICODE'] = 'Unicode: ñáéíóú';
-
- $template = '{L_TEST_SPECIAL_CHARS} | {L_TEST_UNICODE} | {L_MISSING_SPECIAL}';
- $compiled = $this->template->_compile_text($template);
- $output = executeTemplate($compiled);
-
- expect($output)->toBe('Special: &<>"\' | Unicode: ñáéíóú | L_MISSING_SPECIAL');
- expect($compiled)->toContain("isset(\$L['TEST_SPECIAL_CHARS'])");
- expect($compiled)->toContain("isset(\$L['TEST_UNICODE'])");
- expect($compiled)->toContain("'L_MISSING_SPECIAL'");
-
- // Restore original language array
- $lang = $originalLang;
- });
-
- it('handles constants with edge case names', function () {
- // Define some test constants with edge case names
- if (!defined('TEST_CONST_123')) {
- define('TEST_CONST_123', 'numeric suffix');
- }
- if (!defined('TEST_CONST_UNDERSCORE_')) {
- define('TEST_CONST_UNDERSCORE_', 'trailing underscore');
- }
-
- $template = '{#TEST_CONST_123#} {#TEST_CONST_UNDERSCORE_#} {#UNDEFINED_CONST_EDGE#}';
- $compiled = $this->template->_compile_text($template);
- $output = executeTemplate($compiled);
-
- expect($output)->toBe('numeric suffix trailing underscore ');
- expect($compiled)->toContain("defined('TEST_CONST_123')");
- expect($compiled)->toContain("defined('TEST_CONST_UNDERSCORE_')");
- expect($compiled)->toContain("defined('UNDEFINED_CONST_EDGE')");
- });
-
- it('handles complex nested HTML with variables', function () {
- $template = '
|