diff --git a/README.md b/README.md index 96f27435..a3faddcb 100644 --- a/README.md +++ b/README.md @@ -334,6 +334,7 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能 ### 2023/3/5 * 更新开箱会记录箱子数据以及开箱时箱子价格加入花费 +* 修复开箱BUG ### 2023/3/4 diff --git a/plugins/open_cases/models/buff_skin.py b/plugins/open_cases/models/buff_skin.py index 6070b59c..60b7faa9 100644 --- a/plugins/open_cases/models/buff_skin.py +++ b/plugins/open_cases/models/buff_skin.py @@ -26,19 +26,19 @@ class BuffSkin(Model): img_url = fields.CharField(255) """图片url""" - steam_price = fields.FloatField(default=0) + steam_price: float = fields.FloatField(default=0) """steam价格""" weapon_type = fields.CharField(255) """枪械类型""" - buy_max_price = fields.FloatField(default=0) + buy_max_price: float = fields.FloatField(default=0) """最大求购价格""" - buy_num = fields.IntField(default=0) + buy_num: int = fields.IntField(default=0) """求购数量""" - sell_min_price = fields.FloatField(default=0) + sell_min_price: float = fields.FloatField(default=0) """售卖最低价格""" - sell_num = fields.IntField(default=0) + sell_num: int = fields.IntField(default=0) """出售个数""" - sell_reference_price = fields.FloatField(default=0) + sell_reference_price: float = fields.FloatField(default=0) """参考价格""" create_time: datetime = fields.DatetimeField(auto_add_now=True) @@ -58,12 +58,21 @@ class BuffSkin(Model): abrasion: str, is_stattrak: bool = False, case_name: Optional[str] = None, - ) -> List["BuffSkin"]: + ) -> List["BuffSkin"]: # type: ignore query = cls if case_name: query = query.filter(case_name=case_name) query = query.filter(abrasion=abrasion, is_stattrak=is_stattrak, color=color) - return await query.annotate(rand=Random()).limit(num) # type:ignore + skin_list = await query.annotate(rand=Random()).limit(num) # type:ignore + num_ = num + cnt = 0 + while len(skin_list) < num: + cnt += 1 + num_ = num - len(skin_list) + skin_list += await query.annotate(rand=Random()).limit(num_) + if cnt > 10: + break + return skin_list # type: ignore @classmethod async def _run_script(cls): diff --git a/plugins/open_cases/open_cases_c.py b/plugins/open_cases/open_cases_c.py index 84b7fbf0..bb85a082 100755 --- a/plugins/open_cases/open_cases_c.py +++ b/plugins/open_cases/open_cases_c.py @@ -208,6 +208,8 @@ async def open_multiple_case( case_price = 0 if case_skin := await BuffSkin.get_or_none(case_name=case_name, color="CASE"): case_price = case_skin.sell_min_price + print(user.today_open_total) + cnt = 0 for skin, rand in skin_list: total_price += skin.sell_min_price rand = str(rand)[:11] @@ -218,11 +220,6 @@ async def open_multiple_case( if not skin_count.get(color_name): skin_count[color_name] = 0 skin_count[color_name] += 1 - if skin.color == "KNIFE": - user.knifes_name = ( - user.knifes_name - + f"{case}||{skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion}) 磨损:{rand}, 价格:{skin.sell_min_price}," - ) name = skin.name + "-" + skin.skin_name + "-" + skin.abrasion img_path = IMAGE_PATH / "csgo_cases" / case / f"{cn2py(name)}.jpg" wImg = BuildImage(200, 270, 200, 200) @@ -232,6 +229,7 @@ async def open_multiple_case( (5, 200), f"{skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion})", ) + cnt += 1 await wImg.atext((5, 220), f"磨损:{rand}") await wImg.atext((5, 240), f"价格:{skin.sell_min_price}") img_list.append(wImg) @@ -257,6 +255,7 @@ async def open_multiple_case( ) ) await user.save() + print(user.today_open_total) if log_list: await OpenCasesLog.bulk_create(log_list, 10) logger.debug(f"添加 {len(log_list)} 条开箱日志", "开箱", user_qq, group_id) @@ -430,8 +429,8 @@ async def get_old_knife(user_id: int, group_id: int) -> List[OpenCasesLog]: @scheduler.scheduled_job( "cron", - hour=0, - minute=1, + hour=23, + minute=9, ) async def _(): now = datetime.now() @@ -453,7 +452,10 @@ async def update(): logger.debug(f"预计自动更新武器箱 {len(case_list)} 个", "更新武器箱") for case_name in case_list: logger.debug(f"开始自动更新武器箱: {case_name}", "更新武器箱") - await update_case_data(case_name) - rand = random.randint(300, 500) - logger.debug(f"成功自动更新武器箱: {case_name}, 将在 {rand} 秒后再次更新下一武器箱", "更新武器箱") - await asyncio.sleep(rand) + try: + await update_case_data(case_name) + rand = random.randint(300, 500) + logger.debug(f"成功自动更新武器箱: {case_name}, 将在 {rand} 秒后再次更新下一武器箱", "更新武器箱") + await asyncio.sleep(rand) + except Exception as e: + logger.error(f"自动更新武器箱: {case_name}", e=e) diff --git a/plugins/open_cases/utils.py b/plugins/open_cases/utils.py index c30fa423..02f0fb15 100755 --- a/plugins/open_cases/utils.py +++ b/plugins/open_cases/utils.py @@ -68,8 +68,8 @@ async def update_case_data(case_name: str) -> str: data_list_, total = await search_skin_page(case_name, page) if isinstance(data_list_, list): data_list += data_list_ - create_list = [] - update_list = [] + create_list: List[BuffSkin] = [] + update_list: List[BuffSkin] = [] log_list = [] case_name_py = cn2py(case_name) now = datetime.now() @@ -113,11 +113,42 @@ async def update_case_data(case_name: str) -> str: logger.debug(f"更新武器箱: [{case_name}], 创建 {len(create_list)} 个皮肤!") await BuffSkin.bulk_create(create_list, 10) if update_list: + abrasion_list = [] + name_list = [] + skin_name_list = [] + for skin in update_list: + if skin.abrasion not in abrasion_list: + abrasion_list.append(skin.abrasion) + if skin.name not in name_list: + name_list.append(skin.name) + if skin.skin_name not in skin_name_list: + skin_name_list.append(skin.skin_name) + db_data = await BuffSkin.filter( + case_name=case_name, + skin_name__in=skin_name_list, + name__in=name_list, + abrasion__in=abrasion_list, + ).all() + _update_list = [] + for data in db_data: + for skin in update_list: + if ( + data.name == skin.name + and data.skin_name == skin.skin_name + and data.abrasion == skin.abrasion + ): + data.steam_price = skin.steam_price + data.buy_max_price = skin.buy_max_price + data.buy_num = skin.buy_num + data.sell_min_price = skin.sell_min_price + data.sell_num = skin.sell_num + data.sell_reference_price = skin.sell_reference_price + data.update_time = skin.update_time + _update_list.append(data) logger.debug(f"更新武器箱: [{case_name}], 更新 {len(create_list)} 个皮肤!") await BuffSkin.bulk_update( - update_list, + _update_list, [ - "skin_price", "steam_price", "buy_max_price", "buy_num",