Просмотр файла app/Http/Controllers/HomeController.php

Размер файла: 3.95Kb
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Http\Controllers;
  6.  
  7. use App\Models\Ban;
  8. use Gregwar\Captcha\PhraseBuilder;
  9. use Gregwar\Captcha\CaptchaBuilder;
  10. use Illuminate\Http\RedirectResponse;
  11. use Illuminate\Http\Request;
  12. use Illuminate\View\View;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Visavi\Captcha\PhraseBuilder as AnimatedPhraseBuilder;
  15. use Visavi\Captcha\CaptchaBuilder as AnimatedCaptchaBuilder;
  16.  
  17. class HomeController extends Controller
  18. {
  19. /**
  20. * Главная страница
  21. *
  22. * @return View
  23. */
  24. public function index(): View
  25. {
  26. return view('index');
  27. }
  28.  
  29. /**
  30. * Закрытие сайта
  31. *
  32. * @return Response
  33. */
  34. public function closed()
  35. {
  36. if (setting('closedsite') !== 2) {
  37. return redirect('/');
  38. }
  39.  
  40. return response()->view('pages/closed', [], 503);
  41. }
  42.  
  43. /**
  44. * Поиск по сайту
  45. *
  46. * @return View
  47. */
  48. public function search(): View
  49. {
  50. return view('search/index');
  51. }
  52.  
  53. /**
  54. * Бан по IP
  55. *
  56. * @param Request $request
  57. *
  58. * @return Response
  59. */
  60. public function ipban(Request $request): Response
  61. {
  62. $ban = Ban::query()
  63. ->where('ip', getIp())
  64. ->first();
  65.  
  66. if (! $ban) {
  67. ipBan(true);
  68.  
  69. return redirect('/');
  70. }
  71.  
  72. if (
  73. ! $ban->user_id
  74. && $ban->created_at < strtotime('-1 minute', SITETIME)
  75. && $request->isMethod('post')
  76. && captchaVerify()
  77. ) {
  78. $ban->delete();
  79. ipBan(true);
  80.  
  81. setFlash('success', __('pages.ip_success_unbanned'));
  82.  
  83. return redirect('/');
  84. }
  85.  
  86. return response()->view('pages/ipban', compact('ban'), 429);
  87. }
  88.  
  89. /**
  90. * Защитная картинка
  91. *
  92. * @param Request $request
  93. *
  94. * @return Response
  95. */
  96. public function captcha(Request $request): Response
  97. {
  98. if (setting('captcha_type') === 'animated') {
  99. $phrase = new AnimatedPhraseBuilder();
  100. $phrase = $phrase->getPhrase(setting('captcha_maxlength'), setting('captcha_symbols'));
  101.  
  102. $captcha = new AnimatedCaptchaBuilder($phrase);
  103. $captcha = $captcha->render();
  104. } else {
  105. $phrase = new PhraseBuilder();
  106. $phrase = $phrase->build(setting('captcha_maxlength'), setting('captcha_symbols'));
  107.  
  108. $captcha = new CaptchaBuilder($phrase);
  109. $captcha->setMaxOffset(setting('captcha_offset'))
  110. ->setMaxAngle(setting('captcha_angle'))
  111. ->setDistortion(setting('captcha_distortion'))
  112. ->setInterpolation(setting('captcha_interpolation'))
  113. ->build();
  114.  
  115. $captcha = $captcha->get();
  116. }
  117.  
  118. $request->session()->put('protect', $phrase);
  119.  
  120. return response($captcha)
  121. ->header('Content-Type', setting('captcha_type') === 'animated' ? 'image/gif' : 'image/jpeg');
  122. }
  123.  
  124. /**
  125. * Быстрое изменение языка
  126. *
  127. * @param string $lang
  128. * @param Request $request
  129. *
  130. * @return RedirectResponse
  131. */
  132. public function language(string $lang, Request $request): RedirectResponse
  133. {
  134. $return = $request->input('return');
  135. $languages = array_map('basename', glob(resource_path('lang/*'), GLOB_ONLYDIR));
  136.  
  137. if (preg_match('/^[a-z]+$/', $lang) && in_array($lang, $languages, true)) {
  138. if ($user = getUser()) {
  139. $user->update([
  140. 'language' => $lang,
  141. ]);
  142. } else {
  143. $request->session()->put('language', $lang);
  144. }
  145. }
  146.  
  147. return redirect($return ?? '/');
  148. }
  149.  
  150. /**
  151. * @return View
  152. */
  153. public function error403(): View
  154. {
  155. abort(403);
  156. }
  157.  
  158. /**
  159. * @return View
  160. */
  161. public function error404(): View
  162. {
  163. abort(404);
  164. }
  165. }