Przeglądaj źródła

feat: remove inactive user's link & invite

M1Screw 1 rok temu
rodzic
commit
71fe8eb00c

+ 3 - 2
app/routes.php

@@ -38,7 +38,9 @@ return static function (Slim\App $app): void {
         $group->get('/docs/{id:[0-9]+}/view', App\Controllers\User\DocsController::class . ':detail');
         // 个人资料
         $group->get('/profile', App\Controllers\UserController::class . ':profile');
-        $group->get('/invite', App\Controllers\UserController::class . ':invite');
+        // Invite
+        $group->get('/invite', App\Controllers\User\InviteController::class . ':index');
+        $group->post('/invite/reset', App\Controllers\User\InviteController::class . ':reset');
         // 封禁
         $group->get('/banned', App\Controllers\UserController::class . ':banned');
         // 节点
@@ -65,7 +67,6 @@ return static function (Slim\App $app): void {
         $group->post('/apitoken_reset', App\Controllers\User\InfoController::class . ':resetApiToken');
         $group->post('/method', App\Controllers\User\InfoController::class . ':updateMethod');
         $group->post('/url_reset', App\Controllers\User\InfoController::class . ':resetURL');
-        $group->post('/invite_reset', App\Controllers\User\InfoController::class . ':resetInviteURL');
         $group->post('/daily_mail', App\Controllers\User\InfoController::class . ':updateDailyMail');
         $group->post('/contact_method', App\Controllers\User\InfoController::class . ':updateContactMethod');
         $group->post('/theme', App\Controllers\User\InfoController::class . ':updateTheme');

+ 10 - 0
config/settings.json

@@ -1599,6 +1599,16 @@
         "default": "90",
         "mark": "未使用时长(天)"
     },
+    {
+        "id": null,
+        "item": "remove_inactive_user_link_and_invite",
+        "value": "0",
+        "class": "cron",
+        "is_public": 0,
+        "type": "bool",
+        "default": "0",
+        "mark": "Enable remove link and invite of inactive user"
+    },
     {
         "id": null,
         "item": "daily_job_hour",

+ 16 - 0
resources/views/tabler/admin/setting/cron.tpl

@@ -188,6 +188,22 @@
                                                        value="{$settings['detect_inactive_user_use_days']}">
                                             </div>
                                         </div>
+                                        <div class="form-group mb-3 row">
+                                            <label class="form-label col-3 col-form-label">是否启用移除闲置账号订阅链接与邀请码</label>
+                                            <div class="col">
+                                                <select id="remove_inactive_user_link_and_invite" class="col form-select"
+                                                        value="{$settings['remove_inactive_user_link_and_invite']}">
+                                                    <option value="0"
+                                                            {if ! $settings['remove_inactive_user_link_and_invite']}selected{/if}>
+                                                        关闭
+                                                    </option>
+                                                    <option value="1"
+                                                            {if $settings['remove_inactive_user_link_and_invite']}selected{/if}>
+                                                        开启
+                                                    </option>
+                                                </select>
+                                            </div>
+                                        </div>
                                     </div>
                                 </div>
                             </div>

+ 1 - 1
resources/views/tabler/user/invite.tpl

@@ -43,7 +43,7 @@
                                 <div class="card-footer">
                                     <div class="d-flex">
                                         <button id="reset-url" class="btn text-red btn-link"
-                                                hx-post="/user/invite_reset" hx-swap="none">
+                                                hx-post="/user/invite/reset" hx-swap="none">
                                             重置
                                         </button>
                                         <button data-clipboard-text="{$invite_url}"

+ 4 - 0
src/Command/Cron.php

@@ -63,6 +63,10 @@ EOL;
                 $jobs->detectInactiveUser();
             }
 
+            if (Config::obtain('remove_inactive_user_link_and_invite')) {
+                $jobs->removeInactiveUserLinkAndInvite();
+            }
+
             if (Config::obtain('telegram_diary')) {
                 $jobs->sendTelegramDiary();
             }

+ 1 - 0
src/Controllers/Admin/Setting/CronController.php

@@ -22,6 +22,7 @@ final class CronController extends BaseController
         'detect_inactive_user_checkin_days',
         'detect_inactive_user_login_days',
         'detect_inactive_user_use_days',
+        'remove_inactive_user_link_and_invite',
     ];
 
     /**

+ 5 - 1
src/Controllers/Admin/UserController.php

@@ -6,6 +6,7 @@ namespace App\Controllers\Admin;
 
 use App\Controllers\AuthController;
 use App\Controllers\BaseController;
+use App\Models\Config;
 use App\Models\User;
 use App\Models\UserMoneyLog;
 use App\Utils\Hash;
@@ -165,7 +166,10 @@ final class UserController extends BaseController
 
         if ($request->getParam('pass') !== '' && $request->getParam('pass') !== null) {
             $user->pass = Hash::passwordHash($request->getParam('pass'));
-            $user->cleanLink();
+
+            if (Config::obtain('enable_forced_replacement')) {
+                $user->removeLink();
+            }
         }
 
         if ($request->getParam('money') !== '' &&

+ 1 - 1
src/Controllers/PasswordController.php

@@ -133,7 +133,7 @@ final class PasswordController extends BaseController
         }
 
         if (Config::obtain('enable_forced_replacement')) {
-            $user->cleanLink();
+            $user->removeLink();
         }
 
         $redis->del('password_reset:' . $token);

+ 3 - 22
src/Controllers/User/InfoController.php

@@ -6,7 +6,6 @@ namespace App\Controllers\User;
 
 use App\Controllers\BaseController;
 use App\Models\Config;
-use App\Models\InviteCode;
 use App\Models\User;
 use App\Services\Auth;
 use App\Services\Cache;
@@ -130,9 +129,7 @@ final class InfoController extends BaseController
 
     public function unbindIM(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
-        $user = $this->user;
-
-        if (! $user->unbindIM()) {
+        if (! $this->user->unbindIM()) {
             return ResponseHelper::error($response, '解绑失败');
         }
 
@@ -172,7 +169,7 @@ final class InfoController extends BaseController
         }
 
         if (Config::obtain('enable_forced_replacement')) {
-            $user->cleanLink();
+            $user->removeLink();
         }
 
         return ResponseHelper::success($response, '修改成功');
@@ -233,27 +230,11 @@ final class InfoController extends BaseController
 
     public function resetURL(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
-        $user = $this->user;
-        $user->cleanLink();
+        $this->user->removeLink();
 
         return ResponseHelper::success($response, '重置成功');
     }
 
-    public function resetInviteURL(ServerRequest $request, Response $response, array $args): ResponseInterface
-    {
-        $user = $this->user;
-        $user->clearInviteCodes();
-        $code = (new InviteCode())->add($user->id);
-
-        return $response->withJson([
-            'ret' => 1,
-            'msg' => '重置成功',
-            'data' => [
-                'invite-url' => $_ENV['baseUrl'] . '/auth/register?code=' . $code,
-            ],
-        ]);
-    }
-
     public function updateDailyMail(ServerRequest $request, Response $response, array $args): ResponseInterface
     {
         $value = (int) $request->getParam('mail');

+ 71 - 0
src/Controllers/User/InviteController.php

@@ -0,0 +1,71 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Controllers\User;
+
+use App\Controllers\BaseController;
+use App\Models\Config;
+use App\Models\InviteCode;
+use App\Models\Payback;
+use App\Utils\Tools;
+use Exception;
+use Psr\Http\Message\ResponseInterface;
+use Slim\Http\Response;
+use Slim\Http\ServerRequest;
+
+final class InviteController extends BaseController
+{
+    /**
+     * @throws Exception
+     */
+    public function index(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
+    {
+        $code = (new InviteCode())->where('user_id', $this->user->id)->first()?->code;
+
+        if ($code === null) {
+            $code = (new InviteCode())->add($this->user->id);
+        }
+
+        $paybacks = (new Payback())->where('ref_by', $this->user->id)
+            ->orderBy('id', 'desc')
+            ->get();
+
+        foreach ($paybacks as $payback) {
+            $payback->datetime = Tools::toDateTime($payback->datetime);
+        }
+
+        $paybacks_sum = (new Payback())->where('ref_by', $this->user->id)->sum('ref_get');
+
+        if (! $paybacks_sum) {
+            $paybacks_sum = 0;
+        }
+
+        $invite_url = $_ENV['baseUrl'] . '/auth/register?code=' . $code;
+        $invite_reward_rate = Config::obtain('invite_reward_rate') * 100;
+
+        return $response->write(
+            $this->view()
+                ->assign('paybacks', $paybacks)
+                ->assign('invite_url', $invite_url)
+                ->assign('paybacks_sum', $paybacks_sum)
+                ->assign('invite_reward_rate', $invite_reward_rate)
+                ->fetch('user/invite.tpl')
+        );
+    }
+
+    public function reset(ServerRequest $request, Response $response, array $args): ResponseInterface
+    {
+        $user = $this->user;
+        $user->removeInvite();
+        $code = (new InviteCode())->add($user->id);
+
+        return $response->withJson([
+            'ret' => 1,
+            'msg' => '重置成功',
+            'data' => [
+                'invite-url' => $_ENV['baseUrl'] . '/auth/register?code=' . $code,
+            ],
+        ]);
+    }
+}

+ 0 - 40
src/Controllers/UserController.php

@@ -6,11 +6,9 @@ namespace App\Controllers;
 
 use App\Models\Ann;
 use App\Models\Config;
-use App\Models\InviteCode;
 use App\Models\LoginIp;
 use App\Models\Node;
 use App\Models\OnlineLog;
-use App\Models\Payback;
 use App\Services\Auth;
 use App\Services\Captcha;
 use App\Services\Reward;
@@ -100,44 +98,6 @@ final class UserController extends BaseController
         );
     }
 
-    /**
-     * @throws Exception
-     */
-    public function invite(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
-    {
-        $code = (new InviteCode())->where('user_id', $this->user->id)->first()?->code;
-
-        if ($code === null) {
-            $code = (new InviteCode())->add($this->user->id);
-        }
-
-        $paybacks = (new Payback())->where('ref_by', $this->user->id)
-            ->orderBy('id', 'desc')
-            ->get();
-
-        foreach ($paybacks as $payback) {
-            $payback->datetime = Tools::toDateTime($payback->datetime);
-        }
-
-        $paybacks_sum = (new Payback())->where('ref_by', $this->user->id)->sum('ref_get');
-
-        if (! $paybacks_sum) {
-            $paybacks_sum = 0;
-        }
-
-        $invite_url = $_ENV['baseUrl'] . '/auth/register?code=' . $code;
-        $invite_reward_rate = Config::obtain('invite_reward_rate') * 100;
-
-        return $response->write(
-            $this->view()
-                ->assign('paybacks', $paybacks)
-                ->assign('invite_url', $invite_url)
-                ->assign('paybacks_sum', $paybacks_sum)
-                ->assign('invite_reward_rate', $invite_reward_rate)
-                ->fetch('user/invite.tpl')
-        );
-    }
-
     public function checkin(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
     {
         if (! Config::obtain('enable_checkin') || ! $this->user->isAbleToCheckin()) {

+ 2 - 2
src/Models/User.php

@@ -226,7 +226,7 @@ final class User extends Model
     /**
      * 删除用户的订阅链接
      */
-    public function cleanLink(): void
+    public function removeLink(): void
     {
         (new Link())->where('userid', $this->id)->delete();
     }
@@ -234,7 +234,7 @@ final class User extends Model
     /**
      * 删除用户的邀请码
      */
-    public function clearInviteCodes(): void
+    public function removeInvite(): void
     {
         (new InviteCode())->where('user_id', $this->id)->delete();
     }

+ 1 - 1
src/Services/Bot/Telegram/Callback.php

@@ -540,7 +540,7 @@ final class Callback
         switch ($OpEnd) {
             case 'update_link':
                 // 重置订阅链接
-                $this->user->cleanLink();
+                $this->user->removeLink();
 
                 $this->answerCallbackQuery([
                     'text' => '订阅链接重置成功,请在下方重新更新订阅。',

+ 12 - 0
src/Services/Cron.php

@@ -393,6 +393,18 @@ final class Cron
         echo Tools::toDateTime(time()) . ' 等待中订单处理完成' . PHP_EOL;
     }
 
+    public static function removeInactiveUserLinkAndInvite(): void
+    {
+        $inactive_users = (new User())->where('is_inactive', 1)->get();
+
+        foreach ($inactive_users as $user) {
+            $user->removeLink();
+            $user->removeInvite();
+        }
+
+        echo Tools::toDateTime(time()) . ' Successfully removed inactive user\'s Link and Invite' . PHP_EOL;
+    }
+
     public static function resetNodeBandwidth(): void
     {
         (new Node())->where('bandwidthlimit_resetday', date('d'))->update(['node_bandwidth' => 0]);