refactor: flatten src/AKSRT → src (drop theme-identifier dir)

Move all domain folders from src/AKSRT/{Domain} to src/{Domain}; remap
Composer PSR-4 "AKSRT\\": "src/"; update audit script + README + ADR
paths; remove dead tools/build-psr4-map.php (scanned deleted inc/classes).
This commit is contained in:
2026-08-02 22:06:06 +08:00
parent 56f1a8175f
commit 8c5b1555c9
285 changed files with 26 additions and 3600 deletions
+160
View File
@@ -0,0 +1,160 @@
<?php
/**
* @package AKSRT
*/
namespace AKSRT\User;
defined('ABSPATH') || exit;
class Metrics {
public const META_POST_LIKE_SUM = 'aksrt_posts_like_sum';
public const META_COMMENT_LIKE_SUM = 'aksrt_comment_like_sum';
public const META_POSTS_VIEWS_SUM = 'aksrt_posts_views_sum';
public const META_PAY_INCOME = 'aksrt_pay_income_sum';
public const META_PAY_REBATE = 'aksrt_pay_rebate_sum';
public const META_CHECKIN_ALL_DAY = 'aksrt_checkin_all_day';
/** @var self|null */
private static $instance = null;
public static function get_instance(): self {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
public function init(): void {
add_action('aksrt_post_liked', [$this, 'on_post_liked'], 20, 3);
add_action('aksrt_comment_liked', [$this, 'on_comment_liked'], 20, 3);
add_action('aksrt_post_favorited', [$this, 'on_post_favorited'], 20, 3);
add_action('aksrt_user_followed', [$this, 'on_user_followed'], 20, 2);
add_action('aksrt_post_viewed', [$this, 'on_post_viewed'], 20, 2);
add_action('aksrt_user_signed_in', [$this, 'on_user_signed_in'], 20, 1);
add_action('aksrt_creator_income_added', [$this, 'on_creator_income_added'], 20, 3);
add_action('aksrt_pay_rebate_added', [$this, 'on_pay_rebate_added'], 20, 3);
}
public static function bump_user_meta(int $user_id, string $meta_key, float $delta = 1.0): float {
if ($user_id <= 0 || $meta_key === '' || $delta == 0.0) {
return 0.0;
}
$current = (float) get_user_meta($user_id, $meta_key, true);
$next = max(0.0, $current + $delta);
update_user_meta($user_id, $meta_key, $next);
return $next;
}
public static function reevaluate_medals(int $user_id): void {
if ($user_id > 0 && class_exists('AKSRT\\User\\Badges') && method_exists('AKSRT\\User\\Badges', 'auto_evaluate')) {
Badges::auto_evaluate($user_id);
}
}
public function on_post_liked(int $post_id, int $actor_id, bool $active): void {
$post = get_post($post_id);
if (!$post instanceof \WP_Post || $post->post_type !== 'post') {
return;
}
$author = (int) $post->post_author;
if ($author <= 0 || $author === $actor_id) {
return;
}
self::bump_user_meta($author, self::META_POST_LIKE_SUM, $active ? 1.0 : -1.0);
if ($active) {
self::reevaluate_medals($author);
}
}
public function on_comment_liked(int $comment_id, int $actor_id, bool $active): void {
$comment = get_comment($comment_id);
if (!$comment) {
return;
}
$author = (int) $comment->user_id;
if ($author <= 0 || $author === $actor_id) {
return;
}
self::bump_user_meta($author, self::META_COMMENT_LIKE_SUM, $active ? 1.0 : -1.0);
if ($active) {
self::reevaluate_medals($author);
}
}
public function on_post_favorited(int $post_id, int $actor_id, bool $active): void {
unset($post_id, $actor_id, $active);
// Favorite is free-points / level only; no dedicated medal get_type.
}
public function on_user_followed(int $follower_id, int $following_id): void {
unset($follower_id);
if ($following_id > 0) {
self::reevaluate_medals($following_id);
}
}
public function on_post_viewed(int $post_id, int $viewer_id = 0): void {
unset($viewer_id);
$post = get_post($post_id);
if (!$post instanceof \WP_Post || $post->post_type !== 'post') {
return;
}
$author = (int) $post->post_author;
if ($author <= 0) {
return;
}
self::bump_user_meta($author, self::META_POSTS_VIEWS_SUM, 1.0);
// Cheap throttle: reevaluate every 50 views on author sum.
$sum = (float) get_user_meta($author, self::META_POSTS_VIEWS_SUM, true);
if (((int) $sum % 50) === 0) {
self::reevaluate_medals($author);
}
}
/**
* @param int $topic_id
* @param int $author_id
*/
public function on_user_signed_in(int $user_id): void {
if ($user_id <= 0) {
return;
}
self::bump_user_meta($user_id, self::META_CHECKIN_ALL_DAY, 1.0);
self::reevaluate_medals($user_id);
}
/**
* @param int $user_id
* @param float $amount
* @param array $context
*/
public function on_creator_income_added($user_id, $amount, $context = []): void {
unset($context);
$user_id = (int) $user_id;
$amount = (float) $amount;
if ($user_id <= 0 || $amount <= 0) {
return;
}
self::bump_user_meta($user_id, self::META_PAY_INCOME, $amount);
self::reevaluate_medals($user_id);
}
/**
* @param int $user_id
* @param float $amount
* @param array $context
*/
public function on_pay_rebate_added($user_id, $amount, $context = []): void {
unset($context);
$user_id = (int) $user_id;
$amount = (float) $amount;
if ($user_id <= 0 || $amount <= 0) {
return;
}
self::bump_user_meta($user_id, self::META_PAY_REBATE, $amount);
self::reevaluate_medals($user_id);
}
}