zhenxun_bot/plugins/gold_redbag/data_source.py

155 lines
4.9 KiB
Python
Raw Normal View History

import os
import random
from io import BytesIO
2023-08-21 00:31:18 +08:00
from typing import Tuple, Union
2023-08-21 00:31:18 +08:00
from nonebot.adapters.onebot.v11 import Bot
from configs.config import NICKNAME, Config
from configs.path_config import IMAGE_PATH
2021-06-15 10:57:08 +08:00
from models.bag_user import BagUser
2021-12-16 11:16:28 +08:00
from utils.image_utils import BuildImage
2023-08-21 00:31:18 +08:00
from utils.message_builder import image
from utils.utils import get_user_avatar, is_number
2023-08-21 00:31:18 +08:00
from .config import FESTIVE_KEY, GroupRedBag, RedBag
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)
2021-06-15 10:57:08 +08:00
2023-08-21 00:31:18 +08:00
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]: 是否合法以及提示语
"""
2021-06-15 10:57:08 +08:00
if is_number(amount):
amount = int(amount)
user_gold = await BagUser.get_gold(user_id, group_id)
if amount < 1:
return False, "小气鬼,要别人倒贴金币给你嘛!"
2021-06-15 10:57:08 +08:00
if user_gold < amount:
return False, "没有金币的话请不要发红包..."
2023-08-21 00:31:18 +08:00
return True, ""
2021-06-15 10:57:08 +08:00
else:
return False, "给我好好的输入红包里金币的数量啊喂!"
2021-06-15 10:57:08 +08:00
2023-08-21 00:31:18 +08:00
async def random_red_bag_background(
user_id: Union[str, int], msg="恭喜发财 大吉大利"
) -> BuildImage:
"""构造发送红包图片
2021-06-15 10:57:08 +08:00
2023-08-21 00:31:18 +08:00
参数:
user_id: 用户id
msg: 红包消息.
2021-06-15 10:57:08 +08:00
2023-08-21 00:31:18 +08:00
异常:
ValueError: 图片背景列表为空
2021-06-15 10:57:08 +08:00
2023-08-21 00:31:18 +08:00
返回:
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(
2023-08-21 00:31:18 +08:00
0, 0, font_size=38, background=IMAGE_PATH / "prts" / "redbag_2" / random_redbag
)
2023-08-21 00:31:18 +08:00
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)
)
2023-08-21 00:31:18 +08:00
await redbag.apaste(ava, (int((redbag.size[0] - ava.size[0]) / 2), 130), True)
return redbag
2021-06-15 10:57:08 +08:00
2023-08-21 00:31:18 +08:00
async def build_open_result_image(
red_bag: RedBag, user_id: Union[int, str], amount: int
) -> BuildImage:
"""构造红包开启图片
2021-06-15 10:57:08 +08:00
2023-08-21 00:31:18 +08:00
参数:
red_bag: RedBag
user_id: 开启红包用户id
amount: 开启红包获取的金额
2021-06-15 10:57:08 +08:00
2023-08-21 00:31:18 +08:00
异常:
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,
2023-08-21 00:31:18 +08:00
background=IMAGE_PATH / "prts" / "redbag_1" / random_redbag,
)
2023-08-21 00:31:18 +08:00
size = BuildImage(0, 0, font_size=50).getsize(red_bag.name)
2022-05-28 10:31:27 +08:00
ava_bk = BuildImage(100 + size[0], 66, is_alpha=True, font_size=50)
2023-08-21 00:31:18 +08:00
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)
2021-06-15 10:57:08 +08:00
ava_bk_w, ava_bk_h = ava_bk.size
2023-08-21 00:31:18 +08:00
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))
2021-06-15 10:57:08 +08:00
# 金币中文
2023-08-21 00:31:18 +08:00
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),
)
2021-06-15 10:57:08 +08:00
# 剩余数量和金额
2023-08-21 00:31:18 +08:00
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