数据库中所有user_qq改名以及user_id和group_id改为字符串

This commit is contained in:
HibiKier
2023-05-22 20:56:42 +08:00
parent 0d3c6d8684
commit 848de7f4fe
68 changed files with 1103 additions and 645 deletions
+79 -71
View File
@@ -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
+58 -37
View File
@@ -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()
+14 -6
View File
@@ -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);",
]