View file app/Controllers/HomeController.php

File size: 3.37Kb
<?php

declare(strict_types=1);

namespace App\Controllers;

use App\Models\Ban;
use Exception;
use Gregwar\Captcha\PhraseBuilder;
use Gregwar\Captcha\CaptchaBuilder;
use Illuminate\Http\Request;

class HomeController extends BaseController
{
    /**
     * Главная страница
     *
     * @return string
     */
    public function index(): string
    {
        return view('index');
    }

    /**
     * Закрытие сайта
     *
     * @return string
     */
    public function closed(): string
    {
        if (setting('closedsite') !== 2) {
            redirect('/');
        }

        header($_SERVER['SERVER_PROTOCOL'] . ' 503 Service Unavailable');

        return view('pages/closed');
    }

    /**
     * Поиск по сайту
     *
     * @return string
     */
    public function search(): string
    {
        return view('search/index');
    }

    /**
     * Бан по IP
     *
     * @param Request $request
     * @return string
     * @throws Exception
     */
    public function ipban(Request $request): string
    {
        $ban = Ban::query()
            ->where('ip', getIp())
            ->first();

        if (! $ban) {
            redirect('/');
        }

        if (
            ! $ban->user_id
            && $ban->created_at < strtotime('-1 minute', SITETIME)
            && $request->isMethod('post')
            && captchaVerify()
        ) {
            $ban->delete();
            ipBan(true);

            setFlash('success', __('pages.ip_success_unbanned'));
            redirect('/');
        }

        header($_SERVER['SERVER_PROTOCOL'] . ' 429 Too Many Requests');

        return view('pages/ipban', compact('ban'));
    }

    /**
     * Защитная картинка
     *
     * @return void
     */
    public function captcha(): void
    {
        header('Content-type: image/jpeg');
        $phrase = new PhraseBuilder();
        $phrase = $phrase->build(setting('captcha_maxlength'), setting('captcha_symbols'));

        $builder = new CaptchaBuilder($phrase);
        $builder->setBackgroundColor(mt_rand(200,255), mt_rand(200,255), mt_rand(200,255));
        $builder->setMaxOffset(setting('captcha_offset'));
        $builder->setMaxAngle(setting('captcha_angle'));
        $builder->setDistortion(setting('captcha_distortion'));
        $builder->setInterpolation(setting('captcha_interpolation'));
        $builder->build()->output();

        $_SESSION['protect'] = $builder->getPhrase();
    }

    /**
     * Быстрое изменение языка
     *
     * @param string  $lang
     * @param Request $request
     */
    public function language(string $lang, Request $request): void
    {
        $return    = $request->input('return');
        $languages = array_map('basename', glob(RESOURCES . '/lang/*', GLOB_ONLYDIR));

        if (preg_match('/^[a-z]+$/', $lang) && in_array($lang, $languages, true)) {
            if ($user = getUser()) {
                $user->update([
                    'language' => $lang,
                ]);
            } else {
                $_SESSION['language'] = $lang;
            }

            if (! file_exists(HOME . '/assets/modules/' . $lang . '.js')) {
                symlink(
                    RESOURCES . '/lang/' . $lang . '/main.js',
                    HOME . '/assets/modules/' . $lang . '.js'
                );
            }
        }

        redirect($return ?? '/');
    }
}