mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-03 10:40:02 +08:00
update 0.0.6.0
This commit is contained in:
+11
-81
@@ -1,84 +1,14 @@
|
||||
from pathlib import Path
|
||||
from configs.path_config import DATA_PATH
|
||||
import nonebot
|
||||
try:
|
||||
import ujson as json
|
||||
except ModuleNotFoundError:
|
||||
import json
|
||||
from configs.config import Config
|
||||
|
||||
|
||||
Config.add_plugin_config(
|
||||
"shop",
|
||||
"IMPORT_DEFAULT_SHOP_GOODS",
|
||||
True,
|
||||
help_="导入商店自带的三个商品",
|
||||
default_value=True
|
||||
)
|
||||
|
||||
|
||||
nonebot.load_plugins("plugins/shop")
|
||||
|
||||
# 修改旧数据
|
||||
|
||||
statistics_group_file = Path(DATA_PATH) / "statistics" / "_prefix_count.json"
|
||||
statistics_user_file = Path(DATA_PATH) / "statistics" / "_prefix_user_count.json"
|
||||
|
||||
for file in [statistics_group_file, statistics_user_file]:
|
||||
if file.exists():
|
||||
with open(file, 'r', encoding='utf8') as f:
|
||||
data = json.load(f)
|
||||
if not (statistics_group_file.parent / f"{file}.bak").exists():
|
||||
with open(f"{file}.bak", 'w', encoding='utf8') as wf:
|
||||
json.dump(data, wf, ensure_ascii=False, indent=4)
|
||||
for x in ['total_statistics', 'day_statistics']:
|
||||
for key in data[x].keys():
|
||||
num = 0
|
||||
if data[x][key].get('我的道具') is not None:
|
||||
num += data[x][key]['我的道具']
|
||||
del data[x][key]['我的道具']
|
||||
if data[x][key].get('使用道具') is not None:
|
||||
num += data[x][key]['使用道具']
|
||||
del data[x][key]['使用道具']
|
||||
if data[x][key].get('我的金币') is not None:
|
||||
num += data[x][key]['我的金币']
|
||||
del data[x][key]['我的金币']
|
||||
if data[x][key].get('购买') is not None:
|
||||
num += data[x][key]['购买']
|
||||
del data[x][key]['购买']
|
||||
if data[x][key].get('商店') is not None:
|
||||
data[x][key]['商店'] += num
|
||||
else:
|
||||
data[x][key]['商店'] = num
|
||||
for x in ['week_statistics', 'month_statistics']:
|
||||
for key in data[x].keys():
|
||||
if key == 'total':
|
||||
if data[x][key].get('我的道具') is not None:
|
||||
num += data[x][key]['我的道具']
|
||||
del data[x][key]['我的道具']
|
||||
if data[x][key].get('使用道具') is not None:
|
||||
num += data[x][key]['使用道具']
|
||||
del data[x][key]['使用道具']
|
||||
if data[x][key].get('我的金币') is not None:
|
||||
num += data[x][key]['我的金币']
|
||||
del data[x][key]['我的金币']
|
||||
if data[x][key].get('购买') is not None:
|
||||
num += data[x][key]['购买']
|
||||
del data[x][key]['购买']
|
||||
if data[x][key].get('商店') is not None:
|
||||
data[x][key]['商店'] += num
|
||||
else:
|
||||
data[x][key]['商店'] = num
|
||||
else:
|
||||
for day in data[x][key].keys():
|
||||
num = 0
|
||||
if data[x][key][day].get('我的道具') is not None:
|
||||
num += data[x][key][day]['我的道具']
|
||||
del data[x][key][day]['我的道具']
|
||||
if data[x][key][day].get('使用道具') is not None:
|
||||
num += data[x][key][day]['使用道具']
|
||||
del data[x][key][day]['使用道具']
|
||||
if data[x][key][day].get('我的金币') is not None:
|
||||
num += data[x][key][day]['我的金币']
|
||||
del data[x][key][day]['我的金币']
|
||||
if data[x][key][day].get('购买') is not None:
|
||||
num += data[x][key][day]['购买']
|
||||
del data[x][key][day]['购买']
|
||||
if data[x][key][day].get('商店') is not None:
|
||||
data[x][key][day]['商店'] += num
|
||||
else:
|
||||
data[x][key][day]['商店'] = num
|
||||
with open(file, 'w', encoding='utf8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=4)
|
||||
|
||||
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ from utils.utils import get_message_text, is_number
|
||||
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
|
||||
from .models.goods_info import GoodsInfo
|
||||
|
||||
|
||||
__zx_plugin_name__ = "商店 - 购买道具"
|
||||
|
||||
+11
-4
@@ -4,6 +4,8 @@ from nonebot.typing import T_State
|
||||
from nonebot.adapters.cqhttp.permission import GROUP
|
||||
from utils.data_utils import init_rank
|
||||
from models.bag_user import BagUser
|
||||
from utils.message_builder import image
|
||||
from utils.utils import get_message_text, is_number
|
||||
|
||||
__zx_plugin_name__ = "商店 - 我的金币"
|
||||
__plugin_usage__ = """
|
||||
@@ -14,7 +16,7 @@ usage:
|
||||
""".strip()
|
||||
__plugin_des__ = "商店 - 我的金币"
|
||||
__plugin_cmd__ = ["我的金币"]
|
||||
__plugin_type__ = ('商店',)
|
||||
__plugin_type__ = ("商店",)
|
||||
__plugin_version__ = 0.1
|
||||
__plugin_author__ = "HibiKier"
|
||||
__plugin_settings__ = {
|
||||
@@ -37,9 +39,14 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
|
||||
@gold_rank.handle()
|
||||
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
num = get_message_text(event.json())
|
||||
if is_number(num) and 51 > int(num) > 10:
|
||||
num = int(num)
|
||||
else:
|
||||
num = 10
|
||||
all_users = await BagUser.get_all_users(event.group_id)
|
||||
all_user_id = [user.user_qq for user in all_users]
|
||||
all_user_data = [user.gold for user in all_users]
|
||||
await gold_rank.finish(
|
||||
"金币排行:\n" + await init_rank(all_user_id, all_user_data, event.group_id)
|
||||
)
|
||||
rank_image = await init_rank("金币排行", all_user_id, all_user_data, event.group_id, num)
|
||||
if rank_image:
|
||||
await gold_rank.finish(image(b64=rank_image.pic2bs4()))
|
||||
|
||||
@@ -19,6 +19,7 @@ from nonebot.matcher import Matcher
|
||||
from utils.utils import get_message_text, 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
|
||||
@@ -49,6 +50,9 @@ __plugin_settings__ = {
|
||||
"limit_superuser": False,
|
||||
"cmd": ["金币红包", "塞红包"],
|
||||
}
|
||||
__plugin_resources__ = {
|
||||
"prts": IMAGE_PATH
|
||||
}
|
||||
|
||||
gold_redbag = on_command(
|
||||
"塞红包", aliases={"金币红包"}, priority=5, block=True, permission=GROUP
|
||||
|
||||
@@ -3,7 +3,7 @@ from utils.utils import is_number, get_local_proxy
|
||||
from utils.image_utils import CreateImg
|
||||
from utils.user_agent import get_user_agent
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from models.redbag_user import RedbagUser
|
||||
from ..models.redbag_user import RedbagUser
|
||||
import random
|
||||
import os
|
||||
import aiohttp
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
from .goods_info import *
|
||||
@@ -0,0 +1,129 @@
|
||||
from services.db_context import db
|
||||
from typing import Optional, List
|
||||
|
||||
|
||||
class GoodsInfo(db.Model):
|
||||
__tablename__ = "goods_info"
|
||||
|
||||
id = db.Column(db.Integer(), primary_key=True)
|
||||
goods_name = db.Column(db.TEXT(), nullable=False) # 名称
|
||||
goods_price = db.Column(db.Integer(), nullable=False) # 价格
|
||||
goods_description = db.Column(db.TEXT(), nullable=False) # 商品描述
|
||||
goods_discount = db.Column(db.Numeric(scale=3, asdecimal=False), default=1) # 打折
|
||||
goods_limit_time = db.Column(db.BigInteger(), default=0) # 限时
|
||||
|
||||
_idx1 = db.Index("goods_group_users_idx1", "goods_name", unique=True)
|
||||
|
||||
@classmethod
|
||||
async def add_goods(
|
||||
cls,
|
||||
goods_name: str,
|
||||
goods_price: int,
|
||||
goods_description: str,
|
||||
goods_discount: float = 1,
|
||||
goods_limit_time: int = 0,
|
||||
) -> bool:
|
||||
"""
|
||||
说明:
|
||||
添加商品
|
||||
参数:
|
||||
:param goods_name: 商品名称
|
||||
:param goods_price: 商品价格
|
||||
:param goods_description: 商品简介
|
||||
:param goods_discount: 商品折扣
|
||||
:param goods_limit_time: 商品限时
|
||||
"""
|
||||
try:
|
||||
await cls.create(
|
||||
goods_name=goods_name,
|
||||
goods_price=goods_price,
|
||||
goods_description=goods_description,
|
||||
goods_discount=goods_discount,
|
||||
goods_limit_time=goods_limit_time,
|
||||
)
|
||||
return True
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
@classmethod
|
||||
async def delete_goods(cls, goods_name: str) -> bool:
|
||||
"""
|
||||
说明:
|
||||
删除商品
|
||||
参数:
|
||||
:param goods_name: 商品名称
|
||||
"""
|
||||
query = (
|
||||
await cls.query.where(cls.goods_name == goods_name)
|
||||
.with_for_update()
|
||||
.gino.first()
|
||||
)
|
||||
if not query:
|
||||
return False
|
||||
await query.delete()
|
||||
return True
|
||||
|
||||
@classmethod
|
||||
async def update_goods(
|
||||
cls,
|
||||
goods_name: str,
|
||||
goods_price: Optional[int] = None,
|
||||
goods_description: Optional[str] = None,
|
||||
goods_discount: Optional[float] = None,
|
||||
goods_limit_time: Optional[int] = None,
|
||||
) -> bool:
|
||||
"""
|
||||
说明:
|
||||
更新商品信息
|
||||
参数:
|
||||
:param goods_name: 商品名称
|
||||
:param goods_price: 商品价格
|
||||
:param goods_description: 商品简介
|
||||
:param goods_discount: 商品折扣
|
||||
:param goods_limit_time: 商品限时时间
|
||||
"""
|
||||
try:
|
||||
query = (
|
||||
await cls.query.where(cls.goods_name == goods_name)
|
||||
.with_for_update()
|
||||
.gino.first()
|
||||
)
|
||||
if not query:
|
||||
return False
|
||||
if goods_price:
|
||||
await query.update(goods_price=goods_price).apply()
|
||||
if goods_description:
|
||||
await query.update(goods_description=goods_description).apply()
|
||||
if goods_discount:
|
||||
await query.update(goods_discount=goods_discount).apply()
|
||||
if goods_limit_time:
|
||||
await query.update(goods_limit_time=goods_limit_time).apply()
|
||||
return True
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
@classmethod
|
||||
async def get_goods_info(cls, goods_name: str) -> "GoodsInfo":
|
||||
"""
|
||||
说明:
|
||||
获取商品对象
|
||||
参数:
|
||||
:param goods_name: 商品名称
|
||||
"""
|
||||
query = await cls.query.where(cls.goods_name == goods_name).gino.first()
|
||||
return query
|
||||
|
||||
@classmethod
|
||||
async def get_all_goods(cls) -> List["GoodsInfo"]:
|
||||
"""
|
||||
说明:
|
||||
获得全部有序商品对象
|
||||
"""
|
||||
query = await cls.query.gino.all()
|
||||
id_lst = [x.id for x in query]
|
||||
goods_lst = []
|
||||
for _ in range(len(query)):
|
||||
min_id = min(id_lst)
|
||||
goods_lst.append([x for x in query if x.id == min_id][0])
|
||||
id_lst.remove(min_id)
|
||||
return goods_lst
|
||||
@@ -0,0 +1,73 @@
|
||||
from services.db_context import db
|
||||
from typing import List
|
||||
|
||||
|
||||
class RedbagUser(db.Model):
|
||||
__tablename__ = "redbag_users"
|
||||
|
||||
id = db.Column(db.Integer(), primary_key=True)
|
||||
user_qq = db.Column(db.BigInteger(), nullable=False)
|
||||
group_id = db.Column(db.BigInteger(), nullable=False)
|
||||
send_redbag_count = db.Column(db.Integer(), default=0)
|
||||
get_redbag_count = db.Column(db.Integer(), default=0)
|
||||
spend_gold = db.Column(db.Integer(), default=0)
|
||||
get_gold = db.Column(db.Integer(), default=0)
|
||||
|
||||
_idx1 = db.Index("redbag_group_users_idx1", "user_qq", "group_id", unique=True)
|
||||
|
||||
@classmethod
|
||||
async def add_redbag_data(cls, user_qq: int, group_id: int, itype: str, money: int):
|
||||
"""
|
||||
说明:
|
||||
添加收发红包数据
|
||||
参数:
|
||||
:param user_qq: qq号
|
||||
:param group_id: 群号
|
||||
:param itype: 收或发
|
||||
:param money: 金钱数量
|
||||
"""
|
||||
query = cls.query.where((cls.user_qq == user_qq) & (cls.group_id == group_id))
|
||||
user = await query.with_for_update().gino.first() or await cls.create(
|
||||
user_qq=user_qq,
|
||||
group_id=group_id,
|
||||
)
|
||||
if itype == "get":
|
||||
await user.update(
|
||||
get_redbag_count=user.get_redbag_count + 1,
|
||||
get_gold=user.get_gold + money,
|
||||
).apply()
|
||||
else:
|
||||
await user.update(
|
||||
send_redbag_count=user.send_redbag_count + 1,
|
||||
spend_gold=user.spend_gold + money,
|
||||
).apply()
|
||||
|
||||
@classmethod
|
||||
async def ensure(cls, user_qq: int, group_id: int) -> bool:
|
||||
"""
|
||||
说明:
|
||||
获取用户对象
|
||||
参数:
|
||||
:param user_qq: qq号
|
||||
:param group_id: 群号
|
||||
"""
|
||||
query = cls.query.where((cls.user_qq == user_qq) & (cls.group_id == group_id))
|
||||
user = await query.gino.first() or await cls.create(
|
||||
user_qq=user_qq,
|
||||
group_id=group_id,
|
||||
)
|
||||
return user
|
||||
|
||||
@classmethod
|
||||
async def get_user_all(cls, group_id: int = None) -> List["RedbagUser"]:
|
||||
"""
|
||||
说明:
|
||||
获取所有用户对象
|
||||
参数:
|
||||
:param group_id: 群号
|
||||
"""
|
||||
if not group_id:
|
||||
query = await cls.query.gino.all()
|
||||
else:
|
||||
query = await cls.query.where((cls.group_id == group_id)).gino.all()
|
||||
return query
|
||||
@@ -1,8 +1,8 @@
|
||||
from models.goods_info import GoodsInfo
|
||||
from ..models.goods_info import GoodsInfo
|
||||
from utils.image_utils import CreateImg
|
||||
from utils.utils import is_number
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from configs.config import IMPORT_DEFAULT_SHOP_GOODS
|
||||
from configs.config import Config
|
||||
from nonebot import Driver
|
||||
import nonebot
|
||||
import time
|
||||
@@ -17,7 +17,7 @@ driver: Driver = nonebot.get_driver()
|
||||
async def init_default_shop_goods():
|
||||
if os.path.exists(f"{IMAGE_PATH}/shop_help.png"):
|
||||
os.remove(f"{IMAGE_PATH}/shop_help.png")
|
||||
if IMPORT_DEFAULT_SHOP_GOODS:
|
||||
if Config.get_config("shop", "IMPORT_DEFAULT_SHOP_GOODS"):
|
||||
await add_goods(["好感度双倍加持卡Ⅰ", 30, "下次签到双倍好感度概率 + 10%(谁才是真命天子?)(同类商品将覆盖)"])
|
||||
await add_goods(["好感度双倍加持卡Ⅱ", 150, "下次签到双倍好感度概率 + 20%(平平庸庸)(同类商品将覆盖)"])
|
||||
await add_goods(["好感度双倍加持卡Ⅲ", 250, "下次签到双倍好感度概率 + 30%(金币才是真命天子!)(同类商品将覆盖)"])
|
||||
|
||||
Reference in New Issue
Block a user