feat(users): level integral XP schema + AKSRT_User_Level runtime

Rewrite /users/level to Zibll-like user_level_s/max/opt and
user_integral_opt. Runtime grants XP with day_max, resolves level,
hooks login/register/post/comment/like/favorite/follow. Profile
signals read integral-backed levels. audit errors=0.
This commit is contained in:
kate522 committed 2026-07-17 01:05:39 +08:00
1 parent e80d8ea45d
commit 1b0eed6ef7
8 files changed
+658 -141

No files matched your search

@@ -149,11 +149,12 @@ class AKSRT_Settings_User_Runtime {
'enabled' => !empty($settings['user_level_enabled']) || !empty($settings['user_level_s']),
'public_display' => !isset($settings['user_level_public_display']) || !empty($settings['user_level_public_display']),
'source' => (static function () use ($settings) {
$v = $settings['user_level_source'] ?? 'credits_balance';
return in_array($v, ['credits_balance', 'manual_meta', 'integral'], true) ? $v : 'credits_balance';
$v = $settings['user_level_source'] ?? 'integral';
return in_array($v, ['credits_balance', 'manual_meta', 'integral'], true) ? $v : 'integral';
})(),
'label_prefix' => $level_prefix !== '' ? $level_prefix : 'Lv.',
'thresholds' => self::parse_level_thresholds((string) ($settings['user_level_thresholds'] ?? "1|0\n2|30\n3|100\n4|300")),
'max' => max(3, min(30, (int) ($settings['user_level_max'] ?? 10))),
],
'medal' => $medal,
// Alias for existing call sites that still read badge.*; dictionary is derived from medal catalog.