0 && class_exists('AKSRT_User_Badges') && method_exists('AKSRT_User_Badges', 'auto_evaluate')) { AKSRT_User_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_forum_topic_featured($topic_id, $author_id = 0): void { $author_id = (int) $author_id; if ($author_id <= 0) { $post = get_post((int) $topic_id); $author_id = $post ? (int) $post->post_author : 0; } if ($author_id <= 0) { return; } self::bump_user_meta($author_id, self::META_BBS_ESSENCE, 1.0); self::reevaluate_medals($author_id); } /** * @param int $topic_id * @param int $comment_id * @param int $adoptee_id */ public function on_forum_reply_adopted($topic_id, $comment_id, $adoptee_id): void { unset($topic_id, $comment_id); $adoptee_id = (int) $adoptee_id; if ($adoptee_id <= 0) { return; } self::bump_user_meta($adoptee_id, self::META_BBS_ADOPT, 1.0); self::reevaluate_medals($adoptee_id); } /** * @param int $comment_id * @param int $author_id */ public function on_forum_comment_hot($comment_id, $author_id = 0): void { $author_id = (int) $author_id; if ($author_id <= 0) { $c = get_comment((int) $comment_id); $author_id = $c ? (int) $c->user_id : 0; } if ($author_id <= 0) { return; } self::bump_user_meta($author_id, self::META_BBS_COMMENT_HOT, 1.0); self::reevaluate_medals($author_id); } /** * @param int $topic_id * @param int $author_id */ public function on_forum_topic_hot($topic_id, $author_id = 0): void { $author_id = (int) $author_id; if ($author_id <= 0) { $post = get_post((int) $topic_id); $author_id = $post ? (int) $post->post_author : 0; } if ($author_id <= 0) { return; } self::bump_user_meta($author_id, self::META_BBS_POST_HOT, 1.0); self::reevaluate_medals($author_id); } /** * @param int $topic_id * @param int $author_id * @param float $delta */ public function on_forum_topic_scored($topic_id, $author_id, $delta = 0): void { unset($topic_id); $author_id = (int) $author_id; $delta = (float) $delta; if ($author_id <= 0 || $delta == 0.0) { return; } self::bump_user_meta($author_id, self::META_BBS_SCORE, $delta); self::reevaluate_medals($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); } /* ---------- level XP bridges ---------- */ private static function level_add(int $user_id, string $key): void { if ($user_id > 0 && class_exists('AKSRT_User_Level')) { AKSRT_User_Level::add($user_id, $key); } } public function level_on_post_liked(int $post_id, int $actor_id, bool $active): void { if (!$active) { return; } $post = get_post($post_id); if (!$post instanceof WP_Post) { return; } $author = (int) $post->post_author; if ($author > 0 && $author !== $actor_id) { self::level_add($author, 'post_like'); } } public function level_on_comment_liked(int $comment_id, int $actor_id, bool $active): void { if (!$active) { return; } $c = get_comment($comment_id); if (!$c) { return; } $author = (int) $c->user_id; if ($author > 0 && $author !== $actor_id) { self::level_add($author, 'comment_like'); } } public function level_on_post_favorited(int $post_id, int $actor_id, bool $active): void { if (!$active) { return; } $post = get_post($post_id); if (!$post instanceof WP_Post) { return; } $author = (int) $post->post_author; if ($author > 0 && $author !== $actor_id) { self::level_add($author, 'post_favorite'); } } public function level_on_user_followed(int $follower_id, int $following_id): void { unset($follower_id); self::level_add((int) $following_id, 'followed'); } public function level_on_forum_topic_featured($topic_id, $author_id = 0): void { unset($topic_id); self::level_add((int) $author_id, 'bbs_essence'); } public function level_on_forum_reply_adopted($topic_id, $comment_id, $adoptee_id): void { unset($topic_id, $comment_id); self::level_add((int) $adoptee_id, 'bbs_adopt'); } public function level_on_forum_comment_hot($comment_id, $author_id = 0): void { unset($comment_id); self::level_add((int) $author_id, 'bbs_comment_hot'); } public function level_on_forum_topic_hot($topic_id, $author_id = 0): void { unset($topic_id); self::level_add((int) $author_id, 'bbs_posts_hot'); } public function level_on_forum_topic_scored($topic_id, $author_id, $delta = 0): void { unset($topic_id); if ((float) $delta > 0) { self::level_add((int) $author_id, 'bbs_score_extra'); } } /** * @param int $user_id * @param int $topic_id */ public function level_on_forum_topic_created($user_id, $topic_id = 0): void { unset($topic_id); self::level_add((int) $user_id, 'bbs_posts_new'); } public function level_on_user_signed_in(int $user_id): void { // Sign-in XP: use sign_in key once/day via existing login guard path as well. self::level_add($user_id, 'sign_in'); } }