mirror of
https://github.com/KimigaiiWuyi/GenshinUID.git
synced 2025-05-08 04:55:51 +08:00
✨ 新增gs我的成就
This commit is contained in:
parent
cc93d4c7aa
commit
8c410efc19
@ -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)
|
||||
|
116
GenshinUID/genshinuid_achievement/draw_achi.py
Normal file
116
GenshinUID/genshinuid_achievement/draw_achi.py
Normal 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)
|
BIN
GenshinUID/genshinuid_achievement/texture2d/bar.png
Normal file
BIN
GenshinUID/genshinuid_achievement/texture2d/bar.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 25 KiB |
BIN
GenshinUID/genshinuid_achievement/texture2d/bg1.png
Normal file
BIN
GenshinUID/genshinuid_achievement/texture2d/bg1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 947 B |
BIN
GenshinUID/genshinuid_achievement/texture2d/bg2.png
Normal file
BIN
GenshinUID/genshinuid_achievement/texture2d/bg2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 952 B |
BIN
GenshinUID/genshinuid_achievement/texture2d/bg3.png
Normal file
BIN
GenshinUID/genshinuid_achievement/texture2d/bg3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 955 B |
BIN
GenshinUID/genshinuid_achievement/texture2d/bg4.png
Normal file
BIN
GenshinUID/genshinuid_achievement/texture2d/bg4.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 960 B |
BIN
GenshinUID/genshinuid_achievement/texture2d/bg5.png
Normal file
BIN
GenshinUID/genshinuid_achievement/texture2d/bg5.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 952 B |
@ -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
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -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,
|
||||
|
@ -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`
|
||||
资源保存名称
|
||||
|
@ -1,2 +1,2 @@
|
||||
GenshinUID_version = '5.1.0'
|
||||
GenshinUID_version = '5.1.1'
|
||||
Genshin_version = '5.1.0'
|
||||
|
Loading…
x
Reference in New Issue
Block a user