mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-03 19:00:00 +08:00
数据库中所有user_qq改名以及user_id和group_id改为字符串
This commit is contained in:
@@ -33,6 +33,7 @@ from .utils import (
|
||||
CaseManager,
|
||||
build_case_image,
|
||||
get_skin_case,
|
||||
init_skin_trends,
|
||||
reset_count_daily,
|
||||
update_skin_data,
|
||||
)
|
||||
@@ -135,6 +136,31 @@ update_case = on_command(
|
||||
show_case = on_command("查看武器箱", priority=5, block=True)
|
||||
my_knifes = on_command("我的金色", priority=1, permission=GROUP, block=True)
|
||||
show_skin = on_command("查看皮肤", priority=5, block=True)
|
||||
price_trends = on_command("价格趋势", priority=5, block=True)
|
||||
|
||||
|
||||
@price_trends.handle()
|
||||
async def _(event: MessageEvent, arg: Message = CommandArg()):
|
||||
msg = arg.extract_plain_text().replace("武器箱", "").strip()
|
||||
if not msg:
|
||||
await price_trends.finish("未指定皮肤")
|
||||
msg_split = msg.split()
|
||||
if len(msg_split) < 3:
|
||||
await price_trends.finish("参数不足, [类型名称] [皮肤名称] [磨损程度] ?[天数=7]")
|
||||
abrasion = msg_split[2]
|
||||
day = 7
|
||||
if len(msg_split) > 3:
|
||||
if not is_number(msg_split[3]):
|
||||
await price_trends.finish("天数必须为数字")
|
||||
day = int(msg_split[3])
|
||||
if day <= 0 or day > 180:
|
||||
await price_trends.finish("天数必须大于0且小于180")
|
||||
result = await init_skin_trends(msg_split[0], msg_split[1], msg_split[2], day)
|
||||
if not result:
|
||||
await price_trends.finish("未查询到数据")
|
||||
await price_trends.send(
|
||||
image(await init_skin_trends(msg_split[0], msg_split[1], msg_split[2], day))
|
||||
)
|
||||
|
||||
|
||||
@reload_count.handle()
|
||||
|
||||
@@ -10,9 +10,9 @@ class OpenCasesLog(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"""
|
||||
case_name = fields.CharField(255)
|
||||
"""箱子名称"""
|
||||
@@ -36,3 +36,11 @@ class OpenCasesLog(Model):
|
||||
class Meta:
|
||||
table = "open_cases_log"
|
||||
table_description = "开箱日志表"
|
||||
|
||||
@classmethod
|
||||
async def _run_script(cls):
|
||||
return [
|
||||
"ALTER TABLE open_cases_log RENAME COLUMN user_qq TO user_id;", # 将user_qq改为user_id
|
||||
"ALTER TABLE open_cases_log ALTER COLUMN user_id TYPE character varying(255);",
|
||||
"ALTER TABLE open_cases_log ALTER COLUMN group_id TYPE character varying(255);",
|
||||
]
|
||||
|
||||
@@ -7,9 +7,9 @@ class OpenCasesUser(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"""
|
||||
total_count: int = fields.IntField(default=0)
|
||||
"""总开启次数"""
|
||||
@@ -47,11 +47,14 @@ class OpenCasesUser(Model):
|
||||
class Meta:
|
||||
table = "open_cases_users"
|
||||
table_description = "开箱统计数据表"
|
||||
unique_together = ("user_qq", "group_id")
|
||||
unique_together = ("user_id", "group_id")
|
||||
|
||||
@classmethod
|
||||
async def _run_script(cls):
|
||||
return [
|
||||
"alter table open_cases_users alter COLUMN make_money type float;", # 将make_money字段改为float
|
||||
"alter table open_cases_users alter COLUMN spend_money type float;", # 将spend_money字段改为float
|
||||
"ALTER TABLE open_cases_users RENAME COLUMN user_qq TO user_id;", # 将user_qq改为user_id
|
||||
"ALTER TABLE open_cases_users ALTER COLUMN user_id TYPE character varying(255);",
|
||||
"ALTER TABLE open_cases_users ALTER COLUMN group_id TYPE character varying(255);",
|
||||
]
|
||||
|
||||
@@ -63,17 +63,19 @@ def add_count(user: OpenCasesUser, skin: BuffSkin, case_price: float):
|
||||
user.spend_money += 17 + case_price
|
||||
|
||||
|
||||
async def get_user_max_count(user_qq: int, group_id: int) -> int:
|
||||
async def get_user_max_count(user_id: str, group_id: int) -> int:
|
||||
"""获取用户每日最大开箱次数
|
||||
|
||||
Args:
|
||||
user_qq (int): 用户id
|
||||
user_id (str): 用户id
|
||||
group_id (int): 群号
|
||||
|
||||
Returns:
|
||||
int: 最大开箱次数
|
||||
"""
|
||||
user, _ = await SignGroupUser.get_or_create(user_id=str(user_qq), group_id=str(group_id))
|
||||
user, _ = await SignGroupUser.get_or_create(
|
||||
user_id=str(user_id), group_id=str(group_id)
|
||||
)
|
||||
impression = int(user.impression)
|
||||
initial_open_case_count = Config.get_config("open_cases", "INITIAL_OPEN_CASE_COUNT")
|
||||
each_impression_add_count = Config.get_config(
|
||||
@@ -82,11 +84,11 @@ async def get_user_max_count(user_qq: int, group_id: int) -> int:
|
||||
return int(initial_open_case_count + impression / each_impression_add_count) # type: ignore
|
||||
|
||||
|
||||
async def open_case(user_qq: int, group_id: int, case_name: str) -> Union[str, Message]:
|
||||
async def open_case(user_id: str, group_id: int, case_name: str) -> Union[str, Message]:
|
||||
"""开箱
|
||||
|
||||
Args:
|
||||
user_qq (int): 用户id
|
||||
user_id (str): 用户id
|
||||
group_id (int): 群号
|
||||
case_name (str, optional): 武器箱名称. Defaults to "狂牙大行动".
|
||||
|
||||
@@ -99,14 +101,14 @@ async def open_case(user_qq: int, group_id: int, case_name: str) -> Union[str, M
|
||||
case_name = random.choice(CaseManager.CURRENT_CASES) # type: ignore
|
||||
if case_name not in CaseManager.CURRENT_CASES:
|
||||
return "武器箱未收录, 当前可用武器箱:\n" + ", ".join(CaseManager.CURRENT_CASES) # type: ignore
|
||||
logger.debug(f"尝试开启武器箱: {case_name}", "开箱", user_qq, group_id)
|
||||
logger.debug(f"尝试开启武器箱: {case_name}", "开箱", user_id, group_id)
|
||||
case = cn2py(case_name)
|
||||
user = await OpenCasesUser.get_or_none(user_qq=user_qq, group_id=group_id)
|
||||
user = await OpenCasesUser.get_or_none(user_id=user_id, group_id=group_id)
|
||||
if not user:
|
||||
user = await OpenCasesUser.create(
|
||||
user_qq=user_qq, group_id=group_id, open_cases_time_last=datetime.now()
|
||||
user_id=user_id, group_id=group_id, open_cases_time_last=datetime.now()
|
||||
)
|
||||
max_count = await get_user_max_count(user_qq, group_id)
|
||||
max_count = await get_user_max_count(user_id, group_id)
|
||||
# 一天次数上限
|
||||
if user.today_open_total >= max_count:
|
||||
return _handle_is_MAX_COUNT()
|
||||
@@ -129,12 +131,12 @@ async def open_case(user_qq: int, group_id: int, case_name: str) -> Union[str, M
|
||||
logger.info(
|
||||
f"开启{case_name}武器箱获得 {skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion}) 磨损: [{rand}] 价格: {skin.sell_min_price}",
|
||||
"开箱",
|
||||
user_qq,
|
||||
user_id,
|
||||
group_id,
|
||||
)
|
||||
await user.save()
|
||||
await OpenCasesLog.create(
|
||||
user_qq=user_qq,
|
||||
user_id=user_id,
|
||||
group_id=group_id,
|
||||
case_name=case_name,
|
||||
name=skin.name,
|
||||
@@ -146,7 +148,7 @@ async def open_case(user_qq: int, group_id: int, case_name: str) -> Union[str, M
|
||||
abrasion_value=rand,
|
||||
create_time=datetime.now(),
|
||||
)
|
||||
logger.debug(f"添加 1 条开箱日志", "开箱", user_qq, group_id)
|
||||
logger.debug(f"添加 1 条开箱日志", "开箱", user_id, group_id)
|
||||
over_count = max_count - user.today_open_total
|
||||
img = await draw_card(skin, rand)
|
||||
return (
|
||||
@@ -157,12 +159,12 @@ async def open_case(user_qq: int, group_id: int, case_name: str) -> Union[str, M
|
||||
|
||||
|
||||
async def open_multiple_case(
|
||||
user_qq: int, group_id: int, case_name: str, num: int = 10
|
||||
user_id: str, group_id: int, case_name: str, num: int = 10
|
||||
):
|
||||
"""多连开箱
|
||||
|
||||
Args:
|
||||
user_qq (int): 用户id
|
||||
user_id (int): 用户id
|
||||
group_id (int): 群号
|
||||
case_name (str): 箱子名称
|
||||
num (int, optional): 数量. Defaults to 10.
|
||||
@@ -177,11 +179,11 @@ async def open_multiple_case(
|
||||
if case_name not in CaseManager.CURRENT_CASES:
|
||||
return "武器箱未收录, 当前可用武器箱:\n" + ", ".join(CaseManager.CURRENT_CASES) # type: ignore
|
||||
user, _ = await OpenCasesUser.get_or_create(
|
||||
user_qq=user_qq,
|
||||
user_id=user_id,
|
||||
group_id=group_id,
|
||||
defaults={"open_cases_time_last": datetime.now()},
|
||||
)
|
||||
max_count = await get_user_max_count(user_qq, group_id)
|
||||
max_count = await get_user_max_count(user_id, group_id)
|
||||
if user.today_open_total >= max_count:
|
||||
return _handle_is_MAX_COUNT()
|
||||
if max_count - user.today_open_total < num:
|
||||
@@ -189,7 +191,7 @@ async def open_multiple_case(
|
||||
f"今天开箱次数不足{num}次噢,请单抽试试看(也许单抽运气更好?)"
|
||||
f"\n剩余开箱次数:{max_count - user.today_open_total}"
|
||||
)
|
||||
logger.debug(f"尝试开启武器箱: {case_name}", "开箱", user_qq, group_id)
|
||||
logger.debug(f"尝试开启武器箱: {case_name}", "开箱", user_id, group_id)
|
||||
case = cn2py(case_name)
|
||||
skin_count = {}
|
||||
img_list = []
|
||||
@@ -219,12 +221,12 @@ async def open_multiple_case(
|
||||
logger.info(
|
||||
f"开启{case_name}武器箱获得 {skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion}) 磨损: [{rand:.11f}] 价格: {skin.sell_min_price}",
|
||||
"开箱",
|
||||
user_qq,
|
||||
user_id,
|
||||
group_id,
|
||||
)
|
||||
log_list.append(
|
||||
OpenCasesLog(
|
||||
user_qq=user_qq,
|
||||
user_id=user_id,
|
||||
group_id=group_id,
|
||||
case_name=case_name,
|
||||
name=skin.name,
|
||||
@@ -240,7 +242,7 @@ async def open_multiple_case(
|
||||
await user.save()
|
||||
if log_list:
|
||||
await OpenCasesLog.bulk_create(log_list, 10)
|
||||
logger.debug(f"添加 {len(log_list)} 条开箱日志", "开箱", user_qq, group_id)
|
||||
logger.debug(f"添加 {len(log_list)} 条开箱日志", "开箱", user_id, group_id)
|
||||
img_w += 10
|
||||
img_h += 10
|
||||
w = img_w * 5
|
||||
@@ -273,8 +275,8 @@ def _handle_is_MAX_COUNT() -> str:
|
||||
return f"今天已达开箱上限了喔,明天再来吧\n(提升好感度可以增加每日开箱数 #疯狂暗示)"
|
||||
|
||||
|
||||
async def total_open_statistics(user_qq: int, group: int) -> str:
|
||||
user, _ = await OpenCasesUser.get_or_create(user_qq=user_qq, group_id=group)
|
||||
async def total_open_statistics(user_id: str, group: str) -> str:
|
||||
user, _ = await OpenCasesUser.get_or_create(user_id=user_id, group_id=group)
|
||||
return (
|
||||
f"开箱总数:{user.total_count}\n"
|
||||
f"今日开箱:{user.today_open_total}\n"
|
||||
@@ -294,7 +296,7 @@ async def total_open_statistics(user_qq: int, group: int) -> str:
|
||||
)
|
||||
|
||||
|
||||
async def group_statistics(group: int):
|
||||
async def group_statistics(group: str):
|
||||
user_list = await OpenCasesUser.filter(group_id=group).all()
|
||||
# lan zi fen hong jin pricei
|
||||
uplist = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0, 0]
|
||||
@@ -330,19 +332,19 @@ async def group_statistics(group: int):
|
||||
)
|
||||
|
||||
|
||||
async def get_my_knifes(user_id: int, group_id: int) -> Union[str, MessageSegment]:
|
||||
async def get_my_knifes(user_id: str, group_id: str) -> Union[str, MessageSegment]:
|
||||
"""获取我的金色
|
||||
|
||||
Args:
|
||||
user_id (int): 用户id
|
||||
group_id (int): 群号
|
||||
user_id (str): 用户id
|
||||
group_id (str): 群号
|
||||
|
||||
Returns:
|
||||
Union[str, MessageSegment]: 回复消息或图片
|
||||
"""
|
||||
data_list = await get_old_knife(user_id, group_id)
|
||||
data_list += await OpenCasesLog.filter(
|
||||
user_qq=user_id, group_id=group_id, color="KNIFE"
|
||||
user_id=user_id, group_id=group_id, color="KNIFE"
|
||||
).all()
|
||||
if not data_list:
|
||||
return "您木有开出金色级别的皮肤喔"
|
||||
@@ -377,17 +379,17 @@ async def get_my_knifes(user_id: int, group_id: int) -> Union[str, MessageSegmen
|
||||
return image(A)
|
||||
|
||||
|
||||
async def get_old_knife(user_id: int, group_id: int) -> List[OpenCasesLog]:
|
||||
async def get_old_knife(user_id: str, group_id: str) -> List[OpenCasesLog]:
|
||||
"""获取旧数据字段
|
||||
|
||||
Args:
|
||||
user_id (int): 用户id
|
||||
group_id (int): 群号
|
||||
user_id (str): 用户id
|
||||
group_id (str): 群号
|
||||
|
||||
Returns:
|
||||
List[OpenCasesLog]: 旧数据兼容
|
||||
"""
|
||||
user, _ = await OpenCasesUser.get_or_create(user_qq=user_id, group_id=group_id)
|
||||
user, _ = await OpenCasesUser.get_or_create(user_id=user_id, group_id=group_id)
|
||||
knifes_name = user.knifes_name
|
||||
data_list = []
|
||||
if knifes_name:
|
||||
@@ -406,7 +408,7 @@ async def get_old_knife(user_id: int, group_id: int) -> List[OpenCasesLog]:
|
||||
name = name.replace("(StatTrak™)", "")
|
||||
data_list.append(
|
||||
OpenCasesLog(
|
||||
user_qq=user_id,
|
||||
user_id=user_id,
|
||||
group_id=group_id,
|
||||
name=name.strip(),
|
||||
case_name=case_name_py.strip(),
|
||||
|
||||
@@ -3,7 +3,7 @@ import os
|
||||
import random
|
||||
import re
|
||||
import time
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timedelta
|
||||
from typing import List, Optional, Tuple, Union
|
||||
|
||||
import nonebot
|
||||
@@ -13,7 +13,7 @@ from configs.config import Config
|
||||
from configs.path_config import IMAGE_PATH
|
||||
from services.log import logger
|
||||
from utils.http_utils import AsyncHttpx
|
||||
from utils.image_utils import BuildImage
|
||||
from utils.image_utils import BuildImage, BuildMat
|
||||
from utils.utils import broadcast_group, cn2py
|
||||
|
||||
from .build_image import generate_skin
|
||||
@@ -547,6 +547,49 @@ async def get_skin_case(id_: str) -> Optional[List[str]]:
|
||||
return None
|
||||
|
||||
|
||||
async def init_skin_trends(
|
||||
name: str, skin: str, abrasion: str, day: int = 7
|
||||
) -> Optional[BuildMat]:
|
||||
date = datetime.now() - timedelta(days=day)
|
||||
log_list = (
|
||||
await BuffSkinLog.filter(
|
||||
name__contains=name.upper(),
|
||||
skin_name=skin,
|
||||
abrasion__contains=abrasion,
|
||||
create_time__gt=date,
|
||||
is_stattrak=False,
|
||||
)
|
||||
.order_by("create_time")
|
||||
.limit(day * 5)
|
||||
.all()
|
||||
)
|
||||
if not log_list:
|
||||
return None
|
||||
date_list = []
|
||||
price_list = []
|
||||
for log in log_list:
|
||||
date = str(log.create_time.date())
|
||||
if date not in date_list:
|
||||
date_list.append(date)
|
||||
price_list.append(log.sell_min_price)
|
||||
bar_graph = BuildMat(
|
||||
y=price_list,
|
||||
mat_type="line",
|
||||
title=f"{name}({skin})价格趋势({day})",
|
||||
x_index=date_list,
|
||||
x_min_spacing=90,
|
||||
display_num=True,
|
||||
x_rotate=30,
|
||||
background=[
|
||||
f"{IMAGE_PATH}/background/create_mat/{x}"
|
||||
for x in os.listdir(f"{IMAGE_PATH}/background/create_mat")
|
||||
],
|
||||
bar_color=["*"],
|
||||
)
|
||||
await asyncio.get_event_loop().run_in_executor(None, bar_graph.gen_graph)
|
||||
return bar_graph
|
||||
|
||||
|
||||
async def reset_count_daily():
|
||||
"""
|
||||
重置每日开箱
|
||||
|
||||
Reference in New Issue
Block a user