Commit Graph

564 Commits

Author SHA1 Message Date
xboard
f82a19f591 fix: resolve Telegram ticket notification issue 2025-08-08 02:53:44 +08:00
Xboard
9f9db03cc3 Merge pull request #612 from xcxnig/patch-1
fix(stash): fix Flow network and SNI issues
2025-08-08 02:44:58 +08:00
Miku
ca05b65638 fix(stash): fix Flow network and SNI issues 2025-08-02 02:07:29 +08:00
Katana
0971805caa Add missing extension
Fix: Call to undefined function Illuminate\Support\mb_split()
2025-07-30 16:52:01 +08:00
xboard
1405cb0b99 fix: change user default_at to 0 2025-07-27 08:11:42 +08:00
xboard
c4dc9669f3 fix: correct errors in database migration file 2025-07-27 08:00:49 +08:00
xboard
78e7be8766 feat: add plugin migrations and fix plan management bugs
- Plugin database migration support
- Fix empty prices error in plan management
- Plugin update functionality
- Custom shadowsocks encryption algorithms
2025-07-27 00:19:14 +08:00
xboard
58868268dd feat: enhance plugin management
- Add command support for plugin management
- Optimize plugin management page layout
- Add email copy functionality for users
- Convert payment methods and Telegram Bot to plugin system
2025-07-26 18:49:58 +08:00
swcoffee
738b433041 fix: missing field 'version' when distributing tuic protocol in stash
stash下发tuic协议时缺少version字段,会导致订阅无法使用
2025-07-26 13:46:54 +08:00
xboard
02d853d46a update composer.yaml 2025-07-23 16:47:48 +08:00
xboard
97f84286d8 fix: announcement sorting issue 2025-07-22 04:28:39 +08:00
xboard
7adfd160cc fix: make subscribe url cofig changes take effect immediately under octane 2025-07-22 03:25:13 +08:00
xboard
cd5f444b24 fix(theme): qx import issue and long title display 2025-07-22 02:01:46 +08:00
xboard
920b5b12ec fix: sub link types not working 2025-07-22 01:33:59 +08:00
xboard
06cbe0e478 fix: correct return_url generation for payment in frontend-backend separated deployment 2025-07-21 23:54:00 +08:00
xboard
6649924d10 fix: align user action buttons, add json/yaml support for plugin config, improve formatTrafficSize, show processed commission
- Aligned user action buttons in dropdown for consistent UI.
- Added JSON and YAML support in plugin config form with Monaco Editor and resizable height.
- Improved formatTrafficSize to handle large numbers and prevent undefined units.
- Order detail now shows commission info when commission_status is 1 or 2.
2025-07-21 23:52:07 +08:00
xboard
c9bab8fb02 feat: add multiple hooks, pligun schedule support ,add hook:list artisan command 2025-07-21 13:29:17 +08:00
xboard
768e14bdb9 fix: gift card redemption limits validation 2025-07-21 09:28:00 +08:00
xboard
61773a13b4 fix: resolve issue where dynamic rate cannot be disabled 2025-07-21 08:29:14 +08:00
xboard
90360cfeb5 fix: resolve theme refresh issue after updates 2025-07-21 08:27:41 +08:00
xboard
bcfda44730 fix: resolve traffic reset time generation and refactor reset logic
- Add fix-null mode to ResetTraffic command
- Refactor reset logic for better separation of concerns
- Update migration to reuse fix functionality
2025-07-19 14:22:01 +08:00
xboard
063a10f6bb refactor: rename hook form traffic.before_process to traffic.process.before 2025-07-18 23:39:19 +08:00
xboard
508caebdcd refactor: refactor subscription delivery logic, change payment return_url to origin_url concatenation
- Unify protocol filter configuration to client.type.field (dot-path, three-segment) format, support strict whitelist mode
- Refactor AbstractProtocol and all protocol classes for more flexible and maintainable subscription delivery
- Change payment callback logic: use origin_url concatenation instead of return_url for more accurate redirects
2025-07-18 15:42:58 +08:00
xboard
e2d7b6a5e0 feat(hook): add order.create.after, order.open.before, order.open.after, and protocol.servers.filtered hooks 2025-07-17 12:34:31 +08:00
xboard
10ff5d7b27 feat: consider remaining traffic in surplus calculation when resetting traffic on plan change 2025-07-17 12:13:03 +08:00
xboard
4a7eef8ad6 refactor: optimize surplus value calculation for plan deduction 2025-07-17 11:32:34 +08:00
xboard
c4834255c0 style(theme): announcement carousel content and set full-width background 2025-07-16 11:03:07 +08:00
xboard
6fdb083809 feat(plugin hook): add client.subscribe.unavailable hook 2025-07-16 00:08:30 +08:00
xboard
ac08199580 fix: fix Redis RDB snapshot permission error 2025-07-15 23:09:38 +08:00
xboard
ba2f305f33 fix: theme switch service 2025-07-15 20:50:04 +08:00
Xboard
acf05c6107 Merge pull request #558 from Hei-XiaoHu/update-memory-limit
Increase Horizon memory_limit to prevent container memory exhaustion
2025-07-15 03:23:55 +08:00
xboard
d30e9cb30b chore: code style and type declaration improvements 2025-07-15 02:55:58 +08:00
xboard
b55a56d6a7 feat: improve traffic reset precision and admin features
- Increase traffic reset granularity to seconds
- Add next reset time display in admin pane
2025-07-15 02:18:33 +08:00
xboard
706ba5a7a9 feat: support theme update and various improvements
- Add support for updating themes if a newer version is uploaded
- Hide config button for plugins without configuration items
- Auto refresh theme cache after panel update
- Fix issue where user used traffic cannot be set as a decimal
- Fix subscription issue for shadowrocket in v2board theme
2025-07-15 01:26:14 +08:00
xboard
f6cf6706c7 fix(admin): handle null rate_time_ranges when editing server nodes to prevent 500 error 2025-07-14 10:19:08 +08:00
xboard
0311a93252 fix(i18n): correct traffic unit display for gift card template rewards 2025-07-14 00:39:54 +08:00
xboard
a838a43ae5 feat: multiple improvements and bug fixes
- Add gift card redemption feature
- Resolve custom range selection issue in overview
- Allow log page size to be modified
- Add subscription path change notification
- Improve dynamic node rate feature
- Support markdown documentation display for plugins
- Reduce power reset service logging
- Fix backend version number not updating after update
2025-07-14 00:33:04 +08:00
xboard
a01b94f131 fix(register): handle invalid invite code gracefully
Fix an issue where entering a non-existent invite code during registration would result in an unclear HTTP code 0 error. Now, the system properly validates the invite code and returns a clear error response if the code does not exist.
2025-07-13 21:19:33 +08:00
xboard
18de0e8a43 feat: add plugin update support + fix bugs 2025-07-13 08:53:00 +08:00
xboard
328461b093 fix(plugin): auto-remove plugin record if class file is missing 2025-07-12 21:54:12 +08:00
xboard
1bb1e032d6 remove redundant and unused payment methods 2025-07-12 03:43:39 +08:00
xboard
97788e3c8f feat: Add client.subscribe.servers hook for plugin-based server extension
- Add HookManager::filter('client.subscribe.servers') hook in ClientController::subscribe()
- Allow plugins to inject custom servers into subscription responses
- Update protocol classes to support extended server configurations
- Enable dynamic server list modification before protocol processing
2025-07-11 21:19:23 +08:00
xboard
1e59bc8ca1 fix(subscribe): Disable anytls protocol for Stash client 2025-07-11 08:48:02 +08:00
xboard
59263da76e feat: update plugin/config api 2025-07-09 18:07:38 +08:00
xboard
103b5ddbd6 fix: Subscription filter not working when using types=all parameter 2025-07-07 03:14:21 +08:00
xboard
d799c8df8b Fix: Handle raw DB expressions in user filter
A TypeError occurred when filtering the user list by the `total_used` computed attribute. The `applyQueryCondition` method expected a string for the field name, but received an `Illuminate\Database\Query\Expression` object from `DB::raw`.

This commit updates the `buildFilterQuery` method to check if the query field is an `Expression` instance. If so, it now uses `whereRaw` to apply the filter, preventing the type error and enabling filtering on computed fields. For standard string fields, it continues to use the original `applyQueryCondition` logic.Fix: Handle raw DB expressions in user filter

A TypeError occurred when filtering the user list by the `total_used` computed attribute. The `applyQueryCondition` method expected a string for the field name, but received an `Illuminate\Database\Query\Expression` object from `DB::raw`.

This commit updates the `buildFilterQuery` method to check if the query field is an `Expression` instance. If so, it now uses `whereRaw` to apply the filter, preventing the type error and enabling filtering on computed fields. For standard string fields, it continues to use the original `applyQueryCondition` logic.Fix: Handle raw DB expressions in user filter

A TypeError occurred when filtering the user list by the `total_used` computed attribute. The `applyQueryCondition` method expected a string for the field name, but received an `Illuminate\Database\Query\Expression` object from `DB::raw`.

This commit updates the `buildFilterQuery` method to check if the query field is an `Expression` instance. If so, it now uses `whereRaw` to apply the filter, preventing the type error and enabling filtering on computed fields. For standard string fields, it continues to use the original `applyQueryCondition` logic.Fix: Handle raw DB expressions in user filter

A TypeError occurred when filtering the user list by the `total_used` computed attribute. The `applyQueryCondition` method expected a string for the field name, but received an `Illuminate\Database\Query\Expression` object from `DB::raw`.

This commit updates the `buildFilterQuery` method to check if the query field is an `Expression` instance. If so, it now uses `whereRaw` to apply the filter, preventing the type error and enabling filtering on computed fields. For standard string fields, it continues to use the original `applyQueryCondition` logic.Fix: Handle raw DB expressions in user filter

A TypeError occurred when filtering the user list by the `total_used` computed attribute. The `applyQueryCondition` method expected a string for the field name, but received an `Illuminate\Database\Query\Expression` object from `DB::raw`.

This commit updates the `buildFilterQuery` method to check if the query field is an `Expression` instance. If so, it now uses `whereRaw` to apply the filter, preventing the type error and enabling filtering on computed fields. For standard string fields, it continues to use the original `applyQueryCondition` logic.Fix: Handle raw DB expressions in user filter

A TypeError occurred when filtering the user list by the `total_used` computed attribute. The `applyQueryCondition` method expected a string for the field name, but received an `Illuminate\Database\Query\Expression` object from `DB::raw`.

This commit updates the `buildFilterQuery` method to check if the query field is an `Expression` instance. If so, it now uses `whereRaw` to apply the filter, preventing the type error and enabling filtering on computed fields. For standard string fields, it continues to use the original `applyQueryCondition` logic.Fix: Handle raw DB expressions in user filter

A TypeError occurred when filtering the user list by the `total_used` computed attribute. The `applyQueryCondition` method expected a string for the field name, but received an `Illuminate\Database\Query\Expression` object from `DB::raw`.

This commit updates the `buildFilterQuery` method to check if the query field is an `Expression` instance. If so, it now uses `whereRaw` to apply the filter, preventing the type error and enabling filtering on computed fields. For standard string fields, it continues to use the original `applyQueryCondition` logic.Fix: Handle raw DB expressions in user filter

A TypeError occurred when filtering the user list by the `total_used` computed attribute. The `applyQueryCondition` method expected a string for the field name, but received an `Illuminate\Database\Query\Expression` object from `DB::raw`.

This commit updates the `buildFilterQuery` method to check if the query field is an `Expression` instance. If so, it now uses `whereRaw` to apply the filter, preventing the type error and enabling filtering on computed fields. For standard string fields, it continues to use the original `applyQueryCondition` logic.Fix: Handle raw DB expressions in user filter

A TypeError occurred when filtering the user list by the `total_used` computed attribute. The `applyQueryCondition` method expected a string for the field name, but received an `Illuminate\Database\Query\Expression` object from `DB::raw`.

This commit updates the `buildFilterQuery` method to check if the query field is an `Expression` instance. If so, it now uses `whereRaw` to apply the filter, preventing the type error and enabling filtering on computed fields. For standard string fields, it continues to use the original `applyQueryCondition` logic.
2025-07-05 12:35:12 +08:00
xboard
a3c4cb1aea fix(setting): Resolve admin_setting helper incompatibility with Octane
Updated the `admin_setting` and `admin_settings_batch` helpers to retrieve the `Setting` instance from the service container. This fixes a fatal error and ensures correct behavior in a Laravel Octane environment by preventing the use of stale, shared static instances.
2025-07-04 22:16:19 +08:00
Xiaohu Hei
fc8caee0c3 Increase Horizon memory_limit configuration from 32MB to 64MB to support higher workload 2025-07-02 02:12:47 +08:00
xboard
05afe870e7 feat: add tags to plans, refactor order service, adn fix ticket lock 2025-07-01 11:14:18 +08:00
xboard
349c1710fe feat: add PostgreSQL support and refactor database configuration in install command 2025-07-01 03:09:53 +08:00