支持版本深渊4.3, 头像获取不到时使用随机角色

This commit is contained in:
KimigaiiWuyi 2023-12-03 19:37:53 +08:00
parent 36d4d27458
commit d5fec5b5a9
11 changed files with 60 additions and 77 deletions

View File

@ -33,7 +33,6 @@ async def send_cp_info(bot: Bot, ev: Event):
@sv_sj.on_command(('查询收集', 'sj'), block=True) @sv_sj.on_command(('查询收集', 'sj'), block=True)
async def send_collection_info(bot: Bot, ev: Event): async def send_collection_info(bot: Bot, ev: Event):
await bot.logger.info('开始执行[查询收集信息]') await bot.logger.info('开始执行[查询收集信息]')
user_id = ev.at if ev.at else ev.user_id
# 获取uid # 获取uid
uid = await get_uid(bot, ev) uid = await get_uid(bot, ev)
@ -41,7 +40,7 @@ async def send_collection_info(bot: Bot, ev: Event):
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
await bot.logger.info('[查询角色面板]uid: {}'.format(uid)) await bot.logger.info('[查询角色面板]uid: {}'.format(uid))
im = await draw_collection_img(user_id, uid) im = await draw_collection_img(ev, uid)
a = Button('🔍查询探索', '查询探索') a = Button('🔍查询探索', '查询探索')
b = Button('🔍查询收集', '查询收集') b = Button('🔍查询收集', '查询收集')
await bot.send_option(im, [a, b]) await bot.send_option(im, [a, b])
@ -50,7 +49,6 @@ async def send_collection_info(bot: Bot, ev: Event):
@sv_ts.on_command(('查询探索', 'ts'), block=True) @sv_ts.on_command(('查询探索', 'ts'), block=True)
async def send_explora_info(bot: Bot, ev: Event): async def send_explora_info(bot: Bot, ev: Event):
await bot.logger.info('开始执行[查询探索信息]') await bot.logger.info('开始执行[查询探索信息]')
user_id = ev.at if ev.at else ev.user_id
# 获取uid # 获取uid
uid = await get_uid(bot, ev) uid = await get_uid(bot, ev)
@ -58,7 +56,7 @@ async def send_explora_info(bot: Bot, ev: Event):
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
await bot.logger.info('[查询角色面板]uid: {}'.format(uid)) await bot.logger.info('[查询角色面板]uid: {}'.format(uid))
im = await draw_explora_img(user_id, uid) im = await draw_explora_img(ev, uid)
a = Button('🔍查询探索', '查询探索') a = Button('🔍查询探索', '查询探索')
b = Button('🔍查询收集', '查询收集') b = Button('🔍查询收集', '查询收集')
await bot.send_option(im, [a, b]) await bot.send_option(im, [a, b])

View File

@ -2,6 +2,7 @@ from pathlib import Path
from typing import Dict, Tuple, Union, Literal from typing import Dict, Tuple, Union, Literal
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
from gsuid_core.models import Event
from gsuid_core.utils.api.mys.models import IndexData from gsuid_core.utils.api.mys.models import IndexData
from gsuid_core.utils.error_reply import get_error_img from gsuid_core.utils.error_reply import get_error_img
@ -9,12 +10,7 @@ from ..utils.mys_api import mys_api
from ..utils.image.convert import convert_img from ..utils.image.convert import convert_img
from ..utils.map.GS_MAP_PATH import avatarId2Name from ..utils.map.GS_MAP_PATH import avatarId2Name
from ..utils.fonts.genshin_fonts import gs_font_30, gs_font_40 from ..utils.fonts.genshin_fonts import gs_font_30, gs_font_40
from ..utils.image.image_tools import ( from ..utils.image.image_tools import draw_bar, get_avatar, get_color_bg
draw_bar,
get_color_bg,
get_qq_avatar,
draw_pic_with_ring,
)
TEXT_PATH = Path(__file__).parent / 'texture2D' TEXT_PATH = Path(__file__).parent / 'texture2D'
@ -55,16 +51,12 @@ expmax_data = {
} }
async def draw_collection_img( async def draw_collection_img(ev: Event, uid: str) -> Union[str, bytes]:
qid: Union[str, int], uid: str return await draw_base_img(ev, uid, '收集')
) -> Union[str, bytes]:
return await draw_base_img(qid, uid, '收集')
async def draw_explora_img( async def draw_explora_img(ev: Event, uid: str) -> Union[str, bytes]:
qid: Union[str, int], uid: str return await draw_base_img(ev, uid, '探索')
) -> Union[str, bytes]:
return await draw_base_img(qid, uid, '探索')
async def get_base_data(uid: str) -> Union[bytes, str, IndexData]: async def get_base_data(uid: str) -> Union[bytes, str, IndexData]:
@ -165,7 +157,7 @@ async def get_collection_data(
async def draw_base_img( async def draw_base_img(
qid: Union[str, int], uid: str, mode: Literal['探索', '收集'] = '收集' ev: Event, uid: str, mode: Literal['探索', '收集'] = '收集'
) -> Union[str, bytes]: ) -> Union[str, bytes]:
# 获取数据 # 获取数据
if mode == '收集': if mode == '收集':
@ -179,12 +171,7 @@ async def draw_base_img(
percent_data, value_data = data[0], data[1] percent_data, value_data = data[0], data[1]
# 获取背景图片各项参数 # 获取背景图片各项参数
_id = str(qid) char_pic = await get_avatar(ev, 264)
if _id.startswith('http'):
char_pic = await get_qq_avatar(avatar_url=_id)
else:
char_pic = await get_qq_avatar(qid=qid)
char_pic = await draw_pic_with_ring(char_pic, 264)
if mode == '收集': if mode == '收集':
title = Image.open(TEXT_PATH / 'collection_title.png') title = Image.open(TEXT_PATH / 'collection_title.png')

View File

@ -51,7 +51,7 @@ async def sned_rank_pic(bot: Bot, ev: Event):
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
logger.info(f'[排名列表]uid: {uid}') logger.info(f'[排名列表]uid: {uid}')
im = await draw_rank_img(ev.user_id, uid) im = await draw_rank_img(ev, uid)
await bot.send_option( await bot.send_option(
im, im,
[ [
@ -127,7 +127,7 @@ async def sned_aritifacts_list(bot: Bot, ev: Event):
else: else:
num = 1 num = 1
im = await draw_lib(ev.user_id, uid, num) im = await draw_lib(ev, uid, num)
await bot.send_option( await bot.send_option(
im, im,
[ [
@ -312,12 +312,11 @@ async def send_card_info(bot: Bot, ev: Event):
await bot.send(im) await bot.send(im)
@sv_get_enka.on_command('毕业度统计') @sv_get_enka.on_command(('毕业度统计', '毕业都统计'))
async def send_charcard_list(bot: Bot, ev: Event): async def send_charcard_list(bot: Bot, ev: Event):
uid = await get_uid(bot, ev) uid = await get_uid(bot, ev)
user_id = ev.at if ev.at else ev.user_id
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
im = await draw_cahrcard_list(str(uid), user_id) im = await draw_cahrcard_list(str(uid), ev)
await bot.logger.info(f'UID{uid}获取角色数据成功!') await bot.logger.info(f'UID{uid}获取角色数据成功!')
await bot.send(im) await bot.send(im)

View File

@ -4,13 +4,14 @@ from typing import Dict, Union, Optional
import aiofiles import aiofiles
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
from gsuid_core.models import Event
from .etc.etc import TEXT_PATH from .etc.etc import TEXT_PATH
from .start import refresh_player_list from .start import refresh_player_list
from ..utils.image.convert import convert_img from ..utils.image.convert import convert_img
from ..utils.image.image_tools import get_avatar
from .draw_normal import _get_single_artifact_img from .draw_normal import _get_single_artifact_img
from ..utils.resource.RESOURCE_PATH import PLAYER_PATH from ..utils.resource.RESOURCE_PATH import PLAYER_PATH
from ..utils.image.image_tools import get_qq_avatar, draw_pic_with_ring
from ..utils.fonts.genshin_fonts import gs_font_25, gs_font_36, gs_font_38 from ..utils.fonts.genshin_fonts import gs_font_25, gs_font_36, gs_font_38
@ -36,7 +37,7 @@ async def get_artifacts_lib_data(uid: str) -> Optional[Dict]:
return data return data
async def draw_lib(user_id: str, uid: str, num: int) -> Union[bytes, str]: async def draw_lib(ev: Event, uid: str, num: int) -> Union[bytes, str]:
data = await get_artifacts_lib_data(uid) data = await get_artifacts_lib_data(uid)
if data is None: if data is None:
return '你还没有圣遗物数据...请尝试使用[刷新圣遗物仓库]获取数据!' return '你还没有圣遗物数据...请尝试使用[刷新圣遗物仓库]获取数据!'
@ -80,8 +81,7 @@ async def draw_lib(user_id: str, uid: str, num: int) -> Union[bytes, str]:
return f'[UID{uid}] 圣遗物仓库没有 {num} 页!\n最多为 {all_page} 页!' return f'[UID{uid}] 圣遗物仓库没有 {num} 页!\n最多为 {all_page} 页!'
bg = Image.open(TEXT_PATH / 'artifacts_lib_bg.png') bg = Image.open(TEXT_PATH / 'artifacts_lib_bg.png')
avatar = await get_qq_avatar(user_id) avatar_img = await get_avatar(ev, 280)
avatar_img = await draw_pic_with_ring(avatar, 280)
bg.paste(avatar_img, (120, 88), avatar_img) bg.paste(avatar_img, (120, 88), avatar_img)

View File

@ -3,6 +3,7 @@ import asyncio
from typing import Tuple, Union, Literal from typing import Tuple, Union, Literal
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
from gsuid_core.models import Event
from .mono.Character import Character from .mono.Character import Character
from ..utils.image.convert import convert_img from ..utils.image.convert import convert_img
@ -12,8 +13,8 @@ from ..utils.map.name_covert import avatar_id_to_char_star
from ..utils.fonts.genshin_fonts import genshin_font_origin from ..utils.fonts.genshin_fonts import genshin_font_origin
from ..utils.resource.RESOURCE_PATH import CHAR_PATH, PLAYER_PATH, WEAPON_PATH from ..utils.resource.RESOURCE_PATH import CHAR_PATH, PLAYER_PATH, WEAPON_PATH
from ..utils.image.image_tools import ( from ..utils.image.image_tools import (
get_avatar,
get_color_bg, get_color_bg,
get_qq_avatar,
get_fetter_pic, get_fetter_pic,
get_talent_pic, get_talent_pic,
draw_pic_with_ring, draw_pic_with_ring,
@ -63,7 +64,8 @@ value_mask = Image.open(TEXT_PATH / 'value_mask.png')
async def draw_cahrcard_list( async def draw_cahrcard_list(
uid: str, qid: Union[str, int] uid: str,
ev: Event,
) -> Union[str, bytes]: ) -> Union[str, bytes]:
uid_fold = PLAYER_PATH / str(uid) uid_fold = PLAYER_PATH / str(uid)
char_file_list = uid_fold.glob('*') char_file_list = uid_fold.glob('*')
@ -114,12 +116,8 @@ async def draw_cahrcard_list(
# 排序 # 排序
char_done_list.sort(key=lambda x: (-x['percent'])) char_done_list.sort(key=lambda x: (-x['percent']))
qid = str(qid)
if qid.startswith('http'): char_pic = await get_avatar(ev, 320)
char_pic = await get_qq_avatar(avatar_url=qid)
else:
char_pic = await get_qq_avatar(qid=qid)
char_pic = await draw_pic_with_ring(char_pic, 320)
img = await get_color_bg(950, 540 + 100 * len(char_done_list)) img = await get_color_bg(950, 540 + 100 * len(char_done_list))
img.paste(char_rank_title, (0, 0), char_rank_title) img.paste(char_rank_title, (0, 0), char_rank_title)

View File

@ -1,15 +1,16 @@
from typing import Dict, Union from typing import Dict, Union
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
from gsuid_core.models import Event
from gsuid_core.utils.image.convert import convert_img from gsuid_core.utils.image.convert import convert_img
from gsuid_core.utils.image.image_tools import crop_center_img from gsuid_core.utils.image.image_tools import crop_center_img
from .etc.etc import TEXT_PATH from .etc.etc import TEXT_PATH
from ..utils.colors import get_color from ..utils.colors import get_color
from .get_akasha_data import _get_rank from .get_akasha_data import _get_rank
from ..utils.image.image_tools import get_avatar
from ..utils.map.name_covert import avatar_id_to_name from ..utils.map.name_covert import avatar_id_to_name
from .to_card import draw_char_card, draw_weapon_card from .to_card import draw_char_card, draw_weapon_card
from ..utils.image.image_tools import get_qq_avatar, draw_pic_with_ring
from ..utils.fonts.genshin_fonts import ( from ..utils.fonts.genshin_fonts import (
gs_font_15, gs_font_15,
gs_font_22, gs_font_22,
@ -25,13 +26,12 @@ TITLE_PATH = RANK_TEXT / 'title.png'
grey = (191, 191, 191) grey = (191, 191, 191)
async def draw_rank_img(user_id: str, uid: str) -> Union[bytes, str]: async def draw_rank_img(ev: Event, uid: str) -> Union[bytes, str]:
rank_data = await _get_rank(uid) rank_data = await _get_rank(uid)
if isinstance(rank_data, str): if isinstance(rank_data, str):
return rank_data return rank_data
user_avatar = await get_qq_avatar(user_id) user_pic = await get_avatar(ev, 314)
user_pic = await draw_pic_with_ring(user_avatar, 314)
title = Image.open(TITLE_PATH) title = Image.open(TITLE_PATH)
title_draw = ImageDraw.Draw(title) title_draw = ImageDraw.Draw(title)

View File

@ -42,10 +42,10 @@ async def send_import_gacha_info(bot: Bot, ev: Event):
@sv_gacha_log.on_fullmatch(('抽卡记录')) @sv_gacha_log.on_fullmatch(('抽卡记录'))
async def send_gacha_log_card_info(bot: Bot, ev: Event): async def send_gacha_log_card_info(bot: Bot, ev: Event):
await bot.logger.info('开始执行[抽卡记录]') await bot.logger.info('开始执行[抽卡记录]')
uid, user_id = await get_uid(bot, ev, True) uid = await get_uid(bot, ev)
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
im = await draw_gachalogs_img(uid, user_id) im = await draw_gachalogs_img(uid, ev)
a = Button('🔁刷新抽卡记录', '刷新抽卡记录') a = Button('🔁刷新抽卡记录', '刷新抽卡记录')
b = Button('🔜导出抽卡记录至提瓦特小助手', '导出抽卡记录到小助手') b = Button('🔜导出抽卡记录至提瓦特小助手', '导出抽卡记录到小助手')
c = Button('🔙从提瓦特小助手导入抽卡记录', '从小助手导入抽卡记录') c = Button('🔙从提瓦特小助手导入抽卡记录', '从小助手导入抽卡记录')

View File

@ -6,16 +6,13 @@ from pathlib import Path
from typing import List, Tuple, Union from typing import List, Tuple, Union
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
from gsuid_core.models import Event
from gsuid_core.logger import logger from gsuid_core.logger import logger
from ..utils.image.convert import convert_img from ..utils.image.convert import convert_img
from ..utils.map.name_covert import name_to_avatar_id from ..utils.map.name_covert import name_to_avatar_id
from ..utils.image.image_tools import get_avatar, get_color_bg
from ..utils.resource.RESOURCE_PATH import CHAR_PATH, PLAYER_PATH, WEAPON_PATH from ..utils.resource.RESOURCE_PATH import CHAR_PATH, PLAYER_PATH, WEAPON_PATH
from ..utils.image.image_tools import (
get_color_bg,
get_qq_avatar,
draw_pic_with_ring,
)
from ..utils.fonts.genshin_fonts import ( from ..utils.fonts.genshin_fonts import (
gs_font_24, gs_font_24,
gs_font_28, gs_font_28,
@ -132,7 +129,7 @@ def check_up(name: str, _time: str) -> bool:
return False return False
async def draw_gachalogs_img(uid: str, user_id: str) -> Union[bytes, str]: async def draw_gachalogs_img(uid: str, ev: Event) -> Union[bytes, str]:
path = PLAYER_PATH / str(uid) / 'gacha_logs.json' path = PLAYER_PATH / str(uid) / 'gacha_logs.json'
if not path.exists(): if not path.exists():
return '你还没有祈愿数据噢~\n请添加Stoken后使用命令`刷新抽卡记录`更新祈愿数据~' return '你还没有祈愿数据噢~\n请添加Stoken后使用命令`刷新抽卡记录`更新祈愿数据~'
@ -301,12 +298,7 @@ async def draw_gachalogs_img(uid: str, user_id: str) -> Union[bytes, str]:
weapon_y = (1 + ((total_data['武器祈愿']['total'] - 1) // 6)) * single_y weapon_y = (1 + ((total_data['武器祈愿']['total'] - 1) // 6)) * single_y
# 获取背景图片各项参数 # 获取背景图片各项参数
_id = str(user_id) char_pic = await get_avatar(ev, 320)
if _id.startswith('http'):
char_pic = await get_qq_avatar(avatar_url=_id)
else:
char_pic = await get_qq_avatar(qid=user_id)
char_pic = await draw_pic_with_ring(char_pic, 320)
avatar_title = Image.open(TEXT_PATH / 'avatar_title.png') avatar_title = Image.open(TEXT_PATH / 'avatar_title.png')
img = await get_color_bg(950, 530 + 900 + normal_y + char_y + weapon_y) img = await get_color_bg(950, 530 + 900 + normal_y + char_y + weapon_y)

View File

@ -34,5 +34,5 @@ async def send_deck_pic(bot: Bot, ev: Event):
deck_id = int(ev.text.strip()) deck_id = int(ev.text.strip())
else: else:
return bot.send('请输入正确的序号, 例如我的卡组1...') return bot.send('请输入正确的序号, 例如我的卡组1...')
im = await draw_deck_img(ev.user_id, uid, deck_id) im = await draw_deck_img(ev, uid, deck_id)
await bot.send_option(im, [Button('✅七圣数据总览', '七圣召唤')]) await bot.send_option(im, [Button('✅七圣数据总览', '七圣召唤')])

View File

@ -2,6 +2,7 @@ from pathlib import Path
from typing import Union from typing import Union
from PIL import Image, ImageDraw from PIL import Image, ImageDraw
from gsuid_core.models import Event
from gsuid_core.logger import logger from gsuid_core.logger import logger
from gsuid_core.utils.error_reply import get_error_img from gsuid_core.utils.error_reply import get_error_img
@ -11,17 +12,13 @@ from ..utils.resource.download_url import download
from ..utils.resource.RESOURCE_PATH import CARD_PATH from ..utils.resource.RESOURCE_PATH import CARD_PATH
from ..utils.colors import sec_color, first_color, light_color from ..utils.colors import sec_color, first_color, light_color
from ..utils.fonts.genshin_fonts import gs_font_20, gs_font_36 from ..utils.fonts.genshin_fonts import gs_font_20, gs_font_36
from ..utils.image.image_tools import ( from ..utils.image.image_tools import get_avatar, get_color_bg
get_color_bg,
get_qq_avatar,
draw_pic_with_ring,
)
TEXT_PATH = Path(__file__).parent / 'texture2d' TEXT_PATH = Path(__file__).parent / 'texture2d'
async def draw_deck_img( async def draw_deck_img(
user_id: str, uid: str, deck_id: int ev: Event, uid: str, deck_id: int
) -> Union[str, bytes]: ) -> Union[str, bytes]:
# 获取数据 # 获取数据
raw_data = await mys_api.get_gcg_deck(uid) raw_data = await mys_api.get_gcg_deck(uid)
@ -32,12 +29,7 @@ async def draw_deck_img(
raw_data = raw_data['deck_list'][deck_id - 1] raw_data = raw_data['deck_list'][deck_id - 1]
deck_name = raw_data['name'] deck_name = raw_data['name']
# 获取背景图片各项参数 # 获取背景图片各项参数
_id = str(user_id) char_pic = await get_avatar(ev, 320)
if _id.startswith('http'):
char_pic = await get_qq_avatar(avatar_url=_id)
else:
char_pic = await get_qq_avatar(qid=user_id)
char_pic = await draw_pic_with_ring(char_pic, 320)
# 初始化图片 # 初始化图片
img = await get_color_bg(950, 2300) img = await get_color_bg(950, 2300)

View File

@ -1,6 +1,7 @@
import json import json
import datetime
from pathlib import Path from pathlib import Path
from typing import Dict, List, Literal from typing import Dict, List, Literal, Optional
import httpx import httpx
import aiofiles import aiofiles
@ -162,8 +163,22 @@ async def get_half_img(data: List, half: Literal['Upper', 'Lower']):
return half_img return half_img
async def _get_data_from_url(url: str, path: Path) -> Dict: async def _get_data_from_url(
if not path.exists(): url: str, path: Path, expire_sec: Optional[float] = None
) -> Dict:
time_difference = 10
if expire_sec is not None:
modified_time = path.stat().st_mtime
modified_datetime = datetime.datetime.fromtimestamp(modified_time)
current_datetime = datetime.datetime.now()
time_difference = (
current_datetime - modified_datetime
).total_seconds()
if (
expire_sec is not None and time_difference >= expire_sec
) or not path.exists():
async with httpx.AsyncClient() as client: async with httpx.AsyncClient() as client:
response = await client.get(url) response = await client.get(url)
data = response.json() data = response.json()
@ -181,7 +196,9 @@ async def get_review_data(
version: str = Genshin_version[:3], floor: str = '12' version: str = Genshin_version[:3], floor: str = '12'
): ):
schedule_data = await _get_data_from_url( schedule_data = await _get_data_from_url(
'http://www.yuhengcup.top/api/get_DatabaseSchedule', schedule_path 'http://www.yuhengcup.top/api/get_DatabaseSchedule',
schedule_path,
86400,
) )
schedule: List = schedule_data['SpiralAbyssSchedule'] schedule: List = schedule_data['SpiralAbyssSchedule']