예제 #1
0
 public function process(array $documents, &$context)
 {
     $franchiseIds = [];
     $franchiseIds[] = self::mediaToKey($context->media);
     foreach ($context->relationData as $relation) {
         if ($relation['media'] != $context->media->media) {
             continue;
         }
         if ($relation['type'] == MediaRelation::Character) {
             continue;
         }
         if (BanHelper::isFranchiseCouplingBanned($relation['media'], $relation['mal_id'], $context->media->media, $context->media->mal_id)) {
             continue;
         }
         $franchiseIds[] = self::mediaToKey($relation);
     }
     foreach (R::findAll('media', 'media||mal_id IN (' . R::genSlots($franchiseIds) . ')', $franchiseIds) as $relatedMedia) {
         $franchiseIds[] = $relatedMedia->franchise;
     }
     $franchiseId = reset($franchiseIds);
     $media =& $context->media;
     $media->franchise = $franchiseId;
     R::store($media);
     $query = 'UPDATE media SET franchise = ? WHERE franchise IN (' . R::genSlots($franchiseIds) . ')';
     R::exec($query, array_merge([$franchiseId], $franchiseIds));
 }
예제 #2
0
 public static function preWork(&$controllerContext, &$viewContext)
 {
     $controllerContext->cache->setPrefix($controllerContext->userName);
     if (BanHelper::getUserBanState($controllerContext->userName) == BanHelper::USER_BAN_TOTAL) {
         $controllerContext->cache->bypass(true);
         $viewContext->userName = $controllerContext->userName;
         $viewContext->viewName = 'error-user-blocked';
         $viewContext->meta->title = 'User blocked — ' . Config::$title;
         return;
     }
     $module = $controllerContext->module;
     HttpHeadersHelper::setCurrentHeader('Content-Type', $module::getContentType());
     $viewContext->media = $controllerContext->media;
     $viewContext->module = $controllerContext->module;
     $viewContext->meta->noIndex = true;
     $viewContext->contentType = $module::getContentType();
     if ($viewContext->contentType != 'text/html') {
         $viewContext->layoutName = 'layout-raw';
     }
     Database::selectUser($controllerContext->userName);
     $user = R::findOne('user', 'LOWER(name) = LOWER(?)', [$controllerContext->userName]);
     if (empty($user)) {
         if (!isset($_GET['referral']) || $_GET['referral'] !== 'search') {
             $controllerContext->cache->bypass(true);
             $viewContext->userName = $controllerContext->userName;
             $viewContext->viewName = 'error-user-not-found';
             $viewContext->meta->title = 'User not found — ' . Config::$title;
             return;
         }
         $queue = new Queue(Config::$userQueuePath);
         $queueItem = new QueueItem(strtolower($controllerContext->userName));
         $queue->enqueue($queueItem);
         $viewContext->queuePosition = $queue->seek($queueItem);
         $controllerContext->cache->bypass(true);
         //try to load cache, if it exists
         $url = $controllerContext->url;
         if ($controllerContext->cache->exists($url)) {
             $controllerContext->cache->load($url);
             flush();
             $viewContext->layoutName = null;
             $viewContext->viewName = null;
             return;
         }
         $viewContext->userName = $controllerContext->userName;
         $viewContext->viewName = 'error-user-enqueued';
         $viewContext->meta->title = 'User enqueued — ' . Config::$title;
         return;
     }
     $viewContext->user = $user;
     $viewContext->meta->styles[] = '/media/css/menu.css';
     $viewContext->updateWait = Config::$userQueueMinWait;
     $module = $controllerContext->module;
     $module::preWork($controllerContext, $viewContext);
 }
예제 #3
0
 public static function doInit()
 {
     $list = TextHelper::loadSimpleList(Config::$bannedUsersListPath);
     foreach ($list as $line) {
         $tmp = strpos($line, "\t") === false ? [$line, self::USER_BAN_TOTAL] : explode("\t", $line);
         list($userName, $banType) = $tmp;
         self::$bannedUsers[strtolower($userName)] = $banType;
     }
     self::$bannedGenres = TextHelper::loadSimpleList(Config::$bannedGenresListPath);
     self::$bannedCreators = TextHelper::loadSimpleList(Config::$bannedCreatorsListPath);
     self::$bannedGenresForRecs = TextHelper::loadSimpleList(Config::$bannedGenresForRecsListPath);
     self::$bannedFranchiseCoupling = TextHelper::loadJson(Config::$bannedFranchiseCouplingListPath, true);
 }
 public static function work(&$controllerContext, &$viewContext)
 {
     $queue = new Queue(Config::$userQueuePath);
     $queueItem = new QueueItem(strtolower($controllerContext->userName));
     $user = R::findOne('user', 'LOWER(name) = LOWER(?)', [$controllerContext->userName]);
     $profileAge = time() - strtotime($user->processed);
     $banned = BanHelper::getUserBanState($controllerContext->userName) != BanHelper::USER_BAN_NONE;
     if ($profileAge > Config::$userQueueMinWait and !$banned && Config::$enqueueEnabled) {
         $queue->enqueue($queueItem);
     }
     $j['user'] = $controllerContext->userName;
     $j['pos'] = $queue->seek($queueItem);
     $viewContext->layoutName = 'layout-json';
     $viewContext->json = $j;
 }
 private static function filterBannedGenres($selectedEntries)
 {
     Model_MixedUserMedia::attachGenres($selectedEntries);
     $finalEntries = [];
     foreach ($selectedEntries as $key => $entry) {
         $add = true;
         foreach ($entry->genres as $genre) {
             if (BanHelper::isGenreBannedForRecs($entry->media, $genre->mal_id)) {
                 $add = false;
                 break;
             }
         }
         if ($add) {
             $finalEntries[$key] = $entry;
         }
     }
     return $finalEntries;
 }
 public static function work(&$controllerContext, &$viewContext)
 {
     try {
         if (empty($_POST['sender'])) {
             throw new Exception('No sender specified');
         }
         $sender = $_POST['sender'];
         if (empty($_POST['action'])) {
             throw new Exception('No action specified');
         }
         $action = $_POST['action'];
         if (empty($_POST['model-ids'])) {
             throw new Exception('No model ids specified');
         }
         $modelIds = array_map('trim', preg_split('/[,;]/', $_POST['model-ids']));
         $chosenMedia = [];
         $chosenUsers = [];
         switch ($sender) {
             case 'media':
                 $chosenMedia = self::getChosenMedia($modelIds);
                 break;
             case 'user':
                 $chosenUsers = self::getChosenUsers($modelIds);
                 break;
             default:
                 throw new Exception('Unknown sender: ' . $sender);
         }
         if ($action == 'refresh') {
             $num = 0;
             $startTime = microtime(true);
             $mediaProcessors = [Media::Anime => new AnimeProcessor(), Media::Manga => new MangaProcessor()];
             $userProcessor = new UserProcessor();
             foreach ($chosenMedia as $media => $ids) {
                 foreach ($ids as $id) {
                     $mediaProcessors[$media]->process($id);
                     ++$num;
                 }
             }
             foreach ($chosenUsers as $user) {
                 $userProcessor->process($user);
                 ++$num;
             }
             $viewContext->messageType = 'info';
             $viewContext->message = sprintf('Successfully processed %d entities in %.02fs', $num, microtime(true) - $startTime);
         } elseif ($action == 'wipe-cache') {
             $deleted = 0;
             foreach ($chosenUsers as $userName) {
                 $cache = new Cache();
                 $cache->setPrefix($userName);
                 foreach ($cache->getAllFiles() as $path) {
                     $deleted++;
                     unlink($path);
                 }
             }
             $viewContext->messageType = 'info';
             $viewContext->message = 'Deleted ' . $deleted . ' files';
         } elseif ($action == 'unban' or $action == 'soft-ban' or $action == 'hard-ban') {
             switch ($action) {
                 case 'unban':
                     $banState = BanHelper::USER_BAN_NONE;
                     break;
                 case 'soft-ban':
                     $banState = BanHelper::USER_BAN_QUEUE_ONLY;
                     break;
                 case 'hard-ban':
                     $banState = BanHelper::USER_BAN_TOTAL;
                     break;
                 default:
                     throw new Exception('Wrong ban state');
             }
             $changed = 0;
             foreach ($chosenUsers as $userName) {
                 BanHelper::setUserBanState($userName, $banState);
                 ++$changed;
             }
             $viewContext->messageType = 'info';
             $viewContext->message = sprintf('Successfully updated %d users', $changed);
         } elseif ($action == 'reset-franchise') {
             $num = 0;
             foreach ($chosenMedia as $media => $ids) {
                 $query = 'UPDATE media SET franchise = NULL WHERE media = ? AND mal_id IN (' . R::genSlots($ids) . ')';
                 R::exec($query, array_merge([$media], $ids));
                 $num += count($ids);
             }
             $viewContext->messageType = 'info';
             $viewContext->message = sprintf('Successfully reset franchise for %d entities. Don\'t forget to refresh them now!', $num);
         } elseif ($action == 'remove') {
             $num = 0;
             foreach ($chosenMedia as $media => $ids) {
                 $query = 'DELETE FROM media WHERE media = ? AND mal_id IN (' . R::genSlots($ids) . ')';
                 R::exec($query, array_merge([$media], $ids));
                 $num += count($ids);
             }
             $viewContext->messageType = 'info';
             $viewContext->message = sprintf('Successfully removed %d entities.', $num);
         } else {
             throw new Exception('Unknown action: ' . $action);
         }
     } catch (Exception $e) {
         $viewContext->messageType = 'error';
         $viewContext->message = $e->getMessage();
     }
     $viewContext->viewName = 'admin-index';
     $viewContext->meta->title = 'Admin — ' . Config::$title;
     WebMediaHelper::addCustom($viewContext);
 }
예제 #7
0
 public static function attachCreators(array &$entries)
 {
     $tblName = self::createTemporaryTable($entries);
     switch (reset($entries)->media) {
         case Media::Anime:
             $table = 'animeproducer';
             break;
         case Media::Manga:
             $table = 'mangaauthor';
             break;
         default:
             throw new BadMediaException();
     }
     $query = 'SELECT * FROM ' . $table . ' mc INNER JOIN ' . $tblName . ' ON mc.media_id = ' . $tblName . '.media_id';
     $rows = R::getAll($query);
     self::dropTemporaryTable($tblName);
     $data = ReflectionHelper::arraysToClasses($rows);
     $map = [];
     foreach ($entries as $entry) {
         $entry->creators = [];
         $map[$entry->media_id] = $entry;
     }
     foreach ($data as $row) {
         if (!isset($map[$row->media_id])) {
             continue;
         }
         if (BanHelper::isCreatorBanned($map[$row->media_id]->media, $row->mal_id)) {
             continue;
         }
         $map[$row->media_id]->creators[] = $row;
     }
 }