mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-08 13:20:01 +08:00
数据库中所有user_qq改名以及user_id和group_id改为字符串
This commit is contained in:
@@ -1,33 +1,36 @@
|
||||
from nonebot import on_command, on_notice
|
||||
from nonebot.adapters.onebot.v11 import (
|
||||
Bot,
|
||||
ActionFailed,
|
||||
GroupMessageEvent,
|
||||
PokeNotifyEvent,
|
||||
Message
|
||||
)
|
||||
from .data_source import (
|
||||
check_gold,
|
||||
generate_send_redbag_pic,
|
||||
open_redbag,
|
||||
generate_open_redbag_pic,
|
||||
return_gold,
|
||||
)
|
||||
from nonebot.adapters.onebot.v11.permission import GROUP
|
||||
from nonebot.message import run_preprocessor, IgnoredException
|
||||
from nonebot.matcher import Matcher
|
||||
from utils.utils import is_number, scheduler
|
||||
from utils.message_builder import image
|
||||
from services.log import logger
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from nonebot.permission import SUPERUSER
|
||||
from nonebot.rule import to_me
|
||||
from datetime import datetime, timedelta
|
||||
from configs.config import NICKNAME
|
||||
from apscheduler.jobstores.base import JobLookupError
|
||||
from nonebot.params import CommandArg
|
||||
import random
|
||||
import time
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from apscheduler.jobstores.base import JobLookupError
|
||||
from nonebot import on_command, on_notice
|
||||
from nonebot.adapters.onebot.v11 import (
|
||||
ActionFailed,
|
||||
Bot,
|
||||
GroupMessageEvent,
|
||||
Message,
|
||||
PokeNotifyEvent,
|
||||
)
|
||||
from nonebot.adapters.onebot.v11.permission import GROUP
|
||||
from nonebot.matcher import Matcher
|
||||
from nonebot.message import IgnoredException, run_preprocessor
|
||||
from nonebot.params import CommandArg
|
||||
from nonebot.permission import SUPERUSER
|
||||
from nonebot.rule import to_me
|
||||
|
||||
from configs.config import NICKNAME
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from services.log import logger
|
||||
from utils.message_builder import image
|
||||
from utils.utils import is_number, scheduler
|
||||
|
||||
from .data_source import (
|
||||
check_gold,
|
||||
generate_open_redbag_pic,
|
||||
generate_send_redbag_pic,
|
||||
open_redbag,
|
||||
return_gold,
|
||||
)
|
||||
|
||||
__zx_plugin_name__ = "金币红包"
|
||||
__plugin_usage__ = """
|
||||
@@ -72,7 +75,9 @@ gold_redbag = on_command(
|
||||
"塞红包", aliases={"金币红包"}, priority=5, block=True, permission=GROUP
|
||||
)
|
||||
|
||||
open_ = on_command("开", aliases={"抢"}, priority=5, block=True, permission=GROUP, rule=rule)
|
||||
open_ = on_command(
|
||||
"开", aliases={"抢"}, priority=5, block=True, permission=GROUP, rule=rule
|
||||
)
|
||||
|
||||
poke_ = on_notice(priority=6, block=False)
|
||||
|
||||
@@ -89,7 +94,10 @@ festive_redbag_data = {}
|
||||
|
||||
# 阻断其他poke
|
||||
@run_preprocessor
|
||||
async def _(matcher: Matcher, event: PokeNotifyEvent, ):
|
||||
async def _(
|
||||
matcher: Matcher,
|
||||
event: PokeNotifyEvent,
|
||||
):
|
||||
try:
|
||||
if matcher.type == "notice" and event.self_id == event.target_id:
|
||||
flag = check_on_gold_red(event)
|
||||
@@ -109,10 +117,12 @@ async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()):
|
||||
try:
|
||||
if time.time() - redbag_data[event.group_id]["time"] > 60:
|
||||
amount = (
|
||||
redbag_data[event.group_id]["amount"]
|
||||
- redbag_data[event.group_id]["open_amount"]
|
||||
redbag_data[event.group_id]["amount"]
|
||||
- redbag_data[event.group_id]["open_amount"]
|
||||
)
|
||||
await return_gold(
|
||||
redbag_data[event.group_id]["user_id"], str(event.group_id), amount
|
||||
)
|
||||
await return_gold(redbag_data[event.group_id]["user_id"], event.group_id, amount)
|
||||
await gold_redbag.send(
|
||||
f'{redbag_data[event.group_id]["nickname"]}的红包过时未开完,退还{amount}金币...'
|
||||
)
|
||||
@@ -128,18 +138,18 @@ async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()):
|
||||
msg = arg.extract_plain_text().strip()
|
||||
msg = msg.split()
|
||||
if len(msg) == 1:
|
||||
flag, amount = await check_gold(event.user_id, event.group_id, msg[0])
|
||||
flag, amount = await check_gold(str(event.user_id), str(event.group_id), msg[0])
|
||||
if not flag:
|
||||
await gold_redbag.finish(amount)
|
||||
await gold_redbag.finish(str(amount))
|
||||
num = 5
|
||||
else:
|
||||
amount = msg[0]
|
||||
num = msg[1]
|
||||
if not is_number(num) or int(num) < 1:
|
||||
await gold_redbag.finish("红包个数给我输正确啊!", at_sender=True)
|
||||
flag, amount = await check_gold(event.user_id, event.group_id, amount)
|
||||
flag, amount = await check_gold(str(event.user_id), str(event.group_id), amount)
|
||||
if not flag:
|
||||
await gold_redbag.finish(amount, at_sender=True)
|
||||
await gold_redbag.finish(str(amount), at_sender=True)
|
||||
group_member_num = (await bot.get_group_info(group_id=event.group_id))[
|
||||
"member_count"
|
||||
]
|
||||
@@ -149,7 +159,12 @@ async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()):
|
||||
num = group_member_num
|
||||
nickname = event.sender.card or event.sender.nickname
|
||||
flag, result = init_redbag(
|
||||
event.user_id, event.group_id, nickname, amount, num, int(bot.self_id)
|
||||
str(event.user_id),
|
||||
str(event.group_id),
|
||||
nickname or str(event.user_id),
|
||||
amount,
|
||||
num,
|
||||
int(bot.self_id),
|
||||
)
|
||||
if not flag:
|
||||
await gold_redbag.finish(result, at_sender=True)
|
||||
@@ -158,13 +173,11 @@ async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()):
|
||||
f"{nickname}发起了金币红包\n金额:{amount}\n数量:{num}\n"
|
||||
+ image(
|
||||
b64=await generate_send_redbag_pic(
|
||||
redbag_data[event.group_id]["user_id"]
|
||||
redbag_data[str(event.group_id)]["user_id"]
|
||||
)
|
||||
)
|
||||
)
|
||||
logger.info(
|
||||
f"USER {event.user_id} GROUP {event.group_id} 塞入 {num} 个红包,共 {amount} 金币"
|
||||
)
|
||||
logger.info(f"塞入 {num} 个红包,共 {amount} 金币", "金币红包", event.user_id, event.group_id)
|
||||
|
||||
|
||||
@open_.handle()
|
||||
@@ -173,20 +186,20 @@ async def _(event: GroupMessageEvent, arg: Message = CommandArg()):
|
||||
msg = arg.extract_plain_text().strip()
|
||||
msg = (
|
||||
msg.replace("!", "")
|
||||
.replace("!", "")
|
||||
.replace(",", "")
|
||||
.replace(",", "")
|
||||
.replace(".", "")
|
||||
.replace("。", "")
|
||||
.replace("!", "")
|
||||
.replace(",", "")
|
||||
.replace(",", "")
|
||||
.replace(".", "")
|
||||
.replace("。", "")
|
||||
)
|
||||
if msg:
|
||||
if "红包" not in msg:
|
||||
return
|
||||
try:
|
||||
await open_.send(
|
||||
image(b64=await get_redbag_img(event.user_id, event.group_id)),
|
||||
image(b64=await get_redbag_img(str(event.user_id), str(event.group_id))),
|
||||
at_sender=True,
|
||||
)
|
||||
)
|
||||
except KeyError:
|
||||
await open_.finish("真贪心,明明已经开过这个红包了的说...", at_sender=True)
|
||||
|
||||
@@ -199,7 +212,7 @@ async def _poke_(event: PokeNotifyEvent):
|
||||
if not flag:
|
||||
return
|
||||
await poke_.send(
|
||||
image(b64=await get_redbag_img(event.user_id, event.group_id)),
|
||||
image(b64=await get_redbag_img(str(event.user_id), str(event.group_id))),
|
||||
at_sender=True,
|
||||
)
|
||||
|
||||
@@ -217,8 +230,8 @@ async def _(event: GroupMessageEvent):
|
||||
at_sender=True,
|
||||
)
|
||||
await return_gold(
|
||||
event.user_id,
|
||||
event.group_id,
|
||||
str(event.user_id),
|
||||
str(event.group_id),
|
||||
redbag_data[event.group_id]["amount"]
|
||||
- redbag_data[event.group_id]["open_amount"],
|
||||
)
|
||||
@@ -272,9 +285,7 @@ async def _(bot: Bot, arg: Message = CommandArg()):
|
||||
await end_festive_redbag(bot, g)
|
||||
except JobLookupError:
|
||||
pass
|
||||
init_redbag(
|
||||
int(bot.self_id), g, f"{NICKNAME}", amount, num, int(bot.self_id), 1
|
||||
)
|
||||
init_redbag(bot.self_id, g, f"{NICKNAME}", amount, num, int(bot.self_id), 1)
|
||||
scheduler.add_job(
|
||||
end_festive_redbag,
|
||||
"date",
|
||||
@@ -286,7 +297,7 @@ async def _(bot: Bot, arg: Message = CommandArg()):
|
||||
await bot.send_group_msg(
|
||||
group_id=g,
|
||||
message=f"{NICKNAME}发起了金币红包\n金额:{amount}\n数量:{num}\n"
|
||||
+ image(
|
||||
+ image(
|
||||
b64=await generate_send_redbag_pic(int(bot.self_id), greetings)
|
||||
),
|
||||
)
|
||||
@@ -297,13 +308,13 @@ async def _(bot: Bot, arg: Message = CommandArg()):
|
||||
|
||||
# 红包数据初始化
|
||||
def init_redbag(
|
||||
user_id: int,
|
||||
group_id: int,
|
||||
nickname: str,
|
||||
amount: int,
|
||||
num: int,
|
||||
bot_self_id: int,
|
||||
mode: int = 0,
|
||||
user_id: str,
|
||||
group_id: str,
|
||||
nickname: str,
|
||||
amount: int,
|
||||
num: int,
|
||||
bot_self_id: int,
|
||||
mode: int = 0,
|
||||
):
|
||||
global redbag_data, festive_redbag_data
|
||||
data = redbag_data if mode == 0 else festive_redbag_data
|
||||
@@ -341,7 +352,7 @@ def random_redbag(amount: int, num: int) -> list:
|
||||
|
||||
|
||||
# 返回开红包图片
|
||||
async def get_redbag_img(user_id: int, group_id: int):
|
||||
async def get_redbag_img(user_id: str, group_id: str):
|
||||
global redbag_data, festive_redbag_data
|
||||
data = redbag_data
|
||||
mode = 0
|
||||
@@ -389,17 +400,14 @@ def check_on_gold_red(event) -> bool:
|
||||
flag1 = True
|
||||
flag2 = True
|
||||
try:
|
||||
if festive_redbag_data[event.group_id]["user_id"]:
|
||||
if (
|
||||
event.user_id
|
||||
in festive_redbag_data[event.group_id]["open_user"]
|
||||
):
|
||||
if festive_redbag_data[str(event.group_id)]["user_id"]:
|
||||
if event.user_id in festive_redbag_data[str(event.group_id)]["open_user"]:
|
||||
flag1 = False
|
||||
except KeyError:
|
||||
flag1 = False
|
||||
try:
|
||||
if redbag_data[event.group_id]["user_id"]:
|
||||
if event.user_id in redbag_data[event.group_id]["open_user"]:
|
||||
if redbag_data[str(event.group_id)]["user_id"]:
|
||||
if event.user_id in redbag_data[str(event.group_id)]["open_user"]:
|
||||
flag2 = False
|
||||
except KeyError:
|
||||
flag2 = False
|
||||
|
||||
@@ -1,87 +1,108 @@
|
||||
from models.bag_user import BagUser
|
||||
from utils.utils import is_number, get_user_avatar
|
||||
from utils.image_utils import BuildImage
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from .model import RedbagUser
|
||||
import random
|
||||
import os
|
||||
from io import BytesIO
|
||||
import asyncio
|
||||
import os
|
||||
import random
|
||||
from io import BytesIO
|
||||
from typing import Union
|
||||
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from models.bag_user import BagUser
|
||||
from utils.image_utils import BuildImage
|
||||
from utils.utils import get_user_avatar, is_number
|
||||
|
||||
from .model import RedbagUser
|
||||
|
||||
|
||||
# 检查金币数量合法性,并添加记录数据
|
||||
async def check_gold(user_id: int, group_id: int, amount: str):
|
||||
async def check_gold(user_id: str, group_id: str, amount: Union[str, int]):
|
||||
if is_number(amount):
|
||||
amount = int(amount)
|
||||
user_gold = await BagUser.get_gold(user_id, group_id)
|
||||
if amount < 1:
|
||||
return False, '小气鬼,要别人倒贴金币给你嘛!'
|
||||
return False, "小气鬼,要别人倒贴金币给你嘛!"
|
||||
if user_gold < amount:
|
||||
return False, '没有金币的话请不要发红包...'
|
||||
return False, "没有金币的话请不要发红包..."
|
||||
await BagUser.spend_gold(user_id, group_id, amount)
|
||||
await RedbagUser.add_redbag_data(user_id, group_id, 'send', amount)
|
||||
await RedbagUser.add_redbag_data(user_id, group_id, "send", amount)
|
||||
return True, amount
|
||||
else:
|
||||
return False, '给我好好的输入红包里金币的数量啊喂!'
|
||||
return False, "给我好好的输入红包里金币的数量啊喂!"
|
||||
|
||||
|
||||
# 金币退回
|
||||
async def return_gold(user_id: int, group_id: int, amount: int):
|
||||
async def return_gold(user_id: str, group_id: str, amount: int):
|
||||
await BagUser.add_gold(user_id, group_id, amount)
|
||||
|
||||
|
||||
# 开红包
|
||||
async def open_redbag(user_id: int, group_id: int, 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)
|
||||
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
|
||||
|
||||
|
||||
# 随机红包图片
|
||||
async def generate_send_redbag_pic(user_id: int, msg: str = '恭喜发财 大吉大利'):
|
||||
async def generate_send_redbag_pic(user_id: int, msg: str = "恭喜发财 大吉大利"):
|
||||
random_redbag = random.choice(os.listdir(f"{IMAGE_PATH}/prts/redbag_2"))
|
||||
redbag = BuildImage(0, 0, font_size=38, background=f'{IMAGE_PATH}/prts/redbag_2/{random_redbag}')
|
||||
redbag = BuildImage(
|
||||
0, 0, font_size=38, background=f"{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((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)
|
||||
redbag.text(
|
||||
(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()
|
||||
|
||||
|
||||
# 开红包图片
|
||||
async def generate_open_redbag_pic(user_id: int, 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 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 _generate_open_redbag_pic(user_id: int, send_user_nickname: str, amount: int, text: str):
|
||||
send_user_nickname += '的红包'
|
||||
amount = str(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"))
|
||||
head = BuildImage(1000, 980, font_size=30, background=f'{IMAGE_PATH}/prts/redbag_1/{random_redbag}')
|
||||
head = BuildImage(
|
||||
1000,
|
||||
980,
|
||||
font_size=30,
|
||||
background=f"{IMAGE_PATH}/prts/redbag_1/{random_redbag}",
|
||||
)
|
||||
size = BuildImage(0, 0, font_size=50).getsize(send_user_nickname)
|
||||
# QQ头像
|
||||
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 = 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_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)
|
||||
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, fill=(209, 171, 108))
|
||||
price.text((0, 0), amount_str, fill=(209, 171, 108))
|
||||
# 金币中文
|
||||
head.paste(price, (int((1000 - size[0]) / 2) - 50, 460), alpha=True)
|
||||
head.text((int((1000 - size[0]) / 2 + size[0]) - 50, 500 + size[1] - 70), '金币', fill=(209, 171, 108))
|
||||
head.text(
|
||||
(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()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -9,9 +9,9 @@ class RedbagUser(Model):
|
||||
|
||||
id = fields.IntField(pk=True, generated=True, auto_increment=True)
|
||||
"""自增id"""
|
||||
user_qq = fields.BigIntField()
|
||||
user_id = fields.CharField(255)
|
||||
"""用户id"""
|
||||
group_id = fields.BigIntField()
|
||||
group_id = fields.CharField(255)
|
||||
"""群聊id"""
|
||||
send_redbag_count = fields.IntField(default=0)
|
||||
"""发送红包次数"""
|
||||
@@ -25,23 +25,23 @@ class RedbagUser(Model):
|
||||
class Meta:
|
||||
table = "redbag_users"
|
||||
table_description = "红包统计数据表"
|
||||
unique_together = ("user_qq", "group_id")
|
||||
unique_together = ("user_id", "group_id")
|
||||
|
||||
@classmethod
|
||||
async def add_redbag_data(
|
||||
cls, user_qq: int, group_id: int, i_type: str, money: int
|
||||
cls, user_id: str, group_id: str, i_type: str, money: int
|
||||
):
|
||||
"""
|
||||
说明:
|
||||
添加收发红包数据
|
||||
参数:
|
||||
:param user_qq: qq号
|
||||
:param user_id: 用户id
|
||||
:param group_id: 群号
|
||||
:param i_type: 收或发
|
||||
:param money: 金钱数量
|
||||
"""
|
||||
|
||||
user, _ = await cls.get_or_create(user_qq=user_qq, group_id=group_id)
|
||||
user, _ = await cls.get_or_create(user_id=user_id, group_id=group_id)
|
||||
if i_type == "get":
|
||||
user.get_redbag_count = user.get_redbag_count + 1
|
||||
user.get_gold = user.get_gold + money
|
||||
@@ -56,3 +56,11 @@ class RedbagUser(Model):
|
||||
"spend_gold",
|
||||
]
|
||||
)
|
||||
|
||||
@classmethod
|
||||
async def _run_script(cls):
|
||||
return [
|
||||
"ALTER TABLE redbag_users RENAME COLUMN user_qq TO user_id;", # 将user_qq改为user_id
|
||||
"ALTER TABLE redbag_users ALTER COLUMN user_id TYPE character varying(255);",
|
||||
"ALTER TABLE redbag_users ALTER COLUMN group_id TYPE character varying(255);",
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user