From 6552606cc7f39f7087ebaad34eb8a43588e71a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B4=9B=E6=B0=B4=E5=B1=85=E5=AE=A4?= Date: Sun, 25 Dec 2022 21:26:08 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Improve=20code=20quality?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/base/assets.py | 2 +- core/bot.py | 39 +++++++++++++++++-------------- metadata/scripts/metadatas.py | 10 ++++---- plugins/genshin/avatar_list.py | 37 ++++++++++++++--------------- plugins/genshin/cookies.py | 6 ++--- plugins/genshin/daily/material.py | 22 ++++++++--------- plugins/genshin/verification.py | 2 +- plugins/jobs/sign.py | 8 ++++--- plugins/system/admin.py | 3 ++- plugins/system/get_chat.py | 6 ++--- plugins/system/new_member.py | 12 +++++----- plugins/system/set_quiz.py | 14 +++++------ plugins/system/start.py | 8 +++---- plugins/system/update.py | 4 ++-- utils/decorators/restricts.py | 9 ++++--- utils/helpers.py | 8 +++---- utils/log/__init__.py | 5 +--- utils/log/_handler.py | 4 +--- 18 files changed, 100 insertions(+), 99 deletions(-) diff --git a/core/base/assets.py b/core/base/assets.py index 1743bafd..96dcce52 100644 --- a/core/base/assets.py +++ b/core/base/assets.py @@ -277,7 +277,7 @@ class _AvatarAssets(_AssetsService): yield str(AMBR_HOST.join(f"assets/UI/{self.game_name_map[item]}.png")) async def _get_from_enka(self, item: str) -> AsyncIterator[str | None]: - if (item_id := self.game_name_map.get(item, None)) is not None: + if (item_id := self.game_name_map.get(item)) is not None: yield str(ENKA_HOST.join(f"ui/{item_id}.png")) @cached_property diff --git a/core/bot.py b/core/bot.py index b6688ef7..0d093237 100644 --- a/core/bot.py +++ b/core/bot.py @@ -106,7 +106,7 @@ class Bot: import_module(pkg) # 导入插件 except Exception as e: # pylint: disable=W0703 logger.exception( - f'在导入文件 "{pkg}" 的过程中遇到了错误: \n[red bold]{type(e).__name__}: {e}[/]', extra={"markup": True} + '在导入文件 "%s" 的过程中遇到了错误 [red bold]%s[/]', pkg, type(e).__name__, exc_info=e, extra={"markup": True} ) continue # 如有错误则继续 callback_dict: Dict[int, List[Callable]] = {} @@ -123,7 +123,7 @@ class Bot: self.app.add_handler(handler, group=-1) self.app.add_handlers(handlers) if handlers: - logger.debug(f'插件 "{path}" 添加了 {len(handlers)} 个 handler ') + logger.debug('插件 "%s" 添加了 %s 个 handler ', path, len(handlers)) # noinspection PyProtectedMember for priority, callback in plugin._new_chat_members_handler_funcs(): # pylint: disable=W0212 @@ -135,14 +135,14 @@ class Bot: for callback, block in error_handlers.items(): self.app.add_error_handler(callback, block) if error_handlers: - logger.debug(f'插件 "{path}" 添加了 {len(error_handlers)} 个 error handler') + logger.debug('插件 "%s" 添加了 %s 个 error handler ', path, len(error_handlers)) if jobs := plugin.jobs: - logger.debug(f'插件 "{path}" 添加了 {len(jobs)} 个任务') - logger.success(f'插件 "{path}" 载入成功') + logger.debug('插件 "%s" 添加了 %s 个 jobs ', path, len(jobs)) + logger.success('插件 "%s" 载入成功', path) except Exception as e: # pylint: disable=W0703 logger.exception( - f'在安装插件 "{path}" 的过程中遇到了错误: \n[red bold]{type(e).__name__}: {e}[/]', extra={"markup": True} + '在安装插件 "%s" 的过程中遇到了错误 [red bold]%s[/]', path, type(e).__name__, exc_info=e, extra={"markup": True} ) if callback_dict: num = sum(len(callback_dict[i]) for i in callback_dict) @@ -157,7 +157,9 @@ class Bot: MessageHandler(callback=_new_chat_member_callback, filters=StatusUpdate.NEW_CHAT_MEMBERS, block=False) ) logger.success( - f"成功添加了 {num} 个针对 [blue]{StatusUpdate.NEW_CHAT_MEMBERS}[/] 的 [blue]MessageHandler[/]", + "成功添加了 %s 个针对 [blue]%s[/] 的 [blue]MessageHandler[/]", + num, + StatusUpdate.NEW_CHAT_MEMBERS, extra={"markup": True}, ) # special handler @@ -175,9 +177,9 @@ class Bot: import_module(pkg) except Exception as e: # pylint: disable=W0703 logger.exception( - f'在导入文件 "{pkg}" 的过程中遇到了错误: \n[red bold]{type(e).__name__}: {e}[/]', extra={"markup": True} + '在导入文件 "%s" 的过程中遇到了错误 [red bold]%s[/]', pkg, type(e).__name__, exc_info=e, extra={"markup": True} ) - continue + raise SystemExit from e for base_service_cls in Service.__subclasses__(): try: if hasattr(base_service_cls, "from_config"): @@ -185,10 +187,10 @@ class Bot: else: instance = self.init_inject(base_service_cls) await instance.start() - logger.success(f'服务 "{base_service_cls.__name__}" 初始化成功') + logger.success('服务 "%s" 初始化成功', base_service_cls.__name__) self._services.update({base_service_cls: instance}) except Exception as e: - logger.exception(f'服务 "{base_service_cls.__name__}" 初始化失败: {e}') + logger.error('服务 "%s" 初始化失败', base_service_cls.__name__) raise SystemExit from e async def start_services(self): @@ -201,7 +203,11 @@ class Bot: import_module(pkg) except Exception as e: # pylint: disable=W0703 logger.exception( - f'在导入文件 "{pkg}" 的过程中遇到了错误: \n[red bold]{type(e).__name__}: {e}[/]', extra={"markup": True} + '在导入文件 "%s" 的过程中遇到了错误 [red bold]%s[/]', + pkg, + type(e).__name__, + exc_info=e, + extra={"markup": True}, ) continue @@ -218,11 +224,11 @@ class Bot: await service.stop() else: service.stop() - logger.success(f'服务 "{service.__class__.__name__}" 关闭成功') + logger.success('服务 "%s" 关闭成功', service.__class__.__name__) except CancelledError: - logger.warning(f'服务 "{service.__class__.__name__}" 关闭超时') + logger.warning('服务 "%s" 关闭超时', service.__class__.__name__) except Exception as e: # pylint: disable=W0703 - logger.exception(f'服务 "{service.__class__.__name__}" 关闭失败: \n{type(e).__name__}: {e}') + logger.exception('服务 "%s" 关闭失败', service.__class__.__name__, exc_info=e) async def _post_init(self, context: CallbackContext) -> NoReturn: logger.info("开始初始化 genshin.py 相关资源") @@ -276,7 +282,6 @@ class Bot: logger.warning("连接至 [blue]telegram[/] 服务器失败,正在重试", extra={"markup": True}) continue except NetworkError as e: - logger.exception() if "SSLZeroReturnError" in str(e): logger.error("代理服务出现异常, 请检查您的代理服务是否配置成功.") else: @@ -285,7 +290,7 @@ class Bot: except (SystemExit, KeyboardInterrupt): pass except Exception as e: # pylint: disable=W0703 - logger.exception(f"BOT 执行过程中出现错误: {e}") + logger.exception("BOT 执行过程中出现错误", exc_info=e) finally: loop = asyncio.get_event_loop() loop.run_until_complete(self.stop_services()) diff --git a/metadata/scripts/metadatas.py b/metadata/scripts/metadatas.py index cd1fd8a7..e6650d0e 100644 --- a/metadata/scripts/metadatas.py +++ b/metadata/scripts/metadatas.py @@ -118,14 +118,14 @@ async def update_metadata_from_github(overwrite: bool = True): data = json.dumps(data, ensure_ascii=False) await file.write(data) return data - except RemoteProtocolError as e: - logger.warning(f"在从 {host} 下载元数据的过程中遇到了错误: {repr(e)}") + except RemoteProtocolError as exc: + logger.warning("在从 %s 下载元数据的过程中遇到了错误: %s", host, str(exc)) continue - except Exception as e: + except Exception as exc: if num != len(hosts) - 1: - logger.error(f"在从 {host} 下载元数据的过程中遇到了错误: {repr(e)}") + logger.error("在从 %s 下载元数据的过程中遇到了错误: %s", host, str(exc)) continue - raise e + raise exc def make_github_fast(url: str) -> str: diff --git a/plugins/genshin/avatar_list.py b/plugins/genshin/avatar_list.py index 1cf53f62..af2564ff 100644 --- a/plugins/genshin/avatar_list.py +++ b/plugins/genshin/avatar_list.py @@ -70,22 +70,21 @@ class AvatarListPlugin(Plugin, BasePlugin): ) async def get_avatar_data(self, character: Character, client: Client) -> Optional["AvatarData"]: - detail = None for _ in range(5): try: detail = await client.get_character_details(character) - except Exception as e: # pylint: disable=W0703 - if isinstance(e, GenshinException) and "Too Many Requests" in e.msg: + except Exception as exc: # pylint: disable=W0703 + if isinstance(exc, GenshinException) and "Too Many Requests" in exc.msg: await asyncio.sleep(0.2) continue if character.name == "旅行者": - logger.debug(f"解析旅行者数据时遇到了错误:{e}") + logger.debug("解析旅行者数据时遇到了错误:%s", str(exc)) return None - raise e + raise exc else: break else: - logger.warning(f"解析[bold]{character.name}[/]的数据时遇到了 Too Many Requests 错误", extra={"markup": True}) + logger.warning("解析[bold]%s[/]的数据时遇到了 Too Many Requests 错误", character.name, extra={"markup": True}) return None if character.id == 10000005: # 针对男草主 talents = [] @@ -134,43 +133,43 @@ class AvatarListPlugin(Plugin, BasePlugin): async def get_final_data(self, client: Client, characters: Sequence[Character], update: Update): try: response = await self.enka_client.fetch_user(client.uid) - namecard = (await self.assets_service.namecard(response.player.namecard.id).navbar()).as_uri() + name_card = (await self.assets_service.namecard(response.player.namecard.id).navbar()).as_uri() avatar = (await self.assets_service.avatar(response.player.avatar.id).icon()).as_uri() nickname = response.player.nickname if response.player.avatar.id in [10000005, 10000007]: rarity = 5 else: rarity = {k: v["rank"] for k, v in AVATAR_DATA.items()}[str(response.player.avatar.id)] - except Exception as e: # pylint: disable=W0703 - logger.debug(f"enka 请求失败: {e}") + except Exception as exc: # pylint: disable=W0703 + logger.error("enka 请求失败: %s", str(exc)) choices = ArkoWrapper(characters).filter(lambda x: x.friendship == 10) # 筛选出好感满了的角色 if choices.length == 0: # 若没有满好感角色、则以好感等级排序 choices = ArkoWrapper(characters).sort(lambda x: x.friendship, reverse=True) - namecard_choices = ( # 找到与角色对应的满好感名片ID + name_card_choices = ( # 找到与角色对应的满好感名片ID ArkoWrapper(choices) .map(lambda x: next(filter(lambda y: y["name"].split(".")[0] == x.name, NAMECARD_DATA.values()), None)) .filter(lambda x: x) .map(lambda x: x["id"]) ) - namecard = (await self.assets_service.namecard(namecard_choices[0]).navbar()).as_uri() + name_card = (await self.assets_service.namecard(name_card_choices[0]).navbar()).as_uri() avatar = (await self.assets_service.avatar(cid := choices[0].id).icon()).as_uri() nickname = update.effective_user.full_name if cid in [10000005, 10000007]: rarity = 5 else: rarity = {k: v["rank"] for k, v in AVATAR_DATA.items()}[str(cid)] - return namecard, avatar, nickname, rarity + return name_card, avatar, nickname, rarity async def get_default_final_data(self, characters: Sequence[Character], update: Update): nickname = update.effective_user.full_name rarity = 5 # 须弥·正明 - namecard = (await self.assets_service.namecard(210132).navbar()).as_uri() + name_card = (await self.assets_service.namecard(210132).navbar()).as_uri() if traveller := next(filter(lambda x: x.id in [10000005, 10000007], characters), None): avatar = (await self.assets_service.avatar(traveller.id).icon()).as_uri() else: avatar = (await self.assets_service.avatar(10000005).icon()).as_uri() - return namecard, avatar, nickname, rarity + return name_card, avatar, nickname, rarity @handler.command("avatars", filters.Regex(r"^/avatars\s*(?:(\d+)|(all))?$"), block=False) @handler.message(filters.Regex(r"^(全部)?练度统计$"), block=False) @@ -216,17 +215,17 @@ class AvatarListPlugin(Plugin, BasePlugin): raise e try: - namecard, avatar, nickname, rarity = await self.get_final_data(client, characters, update) - except Exception as e: - logger.debug(f"卡片信息请求失败: {e}") - namecard, avatar, nickname, rarity = await self.get_default_final_data(characters, update) + name_card, avatar, nickname, rarity = await self.get_final_data(client, characters, update) + except Exception as exc: + logger.error("卡片信息请求失败", exc_info=exc) + name_card, avatar, nickname, rarity = await self.get_default_final_data(characters, update) render_data = { "uid": client.uid, # 玩家uid "nickname": nickname, # 玩家昵称 "avatar": avatar, # 玩家头像 "rarity": rarity, # 玩家头像对应的角色星级 - "namecard": namecard, # 玩家名片 + "namecard": name_card, # 玩家名片 "avatar_datas": avatar_datas, # 角色数据 "has_more": len(characters) != len(avatar_datas), # 是否显示了全部角色 } diff --git a/plugins/genshin/cookies.py b/plugins/genshin/cookies.py index da3bf2d0..38c3b956 100644 --- a/plugins/genshin/cookies.py +++ b/plugins/genshin/cookies.py @@ -74,7 +74,7 @@ class SetUserCookies(Plugin.Conversation, BasePlugin.Conversation): async def command_start(self, update: Update, context: CallbackContext) -> int: user = update.effective_user message = update.effective_message - logger.info(f"用户 {user.full_name}[{user.id}] 绑定账号命令请求") + logger.info("用户 %s[%s] 绑定账号命令请求", user.full_name, user.id) add_user_command_data: AddUserCommandData = context.chat_data.get("add_user_command_data") if add_user_command_data is None: cookies_command_data = AddUserCommandData() @@ -254,7 +254,7 @@ class SetUserCookies(Plugin.Conversation, BasePlugin.Conversation): add_user_command_data.cookies["account_id"] = str(account_id) logger.success("获取用户 %s[%s] account_id[%s] 成功", user.full_name, user.id, account_id) else: - logger.warning("用户 %s[%s] region 也许是不正确的", user.full_name, user.id, client.region.name) + logger.warning("用户 %s[%s] region[%s] 也许是不正确的", user.full_name, user.id, client.region.name) genshin_accounts = await client.genshin_accounts() except DataNotPublic: logger.info("用户 %s[%s] 账号疑似被注销", user.full_name, user.id) @@ -352,7 +352,7 @@ class SetUserCookies(Plugin.Conversation, BasePlugin.Conversation): await self.cookies_service.update_cookies( user.id, add_user_command_data.cookies, add_user_command_data.region ) - logger.info(f"用户 {user.full_name}[{user.id}] 绑定账号成功") + logger.info("用户 %s[%s] 绑定账号成功", user.full_name, user.id) await message.reply_text("保存成功", reply_markup=ReplyKeyboardRemove()) return ConversationHandler.END else: diff --git a/plugins/genshin/daily/material.py b/plugins/genshin/daily/material.py index b358c392..311bce22 100644 --- a/plugins/genshin/daily/material.py +++ b/plugins/genshin/daily/material.py @@ -122,7 +122,7 @@ class DailyMaterial(Plugin, BasePlugin): if (not DATA_FILE_PATH.exists()) or ( # 若缓存不存在 (datetime.today() - datetime.fromtimestamp(os.stat(DATA_FILE_PATH).st_mtime)).days > 3 # 若缓存过期,超过了3天 ): - self.refresh_task = asyncio.create_task(task_daily()) # 创建后台任务 + asyncio.create_task(task_daily()) # 创建后台任务 if not data and DATA_FILE_PATH.exists(): # 若存在,则读取至内存中 async with async_open(DATA_FILE_PATH) as file: data = json.loads(await file.read()) @@ -147,7 +147,7 @@ class DailyMaterial(Plugin, BasePlugin): else: # 如果重试了5次都失败了,则直接返回 None logger.warning( - f"daily_material 解析角色 id 为 [bold]{character.id}[/]的数据时遇到了 Too Many Requests 错误", extra={"markup": True} + "daily_material 解析角色 id 为 [bold]%s[/]的数据时遇到了 Too Many Requests 错误", character.id, extra={"markup": True} ) return None # 不用针对旅行者、草主进行特殊处理,因为输入数据不会有旅行者。 @@ -161,7 +161,7 @@ class DailyMaterial(Plugin, BasePlugin): try: logger.debug("尝试获取已绑定的原神账号") client = await get_genshin_client(user.id) - logger.debug(f"获取账号数据成功: UID={client.uid}") + logger.debug("获取账号数据成功: UID=%s", client.uid) characters = await client.get_genshin_characters(client.uid) for character in characters: if character.name == "旅行者": # 跳过主角 @@ -196,9 +196,9 @@ class DailyMaterial(Plugin, BasePlugin): ) ) except (UserNotFoundError, CookiesNotFoundError): - logger.info(f"未查询到用户({user.full_name} {user.id}) 所绑定的账号信息") + logger.info("未查询到用户 %s[%s] 所绑定的账号信息", user.full_name, user.id) except InvalidCookies: - logger.info(f"用户({user.full_name} {user.id}) 所绑定的账号信息已失效") + logger.info("用户 %s[%s] 所绑定的账号信息已失效", user.full_name, user.id) else: # 没有异常返回数据 return client, user_data @@ -225,7 +225,7 @@ class DailyMaterial(Plugin, BasePlugin): time = f"星期{WEEK_MAP[weekday]}" full = bool(args and args[-1] == "full") # 判定最后一个参数是不是 full - logger.info(f'用户 {user.full_name}[{user.id}] 每日素材命令请求 || 参数 weekday="{WEEK_MAP[weekday]}" full={full}') + logger.info("用户 %s[%s}] 每日素材命令请求 || 参数 weekday=%s full=%s", user.full_name, user.id, WEEK_MAP[weekday], full) if weekday == 6: await message.reply_text( @@ -295,7 +295,7 @@ class DailyMaterial(Plugin, BasePlugin): try: item = HONEY_DATA[type_][id_] except KeyError: # 跳过不存在或者已忽略的角色、武器 - logger.warning(f"未在 honey 数据中找到 {type_} {id_} 的信息") + logger.warning("未在 honey 数据中找到 %s[%s] 的信息", type_, id_) continue if item[2] < 4: # 跳过 3 星及以下的武器 continue @@ -314,7 +314,7 @@ class DailyMaterial(Plugin, BasePlugin): material = HONEY_DATA["material"][mid] materials.append(ItemData(id=mid, icon=path, name=material[1], rarity=material[2])) except AssetsCouldNotFound as exc: - logger.warning("%s mid[%s]", exc.message, exc.target) + logger.warning("AssetsCouldNotFound message[%s] target[%s]", exc.message, exc.target) await notice.edit_text("出错了呜呜呜 ~ 派蒙找不到一些素材") return areas.append( @@ -366,7 +366,7 @@ class DailyMaterial(Plugin, BasePlugin): user = update.effective_user message = update.effective_message - logger.info(f"用户 {user.full_name}[{user.id}] 刷新[bold]每日素材[/]缓存命令", extra={"markup": True}) + logger.info("用户 {%s}[%s] 刷新[bold]每日素材[/]缓存命令", user.full_name, user.id, extra={"markup": True}) if self.locks[0].locked(): notice = await message.reply_text("派蒙还在抄每日素材表呢,我有在好好工作哦~") self._add_delete_message_job(context, notice.chat_id, notice.message_id, 10) @@ -465,7 +465,7 @@ class DailyMaterial(Plugin, BasePlugin): the_time.value = time_() async def task(item_id, name, item_type): - logger.debug(f'正在开始下载 "{name}" 的图标素材') + logger.debug("正在开始下载 %s 的图标素材", name) await edit_message(f"正在搬运 {name} 的图标素材。。。") asset: AssetsServiceType = getattr(self.assets_service, item_type)(item_id) # 获取素材对象 asset_list.append(asset.honey_id) @@ -473,7 +473,7 @@ class DailyMaterial(Plugin, BasePlugin): # 并根据图标类型找到下载对应图标的函数 for icon_type in asset.icon_types: await getattr(asset, icon_type)(True) # 执行下载函数 - logger.debug(f'"{name}" 的图标素材下载成功') + logger.debug("%s 的图标素材下载成功", name) await edit_message(f"正在搬运 {name} 的图标素材。。。成功!") for TYPE, ITEMS in HONEY_DATA.items(): # 遍历每个对象 diff --git a/plugins/genshin/verification.py b/plugins/genshin/verification.py index d0001e0f..a8d19576 100644 --- a/plugins/genshin/verification.py +++ b/plugins/genshin/verification.py @@ -49,7 +49,7 @@ class VerificationPlugins(Plugin, BasePlugin): async def verify(self, update: Update, context: CallbackContext) -> None: user = update.effective_user message = update.effective_message - logger.info(f"用户 %s[%s] 发出verify命令", user.full_name, user.id) + logger.info("用户 %s[%s] 发出verify命令", user.full_name, user.id) try: client = await get_genshin_client(user.id) if client.region != Region.CHINESE: diff --git a/plugins/jobs/sign.py b/plugins/jobs/sign.py index f28f26c9..ee6579f2 100644 --- a/plugins/jobs/sign.py +++ b/plugins/jobs/sign.py @@ -48,9 +48,11 @@ class SignJob(Plugin): if context.job.name == "SignJob": if sign_db.status not in [SignStatusEnum.STATUS_SUCCESS, SignStatusEnum.ALREADY_CLAIMED]: continue - elif context.job.name == "SignAgainJob": - if sign_db.status in [SignStatusEnum.STATUS_SUCCESS, SignStatusEnum.ALREADY_CLAIMED]: - continue + elif context.job.name == "SignAgainJob" and sign_db.status in [ + SignStatusEnum.STATUS_SUCCESS, + SignStatusEnum.ALREADY_CLAIMED, + ]: + continue try: client = await get_genshin_client(user_id) text = await self.sign_system.start_sign( diff --git a/plugins/system/admin.py b/plugins/system/admin.py index 8a94ddca..984afdd5 100644 --- a/plugins/system/admin.py +++ b/plugins/system/admin.py @@ -1,4 +1,5 @@ import contextlib + from telegram import Update from telegram.error import BadRequest, Forbidden from telegram.ext import CallbackContext, CommandHandler @@ -57,7 +58,7 @@ class AdminPlugin(Plugin): await message.reply_text("输入错误") return except ValueError as error: - logger.error("获取 chat_id 发生错误! 错误信息为 \n", error) + logger.error("获取 chat_id 发生错误! 错误信息为 \n", exc_info=error) await message.reply_text("输入错误") return try: diff --git a/plugins/system/get_chat.py b/plugins/system/get_chat.py index 9b734d7e..653ca1d8 100644 --- a/plugins/system/get_chat.py +++ b/plugins/system/get_chat.py @@ -94,16 +94,16 @@ class GetChat(Plugin): f"\n签到状态:{sign_info.status.name}" ) else: - text += f"\n自动签到:未开启" + text += "\n自动签到:未开启" with contextlib.suppress(Exception): gacha_log, status = await self.gacha_log.load_history_info(str(chat.id), str(uid)) if status: - text += f"\n抽卡记录:" + text += "\n抽卡记录:" for key, value in gacha_log.item_list.items(): text += f"\n - {key}:{len(value)} 条" text += f"\n - 最后更新:{gacha_log.update_time.strftime('%Y-%m-%d %H:%M:%S')}" else: - text += f"\n抽卡记录:未导入" + text += "\n抽卡记录:未导入" return text @handler(CommandHandler, command="get_chat", block=False) diff --git a/plugins/system/new_member.py b/plugins/system/new_member.py index 04fafa77..5d829c88 100644 --- a/plugins/system/new_member.py +++ b/plugins/system/new_member.py @@ -31,7 +31,7 @@ class BotJoiningGroupsVerification(Plugin): from_user = message.from_user for new_chat_members_user in message.new_chat_members: if new_chat_members_user.id == context.bot.id: - logger.info(f"有人邀请BOT进入群 {chat.title}[{chat.id}]") + logger.info("有人邀请BOT进入群 %s[%s]", chat.title, chat.id) quit_status = True if from_user is not None: logger.info(f"用户 {from_user.full_name}[{from_user.id}] 在群 {chat.title}[{chat.id}] 邀请BOT") @@ -42,22 +42,22 @@ class BotJoiningGroupsVerification(Plugin): quit_status = False else: logger.warning("不是管理员邀请!退出群聊") - except Exception as exc: - logger.error(f"获取信息出现错误 {repr(exc)}") + except Exception as exc: # pylint: disable=W0703 + logger.error("获取信息出现错误", exc_info=exc) elif config.join_groups == JoinGroups.ALLOW_AUTH_USER: try: user_info = await self.user_service.get_user_by_id(from_user.id) await self.cookies_service.get_cookies(from_user.id, user_info.region) except (UserNotFoundError, CookiesNotFoundError): - logger.warning(f"用户 {from_user.full_name}[{from_user.id}] 邀请请求被拒绝") + logger.warning("用户 %s[%s] 邀请请求被拒绝", from_user.full_name, from_user.id) except Exception as exc: - logger.error(f"获取信息出现错误 {repr(exc)}") + logger.error("获取信息出现错误", exc_info=exc) else: quit_status = False else: quit_status = True else: - logger.info(f"未知用户 在群 {chat.title}[{chat.id}] 邀请BOT") + logger.info("未知用户 在群 %s[%s] 邀请BOT", chat.title, chat.id) if quit_status: await context.bot.send_message(message.chat_id, "派蒙不想进去!不是旅行者的邀请!") await context.bot.leave_chat(chat.id) diff --git a/plugins/system/set_quiz.py b/plugins/system/set_quiz.py index 6bb073bf..f1166381 100644 --- a/plugins/system/set_quiz.py +++ b/plugins/system/set_quiz.py @@ -50,7 +50,7 @@ class SetQuizPlugin(Plugin.Conversation, BasePlugin.Conversation): async def command_start(self, update: Update, context: CallbackContext) -> int: user = update.effective_user message = update.effective_message - logger.info(f"用户 {user.full_name}[{user.id}] set_quiz命令请求") + logger.info("用户 %s[%s] set_quiz命令请求", user.full_name, user.id) quiz_command_data: QuizCommandData = context.chat_data.get("quiz_command_data") if quiz_command_data is None: quiz_command_data = QuizCommandData() @@ -110,8 +110,8 @@ class SetQuizPlugin(Plugin.Conversation, BasePlugin.Conversation): except DataError: await update.message.reply_text("Redis数据错误,重载失败", reply_markup=ReplyKeyboardRemove()) return ConversationHandler.END - except ResponseError as error: - logger.error("重载问题失败", error) + except ResponseError as exc: + logger.error("重载问题失败", exc_info=exc) await update.message.reply_text("重载问题失败,异常抛出Redis请求错误异常,详情错误请看日记", reply_markup=ReplyKeyboardRemove()) return ConversationHandler.END await update.message.reply_text("重载成功", reply_markup=ReplyKeyboardRemove()) @@ -189,8 +189,8 @@ class SetQuizPlugin(Plugin.Conversation, BasePlugin.Conversation): await update.message.reply_text("保存成功", reply_markup=ReplyKeyboardRemove()) try: await self.quiz_service.refresh_quiz() - except ResponseError as error: - logger.error("重载问题失败", error) + except ResponseError as exc: + logger.error("重载问题失败", exc_info=exc) await update.message.reply_text( "重载问题失败,异常抛出Redis请求错误异常,详情错误请看日记", reply_markup=ReplyKeyboardRemove() ) @@ -223,8 +223,8 @@ class SetQuizPlugin(Plugin.Conversation, BasePlugin.Conversation): await self.quiz_service.delete_question_by_id(question.question_id) await update.message.reply_text("删除问题成功", reply_markup=ReplyKeyboardRemove()) await self.quiz_service.refresh_quiz() - except ResponseError as error: - logger.error("重载问题失败", error) + except ResponseError as exc: + logger.error("重载问题失败", exc_info=exc) await update.message.reply_text("重载问题失败,异常抛出Redis请求错误异常,详情错误请看日记", reply_markup=ReplyKeyboardRemove()) return ConversationHandler.END await update.message.reply_text("重载配置成功", reply_markup=ReplyKeyboardRemove()) diff --git a/plugins/system/start.py b/plugins/system/start.py index d27253cb..df2afff9 100644 --- a/plugins/system/start.py +++ b/plugins/system/start.py @@ -54,22 +54,22 @@ class StartPlugin(Plugin): f"{escape_markdown('发送 /setuid 或 /setcookie 命令进入绑定账号流程')}" ) elif args[0] == "verify_verification": - logger.info(f"用户 %s[%s] 通过start命令 获取认证信息", user.full_name, user.id) + logger.info("用户 %s[%s] 通过start命令 获取认证信息", user.full_name, user.id) await self.process_validate(message, user, bot_username=context.bot.username) elif args[0] == "sign": - logger.info(f"用户 %s[%s] 通过start命令 获取签到信息", user.full_name, user.id) + logger.info("用户 %s[%s] 通过start命令 获取签到信息", user.full_name, user.id) await self.gen_sign_button(message, user) elif args[0].startswith("challenge_"): _data = args[0].split("_") _command = _data[1] _challenge = _data[2] if _command == "sign": - logger.info(f"用户 %s[%s] 通过start命令 进入签到流程", user.full_name, user.id) + logger.info("用户 %s[%s] 通过start命令 进入签到流程", user.full_name, user.id) await self.process_sign_validate(message, user, _challenge) else: await message.reply_html(f"你好 {user.mention_html()} !我是派蒙 !\n请点击 /{args[0]} 命令进入对应流程") return - logger.info(f"用户 %s[%s] 发出start命令", user.full_name, user.id) + logger.info("用户 %s[%s] 发出start命令", user.full_name, user.id) await message.reply_markdown_v2(f"你好 {user.mention_markdown_v2()} {escape_markdown('!我是派蒙 !')}") @staticmethod diff --git a/plugins/system/update.py b/plugins/system/update.py index 55fa1812..88dd8468 100644 --- a/plugins/system/update.py +++ b/plugins/system/update.py @@ -49,14 +49,14 @@ class UpdatePlugin(Plugin): return async with self._lock: reply_text = await message.reply_text("正在更新") - logger.info(f"正在更新代码") + logger.info("正在更新代码") await execute("git fetch --all") if len(args) > 0: await execute("git reset --hard origin/main") await execute("git pull --all") if len(args) > 0: await execute(f"{executable} -m poetry install --extras all") - logger.info(f"更新成功 正在重启") + logger.info("更新成功 正在重启") await reply_text.edit_text("更新成功 正在重启") async with async_open(UPDATE_DATA, mode="w", encoding="utf-8") as file: await file.write(reply_text.to_json()) diff --git a/utils/decorators/restricts.py b/utils/decorators/restricts.py index d28286c3..8fba4b35 100644 --- a/utils/decorators/restricts.py +++ b/utils/decorators/restricts.py @@ -57,9 +57,8 @@ def restricts( user = update.effective_user _restricts_time = restricts_time - if restricts_time_of_groups is not None: - if filters.ChatType.GROUPS.filter(message): - _restricts_time = restricts_time_of_groups + if restricts_time_of_groups is not None and filters.ChatType.GROUPS.filter(message): + _restricts_time = restricts_time_of_groups async with _lock: user_lock = context.user_data.get("lock") @@ -68,7 +67,7 @@ def restricts( # 如果上一个命令还未完成,忽略后续重复调用 if without_overlapping and user_lock.locked(): - logger.warning(f"用户 {user.full_name}[{user.id}] 触发 overlapping 该次命令已忽略") + logger.warning("用户 %s[%s] 触发 overlapping 该次命令已忽略", user.full_name, user.id) return return_data async with user_lock: @@ -90,7 +89,7 @@ def restricts( await update.callback_query.answer("你已经触发洪水防御,请等待60秒", show_alert=True) else: await message.reply_text("你已经触发洪水防御,请等待60秒") - logger.warning(f"用户 {user.full_name}[{user.id}] 触发洪水限制 已被限制60秒") + logger.warning("用户 %s[%s] 触发洪水限制 已被限制60秒", user.full_name, user.id) return return_data # 单次使用限制 if command_time: diff --git a/utils/helpers.py b/utils/helpers.py index 913b72cf..7c8070f0 100644 --- a/utils/helpers.py +++ b/utils/helpers.py @@ -79,17 +79,17 @@ async def url_to_file(url: str, return_path: bool = False) -> str: try: data = await client.get(url) except UnsupportedProtocol: - logger.error(f"连接不支持 url[{url}]") + logger.error("连接不支持 url[%s]", url) return "" if data.is_error: - logger.error(f"请求出现错误 url[{url}] status_code[{data.status_code}]") + logger.error("请求出现错误 url[%s] status_code[%s]", url, data.status_code) raise UrlResourcesNotFoundError(url) if data.status_code != 200: - logger.error(f"url_to_file 获取url[{url}] 错误 status_code[f{data.status_code}]") + logger.error("url_to_file 获取url[%s] 错误 status_code[%s]", url, data.status_code) raise UrlResourcesNotFoundError(url) async with aiofiles.open(file_dir, mode="wb") as f: await f.write(data.content) - logger.debug(f"url_to_file 获取url[{url}] 并下载到 file_dir[{file_dir}]") + logger.debug("url_to_file 获取url[%s] 并下载到 file_dir[%s]", url, file_dir) return file_dir if return_path else Path(file_dir).as_uri() diff --git a/utils/log/__init__.py b/utils/log/__init__.py index a1b196ea..489232c1 100644 --- a/utils/log/__init__.py +++ b/utils/log/__init__.py @@ -31,10 +31,7 @@ logger = Logger( @lru_cache def _name_filter(record_name: str) -> bool: - for name in config.logger.filtered_names + [config.logger.name]: - if re.match(rf"^{name}.*?$", record_name): - return True - return False + return any(re.match(rf"^{name}.*?$", record_name) for name in config.logger.filtered_names + [config.logger.name]) def name_filter(record: "LogRecord") -> bool: diff --git a/utils/log/_handler.py b/utils/log/_handler.py index 41baa991..9656859d 100644 --- a/utils/log/_handler.py +++ b/utils/log/_handler.py @@ -231,9 +231,7 @@ class Handler(DefaultRichHandler): locals_max_length=(getattr(record, "locals_max_length", None) or self.locals_max_length), locals_max_string=(getattr(record, "locals_max_string", None) or self.locals_max_string), locals_max_depth=( - getattr(record, "locals_max_depth") - if hasattr(record, "locals_max_depth") - else self.locals_max_depth + record.locals_max_depth if hasattr(record, "locals_max_depth") else self.locals_max_depth ), suppress=self.tracebacks_suppress, max_frames=self.tracebacks_max_frames,