Guest User

Untitled

a guest
Apr 21st, 2021
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 7.64 KB | None | 0 0
  1. <?php
  2.  
  3. declare(strict_types=1);
  4.  
  5. namespace App\Controllers;
  6.  
  7. use App\Classes\Validator;
  8. use App\Models\Flood;
  9. use App\Models\Ignore;
  10. use App\Models\Message;
  11. use App\Models\User;
  12. use Illuminate\Database\Capsule\Manager as DB;
  13. use Illuminate\Database\Query\JoinClause;
  14. use Illuminate\Http\Request;
  15.  
  16. class MessageController extends BaseController
  17. {
  18.     /**
  19.      * @var User
  20.      */
  21.     public $user;
  22.  
  23.     /**
  24.      * Конструктор
  25.      */
  26.     public function __construct()
  27.     {
  28.         parent::__construct();
  29.  
  30.         if (! $this->user = getUser()) {
  31.             abort(403, __('main.not_authorized'));
  32.         }
  33.     }
  34.  
  35.     /**
  36.      * Главная страница
  37.      *
  38.      * @return string
  39.      */
  40.     public function index(): string
  41.     {
  42.         $lastMessage = Message::query()
  43.             ->select(
  44.                 'author_id',
  45.                 DB::connection()->raw('max(created_at) as last_created_at'),
  46.                 DB::connection()->raw('min(case when reading then 1 else 0 end) as all_reading')
  47.             )
  48.             ->where('user_id', $this->user->id)
  49.             ->groupBy('author_id');
  50.  
  51.         $messages = Message::query()
  52.             ->select('m1.*', 'm2.last_created_at', 'm2.all_reading', 'm3.reading as recipient_read')
  53.             ->from('messages as m1')
  54.             ->joinSub($lastMessage, 'm2', static function (JoinClause $join) {
  55.                 $join->on('m1.created_at', 'm2.last_created_at')
  56.                 ->whereRaw('m1.author_id = m2.author_id');
  57.             })
  58.             ->leftJoin('messages as m3', static function (JoinClause $join) {
  59.                 $join->on('m1.user_id', 'm3.author_id')
  60.                     ->whereRaw('m1.created_at = m3.created_at');
  61.             })
  62.             ->where('m1.user_id', $this->user->id)
  63.             ->orderByDesc('m1.created_at')
  64.             ->with('author')
  65.             ->paginate(setting('privatpost'));
  66.  
  67.         return view('messages/index', compact('messages'));
  68.     }
  69.  
  70.     /**
  71.      * Диалог
  72.      *
  73.      * @param string $login
  74.      *
  75.      * @return string
  76.      */
  77.     public function talk(string $login): string
  78.     {
  79.         if (is_numeric($login)) {
  80.             $user = new User();
  81.             $user->id = $login;
  82.         } else {
  83.             $user = getUserByLogin($login);
  84. if (! $user) {
  85.                 abort(404, __('validator.user'));
  86.             }
  87.            
  88.         }
  89.  
  90.  
  91.  
  92.         if ($user->id === $this->user->id) {
  93.             abort('default', __('messages.empty_dialogue'));
  94.         }
  95.  
  96.  
  97.  
  98.  
  99.  
  100.         $messages = Message::query()
  101.             ->select('m1.*', 'm2.reading as recipient_read')
  102.             ->from('messages as m1')
  103.             ->leftJoin('messages as m2', static function (JoinClause $join) {
  104.                 $join->on('m1.user_id', 'm2.author_id')
  105.                     ->whereRaw('m1.created_at = m2.created_at');
  106.             })
  107.             ->where('m1.user_id', $this->user->id)
  108.             ->where('m1.author_id', $user->id)
  109.             ->orderByDesc('m1.created_at')
  110.             ->with('user', 'author')
  111.             ->paginate(setting('privatpost'));
  112.  
  113.         // Прочитано
  114.         Message::query()
  115.             ->where('user_id', $this->user->id)
  116.             ->where('author_id', $user->id)
  117.             ->update(['reading' => 1]);
  118.  
  119.         $view = $user->id ? 'messages/talk' : 'messages/talk_system';
  120.  
  121.         return view($view, compact('messages', 'user'));
  122.     }
  123.  
  124.     /**
  125.      * Отправка сообщений
  126.      *
  127.      * @param Request   $request
  128.      * @param Validator $validator
  129.      * @param Flood     $flood
  130.      *
  131.      * @return void
  132.      */
  133.     public function send(Request $request, Validator $validator, Flood $flood): void
  134.     {
  135.         $login = $request->input('user');
  136.         $msg   = $request->input('msg');
  137.  
  138.         $user = getUserByLogin($login);
  139.  
  140.         if (! $user) {
  141.             abort(404, __('validator.user'));
  142.         }
  143.  
  144.         $validator->equal($request->input('token'), $_SESSION['token'], ['msg' => __('validator.token')])
  145.             ->length($msg, 5, setting('comment_length'), ['msg' => __('validator.text')])
  146.             ->false($flood->isFlood(), ['msg' => __('validator.flood', ['sec' => $flood->getPeriod()])])
  147.             ->notEqual($user->id, $this->user->id, __('messages.send_yourself'));
  148.  
  149.         if (! captchaVerify() && $this->user->point < setting('privatprotect')) {
  150.             $validator->addError(['protect' => __('validator.captcha')]);
  151.         }
  152.  
  153.         // Проверка на игнор
  154.         $ignoring = Ignore::query()
  155.             ->where('user_id', $user->id)
  156.             ->where('ignore_id', $this->user->id)
  157.             ->first();
  158.  
  159.         $validator->empty($ignoring, ['user' => __('ignores.you_are_ignoring')]);
  160.  
  161.         if ($validator->isValid()) {
  162.             $msg = antimat($msg);
  163.             $user->increment('newprivat');
  164.  
  165.             Message::query()->create([
  166.                 'user_id'    => $user->id,
  167.                 'author_id'  => $this->user->id,
  168.                 'text'       => $msg,
  169.                 'type'       => Message::IN,
  170.                 'created_at' => SITETIME,
  171.             ])->create([
  172.                 'user_id'    => $this->user->id,
  173.                 'author_id'  => $user->id,
  174.                 'text'       => $msg,
  175.                 'type'       => Message::OUT,
  176.                 'reading'    => 1,
  177.                 'created_at' => SITETIME,
  178.             ]);
  179.  
  180.             $flood->saveState();
  181.  
  182.             setFlash('success', __('messages.success_sent'));
  183.         } else {
  184.             setInput($request->all());
  185.             setFlash('danger', $validator->getErrors());
  186.         }
  187.  
  188.         redirect('/messages/talk/' . $user->login);
  189.     }
  190.  
  191.     /**
  192.      * Удаление переписки
  193.      *
  194.      * @param int       $uid
  195.      * @param Request   $request
  196.      * @param Validator $validator
  197.      */
  198.     public function delete(int $uid, Request $request, Validator $validator): void
  199.     {
  200.         $page = int($request->input('page', 1));
  201.  
  202.         $total = Message::query()
  203.             ->where('user_id', $this->user->id)
  204.             ->where('author_id', $uid)
  205.             ->count();
  206.  
  207.         $validator->equal($request->input('token'), $_SESSION['token'], __('validator.token'))
  208.             ->notEmpty($total, ['user' => __('messages.empty_dialogue')])
  209.             ->empty(getUser('newprivat'), __('messages.unread_messages'));
  210.  
  211.         if ($validator->isValid()) {
  212.             Message::query()
  213.                 ->where('user_id', getUser('id'))
  214.                 ->where('author_id', $uid)
  215.                 ->delete();
  216.  
  217.             setFlash('success', __('messages.success_deleted'));
  218.         } else {
  219.             setFlash('danger', $validator->getErrors());
  220.         }
  221.  
  222.         redirect('/messages?page=' . $page);
  223.     }
  224.  
  225.     /**
  226.      * New messages
  227.      *
  228.      * @return string
  229.      */
  230.     public function newMessages(): string
  231.     {
  232.         if (! request()->ajax()) {
  233.             redirect('/');
  234.         }
  235.  
  236.         $messages = Message::query()
  237.             ->select(
  238.                 'author_id',
  239.                 DB::connection()->raw('max(created_at) as last_created_at')
  240.             )
  241.             ->selectRaw('count(*) as cnt')
  242.             ->where('user_id', $this->user->id)
  243.             ->where('reading', 0)
  244.             ->groupBy('author_id')
  245.             ->limit(3)
  246.             ->get();
  247.  
  248.         if ($messages->isNotEmpty()) {
  249.             $view = view('messages/_new', compact('messages'));
  250.  
  251.             return json_encode(['status' => 'success', 'messages' => $view]);
  252.         }
  253.  
  254.         return json_encode(['status'  => 'error']);
  255.     }
  256. }
  257.  
Advertisement
Add Comment
Please, Sign In to add comment