From f802a937776b13a8bcbf73be7461a417ed1b5ee7 Mon Sep 17 00:00:00 2001 From: Cat Date: Sat, 4 May 2024 22:17:18 +0800 Subject: [PATCH] goodbye --- .github/FUNDING.yml | 2 - .github/PATREON.png | Bin 53739 -> 0 bytes .github/dependabot.yml | 6 - .github/do.png | Bin 6943 -> 0 bytes .github/vultr.png | Bin 10385 -> 0 bytes .github/workflows/lint.yml | 2 +- .github/workflows/lockdown.yml | 23 +- .github/workflows/minify.yml | 20 +- .github/workflows/sonarcloud.yml | 8 +- .github/workflows/stale.yml | 14 +- .github/workflows/unit.yaml | 12 +- README.md | 37 +-- SECURITY.md | 1 - composer.json | 7 +- composer.lock | 262 ++++++++---------- .../tabler/admin/announcement/create.tpl | 27 +- .../views/tabler/admin/announcement/edit.tpl | 27 +- resources/views/tabler/admin/docs/create.tpl | 29 +- resources/views/tabler/admin/docs/edit.tpl | 27 +- resources/views/tabler/datatable.tpl | 4 +- resources/views/tabler/tinymce.tpl | 23 ++ src/Controllers/Admin/AnnController.php | 4 +- src/Controllers/Admin/NodeController.php | 6 +- src/Controllers/Admin/UserController.php | 2 +- src/Controllers/AuthController.php | 2 +- src/Controllers/PasswordController.php | 2 +- src/Models/Node.php | 2 +- src/Models/SubscribeLog.php | 2 +- src/Models/User.php | 2 +- src/Services/Bot/Telegram/Callback.php | 2 +- .../Bot/Telegram/Commands/CheckinCommand.php | 4 +- .../Bot/Telegram/Commands/HelpCommand.php | 4 +- .../Bot/Telegram/Commands/MenuCommand.php | 2 +- .../Bot/Telegram/Commands/MyCommand.php | 2 +- .../Bot/Telegram/Commands/PingCommand.php | 8 +- .../Bot/Telegram/Commands/StartCommand.php | 4 +- .../Bot/Telegram/Commands/UnbindCommand.php | 6 +- src/Services/Bot/Telegram/Message.php | 20 +- src/Services/Gateway/PayPal.php | 48 ++-- src/Services/Gateway/Stripe.php | 17 +- src/Services/LLM/VertexAI.php | 2 +- src/Services/RateLimit.php | 2 +- src/Services/Reward.php | 2 +- src/Utils/Tools.php | 8 +- update.sh | 3 - 45 files changed, 283 insertions(+), 404 deletions(-) delete mode 100644 .github/FUNDING.yml delete mode 100644 .github/PATREON.png delete mode 100644 .github/dependabot.yml delete mode 100644 .github/do.png delete mode 100644 .github/vultr.png delete mode 100644 SECURITY.md create mode 100644 resources/views/tabler/tinymce.tpl diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 060caffd20..0000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -# These are supported funding model platforms -patreon: catdev diff --git a/.github/PATREON.png b/.github/PATREON.png deleted file mode 100644 index 0639c9ffd0b3e4b86bede9943e9228d187fe6a2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53739 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 Zz~=yVOt|#aoK5Q^qN?-`RIO+p{(ph>O8o!; diff --git a/.github/vultr.png b/.github/vultr.png deleted file mode 100644 index a63960600a129eeeee19860ce3de8a0223de49e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10385 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
  • X$O(U$(8U4BEv zQ;Dr9Il=t^xNEw4Ni_J!e|XyzDsG>YzlKtes#j)J7`azNaBKm0Tf4(x`68hYtHKqC{KU9ti7H!ts_ z(GW$G0M9ma0pKBMohJZa5R6sv*j+JKGMP>M*3Q>eGEjrJGbqrsf(|q=^o$8``^vqY z=*+L&!wtgi7Od9X3@AUi%?AD2Y7@H+gNlmE(RXZg5ZmSXZKXpaokX|mcW8EKs_Cf~ ID%)QFFRr8b(EtDd diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 5dbd815e38..6bc92dfcd8 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -31,6 +31,6 @@ jobs: with: php-version: 8.3 - run: | - composer install --no-interaction --no-progress --no-suggest + composer install --no-interaction --no-progress --no-suggest --quiet php vendor/bin/phpinsights analyse --no-interaction --format=github-action \ --min-style=100 --min-architecture=100 --min-quality=100 diff --git a/.github/workflows/lockdown.yml b/.github/workflows/lockdown.yml index 8f307c7f26..abcb5195aa 100644 --- a/.github/workflows/lockdown.yml +++ b/.github/workflows/lockdown.yml @@ -1,17 +1,19 @@ -name: Lockdown +name: Lockdown Issue & PR + on: issues: types: [opened] issue_comment: types: [created] + pull_request: + types: [opened, synchronize, reopened] jobs: - closeAndlock: + issueLockdown: + if: ${{ github.event_name == 'issues' }} runs-on: ubuntu-latest permissions: issues: write - pull-requests: write - steps: - name: Close & Lock Issue run: | @@ -20,3 +22,16 @@ jobs: env: GH_REPO: ${{ github.repository }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + prLockdown: + if: ${{ github.event_name == 'pull_request' }} + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - name: Close & Lock PR + run: | + gh pr close ${{ github.event.pull_request.number }} + gh pr lock ${{ github.event.pull_request.number }} + env: + GH_REPO: ${{ github.repository }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/minify.yml b/.github/workflows/minify.yml index b3f6d3d375..e603bb8e7e 100644 --- a/.github/workflows/minify.yml +++ b/.github/workflows/minify.yml @@ -13,25 +13,25 @@ jobs: steps: - uses: actions/checkout@v4 with: - token: ${{ secrets.PAT }} - - name: Auto Minify Tabler Theme CSS file - uses: nizarmah/auto-minify@master + token: ${{ secrets.GITHUB_TOKEN }} + - name: Auto minify tabler theme CSS file + uses: nizarmah/auto-minify@v3 with: directory: 'public/theme/tabler/css' - - name: Auto Minify Tabler Theme JS file - uses: nizarmah/auto-minify@master + - name: Auto minify tabler theme JS file + uses: nizarmah/auto-minify@v3 with: directory: 'public/theme/tabler/js' - - name: Auto Minify CSS file - uses: nizarmah/auto-minify@master + - name: Auto minify asset CSS file + uses: nizarmah/auto-minify@v3 with: directory: 'public/assets/css' - - name: Auto Minify JS file - uses: nizarmah/auto-minify@master + - name: Auto minify asset JS file + uses: nizarmah/auto-minify@v3 with: directory: 'public/assets/js' - name: Auto committing minified files uses: stefanzweifel/git-auto-commit-action@v5 with: repository: 'public' - commit_message: "Github Action: Auto Minified Theme CSS/JS Files" + commit_message: "chore: auto minified theme CSS/JS files" diff --git a/.github/workflows/sonarcloud.yml b/.github/workflows/sonarcloud.yml index 966f3b819a..f89883de79 100644 --- a/.github/workflows/sonarcloud.yml +++ b/.github/workflows/sonarcloud.yml @@ -2,10 +2,8 @@ name: SonarCloud on: push: - branches: [ "dev" ] pull_request: - branches: [ "dev" ] - workflow_dispatch: + types: [ opened, reopened, synchronize ] permissions: pull-requests: read @@ -24,7 +22,7 @@ jobs: php-version: '8.3' coverage: xdebug - name: Install dependencies with composer - run: composer update --no-ansi --no-interaction --no-progress + run: composer update --no-interaction --no-progress --no-suggest --quiet - name: Run tests with phpunit/phpunit run: vendor/bin/phpunit --coverage-clover=coverage.xml - name: Fix code coverage paths @@ -32,7 +30,7 @@ jobs: - name: Analyze with SonarCloud uses: SonarSource/sonarcloud-github-action@master env: - GITHUB_TOKEN: ${{ secrets.PAT }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} with: args: diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 3a20ca5b67..292bb72367 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -2,21 +2,21 @@ name: Mark stale issues and pull requests on: schedule: - - cron: '40 2 * * *' + - cron: '0 0 * * *' jobs: stale: - runs-on: ubuntu-latest permissions: issues: write pull-requests: write - steps: - uses: actions/stale@v9 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - stale-issue-message: 'This issue has had no activity for over 60 days, hence marked as "staled-issue". This issue will be closed in 7 days.' - stale-pr-message: 'This PR has had no activity for over 60 days, hence marked as "staled-pr". This PR will be closed in 7 days.' - stale-issue-label: 'staled-issue' - stale-pr-label: 'staled-pr' + days-before-stale: 180 + days-before-close: 14 + stale-issue-message: 'This issue has had no activity for over 180 days and will be closed in 14 days.' + stale-pr-message: 'This PR has had no activity for over 180 days and will be closed in 14 days.' + stale-issue-label: 'staled' + stale-pr-label: 'staled' diff --git a/.github/workflows/unit.yaml b/.github/workflows/unit.yaml index a254637fa7..9d3ab26cd6 100644 --- a/.github/workflows/unit.yaml +++ b/.github/workflows/unit.yaml @@ -2,10 +2,8 @@ name: PHP Unit Tests on: push: - branches: [ "dev" ] pull_request: - branches: [ "dev" ] - workflow_dispatch: + types: [ opened, reopened, synchronize ] jobs: php-file-changed: @@ -23,7 +21,7 @@ jobs: php: - '**/*.php' - unit-test-php82: + php8.2: needs: php-file-changed if: ${{ needs.php-file-changed.outputs.php == 'true' }} runs-on: ubuntu-latest @@ -33,10 +31,10 @@ jobs: with: php-version: 8.2 - run: | - composer install --no-interaction --no-progress --no-suggest + composer install --no-interaction --no-progress --no-suggest --quiet php vendor/bin/phpunit - unit-test-php83: + php8.3: needs: php-file-changed if: ${{ needs.php-file-changed.outputs.php == 'true' }} runs-on: ubuntu-latest @@ -46,5 +44,5 @@ jobs: with: php-version: 8.3 - run: | - composer install --no-interaction --no-progress --no-suggest + composer install --no-interaction --no-progress --no-suggest --quiet php vendor/bin/phpunit diff --git a/README.md b/README.md index db7abaf998..7c5cb211d4 100644 --- a/README.md +++ b/README.md @@ -7,21 +7,9 @@

    -[![License](https://img.shields.io/github/license/SSPanel-UIM/SSPanel-UIM-Dev?style=flat-square)](https://github.com/SSPanel-UIM/SSPanel-UIM-Dev/blob/dev/LICENSE) -![GitHub repo size](https://img.shields.io/github/repo-size/SSPanel-UIM/SSPanel-UIM-Dev?style=flat-square) -![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/Anankke/SSPanel-Uim?style=flat-square) -![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/SSPanel-UIM/SSPanel-UIM-Dev/lint.yml?branch=dev&label=lint&style=flat-square) -![Sonar Quality Gate](https://img.shields.io/sonar/quality_gate/sspanel-uim_SSPanel-Uim-Dev/dev?server=https%3A%2F%2Fsonarcloud.io&style=flat-square) -![Sonar Coverage](https://img.shields.io/sonar/coverage/sspanel-uim_SSPanel-Uim-Dev/dev?server=https%3A%2F%2Fsonarcloud.io&style=flat-square) - -[![Release](https://img.shields.io/badge/Telegram-Release-blue?style=flat-square)](https://t.me/sspanel_uim) -[![Dev](https://img.shields.io/badge/Telegram-Dev-blue?style=flat-square)](https://t.me/sspanel_uim_dev) -[![Discord](https://img.shields.io/discord/1049692075085549600?color=5865F2&label=Discord&style=flat-square)](https://discord.gg/A7uFKCvf8V) -[![Dev Blog](https://img.shields.io/badge/Dev-Blog-blue?style=flat-square)](https://blog.sspanel.org) - ## TL;DR -SSPanel UIM is a multi-purpose proxy service management system designed for Shadowsocks / V2Ray / Trojan / TUIC protocol. +SSPanel UIM is a multi-purpose proxy service management system designed for Shadowsocks(2022) / V2Ray / Trojan / TUIC protocol. ## Features @@ -46,29 +34,6 @@ SSPanel UIM requires the following programs to be installed and run normally: - MariaDB 10.11+(Disable strict mode) - Redis 7.0+ -## Documentation - -> We install, we update, we develop - -[SSPanel UIM Wiki (zh)](https://wiki.sspanel.org), here you can find answers to most questions. - -## Related Projects - -SSPanel-UIM is not just a panel, it also includes a series of peripheral projects to help you use it better. - -You can view other projects maintained by our developers on the [SSPanel-UIM Dev Team](https://github.com/sspanel-uim) page. - -## Support Developers - -### M1Screw - - - - - - - - ## Sponsors [![](.github/jetbrains.png)](https://www.jetbrains.com/?from=SSPanel-UIM) diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index a8593f2529..0000000000 --- a/SECURITY.md +++ /dev/null @@ -1 +0,0 @@ -All reports gose to here: anankke@protonmail.com & cat@sspanel.org diff --git a/composer.json b/composer.json index 5fdcc7d66c..61e6ebb031 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ "ext-xml": "*", "ext-yaml": "*", "ext-zip": "*", - "alibabacloud/dm-20170622": "^1.2", + "alibabacloud/dm-20170622": "^1", "alipaysdk/openapi": "*@dev", "aws/aws-sdk-php": "^3", "geoip2/geoip2": "^3", @@ -28,7 +28,6 @@ "mailgun/mailgun-php": "^4", "nikolaposa/rate-limit": "^3", "openai-php/client": "^0", - "ozdemir/datatables": "^2", "phpmailer/phpmailer": "^6", "postal/postal": "^2", "ramsey/uuid": "^4", @@ -38,7 +37,7 @@ "slim/slim": "^4", "smarty/smarty": "^5", "srmklive/paypal": "^3", - "stripe/stripe-php": "^13", + "stripe/stripe-php": "^14", "symfony/http-client": "^7", "symfony/translation": "^7", "tronovav/geoip2-update": "^2", @@ -60,7 +59,7 @@ } }, "require-dev": { - "dg/bypass-finals": "^1.6", + "dg/bypass-finals": "^1", "nunomaduro/phpinsights": "*", "phpunit/phpunit": "^10" }, diff --git a/composer.lock b/composer.lock index 7a73868a0e..4f535901ba 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": "39ab430ad43a297c4e1b232afd979153", + "content-hash": "bb79de1b57be0eca9cd7fa5c4c2e1e6c", "packages": [ { "name": "adbario/php-dot-notation", @@ -186,16 +186,16 @@ }, { "name": "alibabacloud/dm-20170622", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/alibabacloud-sdk-php/dm-20170622.git", - "reference": "a5efe273e9651b53ed648a806d3f653217d733a2" + "reference": "400f9de65896f7fd2b854bb6a6c51bfe5d56e324" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/alibabacloud-sdk-php/dm-20170622/zipball/a5efe273e9651b53ed648a806d3f653217d733a2", - "reference": "a5efe273e9651b53ed648a806d3f653217d733a2", + "url": "https://api.github.com/repos/alibabacloud-sdk-php/dm-20170622/zipball/400f9de65896f7fd2b854bb6a6c51bfe5d56e324", + "reference": "400f9de65896f7fd2b854bb6a6c51bfe5d56e324", "shasum": "" }, "require": { @@ -223,9 +223,9 @@ ], "description": "Alibaba Cloud Dm (20170622) SDK Library for PHP", "support": { - "source": "https://github.com/alibabacloud-sdk-php/dm-20170622/tree/1.2.1" + "source": "https://github.com/alibabacloud-sdk-php/dm-20170622/tree/1.2.2" }, - "time": "2024-02-20T17:15:43+00:00" + "time": "2024-04-10T17:15:45+00:00" }, { "name": "alibabacloud/endpoint-util", @@ -510,12 +510,12 @@ "source": { "type": "git", "url": "https://github.com/alipay/alipay-sdk-php-all.git", - "reference": "3b86882423995c15992c277ffeb1c8e8b2a4a6c3" + "reference": "0f286297fe8bdd05594b11714ff4521e49a1e738" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/alipay/alipay-sdk-php-all/zipball/3b86882423995c15992c277ffeb1c8e8b2a4a6c3", - "reference": "3b86882423995c15992c277ffeb1c8e8b2a4a6c3", + "url": "https://api.github.com/repos/alipay/alipay-sdk-php-all/zipball/0f286297fe8bdd05594b11714ff4521e49a1e738", + "reference": "0f286297fe8bdd05594b11714ff4521e49a1e738", "shasum": "" }, "require": { @@ -564,7 +564,7 @@ "support": { "source": "https://github.com/alipay/alipay-sdk-php-all/tree/master" }, - "time": "2024-03-27T06:32:49+00:00" + "time": "2024-04-16T07:11:33+00:00" }, { "name": "aws/aws-crt-php", @@ -622,16 +622,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.304.1", + "version": "3.304.6", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "6dac9b3257873a807ac73f6dc4418bdc49a5d9db" + "reference": "02abf9b8e2afbdf281e28757c582049d3db16df7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/6dac9b3257873a807ac73f6dc4418bdc49a5d9db", - "reference": "6dac9b3257873a807ac73f6dc4418bdc49a5d9db", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/02abf9b8e2afbdf281e28757c582049d3db16df7", + "reference": "02abf9b8e2afbdf281e28757c582049d3db16df7", "shasum": "" }, "require": { @@ -711,9 +711,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.304.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.304.6" }, - "time": "2024-04-09T19:25:27+00:00" + "time": "2024-04-17T18:27:31+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1703,16 +1703,16 @@ }, { "name": "illuminate/collections", - "version": "v11.3.0", + "version": "v11.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/collections.git", - "reference": "aee944e8220588756e21aa4c30eebd5f6481e453" + "reference": "19c6554c7eba0efabc3f8aa4c434815b7f6b4b7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/collections/zipball/aee944e8220588756e21aa4c30eebd5f6481e453", - "reference": "aee944e8220588756e21aa4c30eebd5f6481e453", + "url": "https://api.github.com/repos/illuminate/collections/zipball/19c6554c7eba0efabc3f8aa4c434815b7f6b4b7d", + "reference": "19c6554c7eba0efabc3f8aa4c434815b7f6b4b7d", "shasum": "" }, "require": { @@ -1754,11 +1754,11 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-04-04T17:36:49+00:00" + "time": "2024-04-15T15:26:05+00:00" }, { "name": "illuminate/conditionable", - "version": "v11.3.0", + "version": "v11.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/conditionable.git", @@ -1804,7 +1804,7 @@ }, { "name": "illuminate/container", - "version": "v11.3.0", + "version": "v11.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/container.git", @@ -1855,7 +1855,7 @@ }, { "name": "illuminate/contracts", - "version": "v11.3.0", + "version": "v11.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/contracts.git", @@ -1903,16 +1903,16 @@ }, { "name": "illuminate/database", - "version": "v11.3.0", + "version": "v11.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/database.git", - "reference": "d9eabd0bb1d05b05f6d045b0e1d1d8e008e40eb1" + "reference": "aa4171c74d3bac4500128aedc6084377e2e4b950" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/database/zipball/d9eabd0bb1d05b05f6d045b0e1d1d8e008e40eb1", - "reference": "d9eabd0bb1d05b05f6d045b0e1d1d8e008e40eb1", + "url": "https://api.github.com/repos/illuminate/database/zipball/aa4171c74d3bac4500128aedc6084377e2e4b950", + "reference": "aa4171c74d3bac4500128aedc6084377e2e4b950", "shasum": "" }, "require": { @@ -1967,11 +1967,11 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-04-09T14:34:24+00:00" + "time": "2024-04-16T14:29:11+00:00" }, { "name": "illuminate/macroable", - "version": "v11.3.0", + "version": "v11.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/macroable.git", @@ -2017,16 +2017,16 @@ }, { "name": "illuminate/pagination", - "version": "v11.3.0", + "version": "v11.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/pagination.git", - "reference": "ab541626a692597278bae9dabaf7ae3c3657e035" + "reference": "0752b63f17105b7de8fa3dea12acd3c4099db21e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/pagination/zipball/ab541626a692597278bae9dabaf7ae3c3657e035", - "reference": "ab541626a692597278bae9dabaf7ae3c3657e035", + "url": "https://api.github.com/repos/illuminate/pagination/zipball/0752b63f17105b7de8fa3dea12acd3c4099db21e", + "reference": "0752b63f17105b7de8fa3dea12acd3c4099db21e", "shasum": "" }, "require": { @@ -2063,20 +2063,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-04-02T13:11:56+00:00" + "time": "2024-04-16T14:29:11+00:00" }, { "name": "illuminate/support", - "version": "v11.3.0", + "version": "v11.4.0", "source": { "type": "git", "url": "https://github.com/illuminate/support.git", - "reference": "0794cd2077e57cabe9dead2b081e7e20f71e4ffe" + "reference": "e7de8b8aa7658c827c48c99212927695848540b8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/illuminate/support/zipball/0794cd2077e57cabe9dead2b081e7e20f71e4ffe", - "reference": "0794cd2077e57cabe9dead2b081e7e20f71e4ffe", + "url": "https://api.github.com/repos/illuminate/support/zipball/e7de8b8aa7658c827c48c99212927695848540b8", + "reference": "e7de8b8aa7658c827c48c99212927695848540b8", "shasum": "" }, "require": { @@ -2137,7 +2137,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-04-09T14:13:50+00:00" + "time": "2024-04-15T12:21:59+00:00" }, { "name": "irazasyed/telegram-bot-sdk", @@ -2283,16 +2283,16 @@ }, { "name": "lcobucci/jwt", - "version": "5.2.0", + "version": "5.3.0", "source": { "type": "git", "url": "https://github.com/lcobucci/jwt.git", - "reference": "0ba88aed12c04bd2ed9924f500673f32b67a6211" + "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/0ba88aed12c04bd2ed9924f500673f32b67a6211", - "reference": "0ba88aed12c04bd2ed9924f500673f32b67a6211", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", + "reference": "08071d8d2c7f4b00222cc4b1fb6aa46990a80f83", "shasum": "" }, "require": { @@ -2340,7 +2340,7 @@ ], "support": { "issues": "https://github.com/lcobucci/jwt/issues", - "source": "https://github.com/lcobucci/jwt/tree/5.2.0" + "source": "https://github.com/lcobucci/jwt/tree/5.3.0" }, "funding": [ { @@ -2352,7 +2352,7 @@ "type": "patreon" } ], - "time": "2023-11-20T21:17:42+00:00" + "time": "2024-04-11T23:07:54+00:00" }, { "name": "league/event", @@ -2989,21 +2989,21 @@ }, { "name": "openai-php/client", - "version": "v0.8.4", + "version": "v0.8.5", "source": { "type": "git", "url": "https://github.com/openai-php/client.git", - "reference": "00470f5fedd7b08ee4860959d6952f0be0ec48a0" + "reference": "0f755fafa4d3f8d5c8ed964d3166d078fac0605a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/openai-php/client/zipball/00470f5fedd7b08ee4860959d6952f0be0ec48a0", - "reference": "00470f5fedd7b08ee4860959d6952f0be0ec48a0", + "url": "https://api.github.com/repos/openai-php/client/zipball/0f755fafa4d3f8d5c8ed964d3166d078fac0605a", + "reference": "0f755fafa4d3f8d5c8ed964d3166d078fac0605a", "shasum": "" }, "require": { "php": "^8.1.0", - "php-http/discovery": "^1.19.2", + "php-http/discovery": "^1.19.4", "php-http/multipart-stream-builder": "^1.3.0", "psr/http-client": "^1.0.3", "psr/http-client-implementation": "^1.0.1", @@ -3013,15 +3013,15 @@ "require-dev": { "guzzlehttp/guzzle": "^7.8.1", "guzzlehttp/psr7": "^2.6.2", - "laravel/pint": "^1.13.7", - "mockery/mockery": "^1.6.7", + "laravel/pint": "^1.15.0", + "mockery/mockery": "^1.6.11", "nunomaduro/collision": "^7.10.0", - "pestphp/pest": "^2.30.0", - "pestphp/pest-plugin-arch": "^2.6", - "pestphp/pest-plugin-type-coverage": "^2.7.0", - "phpstan/phpstan": "^1.10.55", - "rector/rector": "^0.16.0", - "symfony/var-dumper": "^6.4.2" + "pestphp/pest": "^2.34.6", + "pestphp/pest-plugin-arch": "^2.7", + "pestphp/pest-plugin-type-coverage": "^2.8.1", + "phpstan/phpstan": "^1.10.66", + "rector/rector": "^1.0.4", + "symfony/var-dumper": "^6.4.4" }, "type": "library", "autoload": { @@ -3061,7 +3061,7 @@ ], "support": { "issues": "https://github.com/openai-php/client/issues", - "source": "https://github.com/openai-php/client/tree/v0.8.4" + "source": "https://github.com/openai-php/client/tree/v0.8.5" }, "funding": [ { @@ -3077,50 +3077,7 @@ "type": "github" } ], - "time": "2024-02-07T07:57:38+00:00" - }, - { - "name": "ozdemir/datatables", - "version": "2.3.7", - "source": { - "type": "git", - "url": "https://github.com/n1crack/datatables.git", - "reference": "7d8d51dccc1647fc68d3b6f90453e3f8b8b8bf9d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/n1crack/datatables/zipball/7d8d51dccc1647fc68d3b6f90453e3f8b8b8bf9d", - "reference": "7d8d51dccc1647fc68d3b6f90453e3f8b8b8bf9d", - "shasum": "" - }, - "require": { - "php": ">=7.1.3" - }, - "require-dev": { - "phpunit/phpunit": "^7.0|^8.0|^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Ozdemir\\Datatables\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Yusuf Özdemir", - "email": "yusuf@ozdemir.be" - } - ], - "description": "PHP Library to handle server-side processing for Datatables, in a fast and simple way.", - "support": { - "issues": "https://github.com/n1crack/datatables/issues", - "source": "https://github.com/n1crack/datatables/tree/2.3.7" - }, - "time": "2023-05-29T10:42:49+00:00" + "time": "2024-04-15T19:11:23+00:00" }, { "name": "php-http/client-common", @@ -4396,16 +4353,16 @@ }, { "name": "sendgrid/php-http-client", - "version": "4.1.0", + "version": "4.1.1", "source": { "type": "git", "url": "https://github.com/sendgrid/php-http-client.git", - "reference": "84fe926f3d2ac3454f088c9a06ebdc398cc3727e" + "reference": "ec09bcfccabeb21d69e245a1e1c0e51f2813fc35" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sendgrid/php-http-client/zipball/84fe926f3d2ac3454f088c9a06ebdc398cc3727e", - "reference": "84fe926f3d2ac3454f088c9a06ebdc398cc3727e", + "url": "https://api.github.com/repos/sendgrid/php-http-client/zipball/ec09bcfccabeb21d69e245a1e1c0e51f2813fc35", + "reference": "ec09bcfccabeb21d69e245a1e1c0e51f2813fc35", "shasum": "" }, "require": { @@ -4452,22 +4409,22 @@ "sendgrid" ], "support": { - "source": "https://github.com/sendgrid/php-http-client/tree/4.1.0" + "source": "https://github.com/sendgrid/php-http-client/tree/4.1.1" }, - "time": "2023-12-01T05:16:21+00:00" + "time": "2023-12-14T08:50:59+00:00" }, { "name": "sendgrid/sendgrid", - "version": "8.1.1", + "version": "8.1.2", "source": { "type": "git", "url": "https://github.com/sendgrid/sendgrid-php.git", - "reference": "08514e75789f192c034fdcf18efe6d8b1a7c91da" + "reference": "6700d2cf50df38915fa2d9a03affbca58c48599f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sendgrid/sendgrid-php/zipball/08514e75789f192c034fdcf18efe6d8b1a7c91da", - "reference": "08514e75789f192c034fdcf18efe6d8b1a7c91da", + "url": "https://api.github.com/repos/sendgrid/sendgrid-php/zipball/6700d2cf50df38915fa2d9a03affbca58c48599f", + "reference": "6700d2cf50df38915fa2d9a03affbca58c48599f", "shasum": "" }, "require": { @@ -4476,7 +4433,7 @@ "ext-mbstring": "*", "ext-openssl": "*", "php": ">=7.3", - "sendgrid/php-http-client": "4.1.0", + "sendgrid/php-http-client": "~4.1", "starkbank/ecdsa": "0.*" }, "replace": { @@ -4517,9 +4474,9 @@ "twilio sendgrid" ], "support": { - "source": "https://github.com/sendgrid/sendgrid-php/tree/8.1.1" + "source": "https://github.com/sendgrid/sendgrid-php/tree/8.1.2" }, - "time": "2023-12-06T07:11:08+00:00" + "time": "2024-04-18T11:09:09+00:00" }, { "name": "sentry/sdk", @@ -4578,16 +4535,16 @@ }, { "name": "sentry/sentry", - "version": "4.6.1", + "version": "4.7.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "5a94184175e5830b589bf923da8c9c3af2c0f409" + "reference": "d6769b2a5e6bf19ed3bbfbf52328ceaf8e6fcb1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/5a94184175e5830b589bf923da8c9c3af2c0f409", - "reference": "5a94184175e5830b589bf923da8c9c3af2c0f409", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/d6769b2a5e6bf19ed3bbfbf52328ceaf8e6fcb1f", + "reference": "d6769b2a5e6bf19ed3bbfbf52328ceaf8e6fcb1f", "shasum": "" }, "require": { @@ -4651,7 +4608,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/4.6.1" + "source": "https://github.com/getsentry/sentry-php/tree/4.7.0" }, "funding": [ { @@ -4663,7 +4620,7 @@ "type": "custom" } ], - "time": "2024-03-08T08:18:09+00:00" + "time": "2024-04-10T13:22:13+00:00" }, { "name": "slim/http", @@ -5038,16 +4995,16 @@ }, { "name": "stripe/stripe-php", - "version": "v13.18.0", + "version": "v14.2.0", "source": { "type": "git", "url": "https://github.com/stripe/stripe-php.git", - "reference": "02abb043b103766f4ed920642ae56ffdc58c7467" + "reference": "6b77ba6b2f8791dabc5404befd6c0ead59203892" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stripe/stripe-php/zipball/02abb043b103766f4ed920642ae56ffdc58c7467", - "reference": "02abb043b103766f4ed920642ae56ffdc58c7467", + "url": "https://api.github.com/repos/stripe/stripe-php/zipball/6b77ba6b2f8791dabc5404befd6c0ead59203892", + "reference": "6b77ba6b2f8791dabc5404befd6c0ead59203892", "shasum": "" }, "require": { @@ -5091,9 +5048,9 @@ ], "support": { "issues": "https://github.com/stripe/stripe-php/issues", - "source": "https://github.com/stripe/stripe-php/tree/v13.18.0" + "source": "https://github.com/stripe/stripe-php/tree/v14.2.0" }, - "time": "2024-04-09T21:08:04+00:00" + "time": "2024-04-16T15:58:21+00:00" }, { "name": "symfony/clock", @@ -6410,30 +6367,37 @@ }, { "name": "twig/twig", - "version": "v3.8.0", + "version": "v3.9.3", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d" + "reference": "a842d75fed59cdbcbd3a3ad7fb9eb768fc350d58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", - "reference": "9d15f0ac07f44dc4217883ec6ae02fd555c6f71d", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/a842d75fed59cdbcbd3a3ad7fb9eb768fc350d58", + "reference": "a842d75fed59cdbcbd3a3ad7fb9eb768fc350d58", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-mbstring": "^1.3", "symfony/polyfill-php80": "^1.22" }, "require-dev": { "psr/container": "^1.0|^2.0", - "symfony/phpunit-bridge": "^5.4.9|^6.3|^7.0" + "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0" }, "type": "library", "autoload": { + "files": [ + "src/Resources/core.php", + "src/Resources/debug.php", + "src/Resources/escaper.php", + "src/Resources/string_loader.php" + ], "psr-4": { "Twig\\": "src/" } @@ -6466,7 +6430,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v3.8.0" + "source": "https://github.com/twigphp/Twig/tree/v3.9.3" }, "funding": [ { @@ -6478,7 +6442,7 @@ "type": "tidelift" } ], - "time": "2023-11-21T18:54:41+00:00" + "time": "2024-04-18T11:59:33+00:00" }, { "name": "vectorface/googleauthenticator", @@ -7273,16 +7237,16 @@ }, { "name": "friendsofphp/php-cs-fixer", - "version": "v3.53.0", + "version": "v3.54.0", "source": { "type": "git", "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", - "reference": "69a19093a9ded8d1baac62ed6c009b8bc148d008" + "reference": "2aecbc8640d7906c38777b3dcab6f4ca79004d08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/69a19093a9ded8d1baac62ed6c009b8bc148d008", - "reference": "69a19093a9ded8d1baac62ed6c009b8bc148d008", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/2aecbc8640d7906c38777b3dcab6f4ca79004d08", + "reference": "2aecbc8640d7906c38777b3dcab6f4ca79004d08", "shasum": "" }, "require": { @@ -7354,7 +7318,7 @@ ], "support": { "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", - "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.53.0" + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.54.0" }, "funding": [ { @@ -7362,7 +7326,7 @@ "type": "github" } ], - "time": "2024-04-08T15:03:00+00:00" + "time": "2024-04-17T08:12:13+00:00" }, { "name": "justinrainbow/json-schema", @@ -8288,16 +8252,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.17", + "version": "10.5.19", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c1f736a473d21957ead7e94fcc029f571895abf5" + "reference": "c726f0de022368f6ed103e452a765d3304a996a4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c1f736a473d21957ead7e94fcc029f571895abf5", - "reference": "c1f736a473d21957ead7e94fcc029f571895abf5", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c726f0de022368f6ed103e452a765d3304a996a4", + "reference": "c726f0de022368f6ed103e452a765d3304a996a4", "shasum": "" }, "require": { @@ -8369,7 +8333,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.17" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.19" }, "funding": [ { @@ -8385,7 +8349,7 @@ "type": "tidelift" } ], - "time": "2024-04-05T04:39:01+00:00" + "time": "2024-04-17T14:06:18+00:00" }, { "name": "psr/cache", diff --git a/resources/views/tabler/admin/announcement/create.tpl b/resources/views/tabler/admin/announcement/create.tpl index 451c7e6db0..79c99795a1 100644 --- a/resources/views/tabler/admin/announcement/create.tpl +++ b/resources/views/tabler/admin/announcement/create.tpl @@ -1,7 +1,5 @@ {include file='admin/header.tpl'} - -
    - @@ -61,27 +59,10 @@
    - -
    - @@ -40,27 +38,10 @@
    - -
    - -
    - @@ -46,27 +44,10 @@
    - + + + + diff --git a/src/Controllers/Admin/AnnController.php b/src/Controllers/Admin/AnnController.php index 5932321f6c..cafb0d7cd4 100644 --- a/src/Controllers/Admin/AnnController.php +++ b/src/Controllers/Admin/AnnController.php @@ -116,7 +116,7 @@ public function add(ServerRequest $request, Response $response, array $args): Re if (Config::obtain('enable_telegram')) { try { (new Telegram())->sendHtml(0, '新公告:' . PHP_EOL . $content); - } catch (TelegramSDKException $e) { + } catch (TelegramSDKException) { return $response->withJson([ 'ret' => 0, 'msg' => $email_notify === 1 ? '公告添加成功,邮件发送成功,Telegram发送失败' : '公告添加成功,Telegram发送失败', @@ -164,7 +164,7 @@ public function update(ServerRequest $request, Response $response, array $args): if (Config::obtain('enable_telegram')) { try { (new Telegram())->sendHtml(0, '公告更新:' . PHP_EOL . $request->getParam('content')); - } catch (TelegramSDKException $e) { + } catch (TelegramSDKException) { return $response->withJson([ 'ret' => 0, 'msg' => '公告更新成功,Telegram发送失败', diff --git a/src/Controllers/Admin/NodeController.php b/src/Controllers/Admin/NodeController.php index 629d4057e0..9be806893d 100644 --- a/src/Controllers/Admin/NodeController.php +++ b/src/Controllers/Admin/NodeController.php @@ -140,7 +140,7 @@ public function add(ServerRequest $request, Response $response, array $args): Re Config::obtain('telegram_add_node_text') ) ); - } catch (TelegramSDKException $e) { + } catch (TelegramSDKException) { return $response->withJson([ 'ret' => 1, 'msg' => '添加成功,但 Telegram 通知失败', @@ -234,7 +234,7 @@ public function update(ServerRequest $request, Response $response, array $args): Config::obtain('telegram_update_node_text') ) ); - } catch (TelegramSDKException $e) { + } catch (TelegramSDKException) { return $response->withJson([ 'ret' => 1, 'msg' => '修改成功,但 Telegram 通知失败', @@ -296,7 +296,7 @@ public function delete(ServerRequest $request, Response $response, array $args): Config::obtain('telegram_delete_node_text') ) ); - } catch (TelegramSDKException $e) { + } catch (TelegramSDKException) { return $response->withJson([ 'ret' => 1, 'msg' => '删除成功,但Telegram通知失败', diff --git a/src/Controllers/Admin/UserController.php b/src/Controllers/Admin/UserController.php index 52dde57854..18bb637b99 100644 --- a/src/Controllers/Admin/UserController.php +++ b/src/Controllers/Admin/UserController.php @@ -140,7 +140,7 @@ public function create(ServerRequest $request, Response $response, array $args): return $response->withJson([ 'ret' => 1, - 'msg' => '添加成功,用户邮箱:'.$email.' 密码:'.$password, + 'msg' => '添加成功,用户邮箱:' . $email . ' 密码:'.$password, ]); } diff --git a/src/Controllers/AuthController.php b/src/Controllers/AuthController.php index 2c859ff8d0..fbf7de98fa 100644 --- a/src/Controllers/AuthController.php +++ b/src/Controllers/AuthController.php @@ -183,7 +183,7 @@ public function sendVerify(ServerRequest $request, Response $response, $next): R 'expire' => date('Y-m-d H:i:s', time() + Config::obtain('email_verify_code_ttl')), ] ); - } catch (Exception|ClientExceptionInterface $e) { + } catch (Exception|ClientExceptionInterface) { return ResponseHelper::error($response, '邮件发送失败,请联系网站管理员。'); } diff --git a/src/Controllers/PasswordController.php b/src/Controllers/PasswordController.php index e9611d1321..586248df61 100644 --- a/src/Controllers/PasswordController.php +++ b/src/Controllers/PasswordController.php @@ -68,7 +68,7 @@ public function handleReset(ServerRequest $request, Response $response, array $a if ($user !== null) { try { Password::sendResetEmail($email); - } catch (ClientExceptionInterface|RedisException $e) { + } catch (ClientExceptionInterface|RedisException) { $msg = '邮件发送失败'; } } diff --git a/src/Models/Node.php b/src/Models/Node.php index 574c637e89..48806927ca 100644 --- a/src/Models/Node.php +++ b/src/Models/Node.php @@ -131,7 +131,7 @@ public function updateNodeIp(): void $result = dns_get_record($this->server, DNS_A + DNS_AAAA); $this->ipv4 = $result[0]['ip'] ?? '127.0.0.1'; $this->ipv6 = $result[1]['ipv6'] ?? '::1'; - } catch (Exception $e) { + } catch (Exception) { $this->ipv4 = '127.0.0.1'; $this->ipv6 = '::1'; } diff --git a/src/Models/SubscribeLog.php b/src/Models/SubscribeLog.php index 69e7018263..61d46d438c 100644 --- a/src/Models/SubscribeLog.php +++ b/src/Models/SubscribeLog.php @@ -43,7 +43,7 @@ public function getLocationAttribute(): string { try { return Tools::getIpLocation($this->request_ip); - } catch (Exception $e) { + } catch (Exception) { return '未知'; } } diff --git a/src/Models/User.php b/src/Models/User.php index d646738a14..92d6258a92 100644 --- a/src/Models/User.php +++ b/src/Models/User.php @@ -95,7 +95,7 @@ final class User extends Model */ public function getDiceBearAttribute(): string { - return 'https://api.dicebear.com/7.x/identicon/svg?seed=' . hash('sha3-256', $this->email); + return 'https://api.dicebear.com/8.x/identicon/svg?seed=' . hash('sha3-256', $this->email); } /** diff --git a/src/Services/Bot/Telegram/Callback.php b/src/Services/Bot/Telegram/Callback.php index 3c984f3160..99d68156e6 100644 --- a/src/Services/Bot/Telegram/Callback.php +++ b/src/Services/Bot/Telegram/Callback.php @@ -987,7 +987,7 @@ public function userCheckin(): void if (! $traffic) { $msg = '签到失败'; } else { - $msg = '获得了 ' . $traffic . 'MB 流量.'; + $msg = '获得了 ' . $traffic . 'MB 流量'; } } else { $msg = '你今天已经签到过了'; diff --git a/src/Services/Bot/Telegram/Commands/CheckinCommand.php b/src/Services/Bot/Telegram/Commands/CheckinCommand.php index 8714a387c6..c98fcbaab2 100644 --- a/src/Services/Bot/Telegram/Commands/CheckinCommand.php +++ b/src/Services/Bot/Telegram/Commands/CheckinCommand.php @@ -23,7 +23,7 @@ final class CheckinCommand extends Command /** * @var string Command Description */ - protected string $description = '[群组/私聊] 每日签到.'; + protected string $description = '[群组/私聊] 每日签到'; /** * {@inheritdoc} @@ -71,7 +71,7 @@ public function handle() if (! $traffic) { $msg = '签到失败'; } else { - $msg = '获得了 ' . $traffic . 'MB 流量.'; + $msg = '获得了 ' . $traffic . 'MB 流量'; } } else { $msg = '你今天已经签到过了'; diff --git a/src/Services/Bot/Telegram/Commands/HelpCommand.php b/src/Services/Bot/Telegram/Commands/HelpCommand.php index 12d85c1ddb..4761e150aa 100644 --- a/src/Services/Bot/Telegram/Commands/HelpCommand.php +++ b/src/Services/Bot/Telegram/Commands/HelpCommand.php @@ -23,7 +23,7 @@ final class HelpCommand extends Command /** * @var string Command Description */ - protected string $description = '[群组/私聊] 系统中可用的所有命令.'; + protected string $description = '[群组/私聊] 系统中可用的所有指令'; public function handle(): void { @@ -41,7 +41,7 @@ public function handle(): void $this->replyWithChatAction(['action' => Actions::TYPING]); $commands = $this->telegram->getCommands(); - $text = '系统中可用的所有命令.'; + $text = '系统中可用的所有指令:'; $text .= PHP_EOL . PHP_EOL; foreach ($commands as $name => $handler) { diff --git a/src/Services/Bot/Telegram/Commands/MenuCommand.php b/src/Services/Bot/Telegram/Commands/MenuCommand.php index e003713e06..c80ece84a3 100644 --- a/src/Services/Bot/Telegram/Commands/MenuCommand.php +++ b/src/Services/Bot/Telegram/Commands/MenuCommand.php @@ -23,7 +23,7 @@ final class MenuCommand extends Command /** * @var string Command Description */ - protected string $description = '[私聊] 用户主菜单、个人中心.'; + protected string $description = '[私聊] 个人中心'; /** * {@inheritdoc} diff --git a/src/Services/Bot/Telegram/Commands/MyCommand.php b/src/Services/Bot/Telegram/Commands/MyCommand.php index c7b8ba37ab..18e16d7f67 100644 --- a/src/Services/Bot/Telegram/Commands/MyCommand.php +++ b/src/Services/Bot/Telegram/Commands/MyCommand.php @@ -25,7 +25,7 @@ final class MyCommand extends Command /** * @var string Command Description */ - protected string $description = '[群组/私聊] 我的个人信息.'; + protected string $description = '[群组/私聊] 我的个人信息'; /** * {@inheritdoc} diff --git a/src/Services/Bot/Telegram/Commands/PingCommand.php b/src/Services/Bot/Telegram/Commands/PingCommand.php index 209361290c..db25db7188 100644 --- a/src/Services/Bot/Telegram/Commands/PingCommand.php +++ b/src/Services/Bot/Telegram/Commands/PingCommand.php @@ -23,7 +23,7 @@ final class PingCommand extends Command /** * @var string Command Description */ - protected string $description = '[群组/私聊] 获取我或者群组的唯一 ID.'; + protected string $description = '[群组/私聊] 获取我或者群组的唯一 ID'; public function handle(): void { @@ -38,7 +38,7 @@ public function handle(): void $text = [ 'Pong!', - '你的 ID 是 ' . $chat_id . '.', + 'User ID is ' . $chat_id, ]; // 回送信息 @@ -59,8 +59,8 @@ public function handle(): void $text = [ 'Pong!', - '你的 ID 是 ' . $message->getFrom()->getId() . '.', - '这个群组的 ID 是 ' . $chat_id . '.', + 'User ID is ' . $message->getFrom()->getId(), + 'Group ID is ' . $chat_id, ]; // 回送信息 diff --git a/src/Services/Bot/Telegram/Commands/StartCommand.php b/src/Services/Bot/Telegram/Commands/StartCommand.php index 00dcb41531..56e73a74cc 100644 --- a/src/Services/Bot/Telegram/Commands/StartCommand.php +++ b/src/Services/Bot/Telegram/Commands/StartCommand.php @@ -21,7 +21,7 @@ final class StartCommand extends Command /** * @var string Command Description */ - protected string $description = '[群组/私聊] Bot 初始命令.'; + protected string $description = '[群组/私聊] Bot 初始命令'; public function handle(): void { @@ -47,7 +47,7 @@ public function handle(): void // 回送信息 $this->replyWithMessage( [ - 'text' => '喵喵喵.', + 'text' => '?', 'parse_mode' => 'Markdown', 'reply_to_message_id' => $message->getMessageId(), ] diff --git a/src/Services/Bot/Telegram/Commands/UnbindCommand.php b/src/Services/Bot/Telegram/Commands/UnbindCommand.php index aa1f724577..d6817387e8 100644 --- a/src/Services/Bot/Telegram/Commands/UnbindCommand.php +++ b/src/Services/Bot/Telegram/Commands/UnbindCommand.php @@ -27,7 +27,7 @@ final class UnbindCommand extends Command /** * @var string Command Description */ - protected string $description = '[私聊] 解除账户绑定.'; + protected string $description = '[私聊] 解除账户绑定'; /** * @throws TelegramSDKException @@ -109,10 +109,10 @@ public function handle(): void public function sendText(): string { - $text = '以 `/unbind example@qq.com` 的形式发送进行解绑.'; + $text = '以 `/unbind example@gmail.com` 的形式发送进行解绑。'; if (Config::obtain('telegram_unbind_kick_member')) { - $text .= PHP_EOL . PHP_EOL . '根据管理员的设定,你解绑账户将会被自动移出用户群.'; + $text .= PHP_EOL . PHP_EOL . '根据管理员的设定,你解绑账户将会被自动移出用户群。'; } return $text; diff --git a/src/Services/Bot/Telegram/Message.php b/src/Services/Bot/Telegram/Message.php index 4a844a5a83..98a3eb819b 100644 --- a/src/Services/Bot/Telegram/Message.php +++ b/src/Services/Bot/Telegram/Message.php @@ -87,7 +87,7 @@ public function newChatParticipant(): void $member = [ 'id' => $new_chat_member->getId(), - 'name' => $new_chat_member->getFirstName() . ' Message.php' . $new_chat_member->getLastName(), + 'name' => $new_chat_member->getFirstName() . ' ' . $new_chat_member->getLastName(), ]; if ($new_chat_member->getUsername() === Config::obtain('telegram_bot')) { @@ -96,13 +96,6 @@ public function newChatParticipant(): void && ! in_array($this->chat_id, json_decode(Config::obtain('group_id_allowed_to_join')))) { // 退群 - - $this->replyWithMessage( - [ - 'text' => '不约,叔叔我们不约.', - ] - ); - self::sendPost( 'kickChatMember', [ @@ -131,7 +124,7 @@ public function newChatParticipant(): void ) { $this->replyWithMessage( [ - 'text' => '由于 ' . $member['name'] . ' 未绑定账户,将被移除。', + 'text' => $member['name'] . ' 未绑定 Telegram 账户,将被移除。', ] ); @@ -196,9 +189,9 @@ public static function getUserInfo(User $user): string public static function getUserTitle(User $user): string { if ($user->class > 0) { - $text = '尊敬的 VIP ' . $user->class . ' 你好:'; + $text = '付费用户你好:'; } else { - $text = '尊敬的用户你好:'; + $text = '免费用户你好:'; } return $text; @@ -236,10 +229,9 @@ public static function sendPost($method, $params): void * 搜索用户 * * @param int $value 搜索值 - * @param string $method 查找列 */ - public static function getUser(int $value, string $method = 'im_value'): null|Model|User + public static function getUser(int $value): null|Model|User { - return (new User())->where('im_type', 4)->where($method, $value)->first(); + return (new User())->where('im_type', 4)->where('im_value', $value)->first(); } } diff --git a/src/Services/Gateway/PayPal.php b/src/Services/Gateway/PayPal.php index 909c83bd5f..94e3d1d272 100644 --- a/src/Services/Gateway/PayPal.php +++ b/src/Services/Gateway/PayPal.php @@ -63,11 +63,6 @@ public static function _readableName(): string return 'PayPal'; } - /** - * @throws GuzzleException - * @throws RedisException - * @throws Throwable - */ public function purchase(ServerRequest $request, Response $response, array $args): ResponseInterface { $price = $this->antiXss->xss_clean($request->getParam('price')); @@ -81,7 +76,14 @@ public function purchase(ServerRequest $request, Response $response, array $args ]); } - $exchange_amount = (new Exchange())->exchange($price, 'CNY', Config::obtain('paypal_currency')); + try { + $exchange_amount = (new Exchange())->exchange($price, 'CNY', Config::obtain('paypal_currency')); + } catch (GuzzleException|RedisException) { + return $response->withJson([ + 'ret' => 0, + 'msg' => '汇率获取失败', + ]); + } $order_data = [ 'intent' => 'CAPTURE', @@ -96,36 +98,44 @@ public function purchase(ServerRequest $request, Response $response, array $args ], ]; - $pp = new PayPalClient($this->gateway_config); - $pp->getAccessToken(); - - $order = $pp->createOrder($order_data); + try { + $pp = new PayPalClient($this->gateway_config); + $pp->getAccessToken(); + $order = $pp->createOrder($order_data); + } catch (Throwable) { + return $response->withJson([ + 'ret' => 0, + 'msg' => 'PayPal API Error', + ]); + } $user = Auth::getUser(); - $pl = new Paylist(); + $pl = new Paylist(); $pl->userid = $user->id; $pl->total = $price; $pl->invoice_id = $invoice_id; $pl->tradeno = $trade_no; $pl->gateway = self::_readableName(); - $pl->save(); return $response->withJson($order); } - /** - * @throws Throwable - */ public function notify($request, $response, $args): ResponseInterface { $order_id = $this->antiXss->xss_clean($request->getParam('order_id')); - $pp = new PayPalClient($this->gateway_config); - $pp->getAccessToken(); - - $result = $pp->capturePaymentOrder($order_id); + try { + $pp = new PayPalClient($this->gateway_config); + $pp->getAccessToken(); + $result = $pp->capturePaymentOrder($order_id); + } catch (Throwable) { + return $response->withJson([ + 'ret' => 0, + 'msg' => 'PayPal API Error', + ]); + } if (isset($result['status']) && $result['status'] === 'COMPLETED') { $this->postPayment($result['purchase_units'][0]['reference_id']); diff --git a/src/Services/Gateway/Stripe.php b/src/Services/Gateway/Stripe.php index 8d342cb598..0573fdb7a8 100644 --- a/src/Services/Gateway/Stripe.php +++ b/src/Services/Gateway/Stripe.php @@ -45,10 +45,6 @@ public static function _readableName(): string return 'Stripe'; } - /** - * @throws GuzzleException - * @throws RedisException - */ public function purchase(ServerRequest $request, Response $response, array $args): ResponseInterface { $price = $this->antiXss->xss_clean($request->getParam('price')); @@ -65,8 +61,8 @@ public function purchase(ServerRequest $request, Response $response, array $args } $user = Auth::getUser(); - $pl = new Paylist(); + $pl = new Paylist(); $pl->userid = $user->id; $pl->total = $price; $pl->invoice_id = $invoice_id; @@ -74,7 +70,14 @@ public function purchase(ServerRequest $request, Response $response, array $args $pl->gateway = self::_readableName(); $pl->save(); - $exchange_amount = (new Exchange())->exchange((float) $price, 'CNY', Config::obtain('stripe_currency')); + try { + $exchange_amount = (new Exchange())->exchange((float) $price, 'CNY', Config::obtain('stripe_currency')); + } catch (GuzzleException|RedisException) { + return $response->withJson([ + 'ret' => 0, + 'msg' => '汇率获取失败', + ]); + } StripeSDK::setApiKey(Config::obtain('stripe_sk')); $session = null; @@ -103,7 +106,7 @@ public function purchase(ServerRequest $request, Response $response, array $args 'success_url' => $_ENV['baseUrl'] . '/user/invoice/' . $invoice_id, 'cancel_url' => $_ENV['baseUrl'] . '/user/invoice/' . $invoice_id, ]); - } catch (ApiErrorException $e) { + } catch (ApiErrorException) { return $response->withJson([ 'ret' => 0, 'msg' => 'Stripe API error', diff --git a/src/Services/LLM/VertexAI.php b/src/Services/LLM/VertexAI.php index 5f27712abe..b94fd9da0c 100644 --- a/src/Services/LLM/VertexAI.php +++ b/src/Services/LLM/VertexAI.php @@ -21,7 +21,7 @@ public function textPrompt(string $q): string $client = new Client(); - $api_url = 'https://' . $_ENV['vertex_ai_location'] .'-aiplatform.googleapis.com/v1/projects/' . + $api_url = 'https://' . $_ENV['vertex_ai_location'] . '-aiplatform.googleapis.com/v1/projects/' . $_ENV['vertex_ai_project_id'] . '/locations/' . $_ENV['vertex_ai_location'] . '/publishers/google/models/' . $_ENV['vertex_ai_model_id'] . ':streamGenerateContent'; diff --git a/src/Services/RateLimit.php b/src/Services/RateLimit.php index adacb00396..06622ed017 100644 --- a/src/Services/RateLimit.php +++ b/src/Services/RateLimit.php @@ -36,7 +36,7 @@ public function checkRateLimit(string $limit_type, string $value): bool try { $limiter->limit($value); - } catch (LimitExceeded $e) { + } catch (LimitExceeded) { return false; } diff --git a/src/Services/Reward.php b/src/Services/Reward.php index 110fde884d..0656ab27b3 100644 --- a/src/Services/Reward.php +++ b/src/Services/Reward.php @@ -134,7 +134,7 @@ public static function issueCheckinReward($user_id): int|false } else { try { $traffic = random_int($checkin_min, $checkin_max); - } catch (Exception $e) { + } catch (Exception) { $traffic = 0; } } diff --git a/src/Utils/Tools.php b/src/Utils/Tools.php index 911ebdc826..ad5e4f3a9b 100644 --- a/src/Utils/Tools.php +++ b/src/Utils/Tools.php @@ -57,19 +57,19 @@ public static function getIpLocation(string $ip): string if ($_ENV['maxmind_license_key'] !== '') { try { $geoip = new GeoIP2(); - } catch (InvalidDatabaseException $e) { + } catch (InvalidDatabaseException) { return $data; } try { $city = $geoip->getCity($ip); - } catch (AddressNotFoundException|InvalidDatabaseException $e) { + } catch (AddressNotFoundException|InvalidDatabaseException) { $city = '未知城市'; } try { $country = $geoip->getCountry($ip); - } catch (AddressNotFoundException|InvalidDatabaseException $e) { + } catch (AddressNotFoundException|InvalidDatabaseException) { $country = '未知国家'; } } @@ -182,7 +182,7 @@ public static function genRandomChar(int $length = 8): string|false try { $randomString = bin2hex(random_bytes((int) ceil($length / 2))); - } catch (RandomException $e) { + } catch (RandomException) { return false; } diff --git a/update.sh b/update.sh index e3375c674b..ae0b97c7c4 100644 --- a/update.sh +++ b/update.sh @@ -1,9 +1,6 @@ #!/usr/bin/bash cat << "EOF" -SSPanel-UIM update script -Author: M1Screw -Github: https://github.com/sspanel-uim/SSPanel-Uim-Dev Usage: ./update.sh dev --> Upgrade to the latest development version ./update.sh release $release_version $db_version --> Upgrade to the release version with the specified database version