UserController.php 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controllers;
  4. use App\Models\Ann;
  5. use App\Models\Bought;
  6. use App\Models\Code;
  7. use App\Models\Docs;
  8. use App\Models\EmailVerify;
  9. use App\Models\InviteCode;
  10. use App\Models\Ip;
  11. use App\Models\LoginIp;
  12. use App\Models\Node;
  13. use App\Models\Payback;
  14. use App\Models\Setting;
  15. use App\Models\StreamMedia;
  16. use App\Models\User;
  17. use App\Services\Auth;
  18. use App\Services\Captcha;
  19. use App\Services\Config;
  20. use App\Services\DB;
  21. use App\Services\MFA;
  22. use App\Services\Payment;
  23. use App\Utils\Check;
  24. use App\Utils\Cookie;
  25. use App\Utils\Hash;
  26. use App\Utils\QQWry;
  27. use App\Utils\ResponseHelper;
  28. use App\Utils\TelegramSessionManager;
  29. use App\Utils\Tools;
  30. use Ramsey\Uuid\Uuid;
  31. use Slim\Http\Response;
  32. use Slim\Http\ServerRequest;
  33. use voku\helper\AntiXSS;
  34. /**
  35. * HomeController
  36. */
  37. final class UserController extends BaseController
  38. {
  39. /**
  40. * @param array $args
  41. */
  42. public function index(ServerRequest $request, Response $response, array $args)
  43. {
  44. $captcha = [];
  45. if (Setting::obtain('enable_checkin_captcha') === true) {
  46. $captcha = Captcha::generate();
  47. }
  48. $data = [
  49. 'today_traffic_usage' => (int) $this->user->transfer_enable === 0 ? 0 : ($this->user->u + $this->user->d - $this->user->last_day_t) / $this->user->transfer_enable * 100,
  50. 'past_traffic_usage' => (int) $this->user->transfer_enable === 0 ? 0 : $this->user->last_day_t / $this->user->transfer_enable * 100,
  51. 'residual_flow' => (int) $this->user->transfer_enable === 0 ? 0 : ($this->user->transfer_enable - ($this->user->u + $this->user->d)) / $this->user->transfer_enable * 100,
  52. ];
  53. return $response->write(
  54. $this->view()
  55. ->assign('ann', Ann::orderBy('date', 'desc')->first())
  56. ->assign('getUniversalSub', SubController::getUniversalSub($this->user))
  57. ->assign('getTraditionalSub', LinkController::getTraditionalSub($this->user))
  58. ->assign('data', $data)
  59. ->assign('captcha', $captcha)
  60. ->fetch('user/index.tpl')
  61. );
  62. }
  63. /**
  64. * @param array $args
  65. */
  66. public function code(ServerRequest $request, Response $response, array $args)
  67. {
  68. $pageNum = $request->getQueryParams()['page'] ?? 1;
  69. $codes = Code::where('type', '<>', '-2')
  70. ->where('userid', '=', $this->user->id)
  71. ->orderBy('id', 'desc')
  72. ->paginate(15, ['*'], 'page', $pageNum);
  73. $render = Tools::paginateRender($codes);
  74. return $response->write(
  75. $this->view()
  76. ->assign('codes', $codes)
  77. ->assign('payments', Payment::getPaymentsEnabled())
  78. ->assign('render', $render)
  79. ->fetch('user/code.tpl')
  80. );
  81. }
  82. /**
  83. * @param array $args
  84. */
  85. public function codeCheck(ServerRequest $request, Response $response, array $args)
  86. {
  87. $time = $request->getQueryParams()['time'];
  88. $codes = Code::where('userid', '=', $this->user->id)
  89. ->where('usedatetime', '>', date('Y-m-d H:i:s', $time))
  90. ->first();
  91. if ($codes !== null && strpos($codes->code, '充值') !== false) {
  92. return $response->withJson([
  93. 'ret' => 1,
  94. ]);
  95. }
  96. return $response->withJson([
  97. 'ret' => 0,
  98. ]);
  99. }
  100. /**
  101. * @param array $args
  102. */
  103. public function codePost(ServerRequest $request, Response $response, array $args)
  104. {
  105. $code = trim($request->getParam('code'));
  106. if ($code === '') {
  107. return ResponseHelper::error($response, '请填写充值码');
  108. }
  109. $codeq = Code::where('code', $code)->where('isused', 0)->first();
  110. if ($codeq === null) {
  111. return ResponseHelper::error($response, '没有这个充值码');
  112. }
  113. $user = $this->user;
  114. $codeq->isused = 1;
  115. $codeq->usedatetime = date('Y-m-d H:i:s');
  116. $codeq->userid = $user->id;
  117. $codeq->save();
  118. if ($codeq->type === -1) {
  119. $user->money += $codeq->number;
  120. $user->save();
  121. // 返利
  122. if ($user->ref_by > 0 && Setting::obtain('invitation_mode') === 'after_recharge') {
  123. Payback::rebate($user->id, $codeq->number);
  124. }
  125. return $response->withJson([
  126. 'ret' => 1,
  127. 'msg' => '兑换成功,金额为 ' . $codeq->number . ' 元',
  128. ]);
  129. }
  130. if ($codeq->type === 10001) {
  131. $user->transfer_enable += $codeq->number * 1024 * 1024 * 1024;
  132. $user->save();
  133. }
  134. if ($codeq->type === 10002) {
  135. if (\time() > strtotime($user->expire_in)) {
  136. $user->expire_in = date('Y-m-d H:i:s', \time() + (int) $codeq->number * 86400);
  137. } else {
  138. $user->expire_in = date('Y-m-d H:i:s', strtotime($user->expire_in) + (int) $codeq->number * 86400);
  139. }
  140. $user->save();
  141. }
  142. if ($codeq->type >= 1 && $codeq->type <= 10000) {
  143. if ($user->class === 0 || $user->class !== $codeq->type) {
  144. $user->class_expire = date('Y-m-d H:i:s', \time());
  145. $user->save();
  146. }
  147. $user->class_expire = date('Y-m-d H:i:s', strtotime($user->class_expire) + (int) $codeq->number * 86400);
  148. $user->class = $codeq->type;
  149. $user->save();
  150. }
  151. return $response->withJson([
  152. 'ret' => 1,
  153. 'msg' => '',
  154. ]);
  155. }
  156. /**
  157. * @param array $args
  158. */
  159. public function resetPort(ServerRequest $request, Response $response, array $args)
  160. {
  161. $temp = $this->user->resetPort();
  162. return $response->withJson([
  163. 'ret' => ($temp['ok'] === true ? 1 : 0),
  164. 'msg' => $temp['msg'],
  165. ]);
  166. }
  167. /**
  168. * @param array $args
  169. */
  170. public function specifyPort(ServerRequest $request, Response $response, array $args)
  171. {
  172. $temp = $this->user->specifyPort((int) $request->getParam('port'));
  173. return $response->withJson([
  174. 'ret' => ($temp['ok'] === true ? 1 : 0),
  175. 'msg' => $temp['msg'],
  176. ]);
  177. }
  178. /**
  179. * @param array $args
  180. */
  181. public function profile(ServerRequest $request, Response $response, array $args)
  182. {
  183. $pageNum = $request->getQueryParams()['page'] ?? 1;
  184. $paybacks = Payback::where('ref_by', $this->user->id)
  185. ->orderBy('datetime', 'desc')
  186. ->paginate(15, ['*'], 'page', $pageNum);
  187. // 登录IP
  188. $totallogin = LoginIp::where('userid', '=', $this->user->id)->where('type', '=', 0)->orderBy('datetime', 'desc')->take(10)->get();
  189. // 使用IP
  190. $userip = [];
  191. $iplocation = new QQWry();
  192. $total = Ip::where('datetime', '>=', \time() - 300)->where('userid', '=', $this->user->id)->get();
  193. foreach ($total as $single) {
  194. $single->ip = Tools::getRealIp($single->ip);
  195. $is_node = Node::where('node_ip', $single->ip)->first();
  196. if ($is_node) {
  197. continue;
  198. }
  199. if (! isset($userip[$single->ip])) {
  200. $location = $iplocation->getlocation($single->ip);
  201. $userip[$single->ip] = iconv('gbk', 'utf-8//IGNORE', $location['country'] . $location['area']);
  202. }
  203. }
  204. if ($request->getParam('json') === 1) {
  205. return $response->withJson([
  206. 'ret' => 1,
  207. 'paybacks' => $paybacks,
  208. 'userloginip' => $totallogin,
  209. 'userip' => $userip,
  210. ]);
  211. }
  212. $boughts = Bought::where('userid', $this->user->id)->orderBy('id', 'desc')->get();
  213. return $response->write(
  214. $this->view()
  215. ->assign('boughts', $boughts)
  216. ->assign('userip', $userip)
  217. ->assign('userloginip', $totallogin)
  218. ->assign('paybacks', $paybacks)
  219. ->registerClass('Tools', Tools::class)
  220. ->fetch('user/profile.tpl')
  221. );
  222. }
  223. /**
  224. * @param array $args
  225. */
  226. public function announcement(ServerRequest $request, Response $response, array $args)
  227. {
  228. $Anns = Ann::orderBy('date', 'desc')->get();
  229. if ($request->getParam('json') === 1) {
  230. return $response->withJson([
  231. 'Anns' => $Anns,
  232. 'ret' => 1,
  233. ]);
  234. }
  235. return $response->write(
  236. $this->view()
  237. ->assign('anns', $Anns)
  238. ->fetch('user/announcement.tpl')
  239. );
  240. }
  241. /**
  242. * @param array $args
  243. */
  244. public function docs(ServerRequest $request, Response $response, array $args)
  245. {
  246. $docs = Docs::orderBy('id', 'desc')->get();
  247. if ($request->getParam('json') === 1) {
  248. return $response->withJson([
  249. 'docs' => $docs,
  250. 'ret' => 1,
  251. ]);
  252. }
  253. return $response->write(
  254. $this->view()
  255. ->assign('docs', $docs)
  256. ->fetch('user/docs.tpl')
  257. );
  258. }
  259. /**
  260. * @param array $args
  261. */
  262. public function media(ServerRequest $request, Response $response, array $args)
  263. {
  264. $results = [];
  265. $pdo = DB::getPdo();
  266. $nodes = $pdo->query('SELECT DISTINCT node_id FROM stream_media');
  267. foreach ($nodes as $node_id) {
  268. $node = Node::where('id', $node_id)->first();
  269. $unlock = StreamMedia::where('node_id', $node_id)
  270. ->orderBy('id', 'desc')
  271. ->where('created_at', '>', \time() - 86460) // 只获取最近一天零一分钟内上报的数据
  272. ->first();
  273. if ($unlock !== null && $node !== null) {
  274. $details = \json_decode($unlock->result, true);
  275. $details = str_replace('Originals Only', '仅限自制', $details);
  276. $details = str_replace('Oversea Only', '仅限海外', $details);
  277. foreach ($details as $key => $value) {
  278. $info = [
  279. 'node_name' => $node->name,
  280. 'created_at' => $unlock->created_at,
  281. 'unlock_item' => $details,
  282. ];
  283. }
  284. array_push($results, $info);
  285. }
  286. }
  287. if ($_ENV['streaming_media_unlock_multiplexing'] !== null) {
  288. foreach ($_ENV['streaming_media_unlock_multiplexing'] as $key => $value) {
  289. $key_node = Node::where('id', $key)->first();
  290. $value_node = StreamMedia::where('node_id', $value)
  291. ->orderBy('id', 'desc')
  292. ->where('created_at', '>', \time() - 86460) // 只获取最近一天零一分钟内上报的数据
  293. ->first();
  294. if ($value_node !== null) {
  295. $details = \json_decode($value_node->result, true);
  296. $details = str_replace('Originals Only', '仅限自制', $details);
  297. $details = str_replace('Oversea Only', '仅限海外', $details);
  298. $info = [
  299. 'node_name' => $key_node->name,
  300. 'created_at' => $value_node->created_at,
  301. 'unlock_item' => $details,
  302. ];
  303. array_push($results, $info);
  304. }
  305. }
  306. }
  307. $node_names = array_column($results, 'node_name');
  308. array_multisort($node_names, SORT_ASC, $results);
  309. return $response->write($this->view()
  310. ->assign('results', $results)
  311. ->fetch('user/media.tpl'));
  312. }
  313. /**
  314. * @param array $args
  315. */
  316. public function edit(ServerRequest $request, Response $response, array $args)
  317. {
  318. $themes = Tools::getDir(BASE_PATH . '/resources/views');
  319. $bind_token = TelegramSessionManager::addBindSession($this->user);
  320. $methods = Config::getSupportParam('method');
  321. $gaurl = MFA::getGAurl($this->user);
  322. return $response->write($this->view()
  323. ->assign('user', $this->user)
  324. ->assign('themes', $themes)
  325. ->assign('bind_token', $bind_token)
  326. ->assign('methods', $methods)
  327. ->assign('gaurl', $gaurl)
  328. ->assign('telegram_bot', $_ENV['telegram_bot'])
  329. ->registerClass('Config', Config::class)
  330. ->fetch('user/edit.tpl'));
  331. }
  332. /**
  333. * @param array $args
  334. */
  335. public function invite(ServerRequest $request, Response $response, array $args)
  336. {
  337. $code = InviteCode::where('user_id', $this->user->id)->first();
  338. if ($code === null) {
  339. $this->user->addInviteCode();
  340. $code = InviteCode::where('user_id', $this->user->id)->first();
  341. }
  342. $pageNum = $request->getQueryParams()['page'] ?? 1;
  343. $paybacks = Payback::where('ref_by', $this->user->id)
  344. ->orderBy('id', 'desc')
  345. ->paginate(15, ['*'], 'page', $pageNum);
  346. $paybacks_sum = Payback::where('ref_by', $this->user->id)->sum('ref_get');
  347. if (! $paybacks_sum) {
  348. $paybacks_sum = 0;
  349. }
  350. $render = Tools::paginateRender($paybacks);
  351. $invite_url = $_ENV['baseUrl'] . '/auth/register?code=' . $code->code;
  352. return $response->write($this->view()
  353. ->assign('code', $code)
  354. ->assign('render', $render)
  355. ->assign('paybacks', $paybacks)
  356. ->assign('invite_url', $invite_url)
  357. ->assign('paybacks_sum', $paybacks_sum)
  358. ->fetch('user/invite.tpl'));
  359. }
  360. /**
  361. * @param array $args
  362. */
  363. public function updatePassword(ServerRequest $request, Response $response, array $args)
  364. {
  365. $oldpwd = $request->getParam('oldpwd');
  366. $pwd = $request->getParam('pwd');
  367. $repwd = $request->getParam('repwd');
  368. $user = $this->user;
  369. if (! Hash::checkPassword($user->pass, $oldpwd)) {
  370. return ResponseHelper::error($response, '旧密码错误');
  371. }
  372. if ($pwd !== $repwd) {
  373. return ResponseHelper::error($response, '两次输入不符合');
  374. }
  375. if (strlen($pwd) < 8) {
  376. return ResponseHelper::error($response, '密码太短啦');
  377. }
  378. $hashPwd = Hash::passwordHash($pwd);
  379. $user->pass = $hashPwd;
  380. $user->save();
  381. if ($_ENV['enable_forced_replacement'] === true) {
  382. $user->cleanLink();
  383. }
  384. return ResponseHelper::successfully($response, '修改成功');
  385. }
  386. /**
  387. * @param array $args
  388. */
  389. public function updateEmail(ServerRequest $request, Response $response, array $args)
  390. {
  391. $antiXss = new AntiXSS();
  392. $user = $this->user;
  393. $newemail = $antiXss->xss_clean($request->getParam('newemail'));
  394. $oldemail = $user->email;
  395. $otheruser = User::where('email', $newemail)->first();
  396. if ($_ENV['enable_change_email'] !== true) {
  397. return ResponseHelper::error($response, '此项不允许自行修改,请联系管理员操作');
  398. }
  399. if (Setting::obtain('reg_email_verify')) {
  400. $emailcode = $request->getParam('emailcode');
  401. $mailcount = EmailVerify::where('email', '=', $newemail)->where('code', '=', $emailcode)->where('expire_in', '>', \time())->first();
  402. if ($mailcount === null) {
  403. return ResponseHelper::error($response, '您的邮箱验证码不正确');
  404. }
  405. }
  406. if ($newemail === '') {
  407. return ResponseHelper::error($response, '未填写邮箱');
  408. }
  409. $check_res = Check::isEmailLegal($newemail);
  410. if ($check_res['ret'] === 0) {
  411. return $response->withJson($check_res);
  412. }
  413. if ($otheruser !== null) {
  414. return ResponseHelper::error($response, '邮箱已经被使用了');
  415. }
  416. if ($newemail === $oldemail) {
  417. return ResponseHelper::error($response, '新邮箱不能和旧邮箱一样');
  418. }
  419. $user->email = $newemail;
  420. $user->save();
  421. return ResponseHelper::successfully($response, '修改成功');
  422. }
  423. /**
  424. * @param array $args
  425. */
  426. public function updateUsername(ServerRequest $request, Response $response, array $args)
  427. {
  428. $antiXss = new AntiXSS();
  429. $newusername = $antiXss->xss_clean($request->getParam('newusername'));
  430. $user = $this->user;
  431. $user->user_name = $newusername;
  432. $user->save();
  433. return ResponseHelper::successfully($response, '修改成功');
  434. }
  435. /**
  436. * @param array $args
  437. */
  438. public function bought(ServerRequest $request, Response $response, array $args)
  439. {
  440. $pageNum = $request->getQueryParams()['page'] ?? 1;
  441. $shops = Bought::where('userid', $this->user->id)->orderBy('id', 'desc')->paginate(15, ['*'], 'page', $pageNum);
  442. if ($request->getParam('json') === 1) {
  443. foreach ($shops as $shop) {
  444. $shop->datetime = $shop->datetime();
  445. $shop->name = $shop->shop()->name;
  446. $shop->content = $shop->shop()->content();
  447. }
  448. return $response->withJson([
  449. 'ret' => 1,
  450. 'shops' => $shops,
  451. ]);
  452. }
  453. $render = Tools::paginateRender($shops);
  454. return $response->write($this->view()
  455. ->assign('shops', $shops)
  456. ->assign('render', $render)
  457. ->fetch('user/bought.tpl'));
  458. }
  459. /**
  460. * @param array $args
  461. */
  462. public function deleteBoughtGet(ServerRequest $request, Response $response, array $args)
  463. {
  464. $id = $request->getParam('id');
  465. $shop = Bought::where('id', $id)->where('userid', $this->user->id)->first();
  466. if ($shop === null) {
  467. return ResponseHelper::error($response, '关闭自动续费失败,订单不存在。');
  468. }
  469. if ($this->user->id === $shop->userid) {
  470. $shop->renew = 0;
  471. }
  472. if (! $shop->save()) {
  473. return ResponseHelper::error($response, '关闭自动续费失败');
  474. }
  475. return ResponseHelper::successfully($response, '关闭自动续费成功');
  476. }
  477. /**
  478. * @param array $args
  479. */
  480. public function updateContact(ServerRequest $request, Response $response, array $args)
  481. {
  482. $antiXss = new AntiXSS();
  483. $type = $antiXss->xss_clean($request->getParam('imtype'));
  484. $value = $antiXss->xss_clean($request->getParam('imvalue'));
  485. $user = $this->user;
  486. if ($user->telegram_id !== null) {
  487. return $response->withJson([
  488. 'ret' => 0,
  489. 'msg' => '你的账户绑定了 Telegram ,所以此项并不能被修改',
  490. ]);
  491. }
  492. if ($value === '' || $type === '') {
  493. return $response->withJson([
  494. 'ret' => 0,
  495. 'msg' => '联络方式不能为空',
  496. ]);
  497. }
  498. $user_exist = User::where('im_value', $value)->where('im_type', $type)->first();
  499. if ($user_exist !== null) {
  500. return $response->withJson([
  501. 'ret' => 0,
  502. 'msg' => '此联络方式已经被注册',
  503. ]);
  504. }
  505. $user->im_type = $type;
  506. $user->im_value = $value;
  507. $user->save();
  508. return $response->withJson([
  509. 'ret' => 1,
  510. 'msg' => '修改成功',
  511. ]);
  512. }
  513. /**
  514. * @param array $args
  515. */
  516. public function updateTheme(ServerRequest $request, Response $response, array $args)
  517. {
  518. $antiXss = new AntiXSS();
  519. $theme = $antiXss->xss_clean($request->getParam('theme'));
  520. $user = $this->user;
  521. if ($theme === '') {
  522. return $response->withJson([
  523. 'ret' => 0,
  524. 'msg' => '主题不能为空',
  525. ]);
  526. }
  527. $user->theme = $theme;
  528. $user->save();
  529. return $response->withJson([
  530. 'ret' => 1,
  531. 'msg' => '修改成功',
  532. ]);
  533. }
  534. /**
  535. * @param array $args
  536. */
  537. public function updateMail(ServerRequest $request, Response $response, array $args)
  538. {
  539. $value = (int) $request->getParam('mail');
  540. if (\in_array($value, [0, 1, 2])) {
  541. $user = $this->user;
  542. if ($value === 2 && $_ENV['enable_telegram'] === false) {
  543. return ResponseHelper::error(
  544. $response,
  545. '修改失败,当前无法使用 Telegram 接收每日报告'
  546. );
  547. }
  548. $user->sendDailyMail = $value;
  549. $user->save();
  550. return ResponseHelper::successfully($response, '修改成功');
  551. }
  552. return ResponseHelper::error($response, '非法输入');
  553. }
  554. /**
  555. * @param array $args
  556. */
  557. public function resetPasswd(ServerRequest $request, Response $response, array $args)
  558. {
  559. $user = $this->user;
  560. $pwd = Tools::genRandomChar(16);
  561. $current_timestamp = \time();
  562. $new_uuid = Uuid::uuid3(Uuid::NAMESPACE_DNS, $user->email . '|' . $current_timestamp);
  563. $existing_uuid = User::where('uuid', $new_uuid)->first();
  564. if ($existing_uuid !== null) {
  565. return ResponseHelper::error($response, '目前出现一些问题,请稍后再试');
  566. }
  567. $user->uuid = $new_uuid;
  568. $user->passwd = $pwd;
  569. $user->save();
  570. return ResponseHelper::successfully($response, '修改成功');
  571. }
  572. /**
  573. * @param array $args
  574. */
  575. public function updateMethod(ServerRequest $request, Response $response, array $args)
  576. {
  577. $antiXss = new AntiXSS();
  578. $user = $this->user;
  579. $method = strtolower($antiXss->xss_clean($request->getParam('method')));
  580. if ($method === '') {
  581. ResponseHelper::error($response, '非法输入');
  582. }
  583. if (! Tools::isParamValidate('method', $method)) {
  584. ResponseHelper::error($response, '加密无效');
  585. }
  586. $user->method = $method;
  587. $user->save();
  588. return ResponseHelper::successfully($response, '修改成功');
  589. }
  590. /**
  591. * @param array $args
  592. */
  593. public function logout(ServerRequest $request, Response $response, array $args)
  594. {
  595. Auth::logout();
  596. return $response->withStatus(302)->withHeader('Location', '/');
  597. }
  598. /**
  599. * @param array $args
  600. */
  601. public function doCheckIn(ServerRequest $request, Response $response, array $args)
  602. {
  603. if ($_ENV['enable_checkin'] === false) {
  604. return ResponseHelper::error($response, '暂时还不能签到');
  605. }
  606. if (Setting::obtain('enable_checkin_captcha') === true) {
  607. $ret = Captcha::verify($request->getParams());
  608. if (! $ret) {
  609. return ResponseHelper::error($response, '系统无法接受您的验证结果,请刷新页面后重试');
  610. }
  611. }
  612. if (strtotime($this->user->expire_in) < \time()) {
  613. return ResponseHelper::error($response, '没有过期的账户才可以签到');
  614. }
  615. $checkin = $this->user->checkin();
  616. if ($checkin['ok'] === false) {
  617. return ResponseHelper::error($response, $checkin['msg']);
  618. }
  619. return $response->withJson([
  620. 'ret' => 1,
  621. 'trafficInfo' => [
  622. 'todayUsedTraffic' => $this->user->todayUsedTraffic(),
  623. 'lastUsedTraffic' => $this->user->lastUsedTraffic(),
  624. 'unUsedTraffic' => $this->user->unusedTraffic(),
  625. ],
  626. 'traffic' => Tools::flowAutoShow($this->user->transfer_enable),
  627. 'unflowtraffic' => $this->user->transfer_enable,
  628. 'msg' => $checkin['msg'],
  629. ]);
  630. }
  631. /**
  632. * @param array $args
  633. */
  634. public function kill(ServerRequest $request, Response $response, array $args)
  635. {
  636. return $response->write($this->view()->fetch('user/kill.tpl'));
  637. }
  638. /**
  639. * @param array $args
  640. */
  641. public function handleKill(ServerRequest $request, Response $response, array $args)
  642. {
  643. $user = $this->user;
  644. $passwd = $request->getParam('passwd');
  645. if (! Hash::checkPassword($user->pass, $passwd)) {
  646. return ResponseHelper::error($response, '密码错误');
  647. }
  648. if ($_ENV['enable_kill'] === true) {
  649. Auth::logout();
  650. $user->killUser();
  651. return ResponseHelper::successfully($response, '您的帐号已经从我们的系统中删除。欢迎下次光临');
  652. }
  653. return ResponseHelper::error($response, '管理员不允许删除,如需删除请联系管理员。');
  654. }
  655. /**
  656. * @param array $args
  657. */
  658. public function banned(ServerRequest $request, Response $response, array $args)
  659. {
  660. $user = $this->user;
  661. return $response->write($this->view()
  662. ->assign('banned_reason', $user->banned_reason)
  663. ->fetch('user/banned.tpl'));
  664. }
  665. /**
  666. * @param array $args
  667. */
  668. public function resetTelegram(ServerRequest $request, Response $response, array $args)
  669. {
  670. $user = $this->user;
  671. $user->telegramReset();
  672. return ResponseHelper::successfully($response, '重置成功');
  673. }
  674. /**
  675. * @param array $args
  676. */
  677. public function resetURL(ServerRequest $request, Response $response, array $args)
  678. {
  679. $user = $this->user;
  680. $user->cleanLink();
  681. return ResponseHelper::successfully($response, '重置成功');
  682. }
  683. /**
  684. * @param array $args
  685. */
  686. public function resetInviteURL(ServerRequest $request, Response $response, array $args)
  687. {
  688. $user = $this->user;
  689. $user->clearInviteCodes();
  690. return ResponseHelper::successfully($response, '重置成功');
  691. }
  692. /**
  693. * @param array $args
  694. */
  695. public function backtoadmin(ServerRequest $request, Response $response, array $args)
  696. {
  697. $userid = Cookie::get('uid');
  698. $adminid = Cookie::get('old_uid');
  699. $user = User::find($userid);
  700. $admin = User::find($adminid);
  701. if (! $admin->is_admin || ! $user) {
  702. Cookie::set([
  703. 'uid' => null,
  704. 'email' => null,
  705. 'key' => null,
  706. 'ip' => null,
  707. 'expire_in' => null,
  708. 'old_uid' => null,
  709. 'old_email' => null,
  710. 'old_key' => null,
  711. 'old_ip' => null,
  712. 'old_expire_in' => null,
  713. 'old_local' => null,
  714. ], \time() - 1000);
  715. }
  716. $expire_in = Cookie::get('old_expire_in');
  717. $local = Cookie::get('old_local');
  718. Cookie::set([
  719. 'uid' => Cookie::get('old_uid'),
  720. 'email' => Cookie::get('old_email'),
  721. 'key' => Cookie::get('old_key'),
  722. 'ip' => Cookie::get('old_ip'),
  723. 'expire_in' => $expire_in,
  724. 'old_uid' => null,
  725. 'old_email' => null,
  726. 'old_key' => null,
  727. 'old_ip' => null,
  728. 'old_expire_in' => null,
  729. 'old_local' => null,
  730. ], $expire_in);
  731. return $response->withStatus(302)->withHeader('Location', $local);
  732. }
  733. /**
  734. * @param array $args
  735. */
  736. public function switchThemeMode(ServerRequest $request, Response $response, array $args)
  737. {
  738. $user = $this->user;
  739. if ($user->is_dark_mode === 1) {
  740. $user->is_dark_mode = 0;
  741. } else {
  742. $user->is_dark_mode = 1;
  743. }
  744. $user->save();
  745. return $response->withJson([
  746. 'ret' => 1,
  747. 'msg' => '切换成功',
  748. ]);
  749. }
  750. }