From eb667ab43f06438b90ce0f6358c4af5ee1b53894 Mon Sep 17 00:00:00 2001 From: Antares Date: Wed, 1 Apr 2020 16:50:36 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AD=BE=E5=88=B0=E6=8E=92=E5=90=8D=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins_new/sign_in/datatypes.py | 10 ++++++++ plugins_new/sign_in/plugin.py | 43 +++++++++++++++++++------------- 2 files changed, 36 insertions(+), 17 deletions(-) diff --git a/plugins_new/sign_in/datatypes.py b/plugins_new/sign_in/datatypes.py index 8bf7307..98d6aa1 100644 --- a/plugins_new/sign_in/datatypes.py +++ b/plugins_new/sign_in/datatypes.py @@ -16,3 +16,13 @@ class UserData: group_id: int user_id: int score: int = 0 + + +@dataclass +class RanklistItem: + group_id: int + user_id: int + score: int + last_time: int + month_times: int + total_times: int diff --git a/plugins_new/sign_in/plugin.py b/plugins_new/sign_in/plugin.py index 68a05ba..778fc9b 100644 --- a/plugins_new/sign_in/plugin.py +++ b/plugins_new/sign_in/plugin.py @@ -19,6 +19,11 @@ class SignInConfig(ConfigBase): class SignInPlugin(Plugin): + def get_last_sign_in_time(self, group_id: int, user_id: int) -> int: + return self.conn.execute( + "SELECT MAX(TIME) FROM SIGNINS WHERE GROUP_ID = ? AND USER_ID = ?", + (group_id, user_id,)).fetchone()[0] + def get_last_sign_in_data(self, group_id: int, user_id: int) -> SignInData: """ 返回某群某人上一次的签到记录 @@ -30,9 +35,7 @@ class SignInPlugin(Plugin): "SELECT COUNT(*) FROM SIGNINS WHERE GROUP_ID = ? AND USER_ID = ?", (group_id, user_id,)).fetchone()[0]: # 存在上一条记录 - last_time: int = self.conn.execute( - "SELECT MAX(TIME) FROM SIGNINS WHERE GROUP_ID = ? AND USER_ID = ?", - (group_id, user_id,)).fetchone()[0] # 得到上次签到时间 + last_time: int = self.get_last_sign_in_time(group_id, user_id) # 得到上次签到时间 result = self.conn.execute( "SELECT * FROM SIGNINS WHERE GROUP_ID = ? AND USER_ID = ? AND TIME = ?", ( group_id, @@ -43,7 +46,7 @@ class SignInPlugin(Plugin): else: return SignInData(group_id, user_id) - def clac_sign_in_times(self, group_id: int, user_id: int) -> (int, int): + def calc_sign_in_times(self, group_id: int, user_id: int) -> (int, int): """ 返回两个int值,表示某群某人总签到次数和当前月份签到次数 @param group_id: 群号 @@ -52,13 +55,13 @@ class SignInPlugin(Plugin): now = time.localtime(int(time.time())) this_month = int(time.mktime(time.strptime( f"{now.tm_year}-{now.tm_mon}", "%Y-%m"))) # 获得当前月开始的时间戳 - all_times = self.conn.execute( + total_times = self.conn.execute( "SELECT COUNT(*) FROM SIGNINS WHERE GROUP_ID = ? AND USER_ID = ?", (group_id, user_id,)).fetchone()[0] # 签到总数 month_times = self.conn.execute( "SELECT COUNT(*) FROM SIGNINS WHERE GROUP_ID = ? AND USER_ID = ? AND TIME >= ? ", (group_id, user_id, this_month,)).fetchone()[0] # 本月签到数 - return all_times, month_times + return total_times, month_times def get_user_data(self, user_id: int) -> List[UserData]: """ @@ -70,17 +73,23 @@ class SignInPlugin(Plugin): data: List[UserData] = list(UserData(*row[:3]) for row in result) return data - def get_group_sign_in_ranklist(self, group_id: int) -> List[UserData]: + def get_group_sign_in_ranklist(self, group_id: int) -> List[RanklistItem]: """ 返回某群签到排名列表,按照积分降序排列 @param group_id: 群号 - @param user_id: QQ号 """ result = self.conn.execute("SELECT * FROM USERS WHERE GROUP_ID = ?", ( group_id, )).fetchall() - data: List[UserData] = [UserData(*row[:3]) for row in result] + data: List[RanklistItem] = [] + + for row in result: + user_id = row[1] + score = row[2] + last_time = self.get_last_sign_in_time(group_id, user_id) + total_times, month_times = self.calc_sign_in_times(group_id, user_id) + data.append(RanklistItem(group_id, user_id, score, last_time, month_times, total_times)) return sorted(data, key=lambda x: x.score, reverse=True) @@ -152,7 +161,7 @@ class SignInPlugin(Plugin): group_id, user_id) # 上次签到的数据 last_time = time.localtime(last_sign_in_data.time) # 上次签到的时间 current_time = time.localtime(int(time.time())) # 当前时间 - all_times, month_times = self.clac_sign_in_times( + all_times, month_times = self.calc_sign_in_times( group_id, user_id) # 总签到次数,当月签到次数 if last_time.tm_year == current_time.tm_year and last_time.tm_yday == current_time.tm_yday: @@ -171,7 +180,7 @@ class SignInPlugin(Plugin): # 上次签到和本次签到年份相等 if last_time.tm_yday + 1 == current_time.tm_yday: # 上次签到日期和本次差1,连续签到 - sign_in_data.duration = last_sign_in_data.duration+1 + sign_in_data.duration = last_sign_in_data.duration + 1 else: sign_in_data.duration = 1 elif last_time.tm_year + 1 == current_time.tm_year: @@ -185,7 +194,7 @@ class SignInPlugin(Plugin): else: sign_in_data.duration = 1 - duration_add = sign_in_data.duration-1 + duration_add = sign_in_data.duration - 1 if duration_add > 10: duration_add = 10 if sign_in_data.duration > 30: @@ -206,8 +215,8 @@ class SignInPlugin(Plugin): 积分增加:{sign_in_data.score_changes} 连续签到加成:{duration_add} 当前积分:{sign_in_data.score} -本月签到次数:{month_times+1} -累计群签到次数:{all_times+1}""") +本月签到次数:{month_times + 1} +累计群签到次数:{all_times + 1}""") def command_user_query(self, plugin, args: List[str], raw_string: str, context: dict, evt: PrivateMessageEvent): user_id = int(evt.sender.user_id) @@ -234,10 +243,10 @@ class SignInPlugin(Plugin): time.strptime(f"{year}-{month}", "%Y-%m"))) if month == 12: query_month_end = int(time.mktime( - time.strptime(f"{year+1}-1", "%Y-%m")))-1 + time.strptime(f"{year + 1}-1", "%Y-%m"))) - 1 else: query_month_end = int(time.mktime( - time.strptime(f"{year}-{month+1}", "%Y-%m")))-1 + time.strptime(f"{year}-{month + 1}", "%Y-%m"))) - 1 except Exception: self.bot.client_async.send(context, "请输入合法的月份年份") return @@ -264,7 +273,7 @@ class SignInPlugin(Plugin): self.bot: CountdownBot self.config: SignInConfig self.conn = sqlite3.connect( - self.plugin_base_dir/"sign_in.db", check_same_thread=False) + self.plugin_base_dir / "sign_in.db", check_same_thread=False) try: self.conn.execute("""CREATE TABLE IF NOT EXISTS SIGNINS( GROUP_ID INTEGER NOT NULL, -- Gitee