mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-03 02:30:01 +08:00
修改优化开箱显示图片
This commit is contained in:
@@ -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}")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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}"
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user