This repository has been archived on 2024-06-26. You can view files and clone it, but cannot push or open issues or pull requests.
sakura/app/Console/Command/ResyncForumStatsCommand.php
2016-12-22 19:10:09 +01:00

195 lines
5.9 KiB
PHP

<?php
/**
* Holds the forum stats resyncer.
* @package Sakura
*/
namespace Sakura\Console\Command;
use CLIFramework\Command;
use Illuminate\Database\Query\JoinClause;
use Sakura\DB;
use Sakura\Forum\Post;
/**
* Resyncs forum stats.
* @package Sakura
* @author Julian van de Groep <me@flash.moe>
*/
class ResyncForumStatsCommand extends Command
{
/**
* A quick description of this command.
* @return string.
*/
public function brief(): string
{
return 'Resynchronises the user topics and posts counts.';
}
/**
* Does the repository installing.
*/
public function execute(): void
{
$this->getLogger()->writeln("This might take a while...");
$this->getLogger()->writeln("");
$this->forumStats();
$this->topicStats();
$this->userStats();
$this->getLogger()->writeln("Done!");
}
private function forumStats(): void
{
$this->getLogger()->writeln("=> Forums");
$forums = DB::table('forums')
->where('forum_type', 0)
->get(['forum_id']);
foreach ($forums as $forum) {
$this->getLogger()->writeln("==> Forum {$forum->forum_id}");
$topic_count = DB::table('topics')
->where('forum_id', $forum->forum_id)
->count();
// if topic count is 0 then there's no point in continuing
if (!$topic_count) {
$this->getLogger()->writeln("No posts found, skipping...");
continue;
}
$post_count = DB::table('posts')
->where('forum_id', $forum->forum_id)
->count();
$last_post_id = DB::table('posts')
->where('forum_id', $forum->forum_id)
->orderBy('post_id', 'desc')
->take(1)
->value('post_id');
$last_post = new Post($last_post_id);
DB::table('forums')
->where('forum_id', $forum->forum_id)
->update([
'forum_count_topics' => $topic_count,
'forum_count_posts' => $post_count,
'last_post_id' => $last_post->id,
'last_post_title' => $last_post->subject,
'last_post_time' => $last_post->time,
'last_post_user_id' => $last_post->poster->id,
'last_post_username' => $last_post->poster->username,
'last_post_user_colour' => $last_post->poster->colour,
]);
}
$this->getLogger()->writeln("");
}
private function topicStats(): void
{
$this->getLogger()->writeln("=> Topics");
$topics = DB::table('topics')
->get(['topic_id', 'post_id']);
foreach ($topics as $topic) {
$this->getLogger()->writeln("==> Topic {$topic->topic_id}");
$reply_count = DB::table('posts')
->where('topic_id', $topic->topic_id)
->count();
// delete the topic record if there's no posts presents
if ($reply_count === 0) {
$this->getLogger()->writeln("No posts found, deleting record...");
DB::table('topics')
->where('topic_id', $topic->topic_id)
->delete();
continue;
}
// take one off the reply count because the OP technically isn't a reply
$reply_count--;
$last_post_id = DB::table('posts')
->where('topic_id', $topic->topic_id)
->orderBy('post_id', 'desc')
->take(1)
->value('post_id');
$last_post = new Post($last_post_id);
$update_data = [
'topic_replies' => $reply_count,
'last_post_id' => $last_post->id,
'last_post_user_id' => $last_post->poster->id,
'last_post_username' => $last_post->poster->username,
'last_post_user_colour' => $last_post->poster->colour,
];
if (intval($topic->post_id) === 0) {
$this->getLogger()->writeln("Missing first post record, resolving...");
$first_post_id = DB::table('posts')
->where('topic_id', $topic->topic_id)
->orderBy('post_id')
->take(1)
->value('post_id');
$first_post = new Post($first_post_id);
$update_data = array_merge($update_data, [
'post_id' => $first_post->id,
'user_id' => $first_post->poster->id,
'first_post_username' => $first_post->poster->username,
'first_post_user_colour' => $first_post->poster->colour,
]);
$this->getLogger()->writeln("Linked post {$first_post->id} to topic {$topic->topic_id}.");
}
DB::table('topics')
->where('topic_id', $topic->topic_id)
->update($update_data);
}
$this->getLogger()->writeln("");
}
private function userStats(): void
{
$this->getLogger()->writeln("=> Users");
$users = DB::table('users')
->orderBy('user_id')
->get(['user_id']);
foreach ($users as $user) {
$this->getLogger()->writeln("==> User {$user->user_id}");
$posts_count = DB::table('posts')
->where('poster_id', $user->user_id)
->count();
$topics_count = DB::table('topics')
->where('user_id', $user->user_id)
->count();
DB::table('users')
->where('user_id', $user->user_id)
->update([
'user_count_topics' => $topics_count,
'user_count_posts' => $posts_count,
]);
}
$this->getLogger()->writeln("");
}
}