数据库中所有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
+26
View File
@@ -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 -2
View File
@@ -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);",
]
+6 -3
View File
@@ -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);",
]
+34 -32
View File
@@ -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(),
+45 -2
View File
@@ -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():
"""
重置每日开箱