gold_readbag and russian

This commit is contained in:
hibiki
2021-06-15 10:57:08 +08:00
parent 95209093de
commit ea620fdae9
125 changed files with 2106 additions and 1244 deletions
+28 -38
View File
@@ -3,71 +3,61 @@ from services.log import logger
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent
from nonebot.typing import T_State
from util.utils import get_message_text, is_number
from models.bag_user import UserBag
from models.bag_user import BagUser
from services.db_context import db
from nonebot.adapters.cqhttp.permission import GROUP
from models.goods_info import GoodsInfo
__plugin_name__ = '商店购买'
__plugin_usage__ = '格式:购买 名称或序号 数量(选填,默认为1)\n\t示例:购买 好感双倍加持卡Ⅰ\n\t示例:购买 1 4'
__plugin_usage__ = '格式:购买 [名称或序号] [数量](默认1)\n\t示例:购买 好感双倍加持卡Ⅰ\n\t示例:购买 1 4'
buy = on_command("购买", aliases={'购买道具'}, priority=5, block=True, permission=GROUP)
goods = [
'好感双倍加持卡Ⅰ\t\t售价:30金币\n\t\t今日双倍好感度的概率 + 10%(谁才是真命天子?)(同类道具将覆盖)',
'好感双倍加持卡Ⅱ\t\t售价:140金币\n\t\t今日双倍好感度的概率 + 20%(平平庸庸~)(同类道具将覆盖)',
'好感双倍加持卡Ⅲ\t\t售价:250金币\n\t\t今日双倍好感度的概率 + 30%(金币才是真命天子!)(同类道具将覆盖)'
]
glist = []
plist = []
for i in range(len(goods)):
glist.append(goods[i].split('\t\t')[0])
plist.append(int(goods[i].split('\t\t')[1].split(':')[1].split('金币')[0]))
@buy.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
if get_message_text(event.json()) in ['', '帮助']:
await buy.finish(__plugin_usage__)
if get_message_text(event.json()) in ['神秘药水']:
await buy.finish("你们看看就好啦,这是不可能卖给你们的~", at_sender=True)
goods_lst = await GoodsInfo.get_all_goods()
goods_name_lst = [x.goods_name for x in goods_lst]
msg = get_message_text(event.json()).strip().split(' ')
index = -1
num = 1
if len(msg) > 1:
if is_number(msg[1]):
num = int(msg[1])
print(msg, num)
else:
await buy.finish('购买的数量要是数字!', at_sender=True)
# print(msg, num)
if is_number(msg[0]):
msg = int(msg[0])
if msg > len(goods) or msg < 1:
if msg > len(goods_lst) or msg < 1:
await buy.finish('请输入正确的商品id!', at_sender=True)
index = msg - 1
goods = goods_lst[msg - 1]
else:
if msg[0] in glist:
for i in range(len(glist)):
if msg == glist[i]:
index = i
if msg[0] in goods_name_lst:
for i in range(len(goods_name_lst)):
if msg[0] == goods_name_lst[i]:
goods = goods_lst[i]
break
else:
await buy.finish('请输入正确的商品名称!')
else:
await buy.finish('请输入正确的商品名称!', at_sender=True)
async with db.transaction():
if index != -1:
if (await UserBag.get_gold(event.user_id, event.group_id)) < plist[index] * num:
await buy.finish('您的金币好像不太够哦', at_sender=True)
if await UserBag.spend_glod(event.user_id, event.group_id, plist[index] * num):
for _ in range(num):
await UserBag.add_props(event.user_id, event.group_id, glist[index])
await buy.send(f'花费 {plist[index]*num} 金币购买 {glist[index]} ×{num} 成功!', at_sender=True)
logger.info(f'USER {event.user_id} GROUP {event.group_id} '
f'花费 {plist[index]*num} 金币购买 {glist[index]} ×{num} 成功!')
else:
await buy.send(f'{glist[index]} 购买失败!', at_sender=True)
logger.info(f'USER {event.user_id} GROUP {event.group_id} '
f'花费 {plist[index]*num} 金币购买 {glist[index]} ×{num} 失败!')
if (await BagUser.get_gold(event.user_id, event.group_id)) < goods.goods_price * num:
await buy.finish('您的金币好像不太够哦', at_sender=True)
if await BagUser.spend_gold(event.user_id, event.group_id, goods.goods_price * num):
for _ in range(num):
await BagUser.add_props(event.user_id, event.group_id, goods.goods_name)
await buy.send(f'花费 {goods.goods_price*num} 金币购买 {goods.goods_name} ×{num} 成功!', at_sender=True)
logger.info(f'USER {event.user_id} GROUP {event.group_id} '
f'花费 {goods.goods_price*num} 金币购买 {goods.goods_name} ×{num} 成功!')
else:
await buy.send(f'{goods.goods_name} 购买失败!', at_sender=True)
logger.info(f'USER {event.user_id} GROUP {event.group_id} '
f'花费 {goods.goods_price*num} 金币购买 {goods.goods_name} ×{num} 失败!')
+28
View File
@@ -0,0 +1,28 @@
from nonebot import on_command
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent
from nonebot.typing import T_State
from nonebot.adapters.cqhttp.permission import GROUP
from util.data_utils import init_rank
from models.bag_user import BagUser
my_gold = on_command("我的金币", priority=5, block=True, permission=GROUP)
gold_rank = on_command('金币排行', priority=5, block=True, permission=GROUP)
@my_gold.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
await my_gold.finish(await BagUser.get_my_total_gold(event.user_id, event.group_id))
@gold_rank.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
users = await BagUser.get_user_all(event.group_id)
all_user_data = [user.gold for user in users]
await gold_rank.finish(await init_rank(users, all_user_data, event.group_id))
+310
View File
@@ -0,0 +1,310 @@
from nonebot import on_command, on_notice
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, PokeNotifyEvent, MessageEvent
from nonebot.typing import T_State
from .data_source import check_gold, generate_send_redbag_pic, open_redbag, generate_open_redbag_pic, return_gold
from nonebot.adapters.cqhttp.permission import GROUP
from nonebot.message import run_preprocessor, IgnoredException
from nonebot.matcher import Matcher
from util.utils import get_message_text, is_number, scheduler
from util.init_result import image
from services.log import logger
from nonebot.permission import SUPERUSER
from nonebot.rule import to_me
from datetime import datetime, timedelta
import random
import time
__plugin_name__ = '金币红包'
__plugin_usage__ = '金币红包帮助:\n' \
'\t塞红包 [金币数] [红包个数](默认5)\n' \
'示例:\n' \
'\t塞红包 500 5\n' \
'抢红包 --> 戳一戳,开' \
'退还剩余红包 --> 退还'
gold_redbag = on_command('塞红包', aliases={'金币红包'}, priority=5, block=True, permission=GROUP)
open_ = on_command('开', aliases={'抢'}, priority=5, block=True, permission=GROUP)
poke_ = on_notice(priority=6, block=False)
return_ = on_command('退回', aliases={'退还'}, priority=5, block=True, permission=GROUP)
festive_redbag = on_command('节日红包', priority=5, block=True, permission=SUPERUSER, rule=to_me())
redbag_data = {}
festive_redbag_data = {}
# 阻断其他poke
@run_preprocessor
async def _(matcher: Matcher, bot: Bot, event: PokeNotifyEvent, state: T_State):
try:
if matcher.type == 'notice' and event.self_id == event.target_id:
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']:
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']:
flag2 = False
except KeyError:
flag2 = False
if flag1 or flag2:
if matcher.module == 'poke':
raise IgnoredException('目前正在抢红包...')
else:
if matcher.module == 'gold_redbag':
raise IgnoredException('目前没有红包...')
# for data in [festive_redbag_data, redbag_data]:
# if data.get(event.group_id):
# if data[event.group_id].get('user_id') != 0:
# if event.user_id not in data[event.group_id]['open_user']:
# if matcher.module == 'poke':
# raise IgnoredException('目前正在抢红包...')
# else:
# open_flag = True
# if open_flag:
# if matcher.module == 'gold_redbag':
# raise IgnoredException('目前没有红包...')
except AttributeError:
pass
@gold_redbag.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
global redbag_data, festive_redbag_data
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']
await gold_redbag.send(f'{redbag_data[event.group_id]["nickname"]}的红包过时未开完,退还{amount}金币...')
redbag_data[event.group_id] = {}
else:
await gold_redbag.finish(f'目前 {redbag_data[event.group_id]["nickname"]} 的红包还没有开完噢,'
f'还剩下 {len(redbag_data[event.group_id]["redbag"])} 个红包!'
f'(或等待{str(60 - time.time() + redbag_data[event.group_id]["time"])[:2]}秒红包过时)')
except KeyError:
pass
msg = get_message_text(event.json())
msg = msg.split(' ')
if len(msg) == 1:
flag, amount = await check_gold(event.user_id, event.group_id, msg[0])
if not flag:
await gold_redbag.finish(amount)
num = 5
else:
amount = msg[0]
num = msg[1]
flag, amount = await check_gold(event.user_id, event.group_id, amount)
if not flag:
await gold_redbag.finish(amount, at_sender=True)
if not is_number(num):
await gold_redbag.finish('红包个数给我输正确啊!', at_sender=True)
num = int(num)
nickname = event.sender.card if event.sender.card else event.sender.nickname
flag, result = init_redbag(event.user_id, event.group_id, nickname, amount, num, int(bot.self_id))
if not flag:
await gold_redbag.finish(result, at_sender=True)
else:
await gold_redbag.send(f'{nickname}发起了金币红包\n金额:{amount}\n数量:{num}\n' +
image(b64=await generate_send_redbag_pic(redbag_data[event.group_id]['user_id'])))
logger.info(f"USER {event.user_id} GROUP {event.group_id} 塞入 {num} 个红包,共 {amount} 金币")
@open_.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
global redbag_data, festive_redbag_data
flag1 = True
flag2 = True
open_flag1 = True
open_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']:
open_flag1 = False
except KeyError:
open_flag1 = False
flag1 = False
try:
if redbag_data[event.group_id]['user_id']:
if event.user_id in redbag_data[event.group_id]['open_user']:
open_flag2 = False
except KeyError:
flag2 = False
if not flag1 and not flag2:
await open_.finish('目前没有红包可以开...', at_sender=True)
if open_flag1 or open_flag2:
try:
await open_.send(image(b64=await get_redbag_img(event.user_id, event.group_id)), at_sender=True)
except KeyError:
await open_.finish('真贪心,明明已经开过这个红包了的说...', at_sender=True)
else:
await open_.finish('真贪心,明明已经开过这个红包了的说...', at_sender=True)
@poke_.handle()
async def _poke_(bot: Bot, event: PokeNotifyEvent, state: T_State):
global redbag_data, festive_redbag_data
if event.self_id == event.target_id:
flag1 = True
flag2 = True
try:
if event.user_id in festive_redbag_data[event.group_id]['open_user']:
flag1 = False
except KeyError:
flag1 = False
try:
if event.user_id in redbag_data[event.group_id]['open_user']:
flag2 = False
except KeyError:
flag2 = False
if not flag1 and not flag2:
return
await poke_.send(image(b64=await get_redbag_img(event.user_id, event.group_id)), at_sender=True)
@return_.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
global redbag_data
try:
if redbag_data[event.group_id]['user_id'] != event.user_id:
await return_.finish('不是你的红包你退回什么!', at_sender=True)
if time.time() - redbag_data[event.group_id]['time'] <= 60:
await return_.finish(f'你的红包还没有过时,在 {str(60 - time.time() + redbag_data[event.group_id]["time"])[:2]} '
f'秒后可以退回..', at_sender=True)
await return_gold(event.user_id, event.group_id,
redbag_data[event.group_id]['amount'] - redbag_data[event.group_id]['open_amount'])
await return_.send(f"已成功退还了 "
f"{redbag_data[event.group_id]['amount'] - redbag_data[event.group_id]['open_amount']} "
f"金币", at_sender=True)
logger.info(f"USER {event.user_id} GROUP {event.group_id} 退回了"
f"红包 {redbag_data[event.group_id]['amount'] - redbag_data[event.group_id]['open_amount']} 金币")
redbag_data[event.group_id] = {}
except KeyError:
await return_.finish('目前没有红包可以退回...', at_sender=True)
@festive_redbag.handle()
async def _(bot: Bot, event: MessageEvent, state: T_State):
global redbag_data
msg = get_message_text(event.json())
if msg:
msg = msg.split(' ')
amount = 0
num = 0
greetings = '恭喜发财 大吉大利'
gl = []
if (lens := len(msg)) < 2:
await festive_redbag.finish('参数不足,格式:节日红包 [金额] [数量] [祝福语](可省) [指定群](可省)')
if lens > 1:
if not is_number(msg[0]):
await festive_redbag.finish('金额必须要是数字!', at_sender=True)
amount = int(msg[0])
if not is_number(msg[1]):
await festive_redbag.finish('数量必须要是数字!', at_sender=True)
num = int(msg[1])
if lens > 2:
greetings = msg[2]
if lens > 3:
for i in range(3, lens):
if not is_number(msg[i]):
await festive_redbag.finish('指定的群号必须要是数字啊!', at_sender=True)
gl.append(int(msg[i]))
if not gl:
gl = await bot.get_group_list(self_id=int(bot.self_id))
gl = [g['group_id'] for g in gl]
for g in gl:
init_redbag(int(bot.self_id), g, '可爱的小真寻', amount, num, int(bot.self_id), 1)
scheduler.add_job(end_festive_redbag, "date",
run_date=str(datetime.now() + timedelta(hours=24)).split('.')[0],
id=f'festive_redbag_{g}', args=[bot, g])
try:
await bot.send_group_msg(group_id=g, message=f'可爱的小真寻发起了金币红包\n金额:{amount}\n数量:{num}\n' + image(
b64=await generate_send_redbag_pic(int(bot.self_id), greetings)))
except AttributeError:
pass
# 红包数据初始化
def init_redbag(user_id: int, group_id: int, 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
if not data.get(group_id):
data[group_id] = {}
try:
if data[group_id]['user_id'] and user_id != bot_self_id:
return False, f'{data[group_id]["nickname"]}的红包还没抢完呢...'
except KeyError:
pass
data[group_id]['user_id'] = user_id
data[group_id]['nickname'] = nickname
data[group_id]['amount'] = amount
data[group_id]['num'] = num
data[group_id]['open_amount'] = 0
data[group_id]['time'] = time.time()
data[group_id]['redbag'] = random_redbag(amount, num)
data[group_id]['open_user'] = []
if mode == 0:
redbag_data = data
else:
festive_redbag_data = data
return True, ''
# 随机红包排列
def random_redbag(amount: int, num: int) -> list:
redbag_lst = []
for _ in range(num - 1):
tmp = int(amount / random.choice(range(3, num + 3)))
redbag_lst.append(tmp)
amount -= tmp
redbag_lst.append(amount)
return redbag_lst
# 返回开红包图片
async def get_redbag_img(user_id: int, group_id: int):
global redbag_data, festive_redbag_data
data = redbag_data
mode = 0
if festive_redbag_data.get(group_id):
try:
if user_id not in festive_redbag_data[group_id]['open_user']:
data = festive_redbag_data
mode = 1
except KeyError:
pass
amount, data = await open_redbag(user_id, group_id, data)
text = f'已领取' \
f'{data[group_id]["num"] - len(data[group_id]["redbag"])}' \
f'/{data[group_id]["num"]}个,' \
f'共{data[group_id]["open_amount"]}/{data[group_id]["amount"]}金币'
logger.info(f"USER {user_id} GROUP {group_id} 抢到了 {data[group_id]['user_id']} 的红包,获取了{amount}金币")
b64 = await generate_open_redbag_pic(data[group_id]['user_id'],
data[group_id]['nickname'], amount, text)
if data[group_id]["open_amount"] == data[group_id]["amount"]:
data[group_id] = {}
if mode == 0:
redbag_data = data
else:
festive_redbag_data = data
return b64
async def end_festive_redbag(bot: Bot, group_id: int):
global festive_redbag_data
message = f"真寻的节日红包过时了,一共开启了 " \
f"{festive_redbag_data[group_id]['num'] - len(festive_redbag_data[group_id]['redbag'])}" \
f" 个红包,共 {festive_redbag_data[group_id]['open_amount']} 金币"
await bot.send_group_msg(group_id=group_id, message=message)
festive_redbag_data[group_id] = {}
+96
View File
@@ -0,0 +1,96 @@
from models.bag_user import BagUser
from util.utils import is_number, get_local_proxy
from util.img_utils import CreateImg
from util.user_agent import get_user_agent
from configs.path_config import IMAGE_PATH
from models.redbag_user import RedbagUser
import random
import os
import aiohttp
from io import BytesIO
import asyncio
# 检查金币数量合法性,并添加记录数据
async def check_gold(user_id: int, group_id: int, amount: str):
if is_number(amount):
amount = int(amount)
user_gold = await BagUser.get_gold(user_id, group_id)
if amount < 1:
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
else:
return False, '给我好好的输入红包里金币的数量啊喂!'
# 金币退回
async def return_gold(user_id: int, group_id: int, 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)
await BagUser.add_gold(user_id, group_id, amount)
return amount, redbag_data
# 随机红包图片
async def generate_send_redbag_pic(user_id: int, msg: str = '恭喜发财 大吉大利'):
random_redbag = random.choice(os.listdir(f"{IMAGE_PATH}/prts/redbag_2"))
redbag = CreateImg(0, 0, font_size=38, background=f'{IMAGE_PATH}/prts/redbag_2/{random_redbag}')
ava = CreateImg(65, 65, background=BytesIO(await get_pic(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)
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))
# 获取QQ头像
async def get_pic(qq):
url = f'http://q1.qlogo.cn/g?b=qq&nk={qq}&s=160'
async with aiohttp.ClientSession(headers=get_user_agent()) as session:
async with session.get(url, proxy=get_local_proxy(), timeout=5) as response:
return await response.read()
# 开红包图片
async def _generate_open_redbag_pic(user_id: int, send_user_nickname: str, amount: int, text: str):
send_user_nickname += '的红包'
amount = str(amount)
head = CreateImg(1000, 980, font_size=30, background=f'{IMAGE_PATH}/prts/redbag_12.png')
size = CreateImg(0, 0, font_size=50).getsize(send_user_nickname)
# QQ头像
ava_bk = CreateImg(100 + size[0], 66, color='white', font_size=50)
ava = CreateImg(66, 66, background=BytesIO(await get_pic(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))
# 金额
size = CreateImg(0, 0, font_size=150).getsize(amount)
price = CreateImg(size[0], size[1], font_size=150)
price.text((0, 0), amount, fill=(209, 171, 108))
# 金币中文
head.paste(price, (int((1000 - size[0]) / 2) - 50, 460))
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()
-26
View File
@@ -1,26 +0,0 @@
from nonebot import on_command
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent
from nonebot.typing import T_State
from models.bag_user import UserBag
from nonebot.adapters.cqhttp.permission import GROUP
__plugin_name__ = '我的金币'
my_gold = on_command("我的金币", priority=5, block=True, permission=GROUP)
@my_gold.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
await my_gold.finish(await UserBag.get_my_total_gold(event.user_id, event.group_id))
+2 -2
View File
@@ -2,7 +2,7 @@ from nonebot import on_command
from services.log import logger
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent
from nonebot.typing import T_State
from models.bag_user import UserBag
from models.bag_user import BagUser
from nonebot.adapters.cqhttp.permission import GROUP
@@ -14,7 +14,7 @@ my_props = on_command("我的道具", priority=5, block=True, permission=GROUP)
@my_props.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
props = await UserBag.get_props(event.user_id, event.group_id)
props = await BagUser.get_props(event.user_id, event.group_id)
if props:
pname_list = []
pnum_list = []
+7 -8
View File
@@ -1,5 +1,5 @@
from util.utils import scheduler
from models.bag_user import UserBag
from models.bag_user import BagUser
from services.log import logger
@@ -20,13 +20,12 @@ from services.log import logger
)
async def _():
try:
user_list = await UserBag.get_user_all()
if user_list:
for user in user_list:
await user.update(
get_today_gold=0,
spend_today_gold=0,
).apply()
user_list = await BagUser.get_user_all()
for user in user_list:
await user.update(
get_today_gold=0,
spend_today_gold=0,
).apply()
except Exception as e:
logger.error(f'重置每日金币错误 e:{e}')
+125
View File
@@ -0,0 +1,125 @@
from nonebot import on_command
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent, MessageEvent
from nonebot.typing import T_State
from configs.path_config import IMAGE_PATH
from util.init_result import image
from .data_source import create_shop_help, add_goods, del_goods, update_goods
from nonebot.permission import SUPERUSER
from util.utils import get_message_text, is_number
from services.log import logger
import os
import time
__plugin_name__ = '商店'
shop_help = on_command("商店", priority=5, block=True)
shop_add_goods = on_command('添加商品', priority=5, permission=SUPERUSER, block=True)
shop_del_goods = on_command('删除商品', priority=5, permission=SUPERUSER, block=True)
shop_update_goods = on_command('修改商品', priority=5, permission=SUPERUSER, block=True)
@shop_help.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
if not os.path.exists(f'{IMAGE_PATH}/shop_help.png'):
await create_shop_help()
await shop_help.send(image('shop_help.png'))
@shop_add_goods.handle()
async def _(bot: Bot, event: MessageEvent, state: T_State):
msg = get_message_text(event.json())
if msg:
msg = msg.split('-')
if len(msg) < 3:
await shop_add_goods.finish('商品参数不完全...', at_sender=True)
if not is_number(msg[1]):
await shop_add_goods.finish('商品的价格必须是合法数字!', at_sender=True)
msg[1] = int(msg[1])
if len(msg) > 3:
if not is_number(msg[3]):
await shop_add_goods.finish('商品的折扣要小数啊!', at_sender=True)
msg[3] = float(msg[3])
if len(msg) > 4:
if not is_number(msg[4]):
await shop_add_goods.finish('商品的限时时间是要写多少分钟噢!', at_sender=True)
msg[4] = time.time() + int(msg[4]) * 60
if await add_goods(msg):
await shop_add_goods.send(f'添加商品 {msg[0]} 成功...', at_sender=True)
if os.path.exists(f'{IMAGE_PATH}/shop_help.png'):
os.remove(f'{IMAGE_PATH}/shop_help.png')
logger.info(f'USER {event.user_id} 上传商品 {msg} 成功')
else:
await shop_add_goods.send(f'添加商品 {msg[0]} 失败了...', at_sender=True)
logger.warning(f'USER {event.user_id} 上传商品 {msg} 失败')
@shop_del_goods.handle()
async def _(bot: Bot, event: MessageEvent, state: T_State):
msg = get_message_text(event.json())
if msg:
name = ''
id_ = 0
if is_number(msg):
id_ = int(msg)
else:
name = msg
rst, goods_name, code = await del_goods(name, id_)
await shop_del_goods.send(rst, at_sender=True)
if code == 200:
await shop_del_goods.send(f'删除商品 {goods_name} 成功了...', at_sender=True)
if os.path.exists(f'{IMAGE_PATH}/shop_help.png'):
os.remove(f'{IMAGE_PATH}/shop_help.png')
logger.info(f'USER {event.user_id} 删除商品 {goods_name} 成功')
else:
await shop_del_goods.send(f'删除商品 {goods_name} 失败了...', at_sender=True)
logger.info(f'USER {event.user_id} 删除商品 {goods_name} 失败')
@shop_update_goods.handle()
async def _(bot: Bot, event: MessageEvent, state: T_State):
msg = get_message_text(event.json())
if msg:
tmp = {}
msg = msg.split('-')
for x in msg:
if x.find('name') != -1:
tmp['name'] = x.split(' ')[1].strip()
elif x.find('price') != -1:
tmp['price'] = x.split(' ')[1].strip()
if not is_number(tmp['price']):
await shop_update_goods.finish('价格必须是数字啊!', at_sender=True)
tmp['price'] = int(tmp['price'])
elif x.find('des') != -1:
tmp['des'] = x.split(' ')[1].strip()
elif x.find('discount') != -1:
tmp['discount'] = x.split(' ')[1].strip()
if not is_number(tmp['discount']):
await shop_update_goods.finish('折扣必须是数字啊!', at_sender=True)
tmp['discount'] = float(tmp['discount'])
elif x.find('time') != -1:
tmp['time'] = x.split(' ')[1].strip()
if not is_number(tmp['time']):
await shop_update_goods.finish('限时时间必须是数字啊!', at_sender=True)
tmp['time'] = time.time() + tmp['time'] * 60
if not tmp.get('name'):
await shop_update_goods.finish('未指定商品名称(序号也可)!', at_sender=True)
if is_number(tmp['name']):
tmp['name'] = int(tmp['name'])
flag, name, text = await update_goods(tmp)
if flag:
await shop_update_goods.send(f'修改商品 {name} 成功了...\n{text}', at_sender=True)
if os.path.exists(f'{IMAGE_PATH}/shop_help.png'):
os.remove(f'{IMAGE_PATH}/shop_help.png')
logger.info(f'USER {event.user_id} 修改商品 {name} 数据 {tmp} 成功')
else:
await shop_update_goods.send(f'修改商品 {name} 失败了...', at_sender=True)
logger.info(f'USER {event.user_id} 修改商品 {name} 数据 {tmp} 失败')
+99
View File
@@ -0,0 +1,99 @@
from models.goods_info import GoodsInfo
from util.img_utils import CreateImg
from util.utils import is_number
from configs.path_config import IMAGE_PATH
import time
async def create_shop_help():
goods_lst = await GoodsInfo.get_all_goods()
tmp = ''
idx = 1
for goods in goods_lst:
tmp += f'{idx}.{goods.goods_name}\t\t售价:{goods.goods_price}金币\n' \
f'\t\t{goods.goods_description}\n'
idx += 1
w = 1000
h = 400 + len(goods_lst) * 40
h = 1000 if h < 1000 else h
shop_logo = CreateImg(100, 100, background=f'{IMAGE_PATH}/other/shop_text.png')
shop = CreateImg(w, h, font_size=20)
zhenxun_img = CreateImg(525, 581, background=f'{IMAGE_PATH}/zhenxun/toukan_2.png')
shop.paste(zhenxun_img, (780, 100))
shop.paste(shop_logo, (450, 30), True)
shop.text((int((1000 - shop.getsize('注【通过 序号 或者 商品名称 购买】')[0]) / 2), 170), '注【通过 序号 或者 商品名称 购买】')
shop.text((20, 230), tmp[:-1])
shop.text((20, h - 100), '神秘药水\t\t售价:9999999金币\n\t\t鬼知道会有什么效果~')
shop.save(f'{IMAGE_PATH}/shop_help.png')
async def add_goods(msg: list):
data = {
'名称': None,
'价格': None,
'描述': None,
'折扣': 1,
'限时': 0,
}
keys = list(data.keys())
idx = 0
for x in msg:
data[keys[idx]] = x
idx += 1
return await GoodsInfo.add_goods(data['名称'], data['价格'], data['描述'], data['折扣'], data['限时'])
async def del_goods(name: str, id_: int):
goods_lst = await GoodsInfo.get_all_goods()
if id_:
if id_ < 1 or id_ > len(goods_lst):
return '序号错误,没有该序号商品...', '', 999
goods_name = goods_lst[id_ - 1].goods_name
if await GoodsInfo.del_goods(goods_name):
return f'删除商品 {goods_name} 成功!', goods_name, 200
else:
return f'删除商品 {goods_name} 失败!', goods_name, 999
if name:
if await GoodsInfo.del_goods(name):
return f'删除商品 {name} 成功!', name, 200
else:
return f'删除商品 {name} 失败!', name, 999
async def update_goods(data: dict):
goods_lst = await GoodsInfo.get_all_goods()
if is_number(data['name']):
if data['name'] < 1 or data['name'] > len(goods_lst):
return '序号错误,没有该序号的商品...', '', 999
goods = goods_lst[data['name'] - 1]
else:
goods = await GoodsInfo.get_goods_info(data['name'])
if not goods:
return '名称错误,没有该名称的商品...', '', 999
name = goods.goods_name
price = goods.goods_price
des = goods.goods_description
discount = goods.goods_discount
limit_time = goods.goods_limit_time
tmp = ''
if data.get('price'):
tmp += f'价格:{price} --> {data["price"]}\n'
price = data['price']
if data.get('des'):
tmp += f'描述:{des} --> {data["des"]}\n'
des = data['des']
if data.get('discount'):
tmp += f'折扣:{discount} --> {data["discount"]}\n'
discount = data['discount']
if data.get('time'):
old_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(limit_time))
new_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(data['time']))
tmp += f'折扣:{old_time} --> {new_time}\n'
limit_time = data['time']
return await GoodsInfo.update_goods(name, price, des, discount, limit_time), name, tmp[:-1]
-41
View File
@@ -1,41 +0,0 @@
from nonebot import on_command
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent
from nonebot.typing import T_State
from util.img_utils import CreateImg
from configs.path_config import IMAGE_PATH
from util.init_result import image
__plugin_name__ = '商店'
shop_help = on_command("商店", priority=5, block=True)
goods = [
'好感双倍加持卡Ⅰ\t\t售价:30金币\n\t\t下次签到双倍好感度的概率 + 10%(谁才是真命天子?)(同类商品将覆盖)',
'好感双倍加持卡Ⅱ\t\t售价:150金币\n\t\t下次签到双倍好感度的概率 + 20%(平平庸庸~)(同类商品将覆盖)',
'好感双倍加持卡Ⅲ\t\t售价:250金币\n\t\t下次签到双倍好感度的概率 + 30%(金币才是真命天子!)(同类商品将覆盖)'
]
result = ''
for i in range(len(goods)):
result += f'{i + 1}.{goods[i]}\n'
shop = CreateImg(1000, 1000, background=IMAGE_PATH + 'other/shop.png', font_size=20)
shop.text((100, 170), '注【通过 数字 或者 商品名称 购买】')
shop.text((20, 230), result)
shop.text((20, 900), '神秘药水\t\t售价:9999999金币\n\t\t鬼知道会有什么效果~')
shop.save(IMAGE_PATH + 'shop.png')
@shop_help.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
await shop_help.send(image('shop.png'))
+3 -3
View File
@@ -3,7 +3,7 @@ from services.log import logger
from nonebot.adapters.cqhttp import Bot, GroupMessageEvent
from nonebot.typing import T_State
from util.utils import is_number, get_message_text
from models.bag_user import UserBag
from models.bag_user import BagUser
from nonebot.adapters.cqhttp.permission import GROUP
from services.db_context import db
from .data_source import effect
@@ -21,7 +21,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
msg = get_message_text(event.json())
if msg in ['', '帮助']:
await use_props.finish(__plugin_usage__)
props = await UserBag.get_props(event.user_id, event.group_id)
props = await BagUser.get_props(event.user_id, event.group_id)
if props:
async with db.transaction():
pname_list = []
@@ -39,7 +39,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
if msg not in pname_list:
await use_props.finish('道具名称错误!', at_sender=True)
name = msg
if await UserBag.del_props(event.user_id, event.group_id, name) and\
if await BagUser.del_props(event.user_id, event.group_id, name) and\
await effect(event.user_id, event.group_id, name):
await use_props.send(f'使用道具 {name} 成功!', at_sender=True)
logger.info(f'USER {event.user_id} GROUP {event.group_id} 使用道具 {name} 成功')