def update_retry_data(retry_key: str, success_timeout: int, recommended_retry_wait_time_change_rate=0.125, debug_ctx=""): from dao import RetryData # 重新读取数据,避免其他进程已经更新过数据 db = load_db() raw_login_retry_data = db.get(retry_key, {}) login_retry_data = RetryData().auto_update_config(raw_login_retry_data) # 第idx-1次的重试成功了,尝试更新历史数据 cr = recommended_retry_wait_time_change_rate login_retry_data.recommended_first_retry_timeout = ( 1 - cr ) * login_retry_data.recommended_first_retry_timeout + cr * success_timeout login_retry_data.history_success_timeouts.append(success_timeout) db[retry_key] = to_raw_type(login_retry_data) save_db(db) if use_by_myself(): logger.info( color("bold_cyan") + f"(仅我可见){debug_ctx} 本次重试等待时间为{success_timeout},当前历史重试数据为{login_retry_data}" )
def save(self): # 本地存盘 with open(self.save_path, 'w', encoding='utf-8') as save_file: json.dump(to_raw_type(self.notices), save_file, ensure_ascii=False, indent=2) logger.info("公告存盘完毕") # 上传到网盘 uploader = Uploader() with open("upload_cookie.json") as fp: cookie = json.load(fp) uploader.login(cookie) uploader.upload_to_lanzouyun(self.save_path, uploader.folder_online_files, also_upload_compressed_version=True)
def save_config(cfg: Config, config_path="config.toml"): with open(config_path, 'w', encoding='utf-8') as save_file: data_to_save = json.loads(json.dumps(to_raw_type(cfg))) toml.dump(data_to_save, save_file)
def show_config_size(cfg: Config, ctx): data_to_save = json.loads(json.dumps(to_raw_type(cfg))) toml_str = toml.dumps(data_to_save) total_size = len(toml_str) total_lines = toml_str.count('\n') logger.info(f"{ctx} 生成配置文件大小为{total_size},总行数为{total_lines}")
def clone(self) -> RoleInfo: return RoleInfo().auto_update_config(to_raw_type(self))
def update_buy_user_local(order_infos: List[OrderInfo]): buy_users = {} # type: Dict[str, BuyInfo] if os.path.exists(local_save_path): with open(local_save_path, 'r', encoding='utf-8') as data_file: raw_infos = json.load(data_file) for qq, raw_info in raw_infos.items(): info = BuyInfo().auto_update_config(raw_info) buy_users[qq] = info datetime_fmt = "%Y-%m-%d %H:%M:%S" now = datetime.now() now_str = now.strftime(datetime_fmt) for order_info in order_infos: delta = timedelta(hours=24) if has_buy_recently(order_info.qq, delta): logger.error(f"{order_info.qq}在{delta}内已经处理过,是否是重复运行了?") continue if order_info.qq in buy_users: user_info = buy_users[order_info.qq] else: user_info = BuyInfo() user_info.qq = order_info.qq buy_users[order_info.qq] = user_info # 更新时长 expired_at = datetime.strptime(user_info.expire_at, datetime_fmt) if now > expired_at: # 已过期,从当前时间开始重新计算 start_time = now else: # 续期,从之前结束时间叠加 start_time = expired_at updated_expired_at = start_time + order_info.buy_month * month_inc user_info.expire_at = updated_expired_at.strftime(datetime_fmt) user_info.total_buy_month += order_info.buy_month user_info.buy_records.append(BuyRecord().auto_update_config({ "buy_month": order_info.buy_month, "buy_at": now_str, "reason": "购买", })) # 更新游戏QQ for game_qq in order_info.game_qqs: if game_qq not in user_info.game_qqs: user_info.game_qqs.append(game_qq) msg = f"{user_info.qq} 购买 {order_info.buy_month} 个月成功,过期时间为{user_info.expire_at},购买前过期时间为{expired_at}。累计购买{user_info.total_buy_month}个月。" msg += "购买详情如下:\n" + '\n'.join('\t' + f'{record.buy_at} {record.reason} {record.buy_month} 月' for record in user_info.buy_records) logger.info(msg) save_buy_timestamp(order_info.qq) with open(local_save_path, 'w', encoding='utf-8') as save_file: json.dump(to_raw_type(buy_users), save_file, indent=2, ensure_ascii=False) total_month = 0 for qq, user_info in buy_users.items(): if qq == "1054073896": # 跳过自己<_<,不然数据被污染了 continue total_month += user_info.total_buy_month total_money = 5 * total_month logger.info(color("bold_green") + f"目前总购买人数为{len(buy_users)},累计购买月数为{total_month},累积金额约为{total_money}")
def show_config_size(cfg: Config, ctx): data_to_save = json.loads(json.dumps(to_raw_type(cfg))) toml_str = toml.dumps(data_to_save) show_file_content_info(ctx, toml_str)