🎨 Refactor download_icon for improved readability and efficiency

This commit is contained in:
luoshuijs 2023-08-21 17:17:15 +08:00 committed by GitHub
parent 7d9ddfc0e8
commit eb3752923e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -8,16 +8,16 @@ from functools import partial
from multiprocessing import Value from multiprocessing import Value
from pathlib import Path from pathlib import Path
from ssl import SSLZeroReturnError from ssl import SSLZeroReturnError
from time import time as time_
from typing import Any, Dict, Iterable, Iterator, List, Literal, Optional, Tuple, TYPE_CHECKING from typing import Any, Dict, Iterable, Iterator, List, Literal, Optional, Tuple, TYPE_CHECKING
from aiofiles import open as async_open from aiofiles import open as async_open
from arkowrapper import ArkoWrapper from arkowrapper import ArkoWrapper
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from httpx import AsyncClient, HTTPError from httpx import AsyncClient, HTTPError, TimeoutException
from pydantic import BaseModel from pydantic import BaseModel
from simnet.errors import InvalidCookies, BadRequest as SimnetBadRequest from simnet.errors import InvalidCookies, BadRequest as SimnetBadRequest
from simnet.models.genshin.chronicle.characters import Character from simnet.models.genshin.chronicle.characters import Character
from telegram import Message, User
from telegram.constants import ChatAction, ParseMode from telegram.constants import ChatAction, ParseMode
from telegram.error import RetryAfter, TimedOut from telegram.error import RetryAfter, TimedOut
@ -39,6 +39,7 @@ if TYPE_CHECKING:
from telegram import Update from telegram import Update
from telegram.ext import ContextTypes from telegram.ext import ContextTypes
from simnet import GenshinClient from simnet import GenshinClient
from telegram import Message, User
INTERVAL = 1 INTERVAL = 1
@ -144,7 +145,7 @@ class DailyMaterial(Plugin):
talents = [t for t in detail.talents if t.type in ["attack", "skill", "burst"]] talents = [t for t in detail.talents if t.type in ["attack", "skill", "burst"]]
return [t.level for t in talents] return [t.level for t in talents]
async def _get_data_from_user(self, user: User) -> Tuple[Optional["GenshinClient"], Dict[str, List[Any]]]: async def _get_data_from_user(self, user: "User") -> Tuple[Optional["GenshinClient"], Dict[str, List[Any]]]:
"""获取已经绑定的账号的角色、武器信息""" """获取已经绑定的账号的角色、武器信息"""
user_data = {"avatar": [], "weapon": []} user_data = {"avatar": [], "weapon": []}
try: try:
@ -431,14 +432,10 @@ class DailyMaterial(Plugin):
# noinspection PyTypeChecker # noinspection PyTypeChecker
return result return result
async def _download_icon(self, message: Optional[Message] = None) -> float: async def _download_icon(self, message: "Message") -> float:
"""下载素材图标""" """下载素材图标"""
asset_list = [] asset_list = []
from time import time as time_
lock = asyncio.Lock() lock = asyncio.Lock()
the_time = Value(c_double, time_() - INTERVAL) the_time = Value(c_double, time_() - INTERVAL)
async def edit_message(text): async def edit_message(text):
@ -454,17 +451,25 @@ class DailyMaterial(Plugin):
pass pass
async def task(item_id, name, item_type): async def task(item_id, name, item_type):
logger.debug("正在开始下载 %s 的图标素材", name) try:
await edit_message(f"正在搬运 <b>{name}</b> 的图标素材。。。") logger.debug("正在开始下载 %s 的图标素材", name)
asset: AssetsServiceType = getattr(self.assets_service, item_type)(item_id) # 获取素材对象 await edit_message(f"正在搬运 <b>{name}</b> 的图标素材。。。")
asset_list.append(asset.honey_id) asset: AssetsServiceType = getattr(self.assets_service, item_type)(item_id)
# 找到该素材对象的所有图标类型 asset_list.append(asset.honey_id)
# 并根据图标类型找到下载对应图标的函数 # 找到该素材对象的所有图标类型
for icon_type in asset.icon_types: # 并根据图标类型找到下载对应图标的函数
await getattr(asset, icon_type)(True) # 执行下载函数 for icon_type in asset.icon_types:
logger.debug("%s 的图标素材下载成功", name) await getattr(asset, icon_type)(True) # 执行下载函数
await edit_message(f"正在搬运 <b>{name}</b> 的图标素材。。。<b>成功!</b>") logger.debug("%s 的图标素材下载成功", name)
await edit_message(f"正在搬运 <b>{name}</b> 的图标素材。。。<b>成功!</b>")
except TimeoutException as exc:
logger.warning("Httpx [%s]\n%s[%s]", exc.__class__.__name__, exc.request.method, exc.request.url)
return exc
except Exception as exc:
logger.error("图标素材下载出现异常!", exc_info=exc)
return exc
notice_text = "图标素材下载完成"
for TYPE, ITEMS in HONEY_DATA.items(): # 遍历每个对象 for TYPE, ITEMS in HONEY_DATA.items(): # 遍历每个对象
task_list = [] task_list = []
new_items = [] new_items = []
@ -472,16 +477,18 @@ class DailyMaterial(Plugin):
if (ITEM := [ID, DATA[1], TYPE]) not in new_items: if (ITEM := [ID, DATA[1], TYPE]) not in new_items:
new_items.append(ITEM) new_items.append(ITEM)
task_list.append(task(*ITEM)) task_list.append(task(*ITEM))
await asyncio.gather(*task_list) # 等待所有任务执行完成 results = await asyncio.gather(*task_list, return_exceptions=True) # 等待所有任务执行完成
for result in results:
if isinstance(result, TimeoutException):
notice_text = f"{result.__class__.__name__} 图标素材下载过程中请求超时.\n有关详细信息,请查看日志"
elif isinstance(result, Exception):
notice_text = f"{result.__class__.__name__} 图标素材下载过程中发生异常.\n有关详细信息,请查看日志"
break
try: try:
await message.edit_text( await message.edit_text(notice_text)
"\n".join(message.text_html.split("\n")[:2] + ["图标素材下载完成!"]), parse_mode=ParseMode.HTML
)
except RetryAfter as e: except RetryAfter as e:
await asyncio.sleep(e.retry_after) await asyncio.sleep(e.retry_after + 0.1)
await message.edit_text( await message.edit_text(notice_text)
"\n".join(message.text_html.split("\n")[:2] + ["图标素材下载完成!"]), parse_mode=ParseMode.HTML
)
except Exception as e: except Exception as e:
logger.debug(e) logger.debug(e)