From c50f7b72694178d1c29ad56d508da8577c571af1 Mon Sep 17 00:00:00 2001 From: yuetsh <517252939@qq.com> Date: Wed, 5 Aug 2026 10:58:30 -0600 Subject: [PATCH] =?UTF-8?q?feat(achievement):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=97=A9=E8=B5=B7=E6=8F=90=E4=BA=A4=E6=AC=A1=E6=95=B0=E6=8C=87?= =?UTF-8?q?=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 5:00–7:00 的提交计数,与 midnight_submissions 对称,5 点为分界不重叠。 纯计数指标,不依赖 _ 前缀辅助键,因此无需 recompute_state。 部署后需跑 recompute_achievements,否则存量用户该指标为空。 Co-Authored-By: Claude Opus 5 --- achievement/metrics.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/achievement/metrics.py b/achievement/metrics.py index 6a59a72..abe85a3 100644 --- a/achievement/metrics.py +++ b/achievement/metrics.py @@ -252,6 +252,18 @@ class MidnightSubmissions(BaseMetric): return sum(1 for t in _practice_submissions(user.id).values_list("create_time", flat=True) if 0 <= timezone.localtime(t).hour < 5) +@metric("early_bird_submissions", "早起提交次数", "5:00–7:00 之间的提交次数") +class EarlyBirdSubmissions(BaseMetric): + """与 midnight_submissions 对称的作息维度。5 点是两者的分界,不重叠。""" + + def on_submission(self, metrics, sub, ctx): + if 5 <= ctx["local_hour"] < 7: + metrics["early_bird_submissions"] = metrics.get("early_bird_submissions", 0) + 1 + + def recompute(self, user): + return sum(1 for t in _practice_submissions(user.id).values_list("create_time", flat=True) if 5 <= timezone.localtime(t).hour < 7) + + @metric("compile_error_count", "编译错误次数", "累计编译错误的次数") class CompileErrorCount(BaseMetric): def on_submission(self, metrics, sub, ctx):