From 198386e500775875cfc1dc8ecb7cf67d1dc94ff4 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Tue, 28 Mar 2023 23:14:02 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=A8=E6=B3=A8=E9=87=8A`SCRIPT`?= =?UTF-8?q?=E4=B8=AD=E7=9A=84sql=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++ basic_plugins/scripts.py | 85 ------------------- basic_plugins/shop/shop_handle/data_source.py | 5 -- models/goods_info.py | 9 ++ models/group_info.py | 6 ++ .../genshin/query_user/_models/__init__.py | 4 +- plugins/open_cases/__init__.py | 11 ++- plugins/open_cases/utils.py | 84 +++++++++--------- services/db_context.py | 8 +- 9 files changed, 81 insertions(+), 136 deletions(-) diff --git a/README.md b/README.md index 5dc414a8..4574e51b 100644 --- a/README.md +++ b/README.md @@ -331,6 +331,11 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能 ## 更新 +### 2023/3/28 + +* 补全注释`SCRIPT`中的sql语句 +* 罕见物品更新时会收录所有包含该物品的箱子,可以通过`更新皮肤ALL1 -S`强制更新所有罕见物品所属箱子 + ### 2023/3/27 * 优化开箱更新 diff --git a/basic_plugins/scripts.py b/basic_plugins/scripts.py index 90c5f77b..f9d350a3 100755 --- a/basic_plugins/scripts.py +++ b/basic_plugins/scripts.py @@ -58,91 +58,6 @@ async def update_city(): logger.error(f"自动城市列表未知错误", e=e) -# @driver.on_startup -# async def _(): -# """ -# 数据库表结构变换 -# """ -# _flag = [] -# sql_str = [ -# ( -# "ALTER TABLE group_info ADD group_flag Integer NOT NULL DEFAULT 0;", -# "group_info", -# ), # group_info表添加一个group_flag -# ( -# "ALTER TABLE bag_users rename belonging_group To group_id;", -# "bag_users", -# ), # 将 bag_users 的 belonging_group 改为 group_id -# ( -# "ALTER TABLE group_info_users rename belonging_group To group_id;", -# "group_info_users", -# ), -# ( -# "ALTER TABLE sign_group_users rename belonging_group To group_id;", -# "sign_group_users", -# ), -# ( -# "ALTER TABLE open_cases_users rename belonging_group To group_id;", -# "open_cases_users", -# ), -# ( -# "ALTER TABLE bag_users ADD property json NOT NULL DEFAULT '{}';", -# "bag_users", -# ), # bag_users 新增字段 property 替代 props -# ( -# "ALTER TABLE genshin ADD auto_sign_time timestamp with time zone;", -# "genshin", -# ), # 新增原神自动签到字段 -# ( -# "ALTER TABLE genshin ADD resin_remind boolean DEFAULT False;", -# "genshin", -# ), # 新增原神自动签到字段 -# ( -# "ALTER TABLE genshin ADD resin_recovery_time timestamp with time zone;", -# "genshin", -# ), # 新增原神自动签到字段 -# ("ALTER TABLE genshin ADD bind_group Integer;", "genshin"), # 新增原神群号绑定字段 -# ( -# "ALTER TABLE genshin ADD login_ticket VARCHAR(255) DEFAULT '';", -# "genshin", -# ), # 新增米游社login_ticket绑定字段 -# ( -# "ALTER TABLE genshin ADD stuid VARCHAR(255) DEFAULT '';", -# "genshin", -# ), # 新增米游社stuid绑定字段 -# ( -# "ALTER TABLE genshin ADD stoken VARCHAR(255) DEFAULT '';", -# "genshin", -# ), # 新增米游社stoken绑定字段 -# ("ALTER TABLE chat_history ADD plain_text Text;", "chat_history"), # 新增纯文本 -# ( -# "ALTER TABLE goods_info ADD daily_limit Integer DEFAULT 0;", -# "goods_info", -# ), # 新增纯文本 -# ( -# "ALTER TABLE goods_info ADD daily_purchase_limit Json DEFAULT '{}';", -# "goods_info", -# ), # 新增纯文本 -# ] -# for sql in sql_str + GDict.get("run_sql", []): -# try: -# if isinstance(sql, str): -# flag = f"{random.randint(1, 10000)}" -# else: -# flag = sql[1] -# sql = sql[0] -# query = db.text(sql) -# await db.first(query) -# logger.info(f"完成sql操作:{sql}") -# _flag.append(flag) -# except (DuplicateColumnError, UndefinedColumnError): -# pass -# except PostgresSyntaxError: -# logger.error(f"语法错误:执行sql失败:{sql}") -# bag_user 将文本转为字典格式 -# await __database_script(_flag) - - @driver.on_bot_connect async def _(bot: Bot): """ diff --git a/basic_plugins/shop/shop_handle/data_source.py b/basic_plugins/shop/shop_handle/data_source.py index 4f10ce5d..2d92e202 100644 --- a/basic_plugins/shop/shop_handle/data_source.py +++ b/basic_plugins/shop/shop_handle/data_source.py @@ -10,11 +10,6 @@ from utils.utils import GDict, is_number icon_path = IMAGE_PATH / "shop_icon" - -GDict["run_sql"].append("ALTER TABLE goods_info ADD is_passive boolean DEFAULT False;") -GDict["run_sql"].append("ALTER TABLE goods_info ADD icon VARCHAR(255);") - - # 创建商店界面 async def create_shop_help() -> str: """ diff --git a/models/goods_info.py b/models/goods_info.py index 431c1da8..bd73e1c3 100644 --- a/models/goods_info.py +++ b/models/goods_info.py @@ -194,3 +194,12 @@ class GoodsInfo(Model): goods.daily_limit - goods.daily_purchase_limit[group_id][user_id], ) return False, 0 + + @classmethod + def _run_script(cls): + return [ + "ALTER TABLE goods_info ADD daily_limit Integer DEFAULT 0;", + "ALTER TABLE goods_info ADD daily_purchase_limit Json DEFAULT '{}';", + "ALTER TABLE goods_info ADD is_passive boolean DEFAULT False;", + "ALTER TABLE goods_info ADD icon VARCHAR(255);", + ] diff --git a/models/group_info.py b/models/group_info.py index 88c598da..e3150cda 100755 --- a/models/group_info.py +++ b/models/group_info.py @@ -22,3 +22,9 @@ class GroupInfo(Model): class Meta: table = "group_info" table_description = "群聊信息表" + + @classmethod + def _run_script(cls): + return [ + "ALTER TABLE group_info ADD group_flag Integer NOT NULL DEFAULT 0;" # group_info表添加一个group_flag + ] diff --git a/plugins/genshin/query_user/_models/__init__.py b/plugins/genshin/query_user/_models/__init__.py index 0b5a9043..9bf3a26f 100644 --- a/plugins/genshin/query_user/_models/__init__.py +++ b/plugins/genshin/query_user/_models/__init__.py @@ -100,7 +100,7 @@ class Genshin(Model): "ALTER TABLE genshin ADD auto_sign_time timestamp with time zone;", "ALTER TABLE genshin ADD resin_remind boolean DEFAULT False;", "ALTER TABLE genshin ADD resin_recovery_time timestamp with time zone;", - "ALTER TABLE genshin ADD login_ticket VARCHAR(255) DEFAULT '';" - "ALTER TABLE genshin ADD stuid VARCHAR(255) DEFAULT '';" + "ALTER TABLE genshin ADD login_ticket VARCHAR(255) DEFAULT '';", + "ALTER TABLE genshin ADD stuid VARCHAR(255) DEFAULT '';", "ALTER TABLE genshin ADD stoken VARCHAR(255) DEFAULT '';", ] diff --git a/plugins/open_cases/__init__.py b/plugins/open_cases/__init__.py index bd799e3a..941916a5 100755 --- a/plugins/open_cases/__init__.py +++ b/plugins/open_cases/__init__.py @@ -58,8 +58,9 @@ usage: 更新皮肤指令 重置开箱: 重置今日开箱所有次数 指令: - 更新武器箱 ?[武器箱] - 更新皮肤 ?[刀具名称] + 更新武器箱 ?[武器箱/ALL] + 更新皮肤 ?[名称/ALL1] + 更新皮肤 ?[名称/ALL1] -S: (必定更新罕见皮肤所属箱子) * 不指定武器箱时则全部更新 * * 过多的爬取会导致账号API被封 * """.strip() @@ -202,6 +203,8 @@ async def _( @update_case.handle() async def _(event: MessageEvent, arg: Message = CommandArg(), cmd: str = OneCommand()): msg = arg.extract_plain_text().strip() + is_update_case_name = "-S" in msg + msg = msg.replace("-S", "").strip() if not msg: case_list = [] skin_list = [] @@ -227,7 +230,7 @@ async def _(event: MessageEvent, arg: Message = CommandArg(), cmd: str = OneComm await update_case.send(f"即将更新所有{type_}, 请稍等") for i, case_name in enumerate(case_list): try: - info = await update_skin_data(case_name) + info = await update_skin_data(case_name, is_update_case_name) if "请先登录" in info: await update_case.finish(f"未登录, 已停止更新...") rand = random.randint(300, 500) @@ -245,7 +248,7 @@ async def _(event: MessageEvent, arg: Message = CommandArg(), cmd: str = OneComm else: await update_case.send(f"开始{cmd}: {msg}, 请稍等") try: - await update_case.send(await update_skin_data(msg), at_sender=True) + await update_case.send(await update_skin_data(msg, is_update_case_name), at_sender=True) except Exception as e: logger.error(f"{cmd}: {msg}", e=e) await update_case.send(f"成功{cmd}: {msg} 发生错误: {type(e)}: {e}") diff --git a/plugins/open_cases/utils.py b/plugins/open_cases/utils.py index 7b5bb72d..8bb4b6ba 100755 --- a/plugins/open_cases/utils.py +++ b/plugins/open_cases/utils.py @@ -46,15 +46,16 @@ class CaseManager: @classmethod async def reload(cls): cls.CURRENT_CASES = ( - await BuffSkin.annotate().distinct().values_list("case_name", flat=True) # type: ignore + await BuffSkin.filter(case_name__not="未知武器箱").annotate().distinct().values_list("case_name", flat=True) # type: ignore ) -async def update_skin_data(name: str) -> str: +async def update_skin_data(name: str, is_update_case_name: bool) -> str: """更新箱子内皮肤数据 Args: name (str): 箱子名称 + is_update_case_name (bool): 是否必定更新所属箱子 Returns: _type_: _description_ @@ -70,15 +71,8 @@ async def update_skin_data(name: str) -> str: if not session: return "BUFF COOKIE为空捏!" weapon2case = {} - if type_ == UpdateType.CASE: - db_skin_id_list = [ - skin.skin_id for skin in await BuffSkin.filter(case_name=name).all() - ] - else: + if type_ == UpdateType.WEAPON_TYPE: db_data = await BuffSkin.filter(name__contains=name).all() - db_skin_id_list = [ - skin.skin_id for skin in await BuffSkin.filter(name__contains=name).all() - ] weapon2case = { item.name + item.skin_name: item.case_name for item in db_data @@ -99,6 +93,7 @@ async def update_skin_data(name: str) -> str: log_list = [] now = datetime.now() exists_id_list = [] + new_weapon2case = {} for skin in data_list: if skin.skin_id in exists_id_list: continue @@ -114,24 +109,29 @@ async def update_skin_data(name: str) -> str: name_ = skin.name + skin.skin_name + skin.abrasion skin.create_time = now skin.update_time = now - if not skin.case_name: - case_name = weapon2case.get(key) + if UpdateType.WEAPON_TYPE and not skin.case_name: + if is_update_case_name: + case_name = new_weapon2case.get(key) + else: + case_name = weapon2case.get(key) if not case_name: - case_name = await get_skin_case(skin.skin_id) - rand = random.randint(10, 20) - logger.debug( - f"获取 {skin.name} | {skin.skin_name} 皮肤所属武器箱: {case_name}, 访问随机等待时间: {rand}", - "开箱更新", - ) - await asyncio.sleep(rand) + if case_list := await get_skin_case(skin.skin_id): + case_name = ",".join(case_list) + rand = random.randint(10, 20) + logger.debug( + f"获取 {skin.name} | {skin.skin_name} 皮肤所属武器箱: {case_name}, 访问随机等待时间: {rand}", + "开箱更新", + ) + await asyncio.sleep(rand) if not case_name: case_name = "未知武器箱" else: weapon2case[key] = case_name + new_weapon2case[key] = case_name if skin.case_name == "反恐精英20周年": skin.case_name = "CS20" skin.case_name = case_name - if skin.skin_id in db_skin_id_list: + if await BuffSkin.exists(skin_id=skin.skin_id): update_list.append(skin) else: create_list.append(skin) @@ -154,15 +154,16 @@ async def update_skin_data(name: str) -> str: ) ) name_ = skin.name + "-" + skin.skin_name + "-" + skin.abrasion - file_path = BASE_PATH / cn2py(skin.case_name) / f"{cn2py(name_)}.jpg" - if not file_path.exists(): - logger.debug(f"下载皮肤 {name} 图片: {skin.img_url}...", "开箱更新") - await AsyncHttpx.download_file(skin.img_url, file_path) - rand_time = random.randint(1, 10) - await asyncio.sleep(rand_time) - logger.debug(f"图片下载随机等待时间: {rand_time}", "开箱更新") - else: - logger.debug(f"皮肤 {name_} 图片已存在...", "开箱更新") + for c_name_ in skin.case_name.split(","): + file_path = BASE_PATH / cn2py(c_name_) / f"{cn2py(name_)}.jpg" + if not file_path.exists(): + logger.debug(f"下载皮肤 {name} 图片: {skin.img_url}...", "开箱更新") + await AsyncHttpx.download_file(skin.img_url, file_path) + rand_time = random.randint(1, 10) + await asyncio.sleep(rand_time) + logger.debug(f"图片下载随机等待时间: {rand_time}", "开箱更新") + else: + logger.debug(f"皮肤 {name_} 图片已存在...", "开箱更新") if create_list: logger.debug(f"更新武器箱/皮肤: [{name}], 创建 {len(create_list)} 个皮肤!") await BuffSkin.bulk_create(set(create_list), 10) @@ -178,7 +179,7 @@ async def update_skin_data(name: str) -> str: if skin.skin_name not in skin_name_list: skin_name_list.append(skin.skin_name) db_data = await BuffSkin.filter( - case_name=name, + case_name__contains=name, skin_name__in=skin_name_list, name__in=name_list, abrasion__in=abrasion_list, @@ -498,7 +499,7 @@ def get_bk_image_size( return new_size -async def get_skin_case(id_: str) -> Optional[str]: +async def get_skin_case(id_: str) -> Optional[List[str]]: """获取皮肤所在箱子 Args: @@ -517,14 +518,19 @@ async def get_skin_case(id_: str) -> Optional[str]: ) if response.status_code == 200: text = response.text - if r := re.search('', text): - return ( - r.group(1) - .replace("”", "") - .replace("“", "") - .replace("武器箱", "") - .replace(" ", "") - ) + if r := re.search('', text): + case_list = [] + for s in r.group(1).split(","): + if "武器箱" in s: + case_list.append( + s.replace("”", "") + .replace("“", "") + .replace('"', "") + .replace("'", "") + .replace("武器箱", "") + .replace(" ", "") + ) + return case_list else: logger.debug(f"访问皮肤所属武器箱异常 url: {url} code: {response.status_code}") return None diff --git a/services/db_context.py b/services/db_context.py index 38b4d40f..7d6aec07 100755 --- a/services/db_context.py +++ b/services/db_context.py @@ -1,5 +1,6 @@ from typing import List +from nonebot.utils import is_coroutine_callable from tortoise import Tortoise, fields from tortoise.connection import connections from tortoise.models import Model as Model_ @@ -57,8 +58,13 @@ async def init(): sql_list = [] for module, func in SCRIPT_METHOD: try: - if sql := await func(): + if is_coroutine_callable(func): + sql = await func() + else: + sql = func() + if sql: sql_list += sql + except Exception as e: logger.debug(f"{module} 执行SCRIPT_METHOD方法出错...", e=e) for sql in sql_list: