From 5e18290f9a8073a46313dbe16d8142928d1ea8dc Mon Sep 17 00:00:00 2001 From: omg-xtao <100690902+omg-xtao@users.noreply.github.com> Date: Mon, 21 Aug 2023 22:42:44 +0800 Subject: [PATCH] :zap: Handle All PlayerNotFoundError, CookiesNotFoundError --- .gitignore | 1 + modules/playercards/metadata | 2 +- plugins/genshin/abyss.py | 18 ++------ plugins/genshin/avatar_list.py | 79 +++++++--------------------------- plugins/genshin/daily_note.py | 21 +-------- plugins/genshin/ledger.py | 36 ++-------------- plugins/genshin/pay_log.py | 11 ----- plugins/genshin/reg_time.py | 11 +---- plugins/genshin/sign.py | 15 +------ plugins/genshin/stats.py | 15 +------ plugins/genshin/wish_log.py | 23 ---------- plugins/system/errorhandler.py | 22 ++++++++++ plugins/tools/genshin.py | 6 ++- 13 files changed, 54 insertions(+), 206 deletions(-) diff --git a/.gitignore b/.gitignore index 5c7ce6e..d1bbbda 100644 --- a/.gitignore +++ b/.gitignore @@ -136,6 +136,7 @@ logs/ report/ data/ /resources/*/*/test/ +/resources/*/*/*.map plugins/genshin/daily/daily.json metadata/data/ resources/assets/ diff --git a/modules/playercards/metadata b/modules/playercards/metadata index 6f366f6..5743ac6 160000 --- a/modules/playercards/metadata +++ b/modules/playercards/metadata @@ -1 +1 @@ -Subproject commit 6f366f6367d29cc89643ddf591608f58826dd9dd +Subproject commit 5743ac6ea8ab35ab3149e13c66d0465ab253f29a diff --git a/plugins/genshin/abyss.py b/plugins/genshin/abyss.py index bed885e..6a12fe1 100644 --- a/plugins/genshin/abyss.py +++ b/plugins/genshin/abyss.py @@ -9,17 +9,16 @@ from arkowrapper import ArkoWrapper from pytz import timezone from simnet import GenshinClient from simnet.errors import BadRequest as SimnetBadRequest -from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Message, Update +from telegram import Message, Update from telegram.constants import ChatAction, ParseMode from telegram.ext import CallbackContext, filters -from telegram.helpers import create_deep_linked_url from core.dependence.assets import AssetsService from core.plugin import Plugin, handler from core.services.cookies.error import TooManyRequestPublicCookies from core.services.template.models import RenderGroupResult, RenderResult from core.services.template.services import TemplateService -from plugins.tools.genshin import PlayerNotFoundError, CookiesNotFoundError, GenshinHelper +from plugins.tools.genshin import CookiesNotFoundError, GenshinHelper from utils.log import logger try: @@ -76,7 +75,7 @@ class AbyssPlugin(Plugin): @handler.command("abyss", block=False) @handler.message(filters.Regex(msg_pattern), block=False) - async def command_start(self, update: Update, context: CallbackContext) -> None: + async def command_start(self, update: Update, _: CallbackContext) -> None: user = update.effective_user message = update.effective_message uid: Optional[int] = None @@ -147,17 +146,6 @@ class AbyssPlugin(Plugin): except AbyssNotFoundError: await message.reply_text("无法查询玩家挑战队伍详情,只能查询统计详情哦~") return - except PlayerNotFoundError: # 若未找到账号 - buttons = [[InlineKeyboardButton("点我绑定账号", url=create_deep_linked_url(context.bot.username, "set_uid"))]] - if filters.ChatType.GROUPS.filter(message): - reply_message = await message.reply_text( - "未查询到您所绑定的账号信息,请先私聊派蒙绑定账号", reply_markup=InlineKeyboardMarkup(buttons) - ) - self.add_delete_message_job(reply_message) - self.add_delete_message_job(message) - else: - await message.reply_text("未查询到您所绑定的账号信息,请先绑定账号", reply_markup=InlineKeyboardMarkup(buttons)) - return except TooManyRequestPublicCookies: reply_message = await message.reply_text("查询次数太多,请您稍后重试") if filters.ChatType.GROUPS.filter(message): diff --git a/plugins/genshin/avatar_list.py b/plugins/genshin/avatar_list.py index 8815547..ba3e74a 100644 --- a/plugins/genshin/avatar_list.py +++ b/plugins/genshin/avatar_list.py @@ -2,13 +2,12 @@ import asyncio from typing import List, Optional, Sequence, TYPE_CHECKING from simnet import GenshinClient -from simnet.errors import BadRequest as SimnetBadRequest, InvalidCookies +from simnet.errors import BadRequest as SimnetBadRequest from simnet.models.genshin.calculator import CalculatorTalent, CalculatorCharacterDetails from simnet.models.genshin.chronicle.characters import Character -from telegram import InlineKeyboardButton, InlineKeyboardMarkup, User -from telegram.constants import ChatAction, ParseMode +from telegram import User +from telegram.constants import ChatAction from telegram.ext import filters -from telegram.helpers import create_deep_linked_url from core.dependence.assets import AssetsService from core.plugin import Plugin, handler @@ -19,7 +18,7 @@ from core.services.template.models import FileType from core.services.template.services import TemplateService from metadata.genshin import AVATAR_DATA from modules.wiki.base import Model -from plugins.tools.genshin import CharacterDetails, PlayerNotFoundError, CookiesNotFoundError, GenshinHelper +from plugins.tools.genshin import CharacterDetails, GenshinHelper from utils.log import logger if TYPE_CHECKING: @@ -70,40 +69,6 @@ class AvatarListPlugin(Plugin): self.player_service = player_service self.player_info_service = player_info_service - async def get_user_client( - self, update: "Update", context: "ContextTypes.DEFAULT_TYPE" - ) -> Optional["GenshinClient"]: - message = update.effective_message - user = update.effective_user - try: - return await self.helper.get_genshin_client(user.id) - except PlayerNotFoundError: # 若未找到账号 - buttons = [[InlineKeyboardButton("点我绑定账号", url=create_deep_linked_url(context.bot.username, "set_cookie"))]] - if filters.ChatType.GROUPS.filter(message): - reply_message = await message.reply_text( - "未查询到您所绑定的账号信息,请先私聊派蒙绑定账号", reply_markup=InlineKeyboardMarkup(buttons) - ) - self.add_delete_message_job(reply_message, delay=30) - self.add_delete_message_job(message, delay=30) - else: - await message.reply_text("未查询到您所绑定的账号信息,请先绑定账号", reply_markup=InlineKeyboardMarkup(buttons)) - except CookiesNotFoundError: - buttons = [[InlineKeyboardButton("点我绑定账号", url=create_deep_linked_url(context.bot.username, "set_cookie"))]] - if filters.ChatType.GROUPS.filter(message): - reply_message = await message.reply_text( - "此功能需要绑定cookie后使用,请先私聊派蒙绑定账号", - reply_markup=InlineKeyboardMarkup(buttons), - parse_mode=ParseMode.HTML, - ) - self.add_delete_message_job(reply_message, delay=30) - self.add_delete_message_job(message, delay=30) - else: - await message.reply_text( - "此功能需要绑定cookie后使用,请先私聊派蒙进行绑定", - parse_mode=ParseMode.HTML, - reply_markup=InlineKeyboardMarkup(buttons), - ) - async def get_avatar_data(self, character: Character, client: "GenshinClient") -> Optional["AvatarData"]: detail = await self.character_details.get_character_details(client, character) if detail is None: @@ -191,43 +156,29 @@ class AvatarListPlugin(Plugin): @handler.command("avatars", block=False) @handler.message(filters.Regex(r"^(全部)?练度统计$"), block=False) - async def avatar_list(self, update: "Update", context: "ContextTypes.DEFAULT_TYPE"): + async def avatar_list(self, update: "Update", _: "ContextTypes.DEFAULT_TYPE"): user = update.effective_user message = update.effective_message all_avatars = "全部" in message.text or "all" in message.text # 是否发送全部角色 logger.info("用户 %s[%s] [bold]练度统计[/bold]: all=%s", user.full_name, user.id, all_avatars, extra={"markup": True}) - - client = await self.get_user_client(update, context) - if not client: - return - - notice = await message.reply_text("派蒙需要收集整理数据,还请耐心等待哦~") - await message.reply_chat_action(ChatAction.TYPING) - + notice = None try: - characters = await client.get_genshin_characters(client.player_id) - avatar_datas: List[AvatarData] = await self.get_avatars_data( - characters, client, None if all_avatars else 20 - ) - except InvalidCookies as exc: - await notice.delete() - await client.get_genshin_user(client.player_id) - logger.warning("用户 %s[%s] 无法请求角色数数据 API返回信息为 [%s]%s", user.full_name, user.id, exc.ret_code, exc.original) - reply_message = await message.reply_text("出错了呜呜呜 ~ 当前访问令牌无法请求角色数数据,请尝试重新获取Cookie。") - if filters.ChatType.GROUPS.filter(message): - self.add_delete_message_job(reply_message, delay=30) - self.add_delete_message_job(message, delay=30) - return + async with self.helper.genshin(user.id) as client: + notice = await message.reply_text("派蒙需要收集整理数据,还请耐心等待哦~") + await message.reply_chat_action(ChatAction.TYPING) + characters = await client.get_genshin_characters(client.player_id) + avatar_datas: List[AvatarData] = await self.get_avatars_data( + characters, client, None if all_avatars else 20 + ) except SimnetBadRequest as e: - await notice.delete() + if notice: + await notice.delete() if e.ret_code == -502002: reply_message = await message.reply_html("请先在米游社中使用一次养成计算器后再使用此功能~") self.add_delete_message_job(reply_message, delay=20) return raise e - finally: - await client.shutdown() name_card, avatar, nickname, rarity = await self.get_final_data(client.player_id, user) diff --git a/plugins/genshin/daily_note.py b/plugins/genshin/daily_note.py index 5bfe576..f88ba74 100644 --- a/plugins/genshin/daily_note.py +++ b/plugins/genshin/daily_note.py @@ -3,15 +3,13 @@ from datetime import datetime from typing import Optional, TYPE_CHECKING from simnet.errors import DataNotPublic -from telegram import InlineKeyboardButton, InlineKeyboardMarkup from telegram.constants import ChatAction from telegram.ext import ConversationHandler, filters -from telegram.helpers import create_deep_linked_url from core.plugin import Plugin, handler from core.services.template.models import RenderResult from core.services.template.services import TemplateService -from plugins.tools.genshin import PlayerNotFoundError, CookiesNotFoundError, GenshinHelper +from plugins.tools.genshin import GenshinHelper from utils.log import logger if TYPE_CHECKING: @@ -105,23 +103,6 @@ class DailyNotePlugin(Plugin): # 获取当前用户的 genshin.Client async with self.helper.genshin(user.id) as client: render_result = await self._get_daily_note(client) - except (CookiesNotFoundError, PlayerNotFoundError): - buttons = [ - [ - InlineKeyboardButton( - "点我绑定账号", url=create_deep_linked_url(self.application.bot.username, "set_cookie") - ) - ] - ] - if filters.ChatType.GROUPS.filter(message): - reply_message = await message.reply_text( - "未查询到您所绑定的账号信息,请先私聊派蒙绑定账号", reply_markup=InlineKeyboardMarkup(buttons) - ) - self.add_delete_message_job(reply_message, delay=30) - self.add_delete_message_job(message, delay=30) - else: - await message.reply_text("未查询到您所绑定的账号信息,请先绑定账号", reply_markup=InlineKeyboardMarkup(buttons)) - return except DataNotPublic: reply_message = await message.reply_text("查询失败惹,可能是便签功能被禁用了?请尝试通过米游社或者 hoyolab 获取一次便签信息后重试。") if filters.ChatType.GROUPS.filter(message): diff --git a/plugins/genshin/ledger.py b/plugins/genshin/ledger.py index 2baa948..fda6b2b 100644 --- a/plugins/genshin/ledger.py +++ b/plugins/genshin/ledger.py @@ -3,17 +3,15 @@ import re from datetime import datetime, timedelta from typing import TYPE_CHECKING -from simnet.errors import DataNotPublic, BadRequest as SimnetBadRequest, InvalidCookies -from telegram import InlineKeyboardButton, InlineKeyboardMarkup +from simnet.errors import DataNotPublic, BadRequest as SimnetBadRequest from telegram.constants import ChatAction from telegram.ext import filters -from telegram.helpers import create_deep_linked_url from core.plugin import Plugin, handler from core.services.cookies import CookiesService from core.services.template.models import RenderResult from core.services.template.services import TemplateService -from plugins.tools.genshin import PlayerNotFoundError, CookiesNotFoundError, GenshinHelper +from plugins.tools.genshin import GenshinHelper from utils.log import logger if TYPE_CHECKING: @@ -113,35 +111,7 @@ class LedgerPlugin(Plugin): await message.reply_chat_action(ChatAction.TYPING) try: async with self.helper.genshin(user.id) as client: - try: - render_result = await self._start_get_ledger(client, month) - except InvalidCookies as exc: # 如果抛出InvalidCookies 判断是否真的玄学过期(或权限不足?) - await client.get_genshin_user(client.player_id) - logger.warning( - "用户 %s[%s] 无法请求旅行札记数据 API返回信息为 [%s]%s", user.full_name, user.id, exc.ret_code, exc.original - ) - reply_message = await message.reply_text("出错了呜呜呜 ~ 当前访问令牌无法请求角色数数据,请尝试重新获取Cookie。") - if filters.ChatType.GROUPS.filter(message): - self.add_delete_message_job(reply_message, delay=30) - self.add_delete_message_job(message, delay=30) - return - except (PlayerNotFoundError, CookiesNotFoundError): - buttons = [ - [ - InlineKeyboardButton( - "点我绑定账号", url=create_deep_linked_url(self.application.bot.username, "set_cookie") - ) - ] - ] - if filters.ChatType.GROUPS.filter(message): - reply_message = await message.reply_text( - "未查询到您所绑定的账号信息,请先私聊派蒙绑定账号", reply_markup=InlineKeyboardMarkup(buttons) - ) - self.add_delete_message_job(reply_message, delay=30) - self.add_delete_message_job(message, delay=30) - else: - await message.reply_text("未查询到您所绑定的账号信息,请先绑定账号", reply_markup=InlineKeyboardMarkup(buttons)) - return + render_result = await self._start_get_ledger(client, month) except DataNotPublic: reply_message = await message.reply_text("查询失败惹,可能是旅行札记功能被禁用了?请先通过米游社或者 hoyolab 获取一次旅行札记后重试。") if filters.ChatType.GROUPS.filter(message): diff --git a/plugins/genshin/pay_log.py b/plugins/genshin/pay_log.py index 2d3569e..9bb91b0 100644 --- a/plugins/genshin/pay_log.py +++ b/plugins/genshin/pay_log.py @@ -236,14 +236,3 @@ class PayLogPlugin(Plugin.Conversation): [InlineKeyboardButton("点我导入", url=create_deep_linked_url(context.bot.username, "pay_log_import"))] ] await message.reply_text("派蒙没有找到你的充值记录,快来点击按钮私聊派蒙导入吧~", reply_markup=InlineKeyboardMarkup(buttons)) - except PlayerNotFoundError: - logger.info("未查询到用户 %s[%s] 所绑定的账号信息", user.full_name, user.id) - buttons = [[InlineKeyboardButton("点我绑定账号", url=create_deep_linked_url(context.bot.username, "set_uid"))]] - if filters.ChatType.GROUPS.filter(message): - reply_message = await message.reply_text( - "未查询到您所绑定的账号信息,请先私聊派蒙绑定账号", reply_markup=InlineKeyboardMarkup(buttons) - ) - self.add_delete_message_job(reply_message, delay=30) - self.add_delete_message_job(message, delay=30) - else: - await message.reply_text("未查询到您所绑定的账号信息,请先绑定账号", reply_markup=InlineKeyboardMarkup(buttons)) diff --git a/plugins/genshin/reg_time.py b/plugins/genshin/reg_time.py index 0c5b6b4..c5a62dc 100644 --- a/plugins/genshin/reg_time.py +++ b/plugins/genshin/reg_time.py @@ -2,7 +2,7 @@ from datetime import datetime from typing import TYPE_CHECKING from simnet.client.routes import InternationalRoute -from simnet.errors import InvalidCookies, BadRequest as SIMNetBadRequest +from simnet.errors import BadRequest as SIMNetBadRequest from simnet.utils.player import recognize_genshin_server, recognize_genshin_game_biz from telegram import InlineKeyboardButton, InlineKeyboardMarkup from telegram.constants import ParseMode @@ -97,15 +97,6 @@ class RegTimePlugin(Plugin): parse_mode=ParseMode.HTML, reply_markup=InlineKeyboardMarkup(buttons), ) - except InvalidCookies as exc: - async with self.helper.genshin(user.id) as client: - await client.get_genshin_user(client.player_id) - logger.warning("用户 %s[%s] 无法请求注册时间 API返回信息为 [%s]%s", user.full_name, user.id, exc.ret_code, exc.original) - reply_message = await message.reply_text("出错了呜呜呜 ~ 当前访问令牌无法请求角色数数据,") - if filters.ChatType.GROUPS.filter(message): - self.add_delete_message_job(reply_message, delay=30) - self.add_delete_message_job(message, delay=30) - return except SIMNetBadRequest as exc: if exc.ret_code == -501101: await message.reply_text("当前角色冒险等阶未达到10级,暂时无法获取信息") diff --git a/plugins/genshin/sign.py b/plugins/genshin/sign.py index 024ec1a..f8d2575 100644 --- a/plugins/genshin/sign.py +++ b/plugins/genshin/sign.py @@ -1,6 +1,6 @@ from typing import Optional, Tuple -from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup +from telegram import Update from telegram.constants import ChatAction from telegram.ext import CommandHandler, CallbackContext from telegram.ext import MessageHandler, filters @@ -14,7 +14,7 @@ from core.services.players import PlayersService from core.services.task.models import Task as SignUser, TaskStatusEnum from core.services.task.services import SignServices from core.services.users.services import UserAdminService -from plugins.tools.genshin import PlayerNotFoundError, CookiesNotFoundError, GenshinHelper +from plugins.tools.genshin import GenshinHelper from plugins.tools.sign import SignSystem, NeedChallenge from utils.log import logger @@ -112,17 +112,6 @@ class Sign(Plugin): reply_message = await message.reply_text(sign_text, allow_sending_without_reply=True) if filters.ChatType.GROUPS.filter(reply_message): self.add_delete_message_job(reply_message) - except (PlayerNotFoundError, CookiesNotFoundError): - buttons = [[InlineKeyboardButton("点我绑定账号", url=create_deep_linked_url(context.bot.username, "set_cookie"))]] - if filters.ChatType.GROUPS.filter(message): - reply_message = await message.reply_text( - "未查询到您所绑定的账号信息,请先私聊派蒙绑定账号", reply_markup=InlineKeyboardMarkup(buttons) - ) - self.add_delete_message_job(reply_message, delay=30) - - self.add_delete_message_job(message, delay=30) - else: - await message.reply_text("未查询到您所绑定的账号信息,请先绑定账号", reply_markup=InlineKeyboardMarkup(buttons)) except NeedChallenge as exc: button = await self.sign_system.get_challenge_button( context.bot.username, diff --git a/plugins/genshin/stats.py b/plugins/genshin/stats.py index 519cd3c..c5f4c8a 100644 --- a/plugins/genshin/stats.py +++ b/plugins/genshin/stats.py @@ -2,16 +2,14 @@ import random from typing import Optional, TYPE_CHECKING from simnet.errors import BadRequest as SimnetBadRequest -from telegram import InlineKeyboardButton, InlineKeyboardMarkup from telegram.constants import ChatAction from telegram.ext import filters -from telegram.helpers import create_deep_linked_url from core.plugin import Plugin, handler from core.services.cookies.error import TooManyRequestPublicCookies from core.services.template.models import RenderResult from core.services.template.services import TemplateService -from plugins.tools.genshin import PlayerNotFoundError, CookiesNotFoundError, GenshinHelper +from plugins.tools.genshin import CookiesNotFoundError, GenshinHelper from utils.log import logger if TYPE_CHECKING: @@ -52,17 +50,6 @@ class PlayerStatsPlugins(Plugin): except CookiesNotFoundError: async with self.helper.public_genshin(user.id) as client: render_result = await self.render(client, uid) - except PlayerNotFoundError: - buttons = [[InlineKeyboardButton("点我绑定账号", url=create_deep_linked_url(context.bot.username, "set_cookie"))]] - if filters.ChatType.GROUPS.filter(message): - reply_message = await message.reply_text( - "未查询到您所绑定的账号信息,请先私聊派蒙绑定账号", reply_markup=InlineKeyboardMarkup(buttons) - ) - self.add_delete_message_job(reply_message, delay=30) - self.add_delete_message_job(message, delay=30) - else: - await message.reply_text("未查询到您所绑定的账号信息,请先绑定账号", reply_markup=InlineKeyboardMarkup(buttons)) - return except SimnetBadRequest as exc: if exc.ret_code == 1034 and uid: await message.reply_text("出错了呜呜呜 ~ 请稍后重试") diff --git a/plugins/genshin/wish_log.py b/plugins/genshin/wish_log.py index 56050d8..0b5b673 100644 --- a/plugins/genshin/wish_log.py +++ b/plugins/genshin/wish_log.py @@ -352,17 +352,6 @@ class WishLogPlugin(Plugin.Conversation): [InlineKeyboardButton("点我导入", url=create_deep_linked_url(context.bot.username, "gacha_log_import"))] ] await message.reply_text("派蒙没有找到你的抽卡记录,快来点击按钮私聊派蒙导入吧~", reply_markup=InlineKeyboardMarkup(buttons)) - except PlayerNotFoundError: - logger.info("未查询到用户 %s[%s] 所绑定的账号信息", user.full_name, user.id) - buttons = [[InlineKeyboardButton("点我绑定账号", url=create_deep_linked_url(context.bot.username, "set_uid"))]] - if filters.ChatType.GROUPS.filter(message): - reply_message = await message.reply_text( - "未查询到您所绑定的账号信息,请先私聊派蒙绑定账号", reply_markup=InlineKeyboardMarkup(buttons) - ) - self.add_delete_message_job(reply_message, delay=30) - self.add_delete_message_job(message, delay=30) - else: - await message.reply_text("未查询到您所绑定的账号信息,请先绑定账号", reply_markup=InlineKeyboardMarkup(buttons)) @handler(CommandHandler, command="gacha_count", block=False) @handler(MessageHandler, filters=filters.Regex("^抽卡统计?(武器|角色|常驻|仅五星|)$"), block=False) @@ -417,15 +406,3 @@ class WishLogPlugin(Plugin.Conversation): [InlineKeyboardButton("点我导入", url=create_deep_linked_url(context.bot.username, "gacha_log_import"))] ] await message.reply_text("派蒙没有找到你的抽卡记录,快来私聊派蒙导入吧~", reply_markup=InlineKeyboardMarkup(buttons)) - except PlayerNotFoundError: - logger.info("未查询到用户 %s[%s] 所绑定的账号信息", user.full_name, user.id) - buttons = [[InlineKeyboardButton("点我绑定账号", url=create_deep_linked_url(context.bot.username, "set_uid"))]] - if filters.ChatType.GROUPS.filter(message): - reply_message = await message.reply_text( - "未查询到您所绑定的账号信息,请先私聊派蒙绑定账号", reply_markup=InlineKeyboardMarkup(buttons) - ) - self.add_delete_message_job(reply_message, delay=30) - - self.add_delete_message_job(message, delay=30) - else: - await message.reply_text("未查询到您所绑定的账号信息,请先绑定账号", reply_markup=InlineKeyboardMarkup(buttons)) diff --git a/plugins/system/errorhandler.py b/plugins/system/errorhandler.py index 5010f0a..689f1a9 100644 --- a/plugins/system/errorhandler.py +++ b/plugins/system/errorhandler.py @@ -23,6 +23,7 @@ from telegram.helpers import create_deep_linked_url from core.config import config from core.plugin import Plugin, error_handler +from gram_core.services.players.error import PlayerNotFoundError from modules.apihelper.error import APIHelperException, APIHelperTimedOut, ResponseException, ReturnCodeError from modules.errorpush import ( PbClient, @@ -30,6 +31,7 @@ from modules.errorpush import ( SentryClient, SentryClientException, ) +from plugins.tools.genshin import CookiesNotFoundError, PlayerNotFoundError as GenshinPlayerNotFoundError from utils.log import logger from utils.patch.aiohttp import AioHttpTimeoutException @@ -77,6 +79,16 @@ class ErrorHandler(Plugin): ] ] ) + elif "绑定账号" in content: + buttons = InlineKeyboardMarkup( + [ + [ + InlineKeyboardButton( + "点我绑定账号", url=create_deep_linked_url(self.application.bot.username, "set_cookie") + ) + ] + ] + ) else: buttons = ReplyKeyboardRemove() @@ -237,6 +249,16 @@ class ErrorHandler(Plugin): self.create_notice_task(update, context, notice) raise ApplicationHandlerStop + @error_handler() + async def process_player_and_cookie_not_found(self, update: object, context: CallbackContext): + if not isinstance( + context.error, (CookiesNotFoundError, PlayerNotFoundError, GenshinPlayerNotFoundError) + ) or not isinstance(update, Update): + return + notice = "未查询到您所绑定的账号信息,请先私聊派蒙绑定账号" + self.create_notice_task(update, context, notice) + raise ApplicationHandlerStop + @error_handler(block=False) async def process_z_error(self, update: object, context: CallbackContext) -> None: # 必须 `process_` 加上 `z` 保证该函数最后一个注册 diff --git a/plugins/tools/genshin.py b/plugins/tools/genshin.py index a3bee7c..0fc671b 100644 --- a/plugins/tools/genshin.py +++ b/plugins/tools/genshin.py @@ -254,10 +254,12 @@ class GenshinHelper(Plugin): stoken = client.cookies.get("stoken") if stoken is not None: try: - cookie_model.data["cookie_token"] = await client.get_cookie_token_by_stoken() + new_cookies = cookie_model.data.copy() + new_cookies["cookie_token"] = await client.get_cookie_token_by_stoken() logger.success("用户 %s 刷新 cookie_token 成功", user_id) - cookie_model.data["ltoken"] = await client.get_ltoken_by_stoken() + new_cookies["ltoken"] = await client.get_ltoken_by_stoken() logger.success("用户 %s 刷新 ltoken 成功", user_id) + cookie_model.data = new_cookies await self.cookies_service.update(cookie_model) except SimnetBadRequest as _exc: logger.warning(