Advertisement
Guest User

Untitled

a guest
Dec 9th, 2017
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 15.54 KB | None | 0 0
  1. <?php namespace App\Systems\Guides;
  2.  
  3. use App\Models\Guides\GuideInfo as Guide;
  4. use App\Models\Core\CoreGames as Games;
  5. use App\Models\Core\CoreLanguages as Languages;
  6.  
  7. use App\Models\Wiki\WikiEntity;
  8. use App\Models\Wiki\WikiUpdate;
  9.  
  10. use App\Systems\Core\ImagesManager; //для загрузки картинок
  11.  
  12. class GuidesManager
  13. {
  14.   private $guide;
  15.  
  16.   public function __construct(Guide $guide)
  17.   {
  18.     $this->guide = $guide;
  19.   }
  20.  
  21.   //получение списка игр (для которых можно создать игровой профиль)
  22.   public function listAvailGames()
  23.   {
  24.     $games = Games::wherePlayerAvailable(1)->get();
  25.     return $games;
  26.   }
  27.  
  28.   //получение списка языков
  29.   public function listLanguages(){
  30.     return Languages::All();
  31.   }
  32.  
  33.   //Получение информации об игре по слагу
  34.   public function gameInfo($game_slug)
  35.   {
  36.     return Games::whereSlug($game_slug)->firstOrFail();
  37.   }
  38.  
  39.   //получение класса обработчика игры
  40.   public function getGameClass($game)
  41.   {
  42.     if(!$game) return false;
  43.  
  44.     if((!$game->module)) return false;
  45.  
  46.     $guide_class = config($game->module.'.classes.guide');
  47.     if(!$guide_class) return false;
  48.  
  49.     $class = new $guide_class();
  50.     if(!$class) return false;
  51.  
  52.     return $class;
  53.   }
  54.  
  55.   //Генерация фильтра списка гайдов
  56.   public function generateFilter($request)
  57.   {
  58.     $filter = new \stdClass();
  59.     $filter->languages = $this->listLanguages();
  60.     $filter->games = $this->listAvailGames();
  61.  
  62.     //генерация специального фильтра внутри игры, если выбрана игра
  63.     $game = request()->get('game');
  64.  
  65.     if(!request()->has('game'))
  66.     {
  67.       $game = global_game();
  68.     }
  69.  
  70.     if($game)
  71.     {
  72.       $game = Games::find($game);
  73.       if(!$game) return $filter;
  74.  
  75.       $game_class = $this->getGameClass($game);
  76.       if(!$game_class) return $filter;
  77.  
  78.       $filter->game_filter = $game_class->generateFilter($game);
  79.     }
  80.  
  81.     return $filter;
  82.   }
  83.  
  84.   //Применение фильтра на список гайдов
  85.   public function applyFilter($guides, $request, $user_id = false)
  86.   {
  87.     $game = $request->get('game');
  88.     if($game){
  89.       $game = $request->get('game');
  90.     } else {
  91.       if (!$game && $game != -1) {
  92.         $game = global_game();
  93.       }
  94.     }
  95.  
  96.     if(!$user_id)
  97.     {
  98.       $game = Games::whereId($game)->first();
  99.  
  100.       $game->game_class = $this->getGameClass($game);
  101.  
  102.       if($game->game_class && method_exists($game->game_class,'applyFilter')) {
  103.         $guides->whereGameId($game->id);
  104.         $game->game_class->applyFilter($game, $guides, $request);//применяем фильтр
  105.       }
  106.  
  107.  
  108.       $user = auth()->user();
  109.       if($user && $user->info->isAdmin())
  110.       {
  111.         //
  112.       }
  113.       else
  114.         $guides->whereAvailable();
  115.     }
  116.  
  117.     //Сортировки
  118.     //TODO
  119.     $guides->orderBy('updated_at','desc');
  120.   }
  121.  
  122.   //Получение представления гайда (в виде элемента списка или отдельной страницы)
  123.   public function guideView($guide, $extended = false)
  124.   {
  125.     //создаем класс профиля
  126.     $game_class = $this->getGameClass($guide->game);
  127.     if(!$game_class) return false;
  128.  
  129.     //получаем представление с данными (если есть деталеьное представление - получаем его)
  130.     if($extended && method_exists($game_class,'renderExtView'))
  131.     {
  132.       $result = $game_class->renderExtView($guide);
  133.       $guide->extended = true;
  134.     }
  135.     else {
  136.       $result = $game_class->renderView($guide);
  137.     }
  138.  
  139.     return $result;
  140.   }
  141.  
  142.   //Получение списка гайдов
  143.   public function listGuides($request, $owner_type = 'all', $owner_id = false, $no_paginate = false)
  144.   {
  145.     $guides = $this->guide->where('guides_info.id', '>', 0)->where('guides_info.owner_id', '>', 0);
  146.     $this->applyFilter($guides,$request,$owner_id);
  147.  
  148.  
  149.     if($owner_type != 'all' && in_array($owner_type,['user','clan']))
  150.     {
  151.       $guides->whereOwnerType($owner_type);
  152.       if($owner_id > 0)
  153.       {
  154.         $guides->whereOwnerId($owner_id);
  155.       }
  156.     }
  157.  
  158.     if($no_paginate)
  159.       $guides = $guides->with(['game','language'])->get();
  160.     else
  161.       $guides = $guides->with(['game','language'])->paginate(config('cm.page_count'));
  162.  
  163.     if($guides)
  164.       foreach($guides as $guide)
  165.       {
  166.         $guide->view = $this->guideView($guide);
  167.       }
  168.  
  169.     return $guides;
  170.   }
  171.  
  172.   //Получение инфы о гайде (с развернутым представлением)
  173.   public function guideInfo($id)
  174.   {
  175.     $guide = $this->guide->with(['game','language'])->findOrFail($id);
  176.     $guide->view = $this->guideView($guide,true);
  177.  
  178.     return $guide;
  179.   }
  180.  
  181.   //То же, что и выше, только по слагу
  182.   public function guideInfoSlug($slug)
  183.   {
  184.     $guide = $this->guide->with(['game','language'])->whereSlug($slug)->firstOrFail();
  185.     $guide->view = $this->guideView($guide,true);
  186.  
  187.     return $guide;
  188.   }
  189.  
  190.   //Получение формы создания \ редактирования гайда
  191.   public function editForm($game_slug, $slug = false)
  192.   {
  193.     $game = Games::whereSlug($game_slug)->firstOrFail();
  194.  
  195.     if(!$slug)
  196.       $guide = new Guide();
  197.     else
  198.       $guide = $this->guide->whereGameId($game->id)->whereSlug($slug)->firstOrFail();
  199.  
  200.     if(!$guide->canEdit()) return false;
  201.  
  202.     $game_class = $this->getGameClass($game);
  203.     if(!$game_class) return false;
  204.  
  205.     if($guide->id || ((old('target_type')) && (old('target_id'))))
  206.     {
  207.       if($guide->id)
  208.       {
  209.         $target_type = $guide->target_type;
  210.         $target_id = $guide->target_id;
  211.       }
  212.       else{
  213.         $target_type = old('target_type');
  214.         $target_id = old('target_id');
  215.       }
  216.  
  217.       $type = $this->checkTargetType($game,$target_type);
  218.       if(!$type)
  219.         return false;
  220.  
  221.       if($type['target_available'])
  222.         $target = WikiEntity::whereGameId($game->id)->whereCatSlug($target_type)->findOrFail($target_id);
  223.       else
  224.         $target = false;
  225.  
  226.       $guide->form = $game_class->renderForm($guide, $type, $target);
  227.     }
  228.     else
  229.       $guide->form = false;
  230.  
  231.     if(!$guide->game_id)
  232.     {
  233.       $guide->game = $game;
  234.     }
  235.  
  236.     return $guide;
  237.   }
  238.  
  239.   //Проверка, есть ли такой тип гайда для данной игры
  240.   public function checkTargetType($game, $target_type)
  241.   {
  242.     $type = config($game->module.'.guide_types.'.$target_type);
  243.     if(!$type) return false;
  244.  
  245.     return $type;
  246.   }
  247.  
  248.   //Получение списка целей гайда для данного target_type
  249.   public function targetsList($game, $request)
  250.   {
  251.     $target_type = $request->target_type;
  252.     if(!$target_type) return false;
  253.  
  254.     $game = $this->gameInfo($game);
  255.     if(!$game) return false;
  256.  
  257.     if(!$this->checkTargetType($game,$target_type))
  258.     {
  259.       return false;
  260.     }
  261.  
  262.     $targets = WikiEntity::whereGameId($game->id)->whereCatSlug($target_type)->orderBy('name')->get();
  263.     return view('guides.forms.partials.targets_list',['targets' => $targets]);
  264.   }
  265.  
  266.   //Получение расширенной формы редактирования гайда
  267.   public function extForm($game_slug, $request)
  268.   {
  269.     $target_type = $request->target_type;
  270.     if(!$target_type) return false;
  271.  
  272.     $game = $this->gameInfo($game_slug);
  273.     if(!$game) return false;
  274.  
  275.     $type = $this->checkTargetType($game,$target_type);
  276.     if(!$type)
  277.     {
  278.       return false;
  279.     }
  280.  
  281.     $target_avail = $type['target_available'];
  282.  
  283.     //Если у гайда должен быть объект - ищем его
  284.     if($target_avail) {
  285.       $target_id = $request->target_id;
  286.       if (!$target_id)
  287.         return false;
  288.  
  289.       $target = WikiEntity::whereGameId($game->id)->whereCatSlug($target_type)->findOrFail($target_id);
  290.     }
  291.     else{
  292.       //А если нет - не ищем (если это какая-нибудь тактика)
  293.       $target = false;
  294.     }
  295.  
  296.     $guide = new Guide;
  297.  
  298.     $game_class = $this->getGameClass($game);
  299.     if(!$game_class) return false;
  300.  
  301.     return $game_class->renderForm($guide, $type, $target);
  302.   }
  303.  
  304.   //Создание \ редактирование гайда
  305.   public function guideEdit($game_slug, $slug, $request)
  306.   {
  307.     $game = Games::whereSlug($game_slug)->firstOrFail();
  308.  
  309.     if(!$slug)
  310.       $guide = new Guide();
  311.     else
  312.       $guide = $this->guide->whereGameId($game->id)->whereSlug($slug)->firstOrFail();
  313.  
  314.     if(!$guide->canEdit()) return false;
  315.  
  316.     $game_class = $this->getGameClass($game);
  317.     if(!$game_class) return false;
  318.  
  319.     //Проверка наличия типа гайда
  320.     $type = $this->checkTargetType($game,$request->target_type);
  321.     if(!$type)
  322.     {
  323.       flash()->error('Неизвестный тип гайда');
  324.       return false;
  325.     }
  326.  
  327.     if($type['target_available'])
  328.     {
  329.       $target = WikiEntity::whereGameId($game->id)->whereCatSlug($request->target_type)->findOrFail($request->target_id);
  330.       if(!$target)
  331.       {
  332.         flash()->error('Объект гайда не найден');
  333.         return false;
  334.       }
  335.     }
  336.     else{
  337.       $target = false;
  338.       $request->target_id = 0;
  339.     }
  340.  
  341.  
  342.     $update_id = $request->update_id;
  343.     if($update_id && $update_id > 0)
  344.     {
  345.       $check_update = WikiUpdate::whereGameId($game->id)->find($update_id);
  346.       if(!$check_update)
  347.       {
  348.         flash()->error('Выбранная версия обновления не найдена');
  349.         return false;
  350.       }
  351.     }
  352.     else
  353.       $update_id = 0;
  354.  
  355.     //Заполнение базовых параметров
  356.     $guide->name = $request->name;
  357.     $guide->update_id = $update_id;
  358.     $guide->game_id = $game->id;
  359.     $guide->target_type = $request->target_type;
  360.     $guide->target_id = $request->target_id;
  361.     $guide->language_id = $request->language;
  362.     $guide->note = $request->desc;
  363.  
  364.     if(!$guide->owner_type || !$guide->owner_id)
  365.     {
  366.       $guide->owner_type = 'user'; //Пока что гайды могут добавлять только юзеры
  367.       $guide->owner_id = auth()->id();
  368.     }
  369.  
  370.     if(!$guide->id)
  371.     {
  372.       //Гайд пока не прошел модерацию
  373.       $guide->active = 1;
  374.       $guide->moderated = 0;
  375.       flash()->message('Гайд отправлен на модерацию и появится в списке, как только модератор проверит его');
  376.     }
  377.  
  378.  
  379.     //Если есть - грузим подложку
  380.     if($request->file('image'))
  381.     {
  382.       $guide_image = '/'.$request->image->store('images');
  383.  
  384.       $image = new ImagesManager;
  385.       $guide_image = $image->toWebp($guide_image);
  386.  
  387.       if($guide->image && $guide->image != '')
  388.       {
  389.         $image->removeUpload($guide->image);
  390.       }
  391.     }
  392.     else{
  393.       $guide_image = $guide->image;
  394.     }
  395.  
  396.     $guide->image = $guide_image;
  397.  
  398.     $game_res = $game_class->editGuide($guide,$request);
  399.     if(!$game_res)
  400.     {
  401.       flash()->error('Ошибка в заполнении параметров игры');
  402.       return false;
  403.     }
  404.  
  405.     $guide->slug = $request->slug;
  406.     $guide->save();
  407.     //Применяем слаг
  408.     if(strpos($guide->slug,$guide->id.'-') == 0)
  409.       $guide->slug = str_replace($guide->id.'-','',$guide->slug);
  410.  
  411.     $guide->slug = $guide->id.'-'.$guide->slug;
  412.     $guide->save();
  413.  
  414.     return $guide;
  415.   }
  416.  
  417.   //Проголосовать за гайд
  418.   public function guideVote($game_slug, $slug, $request)
  419.   {
  420.     $game = Games::whereSlug($game_slug)->firstOrFail();
  421.     $guide = $this->guide->whereGameId($game->id)->whereSlug($slug)->firstOrFail();
  422.  
  423.     if(!$guide->canVote())
  424.       return false;
  425.  
  426.     $vote = $request->vote;
  427.     if(!$vote) return false;
  428.     return $guide->makeVote($vote);
  429.   }
  430.  
  431.   //Изменить видимость гайда в поиске
  432.   public function guideChangeActive($game_slug, $slug)
  433.   {
  434.     $game = Games::whereSlug($game_slug)->firstOrFail();
  435.     $guide = $this->guide->whereGameId($game->id)->whereSlug($slug)->firstOrFail();
  436.  
  437.     if(!$guide->canEdit())
  438.       return false;
  439.  
  440.     $guide->active = !$guide->active;
  441.     $guide->save();
  442.  
  443.     return true;
  444.   }
  445.  
  446.   public function guideChangeModerated($game_slug, $slug)
  447.   {
  448.     $game = Games::whereSlug($game_slug)->firstOrFail();
  449.     $guide = $this->guide->whereGameId($game->id)->whereSlug($slug)->firstOrFail();
  450.  
  451.     if(!$guide->canModerate())
  452.       return false;
  453.  
  454.     $guide->moderated = !$guide->moderated;
  455.     $guide->moderator_id = auth()->id();
  456.     $guide->save();
  457.  
  458.     if($guide->moderated)
  459.     {
  460.       //Создаем оповещение чуваку, что его гайд оценили
  461.       \Notifes::createNotif([
  462.           'user_id' => $guide->owner_id,
  463.           'template_slug' => 'guide_moderated',
  464.           'target_type' => 'guide',
  465.           'target_id' => $guide->id,
  466.           'trigger_type' => 'user',
  467.           'trigger_id' => auth()->id(),
  468.           'new' => 1
  469.       ]);
  470.  
  471.       if($guide->owner_type == 'user')
  472.         $guide->owner->addTransaction('bonuses', 'guide', $guide->id, $guide->name);
  473.     }
  474.     else{
  475.       //Создаем оповещение чуваку, что его гайд оценили
  476.       \Notifes::createNotif([
  477.           'user_id' => $guide->owner_id,
  478.           'template_slug' => 'guide_unmoderated',
  479.           'target_type' => 'guide',
  480.           'target_id' => $guide->id,
  481.           'trigger_type' => 'user',
  482.           'trigger_id' => auth()->id(),
  483.           'new' => 1
  484.       ]);
  485.  
  486.       if($guide->owner_type == 'user')
  487.         $guide->owner->deleteTransaction('guide', $guide->id);
  488.     }
  489.  
  490.     return true;
  491.   }
  492.  
  493.   //Удаление гайда
  494.   public function guideDelete($game_slug, $slug)
  495.   {
  496.     $game = Games::whereSlug($game_slug)->firstOrFail();
  497.     $guide = $this->guide->whereGameId($game->id)->whereSlug($slug)->firstOrFail();
  498.  
  499.     if(!$guide->canModerate())
  500.       return false;
  501.  
  502.     $guide->moderated = !$guide->moderated;
  503.     $guide->moderator_id = auth()->id();
  504.  
  505.  
  506.     \Notifes::createNotif([
  507.         'user_id' => $guide->owner_id,
  508.         'template_slug' => 'guide_deleted',
  509.         'target_type' => 'guide',
  510.         'target_id' => $guide->id,
  511.         'trigger_type' => 'user',
  512.         'trigger_id' => auth()->id(),
  513.         'new' => 1
  514.     ]);
  515.  
  516.     $guide->delete();
  517.  
  518.     if($guide->owner_type == 'user')
  519.       $guide->owner->deleteTransaction('guide', $guide->id);
  520.  
  521.     return true;
  522.   }
  523.  
  524.   public function guideRestore($game_slug, $slug)
  525.   {
  526.     $game = Games::whereSlug($game_slug)->firstOrFail();
  527.     $guide = $this->guide->whereGameId($game->id)->whereSlug($slug)->withTrashed()->firstOrFail();
  528.  
  529.     if(!$guide->canModerate())
  530.       return false;
  531.  
  532.     $guide->moderated = !$guide->moderated;
  533.     $guide->moderator_id = auth()->id();
  534.  
  535.     \Notifes::createNotif([
  536.         'user_id' => $guide->owner_id,
  537.         'template_slug' => 'guide_restored',
  538.         'target_type' => 'guide',
  539.         'target_id' => $guide->id,
  540.         'trigger_type' => 'user',
  541.         'trigger_id' => auth()->id(),
  542.         'new' => 1
  543.     ]);
  544.  
  545.     $guide->restore();
  546.  
  547.     if($guide->owner_type == 'user' && $guide->moderated)
  548.       $guide->owner->restoreTransaction('guide', $guide->id);
  549.  
  550.     return true;
  551.   }
  552. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement