签到功能加入了总天数记录。

This commit is contained in:
liuwei
2025-09-17 14:26:55 +08:00
parent 012417cdf9
commit 77ae80c06c
3 changed files with 93 additions and 2 deletions

View File

@@ -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

View File

@@ -74,4 +74,24 @@ class SignInRedisDB:
redis_client.delete(key)
return True
except Exception:
return False
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)

View File

@@ -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}"