From 0bfe398dc496cbf0d69f8739d3a429b9a334f9c2 Mon Sep 17 00:00:00 2001 From: HibiKier <775757368@qq.com> Date: Sat, 15 Oct 2022 19:49:53 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=B3nonebot-rc1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +- basic_plugins/scripts.py | 2 +- basic_plugins/shop/buy.py | 23 +- .../{my_props.py => my_props/__init__.py} | 12 +- basic_plugins/shop/my_props/_data_source.py | 66 ++ basic_plugins/shop/shop_handle/__init__.py | 6 - basic_plugins/shop/shop_handle/data_source.py | 68 +- basic_plugins/shop/use/__init__.py | 48 +- basic_plugins/shop/use/data_source.py | 121 ++- models/bag_user.py | 10 +- models/goods_info.py | 18 +- models/shop_log.py | 59 ++ .../genshin/query_user/query_memo/__init__.py | 5 - .../query_user/resin_remind/init_task.py | 4 +- plugins/pix_gallery/__init__.py | 2 +- plugins/sign_in/__init__.py | 1 + plugins/sign_in/goods_register.py | 60 ++ poetry.lock | 821 +++++++++++------- pyproject.toml | 3 +- utils/decorator/shop.py | 143 ++- utils/manager/__init__.py | 5 - utils/utils.py | 21 +- 22 files changed, 1032 insertions(+), 479 deletions(-) rename basic_plugins/shop/{my_props.py => my_props/__init__.py} (76%) create mode 100644 basic_plugins/shop/my_props/_data_source.py create mode 100644 models/shop_log.py create mode 100644 plugins/sign_in/goods_register.py diff --git a/README.md b/README.md index 8b0d0dac..e3a43787 100644 --- a/README.md +++ b/README.md @@ -286,6 +286,17 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能 ## 更新 +### 2022/10/15 + +* nonebot2版本更新为rc1 +* 我的道具改为图片形式 +* 商品添加图标与是否为被动道具(被动道具无法被主动使用) +* 商品添加使用前方法和使用后方法(类似hook),使用方法具体查看文档或签到商品文件中注册的例子 + +### 2022/10/9 + +* 修复碧蓝档案角色获取问题,换源 [@pull/1124](https://github.com/HibiKier/zhenxun_bot/pull/1124) + ### 2022/10/7 * 修复 B 站请求返回 -401 错误 [@pull/1119](https://github.com/HibiKier/zhenxun_bot/pull/1119) @@ -368,7 +379,7 @@ PS: **ARM平台** 请使用全量版 同时 **如果你的机器 RAM < 1G 可能 * 修复b站转发解析av号无法解析 * B站订阅直播订阅支持短号 * 开箱提供重置开箱命令,重置今日所有开箱数据(重置次数,并不会删除今日已开箱记录) -* 提供全局字典GDict,通过from utils.manager import GDict导入 +* 提供全局字典GDict,通过from utils.utils import GDict导入 * 适配omega 13w张图的数据结构表(建议删表重导) * 除首次启动外将配置替换加入单次定时任务,加快启动速度 * fix: WordBank.check() [@pull/1008](https://github.com/HibiKier/zhenxun_bot/pull/1008) diff --git a/basic_plugins/scripts.py b/basic_plugins/scripts.py index 8965aac0..3e711d4b 100755 --- a/basic_plugins/scripts.py +++ b/basic_plugins/scripts.py @@ -15,7 +15,7 @@ from configs.path_config import TEXT_PATH from asyncio.exceptions import TimeoutError from typing import List from utils.http_utils import AsyncHttpx -from utils.manager import GDict +from utils.utils import GDict from utils.utils import scheduler import nonebot diff --git a/basic_plugins/shop/buy.py b/basic_plugins/shop/buy.py index e33e54e6..8a7ab9af 100644 --- a/basic_plugins/shop/buy.py +++ b/basic_plugins/shop/buy.py @@ -1,4 +1,6 @@ from nonebot import on_command + +from models.shop_log import ShopLog from services.log import logger from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message from nonebot.params import CommandArg @@ -46,10 +48,7 @@ async def _(event: GroupMessageEvent, arg: Message = CommandArg()): for x in await GoodsInfo.get_all_goods() if x.goods_limit_time > time.time() or x.goods_limit_time == 0 ] - goods_name_list = [ - x.goods_name - for x in goods_list - ] + goods_name_list = [x.goods_name for x in goods_list] msg = arg.extract_plain_text().strip().split() num = 1 if len(msg) > 1: @@ -77,11 +76,15 @@ async def _(event: GroupMessageEvent, arg: Message = CommandArg()): await BagUser.get_gold(event.user_id, event.group_id) ) < goods.goods_price * num * goods.goods_discount: await buy.finish("您的金币好像不太够哦", at_sender=True) - flag, n = await GoodsInfo.check_user_daily_purchase(goods, event.user_id, event.group_id, num) + flag, n = await GoodsInfo.check_user_daily_purchase( + goods, event.user_id, event.group_id, num + ) if flag: await buy.finish(f"该次购买将超过每日次数限制,目前该道具还可以购买{n}次哦", at_sender=True) if await BagUser.buy_property(event.user_id, event.group_id, goods, num): - await GoodsInfo.add_user_daily_purchase(goods, event.user_id, event.group_id, num) + await GoodsInfo.add_user_daily_purchase( + goods, event.user_id, event.group_id, num + ) await buy.send( f"花费 {goods.goods_price * num * goods.goods_discount} 金币购买 {goods.goods_name} ×{num} 成功!", at_sender=True, @@ -90,6 +93,14 @@ async def _(event: GroupMessageEvent, arg: Message = CommandArg()): f"USER {event.user_id} GROUP {event.group_id} " f"花费 {goods.goods_price*num} 金币购买 {goods.goods_name} ×{num} 成功!" ) + await ShopLog.add_shop_log( + event.user_id, + event.group_id, + 0, + goods.goods_name, + num, + goods.goods_price * num * goods.goods_discount, + ) else: await buy.send(f"{goods.goods_name} 购买失败!", at_sender=True) logger.info( diff --git a/basic_plugins/shop/my_props.py b/basic_plugins/shop/my_props/__init__.py similarity index 76% rename from basic_plugins/shop/my_props.py rename to basic_plugins/shop/my_props/__init__.py index f19a8e10..4f5e9827 100644 --- a/basic_plugins/shop/my_props.py +++ b/basic_plugins/shop/my_props/__init__.py @@ -1,4 +1,7 @@ from nonebot import on_command + +from utils.message_builder import image +from ._data_source import create_bag_image from services.log import logger from nonebot.adapters.onebot.v11 import GroupMessageEvent from models.bag_user import BagUser @@ -32,10 +35,11 @@ my_props = on_command("我的道具", priority=5, block=True, permission=GROUP) async def _(event: GroupMessageEvent): props = await BagUser.get_property(event.user_id, event.group_id) if props: - rst = "" - for i, p in enumerate(props.keys()): - rst += f"{i+1}.{p}\t×{props[p]}\n" - await my_props.send("\n" + rst[:-1], at_sender=True) + await my_props.send(image(b64=await create_bag_image(props))) + # rst = "" + # for i, p in enumerate(props.keys()): + # rst += f"{i+1}.{p}\t×{props[p]}\n" + # await my_props.send("\n" + rst[:-1], at_sender=True) logger.info(f"USER {event.user_id} GROUP {event.group_id} 查看我的道具") else: await my_props.finish("您的背包里没有任何的道具噢~", at_sender=True) diff --git a/basic_plugins/shop/my_props/_data_source.py b/basic_plugins/shop/my_props/_data_source.py new file mode 100644 index 00000000..ea142251 --- /dev/null +++ b/basic_plugins/shop/my_props/_data_source.py @@ -0,0 +1,66 @@ +from typing import Dict, List + +from models.bag_user import BagUser +from models.goods_info import GoodsInfo +from utils.image_utils import BuildImage +from configs.path_config import IMAGE_PATH + + +icon_path = IMAGE_PATH / 'shop_icon' + + +async def create_bag_image(props: Dict[str, int]): + """ + 说明: + 创建背包道具图片 + 参数: + :param props: 道具仓库字典 + """ + goods_list = await GoodsInfo.get_all_goods() + active_props = await _init_prop(props, [x for x in goods_list if not x.is_passive]) + passive_props = await _init_prop(props, [x for x in goods_list if x.is_passive]) + A = BuildImage(active_props.w + passive_props.w + 100, max(active_props.h, passive_props.h) + 100, font="CJGaoDeGuo.otf", font_size=30, color="#f9f6f2") + await A.apaste(active_props, (50, 70)) + await A.apaste(passive_props, (active_props.w + 50, 70)) + await A.aline((active_props.w + 45, 70, active_props.w + 45, A.h - 20), fill=(0, 0, 0)) + await A.atext((50, 30), "主动道具") + await A.atext((active_props.w + 55, 30), "被动道具") + return A.pic2bs4() + + +async def _init_prop(props: Dict[str, int], _props: List[GoodsInfo]) -> BuildImage: + """ + 说明: + 构造道具列表图片 + 参数: + :param props: 道具仓库字典 + :param _props: 道具列表 + """ + active_name = [x.goods_name for x in _props] + name_list = [x for x in props.keys() if x in active_name] + temp_img = BuildImage(0, 0, font_size=20) + image_list = [] + num_list = [] + for i, name in enumerate(name_list): + img = BuildImage(temp_img.getsize(name)[0] + 50, 30, font="msyh.ttf", font_size=20, color="#f9f6f2") + await img.atext((30, 5), f'{i + 1}.{name}') + goods = [x for x in _props if x.goods_name == name][0] + if goods.icon and (icon_path / goods.icon).exists(): + icon = BuildImage(30, 30, background=icon_path / goods.icon) + await img.apaste(icon, alpha=True) + image_list.append(img) + num_list.append(BuildImage(30, 30, font_size=20, plain_text=f"×{props[name]}")) + max_w = 0 + num_max_w = 0 + h = 0 + for img, num in zip(image_list, num_list): + h += img.h + max_w = max_w if max_w > img.w else img.w + num_max_w = num_max_w if num_max_w > num.w else num.w + A = BuildImage(max_w + num_max_w + 30, h, color="#f9f6f2") + curr_h = 0 + for img, num in zip(image_list, num_list): + await A.apaste(img, (0, curr_h)) + await A.apaste(num, (max_w + 20, curr_h + 5), True) + curr_h += img.h + return A diff --git a/basic_plugins/shop/shop_handle/__init__.py b/basic_plugins/shop/shop_handle/__init__.py index 0fd06280..6323f8af 100644 --- a/basic_plugins/shop/shop_handle/__init__.py +++ b/basic_plugins/shop/shop_handle/__init__.py @@ -6,7 +6,6 @@ from utils.message_builder import image from nonebot.permission import SUPERUSER from utils.utils import is_number, scheduler from nonebot.params import CommandArg -from nonebot.plugin import export from services.log import logger import os @@ -51,11 +50,6 @@ __plugin_block_limit__ = { "limit_type": "group" } -# 导出方法供其他插件使用 -export = export() -export.register_goods = register_goods -export.delete_goods = delete_goods -export.update_goods = update_goods shop_help = on_command("商店", priority=5, block=True) diff --git a/basic_plugins/shop/shop_handle/data_source.py b/basic_plugins/shop/shop_handle/data_source.py index 7f7ba537..701eaaea 100644 --- a/basic_plugins/shop/shop_handle/data_source.py +++ b/basic_plugins/shop/shop_handle/data_source.py @@ -2,49 +2,17 @@ from PIL import Image from models.goods_info import GoodsInfo from utils.image_utils import BuildImage -from models.sign_group_user import SignGroupUser from utils.utils import is_number from configs.path_config import IMAGE_PATH from typing import Optional, Union, Tuple -from configs.config import Config -from nonebot import Driver -from nonebot.plugin import require -from utils.decorator.shop import shop_register -import nonebot +from utils.utils import GDict import time -driver: Driver = nonebot.get_driver() +icon_path = IMAGE_PATH / 'shop_icon' -use = require("use") - - -@driver.on_startup -async def init_default_shop_goods(): - """ - 导入内置的三个商品 - """ - - @shop_register( - name=("好感度双倍加持卡Ⅰ", "好感度双倍加持卡Ⅱ", "好感度双倍加持卡Ⅲ"), - price=(30, 150, 250), - des=( - "下次签到双倍好感度概率 + 10%(谁才是真命天子?)(同类商品将覆盖)", - "下次签到双倍好感度概率 + 20%(平平庸庸)(同类商品将覆盖)", - "下次签到双倍好感度概率 + 30%(金币才是真命天子!)(同类商品将覆盖)", - ), - load_status=Config.get_config("shop", "IMPORT_DEFAULT_SHOP_GOODS"), - daily_limit=(10, 20, 30), - ** {"好感度双倍加持卡Ⅰ_prob": 0.1, "好感度双倍加持卡Ⅱ_prob": 0.2, "好感度双倍加持卡Ⅲ_prob": 0.3}, - ) - async def sign_card(user_id: int, group_id: int, prob: float): - user = await SignGroupUser.ensure(user_id, group_id) - await user.update(add_probability=prob).apply() - - -@driver.on_bot_connect -async def _(): - await shop_register.load_register() +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);") # 创建商店界面 @@ -63,7 +31,7 @@ async def create_shop_help() -> str: if goods.goods_limit_time == 0 or time.time() < goods.goods_limit_time: h += len(goods.goods_description.strip().split("\n")) * font_h + 80 _list.append(goods) - A = BuildImage(1000, h, color="#f9f6f2") + A = BuildImage(1100, h, color="#f9f6f2") current_h = 0 total_n = 0 for goods in _list: @@ -106,9 +74,12 @@ async def create_shop_help() -> str: await goods_image.apaste(name_image, (0, 5), True, center_type="by_width") await goods_image.atext((15, 50), f"简介:{goods.goods_description}") await goods_image.acircle_corner(20) - await bk.apaste(goods_image, alpha=True) + if goods.icon and (icon_path / goods.icon).exists(): + icon = BuildImage(100, 100, background=icon_path / goods.icon) + await bk.apaste(icon) + await bk.apaste(goods_image, (100, 0), alpha=True) n = 0 - _w = 550 + _w = 650 # 添加限时图标和时间 if goods.goods_limit_time > 0: n += 140 @@ -162,14 +133,14 @@ async def create_shop_help() -> str: if total_n < n: total_n = n if n: - await bk.aline((550, -1, 550 + n, -1), "#a29ad6", 5) - await bk.aline((550, 80, 550 + n, 80), "#a29ad6", 5) + await bk.aline((650, -1, 650 + n, -1), "#a29ad6", 5) + await bk.aline((650, 80, 650 + n, 80), "#a29ad6", 5) # 添加限时图标和时间 idx += 1 await A.apaste(bk, (0, current_h), True) current_h += 90 - w = 850 + w = 950 if total_n: w += total_n h = A.h + 230 + 100 @@ -197,6 +168,8 @@ async def register_goods( discount: Optional[float] = 1, limit_time: Optional[int] = 0, daily_limit: Optional[int] = 0, + is_passive: Optional[bool] = False, + icon: Optional[str] = None, ) -> bool: """ 添加商品 @@ -209,6 +182,8 @@ async def register_goods( :param discount: 商品折扣 :param limit_time: 商品限时销售时间,单位为小时 :param daily_limit: 每日购买次数限制 + :param is_passive: 是否为被动 + :param icon: 图标 :return: 是否添加成功 """ if not await GoodsInfo.get_goods_info(name): @@ -220,7 +195,7 @@ async def register_goods( else 0 ) return await GoodsInfo.add_goods( - name, int(price), des, float(discount), limit_time, daily_limit + name, int(price), des, float(discount), limit_time, daily_limit, is_passive, icon ) return False @@ -272,6 +247,7 @@ async def update_goods(**kwargs) -> Tuple[bool, str, str]: discount = goods.goods_discount limit_time = goods.goods_limit_time daily_limit = goods.daily_limit + is_passive = goods.is_passive new_time = 0 tmp = "" if kwargs.get("price"): @@ -294,6 +270,9 @@ async def update_goods(**kwargs) -> Tuple[bool, str, str]: if kwargs.get("daily_limit"): tmp += f'每日购买限制:{daily_limit} --> {kwargs["daily_limit"]}\n' if daily_limit else "取消了购买限制\n" daily_limit = int(kwargs["daily_limit"]) + if kwargs.get("is_passive"): + tmp += f'被动道具:{is_passive} --> {kwargs["is_passive"]}\n' + des = kwargs["is_passive"] await GoodsInfo.update_goods( name, int(price), @@ -304,7 +283,8 @@ async def update_goods(**kwargs) -> Tuple[bool, str, str]: if limit_time != 0 and new_time else 0 ), - daily_limit + daily_limit, + is_passive ) return True, name, tmp[:-1], diff --git a/basic_plugins/shop/use/__init__.py b/basic_plugins/shop/use/__init__.py index 69cc8540..0b0e2712 100644 --- a/basic_plugins/shop/use/__init__.py +++ b/basic_plugins/shop/use/__init__.py @@ -1,13 +1,16 @@ from nonebot import on_command + +from models.shop_log import ShopLog from services.log import logger from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, Message from nonebot.params import CommandArg + +from utils.decorator.shop import NotMeetUseConditionsException from utils.utils import is_number from models.bag_user import BagUser from nonebot.adapters.onebot.v11.permission import GROUP from services.db_context import db -from nonebot.plugin import export -from .data_source import effect, register_use, func_manager +from .data_source import effect, register_use, func_manager, build_params __zx_plugin_name__ = "商店 - 使用道具" @@ -30,9 +33,6 @@ __plugin_settings__ = { "cmd": ["商店", "使用道具"], } -# 导出方法供其他插件使用 -export = export() -export.register_use = register_use use_props = on_command("使用道具", priority=5, block=True, permission=GROUP) @@ -45,23 +45,29 @@ async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()): if len(msg_sp) > 1 and is_number(msg_sp[-1]) and int(msg_sp[-1]) > 0: num = int(msg.split()[-1]) msg = " ".join(msg.split()[:-1]) - property_ = await BagUser.get_property(event.user_id, event.group_id) + property_ = await BagUser.get_property(event.user_id, event.group_id, True) if property_: - async with db.transaction(): - if is_number(msg): - if 0 < int(msg) <= len(property_): - name = list(property_.keys())[int(msg) - 1] - else: - await use_props.finish("仔细看看自己的道具仓库有没有这个道具?", at_sender=True) + name = None + if is_number(msg): + if 0 < int(msg) <= len(property_): + name = list(property_.keys())[int(msg) - 1] else: - if msg not in property_.keys(): - await use_props.finish("道具名称错误!", at_sender=True) - name = msg - _user_prop_count = property_[name] - if num > _user_prop_count: - await use_props.finish(f"道具数量不足,无法使用{num}次!") - if num > (n := func_manager.get_max_num_limit(name)): - await use_props.finish(f"该道具单次只能使用 {n} 个!") + await use_props.finish("仔细看看自己的道具仓库有没有这个道具?", at_sender=True) + else: + if msg not in property_.keys(): + await use_props.finish("道具名称错误!", at_sender=True) + name = msg + _user_prop_count = property_[name] + if num > _user_prop_count: + await use_props.finish(f"道具数量不足,无法使用{num}次!") + if num > (n := func_manager.get_max_num_limit(name)): + await use_props.finish(f"该道具单次只能使用 {n} 个!") + model, kwargs = build_params(bot, event, name, num) + try: + await func_manager.run_handle(type_="before_handle", param=model, **kwargs) + except NotMeetUseConditionsException as e: + await use_props.finish(e.get_info(), at_sender=True) + async with db.transaction(): if await BagUser.delete_property( event.user_id, event.group_id, name, num ): @@ -72,10 +78,12 @@ async def _(bot: Bot, event: GroupMessageEvent, arg: Message = CommandArg()): logger.info( f"USER {event.user_id} GROUP {event.group_id} 使用道具 {name} {num} 次成功" ) + await ShopLog.add_shop_log(event.user_id, event.group_id, 1, name, num) else: await use_props.send(f"使用道具 {name} {num} 次失败!", at_sender=True) logger.info( f"USER {event.user_id} GROUP {event.group_id} 使用道具 {name} {num} 次失败" ) + await func_manager.run_handle(type_="after_handle", param=model, **kwargs) else: await use_props.send("您的背包里没有任何的道具噢", at_sender=True) diff --git a/basic_plugins/shop/use/data_source.py b/basic_plugins/shop/use/data_source.py index 0861a712..84cd055e 100644 --- a/basic_plugins/shop/use/data_source.py +++ b/basic_plugins/shop/use/data_source.py @@ -3,7 +3,7 @@ from services.log import logger from nonebot.adapters.onebot.v11 import Bot from pydantic import create_model from utils.models import ShopParam -from typing import Optional, Union +from typing import Optional, Union, Callable, List, Tuple, Dict, Any from types import MappingProxyType import inspect import asyncio @@ -13,6 +13,30 @@ class GoodsUseFuncManager: def __init__(self): self._data = {} + def register_use_before_handle(self, goods_name: str, fun_list: List[Callable]): + """ + 说明: + 注册商品使用前函数 + 参数: + :param goods_name: 商品名称 + :param fun_list: 函数列表 + """ + if fun_list: + self._data[goods_name]["before_handle"] = fun_list + logger.info(f"register_use_before_handle 成功注册商品:{goods_name} 的{len(fun_list)}个使用前函数") + + def register_use_after_handle(self, goods_name: str, fun_list: List[Callable]): + """ + 说明: + 注册商品使用后函数 + 参数: + :param goods_name: 商品名称 + :param fun_list: 函数列表 + """ + if fun_list: + self._data[goods_name]["after_handle"] = fun_list + logger.info(f"register_use_after_handle 成功注册商品:{goods_name} 的{len(fun_list)}个使用后函数") + def register_use(self, goods_name: str, **kwargs): """ 注册商品使用方法 @@ -26,7 +50,7 @@ class GoodsUseFuncManager: 判断商品使用方法是否被注册 :param goods_name: 商品名称 """ - return bool(self ._data.get(goods_name)) + return bool(self._data.get(goods_name)) def get_max_num_limit(self, goods_name: str) -> int: """ @@ -37,6 +61,21 @@ class GoodsUseFuncManager: return self._data[goods_name]["kwargs"]["max_num_limit"] return 1 + def _parse_args(self, args_: MappingProxyType, param: ShopParam, **kwargs): + param_list_ = [] + _bot = param.bot + param.bot = None + param_json = param.dict() + param_json["bot"] = _bot + for par in args_.keys(): + if par in ["shop_param"]: + param_list_.append(param) + elif par not in ["args", "kwargs"]: + param_list_.append(param_json.get(par)) + if kwargs.get(par) is not None: + del kwargs[par] + return param_list_ + async def use( self, param: ShopParam, **kwargs ) -> Optional[Union[str, MessageSegment]]: @@ -45,31 +84,18 @@ class GoodsUseFuncManager: :param param: BaseModel :param kwargs: kwargs """ - def parse_args(args_: MappingProxyType): - param_list_ = [] - _bot = param.bot - param.bot = None - param_json = param.dict() - param_json["bot"] = _bot - for par in args_.keys(): - if par in ["shop_param"]: - param_list_.append(param) - elif par not in ["args", "kwargs"]: - param_list_.append(param_json.get(par)) - if kwargs.get(par) is not None: - del kwargs[par] - return param_list_ goods_name = param.goods_name if self.exists(goods_name): + # 使用方法 args = inspect.signature(self._data[goods_name]["func"]).parameters if args and list(args.keys())[0] != "kwargs": if asyncio.iscoroutinefunction(self._data[goods_name]["func"]): return await self._data[goods_name]["func"]( - *parse_args(args) + *self._parse_args(args, param, **kwargs) ) else: return self._data[goods_name]["func"]( - *parse_args(args) + *self._parse_args(args, param, **kwargs) ) else: if asyncio.iscoroutinefunction(self._data[goods_name]["func"]): @@ -81,6 +107,21 @@ class GoodsUseFuncManager: **kwargs, ) + async def run_handle(self, goods_name: str, type_: str, param: ShopParam, **kwargs): + if self._data[goods_name].get(type_): + for func in self._data[goods_name].get(type_): + args = inspect.signature(func).parameters + if args and list(args.keys())[0] != "kwargs": + if asyncio.iscoroutinefunction(func): + await func(*self._parse_args(args, param, **kwargs)) + else: + func(*self._parse_args(args, param, **kwargs)) + else: + if asyncio.iscoroutinefunction(func): + await func(**kwargs) + else: + func(**kwargs) + def check_send_success_message(self, goods_name: str) -> bool: """ 检查是否发送使用成功信息 @@ -115,6 +156,34 @@ class GoodsUseFuncManager: func_manager = GoodsUseFuncManager() +def build_params( + bot: Bot, event: GroupMessageEvent, goods_name: str, num: int +) -> Tuple[ShopParam, Dict[str, Any]]: + """ + 说明: + 构造参数 + 参数: + :param bot: bot + :param event: event + :param goods_name: 商品名称 + :param num: 数量 + :return: + """ + _kwargs = func_manager.get_kwargs(goods_name) + return ( + func_manager.init_model(goods_name, bot, event, num), + { + **_kwargs, + "_bot": bot, + "event": event, + "group_id": event.group_id, + "user_id": event.user_id, + "num": num, + "goods_name": goods_name, + }, + ) + + async def effect( bot: Bot, event: GroupMessageEvent, goods_name: str, num: int ) -> Optional[Union[str, MessageSegment]]: @@ -130,24 +199,14 @@ async def effect( # try: if func_manager.exists(goods_name): _kwargs = func_manager.get_kwargs(goods_name) - return await func_manager.use( - func_manager.init_model(goods_name, bot, event, num), - **{ - **_kwargs, - "_bot": bot, - "event": event, - "group_id": event.group_id, - "user_id": event.user_id, - "num": num, - "goods_name": goods_name, - }, - ) + model, kwargs = build_params(bot, event, goods_name, num) + return await func_manager.use(model, **kwargs) # except Exception as e: # logger.error(f"use 商品生效函数effect 发生错误 {type(e)}:{e}") return None -def register_use(goods_name: str, func, **kwargs): +def register_use(goods_name: str, func: Callable, **kwargs): """ 注册商品使用方法 :param goods_name: 商品名称 diff --git a/models/bag_user.py b/models/bag_user.py index ba24a3dc..0027d0d6 100755 --- a/models/bag_user.py +++ b/models/bag_user.py @@ -2,6 +2,7 @@ from services.db_context import db from typing import Dict from typing import Optional, List from services.log import logger +from .goods_info import GoodsInfo class BagUser(db.Model): @@ -62,17 +63,24 @@ class BagUser(db.Model): return 100 @classmethod - async def get_property(cls, user_qq: int, group_id: int) -> Dict[str, int]: + async def get_property(cls, user_qq: int, group_id: int, only_active: bool = False) -> Dict[str, int]: """ 说明: 获取当前道具 参数: :param user_qq: qq号 :param group_id: 所在群号 + :param only_active: 仅仅获取主动使用的道具 """ query = cls.query.where((cls.user_qq == user_qq) & (cls.group_id == group_id)) user = await query.gino.first() if user: + if only_active and user.property: + data = {} + name_list = [x.goods_name for x in await GoodsInfo.get_all_goods() if not x.is_passive] + for key in [x for x in user.property.keys() if x in name_list]: + data[key] = user.property[key] + return data return user.property else: await cls.create( diff --git a/models/goods_info.py b/models/goods_info.py index 98c99367..f2cfccaf 100644 --- a/models/goods_info.py +++ b/models/goods_info.py @@ -16,6 +16,8 @@ class GoodsInfo(db.Model): daily_purchase_limit = db.Column( db.JSON(), nullable=False, default={} ) # 每日购买限制数据存储 + is_passive = db.Column(db.Boolean(), nullable=False, default=0) # 是否为被动 + icon = db.Column(db.String(), nullable=False, default=0) # 图标 _idx1 = db.Index("goods_group_users_idx1", "goods_name", unique=True) @@ -28,6 +30,8 @@ class GoodsInfo(db.Model): goods_discount: float = 1, goods_limit_time: int = 0, daily_limit: int = 0, + is_passive: bool = False, + icon: Optional[str] = None, ) -> bool: """ 说明: @@ -39,6 +43,8 @@ class GoodsInfo(db.Model): :param goods_discount: 商品折扣 :param goods_limit_time: 商品限时 :param daily_limit: 每日购买限制 + :param is_passive: 是否为被动道具 + :param icon: 图标 """ try: if not await cls.get_goods_info(goods_name): @@ -49,10 +55,12 @@ class GoodsInfo(db.Model): goods_discount=goods_discount, goods_limit_time=goods_limit_time, daily_limit=daily_limit, + is_passive=is_passive, + icon=icon ) return True except Exception as e: - logger.error(f"GoodsInfo add_goods 发生错误 {type(e)}:{e}") + logger.error(f"GoodsInfo add_goods {goods_name} 发生错误 {type(e)}:{e}") return False @classmethod @@ -81,7 +89,9 @@ class GoodsInfo(db.Model): goods_description: Optional[str] = None, goods_discount: Optional[float] = None, goods_limit_time: Optional[int] = None, - daily_limit: Optional[int] = None + daily_limit: Optional[int] = None, + is_passive: Optional[bool] = None, + icon: Optional[str] = None, ) -> bool: """ 说明: @@ -93,6 +103,8 @@ class GoodsInfo(db.Model): :param goods_discount: 商品折扣 :param goods_limit_time: 商品限时时间 :param daily_limit: 每日次数限制 + :param is_passive: 是否为被动 + :param icon: 图标 """ try: query = ( @@ -108,6 +120,8 @@ class GoodsInfo(db.Model): goods_discount=goods_discount or query.goods_discount, goods_limit_time=goods_limit_time if goods_limit_time is not None else query.goods_limit_time, daily_limit=daily_limit if daily_limit is not None else query.daily_limit, + is_passive=is_passive if is_passive is not None else query.is_passive, + icon=icon or query.icon ).apply() return True except Exception as e: diff --git a/models/shop_log.py b/models/shop_log.py new file mode 100644 index 00000000..65b0041e --- /dev/null +++ b/models/shop_log.py @@ -0,0 +1,59 @@ +from datetime import datetime + +from services.db_context import db + + +class ShopLog(db.Model): + __tablename__ = "shop_log" + id = db.Column(db.Integer(), primary_key=True) + user_qq = db.Column(db.BigInteger(), nullable=False) + group_id = db.Column(db.BigInteger(), nullable=False) + type = db.Column(db.Integer(), nullable=False) # 0: 购买,1: 使用 + goods_name = db.Column(db.String(), default=100) + spend_gold = db.Column(db.Integer(), nullable=False) + num = db.Column(db.Integer(), nullable=False) + create_time = db.Column(db.DateTime(timezone=True), nullable=False) + + @classmethod + async def add_shop_log( + cls, + user_qq: int, + group_id: int, + type_: int, + goods_name: str, + num: int, + spend_gold: int = 0, + ): + """ + 说明: + 添加商店购买或使用日志 + 参数: + :param user_qq: qq号 + :param group_id: 所在群号 + :param type_: 类型 + :param goods_name: 商品名称 + :param num: 数量 + :param spend_gold: 花费金币 + """ + await cls.create( + user_qq=user_qq, + group_id=group_id, + type=type_, + goods_name=goods_name, + num=num, + spend_gold=spend_gold, + create_time=datetime.now(), + ) + + @classmethod + async def get_user_log(cls, user_qq: int, group_id: int) -> "ShopLog": + """ + 说明: + 获取用户日志 + 参数: + :param user_qq: qq号 + :param group_id: 所在群号 + """ + return await cls.query.where( + (cls.user_qq == user_qq) & (cls.group_qq == group_id) + ).first() diff --git a/plugins/genshin/query_user/query_memo/__init__.py b/plugins/genshin/query_user/query_memo/__init__.py index e8e7975b..3d66f3bf 100644 --- a/plugins/genshin/query_user/query_memo/__init__.py +++ b/plugins/genshin/query_user/query_memo/__init__.py @@ -3,7 +3,6 @@ from nonebot.adapters.onebot.v11 import MessageEvent, GroupMessageEvent from services.log import logger from .data_source import get_user_memo, get_memo from .._models import Genshin -from nonebot.plugin import export __zx_plugin_name__ = "原神便笺查询" @@ -28,10 +27,6 @@ __plugin_settings__ = { __plugin_block_limit__ = {} -export = export() - -export.get_memo = get_memo - query_memo_matcher = on_command("原神便签查询", aliases={"原神便笺查询", "yss"}, priority=5, block=True) diff --git a/plugins/genshin/query_user/resin_remind/init_task.py b/plugins/genshin/query_user/resin_remind/init_task.py index cc535930..f8cf62a8 100644 --- a/plugins/genshin/query_user/resin_remind/init_task.py +++ b/plugins/genshin/query_user/resin_remind/init_task.py @@ -19,7 +19,9 @@ import pytz driver: Driver = nonebot.get_driver() -get_memo = require("query_memo").get_memo +require("query_memo") + +from ..query_memo import get_memo global_map = {} diff --git a/plugins/pix_gallery/__init__.py b/plugins/pix_gallery/__init__.py index 1b2bc5ac..ad9b48a7 100755 --- a/plugins/pix_gallery/__init__.py +++ b/plugins/pix_gallery/__init__.py @@ -1,5 +1,5 @@ from configs.config import Config -from utils.manager import GDict +from utils.utils import GDict import nonebot diff --git a/plugins/sign_in/__init__.py b/plugins/sign_in/__init__.py index 871cc3e3..fd001d65 100755 --- a/plugins/sign_in/__init__.py +++ b/plugins/sign_in/__init__.py @@ -18,6 +18,7 @@ from configs.path_config import DATA_PATH from services.log import logger from .utils import clear_sign_data_pic from utils.utils import is_number +from .goods_register import driver try: import ujson as json diff --git a/plugins/sign_in/goods_register.py b/plugins/sign_in/goods_register.py new file mode 100644 index 00000000..74351813 --- /dev/null +++ b/plugins/sign_in/goods_register.py @@ -0,0 +1,60 @@ + +from models.sign_group_user import SignGroupUser +from configs.config import Config +from nonebot import Driver +from utils.decorator.shop import shop_register, NotMeetUseConditionsException +import nonebot + +driver: Driver = nonebot.get_driver() + + +@driver.on_startup +async def _(): + """ + 导入内置的三个商品 + """ + + @shop_register( + name=("好感度双倍加持卡Ⅰ", "好感度双倍加持卡Ⅱ", "好感度双倍加持卡Ⅲ"), + price=(30, 150, 250), + des=( + "下次签到双倍好感度概率 + 10%(谁才是真命天子?)(同类商品将覆盖)", + "下次签到双倍好感度概率 + 20%(平平庸庸)(同类商品将覆盖)", + "下次签到双倍好感度概率 + 30%(金币才是真命天子!)(同类商品将覆盖)", + ), + load_status=Config.get_config("shop", "IMPORT_DEFAULT_SHOP_GOODS"), + icon=("favorability_card_1.png", "favorability_card_2.png", "favorability_card_3.png"), + ** {"好感度双倍加持卡Ⅰ_prob": 0.1, "好感度双倍加持卡Ⅱ_prob": 0.2, "好感度双倍加持卡Ⅲ_prob": 0.3}, + ) + async def sign_card(user_id: int, group_id: int, prob: float): + user = await SignGroupUser.ensure(user_id, group_id) + await user.update(add_probability=prob).apply() + + @shop_register( + name="测试道具A", + price=99, + des="随便侧而出", + load_status=False, + icon="sword.png", + ) + async def _(user_id: int, group_id: int): + print(user_id, group_id, '使用测试道具') + + @shop_register.before_handle(name="测试道具A", load_status=False) + async def _(user_id: int, group_id: int): + print(user_id, group_id, '第一个使用前函数(before handle)') + + @shop_register.before_handle(name="测试道具A", load_status=False) + async def _(user_id: int, group_id: int): + print(user_id, group_id, '第二个使用前函数(before handle)222') + raise NotMeetUseConditionsException("太笨了!") # 抛出异常,阻断使用,并返回信息 + + @shop_register.after_handle(name="测试道具A", load_status=False) + async def _(user_id: int, group_id: int): + print(user_id, group_id, '第一个使用后函数(after handle)') + + +@driver.on_bot_connect +async def _(): + await shop_register.load_register() + diff --git a/poetry.lock b/poetry.lock index d245cb25..75356819 100644 --- a/poetry.lock +++ b/poetry.lock @@ -9,7 +9,7 @@ python-versions = ">=3.6,<4.0" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "aiohttp" @@ -33,7 +33,7 @@ speedups = ["aiodns", "brotlipy", "cchardet"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "anyio" @@ -55,7 +55,7 @@ trio = ["trio (>=0.16)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "apscheduler" @@ -86,7 +86,7 @@ zookeeper = ["kazoo"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "async-timeout" @@ -99,7 +99,7 @@ python-versions = ">=3.5.3" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "asyncpg" @@ -117,7 +117,7 @@ test = ["pycodestyle (>=2.7.0,<2.8.0)", "flake8 (>=3.9.2,<3.10.0)", "uvloop (>=0 [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "attrs" @@ -136,7 +136,7 @@ tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "backports.zoneinfo" @@ -152,7 +152,7 @@ tzdata = ["tzdata"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "beautifulsoup4" @@ -172,21 +172,21 @@ lxml = ["lxml"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "bilireq" -version = "0.2.2.post0" +version = "0.2.3.post0" description = "" category = "main" optional = false python-versions = ">=3.7,<4.0" [package.dependencies] -grpcio = ">=1.46.3,<2.0.0" +grpcio = ">=1.49.1,<2.0.0" httpx = ">=0.23.0,<0.24.0" -protobuf = "3.20.1" -rsa = ">=4.8,<5.0" +protobuf = ">=4.21.7,<5.0.0" +rsa = ">=4.9,<5.0" [package.extras] qrcode = ["qrcode[pil] (>=7.3.1,<8.0.0)"] @@ -194,15 +194,15 @@ qrcode = ["qrcode[pil] (>=7.3.1,<8.0.0)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "black" -version = "22.8.0" +version = "22.10.0" description = "The uncompromising code formatter." category = "main" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7" [package.dependencies] click = ">=8.0.0" @@ -221,11 +221,11 @@ uvloop = ["uvloop (>=0.15.2)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "certifi" -version = "2022.9.14" +version = "2022.9.24" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false @@ -234,7 +234,7 @@ python-versions = ">=3.6" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "chardet" @@ -247,7 +247,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "click" @@ -263,7 +263,7 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "cn2an" @@ -280,7 +280,7 @@ proces = ">=0.1.0" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "colorama" @@ -293,7 +293,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "commonmark" @@ -309,7 +309,7 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "contourpy" @@ -332,7 +332,7 @@ test-no-codebase = ["pytest", "matplotlib", "pillow"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "cycler" @@ -345,7 +345,7 @@ python-versions = ">=3.6" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "dateparser" @@ -369,7 +369,7 @@ langdetect = ["langdetect"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "ecdsa" @@ -389,7 +389,7 @@ gmpy2 = ["gmpy2"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "emoji" @@ -405,7 +405,7 @@ dev = ["pytest", "coverage", "coveralls"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "fastapi" @@ -428,7 +428,7 @@ test = ["pytest (>=6.2.4,<7.0.0)", "pytest-cov (>=2.12.0,<4.0.0)", "mypy (==0.91 [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "feedparser" @@ -444,11 +444,11 @@ sgmllib3k = "*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "fonttools" -version = "4.37.3" +version = "4.37.4" description = "Tools to manipulate font files" category = "main" optional = false @@ -471,7 +471,7 @@ woff = ["zopfli (>=0.1.4)", "brotlicffi (>=0.8.0)", "brotli (>=1.0.1)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "gino" @@ -495,7 +495,7 @@ tornado = ["gino-tornado (>=0.1.0,<0.2.0)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "greenlet" @@ -511,11 +511,11 @@ docs = ["sphinx"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "grpcio" -version = "1.49.0" +version = "1.49.1" description = "HTTP/2-based RPC framework" category = "main" optional = false @@ -525,12 +525,12 @@ python-versions = ">=3.7" six = ">=1.5.2" [package.extras] -protobuf = ["grpcio-tools (>=1.49.0)"] +protobuf = ["grpcio-tools (>=1.49.1)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "h11" @@ -543,7 +543,7 @@ python-versions = ">=3.6" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "httpcore" @@ -566,7 +566,7 @@ socks = ["socksio (>=1.0.0,<2.0.0)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "httptools" @@ -582,7 +582,7 @@ test = ["Cython (>=0.29.24,<0.30.0)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "httpx" @@ -607,7 +607,7 @@ socks = ["socksio (>=1.0.0,<2.0.0)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "idna" @@ -620,11 +620,11 @@ python-versions = ">=3.5" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "imagehash" -version = "4.3.0" +version = "4.3.1" description = "Image Hashing library" category = "main" optional = false @@ -639,7 +639,28 @@ scipy = "*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" + +[[package]] +name = "importlib-metadata" +version = "5.0.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"] +perf = ["ipython"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "ali" [[package]] name = "jieba" @@ -652,7 +673,26 @@ python-versions = "*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "ali" [[package]] name = "kiwisolver" @@ -665,7 +705,7 @@ python-versions = ">=3.7" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "loguru" @@ -685,7 +725,7 @@ dev = ["colorama (>=0.3.4)", "docutils (==0.16)", "flake8 (>=3.7.7)", "tox (>=3. [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "lxml" @@ -704,7 +744,39 @@ source = ["Cython (>=0.29.7)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" + +[[package]] +name = "markdown" +version = "3.4.1" +description = "Python implementation of Markdown." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +testing = ["coverage", "pyyaml"] + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "ali" + +[[package]] +name = "markupsafe" +version = "2.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "ali" [[package]] name = "matplotlib" @@ -729,7 +801,7 @@ setuptools_scm = ">=7" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "msgpack" @@ -742,7 +814,7 @@ python-versions = "*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "multidict" @@ -755,7 +827,7 @@ python-versions = ">=3.7" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "mypy-extensions" @@ -768,7 +840,7 @@ python-versions = "*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "nonebot-adapter-onebot" @@ -785,32 +857,55 @@ nonebot2 = ">=2.0.0-beta.3,<3.0.0" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "nonebot-plugin-apscheduler" -version = "0.1.4" +version = "0.2.0" description = "APScheduler Support for NoneBot2" category = "main" optional = false +python-versions = ">=3.8,<4.0" + +[package.dependencies] +apscheduler = ">=3.7.0,<4.0.0" +nonebot2 = ">=2.0.0-rc.1,<3.0.0" + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "ali" + +[[package]] +name = "nonebot-plugin-htmlrender" +version = "0.1.1" +description = "通过浏览器渲染图片" +category = "main" +optional = false python-versions = ">=3.7.3,<4.0.0" [package.dependencies] -apscheduler = ">=3.7.0,<4.0.0" -nonebot2 = ">=2.0.0-alpha.8,<3.0.0" +aiofiles = ">=0.8.0,<0.9.0" +jinja2 = ">=3.0.3,<4.0.0" +markdown = ">=3.3.6,<4.0.0" +nonebot2 = ">=2.0.0-beta.1,<3.0.0" +playwright = ">=1.17.2,<2.0.0" +Pygments = ">=2.10.0,<3.0.0" +pymdown-extensions = ">=9.1,<10.0" +python-markdown-math = ">=0.8,<0.9" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "nonebot2" -version = "2.0.0b5" +version = "2.0.0rc1" description = "An asynchronous python bot framework." category = "main" optional = false -python-versions = ">=3.7.3,<4.0.0" +python-versions = ">=3.8,<4.0" [package.dependencies] fastapi = ">=0.79.0,<0.80.0" @@ -832,7 +927,7 @@ websockets = ["websockets (>=10.0,<11.0)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "numpy" @@ -845,7 +940,7 @@ python-versions = ">=3.8" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "opencv-python" @@ -866,7 +961,7 @@ numpy = [ [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "packaging" @@ -882,7 +977,7 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "pathspec" @@ -895,7 +990,7 @@ python-versions = ">=3.7" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "pillow" @@ -912,7 +1007,7 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "platformdirs" @@ -929,11 +1024,11 @@ test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytes [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "playwright" -version = "1.26.0" +version = "1.27.0" description = "A high-level API to automate web browsers" category = "main" optional = false @@ -943,12 +1038,11 @@ python-versions = ">=3.7" greenlet = "1.1.3" pyee = "8.1.0" typing-extensions = {version = "*", markers = "python_version <= \"3.8\""} -websockets = "10.1" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "proces" @@ -964,11 +1058,11 @@ zhconv = "1.4.3" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "protobuf" -version = "3.20.1" +version = "4.21.7" description = "Protocol Buffers" category = "main" optional = false @@ -977,7 +1071,7 @@ python-versions = ">=3.7" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "psutil" @@ -993,7 +1087,7 @@ test = ["ipaddress", "mock", "enum34", "pywin32", "wmi"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "pyasn1" @@ -1006,7 +1100,7 @@ python-versions = "*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "pydantic" @@ -1027,7 +1121,7 @@ email = ["email-validator (>=1.0.3)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "pyee" @@ -1040,7 +1134,7 @@ python-versions = "*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "pygments" @@ -1056,7 +1150,7 @@ plugins = ["importlib-metadata"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "pygtrie" @@ -1069,7 +1163,23 @@ python-versions = "*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" + +[[package]] +name = "pymdown-extensions" +version = "9.6" +description = "Extension pack for Python Markdown." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +markdown = ">=3.2" + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "ali" [[package]] name = "pyparsing" @@ -1085,7 +1195,7 @@ diagrams = ["railroad-diagrams", "jinja2"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "pypinyin" @@ -1098,7 +1208,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "python-dateutil" @@ -1114,7 +1224,7 @@ six = ">=1.5" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "python-dotenv" @@ -1130,7 +1240,7 @@ cli = ["click (>=5.0)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "python-jose" @@ -1153,7 +1263,23 @@ pycryptodome = ["pycryptodome (>=3.3.1,<4.0.0)", "pyasn1"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" + +[[package]] +name = "python-markdown-math" +version = "0.8" +description = "Math extension for Python-Markdown" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +Markdown = ">=3.0" + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "ali" [[package]] name = "python-multipart" @@ -1169,11 +1295,11 @@ six = ">=1.4.0" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "pytz" -version = "2022.2.1" +version = "2022.4" description = "World timezone definitions, modern and historical" category = "main" optional = false @@ -1182,7 +1308,7 @@ python-versions = "*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "pytz-deprecation-shim" @@ -1199,7 +1325,7 @@ tzdata = {version = "*", markers = "python_version >= \"3.6\""} [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "pywavelets" @@ -1215,7 +1341,7 @@ numpy = ">=1.17.3" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "pyyaml" @@ -1228,7 +1354,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "regex" @@ -1241,7 +1367,7 @@ python-versions = ">=3.6" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "retrying" @@ -1257,7 +1383,7 @@ six = ">=1.7.0" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "rfc3986" @@ -1276,11 +1402,11 @@ idna2008 = ["idna"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "rich" -version = "12.5.1" +version = "12.6.0" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "main" optional = false @@ -1297,7 +1423,7 @@ jupyter = ["ipywidgets (>=7.5.1,<8.0.0)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "rsa" @@ -1313,7 +1439,7 @@ pyasn1 = ">=0.1.3" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "ruamel.yaml" @@ -1333,7 +1459,7 @@ jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "ruamel.yaml.clib" @@ -1346,7 +1472,7 @@ python-versions = ">=3.5" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "scipy" @@ -1367,7 +1493,7 @@ dev = ["mypy", "typing-extensions", "pycodestyle", "flake8"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "setuptools-scm" @@ -1389,7 +1515,7 @@ toml = ["setuptools (>=42)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "sgmllib3k" @@ -1402,7 +1528,7 @@ python-versions = "*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "six" @@ -1415,7 +1541,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "sniffio" @@ -1428,7 +1554,7 @@ python-versions = ">=3.7" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "soupsieve" @@ -1441,7 +1567,7 @@ python-versions = ">=3.6" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "sqlalchemy" @@ -1466,7 +1592,7 @@ pymysql = ["pymysql (<1)", "pymysql"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "starlette" @@ -1486,7 +1612,7 @@ full = ["itsdangerous", "jinja2", "python-multipart", "pyyaml", "requests"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "tomli" @@ -1499,11 +1625,11 @@ python-versions = ">=3.7" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "tomlkit" -version = "0.11.4" +version = "0.11.5" description = "Style preserving TOML library" category = "main" optional = false @@ -1512,11 +1638,11 @@ python-versions = ">=3.6,<4.0" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "typing-extensions" -version = "4.3.0" +version = "4.4.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false @@ -1525,11 +1651,11 @@ python-versions = ">=3.7" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "tzdata" -version = "2022.2" +version = "2022.4" description = "Provider of IANA time zone data" category = "main" optional = false @@ -1538,7 +1664,7 @@ python-versions = ">=2" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "tzlocal" @@ -1560,7 +1686,7 @@ test = ["pytest-mock (>=3.3)", "pytest (>=4.3)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "ujson" @@ -1573,7 +1699,7 @@ python-versions = ">=3.7" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "uvicorn" @@ -1600,7 +1726,7 @@ standard = ["colorama (>=0.4)", "httptools (>=0.4.0)", "python-dotenv (>=0.13)", [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "uvloop" @@ -1618,7 +1744,7 @@ test = ["flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "p [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "watchfiles" @@ -1634,11 +1760,11 @@ anyio = ">=3.0.0,<4" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "websockets" -version = "10.1" +version = "10.3" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" category = "main" optional = false @@ -1647,7 +1773,7 @@ python-versions = ">=3.7" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "win32-setctime" @@ -1663,7 +1789,7 @@ dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"] [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "wordcloud" @@ -1681,7 +1807,7 @@ pillow = "*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "yarl" @@ -1698,7 +1824,7 @@ multidict = ">=4.0" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" [[package]] name = "zhconv" @@ -1711,12 +1837,29 @@ python-versions = "*" [package.source] type = "legacy" url = "https://mirrors.aliyun.com/pypi/simple" -reference = "ali" +reference = "ali" + +[[package]] +name = "zipp" +version = "3.8.1" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] + +[package.source] +type = "legacy" +url = "https://mirrors.aliyun.com/pypi/simple" +reference = "ali" [metadata] lock-version = "1.1" -python-versions = "^3.8" -content-hash = "45c50d3420ccb3521f2483f4811c85bbb1b6e53b11d87281ea9b9359ff6c70eb" +python-versions = "^3.8" +content-hash = "b2a9d5283905fb94ed9f5ec093560a664f81c46cfbc9060cb49014fb42057356" [metadata.files] aiofiles = [ @@ -1830,37 +1973,35 @@ beautifulsoup4 = [ {file = "beautifulsoup4-4.9.3.tar.gz", hash = "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25"}, ] bilireq = [ - {file = "bilireq-0.2.2.post0-py3-none-any.whl", hash = "sha256:f3bc1b5d413dfb15306c2bcb81347220f232fe0f6b626bb0e922087530a26cc8"}, - {file = "bilireq-0.2.2.post0.tar.gz", hash = "sha256:dbec5f4b4c15d505094bda488b52bf26c79fdc7c28ad98f8db2f61af155cefd0"}, + {file = "bilireq-0.2.3.post0-py3-none-any.whl", hash = "sha256:8d1f98bb8fb59c0ce1dec226329353ce51e2efaad0a6b4d240437b6132648322"}, + {file = "bilireq-0.2.3.post0.tar.gz", hash = "sha256:3185c3952a2becc7d31b0c01a12fda463fa477253504a68f81ea871594887ab4"}, ] black = [ - {file = "black-22.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce957f1d6b78a8a231b18e0dd2d94a33d2ba738cd88a7fe64f53f659eea49fdd"}, - {file = "black-22.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5107ea36b2b61917956d018bd25129baf9ad1125e39324a9b18248d362156a27"}, - {file = "black-22.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8166b7bfe5dcb56d325385bd1d1e0f635f24aae14b3ae437102dedc0c186747"}, - {file = "black-22.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd82842bb272297503cbec1a2600b6bfb338dae017186f8f215c8958f8acf869"}, - {file = "black-22.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d839150f61d09e7217f52917259831fe2b689f5c8e5e32611736351b89bb2a90"}, - {file = "black-22.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a05da0430bd5ced89176db098567973be52ce175a55677436a271102d7eaa3fe"}, - {file = "black-22.8.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a098a69a02596e1f2a58a2a1c8d5a05d5a74461af552b371e82f9fa4ada8342"}, - {file = "black-22.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5594efbdc35426e35a7defa1ea1a1cb97c7dbd34c0e49af7fb593a36bd45edab"}, - {file = "black-22.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a983526af1bea1e4cf6768e649990f28ee4f4137266921c2c3cee8116ae42ec3"}, - {file = "black-22.8.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b2c25f8dea5e8444bdc6788a2f543e1fb01494e144480bc17f806178378005e"}, - {file = "black-22.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:78dd85caaab7c3153054756b9fe8c611efa63d9e7aecfa33e533060cb14b6d16"}, - {file = "black-22.8.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:cea1b2542d4e2c02c332e83150e41e3ca80dc0fb8de20df3c5e98e242156222c"}, - {file = "black-22.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5b879eb439094751185d1cfdca43023bc6786bd3c60372462b6f051efa6281a5"}, - {file = "black-22.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a12e4e1353819af41df998b02c6742643cfef58282915f781d0e4dd7a200411"}, - {file = "black-22.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a73f66b6d5ba7288cd5d6dad9b4c9b43f4e8a4b789a94bf5abfb878c663eb3"}, - {file = "black-22.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:e981e20ec152dfb3e77418fb616077937378b322d7b26aa1ff87717fb18b4875"}, - {file = "black-22.8.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ce13ffed7e66dda0da3e0b2eb1bdfc83f5812f66e09aca2b0978593ed636b6c"}, - {file = "black-22.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:32a4b17f644fc288c6ee2bafdf5e3b045f4eff84693ac069d87b1a347d861497"}, - {file = "black-22.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ad827325a3a634bae88ae7747db1a395d5ee02cf05d9aa7a9bd77dfb10e940c"}, - {file = "black-22.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53198e28a1fb865e9fe97f88220da2e44df6da82b18833b588b1883b16bb5d41"}, - {file = "black-22.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:bc4d4123830a2d190e9cc42a2e43570f82ace35c3aeb26a512a2102bce5af7ec"}, - {file = "black-22.8.0-py3-none-any.whl", hash = "sha256:d2c21d439b2baf7aa80d6dd4e3659259be64c6f49dfd0f32091063db0e006db4"}, - {file = "black-22.8.0.tar.gz", hash = "sha256:792f7eb540ba9a17e8656538701d3eb1afcb134e3b45b71f20b25c77a8db7e6e"}, + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, ] certifi = [ - {file = "certifi-2022.9.14-py3-none-any.whl", hash = "sha256:e232343de1ab72c2aa521b625c80f699e356830fd0e2c620b465b304b17b0516"}, - {file = "certifi-2022.9.14.tar.gz", hash = "sha256:36973885b9542e6bd01dea287b2b4b3b21236307c56324fcc3f1160f2d655ed5"}, + {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, + {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, ] chardet = [ {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, @@ -1977,8 +2118,8 @@ feedparser = [ {file = "feedparser-6.0.10.tar.gz", hash = "sha256:27da485f4637ce7163cdeab13a80312b93b7d0c1b775bef4a47629a3110bca51"}, ] fonttools = [ - {file = "fonttools-4.37.3-py3-none-any.whl", hash = "sha256:a5bc5f5d48faa4085310b8ebd4c5d33bf27c6636c5f10a7de792510af2745a81"}, - {file = "fonttools-4.37.3.zip", hash = "sha256:f32ef6ec966cf0e7d2aa88601fed2e3a8f2851c26b5db2c80ccc8f82bee4eedc"}, + {file = "fonttools-4.37.4-py3-none-any.whl", hash = "sha256:afae1b39555f9c3f0ad1f0f1daf678e5ad157e38c8842ecb567951bf1a9b9fd7"}, + {file = "fonttools-4.37.4.zip", hash = "sha256:86918c150c6412798e15a0de6c3e0d061ddefddd00f97b4f7b43dfa867ad315e"}, ] gino = [ {file = "gino-1.0.1-py3-none-any.whl", hash = "sha256:56df57cfdefbaf897a7c4897c265a0e91a8cca80716fb64f7d3cf6d501fdfb3d"}, @@ -2041,51 +2182,51 @@ greenlet = [ {file = "greenlet-1.1.3.tar.gz", hash = "sha256:bcb6c6dd1d6be6d38d6db283747d07fda089ff8c559a835236560a4410340455"}, ] grpcio = [ - {file = "grpcio-1.49.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:79298b2b153d00f34ecbf5db8ec1be9bf37172ff9d2b63a2e0c6ef67f85daf1e"}, - {file = "grpcio-1.49.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ebb539e0cf618593dc08ea9bf6fc72c538b632663f8efc1a344f6db62545dfaa"}, - {file = "grpcio-1.49.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:7ea88f3dfe2606a93193e8dc240659b5eedcee77ef90d655cbc792273a5c3eb2"}, - {file = "grpcio-1.49.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a821831518758b725ba857d791a43959e8ffdbe5935e89a50222496fe2ed0f9c"}, - {file = "grpcio-1.49.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91763e949104894b639ad47243c69988fc0bbdcbead995280f7d3fcba3824a79"}, - {file = "grpcio-1.49.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ad119d3db3a284e8f0dbf0149b904280e17a13c9eca38a250109cbee9d569a1d"}, - {file = "grpcio-1.49.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e26d4b147447cf63e7e20e92c7b938b6279c0cd463b421f0f6ecc2d991161614"}, - {file = "grpcio-1.49.0-cp310-cp310-win32.whl", hash = "sha256:172cfa96c6d4de9d84bbd00ffea7aebe820f44430d31cdfea6ec6d209007c117"}, - {file = "grpcio-1.49.0-cp310-cp310-win_amd64.whl", hash = "sha256:07bbbb2675d5bcd5ea0dd5dc39d47d8cd9f81e12d5689d79079f5eb9bad87127"}, - {file = "grpcio-1.49.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:a3eccffe9cac99883cbfdcaac0af3d346d5499a7fcb7d57fdd2ec21209471c39"}, - {file = "grpcio-1.49.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:77742b6805c2b46a59b76f924b3018de89c4e3b565df7ef2d79d4d8eecd37a20"}, - {file = "grpcio-1.49.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:875cb37144865cc4d26e91add8c9672cf2c95f3547f15ae3daba8f27064fdb30"}, - {file = "grpcio-1.49.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1532064b23130be7760c940b82961e3661cb785f686204a937e8edca007069fe"}, - {file = "grpcio-1.49.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3477cec9b89334ddbb09b44cf099e9a81f4090b48fdd63310f91b71a762896d6"}, - {file = "grpcio-1.49.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb4a3812e90d8189ff96b1779c7e7e56d13e7525ef4928b7d897c62c0d8936e3"}, - {file = "grpcio-1.49.0-cp311-cp311-win32.whl", hash = "sha256:a9e154ff1d55540db0ff9ee123687c45e7946a235d22a44c5347b2384b2a4753"}, - {file = "grpcio-1.49.0-cp311-cp311-win_amd64.whl", hash = "sha256:894fba84ef949c7f2403eaf09c9d2421eeeec447f4d61829353a371d4d1edb57"}, - {file = "grpcio-1.49.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:fcd45c259cabb739b8b0c3a539ad2796f627fef77e53e55e6c2b5389b59a00ff"}, - {file = "grpcio-1.49.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:4ae542364be7b2cb13d8372c2a601a84c77a93327c93a31cda64fd9c5c333448"}, - {file = "grpcio-1.49.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:3e7b20e78b8dcee038002fd42ae13d5e6e81efa7d21cc6682a25f4cbd18f0491"}, - {file = "grpcio-1.49.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82a40b2fea553a85d045b1934633d108643d3b870a08fa19d47137d967e8e716"}, - {file = "grpcio-1.49.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85150bce2438feb2a814e0c2dec09fb6e86a58b69a06279a1a49426b88b84176"}, - {file = "grpcio-1.49.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:db056a709ea38b2da97a6811ed6719329f6576a32240e102e897a05b681a1674"}, - {file = "grpcio-1.49.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:41d8e725b816964691650967b017a621d935ba7393a153fcf8d6dcae5e41e4b3"}, - {file = "grpcio-1.49.0-cp37-cp37m-win32.whl", hash = "sha256:6ea56034245fe04ca3c411d2bf7032782722973e4cd2964e89d55110d2142bac"}, - {file = "grpcio-1.49.0-cp37-cp37m-win_amd64.whl", hash = "sha256:bc39e9bd568b210ba9e44819736eb5e95cada054381dec5a3d2ec0a5f7c0178f"}, - {file = "grpcio-1.49.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:8d6f4ace5b41502b11c2456d2fa3a2d7ee776bbb7d2c3c05e0309d420654c95a"}, - {file = "grpcio-1.49.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:9736f24b9a0a5b66df739fa2e82132c1c420cc470df003e53596dcec8d90a52a"}, - {file = "grpcio-1.49.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:a0c39a3d81a727d36c855781886a66d868681e5dc8de76a766a7c3c4827f649b"}, - {file = "grpcio-1.49.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:63c3823fc525882989c0a42191d1efeb37c4d4f4c1dc555cc21d721fe11570e3"}, - {file = "grpcio-1.49.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0522e5c678411977db57bb6a4c6dd29e1defc0961ebf2c0a29871459cce0fd9"}, - {file = "grpcio-1.49.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3cc65127b0755fc0cf4f7e095f2d0ed25fe225eb1525b76c0a32de3efaf7c22f"}, - {file = "grpcio-1.49.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:717ed04e949022e33e10c4d11b2a9567da2de5a02019535058482ea54d9f795c"}, - {file = "grpcio-1.49.0-cp38-cp38-win32.whl", hash = "sha256:dcb480c4141dd051120a3de9af555ef09fc3ce1d0cb47e95b22ac1406554af18"}, - {file = "grpcio-1.49.0-cp38-cp38-win_amd64.whl", hash = "sha256:faa91b060bf3c520d0a4f11bd550d1b4026d649f188b082690270182fb462ec4"}, - {file = "grpcio-1.49.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:5df1748ac9d679f47ee39226a7389f73e8c7c49910c7493b0f61735825a0b5ec"}, - {file = "grpcio-1.49.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:4f70df4d99945a7dc4a358cf0d2c027bba2d3125bc8ad1acb069480747fc58de"}, - {file = "grpcio-1.49.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6cbcbbab1c8f677d6b3bb55b22bfce87bd10713a8ef439098f86ada96e69eda8"}, - {file = "grpcio-1.49.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b40ca1a353ad0410f979d3ac7fdb07e2ad65717411c0c3e2df12a4b811898637"}, - {file = "grpcio-1.49.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ede5041e8a98ce8761d7b6d966da872ac6a5bf2d8de776b402ea509c8ba8a8bc"}, - {file = "grpcio-1.49.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:49a8a3aa2d61f1940983795cea78d336f86ab2e5c92029adfc7e6a8ee0fe6e3a"}, - {file = "grpcio-1.49.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b3bc29e95a578b5c5a1bf2908ef56f45ad8b669178298cf6a8357a6883baff99"}, - {file = "grpcio-1.49.0-cp39-cp39-win32.whl", hash = "sha256:60d31d1377429f0f83fe10887276e8bdef16fb297dfbccab896a145d7b171bc8"}, - {file = "grpcio-1.49.0-cp39-cp39-win_amd64.whl", hash = "sha256:4e0374c5b31fdf5cd4a2f3209e5341762a34c80acedbaca0896ccb904ecdd707"}, - {file = "grpcio-1.49.0.tar.gz", hash = "sha256:90ec337f36db26fbc70a4c032bcbabb2008f950f4194e99385118a12688fdf92"}, + {file = "grpcio-1.49.1-cp310-cp310-linux_armv7l.whl", hash = "sha256:fd86040232e805b8e6378b2348c928490ee595b058ce9aaa27ed8e4b0f172b20"}, + {file = "grpcio-1.49.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6fd0c9cede9552bf00f8c5791d257d5bf3790d7057b26c59df08be5e7a1e021d"}, + {file = "grpcio-1.49.1-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:d0d402e158d4e84e49c158cb5204119d55e1baf363ee98d6cb5dce321c3a065d"}, + {file = "grpcio-1.49.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:822ceec743d42a627e64ea266059a62d214c5a3cdfcd0d7fe2b7a8e4e82527c7"}, + {file = "grpcio-1.49.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2106d9c16527f0a85e2eea6e6b91a74fc99579c60dd810d8690843ea02bc0f5f"}, + {file = "grpcio-1.49.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:52dd02b7e7868233c571b49bc38ebd347c3bb1ff8907bb0cb74cb5f00c790afc"}, + {file = "grpcio-1.49.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:120fecba2ec5d14b5a15d11063b39783fda8dc8d24addd83196acb6582cabd9b"}, + {file = "grpcio-1.49.1-cp310-cp310-win32.whl", hash = "sha256:f1a3b88e3c53c1a6e6bed635ec1bbb92201bb6a1f2db186179f7f3f244829788"}, + {file = "grpcio-1.49.1-cp310-cp310-win_amd64.whl", hash = "sha256:a7d0017b92d3850abea87c1bdec6ea41104e71c77bca44c3e17f175c6700af62"}, + {file = "grpcio-1.49.1-cp311-cp311-linux_armv7l.whl", hash = "sha256:9fb17ff8c0d56099ac6ebfa84f670c5a62228d6b5c695cf21c02160c2ac1446b"}, + {file = "grpcio-1.49.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:075f2d06e3db6b48a2157a1bcd52d6cbdca980dd18988fe6afdb41795d51625f"}, + {file = "grpcio-1.49.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46d93a1b4572b461a227f1db6b8d35a88952db1c47e5fadcf8b8a2f0e1dd9201"}, + {file = "grpcio-1.49.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc79b2b37d779ac42341ddef40ad5bf0966a64af412c89fc2b062e3ddabb093f"}, + {file = "grpcio-1.49.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5f8b3a971c7820ea9878f3fd70086240a36aeee15d1b7e9ecbc2743b0e785568"}, + {file = "grpcio-1.49.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49b301740cf5bc8fed4fee4c877570189ae3951432d79fa8e524b09353659811"}, + {file = "grpcio-1.49.1-cp311-cp311-win32.whl", hash = "sha256:1c66a25afc6c71d357867b341da594a5587db5849b48f4b7d5908d236bb62ede"}, + {file = "grpcio-1.49.1-cp311-cp311-win_amd64.whl", hash = "sha256:6b6c3a95d27846f4145d6967899b3ab25fffc6ae99544415e1adcacef84842d2"}, + {file = "grpcio-1.49.1-cp37-cp37m-linux_armv7l.whl", hash = "sha256:1cc400c8a2173d1c042997d98a9563e12d9bb3fb6ad36b7f355bc77c7663b8af"}, + {file = "grpcio-1.49.1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:34f736bd4d0deae90015c0e383885b431444fe6b6c591dea288173df20603146"}, + {file = "grpcio-1.49.1-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:196082b9c89ebf0961dcd77cb114bed8171964c8e3063b9da2fb33536a6938ed"}, + {file = "grpcio-1.49.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c9f89c42749890618cd3c2464e1fbf88446e3d2f67f1e334c8e5db2f3272bbd"}, + {file = "grpcio-1.49.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64419cb8a5b612cdb1550c2fd4acbb7d4fb263556cf4625f25522337e461509e"}, + {file = "grpcio-1.49.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8a5272061826e6164f96e3255405ef6f73b88fd3e8bef464c7d061af8585ac62"}, + {file = "grpcio-1.49.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ea9d0172445241ad7cb49577314e39d0af2c5267395b3561d7ced5d70458a9f3"}, + {file = "grpcio-1.49.1-cp37-cp37m-win32.whl", hash = "sha256:2070e87d95991473244c72d96d13596c751cb35558e11f5df5414981e7ed2492"}, + {file = "grpcio-1.49.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fcedcab49baaa9db4a2d240ac81f2d57eb0052b1c6a9501b46b8ae912720fbf"}, + {file = "grpcio-1.49.1-cp38-cp38-linux_armv7l.whl", hash = "sha256:afbb3475cf7f4f7d380c2ca37ee826e51974f3e2665613996a91d6a58583a534"}, + {file = "grpcio-1.49.1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a4f9ba141380abde6c3adc1727f21529137a2552002243fa87c41a07e528245c"}, + {file = "grpcio-1.49.1-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:cf0a1fb18a7204b9c44623dfbd1465b363236ce70c7a4ed30402f9f60d8b743b"}, + {file = "grpcio-1.49.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17bb6fe72784b630728c6cff9c9d10ccc3b6d04e85da6e0a7b27fb1d135fac62"}, + {file = "grpcio-1.49.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18305d5a082d1593b005a895c10041f833b16788e88b02bb81061f5ebcc465df"}, + {file = "grpcio-1.49.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b6a1b39e59ac5a3067794a0e498911cf2e37e4b19ee9e9977dc5e7051714f13f"}, + {file = "grpcio-1.49.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e20d59aafc086b1cc68400463bddda6e41d3e5ed30851d1e2e0f6a2e7e342d3"}, + {file = "grpcio-1.49.1-cp38-cp38-win32.whl", hash = "sha256:e1e83233d4680863a421f3ee4a7a9b80d33cd27ee9ed7593bc93f6128302d3f2"}, + {file = "grpcio-1.49.1-cp38-cp38-win_amd64.whl", hash = "sha256:221d42c654d2a41fa31323216279c73ed17d92f533bc140a3390cc1bd78bf63c"}, + {file = "grpcio-1.49.1-cp39-cp39-linux_armv7l.whl", hash = "sha256:fa9e6e61391e99708ac87fc3436f6b7b9c6b845dc4639b406e5e61901e1aacde"}, + {file = "grpcio-1.49.1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9b449e966ef518ce9c860d21f8afe0b0f055220d95bc710301752ac1db96dd6a"}, + {file = "grpcio-1.49.1-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:aa34d2ad9f24e47fa9a3172801c676e4037d862247e39030165fe83821a7aafd"}, + {file = "grpcio-1.49.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5207f4eed1b775d264fcfe379d8541e1c43b878f2b63c0698f8f5c56c40f3d68"}, + {file = "grpcio-1.49.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b24a74651438d45619ac67004638856f76cc13d78b7478f2457754cbcb1c8ad"}, + {file = "grpcio-1.49.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fe763781669790dc8b9618e7e677c839c87eae6cf28b655ee1fa69ae04eea03f"}, + {file = "grpcio-1.49.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2f2ff7ba0f8f431f32d4b4bc3a3713426949d3533b08466c4ff1b2b475932ca8"}, + {file = "grpcio-1.49.1-cp39-cp39-win32.whl", hash = "sha256:08ff74aec8ff457a89b97152d36cb811dcc1d17cd5a92a65933524e363327394"}, + {file = "grpcio-1.49.1-cp39-cp39-win_amd64.whl", hash = "sha256:274ffbb39717918c514b35176510ae9be06e1d93121e84d50b350861dcb9a705"}, + {file = "grpcio-1.49.1.tar.gz", hash = "sha256:d4725fc9ec8e8822906ae26bb26f5546891aa7fbc3443de970cc556d43a5c99f"}, ] h11 = [ {file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"}, @@ -2147,12 +2288,20 @@ idna = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] imagehash = [ - {file = "ImageHash-4.3.0-py2.py3-none-any.whl", hash = "sha256:afe0bcb17c88e6f28fd69b91f05c4f207b3d5018431c3f3e632af2162e451d03"}, - {file = "ImageHash-4.3.0.tar.gz", hash = "sha256:3e843fed202105374b71767f93e6791a476dc92d212668dd3a6db61bfb18faf9"}, + {file = "ImageHash-4.3.1-py2.py3-none-any.whl", hash = "sha256:5ad9a5cde14fe255745a8245677293ac0d67f09c330986a351f34b614ba62fb5"}, + {file = "ImageHash-4.3.1.tar.gz", hash = "sha256:7038d1b7f9e0585beb3dd8c0a956f02b95a346c0b5f24a9e8cc03ebadaf0aa70"}, +] +importlib-metadata = [ + {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, + {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, ] jieba = [ {file = "jieba-0.42.1.tar.gz", hash = "sha256:055ca12f62674fafed09427f176506079bc135638a14e23e25be909131928db2"}, ] +jinja2 = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] kiwisolver = [ {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, @@ -2164,6 +2313,21 @@ kiwisolver = [ {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, + {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, + {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, + {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, + {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, @@ -2196,6 +2360,16 @@ kiwisolver = [ {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, + {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, + {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, ] loguru = [ @@ -2264,6 +2438,52 @@ lxml = [ {file = "lxml-4.6.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:5d5254c815c186744c8f922e2ce861a2bdeabc06520b4b30b2f7d9767791ce6e"}, {file = "lxml-4.6.5.tar.gz", hash = "sha256:6e84edecc3a82f90d44ddee2ee2a2630d4994b8471816e226d2b771cda7ac4ca"}, ] +markdown = [ + {file = "Markdown-3.4.1-py3-none-any.whl", hash = "sha256:08fb8465cffd03d10b9dd34a5c3fea908e20391a2a90b88d66362cb05beed186"}, + {file = "Markdown-3.4.1.tar.gz", hash = "sha256:3b809086bb6efad416156e00a0da66fe47618a5d6918dd688f53f40c8e4cfeff"}, +] +markupsafe = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] matplotlib = [ {file = "matplotlib-3.6.0-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:6b98e098549d3aea2bfb93f38f0b2ecadcb423fa1504bbff902c01efdd833fd8"}, {file = "matplotlib-3.6.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:798559837156b8e2e2df97cffca748c5c1432af6ec5004c2932e475d813f1743"}, @@ -2431,12 +2651,16 @@ nonebot-adapter-onebot = [ {file = "nonebot_adapter_onebot-2.1.3-py3-none-any.whl", hash = "sha256:d44eb7b119fdcc3f7936c77e2c0922728c959ad6d6b36ebd004e94856d9ccf49"}, ] nonebot-plugin-apscheduler = [ - {file = "nonebot-plugin-apscheduler-0.1.4.tar.gz", hash = "sha256:7541cfb2af48f244b74b66fd14f6486ef39a6d79f17b15c31cf1c6ad9a9632ca"}, - {file = "nonebot_plugin_apscheduler-0.1.4-py3-none-any.whl", hash = "sha256:c904c344c22c8fb2bafec9875ee195b7be7d1f0b758a04e96da6758d62cf4e83"}, + {file = "nonebot-plugin-apscheduler-0.2.0.tar.gz", hash = "sha256:7b63e99a611b657533b48fcf1f8c6627c18c2eb3fa820a906cd4ec4666c0ceb0"}, + {file = "nonebot_plugin_apscheduler-0.2.0-py3-none-any.whl", hash = "sha256:9285ee84ca1cfa4db73c86cedb5911bbbd25a21ec0cd5f22447cd12f89e48fb4"}, +] +nonebot-plugin-htmlrender = [ + {file = "nonebot-plugin-htmlrender-0.1.1.tar.gz", hash = "sha256:509bc2906936e71f57f20023ac658d3639898724d0a472b0c65a9c6c6bd571ff"}, + {file = "nonebot_plugin_htmlrender-0.1.1-py3-none-any.whl", hash = "sha256:107f0726e93e94ab5fe86090226a8b7b8a39c73098da406373b8b34408985bd9"}, ] nonebot2 = [ - {file = "nonebot2-2.0.0b5-py3-none-any.whl", hash = "sha256:5cfbfcd62ffcf55f884f9fb750a71cd92c97e347c99e891ef617da4d445a1f22"}, - {file = "nonebot2-2.0.0b5.tar.gz", hash = "sha256:fccb5af749cceb289d756901b7abc7a679e5952dbe88c8b6ad8b2d906715c3ee"}, + {file = "nonebot2-2.0.0rc1-py3-none-any.whl", hash = "sha256:99c70300b9d0755bba6ed50b7399f44f6213e119157bc026b960b3e157a38416"}, + {file = "nonebot2-2.0.0rc1.tar.gz", hash = "sha256:6e5a0abf24086d05d5c2a56c971a551ece2a343ff29f83b76b398bf717b92e16"}, ] numpy = [ {file = "numpy-1.23.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c9f707b5bb73bf277d812ded9896f9512a43edff72712f31667d0a8c2f8e71ee"}, @@ -2496,8 +2720,8 @@ pillow = [ {file = "Pillow-9.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:37ff6b522a26d0538b753f0b4e8e164fdada12db6c6f00f62145d732d8a3152e"}, {file = "Pillow-9.2.0-cp310-cp310-win32.whl", hash = "sha256:c79698d4cd9318d9481d89a77e2d3fcaeff5486be641e60a4b49f3d2ecca4e28"}, {file = "Pillow-9.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:254164c57bab4b459f14c64e93df11eff5ded575192c294a0c49270f22c5d93d"}, - {file = "Pillow-9.2.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:408673ed75594933714482501fe97e055a42996087eeca7e5d06e33218d05aa8"}, - {file = "Pillow-9.2.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:727dd1389bc5cb9827cbd1f9d40d2c2a1a0c9b32dd2261db522d22a604a6eec9"}, + {file = "Pillow-9.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:adabc0bce035467fb537ef3e5e74f2847c8af217ee0be0455d4fec8adc0462fc"}, + {file = "Pillow-9.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:336b9036127eab855beec9662ac3ea13a4544a523ae273cbf108b228ecac8437"}, {file = "Pillow-9.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50dff9cc21826d2977ef2d2a205504034e3a4563ca6f5db739b0d1026658e004"}, {file = "Pillow-9.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb6259196a589123d755380b65127ddc60f4c64b21fc3bb46ce3a6ea663659b0"}, {file = "Pillow-9.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0554af24df2bf96618dac71ddada02420f946be943b181108cac55a7a2dcd4"}, @@ -2550,43 +2774,33 @@ platformdirs = [ {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] playwright = [ - {file = "playwright-1.26.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:4841796a44582b0d4cc0424ebce2da717d3aa04adb4051145dc480be198549bb"}, - {file = "playwright-1.26.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:5d910b865a6c539d3589d1a9a67d221f060460b812b65f933e872f8762bd640a"}, - {file = "playwright-1.26.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:fd7546d4b61ebe7fd1f1fa5eebdaf884263d97b111be6208a02a1bde5f36308f"}, - {file = "playwright-1.26.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:c6d9df284a74897eb667ee8e865137ed2fbdd93b8ba8f43e257871a3fbf1e9c4"}, - {file = "playwright-1.26.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759292562f50e7f04ef75eac7039ab7149461b2ac97c91f77d73cc974b3f49bb"}, - {file = "playwright-1.26.0-py3-none-win32.whl", hash = "sha256:aa3e8ee10bce4d8992a8332f4358ab571724dfd0c34540e6b56e7ac062cc6e20"}, - {file = "playwright-1.26.0-py3-none-win_amd64.whl", hash = "sha256:a04a549a32cea8000036274af6fe7e7b7ac3697021cd3cc2bb3e92341b89147d"}, + {file = "playwright-1.27.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:cd1ebac1e261eb58b393f9f504c223b0129dda3a19a41bba47c86abbd1301ca7"}, + {file = "playwright-1.27.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b5ae41c4313af04b9deb2b2cf6c1ebeb9deb1fa66149d8026ce48a45cbaaeb08"}, + {file = "playwright-1.27.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:8c0989016156539f58286831c4ff200260f2173e4026330697e257aa7609f7eb"}, + {file = "playwright-1.27.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:7c0bd4af19ea145cd3aa4f9f1009e4e4b0ffd05a78235c5338a35e83366e68b5"}, + {file = "playwright-1.27.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bb56b53fa10aaedb32c28eef06a0579244c2ccf3ddf9238fb09044bfb6c493e"}, + {file = "playwright-1.27.0-py3-none-win32.whl", hash = "sha256:fe90b890061f729d2ea2f547fc5b316a5e6361e3659fbc639ee35e08be38d13f"}, + {file = "playwright-1.27.0-py3-none-win_amd64.whl", hash = "sha256:8cbeab451099cf0d52d9e80baf970363f900c8cc85ecf4d7dcde76a86c47880a"}, ] proces = [ {file = "proces-0.1.2-py3-none-any.whl", hash = "sha256:82b765c70ebe790aae03159617710d03bcec3c98d6c7190f126bf307eecd0fd3"}, {file = "proces-0.1.2.tar.gz", hash = "sha256:99fc87148aff66fb0ca83b66562d6c61b2a2ba4bdff7c9eec64c02df7917d51f"}, ] protobuf = [ - {file = "protobuf-3.20.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996"}, - {file = "protobuf-3.20.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3"}, - {file = "protobuf-3.20.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde"}, - {file = "protobuf-3.20.1-cp310-cp310-win32.whl", hash = "sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c"}, - {file = "protobuf-3.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7"}, - {file = "protobuf-3.20.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153"}, - {file = "protobuf-3.20.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f"}, - {file = "protobuf-3.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20"}, - {file = "protobuf-3.20.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531"}, - {file = "protobuf-3.20.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e"}, - {file = "protobuf-3.20.1-cp37-cp37m-win32.whl", hash = "sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c"}, - {file = "protobuf-3.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067"}, - {file = "protobuf-3.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf"}, - {file = "protobuf-3.20.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab"}, - {file = "protobuf-3.20.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c"}, - {file = "protobuf-3.20.1-cp38-cp38-win32.whl", hash = "sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7"}, - {file = "protobuf-3.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739"}, - {file = "protobuf-3.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7"}, - {file = "protobuf-3.20.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f"}, - {file = "protobuf-3.20.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9"}, - {file = "protobuf-3.20.1-cp39-cp39-win32.whl", hash = "sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8"}, - {file = "protobuf-3.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91"}, - {file = "protobuf-3.20.1-py2.py3-none-any.whl", hash = "sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388"}, - {file = "protobuf-3.20.1.tar.gz", hash = "sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9"}, + {file = "protobuf-4.21.7-cp310-abi3-win32.whl", hash = "sha256:c7cb105d69a87416bd9023e64324e1c089593e6dae64d2536f06bcbe49cd97d8"}, + {file = "protobuf-4.21.7-cp310-abi3-win_amd64.whl", hash = "sha256:3ec85328a35a16463c6f419dbce3c0fc42b3e904d966f17f48bae39597c7a543"}, + {file = "protobuf-4.21.7-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:db9056b6a11cb5131036d734bcbf91ef3ef9235d6b681b2fc431cbfe5a7f2e56"}, + {file = "protobuf-4.21.7-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:ca200645d6235ce0df3ccfdff1567acbab35c4db222a97357806e015f85b5744"}, + {file = "protobuf-4.21.7-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:b019c79e23a80735cc8a71b95f76a49a262f579d6b84fd20a0b82279f40e2cc1"}, + {file = "protobuf-4.21.7-cp37-cp37m-win32.whl", hash = "sha256:d3f89ccf7182293feba2de2739c8bf34fed1ed7c65a5cf987be00311acac57c1"}, + {file = "protobuf-4.21.7-cp37-cp37m-win_amd64.whl", hash = "sha256:a74d96cd960b87b4b712797c741bb3ea3a913f5c2dc4b6cbe9c0f8360b75297d"}, + {file = "protobuf-4.21.7-cp38-cp38-win32.whl", hash = "sha256:8e09d1916386eca1ef1353767b6efcebc0a6859ed7f73cb7fb974feba3184830"}, + {file = "protobuf-4.21.7-cp38-cp38-win_amd64.whl", hash = "sha256:9e355f2a839d9930d83971b9f562395e13493f0e9211520f8913bd11efa53c02"}, + {file = "protobuf-4.21.7-cp39-cp39-win32.whl", hash = "sha256:f370c0a71712f8965023dd5b13277444d3cdfecc96b2c778b0e19acbfd60df6e"}, + {file = "protobuf-4.21.7-cp39-cp39-win_amd64.whl", hash = "sha256:9643684232b6b340b5e63bb69c9b4904cdd39e4303d498d1a92abddc7e895b7f"}, + {file = "protobuf-4.21.7-py2.py3-none-any.whl", hash = "sha256:8066322588d4b499869bf9f665ebe448e793036b552f68c585a9b28f1e393f66"}, + {file = "protobuf-4.21.7-py3-none-any.whl", hash = "sha256:58b81358ec6c0b5d50df761460ae2db58405c063fd415e1101209221a0a810e1"}, + {file = "protobuf-4.21.7.tar.gz", hash = "sha256:71d9dba03ed3432c878a801e2ea51e034b0ea01cf3a4344fb60166cb5f6c8757"}, ] psutil = [ {file = "psutil-5.9.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:8f024fbb26c8daf5d70287bb3edfafa22283c255287cf523c5d81721e8e5d82c"}, @@ -2672,8 +2886,13 @@ pygments = [ {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, ] pygtrie = [ + {file = "pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16"}, {file = "pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2"}, ] +pymdown-extensions = [ + {file = "pymdown_extensions-9.6-py3-none-any.whl", hash = "sha256:1e36490adc7bfcef1fdb21bb0306e93af99cff8ec2db199bd17e3bf009768c11"}, + {file = "pymdown_extensions-9.6.tar.gz", hash = "sha256:b956b806439bbff10f726103a941266beb03fbe99f897c7d5e774d7170339ad9"}, +] pyparsing = [ {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, @@ -2694,12 +2913,16 @@ python-jose = [ {file = "python-jose-3.3.0.tar.gz", hash = "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a"}, {file = "python_jose-3.3.0-py2.py3-none-any.whl", hash = "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"}, ] +python-markdown-math = [ + {file = "python-markdown-math-0.8.tar.gz", hash = "sha256:8564212af679fc18d53f38681f16080fcd3d186073f23825c7ce86fadd3e3635"}, + {file = "python_markdown_math-0.8-py3-none-any.whl", hash = "sha256:c685249d84b5b697e9114d7beb352bd8ca2e07fd268fd4057ffca888c14641e5"}, +] python-multipart = [ {file = "python-multipart-0.0.5.tar.gz", hash = "sha256:f7bb5f611fc600d15fa47b3974c8aa16e93724513b49b5f95c81e6624c83fa43"}, ] pytz = [ - {file = "pytz-2022.2.1-py2.py3-none-any.whl", hash = "sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197"}, - {file = "pytz-2022.2.1.tar.gz", hash = "sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5"}, + {file = "pytz-2022.4-py2.py3-none-any.whl", hash = "sha256:2c0784747071402c6e99f0bafdb7da0fa22645f06554c7ae06bf6358897e9c91"}, + {file = "pytz-2022.4.tar.gz", hash = "sha256:48ce799d83b6f8aab2020e369b627446696619e79645419610b9facd909b3174"}, ] pytz-deprecation-shim = [ {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"}, @@ -2847,8 +3070,8 @@ rfc3986 = [ {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, ] rich = [ - {file = "rich-12.5.1-py3-none-any.whl", hash = "sha256:2eb4e6894cde1e017976d2975ac210ef515d7548bc595ba20e195fb9628acdeb"}, - {file = "rich-12.5.1.tar.gz", hash = "sha256:63a5c5ce3673d3d5fbbf23cd87e11ab84b6b451436f1b7f19ec54b6bc36ed7ca"}, + {file = "rich-12.6.0-py3-none-any.whl", hash = "sha256:a4eb26484f2c82589bd9a17c73d32a010b1e29d89f1604cd9bf3a2097b81bb5e"}, + {file = "rich-12.6.0.tar.gz", hash = "sha256:ba3a3775974105c221d31141f2c116f4fd65c5ceb0698657a11e9f295ec93fd0"}, ] rsa = [ {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, @@ -2974,16 +3197,16 @@ tomli = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] tomlkit = [ - {file = "tomlkit-0.11.4-py3-none-any.whl", hash = "sha256:25d4e2e446c453be6360c67ddfb88838cfc42026322770ba13d1fbd403a93a5c"}, - {file = "tomlkit-0.11.4.tar.gz", hash = "sha256:3235a9010fae54323e727c3ac06fb720752fe6635b3426e379daec60fbd44a83"}, + {file = "tomlkit-0.11.5-py3-none-any.whl", hash = "sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7"}, + {file = "tomlkit-0.11.5.tar.gz", hash = "sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c"}, ] typing-extensions = [ - {file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"}, - {file = "typing_extensions-4.3.0.tar.gz", hash = "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"}, + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, ] tzdata = [ - {file = "tzdata-2022.2-py2.py3-none-any.whl", hash = "sha256:c3119520447d68ef3eb8187a55a4f44fa455f30eb1b4238fa5691ba094f2b05b"}, - {file = "tzdata-2022.2.tar.gz", hash = "sha256:21f4f0d7241572efa7f7a4fdabb052e61b55dc48274e6842697ccdf5253e5451"}, + {file = "tzdata-2022.4-py2.py3-none-any.whl", hash = "sha256:74da81ecf2b3887c94e53fc1d466d4362aaf8b26fc87cda18f22004544694583"}, + {file = "tzdata-2022.4.tar.gz", hash = "sha256:ada9133fbd561e6ec3d1674d3fba50251636e918aa97bd59d63735bef5a513bb"}, ] tzlocal = [ {file = "tzlocal-4.2-py3-none-any.whl", hash = "sha256:89885494684c929d9191c57aa27502afc87a579be5cdd3225c77c463ea043745"}, @@ -3113,54 +3336,54 @@ watchfiles = [ {file = "watchfiles-0.17.0.tar.gz", hash = "sha256:ae7c57ef920589a40270d5ef3216d693f4e6f8864d8fc8b6cb7885ca98ad2a61"}, ] websockets = [ - {file = "websockets-10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:38db6e2163b021642d0a43200ee2dec8f4980bdbda96db54fde72b283b54cbfc"}, - {file = "websockets-10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e1b60fd297adb9fc78375778a5220da7f07bf54d2a33ac781319650413fc6a60"}, - {file = "websockets-10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3477146d1f87ead8df0f27e8960249f5248dceb7c2741e8bbec9aa5338d0c053"}, - {file = "websockets-10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb01ea7b5f52e7125bdc3c5807aeaa2d08a0553979cf2d96a8b7803ea33e15e7"}, - {file = "websockets-10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9fd62c6dc83d5d35fb6a84ff82ec69df8f4657fff05f9cd6c7d9bec0dd57f0f6"}, - {file = "websockets-10.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3bbf080f3892ba1dc8838786ec02899516a9d227abe14a80ef6fd17d4fb57127"}, - {file = "websockets-10.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5560558b0dace8312c46aa8915da977db02738ac8ecffbc61acfbfe103e10155"}, - {file = "websockets-10.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:667c41351a6d8a34b53857ceb8343a45c85d438ee4fd835c279591db8aeb85be"}, - {file = "websockets-10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:468f0031fdbf4d643f89403a66383247eb82803430b14fa27ce2d44d2662ca37"}, - {file = "websockets-10.1-cp310-cp310-win32.whl", hash = "sha256:d0d81b46a5c87d443e40ce2272436da8e6092aa91f5fbeb60d1be9f11eff5b4c"}, - {file = "websockets-10.1-cp310-cp310-win_amd64.whl", hash = "sha256:b68b6caecb9a0c6db537aa79750d1b592a841e4f1a380c6196091e65b2ad35f9"}, - {file = "websockets-10.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a249139abc62ef333e9e85064c27fefb113b16ffc5686cefc315bdaef3eefbc8"}, - {file = "websockets-10.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8877861e3dee38c8d302eee0d5dbefa6663de3b46dc6a888f70cd7e82562d1f7"}, - {file = "websockets-10.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e3872ae57acd4306ecf937d36177854e218e999af410a05c17168cd99676c512"}, - {file = "websockets-10.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b66e6d514f12c28d7a2d80bb2a48ef223342e99c449782d9831b0d29a9e88a17"}, - {file = "websockets-10.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9f304a22ece735a3da8a51309bc2c010e23961a8f675fae46fdf62541ed62123"}, - {file = "websockets-10.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:189ed478395967d6a98bb293abf04e8815349e17456a0a15511f1088b6cb26e4"}, - {file = "websockets-10.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:08a42856158307e231b199671c4fce52df5786dd3d703f36b5d8ac76b206c485"}, - {file = "websockets-10.1-cp37-cp37m-win32.whl", hash = "sha256:3ef6f73854cded34e78390dbdf40dfdcf0b89b55c0e282468ef92646fce8d13a"}, - {file = "websockets-10.1-cp37-cp37m-win_amd64.whl", hash = "sha256:89e985d40d407545d5f5e2e58e1fdf19a22bd2d8cd54d20a882e29f97e930a0a"}, - {file = "websockets-10.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:002071169d2e44ce8eb9e5ebac9fbce142ba4b5146eef1cfb16b177a27662657"}, - {file = "websockets-10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cfae282c2aa7f0c4be45df65c248481f3509f8c40ca8b15ed96c35668ae0ff69"}, - {file = "websockets-10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:97b4b68a2ddaf5c4707ae79c110bfd874c5be3c6ac49261160fb243fa45d8bbb"}, - {file = "websockets-10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c9407719f42cb77049975410490c58a705da6af541adb64716573e550e5c9db"}, - {file = "websockets-10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d858fb31e5ac992a2cdf17e874c95f8a5b1e917e1fb6b45ad85da30734b223f"}, - {file = "websockets-10.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7bdd3d26315db0a9cf8a0af30ca95e0aa342eda9c1377b722e71ccd86bc5d1dd"}, - {file = "websockets-10.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e259be0863770cb91b1a6ccf6907f1ac2f07eff0b7f01c249ed751865a70cb0d"}, - {file = "websockets-10.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6b014875fae19577a392372075e937ebfebf53fd57f613df07b35ab210f31534"}, - {file = "websockets-10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:98de71f86bdb29430fd7ba9997f47a6b10866800e3ea577598a786a785701bb0"}, - {file = "websockets-10.1-cp38-cp38-win32.whl", hash = "sha256:3a02ab91d84d9056a9ee833c254895421a6333d7ae7fff94b5c68e4fa8095519"}, - {file = "websockets-10.1-cp38-cp38-win_amd64.whl", hash = "sha256:7d6673b2753f9c5377868a53445d0c321ef41ff3c8e3b6d57868e72054bfce5f"}, - {file = "websockets-10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ddab2dc69ee5ae27c74dbfe9d7bb6fee260826c136dca257faa1a41d1db61a89"}, - {file = "websockets-10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:14e9cf68a08d1a5d42109549201aefba473b1d925d233ae19035c876dd845da9"}, - {file = "websockets-10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e4819c6fb4f336fd5388372cb556b1f3a165f3f68e66913d1a2fc1de55dc6f58"}, - {file = "websockets-10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05e7f098c76b0a4743716590bb8f9706de19f1ef5148d61d0cf76495ec3edb9c"}, - {file = "websockets-10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5bb6256de5a4fb1d42b3747b4e2268706c92965d75d0425be97186615bf2f24f"}, - {file = "websockets-10.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:888a5fa2a677e0c2b944f9826c756475980f1b276b6302e606f5c4ff5635be9e"}, - {file = "websockets-10.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6fdec1a0b3e5630c58e3d8704d2011c678929fce90b40908c97dfc47de8dca72"}, - {file = "websockets-10.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:531d8eb013a9bc6b3ad101588182aa9b6dd994b190c56df07f0d84a02b85d530"}, - {file = "websockets-10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0d93b7cadc761347d98da12ec1930b5c71b2096f1ceed213973e3cda23fead9c"}, - {file = "websockets-10.1-cp39-cp39-win32.whl", hash = "sha256:d9b245db5a7e64c95816e27d72830e51411c4609c05673d1ae81eb5d23b0be54"}, - {file = "websockets-10.1-cp39-cp39-win_amd64.whl", hash = "sha256:882c0b8bdff3bf1bd7f024ce17c6b8006042ec4cceba95cf15df57e57efa471c"}, - {file = "websockets-10.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:10edd9d7d3581cfb9ff544ac09fc98cab7ee8f26778a5a8b2d5fd4b0684c5ba5"}, - {file = "websockets-10.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baa83174390c0ff4fc1304fbe24393843ac7a08fdd59295759c4b439e06b1536"}, - {file = "websockets-10.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:483edee5abed738a0b6a908025be47f33634c2ad8e737edd03ffa895bd600909"}, - {file = "websockets-10.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:816ae7dac2c6522cfa620947ead0ca95ac654916eebf515c94d7c28de5601a6e"}, - {file = "websockets-10.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1dafe98698ece09b8ccba81b910643ff37198e43521d977be76caf37709cf62b"}, - {file = "websockets-10.1.tar.gz", hash = "sha256:181d2b25de5a437b36aefedaf006ecb6fa3aa1328ec0236cdde15f32f9d3ff6d"}, + {file = "websockets-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:661f641b44ed315556a2fa630239adfd77bd1b11cb0b9d96ed8ad90b0b1e4978"}, + {file = "websockets-10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b529fdfa881b69fe563dbd98acce84f3e5a67df13de415e143ef053ff006d500"}, + {file = "websockets-10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f351c7d7d92f67c0609329ab2735eee0426a03022771b00102816a72715bb00b"}, + {file = "websockets-10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379e03422178436af4f3abe0aa8f401aa77ae2487843738542a75faf44a31f0c"}, + {file = "websockets-10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e904c0381c014b914136c492c8fa711ca4cced4e9b3d110e5e7d436d0fc289e8"}, + {file = "websockets-10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e7e6f2d6fd48422071cc8a6f8542016f350b79cc782752de531577d35e9bd677"}, + {file = "websockets-10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9c77f0d1436ea4b4dc089ed8335fa141e6a251a92f75f675056dac4ab47a71e"}, + {file = "websockets-10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e6fa05a680e35d0fcc1470cb070b10e6fe247af54768f488ed93542e71339d6f"}, + {file = "websockets-10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2f94fa3ae454a63ea3a19f73b95deeebc9f02ba2d5617ca16f0bbdae375cda47"}, + {file = "websockets-10.3-cp310-cp310-win32.whl", hash = "sha256:6ed1d6f791eabfd9808afea1e068f5e59418e55721db8b7f3bfc39dc831c42ae"}, + {file = "websockets-10.3-cp310-cp310-win_amd64.whl", hash = "sha256:347974105bbd4ea068106ec65e8e8ebd86f28c19e529d115d89bd8cc5cda3079"}, + {file = "websockets-10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fab7c640815812ed5f10fbee7abbf58788d602046b7bb3af9b1ac753a6d5e916"}, + {file = "websockets-10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:994cdb1942a7a4c2e10098d9162948c9e7b235df755de91ca33f6e0481366fdb"}, + {file = "websockets-10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aad5e300ab32036eb3fdc350ad30877210e2f51bceaca83fb7fef4d2b6c72b79"}, + {file = "websockets-10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e49ea4c1a9543d2bd8a747ff24411509c29e4bdcde05b5b0895e2120cb1a761d"}, + {file = "websockets-10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ea6b300a6bdd782e49922d690e11c3669828fe36fc2471408c58b93b5535a98"}, + {file = "websockets-10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ef5ce841e102278c1c2e98f043db99d6755b1c58bde475516aef3a008ed7f28e"}, + {file = "websockets-10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d1655a6fc7aecd333b079d00fb3c8132d18988e47f19740c69303bf02e9883c6"}, + {file = "websockets-10.3-cp37-cp37m-win32.whl", hash = "sha256:83e5ca0d5b743cde3d29fda74ccab37bdd0911f25bd4cdf09ff8b51b7b4f2fa1"}, + {file = "websockets-10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:da4377904a3379f0c1b75a965fff23b28315bcd516d27f99a803720dfebd94d4"}, + {file = "websockets-10.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a1e15b230c3613e8ea82c9fc6941b2093e8eb939dd794c02754d33980ba81e36"}, + {file = "websockets-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:31564a67c3e4005f27815634343df688b25705cccb22bc1db621c781ddc64c69"}, + {file = "websockets-10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c8d1d14aa0f600b5be363077b621b1b4d1eb3fbf90af83f9281cda668e6ff7fd"}, + {file = "websockets-10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fbd7d77f8aba46d43245e86dd91a8970eac4fb74c473f8e30e9c07581f852b2"}, + {file = "websockets-10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:210aad7fdd381c52e58777560860c7e6110b6174488ef1d4b681c08b68bf7f8c"}, + {file = "websockets-10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6075fd24df23133c1b078e08a9b04a3bc40b31a8def4ee0b9f2c8865acce913e"}, + {file = "websockets-10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7f6d96fdb0975044fdd7953b35d003b03f9e2bcf85f2d2cf86285ece53e9f991"}, + {file = "websockets-10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c7250848ce69559756ad0086a37b82c986cd33c2d344ab87fea596c5ac6d9442"}, + {file = "websockets-10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:28dd20b938a57c3124028680dc1600c197294da5db4292c76a0b48efb3ed7f76"}, + {file = "websockets-10.3-cp38-cp38-win32.whl", hash = "sha256:54c000abeaff6d8771a4e2cef40900919908ea7b6b6a30eae72752607c6db559"}, + {file = "websockets-10.3-cp38-cp38-win_amd64.whl", hash = "sha256:7ab36e17af592eec5747c68ef2722a74c1a4a70f3772bc661079baf4ae30e40d"}, + {file = "websockets-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a141de3d5a92188234afa61653ed0bbd2dde46ad47b15c3042ffb89548e77094"}, + {file = "websockets-10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:97bc9d41e69a7521a358f9b8e44871f6cdeb42af31815c17aed36372d4eec667"}, + {file = "websockets-10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d6353ba89cfc657a3f5beabb3b69be226adbb5c6c7a66398e17809b0ce3c4731"}, + {file = "websockets-10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec2b0ab7edc8cd4b0eb428b38ed89079bdc20c6bdb5f889d353011038caac2f9"}, + {file = "websockets-10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:85506b3328a9e083cc0a0fb3ba27e33c8db78341b3eb12eb72e8afd166c36680"}, + {file = "websockets-10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8af75085b4bc0b5c40c4a3c0e113fa95e84c60f4ed6786cbb675aeb1ee128247"}, + {file = "websockets-10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:07cdc0a5b2549bcfbadb585ad8471ebdc7bdf91e32e34ae3889001c1c106a6af"}, + {file = "websockets-10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5b936bf552e4f6357f5727579072ff1e1324717902127ffe60c92d29b67b7be3"}, + {file = "websockets-10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e4e08305bfd76ba8edab08dcc6496f40674f44eb9d5e23153efa0a35750337e8"}, + {file = "websockets-10.3-cp39-cp39-win32.whl", hash = "sha256:bb621ec2dbbbe8df78a27dbd9dd7919f9b7d32a73fafcb4d9252fc4637343582"}, + {file = "websockets-10.3-cp39-cp39-win_amd64.whl", hash = "sha256:51695d3b199cd03098ae5b42833006a0f43dc5418d3102972addc593a783bc02"}, + {file = "websockets-10.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:907e8247480f287aa9bbc9391bd6de23c906d48af54c8c421df84655eef66af7"}, + {file = "websockets-10.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b1359aba0ff810d5830d5ab8e2c4a02bebf98a60aa0124fb29aa78cfdb8031f"}, + {file = "websockets-10.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:93d5ea0b5da8d66d868b32c614d2b52d14304444e39e13a59566d4acb8d6e2e4"}, + {file = "websockets-10.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7934e055fd5cd9dee60f11d16c8d79c4567315824bacb1246d0208a47eca9755"}, + {file = "websockets-10.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3eda1cb7e9da1b22588cefff09f0951771d6ee9fa8dbe66f5ae04cc5f26b2b55"}, + {file = "websockets-10.3.tar.gz", hash = "sha256:fc06cc8073c8e87072138ba1e431300e2d408f054b27047d047b549455066ff4"}, ] win32-setctime = [ {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, @@ -3280,3 +3503,7 @@ yarl = [ zhconv = [ {file = "zhconv-1.4.3.tar.gz", hash = "sha256:ad42d9057ca0605f8e41d62b67ca797f879f58193ee6840562c51459b2698c45"}, ] +zipp = [ + {file = "zipp-3.8.1-py3-none-any.whl", hash = "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009"}, + {file = "zipp-3.8.1.tar.gz", hash = "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2"}, +] diff --git a/pyproject.toml b/pyproject.toml index 39bfd25a..ec43eba7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,13 +12,12 @@ url = "https://mirrors.aliyun.com/pypi/simple/" [tool.poetry.dependencies] python = "^3.8" -nonebot2 = "^2.0.0-beta.4" +nonebot2 = "^2.0.0rc1" nonebot-adapter-onebot = "^2.0.0-beta.1" aiofiles = "^0.8.0" aiohttp = "3.7.4.post0" beautifulsoup4 = "4.9.3" feedparser = "^6.0.8" -gino = "^1.0.1" httpx = "^0.23.0" ImageHash = "^4.2.1" jieba = "^0.42.1" diff --git a/utils/decorator/shop.py b/utils/decorator/shop.py index e03ea290..6b92ca99 100644 --- a/utils/decorator/shop.py +++ b/utils/decorator/shop.py @@ -1,9 +1,9 @@ -from typing import Callable, Union, Tuple +from typing import Callable, Union, Tuple, Optional +from nonebot.adapters.onebot.v11 import MessageSegment, Message from nonebot.plugin import require - -use = require("use") -shop = require("shop_handle") +require("use") +require("shop_handle") class ShopRegister(dict): @@ -12,6 +12,44 @@ class ShopRegister(dict): self._data = {} self._flag = True + def before_handle(self, name: Union[str, Tuple[str, ...]], load_status: bool = True): + """ + 说明: + 使用前检查方法 + 参数: + :param name: 道具名称 + :param load_status: 加载状态 + """ + def register_before_handle(name_list: Tuple[str, ...], func: Callable): + if load_status: + for name_ in name_list: + if not self._data[name_]: + self._data[name_] = {} + if not self._data[name_].get('before_handle'): + self._data[name_]['before_handle'] = [] + self._data[name]['before_handle'].append(func) + _name = (name,) if isinstance(name, str) else name + return lambda func: register_before_handle(_name, func) + + def after_handle(self, name: Union[str, Tuple[str, ...]], load_status: bool = True): + """ + 说明: + 使用后执行方法 + 参数: + :param name: 道具名称 + :param load_status: 加载状态 + """ + def register_after_handle(name_list: Tuple[str, ...], func: Callable): + if load_status: + for name_ in name_list: + if not self._data[name_]: + self._data[name_] = {} + if not self._data[name_].get('after_handle'): + self._data[name_]['after_handle'] = [] + self._data[name_]['after_handle'].append(func) + _name = (name,) if isinstance(name, str) else name + return lambda func: register_after_handle(_name, func) + def register( self, name: Tuple[str, ...], @@ -21,13 +59,15 @@ class ShopRegister(dict): limit_time: Tuple[int, ...], load_status: Tuple[bool, ...], daily_limit: Tuple[int, ...], + is_passive: Tuple[bool, ...], + icon: Tuple[str, ...], **kwargs, ): def add_register_item(func: Callable): if name in self._data.keys(): raise ValueError("该商品已注册,请替换其他名称!") - for n, p, d, dd, l, s, dl in zip( - name, price, des, discount, limit_time, load_status, daily_limit + for n, p, d, dd, l, s, dl, pa, i in zip( + name, price, des, discount, limit_time, load_status, daily_limit, is_passive, icon ): if s: _temp_kwargs = {} @@ -36,46 +76,58 @@ class ShopRegister(dict): _temp_kwargs[key.split("_", maxsplit=1)[-1]] = value else: _temp_kwargs[key] = value - self._data[n] = { + temp = self._data.get(n, {}) + temp.update({ "price": p, "des": d, "discount": dd, "limit_time": l, "daily_limit": dl, + "icon": i, + "is_passive": pa, "func": func, "kwargs": _temp_kwargs, - } + }) + self._data[n] = temp return func return lambda func: add_register_item(func) async def load_register(self): + from basic_plugins.shop.use.data_source import register_use, func_manager + from basic_plugins.shop.shop_handle.data_source import register_goods # 统一进行注册 if self._flag: # 只进行一次注册 self._flag = False for name in self._data.keys(): - await shop.register_goods( + await register_goods( name, self._data[name]["price"], self._data[name]["des"], self._data[name]["discount"], self._data[name]["limit_time"], self._data[name]["daily_limit"], + self._data[name]["is_passive"], + self._data[name]["icon"], ) - use.register_use( + register_use( name, self._data[name]["func"], **self._data[name]["kwargs"] ) + func_manager.register_use_before_handle(name, self._data[name].get('before_handle', [])) + func_manager.register_use_after_handle(name, self._data[name].get('after_handle', [])) def __call__( self, - name: Union[str, Tuple[str, ...]], - price: Union[float, Tuple[float, ...]], - des: Union[str, Tuple[str, ...]], - discount: Union[float, Tuple[float, ...]] = 1, - limit_time: Union[int, Tuple[int, ...]] = 0, - load_status: Union[bool, Tuple[bool, ...]] = True, - daily_limit: Union[int, Tuple[int, ...]] = 0, + name: Union[str, Tuple[str, ...]], # 名称 + price: Union[float, Tuple[float, ...]], # 价格 + des: Union[str, Tuple[str, ...]], # 简介 + discount: Union[float, Tuple[float, ...]] = 1, # 折扣 + limit_time: Union[int, Tuple[int, ...]] = 0, # 限时 + load_status: Union[bool, Tuple[bool, ...]] = True, # 加载状态 + daily_limit: Union[int, Tuple[int, ...]] = 0, # 每日限购 + is_passive: Union[bool, Tuple[bool, ...]] = False, # 被动道具(无法被'使用道具'命令消耗) + icon: Union[str, Tuple[str, ...]] = False, # 图标 **kwargs, ): _tuple_list = [] @@ -89,35 +141,15 @@ class ShopRegister(dict): f"注册商品 {name} 中 name,price,des,discount,limit_time,load_status,daily_limit 数量不符!" ) _current_len = _current_len if _current_len > -1 else 1 - _name = name if isinstance(name, tuple) else (name,) - _price = ( - price - if isinstance(price, tuple) - else tuple([price for _ in range(_current_len)]) - ) - _discount = ( - discount - if isinstance(discount, tuple) - else tuple([discount for _ in range(_current_len)]) - ) - _limit_time = ( - limit_time - if isinstance(limit_time, tuple) - else tuple([limit_time for _ in range(_current_len)]) - ) - _des = ( - des if isinstance(des, tuple) else tuple([des for _ in range(_current_len)]) - ) - _load_status = ( - load_status - if isinstance(load_status, tuple) - else tuple([load_status for _ in range(_current_len)]) - ) - _daily_limit = ( - daily_limit - if isinstance(daily_limit, tuple) - else tuple([daily_limit for _ in range(_current_len)]) - ) + _name = self.__get(name, _current_len) + _price = self.__get(price, _current_len) + _discount = self.__get(discount, _current_len) + _limit_time = self.__get(limit_time, _current_len) + _des = self.__get(des, _current_len) + _load_status = self.__get(load_status, _current_len) + _daily_limit = self.__get(daily_limit, _current_len) + _is_passive = self.__get(is_passive, _current_len) + _icon = self.__get(icon, _current_len) return self.register( _name, _price, @@ -126,9 +158,14 @@ class ShopRegister(dict): _limit_time, _load_status, _daily_limit, + _is_passive, + _icon, **kwargs, ) + def __get(self, value, _current_len): + return value if isinstance(value, tuple) else tuple([value for _ in range(_current_len)]) + def __setitem__(self, key, value): self._data[key] = value @@ -151,4 +188,18 @@ class ShopRegister(dict): return self._data.items() +class NotMeetUseConditionsException(Exception): + + """ + 不满足条件异常类 + """ + + def __init__(self, info: Optional[Union[str, MessageSegment, Message]]): + super().__init__(self) + self._info = info + + def get_info(self): + return self._info + + shop_register = ShopRegister() diff --git a/utils/manager/__init__.py b/utils/manager/__init__.py index 0e5e172e..b2f1b158 100755 --- a/utils/manager/__init__.py +++ b/utils/manager/__init__.py @@ -14,11 +14,6 @@ from .requests_manager import RequestManager from configs.path_config import DATA_PATH -# 全局字典 -GDict = { - "run_sql": [] # 需要启动前运行的sql语句 -} - # 群功能开关 | 群被动技能 | 群权限 管理 group_manager: Optional[GroupManager] = GroupManager( DATA_PATH / "manager" / "group_manager.json" diff --git a/utils/utils.py b/utils/utils.py index f8229192..535de1f7 100755 --- a/utils/utils.py +++ b/utils/utils.py @@ -18,8 +18,17 @@ try: except ModuleNotFoundError: import json +require("nonebot_plugin_apscheduler") +from nonebot_plugin_apscheduler import scheduler -scheduler = require("nonebot_plugin_apscheduler").scheduler +scheduler = scheduler + +# 全局字典 +GDict = { + "run_sql": [], # 需要启动前运行的sql语句 + "_shop_before_handle": {}, # 商品使用前函数 + "_shop_after_handle": {}, # 商品使用后函数 +} class CountLimiter: @@ -110,8 +119,8 @@ class BanCheckLimiter: self.mint[key] = 0 return False if ( - self.mint[key] >= self.default_count - and time.time() - self.mtime[key] < self.default_check_time + self.mint[key] >= self.default_count + and time.time() - self.mtime[key] < self.default_check_time ): self.mtime[key] = time.time() self.mint[key] = 0 @@ -402,7 +411,7 @@ def cn2py(word: str) -> str: def change_pixiv_image_links( - url: str, size: Optional[str] = None, nginx_url: Optional[str] = None + url: str, size: Optional[str] = None, nginx_url: Optional[str] = None ): """ 说明: @@ -422,8 +431,8 @@ def change_pixiv_image_links( if nginx_url: url = ( url.replace("i.pximg.net", nginx_url) - .replace("i.pixiv.cat", nginx_url) - .replace("_webp", "") + .replace("i.pixiv.cat", nginx_url) + .replace("_webp", "") ) return url From 1b9eddd905f46f85b90812536d0f824aabd3dcb3 Mon Sep 17 00:00:00 2001 From: HibiKier <45528451+HibiKier@users.noreply.github.com> Date: Sat, 15 Oct 2022 19:53:11 +0800 Subject: [PATCH 2/2] Add files via upload --- .../image/shop_icon/favorability_card_1.png | Bin 0 -> 7066 bytes .../image/shop_icon/favorability_card_2.png | Bin 0 -> 7048 bytes .../image/shop_icon/favorability_card_3.png | Bin 0 -> 7046 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/image/shop_icon/favorability_card_1.png create mode 100644 resources/image/shop_icon/favorability_card_2.png create mode 100644 resources/image/shop_icon/favorability_card_3.png diff --git a/resources/image/shop_icon/favorability_card_1.png b/resources/image/shop_icon/favorability_card_1.png new file mode 100644 index 0000000000000000000000000000000000000000..83b1c2b8b55b5b70e3e191f05ee96f1512bcf404 GIT binary patch literal 7066 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 literal 0 HcmV?d00001 diff --git a/resources/image/shop_icon/favorability_card_2.png b/resources/image/shop_icon/favorability_card_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d98ca598a5ddf78d6ffa940bf5c1be000e5b4b7d GIT binary patch literal 7048 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 U5&d81==mCklAJocO2!iLKjO1BssI20 literal 0 HcmV?d00001