From 77ae80c06c0d125bf769129a2d5c921ad976e8c1 Mon Sep 17 00:00:00 2001 From: liuwei Date: Wed, 17 Sep 2025 14:26:55 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AD=BE=E5=88=B0=E5=8A=9F=E8=83=BD=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E4=BA=86=E6=80=BB=E5=A4=A9=E6=95=B0=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/sign_in.py | 59 ++++++++++++++++++++++++++++++++++++ db/sign_in_redis.py | 22 +++++++++++++- plugins/message_sign/main.py | 14 ++++++++- 3 files changed, 93 insertions(+), 2 deletions(-) diff --git a/db/sign_in.py b/db/sign_in.py index 2f5178c..52ab4ce 100644 --- a/db/sign_in.py +++ b/db/sign_in.py @@ -161,3 +161,62 @@ class SignInDB(BaseDBOperator): last_sign_date, previous_streak, datetime.now(), wx_id, group_id) return self.execute_update(sql, params) + + def create_sign_history(self, wx_id: str, group_id: str, sign_date: datetime, + sign_time: datetime, is_makeup: bool, points_earned: int, + streak_count: int) -> bool: + """创建签到历史记录""" + sql = """ + INSERT INTO t_sign_history + (wx_id, group_id, sign_date, sign_time, is_makeup, points_earned, streak_count) + VALUES (%s, %s, %s, %s, %s, %s, %s) + """ + params = (wx_id, group_id, sign_date.date(), sign_time, + 1 if is_makeup else 0, points_earned, streak_count) + return self.execute_update(sql, params) + + def get_user_sign_history(self, wx_id: str, group_id: str, + start_date: datetime = None, + end_date: datetime = None, + limit: int = 30) -> List[Dict]: + """获取用户签到历史记录""" + sql = """ + SELECT id, wx_id, group_id, sign_date, sign_time, + is_makeup, points_earned, streak_count, create_time + FROM t_sign_history + WHERE wx_id = %s AND group_id = %s + """ + params = [wx_id, group_id] + + if start_date: + sql += " AND sign_date >= %s" + params.append(start_date.date()) + if end_date: + sql += " AND sign_date <= %s" + params.append(end_date.date()) + + sql += " ORDER BY sign_date DESC, sign_time DESC LIMIT %s" + params.append(limit) + + return self.execute_query(sql, tuple(params)) + + def get_user_sign_count(self, wx_id: str, group_id: str, + start_date: datetime = None, + end_date: datetime = None) -> int: + """获取用户签到总次数""" + sql = """ + SELECT COUNT(*) as count + FROM t_sign_history + WHERE wx_id = %s AND group_id = %s + """ + params = [wx_id, group_id] + + if start_date: + sql += " AND sign_date >= %s" + params.append(start_date.date()) + if end_date: + sql += " AND sign_date <= %s" + params.append(end_date.date()) + + result = self.execute_query(sql, tuple(params), fetch_one=True) + return result['count'] if result else 0 diff --git a/db/sign_in_redis.py b/db/sign_in_redis.py index 9c7b183..f7d5b9c 100644 --- a/db/sign_in_redis.py +++ b/db/sign_in_redis.py @@ -74,4 +74,24 @@ class SignInRedisDB: redis_client.delete(key) return True except Exception: - return False \ No newline at end of file + return False + + def get_user_total_sign_count_key(self, wx_id: str, group_id: str) -> str: + """获取用户总签到次数的Redis键""" + return f"{self.prefix}sign:total:{wx_id}:{group_id}" + + def increment_user_sign_count(self, wx_id: str, group_id: str) -> int: + """增加用户签到总次数""" + key = self.get_user_total_sign_count_key(wx_id, group_id) + return self.redis.incr(key) + + def get_user_total_sign_count(self, wx_id: str, group_id: str) -> int: + """获取用户签到总次数""" + key = self.get_user_total_sign_count_key(wx_id, group_id) + count = self.redis.get(key) + return int(count) if count else 0 + + def set_user_total_sign_count(self, wx_id: str, group_id: str, count: int) -> bool: + """设置用户签到总次数""" + key = self.get_user_total_sign_count_key(wx_id, group_id) + return self.redis.set(key, count) \ No newline at end of file diff --git a/plugins/message_sign/main.py b/plugins/message_sign/main.py index 3e4f9dc..d4dedfb 100644 --- a/plugins/message_sign/main.py +++ b/plugins/message_sign/main.py @@ -317,7 +317,16 @@ class MessageSignPlugin(MessagePluginInterface): None # 首次签到,没有上次签到时间 ) - # 在输出信息中添加每日词汇 + # 记录签到历史 + self.sign_in_db.create_sign_history( + sender, roomid, current_time, current_time, + False, points_to_add, streak + ) + + # 更新Redis中的签到总次数 + total_sign_count = self.sign_in_redis.increment_user_sign_count(sender, roomid) + + # 在输出信息中添加每日词汇和签到总次数 output = f"签到成功,加[{points_to_add}]积分,第[{today_signin_rank}]个!" if streak_broken and old_streak > 0: # 只有在真的断签且之前有签到记录时才显示 @@ -325,6 +334,9 @@ class MessageSignPlugin(MessagePluginInterface): elif streak > 1: output += f"连签 {streak} 天!" + # 添加总签到次数信息 + output += f"\n总签到次数:{total_sign_count}次" + # 从内存中获取随机词汇 daily_vocab = self.get_random_vocabulary() output += f"\n今日词汇:{daily_vocab}"