diff --git a/gsuid_core/utils/download_resource/download_core.py b/gsuid_core/utils/download_resource/download_core.py index a2432e2..81837aa 100644 --- a/gsuid_core/utils/download_resource/download_core.py +++ b/gsuid_core/utils/download_resource/download_core.py @@ -42,7 +42,7 @@ async def find_fastest_url(urls: Dict[str, str]): fastest_time = float('inf') for result in results: - if isinstance(result, Exception): + if isinstance(result, (Exception, BaseException)): continue tag, url, elapsed_time = result if elapsed_time < fastest_time: diff --git a/gsuid_core/utils/image/image_tools.py b/gsuid_core/utils/image/image_tools.py index 82243fa..1f56577 100644 --- a/gsuid_core/utils/image/image_tools.py +++ b/gsuid_core/utils/image/image_tools.py @@ -8,12 +8,34 @@ import httpx from httpx import get from PIL import Image, ImageDraw, ImageFont +from gsuid_core.models import Event +from gsuid_core.utils.image.utils import sget from gsuid_core.data_store import get_res_path TEXT_PATH = Path(__file__).parent / 'texture2d' BG_PATH = Path(__file__).parents[1] / 'default_bg' +async def get_event_avatar(ev: Event) -> Image.Image: + if 'avatar' in ev.sender and ev.sender['avatar']: + avatar_url = ev.sender['avatar'] + content = (await sget(avatar_url)).content + return Image.open(BytesIO(content)).convert('RGBA') + else: + img = Image.open(TEXT_PATH / 'icon.jpg').convert('RGBA') + return img + + +async def get_avatar_with_ring( + ev: Event, + size: int = 300, + bg_color: Tuple[int, int, int] | None = None, + is_ring: bool = True, +) -> Image.Image: + avatar = await get_event_avatar(ev) + return await draw_pic_with_ring(avatar, size, bg_color, is_ring) + + async def shift_image_hue(img: Image.Image, angle: float = 30) -> Image.Image: alpha = img.getchannel('A') img = img.convert('HSV') @@ -195,7 +217,9 @@ async def get_qq_avatar( avatar_url = f'http://q1.qlogo.cn/g?b=qq&nk={qid}&s=640' elif avatar_url is None: avatar_url = 'https://q1.qlogo.cn/g?b=qq&nk=3399214199&s=640' - char_pic = Image.open(BytesIO(get(avatar_url).content)).convert('RGBA') + char_pic = Image.open(BytesIO((await sget(avatar_url)).content)).convert( + 'RGBA' + ) return char_pic diff --git a/gsuid_core/utils/image/texture2d/icon.jpg b/gsuid_core/utils/image/texture2d/icon.jpg new file mode 100644 index 0000000..17453c9 Binary files /dev/null and b/gsuid_core/utils/image/texture2d/icon.jpg differ diff --git a/gsuid_core/utils/image/utils.py b/gsuid_core/utils/image/utils.py new file mode 100644 index 0000000..1b0417e --- /dev/null +++ b/gsuid_core/utils/image/utils.py @@ -0,0 +1,7 @@ +import httpx + + +async def sget(url: str): + async with httpx.AsyncClient(timeout=None) as client: + resp = await client.get(url=url) + return resp