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); }
<?php require_once __DIR__ . '/../src/core.php'; $limit = 500; $userProcessor = new UserProcessor(); $oldNames = []; $newNames = []; $query = 'SELECT name FROM userfriend' . ' GROUP BY name' . ' ORDER BY RANDOM()' . ' LIMIT ?'; $newNames = array_map(function ($x) { return $x['name']; }, R::getAll($query, [$limit])); $query = 'SELECT name FROM user ORDER BY name LIMIT ?'; $oldNames = array_map(function ($x) { return $x['name']; }, R::getAll($query, [$limit])); $newNames = array_diff($newNames, $oldNames); $newNames = array_slice($newNames, 0, $limit); $pad = strlen(count($newNames)); $done = 0; $exitCode = 0; foreach ($newNames as $name) { try { ++$done; printf("(%0{$pad}d/%d) Processing user %s" . PHP_EOL, $done, count($newNames), $name); $userProcessor->process($name); } catch (Exception $e) { echo $e->getMessage() . PHP_EOL; $exitCode = 1; } } exit($exitCode);
public function renderForTemplate($viewType) { $output = array(); // Call all registered plugins foreach ($this->plugins as $plugin) { foreach ($this->posts as $p) { if (!$p->isProcessingStopped()) { $plugin->add($p); } } $plugin->processAll($viewType); } $user = null; foreach ($this->posts as $post) { if (!$user) { $user = $post->get('user'); date_default_timezone_set($user->get('timezone')); $user->set('description', array_merge($user->get('description'), array('html' => EntityProcessor::generateDefaultHTML($user->get('description'))))); } if (!$post->isVisible()) { continue; } $payload = $post->getPayload(); if (!isset($payload['html'])) { $post->set('html', EntityProcessor::generateDefaultHTML($payload)); } if ($post->isRepost()) { // Process repost $originalPost = $post->getOriginalPost(); UserProcessor::processAnnotations($originalPost->get('user')); if (!$originalPost->has('html')) { $originalPost->set('html', EntityProcessor::generateDefaultHTML($originalPost->getPayload())); } } if (!$post->hasMetaField('title')) { // Generate a title for listings, e.g. in an RSS feed if (isset($payload['entities']['links']) && count($payload['entities']['links']) > 0 && $payload['entities']['links'][0]['pos'] < 80) { $post->setMetaField('title', substr($payload['text'], 0, $payload['entities']['links'][0]['pos'] - 1)); } else { $post->setMetaField('title', $this->truncate($payload['text'], 80)); } } // Convert canonical URL for reposters and stargazers if ($post->has('starred_by')) { foreach ($post->get('starred_by') as $u) { UserProcessor::processAnnotations($u); } } if ($post->has('reposters')) { foreach ($post->get('reposters') as $u) { UserProcessor::processAnnotations($u); } } $output[] = array('template' => $post->getTemplate(), 'post' => $post->getPayloadForTemplate($viewType == View::PERMALINK), 'meta' => $post->getAllMetaFields()); } return array('user' => $user->getPayloadForTemplate(), 'posts' => $output); }
} if (!$errors) { $queue->dequeue(); } else { $queue->dequeue(); $enqueueAtStart = $queueItem->attempts < $maxAttempts; if ($enqueueAtStart) { $queueItem->attempts++; $queue->enqueue($queueItem, $enqueueAtStart); } } ++$processed; } } CronRunner::run(__FILE__, function ($logger) { $userProcessor = new UserProcessor(); $mediaProcessors = [Media::Anime => new AnimeProcessor(), Media::Manga => new MangaProcessor()]; $userQueue = new Queue(Config::$userQueuePath); $userQueueSize = (new Queue(Config::$userQueuePath))->size(); $mediaQueue = new Queue(Config::$mediaQueuePath); if ($userQueueSize > 30) { Config::$usersPerCronRun = Config::$usersPerCronRunMore; Config::$mediaPerCronRun = Config::$mediaPerCronRunMore; } Downloader::setLogger($logger); #process users processQueue($userQueue, Config::$usersPerCronRun, Config::$userQueueMaxAttempts, $logger, function ($userName) use($userProcessor, $mediaQueue, $logger) { Database::selectUser($userName); $logger->log('Processing user %s... ', $userName); #process the user $userContext = $userProcessor->process($userName);