🎨 优化头像获取, logger调用, 重复资源利用

This commit is contained in:
KimigaiiWuyi 2025-01-22 03:37:38 +08:00
parent 8ca5a5c3e5
commit 61f135486f
26 changed files with 285 additions and 300 deletions

View File

@ -3,6 +3,7 @@ import re
from gsuid_core.sv import SV from gsuid_core.sv import SV
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.models import Event from gsuid_core.models import Event
from gsuid_core.logger import logger
from gsuid_core.utils.database.api import get_uid from gsuid_core.utils.database.api import get_uid
from gsuid_core.utils.database.models import GsBind from gsuid_core.utils.database.models import GsBind
@ -26,18 +27,18 @@ async def send_srabyss_info(bot: Bot, ev: Event):
if name: if name:
return None return None
await bot.logger.info("开始执行[sr查询深渊信息]") logger.info("开始执行[sr查询深渊信息]")
uid, user_id = await get_uid(bot, ev, GsBind, "sr", True) uid, user_id = await get_uid(bot, ev, GsBind, "sr", True)
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
await bot.logger.info(f"[sr查询深渊信息]uid: {uid}") logger.info(f"[sr查询深渊信息]uid: {uid}")
if "上期" in ev.command: if "上期" in ev.command:
schedule_type = "2" schedule_type = "2"
else: else:
schedule_type = "1" schedule_type = "1"
await bot.logger.info(f"[sr查询深渊信息]深渊期数: {schedule_type}") logger.info(f"[sr查询深渊信息]深渊期数: {schedule_type}")
im = await draw_abyss_img(user_id, uid, ev.sender, schedule_type) im = await draw_abyss_img(ev, uid, schedule_type)
await bot.send(im) await bot.send(im)
return None return None

View File

@ -1,16 +1,17 @@
from pathlib import Path from pathlib import Path
from typing import Any, Dict, 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 from gsuid_core.utils.error_reply import get_error
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 ( from gsuid_core.utils.image.image_tools import draw_pic_with_ring
draw_pic_with_ring,
get_qq_avatar,
)
from ..utils.mys_api import mys_api
from ..sruid_utils.api.mys.models import AbyssAvatar from ..sruid_utils.api.mys.models import AbyssAvatar
from ..utils.resource.get_pic_from import get_roleinfo_icon
from ..utils.image.image_tools import elements, _get_event_avatar
from ..utils.fonts.starrail_fonts import ( from ..utils.fonts.starrail_fonts import (
sr_font_22, sr_font_22,
sr_font_28, sr_font_28,
@ -18,8 +19,6 @@ from ..utils.fonts.starrail_fonts import (
sr_font_34, sr_font_34,
sr_font_42, sr_font_42,
) )
from ..utils.mys_api import mys_api
from ..utils.resource.get_pic_from import get_roleinfo_icon
TEXT_PATH = Path(__file__).parent / "texture2D" TEXT_PATH = Path(__file__).parent / "texture2D"
white_color = (255, 255, 255) white_color = (255, 255, 255)
@ -32,16 +31,6 @@ rank_bg = Image.open(TEXT_PATH / "rank_bg.png").convert("RGBA")
star_yes = Image.open(TEXT_PATH / "star.png").convert("RGBA") star_yes = Image.open(TEXT_PATH / "star.png").convert("RGBA")
star_gray = Image.open(TEXT_PATH / "star_gray.png").convert("RGBA") star_gray = Image.open(TEXT_PATH / "star_gray.png").convert("RGBA")
elements = {
"ice": Image.open(TEXT_PATH / "IconNatureColorIce.png").convert("RGBA"),
"fire": Image.open(TEXT_PATH / "IconNatureColorFire.png").convert("RGBA"),
"imaginary": Image.open(TEXT_PATH / "IconNatureColorImaginary.png").convert("RGBA"),
"quantum": Image.open(TEXT_PATH / "IconNatureColorQuantum.png").convert("RGBA"),
"lightning": Image.open(TEXT_PATH / "IconNatureColorThunder.png").convert("RGBA"),
"wind": Image.open(TEXT_PATH / "IconNatureColorWind.png").convert("RGBA"),
"physical": Image.open(TEXT_PATH / "IconNaturePhysical.png").convert("RGBA"),
}
async def get_abyss_star_pic(star: int) -> Image.Image: async def get_abyss_star_pic(star: int) -> Image.Image:
return Image.open(TEXT_PATH / f"star{star}.png") return Image.open(TEXT_PATH / f"star{star}.png")
@ -117,9 +106,8 @@ async def _draw_floor_card(
async def draw_abyss_img( async def draw_abyss_img(
qid: Union[str, int], ev: Event,
uid: str, uid: str,
sender: Dict[str, Any],
schedule_type: str = "1", schedule_type: str = "1",
) -> Union[bytes, str]: ) -> Union[bytes, str]:
raw_abyss_data = await mys_api.get_abyss_info(uid, schedule_type) raw_abyss_data = await mys_api.get_abyss_info(uid, schedule_type)
@ -132,7 +120,9 @@ async def draw_abyss_img(
return "你还没有挑战本期深渊!\n可以使用[sr上期深渊]命令查询上期~" return "你还没有挑战本期深渊!\n可以使用[sr上期深渊]命令查询上期~"
# 过滤掉 is_fast (快速通关) 为 True 的项 # 过滤掉 is_fast (快速通关) 为 True 的项
floor_detail = [ floor_detail = [
detail for detail in raw_abyss_data.all_floor_detail if not detail.is_fast detail
for detail in raw_abyss_data.all_floor_detail
if not detail.is_fast
] ]
floor_num = len(floor_detail) floor_num = len(floor_detail)
@ -145,13 +135,7 @@ async def draw_abyss_img(
img.paste(abyss_title, (0, 0), abyss_title) img.paste(abyss_title, (0, 0), abyss_title)
# 获取头像 # 获取头像
_id = str(qid) char_pic = await _get_event_avatar(ev)
if _id.startswith("http"):
char_pic = await get_qq_avatar(avatar_url=_id)
elif sender.get("avatar") is not None:
char_pic = await get_qq_avatar(avatar_url=sender["avatar"])
else:
char_pic = await get_qq_avatar(qid=qid)
char_pic = await draw_pic_with_ring(char_pic, 250, None, False) char_pic = await draw_pic_with_ring(char_pic, 250, None, False)
img.paste(char_pic, (325, 132), char_pic) img.paste(char_pic, (325, 132), char_pic)

View File

@ -3,6 +3,7 @@ import re
from gsuid_core.sv import SV from gsuid_core.sv import SV
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.models import Event from gsuid_core.models import Event
from gsuid_core.logger import logger
from gsuid_core.utils.database.api import get_uid from gsuid_core.utils.database.api import get_uid
from gsuid_core.utils.database.models import GsBind from gsuid_core.utils.database.models import GsBind
@ -26,18 +27,18 @@ async def send_srabyss_info(bot: Bot, ev: Event):
if name: if name:
return None return None
await bot.logger.info("开始执行[sr查询末日幻影信息]") logger.info("开始执行[sr查询末日幻影信息]")
uid, user_id = await get_uid(bot, ev, GsBind, "sr", True) uid, user_id = await get_uid(bot, ev, GsBind, "sr", True)
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
await bot.logger.info(f"[sr查询末日幻影信息]uid: {uid}") logger.info(f"[sr查询末日幻影信息]uid: {uid}")
if "上期" in ev.command: if "上期" in ev.command:
schedule_type = "2" schedule_type = "2"
else: else:
schedule_type = "1" schedule_type = "1"
await bot.logger.info(f"[sr查询末日幻影信息]末日幻影期数: {schedule_type}") logger.info(f"[sr查询末日幻影信息]末日幻影期数: {schedule_type}")
im = await draw_abyss_img(user_id, uid, ev.sender, schedule_type) im = await draw_abyss_img(ev, uid, schedule_type)
await bot.send(im) await bot.send(im)
return None return None

View File

@ -1,16 +1,17 @@
from pathlib import Path from pathlib import Path
from typing import Any, Dict, 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 from gsuid_core.utils.error_reply import get_error
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 ( from gsuid_core.utils.image.image_tools import draw_pic_with_ring
draw_pic_with_ring,
get_qq_avatar,
)
from ..utils.mys_api import mys_api
from ..sruid_utils.api.mys.models import AbyssAvatar from ..sruid_utils.api.mys.models import AbyssAvatar
from ..utils.resource.get_pic_from import get_roleinfo_icon
from ..utils.image.image_tools import elements, _get_event_avatar
from ..utils.fonts.starrail_fonts import ( from ..utils.fonts.starrail_fonts import (
sr_font_22, sr_font_22,
sr_font_28, sr_font_28,
@ -18,8 +19,6 @@ from ..utils.fonts.starrail_fonts import (
sr_font_34, sr_font_34,
sr_font_42, sr_font_42,
) )
from ..utils.mys_api import mys_api
from ..utils.resource.get_pic_from import get_roleinfo_icon
TEXT_PATH = Path(__file__).parent / "texture2D" TEXT_PATH = Path(__file__).parent / "texture2D"
white_color = (255, 255, 255) white_color = (255, 255, 255)
@ -32,16 +31,6 @@ rank_bg = Image.open(TEXT_PATH / "rank_bg.png").convert("RGBA")
star_yes = Image.open(TEXT_PATH / "star.png").convert("RGBA") star_yes = Image.open(TEXT_PATH / "star.png").convert("RGBA")
star_gray = Image.open(TEXT_PATH / "star_gray.png").convert("RGBA") star_gray = Image.open(TEXT_PATH / "star_gray.png").convert("RGBA")
elements = {
"ice": Image.open(TEXT_PATH / "IconNatureColorIce.png").convert("RGBA"),
"fire": Image.open(TEXT_PATH / "IconNatureColorFire.png").convert("RGBA"),
"imaginary": Image.open(TEXT_PATH / "IconNatureColorImaginary.png").convert("RGBA"),
"quantum": Image.open(TEXT_PATH / "IconNatureColorQuantum.png").convert("RGBA"),
"lightning": Image.open(TEXT_PATH / "IconNatureColorThunder.png").convert("RGBA"),
"wind": Image.open(TEXT_PATH / "IconNatureColorWind.png").convert("RGBA"),
"physical": Image.open(TEXT_PATH / "IconNaturePhysical.png").convert("RGBA"),
}
async def get_abyss_star_pic(star: int) -> Image.Image: async def get_abyss_star_pic(star: int) -> Image.Image:
return Image.open(TEXT_PATH / f"star{star}.png") return Image.open(TEXT_PATH / f"star{star}.png")
@ -109,7 +98,7 @@ async def _draw_floor_card(
fill=white_color, fill=white_color,
anchor="mm", anchor="mm",
) )
#总分todo # 总分todo
if sum_score: if sum_score:
floor_pic_draw.text( floor_pic_draw.text(
(800, 60), (800, 60),
@ -122,9 +111,8 @@ async def _draw_floor_card(
async def draw_abyss_img( async def draw_abyss_img(
qid: Union[str, int], ev: Event,
uid: str, uid: str,
sender: Dict[str, Any],
schedule_type: str = "1", schedule_type: str = "1",
) -> Union[bytes, str]: ) -> Union[bytes, str]:
raw_abyss_data = await mys_api.get_abyss_boss_info(uid, schedule_type) raw_abyss_data = await mys_api.get_abyss_boss_info(uid, schedule_type)
@ -136,7 +124,9 @@ async def draw_abyss_img(
return "你还没有挑战本期末日幻影!\n可以使用[sr上期末日幻影]命令查询上期~" return "你还没有挑战本期末日幻影!\n可以使用[sr上期末日幻影]命令查询上期~"
# 过滤掉 is_fast (快速通关) 为 True 的项 # 过滤掉 is_fast (快速通关) 为 True 的项
floor_detail = [ floor_detail = [
detail for detail in raw_abyss_data.all_floor_detail if not detail.is_fast detail
for detail in raw_abyss_data.all_floor_detail
if not detail.is_fast
] ]
floor_num = len(floor_detail) floor_num = len(floor_detail)
@ -149,13 +139,7 @@ async def draw_abyss_img(
img.paste(abyss_title, (0, 0), abyss_title) img.paste(abyss_title, (0, 0), abyss_title)
# 获取头像 # 获取头像
_id = str(qid) char_pic = await _get_event_avatar(ev)
if _id.startswith("http"):
char_pic = await get_qq_avatar(avatar_url=_id)
elif sender.get("avatar") is not None:
char_pic = await get_qq_avatar(avatar_url=sender["avatar"])
else:
char_pic = await get_qq_avatar(qid=qid)
char_pic = await draw_pic_with_ring(char_pic, 250, None, False) char_pic = await draw_pic_with_ring(char_pic, 250, None, False)
img.paste(char_pic, (325, 132), char_pic) img.paste(char_pic, (325, 132), char_pic)
@ -234,14 +218,14 @@ async def draw_abyss_img(
"lm", "lm",
) )
# 分数todo # 分数todo
if score : if score:
floor_pic_draw.text( floor_pic_draw.text(
(800, 120 + index_part * 219), (800, 120 + index_part * 219),
f"{score}", f"{score}",
"#fec86f", "#fec86f",
sr_font_30, sr_font_30,
"rm", "rm",
) )
if node_num == 1: if node_num == 1:
avatars_array = node_1 avatars_array = node_1
else: else:

View File

@ -3,6 +3,7 @@ import re
from gsuid_core.sv import SV from gsuid_core.sv import SV
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.models import Event from gsuid_core.models import Event
from gsuid_core.logger import logger
from gsuid_core.utils.database.api import get_uid from gsuid_core.utils.database.api import get_uid
from gsuid_core.utils.database.models import GsBind from gsuid_core.utils.database.models import GsBind
@ -28,18 +29,18 @@ async def send_srabyss_info(bot: Bot, ev: Event):
if name: if name:
return None return None
await bot.logger.info("开始执行[sr查询虚构叙事信息]") logger.info("开始执行[sr查询虚构叙事信息]")
uid, user_id = await get_uid(bot, ev, GsBind, "sr", True) uid, user_id = await get_uid(bot, ev, GsBind, "sr", True)
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
await bot.logger.info(f"[sr查询虚构叙事信息]uid: {uid}") logger.info(f"[sr查询虚构叙事信息]uid: {uid}")
if "sq" in ev.command or "上期" in ev.command: if "sq" in ev.command or "上期" in ev.command:
schedule_type = "2" schedule_type = "2"
else: else:
schedule_type = "1" schedule_type = "1"
await bot.logger.info(f"[sr查询虚构叙事信息]虚构叙事期数: {schedule_type}") logger.info(f"[sr查询虚构叙事信息]虚构叙事期数: {schedule_type}")
im = await draw_abyss_img(user_id, uid, ev.sender, schedule_type) im = await draw_abyss_img(ev, uid, schedule_type)
await bot.send(im) await bot.send(im)
return None return None

View File

@ -1,16 +1,17 @@
from pathlib import Path from pathlib import Path
from typing import Any, Dict, 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 from gsuid_core.utils.error_reply import get_error
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 ( from gsuid_core.utils.image.image_tools import draw_pic_with_ring
draw_pic_with_ring,
get_qq_avatar,
)
from ..utils.mys_api import mys_api
from ..sruid_utils.api.mys.models import AbyssAvatar from ..sruid_utils.api.mys.models import AbyssAvatar
from ..utils.resource.get_pic_from import get_roleinfo_icon
from ..utils.image.image_tools import elements, _get_event_avatar
from ..utils.fonts.starrail_fonts import ( from ..utils.fonts.starrail_fonts import (
sr_font_22, sr_font_22,
sr_font_28, sr_font_28,
@ -18,8 +19,6 @@ from ..utils.fonts.starrail_fonts import (
sr_font_34, sr_font_34,
sr_font_42, sr_font_42,
) )
from ..utils.mys_api import mys_api
from ..utils.resource.get_pic_from import get_roleinfo_icon
TEXT_PATH = Path(__file__).parent / "texture2D" TEXT_PATH = Path(__file__).parent / "texture2D"
white_color = (255, 255, 255) white_color = (255, 255, 255)
@ -32,16 +31,6 @@ rank_bg = Image.open(TEXT_PATH / "rank_bg.png").convert("RGBA")
star_yes = Image.open(TEXT_PATH / "star.png").convert("RGBA") star_yes = Image.open(TEXT_PATH / "star.png").convert("RGBA")
star_gray = Image.open(TEXT_PATH / "star_gray.png").convert("RGBA") star_gray = Image.open(TEXT_PATH / "star_gray.png").convert("RGBA")
elements = {
"ice": Image.open(TEXT_PATH / "IconNatureColorIce.png").convert("RGBA"),
"fire": Image.open(TEXT_PATH / "IconNatureColorFire.png").convert("RGBA"),
"imaginary": Image.open(TEXT_PATH / "IconNatureColorImaginary.png").convert("RGBA"),
"quantum": Image.open(TEXT_PATH / "IconNatureColorQuantum.png").convert("RGBA"),
"lightning": Image.open(TEXT_PATH / "IconNatureColorThunder.png").convert("RGBA"),
"wind": Image.open(TEXT_PATH / "IconNatureColorWind.png").convert("RGBA"),
"physical": Image.open(TEXT_PATH / "IconNaturePhysical.png").convert("RGBA"),
}
async def get_abyss_star_pic(star: int) -> Image.Image: async def get_abyss_star_pic(star: int) -> Image.Image:
return Image.open(TEXT_PATH / f"star{star}.png") return Image.open(TEXT_PATH / f"star{star}.png")
@ -117,7 +106,7 @@ async def _draw_floor_card(
fill=white_color, fill=white_color,
anchor="mm", anchor="mm",
) )
#总分todo # 总分todo
if sum_score: if sum_score:
floor_pic_draw.text( floor_pic_draw.text(
(800, 40), (800, 40),
@ -137,9 +126,8 @@ async def _draw_floor_card(
async def draw_abyss_img( async def draw_abyss_img(
qid: Union[str, int], ev: Event,
uid: str, uid: str,
sender: Dict[str, Any],
schedule_type: str = "1", schedule_type: str = "1",
) -> Union[bytes, str]: ) -> Union[bytes, str]:
raw_abyss_data = await mys_api.get_abyss_story_info(uid, schedule_type) raw_abyss_data = await mys_api.get_abyss_story_info(uid, schedule_type)
@ -151,7 +139,9 @@ async def draw_abyss_img(
return "你还没有挑战本期虚构叙事!\n可以使用[sr上期虚构叙事]命令查询上期~" return "你还没有挑战本期虚构叙事!\n可以使用[sr上期虚构叙事]命令查询上期~"
# 过滤掉 is_fast (快速通关) 为 True 的项 # 过滤掉 is_fast (快速通关) 为 True 的项
floor_detail = [ floor_detail = [
detail for detail in raw_abyss_data.all_floor_detail if not detail.is_fast detail
for detail in raw_abyss_data.all_floor_detail
if not detail.is_fast
] ]
floor_num = len(floor_detail) floor_num = len(floor_detail)
@ -164,13 +154,7 @@ async def draw_abyss_img(
img.paste(abyss_title, (0, 0), abyss_title) img.paste(abyss_title, (0, 0), abyss_title)
# 获取头像 # 获取头像
_id = str(qid) char_pic = await _get_event_avatar(ev)
if _id.startswith("http"):
char_pic = await get_qq_avatar(avatar_url=_id)
elif sender.get("avatar") is not None:
char_pic = await get_qq_avatar(avatar_url=sender["avatar"])
else:
char_pic = await get_qq_avatar(qid=qid)
char_pic = await draw_pic_with_ring(char_pic, 250, None, False) char_pic = await draw_pic_with_ring(char_pic, 250, None, False)
img.paste(char_pic, (325, 132), char_pic) img.paste(char_pic, (325, 132), char_pic)
@ -250,14 +234,14 @@ async def draw_abyss_img(
"lm", "lm",
) )
# 分数todo # 分数todo
if score : if score:
floor_pic_draw.text( floor_pic_draw.text(
(800, 120 + index_part * 219), (800, 120 + index_part * 219),
f"{score}", f"{score}",
"#fec86f", "#fec86f",
sr_font_30, sr_font_30,
"rm", "rm",
) )
if node_num == 1: if node_num == 1:
avatars_array = node_1 avatars_array = node_1
else: else:

View File

@ -6,6 +6,7 @@ from PIL import Image
from gsuid_core.sv import SV from gsuid_core.sv import SV
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.models import Event from gsuid_core.models import Event
from gsuid_core.logger import logger
from gsuid_core.message_models import Button from gsuid_core.message_models import Button
from gsuid_core.utils.database.api import get_uid from gsuid_core.utils.database.api import get_uid
from gsuid_core.utils.database.models import GsBind from gsuid_core.utils.database.models import GsBind
@ -69,7 +70,7 @@ async def _get_char_info(bot: Bot, ev: Event, text: str):
if not msg: if not msg:
return None return None
# 获取角色名 # 获取角色名
await bot.logger.info("开始执行[查询角色面板]") logger.info("开始执行[查询角色面板]")
# 获取uid # 获取uid
if "" in msg or "" in msg or "" in msg: if "" in msg or "" in msg or "" in msg:
uid = await get_uid(bot, ev, GsBind, "sr", False) uid = await get_uid(bot, ev, GsBind, "sr", False)
@ -78,7 +79,7 @@ async def _get_char_info(bot: Bot, ev: Event, text: str):
msg = " ".join(re.findall("[\u4e00-\u9fa5]+", text)) msg = " ".join(re.findall("[\u4e00-\u9fa5]+", text))
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
await bot.logger.info(f"[查询角色面板]uid: {uid}") logger.info(f"[查询角色面板]uid: {uid}")
return await draw_char_info_img(msg, uid) return await draw_char_info_img(msg, uid)
@ -88,9 +89,9 @@ async def send_card_info(bot: Bot, ev: Event):
uid = await get_uid(bot, ev, GsBind, "sr") uid = await get_uid(bot, ev, GsBind, "sr")
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
await bot.logger.info(f"[sr强制刷新]uid: {uid}") logger.info(f"[sr强制刷新]uid: {uid}")
im = await api_to_card(uid) im = await api_to_card(uid)
await bot.logger.info(f"UID{uid}获取角色数据成功!") logger.info(f"UID{uid}获取角色数据成功!")
if isinstance(im, Tuple): if isinstance(im, Tuple):
buttons = [ buttons = [
Button( Button(

View File

@ -1,10 +1,10 @@
from gsuid_core.sv import SV from gsuid_core.sv import SV
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.models import Event from gsuid_core.models import Event
from gsuid_core.logger import logger
from gsuid_core.utils.database.api import get_uid from gsuid_core.utils.database.api import get_uid
from gsuid_core.utils.database.models import GsBind from gsuid_core.utils.database.models import GsBind
from ..utils.sr_prefix import PREFIX
from ..utils.error_reply import UID_HINT from ..utils.error_reply import UID_HINT
from .get_gachalogs import save_gachalogs from .get_gachalogs import save_gachalogs
from .draw_gachalogs import draw_gachalogs_img from .draw_gachalogs import draw_gachalogs_img
@ -13,20 +13,20 @@ sv_gacha_log = SV("sr抽卡记录")
sv_get_gachalog_by_link = SV("sr导入抽卡链接", area="DIRECT") sv_get_gachalog_by_link = SV("sr导入抽卡链接", area="DIRECT")
@sv_gacha_log.on_fullmatch(f"抽卡记录") @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("开始执行[sr抽卡记录]") logger.info("开始执行[sr抽卡记录]")
uid, user_id = await get_uid(bot, ev, GsBind, "sr", True) uid, user_id = await get_uid(bot, ev, GsBind, "sr", True)
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)
await bot.send(im) await bot.send(im)
return None return None
@sv_get_gachalog_by_link.on_command(("导入抽卡链接", "导入抽卡记录", "导入抽卡连接")) @sv_get_gachalog_by_link.on_command(("导入抽卡链接", "导入抽卡记录", "导入抽卡连接"))
async def get_gachalog_by_link(bot: Bot, ev: Event): async def get_gachalog_by_link(bot: Bot, ev: Event):
await bot.logger.info("开始执行[sr导入抽卡链接]") logger.info("开始执行[sr导入抽卡链接]")
uid = await get_uid(bot, ev, GsBind, "sr", False, None) uid = await get_uid(bot, ev, GsBind, "sr", False, None)
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
@ -35,7 +35,7 @@ async def get_gachalog_by_link(bot: Bot, ev: Event):
return await bot.send("请给出正确的抽卡记录链接") return await bot.send("请给出正确的抽卡记录链接")
is_force = False is_force = False
if ev.command.startswith("强制"): if ev.command.startswith("强制"):
await bot.logger.info("[WARNING]本次为强制刷新") logger.info("[WARNING] 本次为强制刷新")
is_force = True is_force = True
await bot.send(f"UID{uid}开始执行[刷新抽卡记录],需要一定时间...请勿重复触发!") await bot.send(f"UID{uid}开始执行[刷新抽卡记录],需要一定时间...请勿重复触发!")
im = await save_gachalogs(uid, gacha_url, None, is_force) im = await save_gachalogs(uid, gacha_url, None, is_force)

View File

@ -1,18 +1,22 @@
import asyncio
import datetime
import json import json
import asyncio
from pathlib import Path from pathlib import Path
from datetime import datetime
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 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 ( from gsuid_core.utils.image.image_tools import get_color_bg, draw_pic_with_ring
draw_pic_with_ring,
get_color_bg,
get_qq_avatar,
)
from ..utils.image.image_tools import _get_event_avatar
from ..utils.name_covert import name_to_avatar_id, name_to_weapon_id
from ..utils.resource.RESOURCE_PATH import (
PLAYER_PATH,
WEAPON_PATH,
CHAR_ICON_PATH,
)
from ..utils.fonts.starrail_fonts import ( from ..utils.fonts.starrail_fonts import (
sr_font_20, sr_font_20,
sr_font_24, sr_font_24,
@ -20,12 +24,6 @@ from ..utils.fonts.starrail_fonts import (
sr_font_38, sr_font_38,
sr_font_40, sr_font_40,
) )
from ..utils.name_covert import name_to_avatar_id, name_to_weapon_id
from ..utils.resource.RESOURCE_PATH import (
CHAR_ICON_PATH,
PLAYER_PATH,
WEAPON_PATH,
)
TEXT_PATH = Path(__file__).parent / "texture2d" TEXT_PATH = Path(__file__).parent / "texture2d"
EMO_PATH = Path(__file__).parent / "texture2d" / "emo" EMO_PATH = Path(__file__).parent / "texture2d" / "emo"
@ -86,15 +84,13 @@ async def _draw_card(
text_point = (100, 165) text_point = (100, 165)
if card_type == "角色": if card_type == "角色":
_id = await name_to_avatar_id(name) _id = await name_to_avatar_id(name)
item_pic = ( item_pic = Image.open(CHAR_ICON_PATH / f"{_id}.png")
Image.open(CHAR_ICON_PATH / f"{_id}.png").convert("RGBA").resize((105, 105)) item_pic = item_pic.convert("RGBA").resize((105, 105))
)
else: else:
name = await name_to_weapon_id(name) name = await name_to_weapon_id(name)
# _id = await weapon_id_to_en_name(name) # _id = await weapon_id_to_en_name(name)
item_pic = ( item_pic = Image.open(WEAPON_PATH / f"{name}.png")
Image.open(WEAPON_PATH / f"{name}.png").convert("RGBA").resize((124, 124)) item_pic = item_pic.convert("RGBA").resize((124, 124))
)
point = (37, 24) point = (37, 24)
card_img.paste(item_pic, point, item_pic) card_img.paste(item_pic, point, item_pic)
if gacha_num >= 81: if gacha_num >= 81:
@ -103,7 +99,13 @@ async def _draw_card(
text_color = green_color text_color = green_color
else: else:
text_color = brown_color text_color = brown_color
card_img_draw.text(text_point, f"{gacha_num}", text_color, sr_font_24, "mm") card_img_draw.text(
text_point,
f"{gacha_num}",
text_color,
sr_font_24,
"mm"
)
if is_up: if is_up:
logger.info(f"up: {name}") logger.info(f"up: {name}")
# card_img.paste(up_tag, (47, -2), up_tag) # card_img.paste(up_tag, (47, -2), up_tag)
@ -132,16 +134,16 @@ def check_up(name: str, _time: str) -> bool:
for char in UP_LIST: for char in UP_LIST:
if char == name: if char == name:
time = UP_LIST[char] time = UP_LIST[char]
s_time = datetime.datetime(*time[0]) s_time = datetime(*time[0])
e_time = datetime.datetime(*time[1]) e_time = datetime(*time[1])
gacha_time = datetime.datetime.strptime(_time, "%Y-%m-%d %H:%M:%S") gacha_time = datetime.strptime(_time, "%Y-%m-%d %H:%M:%S")
if gacha_time < s_time or gacha_time > e_time: if gacha_time < s_time or gacha_time > e_time:
return False return False
return True return True
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请使用命令`sr导入抽卡链接`更新跃迁数据~" return "你还没有跃迁数据噢~\n请使用命令`sr导入抽卡链接`更新跃迁数据~"
@ -174,23 +176,21 @@ async def draw_gachalogs_img(uid: str, user_id: str) -> Union[bytes, str]:
# 开始初始化抽卡数 # 开始初始化抽卡数
num = 1 num = 1
# 从后面开始循环 # 从后面开始循环
temp_time = datetime.datetime(2023, 4, 26, 8, 0, 0) temp_time = datetime(2023, 4, 26, 8, 0, 0)
for index, data in enumerate(data_list[::-1]): for index, data in enumerate(data_list[::-1]):
# 计算抽卡时间跨度 # 计算抽卡时间跨度
if index == 0: if index == 0:
total_data[i]["time_range"] = data["time"] total_data[i]["time_range"] = data["time"]
if index == len(data_list) - 1: if index == len(data_list) - 1:
total_data[i]["all_time"] = ( _fm = "%Y-%m-%d %H:%M:%S"
datetime.datetime.strptime(data["time"], "%Y-%m-%d %H:%M:%S") t1 = datetime.strptime(data["time"], _fm)
- datetime.datetime.strptime( t2 = datetime.strptime(total_data[i]["time_range"], _fm)
total_data[i]["time_range"], "%Y-%m-%d %H:%M:%S" total_data[i]["all_time"] = (t1-t2).total_seconds()
)
).total_seconds()
total_data[i]["time_range"] += "~" + data["time"] total_data[i]["time_range"] += "~" + data["time"]
# 计算时间间隔 # 计算时间间隔
if index != 0: if index != 0:
now_time = datetime.datetime.strptime(data["time"], "%Y-%m-%d %H:%M:%S") now_time = datetime.strptime(data["time"], "%Y-%m-%d %H:%M:%S")
dis = (now_time - temp_time).total_seconds() dis = (now_time - temp_time).total_seconds()
temp_time = now_time temp_time = now_time
if dis <= 5000: if dis <= 5000:
@ -200,7 +200,7 @@ async def draw_gachalogs_img(uid: str, user_id: str) -> Union[bytes, str]:
total_data[i]["long_gacha_data"]["num"] += 1 total_data[i]["long_gacha_data"]["num"] += 1
total_data[i]["long_gacha_data"]["time"] += dis total_data[i]["long_gacha_data"]["time"] += dis
else: else:
temp_time = datetime.datetime.strptime( temp_time = datetime.strptime(
data["time"], "%Y-%m-%d %H:%M:%S" data["time"], "%Y-%m-%d %H:%M:%S"
) )
@ -307,16 +307,15 @@ async def draw_gachalogs_img(uid: str, user_id: str) -> Union[bytes, str]:
weapon_y = (1 + ((total_data["光锥跃迁"]["total"] - 1) // 5)) * single_y weapon_y = (1 + ((total_data["光锥跃迁"]["total"] - 1) // 5)) * single_y
# 获取背景图片各项参数 # 获取背景图片各项参数
_id = str(user_id) char_pic = await _get_event_avatar(ev)
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, 206, None, False) char_pic = await draw_pic_with_ring(char_pic, 206, None, False)
# 获取背景图片各项参数 # 获取背景图片各项参数
img = Abg3_img.copy() img = Abg3_img.copy()
img = await get_color_bg(800, 1600 + 400 + normal_y + char_y + weapon_y + begin_y) img = await get_color_bg(
800,
1600 + 400 + normal_y + char_y + weapon_y + begin_y,
)
gacha_title = bg1_img.copy() gacha_title = bg1_img.copy()
gacha_title.paste(char_pic, (297, 81), char_pic) gacha_title.paste(char_pic, (297, 81), char_pic)
img.paste(gacha_title, (0, 0), gacha_title) img.paste(gacha_title, (0, 0), gacha_title)
@ -392,7 +391,12 @@ async def draw_gachalogs_img(uid: str, user_id: str) -> Union[bytes, str]:
"mm", "mm",
) )
y_extend += ( y_extend += (
(1 + ((total_data[type_list[index - 1]]["total"] - 1) // 5)) * single_y (
1
+ (
(total_data[type_list[index - 1]]["total"] - 1) // 5
)
) * single_y
if index != 0 if index != 0
else 0 else 0
) )

View File

@ -29,7 +29,7 @@ async def send_monthly_data(bot: Bot, ev: Event):
) )
) )
async def send_monthly_pic(bot: Bot, ev: Event): async def send_monthly_pic(bot: Bot, ev: Event):
await bot.logger.info("开始执行[sr开拓月历]") logger.info("开始执行[sr开拓月历]")
sr_uid = await get_uid(bot, ev, GsBind, "sr") sr_uid = await get_uid(bot, ev, GsBind, "sr")
if sr_uid is None: if sr_uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)

View File

@ -3,6 +3,7 @@ import re
from gsuid_core.sv import SV from gsuid_core.sv import SV
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.models import Event from gsuid_core.models import Event
from gsuid_core.logger import logger
from gsuid_core.utils.database.api import get_uid from gsuid_core.utils.database.api import get_uid
from gsuid_core.utils.database.models import GsBind from gsuid_core.utils.database.models import GsBind
@ -32,17 +33,17 @@ async def send_srabyss_info(bot: Bot, ev: Event):
if name: if name:
return None return None
await bot.logger.info("开始执行[sr查询模拟宇宙信息]") logger.info("开始执行[sr查询模拟宇宙信息]")
uid, user_id = await get_uid(bot, ev, GsBind, "sr", True) uid, user_id = await get_uid(bot, ev, GsBind, "sr", True)
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
await bot.logger.info(f"[sr查询模拟宇宙信息]uid: {uid}") logger.info(f"[sr查询模拟宇宙信息]uid: {uid}")
if "sq" in ev.command or "上期" in ev.command: if "sq" in ev.command or "上期" in ev.command:
schedule_type = "2" schedule_type = "2"
else: else:
schedule_type = "3" schedule_type = "3"
await bot.logger.info(f"[sr查询模拟宇宙信息]模拟宇宙期数: {schedule_type}") logger.info(f"[sr查询模拟宇宙信息]模拟宇宙期数: {schedule_type}")
if ev.text in ["", "", "", "", "", ""]: if ev.text in ["", "", "", "", "", ""]:
floor = ( floor = (
@ -59,8 +60,8 @@ async def send_srabyss_info(bot: Bot, ev: Event):
floor = int(floor) floor = int(floor)
else: else:
floor = None floor = None
await bot.logger.info(f"[sr查询模拟宇宙信息]模拟宇宙世界数: {floor}") logger.info(f"[sr查询模拟宇宙信息]模拟宇宙世界数: {floor}")
im = await draw_rogue_img(user_id, uid, ev.sender, floor, schedule_type) im = await draw_rogue_img(ev, uid, floor, schedule_type)
await bot.send(im) await bot.send(im)
return None return None
@ -79,11 +80,11 @@ async def send_srabyss_locust_info(bot: Bot, ev: Event):
if name: if name:
return None return None
await bot.logger.info("开始执行[sr查询寰宇蝗灾信息]") logger.info("开始执行[sr查询寰宇蝗灾信息]")
uid, user_id = await get_uid(bot, ev, GsBind, "sr", True) uid, user_id = await get_uid(bot, ev, GsBind, "sr", True)
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
await bot.logger.info(f"[sr查询寰宇蝗灾信息]uid: {uid}") logger.info(f"[sr查询寰宇蝗灾信息]uid: {uid}")
im = await draw_rogue_locust_img(user_id, uid, ev.sender) im = await draw_rogue_locust_img(ev, uid)
await bot.send(im) await bot.send(im)
return None return None

View File

@ -1,30 +1,29 @@
import math import math
from pathlib import Path from pathlib import Path
from typing import Any, Dict, List, Optional, Union from typing import List, Union, Optional
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 from gsuid_core.utils.error_reply import get_error
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 ( from gsuid_core.utils.image.image_tools import draw_pic_with_ring
draw_pic_with_ring,
get_qq_avatar,
)
from ..sruid_utils.api.mys.models import ( from ..utils.mys_api import mys_api
LocustBlocks, from ..utils.resource.get_pic_from import get_roleinfo_icon
RogueAvatar, from ..utils.image.image_tools import elements, _get_event_avatar
RogueBuffitems,
RogueMiracles,
)
from ..utils.fonts.starrail_fonts import ( from ..utils.fonts.starrail_fonts import (
sr_font_22, sr_font_22,
sr_font_28, sr_font_28,
sr_font_34, sr_font_34,
sr_font_42, sr_font_42,
) )
from ..utils.mys_api import mys_api from ..sruid_utils.api.mys.models import (
from ..utils.resource.get_pic_from import get_roleinfo_icon RogueAvatar,
LocustBlocks,
RogueMiracles,
RogueBuffitems,
)
TEXT_PATH = Path(__file__).parent / "texture2D" TEXT_PATH = Path(__file__).parent / "texture2D"
white_color = (255, 255, 255) white_color = (255, 255, 255)
@ -36,15 +35,6 @@ char_bg_5 = Image.open(TEXT_PATH / "char5_bg.png").convert("RGBA")
rank_bg = Image.open(TEXT_PATH / "rank_bg.png").convert("RGBA") rank_bg = Image.open(TEXT_PATH / "rank_bg.png").convert("RGBA")
content_center = Image.open(TEXT_PATH / "center.png").convert("RGBA") content_center = Image.open(TEXT_PATH / "center.png").convert("RGBA")
elements = {
"ice": Image.open(TEXT_PATH / "IconNatureColorIce.png").convert("RGBA"),
"fire": Image.open(TEXT_PATH / "IconNatureColorFire.png").convert("RGBA"),
"imaginary": Image.open(TEXT_PATH / "IconNatureColorImaginary.png").convert("RGBA"),
"quantum": Image.open(TEXT_PATH / "IconNatureColorQuantum.png").convert("RGBA"),
"lightning": Image.open(TEXT_PATH / "IconNatureColorThunder.png").convert("RGBA"),
"wind": Image.open(TEXT_PATH / "IconNatureColorWind.png").convert("RGBA"),
"physical": Image.open(TEXT_PATH / "IconNaturePhysical.png").convert("RGBA"),
}
progresslist = { progresslist = {
1: "第一世界", 1: "第一世界",
@ -117,7 +107,8 @@ async def _draw_rogue_buff(
is_evoluted = 1 is_evoluted = 1
else: else:
is_evoluted = 0 is_evoluted = 0
buff_bg = Image.open(TEXT_PATH / f"zhufu_{item.rank}_{is_evoluted}.png") buff_bg_str = TEXT_PATH / f"zhufu_{item.rank}_{is_evoluted}.png"
buff_bg = Image.open(buff_bg_str)
buff_bg = buff_bg.resize((233, 35)) buff_bg = buff_bg.resize((233, 35))
z_left = 90 + 240 * zb_list[jishu][1] z_left = 90 + 240 * zb_list[jishu][1]
z_top = buff_height + 450 + 55 * zb_list[jishu][0] z_top = buff_height + 450 + 55 * zb_list[jishu][0]
@ -181,7 +172,8 @@ async def _draw_rogue_miracles(
zb_list.append([m, n]) zb_list.append([m, n])
jishu = 0 jishu = 0
for miracle in miracles: for miracle in miracles:
miracles_icon = (await get_roleinfo_icon(miracle.icon)).resize((80, 80)) miracles_icon = await get_roleinfo_icon(miracle.icon)
miracles_icon = miracles_icon.resize((80, 80))
z_left = 90 + 90 * zb_list[jishu][1] z_left = 90 + 90 * zb_list[jishu][1]
z_top = buff_height + 470 + 90 * zb_list[jishu][0] z_top = buff_height + 470 + 90 * zb_list[jishu][0]
jishu = jishu + 1 jishu = jishu + 1
@ -236,9 +228,8 @@ async def _draw_rogue_card(
async def draw_rogue_img( async def draw_rogue_img(
qid: Union[str, int], ev: Event,
uid: str, uid: str,
sender: Dict[str, Any],
floor: Optional[int] = None, floor: Optional[int] = None,
schedule_type: str = "3", schedule_type: str = "3",
) -> Union[bytes, str]: ) -> Union[bytes, str]:
@ -313,13 +304,7 @@ async def draw_rogue_img(
img.paste(rogue_title, (0, 0), rogue_title) img.paste(rogue_title, (0, 0), rogue_title)
# 获取头像 # 获取头像
_id = str(qid) char_pic = await _get_event_avatar(ev)
if _id.startswith("http"):
char_pic = await get_qq_avatar(avatar_url=_id)
elif sender.get("avatar") is not None:
char_pic = await get_qq_avatar(avatar_url=sender["avatar"])
else:
char_pic = await get_qq_avatar(qid=qid)
char_pic = await draw_pic_with_ring(char_pic, 250, None, False) char_pic = await draw_pic_with_ring(char_pic, 250, None, False)
img.paste(char_pic, (325, 132), char_pic) img.paste(char_pic, (325, 132), char_pic)
@ -393,16 +378,19 @@ async def draw_rogue_img(
floor_pic = Image.open(TEXT_PATH / "detail_bg.png").convert("RGBA") floor_pic = Image.open(TEXT_PATH / "detail_bg.png").convert("RGBA")
floor_pic = floor_pic.resize((900, detail_h_list[index_floor])) floor_pic = floor_pic.resize((900, detail_h_list[index_floor]))
floor_top_pic = Image.open(TEXT_PATH / "floor_bg_top.png").convert("RGBA") floor_top_pic = Image.open(TEXT_PATH / "floor_bg_top.png")
floor_top_pic = floor_top_pic.convert("RGBA")
floor_pic.paste(floor_top_pic, (0, 0), floor_top_pic) floor_pic.paste(floor_top_pic, (0, 0), floor_top_pic)
floor_center_pic = Image.open(TEXT_PATH / "floor_bg_center.png").convert("RGBA") floor_center_pic = Image.open(TEXT_PATH / "floor_bg_center.png")
floor_center_pic = floor_center_pic.convert("RGBA")
floor_center_pic = floor_center_pic.resize( floor_center_pic = floor_center_pic.resize(
(900, detail_h_list[index_floor] - 170) (900, detail_h_list[index_floor] - 170)
) )
floor_pic.paste(floor_center_pic, (0, 100), floor_center_pic) floor_pic.paste(floor_center_pic, (0, 100), floor_center_pic)
floor_bot_pic = Image.open(TEXT_PATH / "floor_bg_bot.png").convert("RGBA") floor_bot_pic = Image.open(TEXT_PATH / "floor_bg_bot.png")
floor_bot_pic = floor_bot_pic.convert("RGBA")
floor_pic.paste( floor_pic.paste(
floor_bot_pic, (0, detail_h_list[index_floor] - 70), floor_bot_pic floor_bot_pic, (0, detail_h_list[index_floor] - 70), floor_bot_pic
) )
@ -490,7 +478,11 @@ async def draw_rogue_img(
sr_font_34, sr_font_34,
"lm", "lm",
) )
floor_pic.paste(content_center, (0, 370 + buff_height + 80), content_center) floor_pic.paste(
content_center,
(0, 370 + buff_height + 80),
content_center
)
await _draw_rogue_miracles( await _draw_rogue_miracles(
detail.miracles, detail.miracles,
floor_pic, floor_pic,
@ -516,9 +508,8 @@ async def draw_rogue_img(
async def draw_rogue_locust_img( async def draw_rogue_locust_img(
qid: Union[str, int], ev: Event,
uid: str, uid: str,
sender: Dict[str, Any],
) -> Union[bytes, str]: ) -> Union[bytes, str]:
raw_rogue_data = await mys_api.get_rogue_locust_info(uid, "3") raw_rogue_data = await mys_api.get_rogue_locust_info(uid, "3")
@ -591,13 +582,7 @@ async def draw_rogue_locust_img(
img.paste(rogue_title, (0, 0), rogue_title) img.paste(rogue_title, (0, 0), rogue_title)
# 获取头像 # 获取头像
_id = str(qid) char_pic = await _get_event_avatar(ev)
if _id.startswith("http"):
char_pic = await get_qq_avatar(avatar_url=_id)
elif sender.get("avatar") is not None:
char_pic = await get_qq_avatar(avatar_url=sender["avatar"])
else:
char_pic = await get_qq_avatar(qid=qid)
char_pic = await draw_pic_with_ring(char_pic, 250, None, False) char_pic = await draw_pic_with_ring(char_pic, 250, None, False)
img.paste(char_pic, (325, 132), char_pic) img.paste(char_pic, (325, 132), char_pic)
@ -665,16 +650,19 @@ async def draw_rogue_locust_img(
floor_pic = Image.open(TEXT_PATH / "detail_bg.png").convert("RGBA") floor_pic = Image.open(TEXT_PATH / "detail_bg.png").convert("RGBA")
floor_pic = floor_pic.resize((900, detail_h_list[index_floor])) floor_pic = floor_pic.resize((900, detail_h_list[index_floor]))
floor_top_pic = Image.open(TEXT_PATH / "floor_bg_top.png").convert("RGBA") floor_top_pic = Image.open(TEXT_PATH / "floor_bg_top.png")
floor_top_pic = floor_top_pic.convert("RGBA")
floor_pic.paste(floor_top_pic, (0, 0), floor_top_pic) floor_pic.paste(floor_top_pic, (0, 0), floor_top_pic)
floor_center_pic = Image.open(TEXT_PATH / "floor_bg_center.png").convert("RGBA") floor_center_pic = Image.open(TEXT_PATH / "floor_bg_center.png")
floor_center_pic = floor_center_pic.convert("RGBA")
floor_center_pic = floor_center_pic.resize( floor_center_pic = floor_center_pic.resize(
(900, detail_h_list[index_floor] - 170) (900, detail_h_list[index_floor] - 170)
) )
floor_pic.paste(floor_center_pic, (0, 100), floor_center_pic) floor_pic.paste(floor_center_pic, (0, 100), floor_center_pic)
floor_bot_pic = Image.open(TEXT_PATH / "floor_bg_bot.png").convert("RGBA") floor_bot_pic = Image.open(TEXT_PATH / "floor_bg_bot.png")
floor_bot_pic = floor_bot_pic.convert("RGBA")
floor_pic.paste( floor_pic.paste(
floor_bot_pic, (0, detail_h_list[index_floor] - 70), floor_bot_pic floor_bot_pic, (0, detail_h_list[index_floor] - 70), floor_bot_pic
) )

View File

@ -24,8 +24,8 @@ async def send_role_info(bot: Bot, ev: Event):
return "你还没有绑定UID噢,请使用[sr绑定uid123]完成绑定!" return "你还没有绑定UID噢,请使用[sr绑定uid123]完成绑定!"
logger.info(f"[sr查询信息]UID: {uid}") logger.info(f"[sr查询信息]UID: {uid}")
await bot.logger.info("开始执行[sr查询信息]") logger.info("开始执行[sr查询信息]")
await bot.send(await get_role_img(uid)) await bot.send(await get_role_img(ev, uid))
return None return None
@ -39,6 +39,6 @@ async def send_detail_info(bot: Bot, ev: Event):
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
logger.info(f"[sr查询信息]UID: {uid}") logger.info(f"[sr查询信息]UID: {uid}")
await bot.logger.info("开始执行[sr查询信息]") logger.info("开始执行[sr查询信息]")
await bot.send(await get_detail_img(user_id, uid, ev.sender)) await bot.send(await get_detail_img(ev, uid))
return None return None

View File

@ -1,24 +1,18 @@
import asyncio import asyncio
from pathlib import Path from pathlib import Path
from typing import Any, Dict, Generator, List, Optional, TypeVar, Union from typing import Dict, List, Union, TypeVar, Optional, Generator
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 from gsuid_core.utils.error_reply import get_error
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 ( from gsuid_core.utils.image.image_tools import draw_pic_with_ring
draw_pic_with_ring,
get_qq_avatar,
)
from ..sruid_utils.api.mys.models import ( from ..utils.mys_api import mys_api
AvatarDetail,
AvatarListItem,
AvatarListItemDetail,
RoleBasicInfo,
Stats,
)
from ..utils.fonts.first_world import fw_font_24 from ..utils.fonts.first_world import fw_font_24
from ..utils.resource.get_pic_from import get_roleinfo_icon
from ..utils.image.image_tools import elements, _get_event_avatar
from ..utils.fonts.starrail_fonts import ( from ..utils.fonts.starrail_fonts import (
sr_font_22, sr_font_22,
sr_font_24, sr_font_24,
@ -26,15 +20,20 @@ from ..utils.fonts.starrail_fonts import (
sr_font_30, sr_font_30,
sr_font_36, sr_font_36,
) )
from ..utils.mys_api import mys_api from ..sruid_utils.api.mys.models import (
from ..utils.resource.get_pic_from import get_roleinfo_icon Stats,
AvatarDetail,
RoleBasicInfo,
AvatarListItem,
AvatarListItemDetail,
)
TEXT_PATH = Path(__file__).parent / "texture2D" TEXT_PATH = Path(__file__).parent / "texture2D"
bg1 = Image.open(TEXT_PATH / "bg1.png") bg1 = Image.open(TEXT_PATH / "bg1.png")
bg2 = Image.open(TEXT_PATH / "bg2.png") bg2 = Image.open(TEXT_PATH / "bg2.png")
bg3 = Image.open(TEXT_PATH / "bg3.png") bg3 = Image.open(TEXT_PATH / "bg3.png")
user_avatar = Image.open(TEXT_PATH / "200101.png").resize((220, 220)).convert("RGBA")
char_bg_4 = Image.open(TEXT_PATH / "rarity4_bg.png").convert("RGBA") char_bg_4 = Image.open(TEXT_PATH / "rarity4_bg.png").convert("RGBA")
char_bg_5 = Image.open(TEXT_PATH / "rarity5_bg.png").convert("RGBA") char_bg_5 = Image.open(TEXT_PATH / "rarity5_bg.png").convert("RGBA")
circle = Image.open(TEXT_PATH / "char_weapon_bg.png").convert("RGBA") circle = Image.open(TEXT_PATH / "char_weapon_bg.png").convert("RGBA")
@ -45,23 +44,16 @@ white_color = (255, 255, 255)
color_color = (40, 18, 7) color_color = (40, 18, 7)
first_color = (22, 8, 31) first_color = (22, 8, 31)
elements = {
"ice": Image.open(TEXT_PATH / "IconNatureColorIce.png").convert("RGBA"), async def get_role_img(ev: Event, uid: str) -> Union[bytes, str]:
"fire": Image.open(TEXT_PATH / "IconNatureColorFire.png").convert("RGBA"), return await draw_role_card(ev, uid)
"imaginary": Image.open(TEXT_PATH / "IconNatureColorImaginary.png").convert("RGBA"),
"quantum": Image.open(TEXT_PATH / "IconNatureColorQuantum.png").convert("RGBA"),
"lightning": Image.open(TEXT_PATH / "IconNatureColorThunder.png").convert("RGBA"),
"wind": Image.open(TEXT_PATH / "IconNatureColorWind.png").convert("RGBA"),
"physical": Image.open(TEXT_PATH / "IconNaturePhysical.png").convert("RGBA"),
}
async def get_role_img(uid: str) -> Union[bytes, str]: async def get_detail_img(
return await draw_role_card(uid) ev: Event,
uid: str,
) -> Union[bytes, str]:
async def get_detail_img(qid: Union[str, int], uid: str, sender) -> Union[bytes, str]: return await get_detail_card(ev, uid)
return await get_detail_card(qid, uid, sender)
def _lv(level: int) -> str: def _lv(level: int) -> str:
@ -73,11 +65,11 @@ T = TypeVar("T")
def wrap_list(lst: List[T], n: int) -> Generator[List[T], None, None]: def wrap_list(lst: List[T], n: int) -> Generator[List[T], None, None]:
for i in range(0, len(lst), n): for i in range(0, len(lst), n):
yield lst[i : i + n] yield lst[i : i + n] # noqa: E203
async def _draw_card_1( async def _draw_card_1(
sr_uid: str, role_basic_info: RoleBasicInfo, stats: Stats ev: Event, sr_uid: str, role_basic_info: RoleBasicInfo, stats: Stats
) -> Image.Image: ) -> Image.Image:
# 名称 # 名称
nickname = role_basic_info.nickname nickname = role_basic_info.nickname
@ -96,7 +88,13 @@ async def _draw_card_1(
bg1_draw = ImageDraw.Draw(img_bg1) bg1_draw = ImageDraw.Draw(img_bg1)
# 写Nickname # 写Nickname
bg1_draw.text((400, 85), nickname, font=sr_font_36, fill=white_color, anchor="mm") bg1_draw.text(
(400, 85),
nickname,
font=sr_font_36,
fill=white_color,
anchor="mm"
)
# 写UID # 写UID
bg1_draw.text( bg1_draw.text(
(400, 165), (400, 165),
@ -106,6 +104,8 @@ async def _draw_card_1(
anchor="mm", anchor="mm",
) )
# 贴头像 # 贴头像
user_avatar = await _get_event_avatar(ev)
user_avatar = await draw_pic_with_ring(user_avatar, 128, None, False)
img_bg1.paste(user_avatar, (286, 213), mask=user_avatar) img_bg1.paste(user_avatar, (286, 213), mask=user_avatar)
# 写基本信息 # 写基本信息
@ -208,7 +208,10 @@ async def _draw_card_2(
) -> Image.Image: ) -> Image.Image:
# 角色部分 每五个一组 # 角色部分 每五个一组
lines = await asyncio.gather( lines = await asyncio.gather(
*[_draw_line(five_avatars, equips) for five_avatars in wrap_list(avatars, 5)] *[
_draw_line(five_avatars, equips)
for five_avatars in wrap_list(avatars, 5)
]
) )
img_card_2 = Image.new("RGBA", (800, len(lines) * 200)) img_card_2 = Image.new("RGBA", (800, len(lines) * 200))
@ -219,7 +222,7 @@ async def _draw_card_2(
return img_card_2 return img_card_2
async def draw_role_card(sr_uid: str) -> Union[bytes, str]: async def draw_role_card(ev: Event, sr_uid: str) -> Union[bytes, str]:
role_index = await mys_api.get_role_index(sr_uid) role_index = await mys_api.get_role_index(sr_uid)
# deal with hoyolab with no nickname and level api # deal with hoyolab with no nickname and level api
if int(str(sr_uid)[0]) < 6: if int(str(sr_uid)[0]) < 6:
@ -251,7 +254,7 @@ async def draw_role_card(sr_uid: str) -> Union[bytes, str]:
# 绘制总图 # 绘制总图
img1, img2 = await asyncio.gather( img1, img2 = await asyncio.gather(
*[ *[
_draw_card_1(sr_uid, role_basic_info, stats), # type: ignore _draw_card_1(ev, sr_uid, role_basic_info, stats), # type: ignore
_draw_card_2(avatars, equips), _draw_card_2(avatars, equips),
] ]
) )
@ -336,7 +339,8 @@ async def _draw_detail_card(
) )
if avatar.equip: if avatar.equip:
equip_icon = (await get_roleinfo_icon(avatar.equip.icon)).resize((50, 50)) equip_icon = await get_roleinfo_icon(avatar.equip.icon)
equip_icon = equip_icon.resize((50, 50))
avatar_img.paste(equip_icon, (595, 5), mask=equip_icon) avatar_img.paste(equip_icon, (595, 5), mask=equip_icon)
avatar_draw.text( avatar_draw.text(
@ -368,9 +372,7 @@ async def _draw_detail_card(
return char_info return char_info
async def get_detail_card( async def get_detail_card(ev: Event, sr_uid: str) -> Union[bytes, str]:
qid: Union[str, int], sr_uid: str, sender: Dict[str, Any]
) -> Union[bytes, str]:
# 获取角色列表 # 获取角色列表
avatar_list = await mys_api.get_avatar_info(sr_uid, 1001) avatar_list = await mys_api.get_avatar_info(sr_uid, 1001)
if isinstance(avatar_list, int): if isinstance(avatar_list, int):
@ -388,19 +390,19 @@ async def get_detail_card(
char_info.paste(char_title, (0, 0), char_title) char_info.paste(char_title, (0, 0), char_title)
# 获取头像 # 获取头像
_id = str(qid) char_pic = await _get_event_avatar(ev)
if _id.startswith("http"):
char_pic = await get_qq_avatar(avatar_url=_id)
elif sender.get("avatar") is not None:
char_pic = await get_qq_avatar(avatar_url=sender["avatar"])
else:
char_pic = await get_qq_avatar(qid=qid)
char_pic = await draw_pic_with_ring(char_pic, 250, None, False) char_pic = await draw_pic_with_ring(char_pic, 250, None, False)
char_info.paste(char_pic, (400, 88), char_pic) char_info.paste(char_pic, (400, 88), char_pic)
# 绘制抬头 # 绘制抬头
char_img_draw.text((525, 420), f"UID {sr_uid}", white_color, sr_font_28, "mm") char_img_draw.text(
(525, 420),
f"UID {sr_uid}",
white_color,
sr_font_28,
"mm",
)
title_img = Image.open(TEXT_PATH / "bar_title.png") title_img = Image.open(TEXT_PATH / "bar_title.png")
char_info.paste(title_img, (0, 515), mask=title_img) char_info.paste(title_img, (0, 515), mask=title_img)
@ -418,9 +420,11 @@ async def get_detail_card(
) )
# 写底层文字 # 写底层文字
text1 = 'SR skill statistics by StarrailUID'
text2 = 'Code by jiluoQAQ & Power by GsCore'
char_img_draw.text( char_img_draw.text(
(525, img_height - 45), (525, img_height - 45),
"--SR skill statistics by StarrailUID & Code by jiluoQAQ & Power by GsCore--", f"--{text1} & {text2}--",
(255, 255, 255), (255, 255, 255),
fw_font_24, fw_font_24,
"mm", "mm",

View File

@ -30,7 +30,7 @@ async def get_sign_func(bot: Bot, ev: Event):
@sv_sign_config.on_fullmatch("全部重签") @sv_sign_config.on_fullmatch("全部重签")
async def recheck(bot: Bot, ev: Event): async def recheck(bot: Bot, ev: Event):
await bot.logger.info("开始执行[全部重签]") logger.info("开始执行[全部重签]")
await bot.send("[星穹铁道] [全部重签] 已开始执行!") await bot.send("[星穹铁道] [全部重签] 已开始执行!")
result = await daily_sign("sr") result = await daily_sign("sr")
if not IS_REPORT: if not IS_REPORT:

View File

@ -22,11 +22,11 @@ sv_get_stamina_admin = SV("sr强制推送", pm=1)
@sv_get_stamina.on_fullmatch("当前状态") @sv_get_stamina.on_fullmatch("当前状态")
async def send_daily_info(bot: Bot, ev: Event): async def send_daily_info(bot: Bot, ev: Event):
await bot.logger.info("开始执行[sr每日信息文字版]") logger.info("开始执行[sr每日信息文字版]")
uid = await get_uid(bot, ev, GsBind, "sr") uid = await get_uid(bot, ev, GsBind, "sr")
if uid is None: if uid is None:
return await bot.send(UID_HINT) return await bot.send(UID_HINT)
await bot.logger.info(f"[sr每日信息文字版]UID: {uid}") logger.info(f"[sr每日信息文字版]UID: {uid}")
im = await get_stamina_text(uid) im = await get_stamina_text(uid)
await bot.send(im) await bot.send(im)
@ -35,7 +35,7 @@ async def send_daily_info(bot: Bot, ev: Event):
@sv_get_stamina_admin.on_fullmatch("强制推送体力提醒") @sv_get_stamina_admin.on_fullmatch("强制推送体力提醒")
async def force_notice_job(bot: Bot, ev: Event): async def force_notice_job(bot: Bot, ev: Event):
await bot.logger.info("开始执行[sr强制推送体力信息]") logger.info("开始执行[sr强制推送体力信息]")
await sr_notice_job() await sr_notice_job()
@ -80,9 +80,9 @@ async def sr_notice_job():
) )
) )
async def send_daily_info_pic(bot: Bot, ev: Event): async def send_daily_info_pic(bot: Bot, ev: Event):
await bot.logger.info("开始执行[sr每日信息]") logger.info("开始执行[sr每日信息]")
user_id = ev.at if ev.at else ev.user_id user_id = ev.at if ev.at else ev.user_id
await bot.logger.info(f"[sr每日信息]QQ号: {user_id}") logger.info(f"[sr每日信息]QQ号: {user_id}")
im = await get_stamina_img(bot.bot_id, user_id) im = await get_stamina_img(bot.bot_id, user_id)
await bot.send(im) await bot.send(im)

View File

@ -1,6 +1,7 @@
from gsuid_core.sv import SV from gsuid_core.sv import SV
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.models import Event from gsuid_core.models import Event
from gsuid_core.logger import logger
from gsuid_core.utils.database.models import GsBind from gsuid_core.utils.database.models import GsBind
from ..utils.message import send_diff_msg from ..utils.message import send_diff_msg
@ -12,11 +13,11 @@ sv_user_info = SV("sr用户信息")
@sv_user_info.on_fullmatch("绑定信息") @sv_user_info.on_fullmatch("绑定信息")
async def send_bind_card(bot: Bot, ev: Event): async def send_bind_card(bot: Bot, ev: Event):
await bot.logger.info("sr开始执行[查询用户绑定状态]") logger.info("sr开始执行[查询用户绑定状态]")
uid_list = await get_user_card(ev.bot_id, ev.user_id) uid_list = await get_user_card(ev.bot_id, ev.user_id)
if not uid_list: if not uid_list:
return await bot.send("你还没有绑定SR_UID哦!") return await bot.send("你还没有绑定SR_UID哦!")
await bot.logger.info("sr[查询用户绑定状态]完成!等待图片发送中...") logger.info("sr[查询用户绑定状态]完成!等待图片发送中...")
await bot.send(uid_list) await bot.send(uid_list)
return None return None
@ -34,9 +35,9 @@ async def send_bind_card(bot: Bot, ev: Event):
) )
) )
async def send_link_uid_msg(bot: Bot, ev: Event): async def send_link_uid_msg(bot: Bot, ev: Event):
await bot.logger.info("sr开始执行[绑定/解绑用户信息]") logger.info("sr开始执行[绑定/解绑用户信息]")
qid = ev.user_id qid = ev.user_id
await bot.logger.info(f"sr[绑定/解绑]UserID: {qid}") logger.info(f"sr[绑定/解绑]UserID: {qid}")
sr_uid = ev.text.strip() sr_uid = ev.text.strip()
if sr_uid and not sr_uid.isdigit(): if sr_uid and not sr_uid.isdigit():

View File

@ -3,6 +3,7 @@ import re
from gsuid_core.sv import SV from gsuid_core.sv import SV
from gsuid_core.bot import Bot from gsuid_core.bot import Bot
from gsuid_core.models import Event from gsuid_core.models import Event
from gsuid_core.logger import logger
from gsuid_core.utils.image.convert import convert_img from gsuid_core.utils.image.convert import convert_img
from ..utils.name_covert import ( from ..utils.name_covert import (
@ -28,7 +29,7 @@ sv_sr_guide = SV("星铁攻略")
@sv_sr_wiki.on_prefix("角色图鉴") @sv_sr_wiki.on_prefix("角色图鉴")
async def send_role_wiki_pic(bot: Bot, ev: Event): async def send_role_wiki_pic(bot: Bot, ev: Event):
char_name = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text)) char_name = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text))
await bot.logger.info(f"开始获取{char_name}图鉴") logger.info(f"开始获取{char_name}图鉴")
if "开拓者" in str(char_name): if "开拓者" in str(char_name):
char_name = "开拓者" char_name = "开拓者"
char_id = await name_to_avatar_id(char_name) char_id = await name_to_avatar_id(char_name)
@ -38,16 +39,16 @@ async def send_role_wiki_pic(bot: Bot, ev: Event):
img = WIKI_ROLE_PATH / f"{char_id}.png" img = WIKI_ROLE_PATH / f"{char_id}.png"
if img.exists(): if img.exists():
img = await convert_img(img) img = await convert_img(img)
await bot.logger.info(f"获得{char_name}图鉴图片成功!") logger.info(f"获得{char_name}图鉴图片成功!")
await bot.send(img) await bot.send(img)
else: else:
await bot.logger.warning(f"未找到{char_name}图鉴图片") logger.warning(f"未找到{char_name}图鉴图片")
@sv_sr_guide.on_prefix("角色攻略") @sv_sr_guide.on_prefix("角色攻略")
async def send_role_guide_pic(bot: Bot, ev: Event): async def send_role_guide_pic(bot: Bot, ev: Event):
char_name = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text)) char_name = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text))
await bot.logger.info(f"开始获取{char_name}图鉴") logger.info(f"开始获取{char_name}图鉴")
char_id = await alias_to_char_id(char_name) char_id = await alias_to_char_id(char_name)
if char_id is None: if char_id is None:
if "开拓者" in str(char_name): if "开拓者" in str(char_name):
@ -59,44 +60,44 @@ async def send_role_guide_pic(bot: Bot, ev: Event):
img = GUIDE_CHARACTER_PATH / f"{char_id}.png" img = GUIDE_CHARACTER_PATH / f"{char_id}.png"
if img.exists(): if img.exists():
img = await convert_img(img) img = await convert_img(img)
await bot.logger.info(f"获得{char_id}图鉴图片成功!") logger.info(f"获得{char_id}图鉴图片成功!")
await bot.send(img) await bot.send(img)
else: else:
await bot.logger.warning(f"未找到{char_id}图鉴图片") logger.warning(f"未找到{char_id}图鉴图片")
@sv_sr_guide.on_prefix("光锥攻略") @sv_sr_guide.on_prefix("光锥攻略")
async def send_weapon_guide_pic(bot: Bot, ev: Event): async def send_weapon_guide_pic(bot: Bot, ev: Event):
msg = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text)) msg = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text))
await bot.logger.info(f"开始获取{msg}图鉴") logger.info(f"开始获取{msg}图鉴")
light_cone_id = await name_to_weapon_id(msg) light_cone_id = await name_to_weapon_id(msg)
img = GUIDE_LIGHT_CONE_PATH / f"{light_cone_id}.png" img = GUIDE_LIGHT_CONE_PATH / f"{light_cone_id}.png"
if img.exists(): if img.exists():
img = await convert_img(img) img = await convert_img(img)
await bot.logger.info(f"获得{light_cone_id}光锥图片成功!") logger.info(f"获得{light_cone_id}光锥图片成功!")
await bot.send(img) await bot.send(img)
else: else:
await bot.logger.warning(f"未找到{light_cone_id}光锥图片") logger.warning(f"未找到{light_cone_id}光锥图片")
@sv_sr_wiki.on_prefix("遗器") @sv_sr_wiki.on_prefix("遗器")
async def send_relic_wiki_pic(bot: Bot, ev: Event): async def send_relic_wiki_pic(bot: Bot, ev: Event):
msg = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text)) msg = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text))
await bot.logger.info(f"开始获取{msg}遗器") logger.info(f"开始获取{msg}遗器")
set_id = await name_to_relic_set_id(msg) set_id = await name_to_relic_set_id(msg)
img = WIKI_RELIC_PATH / f"{set_id}.png" img = WIKI_RELIC_PATH / f"{set_id}.png"
if img.exists(): if img.exists():
img = await convert_img(img) img = await convert_img(img)
await bot.logger.info(f"获得{msg}遗器图片成功!") logger.info(f"获得{msg}遗器图片成功!")
await bot.send(img) await bot.send(img)
else: else:
await bot.logger.warning(f"未找到{msg}遗器图片") logger.warning(f"未找到{msg}遗器图片")
@sv_sr_wiki.on_prefix("突破材料") @sv_sr_wiki.on_prefix("突破材料")
async def send_material_for_role_wiki_pic(bot: Bot, ev: Event): async def send_material_for_role_wiki_pic(bot: Bot, ev: Event):
char_name = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text)) char_name = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text))
await bot.logger.info(f"开始获取{char_name}突破材料") logger.info(f"开始获取{char_name}突破材料")
if "开拓者" in str(char_name): if "开拓者" in str(char_name):
char_name = "开拓者" char_name = "开拓者"
char_id = await name_to_avatar_id(char_name) char_id = await name_to_avatar_id(char_name)
@ -106,21 +107,21 @@ async def send_material_for_role_wiki_pic(bot: Bot, ev: Event):
img = WIKI_MATERIAL_FOR_ROLE / f"{char_id}.png" img = WIKI_MATERIAL_FOR_ROLE / f"{char_id}.png"
if img.exists(): if img.exists():
img = await convert_img(img) img = await convert_img(img)
await bot.logger.info(f"获得{char_name}突破材料图片成功!") logger.info(f"获得{char_name}突破材料图片成功!")
await bot.send(img) await bot.send(img)
else: else:
await bot.logger.warning(f"未找到{char_name}突破材料图片") logger.warning(f"未找到{char_name}突破材料图片")
@sv_sr_wiki.on_prefix("武器") @sv_sr_wiki.on_prefix("武器")
async def send_light_cone_wiki_pic(bot: Bot, ev: Event): async def send_light_cone_wiki_pic(bot: Bot, ev: Event):
msg = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text)) msg = " ".join(re.findall("[\u4e00-\u9fa5]+", ev.text))
await bot.logger.info(f"开始获取{msg}武器") logger.info(f"开始获取{msg}武器")
light_cone_id = await name_to_weapon_id(msg) light_cone_id = await name_to_weapon_id(msg)
img = WIKI_LIGHT_CONE_PATH / f"{light_cone_id}.png" img = WIKI_LIGHT_CONE_PATH / f"{light_cone_id}.png"
if img.exists(): if img.exists():
img = await convert_img(img) img = await convert_img(img)
await bot.logger.info(f"获得{msg}武器图片成功!") logger.info(f"获得{msg}武器图片成功!")
await bot.send(img) await bot.send(img)
else: else:
await bot.logger.warning(f"未找到{msg}武器图片") logger.warning(f"未找到{msg}武器图片")

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -2,13 +2,39 @@ from pathlib import Path
from typing import Union from typing import Union
from PIL import Image from PIL import Image
from gsuid_core.utils.image.image_tools import CustomizeImage from gsuid_core.models import Event
from gsuid_core.utils.image.image_tools import CustomizeImage, get_event_avatar
from ..resource.RESOURCE_PATH import CU_BG_PATH from ..resource.RESOURCE_PATH import CU_BG_PATH, CHAR_ICON_PATH
BG_PATH = Path(__file__).parent / "bg" BG_PATH = Path(__file__).parent / "bg"
NM_BG_PATH = BG_PATH / "nm_bg" NM_BG_PATH = BG_PATH / "nm_bg"
TEXT_PATH = Path(__file__).parent / "texture2d" TEXT_PATH = Path(__file__).parent / "texture2d"
NATURE_ICON_PATH = Path(__file__).parent / "icon_nature"
elements = {
"ice": Image.open(
NATURE_ICON_PATH / "IconNatureColorIce.png"
).convert("RGBA"),
"fire": Image.open(
NATURE_ICON_PATH / "IconNatureColorFire.png"
).convert("RGBA"),
"imaginary": Image.open(
NATURE_ICON_PATH / "IconNatureColorImaginary.png"
).convert("RGBA"),
"quantum": Image.open(
NATURE_ICON_PATH / "IconNatureColorQuantum.png"
).convert("RGBA"),
"lightning": Image.open(
NATURE_ICON_PATH / "IconNatureColorThunder.png"
).convert("RGBA"),
"wind": Image.open(
NATURE_ICON_PATH / "IconNatureColorWind.png"
).convert("RGBA"),
"physical": Image.open(
NATURE_ICON_PATH / "IconNaturePhysical.png"
).convert("RGBA"),
}
if list(CU_BG_PATH.iterdir()) != []: if list(CU_BG_PATH.iterdir()) != []:
bg_path = CU_BG_PATH bg_path = CU_BG_PATH
@ -30,3 +56,7 @@ async def get_simple_bg(
def get_footer(): def get_footer():
return Image.open(TEXT_PATH / 'footer.png') return Image.open(TEXT_PATH / 'footer.png')
async def _get_event_avatar(event: Event) -> Image.Image:
return await get_event_avatar(event, CHAR_ICON_PATH)