mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-08 13:20:01 +08:00
refactor🎨: 重构红包功能
This commit is contained in:
@@ -1,19 +1,51 @@
|
||||
import asyncio
|
||||
import os
|
||||
import random
|
||||
from io import BytesIO
|
||||
from typing import Union
|
||||
from typing import Tuple, Union
|
||||
|
||||
from nonebot.adapters.onebot.v11 import Bot
|
||||
|
||||
from configs.config import NICKNAME, Config
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from models.bag_user import BagUser
|
||||
from utils.image_utils import BuildImage
|
||||
from utils.message_builder import image
|
||||
from utils.utils import get_user_avatar, is_number
|
||||
|
||||
from .model import RedbagUser
|
||||
from .config import FESTIVE_KEY, GroupRedBag, RedBag
|
||||
|
||||
|
||||
# 检查金币数量合法性,并添加记录数据
|
||||
async def check_gold(user_id: str, group_id: str, amount: Union[str, int]):
|
||||
async def end_festive_red_bag(bot: Bot, group_red_bag: GroupRedBag):
|
||||
"""结算节日红包
|
||||
|
||||
参数:
|
||||
bot: Bot
|
||||
group_red_bag: GroupRedBag
|
||||
"""
|
||||
if festive_red_bag := group_red_bag.festive_red_bag_expire():
|
||||
rank_num = Config.get_config("gold_redbag", "RANK_NUM") or 10
|
||||
rank_image = await festive_red_bag.build_amount_rank(rank_num)
|
||||
message = (
|
||||
f"{NICKNAME}的节日红包过时了,一共开启了 "
|
||||
f"{len(festive_red_bag.open_user)}"
|
||||
f" 个红包,共 {sum(festive_red_bag.open_user.values())} 金币\n" + image(rank_image)
|
||||
)
|
||||
await bot.send_group_msg(group_id=int(group_red_bag.group_id), message=message)
|
||||
|
||||
|
||||
async def check_gold(
|
||||
user_id: str, group_id: str, amount: Union[str, int]
|
||||
) -> Tuple[bool, str]:
|
||||
"""检查金币数量是否合法
|
||||
|
||||
参数:
|
||||
user_id: 用户id
|
||||
group_id: 群聊id
|
||||
amount: 金币数量
|
||||
|
||||
返回:
|
||||
Tuple[bool, str]: 是否合法以及提示语
|
||||
"""
|
||||
if is_number(amount):
|
||||
amount = int(amount)
|
||||
user_gold = await BagUser.get_gold(user_id, group_id)
|
||||
@@ -21,88 +53,102 @@ async def check_gold(user_id: str, group_id: str, amount: Union[str, int]):
|
||||
return False, "小气鬼,要别人倒贴金币给你嘛!"
|
||||
if user_gold < amount:
|
||||
return False, "没有金币的话请不要发红包..."
|
||||
await BagUser.spend_gold(user_id, group_id, amount)
|
||||
await RedbagUser.add_redbag_data(user_id, group_id, "send", amount)
|
||||
return True, amount
|
||||
return True, ""
|
||||
else:
|
||||
return False, "给我好好的输入红包里金币的数量啊喂!"
|
||||
|
||||
|
||||
# 金币退回
|
||||
async def return_gold(user_id: str, group_id: str, amount: int):
|
||||
await BagUser.add_gold(user_id, group_id, amount)
|
||||
async def random_red_bag_background(
|
||||
user_id: Union[str, int], msg="恭喜发财 大吉大利"
|
||||
) -> BuildImage:
|
||||
"""构造发送红包图片
|
||||
|
||||
参数:
|
||||
user_id: 用户id
|
||||
msg: 红包消息.
|
||||
|
||||
# 开红包
|
||||
async def open_redbag(user_id: str, group_id: str, redbag_data: dict):
|
||||
amount = random.choice(redbag_data[group_id]["redbag"])
|
||||
redbag_data[group_id]["redbag"].remove(amount)
|
||||
redbag_data[group_id]["open_user"].append(user_id)
|
||||
redbag_data[group_id]["open_amount"] += amount
|
||||
await RedbagUser.add_redbag_data(user_id, group_id, "get", amount)
|
||||
await BagUser.add_gold(user_id, group_id, amount)
|
||||
return amount, redbag_data
|
||||
异常:
|
||||
ValueError: 图片背景列表为空
|
||||
|
||||
|
||||
# 随机红包图片
|
||||
async def generate_send_redbag_pic(user_id: int, msg: str = "恭喜发财 大吉大利"):
|
||||
random_redbag = random.choice(os.listdir(f"{IMAGE_PATH}/prts/redbag_2"))
|
||||
返回:
|
||||
BuildImage: 构造后的图片
|
||||
"""
|
||||
background_list = os.listdir(f"{IMAGE_PATH}/prts/redbag_2")
|
||||
if not background_list:
|
||||
raise ValueError("prts/redbag_1 背景图列表为空...")
|
||||
random_redbag = random.choice(background_list)
|
||||
redbag = BuildImage(
|
||||
0, 0, font_size=38, background=f"{IMAGE_PATH}/prts/redbag_2/{random_redbag}"
|
||||
0, 0, font_size=38, background=IMAGE_PATH / "prts" / "redbag_2" / random_redbag
|
||||
)
|
||||
ava = BuildImage(65, 65, background=BytesIO(await get_user_avatar(user_id)))
|
||||
await asyncio.get_event_loop().run_in_executor(None, ava.circle)
|
||||
redbag.text(
|
||||
ava_byte = await get_user_avatar(user_id)
|
||||
ava = None
|
||||
if ava_byte:
|
||||
ava = BuildImage(65, 65, background=BytesIO(ava_byte))
|
||||
else:
|
||||
ava = BuildImage(65, 65, color=(0, 0, 0), is_alpha=True)
|
||||
await ava.acircle()
|
||||
await redbag.atext(
|
||||
(int((redbag.size[0] - redbag.getsize(msg)[0]) / 2), 210), msg, (240, 218, 164)
|
||||
)
|
||||
redbag.paste(ava, (int((redbag.size[0] - ava.size[0]) / 2), 130), True)
|
||||
return redbag.pic2bs4()
|
||||
await redbag.apaste(ava, (int((redbag.size[0] - ava.size[0]) / 2), 130), True)
|
||||
return redbag
|
||||
|
||||
|
||||
# 开红包图片
|
||||
async def generate_open_redbag_pic(
|
||||
user_id: str, send_user_nickname: str, amount: int, text: str
|
||||
):
|
||||
return await asyncio.create_task(
|
||||
_generate_open_redbag_pic(user_id, send_user_nickname, amount, text)
|
||||
)
|
||||
async def build_open_result_image(
|
||||
red_bag: RedBag, user_id: Union[int, str], amount: int
|
||||
) -> BuildImage:
|
||||
"""构造红包开启图片
|
||||
|
||||
参数:
|
||||
red_bag: RedBag
|
||||
user_id: 开启红包用户id
|
||||
amount: 开启红包获取的金额
|
||||
|
||||
# 开红包图片
|
||||
async def _generate_open_redbag_pic(
|
||||
user_id: str, send_user_nickname: str, amount: int, text: str
|
||||
):
|
||||
send_user_nickname += "的红包"
|
||||
amount_str = str(amount)
|
||||
random_redbag = random.choice(os.listdir(f"{IMAGE_PATH}/prts/redbag_1"))
|
||||
异常:
|
||||
ValueError: 图片背景列表为空
|
||||
|
||||
返回:
|
||||
BuildImage: 构造后的图片
|
||||
"""
|
||||
background_list = os.listdir(f"{IMAGE_PATH}/prts/redbag_1")
|
||||
if not background_list:
|
||||
raise ValueError("prts/redbag_1 背景图列表为空...")
|
||||
random_redbag = random.choice(background_list)
|
||||
head = BuildImage(
|
||||
1000,
|
||||
980,
|
||||
font_size=30,
|
||||
background=f"{IMAGE_PATH}/prts/redbag_1/{random_redbag}",
|
||||
background=IMAGE_PATH / "prts" / "redbag_1" / random_redbag,
|
||||
)
|
||||
size = BuildImage(0, 0, font_size=50).getsize(send_user_nickname)
|
||||
# QQ头像
|
||||
size = BuildImage(0, 0, font_size=50).getsize(red_bag.name)
|
||||
ava_bk = BuildImage(100 + size[0], 66, is_alpha=True, font_size=50)
|
||||
ava = BuildImage(
|
||||
66, 66, is_alpha=True, background=BytesIO(await get_user_avatar(user_id))
|
||||
)
|
||||
ava_bk.paste(ava)
|
||||
ava_bk.text((100, 7), send_user_nickname)
|
||||
# ava_bk.show()
|
||||
|
||||
ava_byte = await get_user_avatar(user_id)
|
||||
ava = None
|
||||
if ava_byte:
|
||||
ava = BuildImage(66, 66, is_alpha=True, background=BytesIO(ava_byte))
|
||||
else:
|
||||
ava = BuildImage(66, 66, color=(0, 0, 0), is_alpha=True)
|
||||
await ava_bk.apaste(ava)
|
||||
ava_bk.text((100, 7), red_bag.name)
|
||||
ava_bk_w, ava_bk_h = ava_bk.size
|
||||
head.paste(ava_bk, (int((1000 - ava_bk_w) / 2), 300), alpha=True)
|
||||
# 金额
|
||||
size = BuildImage(0, 0, font_size=150).getsize(amount_str)
|
||||
price = BuildImage(size[0], size[1], is_alpha=True, font_size=150)
|
||||
price.text((0, 0), amount_str, fill=(209, 171, 108))
|
||||
await head.apaste(ava_bk, (int((1000 - ava_bk_w) / 2), 300), alpha=True)
|
||||
size = BuildImage(0, 0, font_size=150).getsize(amount)
|
||||
amount_image = BuildImage(size[0], size[1], is_alpha=True, font_size=150)
|
||||
await amount_image.atext((0, 0), str(amount), fill=(209, 171, 108))
|
||||
# 金币中文
|
||||
head.paste(price, (int((1000 - size[0]) / 2) - 50, 460), alpha=True)
|
||||
head.text(
|
||||
await head.apaste(amount_image, (int((1000 - size[0]) / 2) - 50, 460), alpha=True)
|
||||
await head.atext(
|
||||
(int((1000 - size[0]) / 2 + size[0]) - 50, 500 + size[1] - 70),
|
||||
"金币",
|
||||
fill=(209, 171, 108),
|
||||
)
|
||||
# 剩余数量和金额
|
||||
head.text((350, 900), text, (198, 198, 198))
|
||||
return head.pic2bs4()
|
||||
text = (
|
||||
f"已领取"
|
||||
f"{red_bag.num - len(red_bag.open_user)}"
|
||||
f"/{red_bag.num}个,"
|
||||
f"共{sum(red_bag.open_user.values())}/{red_bag.amount}金币"
|
||||
)
|
||||
await head.atext((350, 900), text, (198, 198, 198))
|
||||
return head
|
||||
|
||||
Reference in New Issue
Block a user