修改优化开箱显示图片

This commit is contained in:
HibiKier
2023-04-01 01:50:34 +08:00
parent 4e35090ba6
commit 0c7c7f3987
16 changed files with 202 additions and 106 deletions
+4 -2
View File
@@ -235,7 +235,7 @@ async def _(event: MessageEvent, arg: Message = CommandArg(), cmd: str = OneComm
await update_case.finish(f"未登录, 已停止更新...")
rand = random.randint(300, 500)
result = f"更新全部{type_}完成"
if i < len(case_list):
if i < len(case_list) - 1:
next_case = case_list[i + 1]
result = f"将在 {rand} 秒后更新下一{type_}: {next_case}"
await update_case.send(f"{info}, {result}")
@@ -248,7 +248,9 @@ async def _(event: MessageEvent, arg: Message = CommandArg(), cmd: str = OneComm
else:
await update_case.send(f"开始{cmd}: {msg}, 请稍等")
try:
await update_case.send(await update_skin_data(msg, is_update_case_name), at_sender=True)
await update_case.send(
await update_skin_data(msg, is_update_case_name), at_sender=True
)
except Exception as e:
logger.error(f"{cmd}: {msg}", e=e)
await update_case.send(f"成功{cmd}: {msg} 发生错误: {type(e)}: {e}")
+56 -5
View File
@@ -14,6 +14,56 @@ BASE_PATH = IMAGE_PATH / "csgo_cases"
ICON_PATH = IMAGE_PATH / "_icon"
async def draw_card(skin: BuffSkin, rand: str) -> BuildImage:
"""构造抽取图片
Args:
skin (BuffSkin): BuffSkin
rand (str): 磨损
Returns:
BuildImage: BuildImage
"""
name = skin.name + "-" + skin.skin_name + "-" + skin.abrasion
file_path = BASE_PATH / cn2py(skin.case_name.split(",")[0]) / f"{cn2py(name)}.jpg"
if not file_path.exists():
logger.warning(f"皮肤图片: {name} 不存在", "开箱")
skin_bk = BuildImage(
460, 200, color=(25, 25, 25, 100), font_size=25, font="CJGaoDeGuo.otf"
)
if file_path.exists():
skin_image = BuildImage(205, 153, background=file_path)
await skin_bk.apaste(skin_image, (10, 30), alpha=True)
await skin_bk.aline((220, 10, 220, 180))
await skin_bk.atext((10, 10), skin.name, (255, 255, 255))
name_icon = BuildImage(20, 20, background=ICON_PATH / "name_white.png")
await skin_bk.apaste(name_icon, (240, 13), True)
await skin_bk.atext((265, 15), f"名称:", (255, 255, 255), font_size=20)
await skin_bk.atext(
(300, 9),
f"{skin.skin_name + ('(St)' if skin.is_stattrak else '')}",
(255, 255, 255),
)
tone_icon = BuildImage(20, 20, background=ICON_PATH / "tone_white.png")
await skin_bk.apaste(tone_icon, (240, 45), True)
await skin_bk.atext((265, 45), "品质:", (255, 255, 255), font_size=20)
await skin_bk.atext((300, 40), COLOR2NAME[skin.color][:2], COLOR2COLOR[skin.color])
type_icon = BuildImage(20, 20, background=ICON_PATH / "type_white.png")
await skin_bk.apaste(type_icon, (240, 73), True)
await skin_bk.atext((265, 75), "类型:", (255, 255, 255), font_size=20)
await skin_bk.atext((300, 70), skin.weapon_type, (255, 255, 255))
price_icon = BuildImage(20, 20, background=ICON_PATH / "price_white.png")
await skin_bk.apaste(price_icon, (240, 103), True)
await skin_bk.atext((265, 105), "价格:", (255, 255, 255), font_size=20)
await skin_bk.atext((300, 102), str(skin.sell_min_price), (0, 255, 98))
abrasion_icon = BuildImage(20, 20, background=ICON_PATH / "abrasion_white.png")
await skin_bk.apaste(abrasion_icon, (240, 133), True)
await skin_bk.atext((265, 135), "磨损:", (255, 255, 255), font_size=20)
await skin_bk.atext((300, 130), skin.abrasion, (255, 255, 255))
await skin_bk.atext((228, 165), f"({rand})", (255, 255, 255))
return skin_bk
async def generate_skin(skin: BuffSkin, update_count: int) -> Optional[BuildImage]:
"""构造皮肤图片
@@ -27,13 +77,13 @@ async def generate_skin(skin: BuffSkin, update_count: int) -> Optional[BuildImag
file_path = BASE_PATH / cn2py(skin.case_name.split(",")[0]) / f"{cn2py(name)}.jpg"
if not file_path.exists():
logger.warning(f"皮肤图片: {name} 不存在", "查看武器箱")
return None
if skin.color == "CASE":
skin_img = BuildImage(200, 200, background=file_path)
case_bk = BuildImage(
700, 200, color=(25, 25, 25, 100), font_size=25, font="CJGaoDeGuo.otf"
)
await case_bk.apaste(skin_img, (10, 10), True)
if file_path.exists():
skin_img = BuildImage(200, 200, background=file_path)
await case_bk.apaste(skin_img, (10, 10), True)
await case_bk.aline((250, 10, 250, 190))
await case_bk.aline((280, 160, 660, 160))
name_icon = BuildImage(30, 30, background=ICON_PATH / "box_white.png")
@@ -86,11 +136,12 @@ async def generate_skin(skin: BuffSkin, update_count: int) -> Optional[BuildImag
skin_bk = BuildImage(
235, 250, color=(25, 25, 25, 100), font_size=25, font="CJGaoDeGuo.otf"
)
skin_image = BuildImage(205, 153, background=file_path)
if file_path.exists():
skin_image = BuildImage(205, 153, background=file_path)
await skin_bk.apaste(skin_image, (10, 30), alpha=True)
update_count_icon = BuildImage(
35, 35, background=ICON_PATH / "reload_white.png"
)
await skin_bk.apaste(skin_image, (10, 30), alpha=True)
await skin_bk.aline((10, 180, 220, 180))
await skin_bk.atext((10, 10), skin.name, (255, 255, 255))
await skin_bk.apaste(update_count_icon, (140, 10), True)
+1 -1
View File
@@ -72,7 +72,7 @@ class BuffSkin(Model):
) -> List["BuffSkin"]: # type: ignore
query = cls
if case_name:
query = query.filter(case_name=case_name)
query = query.filter(case_name__contains=case_name)
query = query.filter(abrasion=abrasion, is_stattrak=is_stattrak, color=color)
skin_list = await query.annotate(rand=Random()).limit(num) # type:ignore
num_ = num
+24 -34
View File
@@ -14,6 +14,7 @@ from utils.image_utils import BuildImage
from utils.message_builder import image
from utils.utils import cn2py
from .build_image import draw_card
from .config import *
from .models.open_cases_log import OpenCasesLog
from .models.open_cases_user import OpenCasesUser
@@ -147,14 +148,11 @@ async def open_case(user_qq: int, group_id: int, case_name: str) -> Union[str, M
)
logger.debug(f"添加 1 条开箱日志", "开箱", user_qq, group_id)
over_count = max_count - user.today_open_total
img = await draw_card(skin, rand)
return (
f"开启{case_name}武器箱.\n剩余开箱次数:{over_count}.\n"
+ image(img_path)
+ "\n"
+ f"皮肤:[{COLOR2NAME[skin.color]}]{skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion})\n"
f"磨损:{rand}\n"
f"价格:{price_result}\n箱子单价:{case_price}\n花费:{17 + case_price:.2f}\n"
f":{ridicule_result}"
+ image(img)
+ f"\n箱子单价:{case_price}\n花费:{17 + case_price:.2f}\n:{ridicule_result}"
)
@@ -191,12 +189,7 @@ async def open_multiple_case(
f"今天开箱次数不足{num}次噢,请单抽试试看(也许单抽运气更好?)"
f"\n剩余开箱次数:{max_count - user.today_open_total}"
)
if num < 5:
h = 270
elif num % 5 == 0:
h = 270 * int(num / 5)
else:
h = 270 * int(num / 5) + 270
logger.debug(f"尝试开启武器箱: {case_name}", "开箱", user_qq, group_id)
case = cn2py(case_name)
skin_count = {}
img_list = []
@@ -212,32 +205,19 @@ async def open_multiple_case(
case_price = 0
if case_skin := await BuffSkin.get_or_none(case_name=case_name, color="CASE"):
case_price = case_skin.sell_min_price
cnt = 0
img_w, img_h = 0, 0
for skin, rand in skin_list:
img = await draw_card(skin, str(rand)[:11])
img_w, img_h = img.size
total_price += skin.sell_min_price
rand = str(rand)[:11]
add_count(user, skin, case_price)
color_name = COLOR2CN[skin.color]
if skin.is_stattrak:
color_name += "(暗金)"
if not skin_count.get(color_name):
skin_count[color_name] = 0
skin_count[color_name] += 1
name = skin.name + "-" + skin.skin_name + "-" + skin.abrasion
img_path = IMAGE_PATH / "csgo_cases" / case / f"{cn2py(name)}.jpg"
wImg = BuildImage(200, 270, 200, 200)
img = BuildImage(200, 200, background=img_path)
await wImg.apaste(img, (0, 0), True)
await wImg.atext(
(5, 200),
f"{skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion})",
)
cnt += 1
await wImg.atext((5, 220), f"磨损:{rand}")
await wImg.atext((5, 240), f"价格:{skin.sell_min_price}")
img_list.append(wImg)
add_count(user, skin, case_price)
img_list.append(img)
logger.info(
f"开启{case_name}武器箱获得 {skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion}) 磨损: [{rand}] 价格: {skin.sell_min_price}",
f"开启{case_name}武器箱获得 {skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion}) 磨损: [{rand:.11f}] 价格: {skin.sell_min_price}",
"开箱",
user_qq,
group_id,
@@ -261,16 +241,26 @@ async def open_multiple_case(
if log_list:
await OpenCasesLog.bulk_create(log_list, 10)
logger.debug(f"添加 {len(log_list)} 条开箱日志", "开箱", user_qq, group_id)
markImg = BuildImage(1000, h, 200, 270)
img_w += 10
img_h += 10
w = img_w * 5
if num < 5:
h = img_h - 10
w = img_w * num
elif not num % 5:
h = img_h * int(num / 5)
else:
h = img_h * int(num / 5) + img_h
markImg = BuildImage(w, h, img_w - 10, img_h - 10, 10)
for img in img_list:
markImg.paste(img)
markImg.paste(img, alpha=True)
over_count = max_count - user.today_open_total
result = ""
for color_name in skin_count:
result += f"[{color_name}:{skin_count[color_name]}] "
return (
f"开启{case_name}武器箱\n剩余开箱次数:{over_count}\n"
+ image(markImg.pic2bs4())
+ image(markImg)
+ "\n"
+ result[:-1]
+ f"\n箱子单价:{case_price}\n总获取金额:{total_price:.2f}\n总花费:{(17 + case_price) * num:.2f}"
+12 -2
View File
@@ -45,9 +45,19 @@ class CaseManager:
@classmethod
async def reload(cls):
cls.CURRENT_CASES = (
await BuffSkin.filter(case_name__not="未知武器箱").annotate().distinct().values_list("case_name", flat=True) # type: ignore
cls.CURRENT_CASES = []
case_list = await BuffSkin.filter(color="CASE").values_list(
"case_name", flat=True
)
for case_name in (
await BuffSkin.filter(case_name__not="未知武器箱")
.annotate()
.distinct()
.values_list("case_name", flat=True)
):
for name in case_name.split(","): # type: ignore
if name not in cls.CURRENT_CASES and name in case_list:
cls.CURRENT_CASES.append(name)
async def update_skin_data(name: str, is_update_case_name: bool = False) -> str: