新增gs我的成就

This commit is contained in:
KimigaiiWuyi 2024-10-20 17:18:10 +08:00
parent cc93d4c7aa
commit 8c410efc19
12 changed files with 150 additions and 3 deletions

View File

@ -1,21 +1,36 @@
from gsuid_core.sv import SV
from gsuid_core.bot import Bot
from gsuid_core.models import Event
from gsuid_core.logger import logger
from gsuid_core.utils.error_reply import UID_HINT
from ..utils.convert import get_uid
from .draw_achi import draw_achi_img
from .get_achi_desc import get_achi, get_daily_achi
sv_task_achi = SV('成就委托查询')
sv_achi_search = SV('成就完成查询')
@sv_achi_search.on_command(('我的成就', '成就列表', '成就一览'))
async def send_achi_img(bot: Bot, ev: Event):
logger.info(f'[成就列表] 参数:{ev.text}')
uid = await get_uid(bot, ev)
if uid is None:
return await bot.send(UID_HINT)
im = await draw_achi_img(ev, uid)
await bot.send(im)
@sv_task_achi.on_prefix('查委托')
async def send_task_info(bot: Bot, ev: Event):
await bot.logger.info(f'[查委托] 参数:{ev.text}')
logger.info(f'[查委托] 参数:{ev.text}')
im = await get_daily_achi(ev.text)
await bot.send(im)
@sv_task_achi.on_prefix('查成就')
async def send_achi_info(bot: Bot, ev: Event):
await bot.logger.info(f'[查成就] 参数:{ev.text}')
logger.info(f'[查成就] 参数:{ev.text}')
im = await get_achi(ev.text)
await bot.send(im)

View File

@ -0,0 +1,116 @@
from pathlib import Path
from PIL import Image, ImageDraw
from gsuid_core.models import Event
from gsuid_core.utils.error_reply import get_error
from gsuid_core.utils.image.convert import convert_img
from ..utils.mys_api import mys_api, get_base_data
from ..utils.resource.download_url import download
from ..utils.resource.RESOURCE_PATH import ACHI_ICON_PATH
from ..utils.fonts.genshin_fonts import gs_font_30, gs_font_36
from ..utils.image.image_tools import (
get_v4_bg,
add_footer,
get_avatar,
get_v4_title,
)
TEXT_PATH = Path(__file__).parent / 'texture2d'
async def draw_achi_img(ev: Event, uid: str):
data = await mys_api.get_achievement_info(uid)
if isinstance(data, int):
return get_error(data)
raw_data = await get_base_data(uid)
if isinstance(raw_data, (str, bytes)):
return raw_data
elif isinstance(raw_data, (bytearray, memoryview)):
return bytes(raw_data)
char_pic = await get_avatar(ev, 377, False)
title_img = get_v4_title(char_pic, uid, raw_data)
w, h = 1950, title_img.size[1] + (((len(data) - 1) // 3) + 1) * 170 + 240
img = get_v4_bg(w, h)
img.paste(title_img, (137, 0), title_img)
bar = Image.open(TEXT_PATH / 'bar.png')
img.paste(bar, (0, title_img.size[1] + 20), bar)
for index, achi in enumerate(data):
icon_url = achi['icon']
icon_id = achi['id']
icon_name = f'{icon_id}.png'
icon_path = ACHI_ICON_PATH / icon_name
if not icon_path.exists():
await download(icon_url, 15, icon_name)
icon = Image.open(icon_path)
icon = icon.resize((128, 128))
percent = achi['percentage']
finish_num = achi['finish_num']
if percent == 0:
all_num = '?'
else:
all_num = int((finish_num / percent) * 100)
if percent >= 95:
level = 5
color = (249, 53, 53)
elif percent >= 80:
level = 4
color = (255, 173, 0)
elif percent >= 60:
level = 3
color = (243, 53, 249)
elif percent >= 30:
level = 2
color = (53, 157, 249)
else:
level = 1
color = (96, 220, 52)
bg = Image.open(TEXT_PATH / f'bg{level}.png')
bg.paste(icon, (28, 21), icon)
bg_draw = ImageDraw.Draw(bg)
name = achi['name'][:10]
bg_draw.text(
(160, 50),
name,
(255, 173, 0),
gs_font_36,
'lm',
)
bg_draw.text(
(160, 93),
f'{finish_num} / ~{all_num}',
color,
gs_font_30,
'lm',
)
bg_draw.text(
(543, 93),
f'{percent}%',
color,
gs_font_30,
'rm',
)
add_x = int((544 - 163) * percent / 100)
bg_draw.rounded_rectangle((160, 117, 547, 137), 0, (0, 0, 0, 150))
bg_draw.rounded_rectangle((163, 120, 163 + add_x, 134), 0, color)
x = (index % 3) * 600 + 71
y = (index // 3) * 170 + 837
img.paste(bg, (x, y), bg)
img = add_footer(img)
return await convert_img(img)

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 947 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 952 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 955 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 960 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 952 B

View File

@ -129,6 +129,14 @@
"need_ck": true,
"need_sk": false,
"need_admin": false
},
{
"name": "我的成就",
"desc": "检查自己成就完成状态一览",
"eg": "我的成就",
"need_ck": true,
"need_sk": false,
"need_admin": false
}
]
},

View File

@ -21,6 +21,7 @@ CHAR_NAMECARD_PATH = RESOURCE_PATH / 'char_namecard'
CHAR_NAMECARDPIC_PATH = RESOURCE_PATH / 'char_namecard_pic'
REL_PATH = RESOURCE_PATH / 'reliquaries'
ICON_PATH = RESOURCE_PATH / 'icon'
ACHI_ICON_PATH = RESOURCE_PATH / 'achi_icon'
TEMP_PATH = RESOURCE_PATH / 'temp'
CARD_PATH = RESOURCE_PATH / 'card'
MONSTER_ICON_PATH = RESOURCE_PATH / 'monster_icon'
@ -56,6 +57,7 @@ def init_dir():
ICON_PATH,
TEXT2D_PATH,
PLAYER_PATH,
ACHI_ICON_PATH,
TEMP_PATH,
CARD_PATH,
GUIDE_PATH,

View File

@ -14,6 +14,7 @@ from .RESOURCE_PATH import (
WIKI_PATH,
GUIDE_PATH,
WEAPON_PATH,
ACHI_ICON_PATH,
CHAR_SIDE_PATH,
GACHA_IMG_PATH,
CHAR_STAND_PATH,
@ -37,6 +38,7 @@ PATH_MAP = {
12: REF_PATH,
13: CHAR_SIDE_TEMP_PATH,
14: CHAR_NAMECARDPIC_PATH,
15: ACHI_ICON_PATH,
}
@ -65,6 +67,10 @@ async def download(
9: CARD_PATH,
10: GUIDE_PATH,
11: WIKI_PATH,
12: REF_PATH,
13: CHAR_SIDE_TEMP_PATH,
14: CHAR_NAMECARDPIC_PATH,
15: ACHI_ICON_PATH,
'''
* name: `str`
资源保存名称

View File

@ -1,2 +1,2 @@
GenshinUID_version = '5.1.0'
GenshinUID_version = '5.1.1'
Genshin_version = '5.1.0'