UserController.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controllers;
  4. use App\Models\Ann;
  5. use App\Models\Config;
  6. use App\Models\InviteCode;
  7. use App\Models\LoginIp;
  8. use App\Models\Node;
  9. use App\Models\OnlineLog;
  10. use App\Models\Payback;
  11. use App\Services\Auth;
  12. use App\Services\Captcha;
  13. use App\Services\Reward;
  14. use App\Services\Subscribe;
  15. use App\Utils\ResponseHelper;
  16. use App\Utils\Tools;
  17. use Exception;
  18. use Psr\Http\Message\ResponseInterface;
  19. use Slim\Http\Response;
  20. use Slim\Http\ServerRequest;
  21. use function str_replace;
  22. use function strtotime;
  23. use function time;
  24. final class UserController extends BaseController
  25. {
  26. /**
  27. * @throws Exception
  28. */
  29. public function index(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  30. {
  31. $captcha = [];
  32. $class_expire_days = $this->user->class > 0 ?
  33. round((strtotime($this->user->class_expire) - time()) / 86400) : 0;
  34. if (Config::obtain('enable_checkin_captcha')) {
  35. $captcha = Captcha::generate();
  36. }
  37. return $response->write(
  38. $this->view()
  39. ->assign('ann', (new Ann())->orderBy('date', 'desc')->first())
  40. ->assign('captcha', $captcha)
  41. ->assign('class_expire_days', $class_expire_days)
  42. ->assign('UniversalSub', Subscribe::getUniversalSubLink($this->user))
  43. ->fetch('user/index.tpl')
  44. );
  45. }
  46. /**
  47. * @throws Exception
  48. */
  49. public function profile(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  50. {
  51. // 登录IP
  52. $logins = (new LoginIp())->where('userid', $this->user->id)
  53. ->where('type', '=', 0)->orderBy('datetime', 'desc')->take(10)->get();
  54. $ips = (new OnlineLog())->where('user_id', $this->user->id)
  55. ->where('last_time', '>', time() - 90)->orderByDesc('last_time')->get();
  56. foreach ($logins as $login) {
  57. $login->datetime = Tools::toDateTime((int) $login->datetime);
  58. try {
  59. $login->location = Tools::getIpLocation($login->ip);
  60. } catch (Exception) {
  61. $login->location = '未知';
  62. }
  63. }
  64. foreach ($ips as $ip) {
  65. $ip->ip = str_replace('::ffff:', '', $ip->ip);
  66. $ip->location = Tools::getIpLocation($ip->ip);
  67. $ip->node_name = (new Node())->where('id', $ip->node_id)->first()->name;
  68. $ip->last_time = Tools::toDateTime((int) $ip->last_time);
  69. }
  70. return $response->write(
  71. $this->view()
  72. ->assign('logins', $logins)
  73. ->assign('ips', $ips)
  74. ->fetch('user/profile.tpl')
  75. );
  76. }
  77. /**
  78. * @throws Exception
  79. */
  80. public function announcement(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  81. {
  82. $anns = (new Ann())->orderBy('date', 'desc')->get();
  83. return $response->write(
  84. $this->view()
  85. ->assign('anns', $anns)
  86. ->fetch('user/announcement.tpl')
  87. );
  88. }
  89. /**
  90. * @throws Exception
  91. */
  92. public function invite(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  93. {
  94. $code = (new InviteCode())->where('user_id', $this->user->id)->first()?->code;
  95. if ($code === null) {
  96. $code = (new InviteCode())->add($this->user->id);
  97. }
  98. $paybacks = (new Payback())->where('ref_by', $this->user->id)
  99. ->orderBy('id', 'desc')
  100. ->get();
  101. foreach ($paybacks as $payback) {
  102. $payback->datetime = Tools::toDateTime($payback->datetime);
  103. }
  104. $paybacks_sum = (new Payback())->where('ref_by', $this->user->id)->sum('ref_get');
  105. if (! $paybacks_sum) {
  106. $paybacks_sum = 0;
  107. }
  108. $invite_url = $_ENV['baseUrl'] . '/auth/register?code=' . $code;
  109. $invite_reward_rate = Config::obtain('invite_reward_rate') * 100;
  110. return $response->write(
  111. $this->view()
  112. ->assign('paybacks', $paybacks)
  113. ->assign('invite_url', $invite_url)
  114. ->assign('paybacks_sum', $paybacks_sum)
  115. ->assign('invite_reward_rate', $invite_reward_rate)
  116. ->fetch('user/invite.tpl')
  117. );
  118. }
  119. public function checkin(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  120. {
  121. if (! Config::obtain('enable_checkin') || ! $this->user->isAbleToCheckin()) {
  122. return ResponseHelper::error($response, '暂时还不能签到');
  123. }
  124. if (Config::obtain('enable_checkin_captcha')) {
  125. $ret = Captcha::verify($request->getParams());
  126. if (! $ret) {
  127. return ResponseHelper::error($response, '系统无法接受你的验证结果,请刷新页面后重试');
  128. }
  129. }
  130. $traffic = Reward::issueCheckinReward($this->user->id);
  131. if (! $traffic) {
  132. return ResponseHelper::error($response, '签到失败');
  133. }
  134. return $response->withJson([
  135. 'ret' => 1,
  136. 'msg' => '获得了 ' . $traffic . 'MB 流量',
  137. 'data' => [
  138. 'last-checkin-time' => Tools::toDateTime(time()),
  139. ],
  140. ]);
  141. }
  142. public function switchThemeMode(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  143. {
  144. $user = $this->user;
  145. $user->is_dark_mode = $user->is_dark_mode === 1 ? 0 : 1;
  146. if (! $user->save()) {
  147. return ResponseHelper::error($response, '切换失败');
  148. }
  149. return $response->withHeader('HX-Refresh', 'true')->withJson([
  150. 'ret' => 1,
  151. 'msg' => '切换成功',
  152. ]);
  153. }
  154. /**
  155. * @throws Exception
  156. */
  157. public function banned(ServerRequest $request, Response $response, array $args): Response|ResponseInterface
  158. {
  159. $user = $this->user;
  160. return $response->write(
  161. $this->view()
  162. ->assign('banned_reason', $user->banned_reason)
  163. ->fetch('user/banned.tpl')
  164. );
  165. }
  166. public function logout(ServerRequest $request, Response $response, array $args): Response
  167. {
  168. Auth::logout();
  169. return $response->withStatus(302)->withHeader('Location', '/');
  170. }
  171. }