3.2版本支持,项目目录小重构

This commit is contained in:
CMHopeSunshine 2022-11-02 10:31:15 +08:00
parent 530a72f53c
commit 6373f2ec6d
80 changed files with 1671 additions and 1245 deletions

View File

@ -7,7 +7,7 @@ from LittlePaimon.utils.migration import migrate_database
from LittlePaimon.utils.tool import check_resource
DRIVER = get_driver()
__version__ = '3.0.0rc1'
__version__ = '3.0.0rc2'
try:
SUPERUSERS: List[int] = [int(s) for s in DRIVER.config.superusers]
@ -39,8 +39,4 @@ async def startup():
DRIVER.on_shutdown(database.disconnect)
load_plugin('LittlePaimon.manager.bot_manager')
load_plugin('LittlePaimon.manager.plugin_manager')
load_plugin('LittlePaimon.manager.database_manager')
load_plugin('LittlePaimon.manager.alias_manager')
load_plugins(str(Path(__file__).parent / 'plugins'))

View File

@ -1 +1,5 @@
from .path import *
from .config.manage import ConfigManager, ConfigModel
from .plugin.manage import PluginManager, HIDDEN_PLUGINS, MatcherInfo, PluginInfo
config = ConfigManager.config

View File

@ -0,0 +1,32 @@
from LittlePaimon.utils.files import load_yaml, save_yaml
from LittlePaimon.config.path import PAIMON_CONFIG
from .model import ConfigModel
class ConfigManager:
if PAIMON_CONFIG.exists():
config = ConfigModel.parse_obj(load_yaml(PAIMON_CONFIG))
else:
config = ConfigModel()
save_yaml(config.dict(by_alias=True), PAIMON_CONFIG)
@classmethod
def set_config(cls, config_name: str, value: any):
"""
设置派蒙配置项
:param config_name: 配置名
:param value: 新配置值
"""
if config_name not in cls.config.dict(by_alias=True).keys():
return f'没有配置项为{config_name}'
if '启用' in config_name or '开关' in config_name or config_name in {'自动接受好友请求', '自动接受群邀请'}:
if value not in ['', '', 'true', 'false', 'on', 'off']:
return '参数错误'
value = value in ['', 'true', 'on']
elif config_name != 'CookieWeb地址' and not value.isdigit():
return '配置项不合法,必须为数字'
temp = cls.config.dict(by_alias=True)
temp[config_name] = value
cls.config = ConfigModel.parse_obj(temp)
save_yaml(cls.config.dict(by_alias=True), PAIMON_CONFIG)
return f'成功设置{config_name}{value}'

View File

@ -1,41 +1,7 @@
from typing import Optional, List
from pydantic import BaseModel, Field
class MatcherInfo(BaseModel):
pm_name: str
"""命令名称"""
pm_description: Optional[str]
"""命令描述"""
pm_usage: Optional[str]
"""命令用法"""
pm_priority: int = 99
"""命令优先级"""
pm_show: bool = True
"""是否展示"""
class PluginInfo(BaseModel):
name: str
"""插件名称"""
module_name: str
"""插件模块名称"""
description: Optional[str]
"""插件描述"""
usage: Optional[str]
"""插件用法"""
status: Optional[bool]
"""插件状态(无用项)"""
show: bool = True
"""是否展示"""
priority: int = 99
"""展示优先级"""
matchers: Optional[List[MatcherInfo]] = []
"""命令列表"""
class Config(BaseModel):
class ConfigModel(BaseModel):
CookieWeb_enable: bool = Field(True, alias='启用CookieWeb')
CookieWeb_url: str = Field('http://127.0.0.1:13579/LittlePaimon/cookie', alias='CookieWeb地址')

View File

@ -58,12 +58,12 @@
"10000070": ["妮露", "舞女"],
"10000071": ["赛诺", "风纪官"],
"10000072": ["坎蒂丝", "潘森"],
"10000101": ["纳西妲", "草神", "艹神", "小草王", "小吉祥草王", "草萝莉", "艹萝莉"],
"10000102": ["散兵", "伞兵", "国崩", "卢本伟", "大炮", "sb"],
"10000073": ["纳西妲", "草神", "艹神", "小草王", "小吉祥草王", "草萝莉", "艹萝莉"],
"10000074": ["莱依拉", "莱伊拉"],
"10000075": ["散兵", "伞兵", "国崩", "卢本伟", "大炮", "sb", "流浪者"],
"10000103": ["迪希雅"],
"10000104": ["艾尔海森", "苏"],
"10000105": ["白术"],
"10000106": ["莱依拉"]
"10000105": ["白术"]
},
"武器": {
"磐岩结绿": [

File diff suppressed because it is too large Load Diff

View File

@ -293,6 +293,12 @@
"10721": "普通攻击·流耀枪术·守势",
"10722": "圣仪·苍鹭庇卫",
"10725": "圣仪·灰鸰衒潮",
"10731": "普通攻击·行相",
"10732": "所闻遍计",
"10735": "心景幻成",
"10741": "普通攻击·熠辉轨度剑",
"10742": "垂裳端凝之夜",
"10745": "星流摇床之梦",
"20001": "风魔炮",
"20002": "风魔炮",
"20011": "飞行挑战 - 前冲",
@ -321,6 +327,11 @@
"20043": "钩爪占位",
"20044": "钩爪占位",
"20045": "3.1抓捕野猪-投掷",
"20049": "大世界抓捕蕈兽-发射子弹",
"20051": "蕈兽战斗-集火",
"20054": "3.2散兵2阶段瞄准射击",
"20055": "3.2禁用元素战技",
"20056": "3.2禁用元素爆发",
"20100": "捕获!",
"20101": "捕获!",
"20110": "神秘预感",
@ -451,7 +462,10 @@
"5069010": "提纳里空中攻击",
"5070010": "妮露空中攻击",
"5071010": "赛诺空中攻击",
"5072010": "坎蒂丝空中攻击"
"5072010": "坎蒂丝空中攻击",
"5073010": "纳西妲空中攻击",
"5074010": "莱依拉空中攻击",
"5076010": "空中攻击"
},
"Icon": {
"10001": "",
@ -747,6 +761,12 @@
"10721": "Skill_A_03",
"10722": "Skill_S_Candace_01",
"10725": "Skill_E_Candace_01",
"10731": "Skill_A_Catalyst_MD",
"10732": "Skill_S_Nahida_01",
"10735": "Skill_E_Nahida_01",
"10741": "Skill_A_01",
"10742": "Skill_S_Layla_01",
"10745": "Skill_E_Layla_01",
"20001": "Skill_A_Dvalin_AirGun",
"20002": "Skill_A_Dvalin_AirGun",
"20011": "Btn_FlightSprint",
@ -775,6 +795,11 @@
"20043": "",
"20044": "",
"20045": "Btn_CatchAnimal_Shoot",
"20049": "Btn_CatchAnimal_Shoot",
"20051": "Btn_FungusFighter_Aim",
"20054": "Skill_E_Gagana_AimShoot",
"20055": "",
"20056": "",
"20100": "Btn_HideAndSeek_Seeker_A_01",
"20101": "Btn_HideAndSeek_Seeker_A_01",
"20110": "Btn_HideAndSeek_Seeker_S_01",
@ -905,6 +930,9 @@
"5069010": "Skill_A_02",
"5070010": "Skill_A_01",
"5071010": "Skill_A_03",
"5072010": "Skill_A_03"
"5072010": "Skill_A_03",
"5073010": "Skill_A_Catalyst_MD",
"5074010": "Skill_A_01",
"5076010": "Skill_A_02"
}
}

View File

@ -359,7 +359,19 @@
"723": "织狩的奉祀",
"724": "守戍的誓命",
"725": "萦金的苍瞳",
"726": "衍溢的汐潮"
"726": "衍溢的汐潮",
"731": "心识蕴藏之种",
"732": "正等善见之根",
"733": "熏习成就之芽",
"734": "比量现行之茎",
"735": "妙谛破愚之叶",
"736": "大辨圆成之实",
"741": "寐领围垣",
"742": "归芒携信",
"743": "长宵宣秘",
"744": "星示昭明",
"745": "悬神系流",
"746": "曜光灵炬"
},
"Icon": {
"21": "UI_Talent_S_Ayaka_01",
@ -721,6 +733,18 @@
"723": "UI_Talent_U_Candace_01",
"724": "UI_Talent_S_Candace_03",
"725": "UI_Talent_U_Candace_02",
"726": "UI_Talent_S_Candace_04"
"726": "UI_Talent_S_Candace_04",
"731": "UI_Talent_S_Nahida_01",
"732": "UI_Talent_S_Nahida_02",
"733": "UI_Talent_U_Nahida_01",
"734": "UI_Talent_S_Nahida_03",
"735": "UI_Talent_U_Nahida_02",
"736": "UI_Talent_S_Nahida_04",
"741": "UI_Talent_S_Layla_01",
"742": "UI_Talent_S_Layla_02",
"743": "UI_Talent_U_Layla_01",
"744": "UI_Talent_S_Layla_03",
"745": "UI_Talent_U_Layla_02",
"746": "UI_Talent_S_Layla_04"
}
}

View File

@ -25246,5 +25246,100 @@
"",
""
]
},
"纳西妲": {
"name": "纳西妲",
"title": "白草净华",
"region": "须弥",
"sex": "女",
"star": "5",
"type": "限定UP",
"element": "草",
"weapon": "法器",
"date": "2022年11月02日",
"tag": "精通加成、自身伤害提升、减防、特化反应、技能延长、协同攻击",
"mission": "智慧主之章",
"introduce": "深居净善宫的笼中之鸟,只能在梦中将世界尽收眼底。",
"destiny_name": "智慧主座",
"destiny": {
"": ""
},
"attribute": {
"hp": {
"1": "",
"20": "",
"40": "",
"50": "",
"60": "",
"70": "",
"80": "",
"90": ""
},
"atk": {
"1": "",
"20": "",
"40": "",
"50": "",
"60": "",
"70": "",
"80": "",
"90": ""
},
"def": {
"1": "",
"20": "",
"40": "",
"50": "",
"60": "",
"70": "",
"80": "",
"90": ""
},
"attribute": "",
"attributes": {
"1": "0",
"20": "0",
"40": "0",
"50": "",
"60": "",
"70": "",
"80": "",
"90": ""
}
},
"skill": {
"普通攻击·行相": {
"描述": "",
"数值": {}
},
"所闻遍计": {
"描述": "",
"数值": {}
},
"心景幻成": {
"描述": "",
"数值": {}
},
"净善摄受明论": "",
"慧明缘觉智论": "",
"诸相随念净行": ""
},
"cv": {
"cn": "花玲",
"jp": "田村由加莉",
"kr": "朴恃奫",
"en": "金伯利·安妮·坎贝尔"
},
"food": "料理未知",
"story": [
"",
"",
"",
"",
"",
"",
"",
""
]
}
}

View File

@ -591,6 +591,14 @@
"暴击率": 1,
"暴击伤害": 1
}
},
"纳西妲": {
"常规": {
"攻击力": 1,
"元素精通": 1,
"暴击率": 1,
"暴击伤害": 1
}
}
},
"Talent": {

View File

@ -121,6 +121,7 @@
"693354267": "尘世之锁",
"1890163363": "不灭月华",
"310247243": "神乐之真意",
"1201790667": "千夜浮梦",
"3600623979": "猎弓",
"2340970067": "历练的猎弓",
"3975746731": "鸦羽弓",
@ -282,6 +283,7 @@
"尘世之锁": "法器",
"不灭月华": "法器",
"神乐之真意": "法器",
"千夜浮梦": "法器",
"猎弓": "弓",
"历练的猎弓": "弓",
"鸦羽弓": "弓",
@ -438,6 +440,7 @@
"尘世之锁": "UI_EquipIcon_Catalyst_Kunwu",
"不灭月华": "UI_EquipIcon_Catalyst_Kaleido",
"神乐之真意": "UI_EquipIcon_Catalyst_Narukami",
"千夜浮梦": "UI_EquipIcon_Catalyst_Ayus",
"猎弓": "UI_EquipIcon_Bow_Hunters",
"历练的猎弓": "UI_EquipIcon_Bow_Old",
"鸦羽弓": "UI_EquipIcon_Bow_Crowfeather",

View File

@ -0,0 +1,162 @@
import asyncio
import datetime
from typing import Dict, List
from nonebot import plugin as nb_plugin
from nonebot import get_bot
from nonebot.matcher import Matcher
from nonebot.exception import IgnoredException
from nonebot.message import run_preprocessor
from nonebot.adapters.onebot.v11 import MessageEvent, PrivateMessageEvent, GroupMessageEvent
from LittlePaimon import DRIVER, SUPERUSERS
from LittlePaimon.utils import logger
from LittlePaimon.config.path import PLUGIN_CONFIG
from LittlePaimon.utils.files import load_yaml, save_yaml
from LittlePaimon.database.models import PluginPermission, PluginStatistics
from .model import MatcherInfo, PluginInfo
HIDDEN_PLUGINS = [
'LittlePaimon',
'config',
'nonebot_plugin_apscheduler',
'nonebot_plugin_gocqhttp',
'nonebot_plugin_htmlrender',
'nonebot_plugin_imageutils',
'NoticeAndRequest'
]
class PluginManager:
plugins: Dict[str, PluginInfo] = {}
for file in PLUGIN_CONFIG.iterdir():
if file.is_file() and file.name.endswith('.yml'):
data = load_yaml(file)
plugins[file.name.replace('.yml', '')] = PluginInfo.parse_obj(data)
@classmethod
def save(cls):
"""
保存数据
"""
for name, plugin in cls.plugins.items():
save_yaml(plugin.dict(exclude={'status'}), PLUGIN_CONFIG / f'{name}.yml')
@classmethod
async def init(cls):
plugin_list = nb_plugin.get_loaded_plugins()
group_list = await get_bot().get_group_list()
user_list = await get_bot().get_friend_list()
for plugin in plugin_list:
if plugin.name not in HIDDEN_PLUGINS:
await asyncio.gather(*[PluginPermission.update_or_create(name=plugin.name, session_id=group['group_id'],
session_type='group') for group in group_list])
await asyncio.gather(*[PluginPermission.update_or_create(name=plugin.name, session_id=user['user_id'],
session_type='user') for user in user_list])
if plugin.name not in HIDDEN_PLUGINS:
if plugin.name not in cls.plugins:
if metadata := plugin.metadata:
cls.plugins[plugin.name] = PluginInfo.parse_obj({
'name': metadata.name,
'module_name': plugin.name,
'description': metadata.description,
'usage': metadata.usage,
'show': metadata.extra.get('show', True),
'priority': metadata.extra.get('priority', 99),
'cooldown': metadata.extra.get('cooldown')
})
else:
cls.plugins[plugin.name] = PluginInfo(name=plugin.name, module_name=plugin.name)
matchers = plugin.matcher
for matcher in matchers:
if matcher._default_state:
matcher_info = MatcherInfo.parse_obj(matcher._default_state)
if cls.plugins[plugin.name].matchers is not None and matcher_info.pm_name not in [m.pm_name for
m
in
cls.plugins[
plugin.name].matchers]:
cls.plugins[plugin.name].matchers.append(matcher_info)
cls.save()
logger.success('插件管理器', '<g>初始化完成</g>')
@classmethod
async def get_plugin_list(cls, message_type: str, session_id: int) -> List[PluginInfo]:
"""
获取插件列表供帮助图使用
:param message_type: 消息类型
:param session_id: 消息ID
"""
load_plugins = nb_plugin.get_loaded_plugins()
load_plugins = [p.name for p in load_plugins]
plugin_list = sorted(cls.plugins.values(), key=lambda x: x.priority).copy()
plugin_list = [p for p in plugin_list if p.show and p.module_name in load_plugins]
for plugin in plugin_list:
if message_type != 'guild':
plugin_info = await PluginPermission.get_or_none(name=plugin.module_name, session_id=session_id,
session_type=message_type)
plugin.status = True if plugin_info is None else plugin_info.status
else:
plugin.status = True
if plugin.matchers:
plugin.matchers.sort(key=lambda x: x.pm_priority)
plugin.matchers = [m for m in plugin.matchers if m.pm_show and m.pm_usage]
return plugin_list
@classmethod
async def get_plugin_list_for_admin(cls) -> List[dict]:
"""
获取插件列表供Web UI使用
"""
load_plugins = nb_plugin.get_loaded_plugins()
load_plugins = [p.name for p in load_plugins]
plugin_list = [p.dict(exclude={'status'}) for p in cls.plugins.values()]
for plugin in plugin_list:
plugin['matchers'].sort(key=lambda x: x['pm_priority'])
plugin['isLoad'] = plugin['module_name'] in load_plugins
plugin['status'] = await PluginPermission.filter(name=plugin['module_name'], status=True).exists()
plugin_list.sort(key=lambda x: (x['isLoad'], x['status'], -x['priority']), reverse=True)
return plugin_list
@DRIVER.on_bot_connect
async def _():
await PluginManager.init()
@run_preprocessor
async def _(event: MessageEvent, matcher: Matcher):
if event.user_id in SUPERUSERS:
return
if not matcher.plugin_name or matcher.plugin_name in HIDDEN_PLUGINS:
return
if isinstance(event, PrivateMessageEvent):
session_id = event.user_id
session_type = 'user'
elif isinstance(event, GroupMessageEvent):
session_id = event.group_id
session_type = 'group'
else:
return
# 权限检查
perm = await PluginPermission.get_or_none(name=matcher.plugin_name, session_id=session_id,
session_type=session_type)
if not perm:
return
if not perm.status:
raise IgnoredException('插件使用权限已禁用')
if isinstance(event, GroupMessageEvent) and event.user_id in perm.ban:
raise IgnoredException('用户被禁止使用该插件')
# 命令调用统计
if matcher.plugin_name in PluginManager.plugins and 'pm_name' in matcher.state:
if matcher_info := list(filter(lambda x: x.pm_name == matcher.state['pm_name'],
PluginManager.plugins[matcher.plugin_name].matchers)):
matcher_info = matcher_info[0]
await PluginStatistics.create(plugin_name=matcher.plugin_name,
matcher_name=matcher_info.pm_name,
matcher_usage=matcher_info.pm_usage,
group_id=event.group_id if isinstance(event, GroupMessageEvent) else None,
user_id=event.user_id,
message_type=session_type,
time=datetime.datetime.now())

View File

@ -0,0 +1,35 @@
from typing import Optional, List
from pydantic import BaseModel
class MatcherInfo(BaseModel):
pm_name: str
"""命令名称"""
pm_description: Optional[str]
"""命令描述"""
pm_usage: Optional[str]
"""命令用法"""
pm_priority: int = 99
"""命令优先级"""
pm_show: bool = True
"""是否展示"""
class PluginInfo(BaseModel):
name: str
"""插件名称"""
module_name: str
"""插件模块名称"""
description: Optional[str]
"""插件描述"""
usage: Optional[str]
"""插件用法"""
status: Optional[bool]
"""插件状态(无用项)"""
show: bool = True
"""是否展示"""
priority: int = 99
"""展示优先级"""
matchers: Optional[List[MatcherInfo]] = []
"""命令列表"""

View File

@ -1,27 +1,29 @@
import shutil
from pathlib import Path
from typing import List, Optional, Union
from tortoise import Tortoise
from nonebot.log import logger
from LittlePaimon.config import GENSHIN_DB_PATH, SUB_DB_PATH, GENSHIN_VOICE_DB_PATH, MANAGER_DB_PATH, LEARNING_CHAT_DB_PATH
from LittlePaimon.utils import scheduler
from LittlePaimon.config import GENSHIN_DB_PATH, SUB_DB_PATH, GENSHIN_VOICE_DB_PATH, MANAGER_DB_PATH, \
LEARNING_CHAT_DB_PATH, YSC_TEMP_IMG_PATH
from .models import *
DATABASE = {
"connections": {
"genshin": {
"engine": "tortoise.backends.sqlite",
"genshin": {
"engine": "tortoise.backends.sqlite",
"credentials": {"file_path": GENSHIN_DB_PATH},
},
"subscription": {
"engine": "tortoise.backends.sqlite",
"subscription": {
"engine": "tortoise.backends.sqlite",
"credentials": {"file_path": SUB_DB_PATH},
},
'genshin_voice': {
"engine": "tortoise.backends.sqlite",
"engine": "tortoise.backends.sqlite",
"credentials": {"file_path": GENSHIN_VOICE_DB_PATH},
},
'manager': {
"engine": "tortoise.backends.sqlite",
'manager': {
"engine": "tortoise.backends.sqlite",
"credentials": {"file_path": MANAGER_DB_PATH},
},
'learning_chat': {
@ -29,21 +31,24 @@ DATABASE = {
"credentials": {"file_path": LEARNING_CHAT_DB_PATH},
},
},
"apps": {
"genshin": {
"models": ['LittlePaimon.database.models.player_info', 'LittlePaimon.database.models.abyss_info', 'LittlePaimon.database.models.character', 'LittlePaimon.database.models.cookie'],
"apps": {
"genshin": {
"models": ['LittlePaimon.database.models.player_info',
'LittlePaimon.database.models.abyss_info',
'LittlePaimon.database.models.character',
'LittlePaimon.database.models.cookie'],
"default_connection": "genshin",
},
"subscription": {
"models": ['LittlePaimon.database.models.subscription'],
"subscription": {
"models": ['LittlePaimon.database.models.subscription'],
"default_connection": "subscription",
},
"genshin_voice": {
"models": ['LittlePaimon.database.models.genshin_voice'],
"models": ['LittlePaimon.database.models.genshin_voice'],
"default_connection": "genshin_voice",
},
"manager": {
"models": ['LittlePaimon.database.models.manager'],
"manager": {
"models": ['LittlePaimon.database.models.manager'],
"default_connection": "manager",
},
"learning_chat": {
@ -52,38 +57,23 @@ DATABASE = {
}
},
}
# DATABASE = [
# {
# 'db_url': f'sqlite://{GENSHIN_DB_PATH}',
# 'models': ['LittlePaimon.database.models.player_info', 'LittlePaimon.database.models.abyss_info', 'LittlePaimon.database.models.character', 'LittlePaimon.database.models.cookie'],
# },
# {
# 'db_url': f'sqlite://{SUB_DB_PATH}',
# 'models': ['LittlePaimon.database.models.subscription'],
# },
# {
# 'db_url': f'sqlite://{GENSHIN_VOICE_DB_PATH}',
# 'models': ['LittlePaimon.database.models.genshin_voice'],
# },
# {
# 'db_url': f'sqlite://{MANAGER_DB_PATH}',
# 'models': ['LittlePaimon.database.models.manager'],
# },
# {
# 'db_url': f'sqlite://{LEARNING_CHAT_DB_PATH}',
# 'models': ['LittlePaimon.database.models.learning_chat'],
# },
# ]
# def register_database(db_path: Optional[Union[str, Path]], models: List[Union[str, Path]]):
# """
# 注册数据库
# """
# DATABASE.append({
# 'db_url': f'sqlite://{db_path}',
# 'models': models,
# })
def register_database(db_name: str, models: List[Union[str, Path]], db_path: Optional[Union[str, Path]]):
"""
注册数据库
"""
if db_name in DATABASE['connections'] and db_name in DATABASE['apps']:
DATABASE['apps'][db_name]['models'].extend(models)
else:
DATABASE['connections'][db_name] = {
"engine": "tortoise.backends.sqlite",
"credentials": {"file_path": db_path},
}
DATABASE['apps'][db_name] = {
"models": models,
"default_connection": db_name,
}
async def connect():
@ -91,11 +81,6 @@ async def connect():
建立数据库连接
"""
try:
# for db in DATABASE:
# await Tortoise.init(
# db_url=db['db_url'],
# modules={'models': db['models']},
# )
await Tortoise.init(DATABASE)
await Tortoise.generate_schemas()
logger.opt(colors=True).success("<u><y>[数据库]</y></u><g>连接成功</g>")
@ -110,3 +95,29 @@ async def disconnect():
"""
await Tortoise.close_connections()
logger.opt(colors=True).success("<u><y>[数据库]</y></u><r>连接已断开</r>")
@scheduler.scheduled_job('cron', hour=0, minute=0, misfire_grace_time=10)
async def daily_reset():
"""
重置数据库相关设置
"""
now = datetime.datetime.now()
logger.info('原神实时便签', '重置每日提醒次数限制')
await DailyNoteSub.all().update(today_remind_num=0)
logger.info('原神Cookie', '清空每日Cookie缓存和限制')
await CookieCache.all().delete()
await PublicCookie.filter(status=2).update(status=1)
logger.info('功能调用统计', '清除超过一个月的统计数据')
await PluginStatistics.filter(time__lt=now - datetime.timedelta(days=30)).delete()
if now.weekday() == 0:
logger.info('原神猜语音', '清空每周排行榜')
await GuessVoiceRank.all().delete()
if YSC_TEMP_IMG_PATH.exists():
shutil.rmtree(YSC_TEMP_IMG_PATH)
YSC_TEMP_IMG_PATH.mkdir(parents=True, exist_ok=True)

View File

@ -1,8 +1,7 @@
import datetime
import re
from typing import Optional, List, Dict, Iterator
from typing import Optional, Dict, Iterator
from pydantic import BaseModel
from tortoise import fields
from tortoise.models import Model

View File

@ -32,7 +32,7 @@ class DailyNoteSub(Model):
class MihoyoBBSSub(Model):
"""
米游社相关订阅
米游社原神签到和米游币获取订阅
"""
id = fields.IntField(pk=True, generated=True, auto_increment=True)
user_id: int = fields.IntField()
@ -49,6 +49,25 @@ class MihoyoBBSSub(Model):
table_description = '米游社订阅'
class MihoyoBBSPostSub(Model):
"""
米游社用户帖子订阅
"""
id = fields.IntField(pk=True, generated=True, auto_increment=True)
mys_id: str = fields.CharField(max_length=255)
"""订阅的米游社用户id"""
session_id: str = fields.CharField(max_length=255)
"""订阅者的qq号或群号"""
session_type: str = fields.CharField(max_length=255, default='private')
"""订阅者的群号"""
last_post_id: str = fields.CharField(max_length=255, null=True)
"""上次推送的帖子id"""
class Meta:
table = 'mhy_bbs_user_sub'
table_description = '米游社用户帖子订阅'
class CloudGenshinSub(Model):
"""
云原神

View File

@ -1,27 +0,0 @@
import datetime
from LittlePaimon.config import YSC_TEMP_IMG_PATH
from LittlePaimon.utils import scheduler, logger
from LittlePaimon.database.models import GuessVoiceRank, PluginStatistics, DailyNoteSub, CookieCache, PublicCookie
@scheduler.scheduled_job('cron', hour=0, minute=0, misfire_grace_time=10)
async def _():
now = datetime.datetime.now()
logger.info('原神实时便签', '重置每日提醒次数限制')
await DailyNoteSub.all().update(today_remind_num=0)
logger.info('原神Cookie', '清空每日Cookie缓存和限制')
await CookieCache.all().delete()
await PublicCookie.filter(status=2).update(status=1)
logger.info('功能调用统计', '清除超过一个月的统计数据')
await PluginStatistics.filter(time__lt=now - datetime.timedelta(days=30)).delete()
if now.weekday() == 0:
logger.info('原神猜语音', '清空每周排行榜')
await GuessVoiceRank.all().delete()
if YSC_TEMP_IMG_PATH.exists():
YSC_TEMP_IMG_PATH.unlink()
YSC_TEMP_IMG_PATH.mkdir(parents=True, exist_ok=True)

View File

@ -1,134 +0,0 @@
import asyncio
from typing import Dict, List
from nonebot import plugin as nb_plugin
from nonebot import get_bot
from LittlePaimon.utils import logger
from LittlePaimon.config.path import PLUGIN_CONFIG, PAIMON_CONFIG
from LittlePaimon.utils.files import load_yaml, save_yaml
from LittlePaimon.database.models import PluginPermission
from .model import MatcherInfo, PluginInfo, Config
hidden_plugins = [
'LittlePaimon',
'config',
'nonebot_plugin_apscheduler',
'nonebot_plugin_gocqhttp',
'nonebot_plugin_htmlrender',
'nonebot_plugin_imageutils',
'plugin_manager',
'database_manager',
'admin',
'NoticeAndRequest'
]
class PluginManager:
def __init__(self):
self.plugin_config_path = PLUGIN_CONFIG
self.config_path = PAIMON_CONFIG
self.data: Dict[str, PluginInfo] = {}
self.config: Config = Config()
self.load()
def save(self):
"""
保存数据
"""
save_yaml(self.config.dict(by_alias=True), self.config_path)
for name, plugin in self.data.items():
save_yaml(plugin.dict(), self.plugin_config_path / f'{name}.yml')
def load(self):
"""
读取配置项以及插件数据
"""
if self.config_path.exists():
self.config = Config.parse_obj(load_yaml(self.config_path))
# else:
# logger.warning('插件管理器', '<r>无法读取配置文件</r>,请检查是否已将<m>config/paimon_config_default.yml</m>复制为<m>config/paimon_config.yml</m>')
for file in self.plugin_config_path.iterdir():
if file.is_file() and file.name.endswith('.yml'):
data = load_yaml(file)
self.data[file.name.replace('.yml', '')] = PluginInfo.parse_obj(data)
def set_config(self, config_name: str, value: any):
"""
设置派蒙配置项
:param config_name: 配置名
:param value: 新配置值
"""
if config_name not in self.config.dict(by_alias=True).keys():
return f'没有配置项为{config_name}'
if '启用' in config_name or '开关' in config_name or config_name in {'自动接受好友请求', '自动接受群邀请'}:
if value not in ['', '', 'true', 'false', 'on', 'off']:
return '参数错误'
value = value in ['', 'true', 'on']
elif config_name != 'CookieWeb地址' and not value.isdigit():
return '配置项不合法,必须为数字'
temp = self.config.dict(by_alias=True)
temp[config_name] = value
self.config = Config.parse_obj(temp)
self.save()
return f'成功设置{config_name}{value}'
async def init_plugins(self):
plugin_list = nb_plugin.get_loaded_plugins()
group_list = await get_bot().get_group_list()
user_list = await get_bot().get_friend_list()
for plugin in plugin_list:
if plugin.name not in hidden_plugins:
await asyncio.gather(*[PluginPermission.update_or_create(name=plugin.name, session_id=group['group_id'],
session_type='group') for group in group_list])
await asyncio.gather(*[PluginPermission.update_or_create(name=plugin.name, session_id=user['user_id'],
session_type='user') for user in user_list])
if plugin.name not in hidden_plugins:
if plugin.name not in self.data:
if metadata := plugin.metadata:
self.data[plugin.name] = PluginInfo.parse_obj({
'name': metadata.name,
'module_name': plugin.name,
'description': metadata.description,
'usage': metadata.usage,
'show': metadata.extra.get('show', True),
'priority': metadata.extra.get('priority', 99),
'cooldown': metadata.extra.get('cooldown')
})
else:
self.data[plugin.name] = PluginInfo(name=plugin.name, module_name=plugin.name)
matchers = plugin.matcher
for matcher in matchers:
if matcher._default_state:
matcher_info = MatcherInfo.parse_obj(matcher._default_state)
if self.data[plugin.name].matchers is not None and matcher_info.pm_name not in [m.pm_name for m in self.data[plugin.name].matchers]:
self.data[plugin.name].matchers.append(matcher_info)
self.save()
logger.success('插件管理器', '<g>初始化完成</g>')
async def get_plugin_list(self, message_type: str, session_id: int) -> List[PluginInfo]:
load_plugins = nb_plugin.get_loaded_plugins()
load_plugins = [p.name for p in load_plugins]
plugin_list = sorted(self.data.values(), key=lambda x: x.priority).copy()
plugin_list = [p for p in plugin_list if p.show and p.module_name in load_plugins]
for plugin in plugin_list:
if message_type != 'guild':
plugin_info = await PluginPermission.get_or_none(name=plugin.module_name, session_id=session_id,
session_type=message_type)
plugin.status = True if plugin_info is None else plugin_info.status
else:
plugin.status = True
if plugin.matchers:
plugin.matchers.sort(key=lambda x: x.pm_priority)
plugin.matchers = [m for m in plugin.matchers if m.pm_show and m.pm_usage]
return plugin_list
async def get_plugin_list_for_admin(self) -> List[dict]:
load_plugins = nb_plugin.get_loaded_plugins()
load_plugins = [p.name for p in load_plugins]
plugin_list = [p.dict() for p in self.data.values()]
for plugin in plugin_list:
plugin['matchers'].sort(key=lambda x: x['pm_priority'])
plugin['isLoad'] = plugin['module_name'] in load_plugins
plugin['status'] = await PluginPermission.filter(name=plugin['module_name'], status=True).exists()
plugin_list.sort(key=lambda x: (x['isLoad'], x['status'], -x['priority']), reverse=True)
return plugin_list

View File

@ -3,7 +3,7 @@ from nonebot.adapters.onebot.v11 import MessageEvent, MessageSegment
from nonebot.plugin import PluginMetadata
from LittlePaimon import DRIVER, SUPERUSERS
from LittlePaimon.database.models import GeneralSub
from LittlePaimon.database import GeneralSub
from LittlePaimon.utils import scheduler, logger
from LittlePaimon.utils.message import CommandObjectID, CommandSwitch, CommandTime
from .generate import *

View File

@ -1,10 +1,9 @@
import jinja2
from nonebot import require
from os import getcwd
require("nonebot_plugin_htmlrender")
from nonebot_plugin_htmlrender import html_to_pic
import jinja2
from .event import *
from datetime import datetime, timedelta
from LittlePaimon.utils.brower import get_new_page
body = []
weeks = []
@ -22,10 +21,10 @@ async def generate_day_schedule(server='cn'):
d2 = (t + timedelta(days=i)).strftime("%Y-%m-%d")
""" 分割 [年|月|日]"""
date_full = str(d2).split("-")
current = 'm-events-calendar__table-header-current' if t.strftime("%d") == date_full[2] else ""
current = 'm-events-calendar__table-header-current' if t.strftime("%d") == date_full[2] else ''
date = re.search('0\d+', date_full[1]).group(0).replace('0', '') if re.search('0\d+', date_full[1]) else \
date_full[1]
date_full[1]
week = datetime(int(date_full[0]), int(date_full[1]), int(date_full[2])).isoweekday()
@ -51,4 +50,8 @@ async def generate_day_schedule(server='cn'):
content = await template.render_async(body=body, css_path=template_path, week=weeks)
return await html_to_pic(content, wait=0, viewport={"width": 600, "height": 10})
async with get_new_page(viewport={'width': 600, 'height': 10}) as page:
await page.goto(f'file://{getcwd()}')
await page.set_content(content, wait_until='networkidle')
await page.wait_for_timeout(0.2)
return await page.screenshot(full_page=True)

View File

@ -1,4 +1,4 @@
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">
<head>

View File

@ -8,10 +8,10 @@ from nonebot.params import CommandArg
from nonebot.permission import SUPERUSER
from nonebot.plugin import PluginMetadata
from LittlePaimon.config import config
from LittlePaimon.utils.message import CommandCharacter, CommandLang, MessageBuild
from LittlePaimon.utils.alias import get_match_alias
from LittlePaimon.database.models import GenshinVoice
from LittlePaimon.manager.plugin_manager import plugin_manager as pm
from LittlePaimon.database import GenshinVoice
from .handler import GuessVoice, get_character_voice, get_rank, get_voice_list
from .resources import update_voice_resources
@ -60,9 +60,9 @@ async def _(event: GroupMessageEvent, msg: Message = CommandArg(), lang=CommandL
result = await get_rank(event.group_id)
await guess_voice.finish(result)
else:
game = GuessVoice(event.group_id, pm.config.guess_voice_time, lang)
game = GuessVoice(event.group_id, config.guess_voice_time, lang)
result = await game.start()
await guess_voice.send(f'即将发送一段语音,将在{pm.config.guess_voice_time}秒后公布答案')
await guess_voice.send(f'即将发送一段语音,将在{config.guess_voice_time}秒后公布答案')
try:
await guess_voice.finish(result)
except ActionFailed:

View File

@ -1,7 +1,7 @@
import asyncio
from typing import List
from LittlePaimon.config import RESOURCE_BASE_PATH
from LittlePaimon.database.models import GenshinVoice
from LittlePaimon.database import GenshinVoice
from LittlePaimon.utils.files import load_image
from LittlePaimon.utils.message import MessageBuild
from LittlePaimon.utils.image import PMImage, font_manager as fm

View File

@ -5,7 +5,7 @@ from nonebot import get_bot, on_regex
from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message, MessageSegment
from nonebot.rule import Rule
from LittlePaimon.database.models import GenshinVoice, GuessVoiceRank
from LittlePaimon.database import GenshinVoice, GuessVoiceRank
from LittlePaimon.utils import scheduler, logger
from LittlePaimon.utils.alias import get_alias_by_name
from .draw import draw_voice_list

View File

@ -4,7 +4,7 @@ from typing import Dict, Optional
from lxml import etree
from LittlePaimon.database.models import GenshinVoice
from LittlePaimon.database import GenshinVoice
from LittlePaimon.utils import aiorequests
from LittlePaimon.utils import logger

View File

@ -14,9 +14,9 @@ from nonebot.adapters.onebot.v11 import Bot, Message, MessageEvent, PrivateMessa
from nonebot.typing import T_State
from LittlePaimon import NICKNAME, SUPERUSERS
from LittlePaimon.config import config as bot_config
from LittlePaimon.utils import scheduler, logger
from LittlePaimon.utils.message import format_message, replace_all
from LittlePaimon.manager.plugin_manager import plugin_manager as pm
from .config import config
requests_list: Dict[str, Dict[str, Dict[str, any]]] = {
@ -27,7 +27,7 @@ done: Dict[str, datetime.datetime] = {} # 防止gocq重复上报事件导致多
async def InviteRule(event: RequestEvent) -> bool:
if not pm.config.request_event:
if not bot_config.request_event:
return False
if isinstance(event, FriendRequestEvent):
return f'add_friend_{event.user_id}' not in done.keys()
@ -37,7 +37,7 @@ async def InviteRule(event: RequestEvent) -> bool:
async def IncreaseRule(event: NoticeEvent) -> bool:
if not pm.config.notice_event:
if not bot_config.notice_event:
return False
if isinstance(event, FriendAddNoticeEvent):
return f'new_friend_{event.user_id}' not in done.keys()
@ -108,7 +108,7 @@ async def _(bot: Bot, event: FriendRequestEvent):
done[f'add_friend_{event.user_id}'] = datetime.datetime.now()
user_info = await bot.get_stranger_info(user_id=event.user_id)
base_msg = f'{user_info["nickname"]}({event.user_id})请求添加好友,验证信息为"{event.comment or ""}"'
if pm.config.auto_add_friend:
if bot_config.auto_add_friend:
await asyncio.sleep(random.randint(10, 20))
await bot.send_private_msg(user_id=SUPERUSERS[0], message=f'{base_msg},已自动同意')
await event.approve(bot)
@ -125,7 +125,7 @@ async def _(bot: Bot, event: GroupRequestEvent):
user_info = await bot.get_stranger_info(user_id=event.user_id)
group_info = await bot.get_group_info(group_id=event.group_id)
base_msg = f'{user_info["nickname"]}({event.user_id})邀请{NICKNAME}加入群{group_info["group_name"]}({event.group_id})'
if pm.config.auto_add_group or event.user_id in SUPERUSERS:
if bot_config.auto_add_group or event.user_id in SUPERUSERS:
await asyncio.sleep(random.randint(10, 20))
await bot.send_private_msg(user_id=SUPERUSERS[0], message=f'{base_msg},已自动同意')
await event.approve(bot)

View File

@ -4,7 +4,7 @@ from collections import defaultdict
import pytz
from nonebot import get_bot
from LittlePaimon.database.models import AbyssInfo
from LittlePaimon.database import AbyssInfo
from LittlePaimon.utils import aiorequests
from LittlePaimon.utils.files import load_image
from LittlePaimon.config import RESOURCE_BASE_PATH

View File

@ -5,7 +5,7 @@ from LittlePaimon.config import RESOURCE_BASE_PATH
from LittlePaimon.utils.image import PMImage, font_manager as fm
from LittlePaimon.utils.files import load_image
from LittlePaimon.utils.message import MessageBuild
from LittlePaimon.database.models import AbyssInfo
from LittlePaimon.database import AbyssInfo
def datetime_to_cn(time: datetime.datetime) -> str:

View File

@ -1,7 +1,7 @@
import asyncio
from typing import List
from LittlePaimon.database.models import Character, LastQuery
from LittlePaimon.database import Character, LastQuery
from LittlePaimon.config import RESOURCE_BASE_PATH
from LittlePaimon.utils.files import load_image
from LittlePaimon.utils.alias import get_chara_icon

View File

@ -6,7 +6,7 @@ from nonebot.permission import SUPERUSER
from nonebot.adapters.onebot.v11 import GroupMessageEvent, PrivateMessageEvent
from nonebot.plugin import PluginMetadata
from LittlePaimon.database.models import MihoyoBBSSub, PrivateCookie
from LittlePaimon.database import MihoyoBBSSub, PrivateCookie
from LittlePaimon.utils import logger
from LittlePaimon.utils.message import CommandUID, CommandSwitch
from .coin_handle import mhy_bbs_coin, bbs_auto_coin

View File

@ -6,11 +6,10 @@ from collections import defaultdict
from typing import Tuple
from nonebot import get_bot
from LittlePaimon.database.models import PrivateCookie, MihoyoBBSSub, LastQuery
from LittlePaimon.utils import logger, aiorequests
from LittlePaimon.utils import scheduler
from LittlePaimon.config import config
from LittlePaimon.database import PrivateCookie, MihoyoBBSSub, LastQuery
from LittlePaimon.utils import logger, aiorequests, scheduler
from LittlePaimon.utils.api import random_text, random_hex, get_old_version_ds, get_ds
from LittlePaimon.manager.plugin_manager import plugin_manager as pm
# 米游社的API列表
bbs_Cookieurl = 'https://webapi.account.mihoyo.com/Api/cookie_accountinfo_by_loginticket?login_ticket={}'
@ -301,7 +300,7 @@ async def mhy_bbs_coin(user_id: str, uid: str) -> str:
return msg if result else f'UID{uid}{msg}'
@scheduler.scheduled_job('cron', hour=pm.config.auto_myb_hour, minute=pm.config.auto_myb_minute, misfire_grace_time=10)
@scheduler.scheduled_job('cron', hour=config.auto_myb_hour, minute=config.auto_myb_minute, misfire_grace_time=10)
async def _():
await bbs_auto_coin()
@ -310,7 +309,7 @@ async def bbs_auto_coin():
"""
指定时间执行所有米游币获取订阅任务 并将结果分群绘图发送
"""
if not pm.config.auto_myb_enable:
if not config.auto_myb_enable:
return
t = time.time()
subs = await MihoyoBBSSub.filter(sub_event='米游币自动获取').all()

View File

@ -7,10 +7,10 @@ from nonebot import get_bot
from collections import defaultdict
from typing import Tuple, Dict, Any, Optional, Union
from LittlePaimon import DRIVER
from LittlePaimon.database.models import MihoyoBBSSub, LastQuery, PrivateCookie
from LittlePaimon.config import config
from LittlePaimon.database import MihoyoBBSSub, LastQuery, PrivateCookie
from LittlePaimon.utils import logger, scheduler, aiorequests
from LittlePaimon.utils.api import get_mihoyo_private_data, get_sign_reward_list, mihoyo_sign_headers, check_retcode
from LittlePaimon.manager.plugin_manager import plugin_manager as pm
from .draw import SignResult, draw_result
SIGN_ACTION_API = 'https://api-takumi.mihoyo.com/event/bbs_sign_reward/sign'
@ -116,7 +116,7 @@ async def mhy_bbs_sign(user_id: str, uid: str) -> Tuple[SignResult, str]:
return SignResult.FAIL, f'{uid}签到失败,无法绕过验证码'
@scheduler.scheduled_job('cron', hour=pm.config.auto_sign_hour, minute=pm.config.auto_sign_minute,
@scheduler.scheduled_job('cron', hour=config.auto_sign_hour, minute=config.auto_sign_minute,
misfire_grace_time=10)
async def _():
await bbs_auto_sign()
@ -126,7 +126,7 @@ async def bbs_auto_sign():
"""
指定时间执行所有米游社原神签到任务 并将结果分群绘图发送
"""
if not pm.config.auto_sign_enable:
if not config.auto_sign_enable:
return
t = time.time() # 计时用
subs = await MihoyoBBSSub.filter(sub_event='米游社原神签到').all()

View File

@ -10,11 +10,11 @@ from nonebot.plugin import PluginMetadata
from nonebot.typing import T_State
from LittlePaimon import NICKNAME
from LittlePaimon.database.models import LastQuery, PrivateCookie, PublicCookie, Character, PlayerInfo, DailyNoteSub, MihoyoBBSSub
from LittlePaimon.config import config
from LittlePaimon.database import LastQuery, PrivateCookie, PublicCookie, Character, PlayerInfo, DailyNoteSub, MihoyoBBSSub
from LittlePaimon.utils import logger
from LittlePaimon.utils.api import get_bind_game_info, get_stoken_by_cookie
from LittlePaimon.utils.message import recall_message
from LittlePaimon.manager.plugin_manager import plugin_manager as pm
__plugin_meta__ = PluginMetadata(
name='原神绑定',
@ -102,9 +102,9 @@ async def _(event: MessageEvent, msg: Message = CommandArg()):
else:
logger.info('原神Cookie', '', {'用户': str(event.user_id)}, '绑定失败cookie已失效', False)
await ysb.finish('这个cookie无效哦请确认是否正确\n获取cookie的教程\ndocs.qq.com/doc/DQ3JLWk1vQVllZ2Z1\n', at_sender=True)
elif pm.config.CookieWeb_enable:
elif config.CookieWeb_enable:
await ysb.finish(
f'获取cookie的教程\ndocs.qq.com/doc/DQ3JLWk1vQVllZ2Z1\n获取后,使用[ysb cookie]指令绑定或前往{pm.config.CookieWeb_url}网页添加绑定',
f'获取cookie的教程\ndocs.qq.com/doc/DQ3JLWk1vQVllZ2Z1\n获取后,使用[ysb cookie]指令绑定或前往{config.CookieWeb_url}网页添加绑定',
at_sender=True)
else:
await ysb.finish('获取cookie的教程\ndocs.qq.com/doc/DQ3JLWk1vQVllZ2Z1\n获取后,使用[ysb cookie]指令绑定',

View File

@ -6,7 +6,7 @@ from nonebot.adapters.onebot.v11 import MessageEvent, Message, GroupMessageEvent
from nonebot.plugin import PluginMetadata
from nonebot.typing import T_State
from LittlePaimon.database.models import CloudGenshinSub
from LittlePaimon.database import CloudGenshinSub
from .handler import get_cloud_genshin_info

View File

@ -4,9 +4,9 @@ from collections import defaultdict
from nonebot import get_bot
from LittlePaimon.database.models import CloudGenshinSub
from LittlePaimon.config import config
from LittlePaimon.database import CloudGenshinSub
from LittlePaimon.utils import scheduler, logger
from LittlePaimon.manager.plugin_manager import plugin_manager as pm
from .api import get_Info, check_token, get_Notification
@ -25,9 +25,9 @@ async def get_cloud_genshin_info(user_id: str, uid: str):
f'畅玩卡状态: {card}'
@scheduler.scheduled_job('cron', hour=pm.config.cloud_genshin_hour, misfire_grace_time=10)
@scheduler.scheduled_job('cron', hour=config.cloud_genshin_hour, misfire_grace_time=10)
async def _():
if not pm.config.cloud_genshin_enable:
if not config.cloud_genshin_enable:
return
subs = await CloudGenshinSub.all()
if not subs:

View File

@ -5,7 +5,7 @@ from nonebot.adapters.onebot.v11 import Message, MessageEvent, GroupMessageEvent
from nonebot.plugin import PluginMetadata
from nonebot.typing import T_State
from LittlePaimon.database.models import DailyNoteSub
from LittlePaimon.database import DailyNoteSub
from LittlePaimon.utils import logger
from LittlePaimon.utils.message import CommandPlayer, CommandUID, CommandSwitch
from .handler import SubList, get_subs, handle_ssbq

View File

@ -9,10 +9,10 @@ from nonebot import get_bot
from nonebot.params import CommandArg, Depends
from nonebot.adapters.onebot.v11 import Message
from LittlePaimon.database.models import DailyNoteSub, Player
from LittlePaimon.config import config
from LittlePaimon.database import DailyNoteSub, Player
from LittlePaimon.utils import logger, scheduler
from LittlePaimon.utils.api import get_mihoyo_private_data
from LittlePaimon.manager.plugin_manager import plugin_manager as pm
from .draw import draw_daily_note_card
@ -69,12 +69,12 @@ async def handle_ssbq(player: Player):
return f'{player.uid}绘制图片失败,{e}\n'
@scheduler.scheduled_job('cron', minute=f'*/{pm.config.ssbq_check}', misfire_grace_time=10)
@scheduler.scheduled_job('cron', minute=f'*/{config.ssbq_check}', misfire_grace_time=10)
async def check_note():
if not pm.config.ssbq_enable:
if not config.ssbq_enable:
return
# 0点到6点间不做检查
if pm.config.ssbq_begin <= datetime.datetime.now().hour <= pm.config.ssbq_end:
if config.ssbq_begin <= datetime.datetime.now().hour <= config.ssbq_end:
return
t = time.time()
try:

View File

@ -4,8 +4,8 @@ from nonebot import on_command, on_regex
from nonebot.adapters.onebot.v11 import MessageEvent, Message, GroupMessageEvent
from nonebot.params import RegexDict, CommandArg
from nonebot.plugin import PluginMetadata
from LittlePaimon.config import config
from LittlePaimon.utils.tool import freq_limiter
from LittlePaimon.manager.plugin_manager import plugin_manager as pm
from .data_handle import load_user_data
from .draw import draw_gacha_img
@ -74,13 +74,18 @@ async def _(event: MessageEvent, reGroup: Dict = RegexDict()):
num = reGroup['num']
pool = reGroup['pool']
num = int(num) if num and num.isdigit() else 1
if num > pm.config.sim_gacha_max:
await sim_gacha.finish(f'单次最多只能{pm.config.sim_gacha_max}十连哦!')
if num > config.sim_gacha_max:
await sim_gacha.finish(f'单次最多只能{config.sim_gacha_max}十连哦!')
pool = pool or '角色1'
result = await draw_gacha_img(event.user_id, pool, num, nickname)
try:
result = await draw_gacha_img(event.user_id, pool, num, nickname)
except IndexError:
result = '当前没有可以抽的卡池哦~请等待卡池开放'
except Exception as e:
result = f'抽卡发生错误:{e}'
if isinstance(event, GroupMessageEvent):
freq_limiter.start(f'gacha-group{event.group_id}', pm.config.sim_gacha_cd_group)
freq_limiter.start(f'gacha-group{event.group_id}-{event.user_id}', pm.config.sim_gacha_cd_member)
freq_limiter.start(f'gacha-group{event.group_id}', config.sim_gacha_cd_group)
freq_limiter.start(f'gacha-group{event.group_id}-{event.user_id}', config.sim_gacha_cd_member)
await sim_gacha.finish(result)

View File

@ -124,14 +124,9 @@ def get_once_data(uid: int, gacha_data: dict):
user_data["抽卡数据"][f"{rank}星出货数"] += 1
if gacha_data['gacha_type'] != 200:
user_data["抽卡数据"][f"{pool_str}{rank}星下次是否为up"] = not is_up
if role['item_type'] == '角色':
item_type = '角色'
else:
item_type = '武器'
item_type = '角色' if role['item_type'] == '角色' else '武器'
if role['item_name'] not in user_data[f"{item_type}列表"]:
user_data[f"{item_type}列表"][role['item_name']] = {}
user_data[f"{item_type}列表"][role['item_name']]['数量'] = 1
user_data[f"{item_type}列表"][role['item_name']]['出货'] = []
user_data[f"{item_type}列表"][role['item_name']] = {'数量': 1, '出货': []}
if rank == 5:
user_data[f"{item_type}列表"][role['item_name']]['星级'] = '★★★★★'
user_data[f"{item_type}列表"][role['item_name']]['出货'].append(

View File

@ -8,7 +8,7 @@ from nonebot import on_notice
from nonebot.rule import Rule
from nonebot.adapters.onebot.v11 import GroupUploadNoticeEvent, NoticeEvent
from LittlePaimon import __version__
from LittlePaimon.database.models import PlayerInfo
from LittlePaimon.database import PlayerInfo
from LittlePaimon.config import GACHA_LOG
from LittlePaimon.utils.api import get_authkey_by_stoken
from LittlePaimon.utils import aiorequests, logger

View File

@ -7,7 +7,7 @@ from nonebot.plugin import PluginMetadata
from nonebot.typing import T_State
from LittlePaimon import NICKNAME
from LittlePaimon.database.models import PlayerAlias
from LittlePaimon.database import PlayerAlias
from LittlePaimon.config import YSC_TEMP_IMG_PATH
from LittlePaimon.utils import logger
from LittlePaimon.utils.message import CommandPlayer, CommandCharacter, CommandUID

View File

@ -1,5 +1,5 @@
from copy import deepcopy
from LittlePaimon.database.models import Character
from LittlePaimon.database import Character
from .damage_model import common_fix, draw_dmg_pic, udc, get_damage_multipiler, growth_reaction, intensify_reaction

View File

@ -5,7 +5,7 @@ from LittlePaimon.config.path import JSON_DATA
from LittlePaimon.utils.files import load_json
from LittlePaimon.utils.genshin import GenshinTools
from LittlePaimon.utils.image import PMImage, font_manager
from LittlePaimon.database.models import Character
from LittlePaimon.database import Character
def udc(dm: float,

View File

@ -4,7 +4,7 @@ import math
from typing import List
from LittlePaimon.config import RESOURCE_BASE_PATH
from LittlePaimon.database.models import Character, PlayerInfo, Player
from LittlePaimon.database import Character, PlayerInfo, Player
from LittlePaimon.utils.files import load_image
from LittlePaimon.utils.alias import get_chara_icon
from LittlePaimon.utils.genshin import GenshinTools

View File

@ -1,7 +1,7 @@
import math
from LittlePaimon.config import RESOURCE_BASE_PATH
from LittlePaimon.database.models import Character
from LittlePaimon.database import Character
from LittlePaimon.utils import aiorequests
from LittlePaimon.utils.files import load_image
from LittlePaimon.utils.genshin import GenshinTools

View File

@ -6,7 +6,7 @@ from LittlePaimon.utils.genshin import GenshinTools
from LittlePaimon.utils.image import PMImage, font_manager as fm
from LittlePaimon.utils.message import MessageBuild
from LittlePaimon.utils.alias import get_chara_icon
from LittlePaimon.database.models import Character
from LittlePaimon.database import Character
from .damage_cal import get_role_dmg
# weapon_url = 'https://upload-bbs.mihoyo.com/game_record/genshin/equip/{}.png'

View File

@ -2,7 +2,7 @@ import asyncio
from typing import List, Tuple, Optional
from LittlePaimon.config import RESOURCE_BASE_PATH
from LittlePaimon.database.models import PlayerInfo, Character, PlayerWorldInfo, Weapon, Player
from LittlePaimon.database import PlayerInfo, Character, PlayerWorldInfo, Weapon, Player
from LittlePaimon.utils.files import load_image
from LittlePaimon.utils.alias import get_chara_icon
from LittlePaimon.utils.image import PMImage, get_qq_avatar, font_manager as fm

View File

@ -1,4 +1,4 @@
from LittlePaimon.database.models import Player
from LittlePaimon.database import Player
from LittlePaimon.utils.api import get_mihoyo_private_data
from LittlePaimon.utils import logger
from .draw import draw_monthinfo_card

View File

@ -13,7 +13,7 @@ from LittlePaimon import NICKNAME
from LittlePaimon.utils.alias import get_match_alias
from LittlePaimon.utils.tool import freq_limiter
from LittlePaimon.utils.message import MessageBuild
from LittlePaimon.database.models import PlayerAlias
from LittlePaimon.database import PlayerAlias
from LittlePaimon.config import RESOURCE_BASE_PATH
from .draw_map import init_map, draw_map, get_full_map
from .draw_daily_material import draw_material

View File

@ -5,7 +5,7 @@ from LittlePaimon.utils import aiorequests, scheduler
from LittlePaimon.utils.files import save_json, load_json, load_image
from LittlePaimon.utils.image import PMImage, font_manager as fm
from LittlePaimon.utils.message import MessageBuild
from LittlePaimon.database.models import Character, LastQuery
from LittlePaimon.database import Character, LastQuery
week_cn = {
'monday': '周一',

View File

@ -12,9 +12,9 @@ from nonebot.params import CommandArg, ArgPlainText, Arg
from nonebot.typing import T_State
from nonebot.adapters.onebot.v11 import Bot, Message, MessageEvent, GroupMessageEvent, ActionFailed
from nonebot.adapters.onebot.v11.helpers import convert_chinese_to_bool
from LittlePaimon import NICKNAME, DRIVER, SUPERUSERS, __version__
from LittlePaimon import NICKNAME, DRIVER, __version__
from LittlePaimon.utils.files import save_json, load_json
from .handler import check_update, update
from LittlePaimon.utils.update import check_update, update
__plugin_meta__ = PluginMetadata(
name='小派蒙管理',

View File

@ -5,7 +5,7 @@ from nonebot.adapters.onebot.v11 import MessageEvent, MessageSegment
from nonebot.plugin import PluginMetadata
from LittlePaimon import DRIVER
from LittlePaimon.database.models import GeneralSub
from LittlePaimon.database import GeneralSub
from LittlePaimon.utils import scheduler, logger
from LittlePaimon.utils.message import CommandObjectID, CommandSwitch, CommandTime

View File

@ -1,25 +1,18 @@
import asyncio
import datetime
from nonebot import on_regex, on_command
from nonebot.matcher import Matcher
from nonebot.exception import IgnoredException
from nonebot.params import RegexDict, CommandArg
from nonebot.permission import SUPERUSER
from nonebot.message import run_preprocessor
from nonebot.adapters.onebot.v11 import Message, GroupMessageEvent, PrivateMessageEvent, MessageEvent
from nonebot.typing import T_State
from LittlePaimon import SUPERUSERS, DRIVER
from LittlePaimon import SUPERUSERS
from LittlePaimon.config import ConfigManager, PluginManager
from LittlePaimon.utils import logger
from LittlePaimon.utils.message import CommandObjectID
from LittlePaimon.database.models import PluginPermission, PluginStatistics
from .manager import PluginManager, hidden_plugins
from .model import MatcherInfo
from LittlePaimon.database import PluginPermission
from .draw_help import draw_help
plugin_manager = PluginManager()
manage_cmd = on_regex(r'^pm (?P<func>ban|unban) (?P<plugin>([\w ]*)|all|全部) ?(-g (?P<group>[\d ]*) ?)?(-u (?P<user>[\d ]*) ?)?(?P<reserve>-r)?', priority=1)
help_cmd = on_command('help', aliases={'帮助', '菜单', 'pm help'}, priority=1)
set_config_cmd = on_command('pm set', priority=1, permission=SUPERUSER)
@ -36,9 +29,9 @@ async def _(event: GroupMessageEvent, state: T_State, match: dict = RegexDict(),
state['plugin'] = []
state['plugin_no_exist'] = []
for plugin in match['plugin'].strip().split(' '):
if plugin in plugin_manager.data.keys() or plugin in ['all', '全部']:
if plugin in PluginManager.plugins.keys() or plugin in ['all', '全部']:
state['plugin'].append(plugin)
elif module_name := list(filter(lambda x: plugin_manager.data[x].name == plugin, plugin_manager.data.keys())):
elif module_name := list(filter(lambda x: PluginManager.plugins[x].name == plugin, PluginManager.plugins.keys())):
state['plugin'].append(module_name[0])
else:
state['plugin_no_exist'].append(plugin)
@ -58,9 +51,9 @@ async def _(event: PrivateMessageEvent, state: T_State, match: dict = RegexDict(
state['plugin'] = []
state['plugin_no_exist'] = []
for plugin in match['plugin'].strip().split(' '):
if plugin in plugin_manager.data.keys() or plugin in ['all', '全部']:
if plugin in PluginManager.plugins.keys() or plugin in ['all', '全部']:
state['plugin'].append(plugin)
elif module_name := list(filter(lambda x: plugin_manager.data[x].name == plugin, plugin_manager.data.keys())):
elif module_name := list(filter(lambda x: PluginManager.plugins[x].name == plugin, PluginManager.plugins.keys())):
state['plugin'].append(module_name[0])
else:
state['plugin_no_exist'].append(plugin)
@ -114,7 +107,7 @@ async def _(event: MessageEvent, session_id: int = CommandObjectID()):
if session_id in cache_help:
await help_cmd.finish(cache_help[session_id])
else:
plugin_list = await plugin_manager.get_plugin_list(event.message_type, event.user_id if isinstance(event, PrivateMessageEvent) else event.group_id if isinstance(event, GroupMessageEvent) else event.guild_id)
plugin_list = await PluginManager.get_plugin_list(event.message_type, event.user_id if isinstance(event, PrivateMessageEvent) else event.group_id if isinstance(event, GroupMessageEvent) else event.guild_id)
img = await draw_help(plugin_list)
cache_help[session_id] = img
await help_cmd.finish(img)
@ -126,49 +119,6 @@ async def _(event: MessageEvent, msg: Message = CommandArg()):
if len(msg) != 2:
await set_config_cmd.finish('参数错误用法pm set 配置名 配置值')
else:
result = plugin_manager.set_config(msg[0], msg[1])
result = ConfigManager.set_config(msg[0], msg[1])
await set_config_cmd.finish(result)
@DRIVER.on_bot_connect
async def _():
await plugin_manager.init_plugins()
@run_preprocessor
async def _(event: MessageEvent, matcher: Matcher):
if event.user_id in SUPERUSERS:
return
if not matcher.plugin_name or matcher.plugin_name in hidden_plugins:
return
if isinstance(event, PrivateMessageEvent):
session_id = event.user_id
session_type = 'user'
elif isinstance(event, GroupMessageEvent):
session_id = event.group_id
session_type = 'group'
else:
return
# 权限检查
perm = await PluginPermission.get_or_none(name=matcher.plugin_name, session_id=session_id, session_type=session_type)
if not perm:
return
if not perm.status:
raise IgnoredException('插件使用权限已禁用')
if isinstance(event, GroupMessageEvent) and event.user_id in perm.ban:
raise IgnoredException('用户被禁止使用该插件')
# 命令调用统计
if matcher.plugin_name in plugin_manager.data and 'pm_name' in matcher.state:
if matcher_info := list(filter(lambda x: x.pm_name == matcher.state['pm_name'], plugin_manager.data[matcher.plugin_name].matchers)):
matcher_info = matcher_info[0]
await PluginStatistics.create(plugin_name=matcher.plugin_name,
matcher_name=matcher_info.pm_name,
matcher_usage=matcher_info.pm_usage,
group_id=event.group_id if isinstance(event, GroupMessageEvent) else None,
user_id=event.user_id,
message_type=session_type,
time=datetime.datetime.now())

View File

@ -6,7 +6,7 @@ from LittlePaimon.config import RESOURCE_BASE_PATH
from LittlePaimon.utils.image import PMImage, font_manager as fm
from LittlePaimon.utils.files import load_image
from LittlePaimon.utils.message import MessageBuild
from .model import PluginInfo
from LittlePaimon.config import PluginInfo
async def draw_plugin_card(plugin: PluginInfo):

View File

@ -4,14 +4,12 @@ from nonebot.rule import Rule
from nonebot.adapters.onebot.v11 import Message, MessageEvent, MessageSegment
from nonebot.plugin import PluginMetadata
from LittlePaimon import SUPERUSERS
from LittlePaimon.manager.plugin_manager import plugin_manager as pm
from LittlePaimon.config import config
from LittlePaimon.utils.brower import screenshot
async def permission_check(event: MessageEvent) -> bool:
if pm.config.screenshot_enable:
return True
return event.user_id not in SUPERUSERS
return True if config.screenshot_enable else event.user_id not in SUPERUSERS
__plugin_meta__ = PluginMetadata(
@ -42,5 +40,3 @@ async def _(event: MessageEvent, msg: Message = CommandArg()):
await screenshot_cmd.send(MessageSegment.image(img))
except Exception:
await screenshot_cmd.send('网页截图失败,无法访问该网页,请稍候再试')

View File

@ -1,6 +1,4 @@
from nonebot import require
from .files import *
from .requests import *
from .requests import aiorequests
from .logger import logger
require('nonebot_plugin_apscheduler')
from nonebot_plugin_apscheduler import scheduler
from .scheduler import scheduler

View File

@ -10,7 +10,7 @@ from LittlePaimon.utils import logger
from nonebot import logger as nb_logger
from tortoise.queryset import Q
from LittlePaimon.database.models import PublicCookie, PrivateCookie, CookieCache
from LittlePaimon.database import PublicCookie, PrivateCookie, CookieCache
from .requests import aiorequests
# MIHOYO_API = 'https://api-takumi-record.mihoyo.com/'

View File

@ -1,6 +1,8 @@
from typing import Optional, Literal, Tuple, Union, List, AsyncGenerator
from playwright.async_api import Page, Browser, Playwright, async_playwright
from typing import Optional, Literal, Tuple, Union, List, AsyncGenerator, AsyncIterator
from playwright.async_api import Page, Browser, Playwright, async_playwright, Error
from contextlib import asynccontextmanager
from contextlib import suppress
from LittlePaimon import DRIVER
from LittlePaimon.utils import logger
@ -8,24 +10,47 @@ _playwright: Optional[Playwright] = None
_browser: Optional[Browser] = None
def get_brower() -> Browser:
assert _browser
async def init(**kwargs) -> Browser:
global _browser
global _playwright
try:
_playwright = await async_playwright().start()
_browser = await launch_browser(**kwargs)
except NotImplementedError:
logger.warning('Playwright', '初始化失败请关闭FASTAPI_RELOAD')
except Error:
await install_browser()
_browser = await launch_browser(**kwargs)
return _browser
async def launch_browser(**kwargs) -> Browser:
assert _playwright is not None, "Playwright is not initialized"
return await _playwright.chromium.launch(**kwargs)
async def get_browser(**kwargs) -> Browser:
return _browser or await init(**kwargs)
async def install_browser():
import os
import sys
from playwright.__main__ import main
logger.info('Playwright', '正在安装 chromium')
sys.argv = ["", "install", "chromium"]
with suppress(SystemExit):
logger.info('Playwright', '正在安装依赖')
os.system("playwright install-deps")
main()
@DRIVER.on_startup
async def start_browser():
global _playwright
global _browser
try:
_playwright = await async_playwright().start()
_browser = await _playwright.chromium.launch(headless=True)
except NotImplementedError:
logger.warning('Playwright', '初始化失败请关闭FASTAPI_RELOAD')
except Exception as e:
logger.warning('Playwright', f'初始化失败,错误信息:{e}')
if _browser:
await _browser.close()
async def start_browser(**kwargs):
await get_browser(**kwargs)
logger.info('Playwright', '浏览器初始化成功')
@DRIVER.on_shutdown
@ -33,7 +58,7 @@ async def shutdown_browser():
if _browser:
await _browser.close()
if _playwright:
await _playwright.stop()
await _playwright.stop() # type: ignore
@asynccontextmanager
@ -57,7 +82,7 @@ async def screenshot(url: str,
if not url.startswith(('https://', 'http://')):
url = f'https://{url}'
viewport_size = {'width': viewport_size[0], 'height': viewport_size[1]}
brower = get_brower()
brower = await get_browser()
page = await brower.new_page(
viewport=viewport_size,
**kwargs)
@ -77,3 +102,13 @@ async def screenshot(url: str,
finally:
if page:
await page.close()
@asynccontextmanager
async def get_new_page(**kwargs) -> AsyncIterator[Page]:
browser = await get_browser()
page = await browser.new_page(**kwargs)
try:
yield page
finally:
await page.close()

View File

@ -40,6 +40,8 @@ async def load_image(
img = Image.open(path)
elif path.name.startswith(('UI_', 'Skill_')):
img = await aiorequests.download_icon(path.name, headers=headers, save_path=path, follow_redirects=True)
if img is None:
return Image.new('RGBA', size=size, color=(0, 0, 0, 0))
else:
raise FileNotFoundError(f'{path} not found')
cache_image[str(path)] = img

View File

@ -4,16 +4,15 @@ from typing import Optional, List, Union, Tuple
import pytz
from LittlePaimon.config import JSON_DATA
from LittlePaimon.database.models import PlayerInfo, Character, LastQuery, PrivateCookie, AbyssInfo
from LittlePaimon.database.models import Artifact, CharacterProperty, Artifacts, Talents, Talent
from LittlePaimon.config import JSON_DATA, config
from LittlePaimon.database import PlayerInfo, Character, LastQuery, PrivateCookie, AbyssInfo
from LittlePaimon.database import Artifact, CharacterProperty, Artifacts, Talents, Talent
from LittlePaimon.utils import logger
from LittlePaimon.utils.files import load_json
from LittlePaimon.utils.api import get_enka_data, get_mihoyo_public_data, get_mihoyo_private_data
from LittlePaimon.utils.typing import DataSourceType
from LittlePaimon.utils.alias import get_name_by_id
from LittlePaimon.utils.typing import CHARACTERS
from LittlePaimon.manager.plugin_manager import plugin_manager as pm
ra_score = load_json(JSON_DATA / 'score.json')
talent_map = load_json(JSON_DATA / 'role_skill.json')
@ -169,7 +168,7 @@ class GenshinInfoManager:
if data_source == 'enka':
"""如果角色不存在或者角色的更新时间在6小时前则更新角色信息"""
character = await Character.get_or_none(**query, data_source='enka')
if not character or character.update_time < (datetime.datetime.now() - datetime.timedelta(hours=pm.config.ysd_auto_update)).replace(
if not character or character.update_time < (datetime.datetime.now() - datetime.timedelta(hours=config.ysd_auto_update)).replace(
tzinfo=pytz.timezone('UTC')):
await self.update_from_enka()
if character := await Character.get_or_none(**query, data_source='enka'):
@ -193,7 +192,7 @@ class GenshinInfoManager:
await self.set_last_query()
player_info = await PlayerInfo.get_or_none(user_id=self.user_id, uid=self.uid)
if player_info is None or player_info.update_time is None or player_info.update_time < (
datetime.datetime.now() - datetime.timedelta(hours=pm.config.ysa_auto_update)).replace(
datetime.datetime.now() - datetime.timedelta(hours=config.ysa_auto_update)).replace(
tzinfo=pytz.timezone('UTC')):
result = await self.update_from_mihoyo()
if result != '更新成功':
@ -210,7 +209,7 @@ class GenshinInfoManager:
await self.set_last_query()
player_info = await PlayerInfo.get_or_none(user_id=self.user_id, uid=self.uid)
if player_info is None or player_info.update_time is None or player_info.update_time < (
datetime.datetime.now() - datetime.timedelta(hours=pm.config.ys_auto_update)).replace(
datetime.datetime.now() - datetime.timedelta(hours=config.ys_auto_update)).replace(
tzinfo=pytz.timezone('UTC')):
result = await self.update_from_mihoyo()
if result != '更新成功':

View File

@ -13,7 +13,7 @@ from nonebot.params import CommandArg, Depends
from nonebot.typing import T_State
from LittlePaimon import NICKNAME
from LittlePaimon.database.models import LastQuery, PrivateCookie, Player, PlayerAlias
from LittlePaimon.database import LastQuery, PrivateCookie, Player, PlayerAlias
from LittlePaimon.utils import aiorequests, load_image
from LittlePaimon.utils.alias import get_match_alias
from LittlePaimon.utils.image import PMImage

View File

@ -2,7 +2,7 @@ import sqlite3
from pathlib import Path
import datetime
from LittlePaimon.utils import logger
from LittlePaimon.database.models import PublicCookie, PrivateCookie, LastQuery, DailyNoteSub, MihoyoBBSSub
from LittlePaimon.database import PublicCookie, PrivateCookie, LastQuery, DailyNoteSub, MihoyoBBSSub
async def migrate_database():

View File

@ -8,6 +8,7 @@ import httpx
from PIL import Image
import tqdm.asyncio
from LittlePaimon.utils import logger
class aiorequests:
@staticmethod
@ -169,4 +170,5 @@ class aiorequests:
for url in urls:
with contextlib.suppress(Exception):
return await aiorequests.get_img(url=url, headers=headers, save_path=save_path, **kwargs)
raise FileNotFoundError(f'{name}下载失败,请检查网络')
logger.warning('资源检查', f'{name}下载失败,请检查网络')
return None

View File

@ -0,0 +1,48 @@
import logging
from nonebot import get_driver
from nonebot.log import LoguruHandler, logger
from apscheduler.schedulers.asyncio import AsyncIOScheduler
from pydantic import Field, BaseSettings
class Config(BaseSettings):
apscheduler_autostart: bool = True
apscheduler_log_level: int = 30
apscheduler_config: dict = Field(
default_factory=lambda: {"apscheduler.timezone": "Asia/Shanghai"}
)
class Config:
extra = "ignore"
driver = get_driver()
global_config = driver.config
plugin_config = Config(**global_config.dict())
scheduler = AsyncIOScheduler()
scheduler.configure(plugin_config.apscheduler_config)
async def _start_scheduler():
if not scheduler.running:
scheduler.start()
logger.opt(colors=True).info("<y>Scheduler Started</y>")
async def _shutdown_scheduler():
if scheduler.running:
scheduler.shutdown()
logger.opt(colors=True).info("<y>Scheduler Shutdown</y>")
if plugin_config.apscheduler_autostart:
driver.on_startup(_start_scheduler)
driver.on_shutdown(_shutdown_scheduler)
aps_logger = logging.getLogger("apscheduler")
aps_logger.setLevel(plugin_config.apscheduler_log_level)
aps_logger.handlers.clear()
aps_logger.addHandler(LoguruHandler())

View File

@ -21,17 +21,17 @@ CN_NUMBER = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九
CHARACTERS = ['神里绫华', '', '丽莎', '芭芭拉', '凯亚', '迪卢克', '雷泽', '安柏', '温迪', '香菱', '北斗', '行秋', '', '凝光', '可莉', '钟离',
'菲谢尔', '班尼特', '达达利亚', '诺艾尔', '七七', '重云', '甘雨', '阿贝多', '迪奥娜', '莫娜', '刻晴', '砂糖', '辛焱', '罗莎莉亚', '胡桃',
'枫原万叶', '烟绯', '宵宫', '托马', '优菈', '雷电将军', '早柚', '珊瑚宫心海', '五郎', '九条裟罗', '荒泷一斗', '八重神子', '夜兰', '埃洛伊',
'申鹤', '云堇', '久岐忍', '神里绫人', '鹿野院平藏', '提纳里', '柯莱', '多莉', '赛诺', '坎蒂丝', '妮露']
'申鹤', '云堇', '久岐忍', '神里绫人', '鹿野院平藏', '提纳里', '柯莱', '多莉', '赛诺', '坎蒂丝', '妮露', '纳西妲', '莱依拉']
"""全角色"""
MALE_CHARACTERS = ['凯亚', '迪卢克', '钟离', '达达利亚', '托马', '荒泷一斗', '神里绫人']
"""成男角色"""
FEMALE_CHARACTERS = ['', '丽莎', '北斗', '凝光', '罗莎莉亚', '优菈', '雷电将军', '九条裟罗', '八重神子', '夜兰', '申鹤', '坎蒂丝']
"""成女角色"""
GIRL_CHARACTERS = ['神里绫华', '芭芭拉', '安柏', '香菱', '菲谢尔', '诺艾尔', '甘雨', '莫娜', '刻晴', '砂糖', '辛焱', '胡桃', '烟绯', '宵宫', '珊瑚宫心海', '埃洛伊', '云堇', '久岐忍', '柯莱', '妮露']
GIRL_CHARACTERS = ['神里绫华', '芭芭拉', '安柏', '香菱', '菲谢尔', '诺艾尔', '甘雨', '莫娜', '刻晴', '砂糖', '辛焱', '胡桃', '烟绯', '宵宫', '珊瑚宫心海', '埃洛伊', '云堇', '久岐忍', '柯莱', '妮露', '莱依拉']
"""少女角色"""
BOY_CHARACTERS = ['雷泽', '温迪', '行秋', '', '班尼特', '重云', '阿贝多', '枫原万叶', '五郎', '鹿野院平藏', '提纳里', '赛诺']
"""少男角色"""
LOLI_CHARACTERS = ['七七', '可莉', '迪奥娜', '早柚', '多莉']
LOLI_CHARACTERS = ['七七', '可莉', '迪奥娜', '早柚', '多莉', '纳西妲']
"""萝莉"""
CHARA_RE = '|'.join(CHARACTERS)

View File

@ -1,16 +1,16 @@
import nonebot
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from LittlePaimon import DRIVER
from LittlePaimon.utils import logger
from LittlePaimon.config import config
from .pages import admin_app, login_page, bind_cookie_page, blank_page
from .api import BaseApiRouter
from LittlePaimon.manager.plugin_manager import plugin_manager
app: FastAPI = nonebot.get_app()
app.include_router(BaseApiRouter)
logger.info('Web UI', '<g>启用成功</g>,默认地址为https://127.0.0.1:13579/LittlePaimon/login')
logger.info('Web UI', f'<g>启用成功</g>,默认地址为<m>http://127.0.0.1:{DRIVER.config.port}/LittlePaimon/login</m>')
requestAdaptor = '''
requestAdaptor(api) {
@ -33,7 +33,7 @@ responseAdaptor(api, payload, query, request, response) {
@app.get('/LittlePaimon/admin', response_class=HTMLResponse)
async def admin():
if plugin_manager.config.admin_enable:
if config.admin_enable:
return admin_app.render(site_title='LittlePaimon 后台管理', theme='antd', requestAdaptor=requestAdaptor,
responseAdaptor=responseAdaptor)
else:
@ -42,7 +42,7 @@ async def admin():
@app.get('/LittlePaimon/login', response_class=HTMLResponse)
async def login():
if plugin_manager.config.admin_enable:
if config.admin_enable:
return login_page.render(site_title='登录 | LittlePaimon 后台管理', theme='antd')
else:
return blank_page.render(site_title='LittlePaimon')
@ -50,7 +50,7 @@ async def login():
@app.get('/LittlePaimon/cookie', response_class=HTMLResponse)
async def bind_cookie():
if plugin_manager.config.CookieWeb_enable:
if config.CookieWeb_enable:
return bind_cookie_page.render(site_title='绑定Cookie | LittlePaimon')
else:
return blank_page.render(site_title='LittlePaimon')

View File

@ -9,7 +9,7 @@ from fastapi import APIRouter
from nonebot import get_bot
from nonebot.adapters.onebot.v11 import Bot
from LittlePaimon import SUPERUSERS
from LittlePaimon.manager.bot_manager.handler import update
from LittlePaimon.utils.update import update
from LittlePaimon.utils.files import save_json
from LittlePaimon.utils.tool import cache
from .utils import authentication

View File

@ -1,6 +1,6 @@
import datetime
from typing import Optional
from LittlePaimon.database.models import PublicCookie, PrivateCookie, LastQuery
from LittlePaimon.database import PublicCookie, PrivateCookie, LastQuery
from fastapi.responses import JSONResponse
from fastapi import APIRouter
from pydantic import BaseModel

View File

@ -2,10 +2,10 @@ from fastapi import APIRouter
from fastapi.responses import JSONResponse
from pydantic import BaseModel
from LittlePaimon import SUPERUSERS
from LittlePaimon.manager.plugin_manager import plugin_manager
from LittlePaimon.config import config
from .utils import create_token
PASSWORD = plugin_manager.config.admin_password
PASSWORD = config.admin_password
class UserModel(BaseModel):

View File

@ -4,9 +4,12 @@ from pathlib import Path
from fastapi.responses import JSONResponse
from fastapi import APIRouter
from LittlePaimon.database.models import PluginPermission
from LittlePaimon.manager.plugin_manager import plugin_manager, cache_help
from LittlePaimon.manager.plugin_manager.model import PluginInfo, Config
from LittlePaimon.config import ConfigManager, ConfigModel, PluginManager, PluginInfo
from LittlePaimon.database import PluginPermission
try:
from LittlePaimon.plugins.plugin_manager import cache_help
except Exception:
cache_help = None
from .utils import authentication
@ -15,7 +18,7 @@ route = APIRouter()
@route.get('/get_plugins', response_class=JSONResponse, dependencies=[authentication()])
async def get_plugins():
plugins = await plugin_manager.get_plugin_list_for_admin()
plugins = await PluginManager.get_plugin_list_for_admin()
return {
'status': 0,
'msg': 'ok',
@ -30,7 +33,8 @@ async def get_plugins():
async def set_plugin_status(data: dict):
module_name = data.get('plugin')
status = data.get('status')
cache_help.clear()
if cache_help:
cache_help.clear()
await PluginPermission.filter(name=module_name).update(status=status)
return {'status': 0, 'msg': f'成功设置{module_name}插件状态为{status}'}
@ -74,7 +78,8 @@ async def set_plugin_bans(data: dict):
status=False)
else:
await PluginPermission.filter(name=name, session_type='user', session_id=int(ban)).update(status=False)
cache_help.clear()
if cache_help:
cache_help.clear()
return {
'status': 0,
'msg': '插件权限设置成功'
@ -83,9 +88,10 @@ async def set_plugin_bans(data: dict):
@route.post('/set_plugin_detail', response_class=JSONResponse, dependencies=[authentication()])
async def set_plugin_detail(plugin_info: PluginInfo):
plugin_manager.data[plugin_info.module_name] = plugin_info
plugin_manager.save()
cache_help.clear()
PluginManager.plugins[plugin_info.module_name] = plugin_info
PluginManager.save()
if cache_help:
cache_help.clear()
return {
'status': 0,
'msg': '插件信息设置成功'
@ -94,7 +100,7 @@ async def set_plugin_detail(plugin_info: PluginInfo):
@route.get('/get_config', response_class=JSONResponse, dependencies=[authentication()])
async def get_config():
config = plugin_manager.config.dict(by_alias=True)
config = ConfigManager.config.dict(by_alias=True)
config['米游社签到开始时间'] = datetime.datetime(1970, 1, 1, hour=config['米游社签到开始时间(小时)'], minute=config['米游社签到开始时间(分钟)']).strftime('%H:%M')
config['米游币开始执行时间'] = datetime.datetime(1970, 1, 1, hour=config['米游币开始执行时间(小时)'], minute=config['米游币开始执行时间(分钟)']).strftime('%H:%M')
config['实时便签停止检查时间段'] = (f'0{config["实时便签停止检查开始时间"]}' if config['实时便签停止检查开始时间'] < 10 else str(config['实时便签停止检查开始时间'])) + \
@ -123,10 +129,10 @@ async def set_config(data: dict):
data['实时便签停止检查结束时间'] = int(temp_time_split[1][:2])
if '云原神签到开始时间' in data:
data['云原神签到时间(小时)'] = int(data['云原神签到开始时间'])
config = plugin_manager.config.dict(by_alias=True)
config = ConfigManager.config.dict(by_alias=True)
config.update(**data)
plugin_manager.config = Config.parse_obj(config)
plugin_manager.save()
ConfigManager.config = ConfigModel.parse_obj(config)
PluginManager.save()
return {
'status': 0,
'msg': '保存成功'

View File

@ -4,9 +4,9 @@ from typing import Optional
from fastapi import Header, HTTPException, Depends
from jose import jwt
from LittlePaimon import SUPERUSERS
from LittlePaimon.manager.plugin_manager import plugin_manager
from LittlePaimon.config import config
SECRET_KEY = plugin_manager.config.secret_key
SECRET_KEY = config.secret_key
ALGORITHM = 'HS256'
TOKEN_EXPIRE_MINUTES = 30

View File

@ -1,4 +1,5 @@
from amis import Form, Transfer, ActionType, Dialog, InputSubForm, DisplayModeEnum, InputText, Textarea, Switch, InputNumber, Alert, Card, Tpl, CardsCRUD, Static, PageSchema, Page
from amis import Form, Transfer, ActionType, Dialog, InputSubForm, DisplayModeEnum, InputText, Textarea, Switch, \
InputNumber, Alert, Card, Tpl, CardsCRUD, Static, PageSchema, Page
# -------------插件使用权限设置------------------
ban_form = Form(title='',
@ -45,7 +46,7 @@ command_form = InputSubForm(name='matchers',
InputText(label='命令用法', name='pm_usage', value='${pm_usage}',
description='命令的使用方法,建议不要太长'),
Textarea(label='命令详细描述', name='pm_description', value='${pm_description}',
description='命令的详细描述,可以用\\n强制换行',showCounter=False),
description='命令的详细描述,可以用\\n强制换行', showCounter=False),
Switch(label='是否展示', name='pm_show', value='${pm_show}',
description='是否在帮助图中展示该命令'),
InputNumber(label='展示优先级', name='pm_priority', value='${pm_priority}',
@ -63,9 +64,9 @@ detail_form = Form(title='',
description='插件显示的名称,建议不要过长'),
Static(label='插件模块名', name='module_name', value='${module_name}'),
Textarea(label='插件描述', name='description', value='${description}', clearable=True,
description='仅用于在本管理页面中显示,不会在帮助图中显示',showCounter=False),
Textarea(label='插件使用说明', name='usage', value='${detail}', clearable=True,
description='会在该插件没有具体命令的使用说明时,显示在帮助图中',showCounter=False),
description='仅用于在本管理页面中显示,不会在帮助图中显示', showCounter=False),
Textarea(label='插件使用说明', name='usage', value='${usage}', clearable=True,
description='会在该插件没有具体命令的使用说明时,显示在帮助图中', showCounter=False),
Switch(label='是否展示', name='show', value='${show}',
description='是否在帮助图中展示该插件'),
InputNumber(label='展示优先级', name='priority', value='${priority}',

753
poetry.lock generated
View File

@ -1,16 +1,3 @@
[[package]]
name = "aiofiles"
version = "0.8.0"
description = "File support for asyncio."
category = "main"
optional = false
python-versions = ">=3.6,<4.0"
[package.source]
type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "aiosqlite"
version = "0.17.0"
@ -66,37 +53,6 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "apscheduler"
version = "3.9.1"
description = "In-process task scheduler with Cron-like capabilities"
category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
[package.dependencies]
pytz = "*"
six = ">=1.4.0"
tzlocal = ">=2.0,<3.0.0 || >=4.0.0"
[package.extras]
asyncio = ["trollius"]
doc = ["sphinx", "sphinx-rtd-theme"]
gevent = ["gevent"]
mongodb = ["pymongo (>=3.0)"]
redis = ["redis (>=3.0)"]
rethinkdb = ["rethinkdb (>=2.4.0)"]
sqlalchemy = ["sqlalchemy (>=0.8)"]
testing = ["pytest", "pytest-cov", "pytest-tornado5", "mock", "pytest-asyncio (<0.6)", "pytest-asyncio"]
tornado = ["tornado (>=4.3)"]
twisted = ["twisted"]
zookeeper = ["kazoo"]
[package.source]
type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "arrow"
version = "1.2.3"
@ -113,22 +69,6 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "backports.zoneinfo"
version = "0.2.1"
description = "Backport of the standard library zoneinfo module"
category = "main"
optional = false
python-versions = ">=3.6"
[package.extras]
tzdata = ["tzdata"]
[package.source]
type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "beautifulsoup4"
version = "4.11.1"
@ -238,7 +178,7 @@ reference = "tsinghua"
[[package]]
name = "contourpy"
version = "1.0.5"
version = "1.0.6"
description = "Python library for calculating contours of 2D quadrilateral grids"
category = "main"
optional = false
@ -249,7 +189,7 @@ numpy = ">=1.16"
[package.extras]
bokeh = ["bokeh", "selenium"]
docs = ["docutils (<0.18)", "sphinx", "sphinx-rtd-theme"]
docs = ["docutils (<0.18)", "sphinx (<=5.2.0)", "sphinx-rtd-theme"]
test = ["pytest", "matplotlib", "pillow", "flake8", "isort"]
test-minimal = ["pytest"]
test-no-codebase = ["pytest", "matplotlib", "pillow"]
@ -410,22 +350,6 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "greenlet"
version = "1.1.3"
description = "Lightweight in-process concurrent programming"
category = "main"
optional = false
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*"
[package.extras]
docs = ["sphinx"]
[package.source]
type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "h11"
version = "0.12.0"
@ -516,27 +440,6 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[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://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "iso8601"
version = "1.1.0"
@ -664,25 +567,6 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[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://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "markupsafe"
version = "2.1.1"
@ -792,46 +676,6 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "nonebot-plugin-apscheduler"
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://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "nonebot-plugin-htmlrender"
version = "0.1.1"
description = "通过浏览器渲染图片"
category = "main"
optional = false
python-versions = ">=3.7.3,<4.0.0"
[package.dependencies]
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://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "nonebot2"
version = "2.0.0rc1"
@ -893,7 +737,7 @@ reference = "tsinghua"
[[package]]
name = "pillow"
version = "9.2.0"
version = "9.3.0"
description = "Python Imaging Library (Fork)"
category = "main"
optional = false
@ -908,24 +752,6 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "playwright"
version = "1.27.1"
description = "A high-level API to automate web browsers"
category = "main"
optional = false
python-versions = ">=3.7"
[package.dependencies]
greenlet = "1.1.3"
pyee = "8.1.0"
typing-extensions = {version = "*", markers = "python_version <= \"3.8\""}
[package.source]
type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "poyo"
version = "0.5.0"
@ -1005,19 +831,6 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "pyee"
version = "8.1.0"
description = "A port of node.js's EventEmitter to python."
category = "main"
optional = false
python-versions = "*"
[package.source]
type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "pyfiglet"
version = "0.8.post1"
@ -1031,22 +844,6 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "pygments"
version = "2.13.0"
description = "Pygments is a syntax highlighting package written in Python."
category = "main"
optional = false
python-versions = ">=3.6"
[package.extras]
plugins = ["importlib-metadata"]
[package.source]
type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "pygtrie"
version = "2.5.0"
@ -1060,22 +857,6 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "pymdown-extensions"
version = "9.7"
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://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "pyparsing"
version = "3.0.9"
@ -1173,22 +954,6 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[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://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "python-slugify"
version = "6.1.2"
@ -1210,7 +975,7 @@ reference = "tsinghua"
[[package]]
name = "pytz"
version = "2022.5"
version = "2022.6"
description = "World timezone definitions, modern and historical"
category = "main"
optional = false
@ -1221,23 +986,6 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "pytz-deprecation-shim"
version = "0.1.0.post0"
description = "Shims to make deprecation of pytz easier"
category = "main"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7"
[package.dependencies]
"backports.zoneinfo" = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.9\""}
tzdata = {version = "*", markers = "python_version >= \"3.6\""}
[package.source]
type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "pyyaml"
version = "6.0"
@ -1344,7 +1092,7 @@ reference = "tsinghua"
[[package]]
name = "scikit-learn"
version = "1.1.2"
version = "1.1.3"
description = "A set of python modules for machine learning and data mining"
category = "main"
optional = false
@ -1614,41 +1362,6 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "tzdata"
version = "2022.5"
description = "Provider of IANA time zone data"
category = "main"
optional = false
python-versions = ">=2"
[package.source]
type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "tzlocal"
version = "4.2"
description = "tzinfo object for the local timezone"
category = "main"
optional = false
python-versions = ">=3.6"
[package.dependencies]
"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""}
pytz-deprecation-shim = "*"
tzdata = {version = "*", markers = "platform_system == \"Windows\""}
[package.extras]
devenv = ["black", "pyroma", "pytest-cov", "zest.releaser"]
test = ["pytest-mock (>=3.3)", "pytest (>=4.3)"]
[package.source]
type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "ujson"
version = "5.5.0"
@ -1800,33 +1513,12 @@ type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[[package]]
name = "zipp"
version = "3.10.0"
description = "Backport of pathlib-compatible object wrapper for zip files"
category = "main"
optional = false
python-versions = ">=3.7"
[package.extras]
docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "jaraco.tidelift (>=1.4)"]
testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "jaraco.functools", "more-itertools", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"]
[package.source]
type = "legacy"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
reference = "tsinghua"
[metadata]
lock-version = "1.1"
python-versions = "^3.8"
content-hash = "9f8c7514fedd7319cbc803863979f19451b88568872f01477926d4cecb9e2b66"
content-hash = "1a0dec40bbd207a55b594e3b6ea48349f0a1bb1bb08567b98807935bc4a2104d"
[metadata.files]
aiofiles = [
{file = "aiofiles-0.8.0-py3-none-any.whl", hash = "sha256:7a973fc22b29e9962d0897805ace5856e6a566ab1f0c8e5c91ff6c866519c937"},
{file = "aiofiles-0.8.0.tar.gz", hash = "sha256:8334f23235248a3b2e83b2c3a78a22674f39969b96397126cc93664d9a901e59"},
]
aiosqlite = [
{file = "aiosqlite-0.17.0-py3-none-any.whl", hash = "sha256:6c49dc6d3405929b1d08eeccc72306d3677503cc5e5e43771efc1e00232e8231"},
{file = "aiosqlite-0.17.0.tar.gz", hash = "sha256:f0e6acc24bc4864149267ac82fb46dfb3be4455f99fe21df82609cc6e6baee51"},
@ -1839,32 +1531,10 @@ anyio = [
{file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"},
{file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"},
]
apscheduler = [
{file = "APScheduler-3.9.1-py2.py3-none-any.whl", hash = "sha256:ddc25a0ddd899de44d7f451f4375fb971887e65af51e41e5dcf681f59b8b2c9a"},
{file = "APScheduler-3.9.1.tar.gz", hash = "sha256:65e6574b6395498d371d045f2a8a7e4f7d50c6ad21ef7313d15b1c7cf20df1e3"},
]
arrow = [
{file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"},
{file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"},
]
"backports.zoneinfo" = [
{file = "backports.zoneinfo-0.2.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc"},
{file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722"},
{file = "backports.zoneinfo-0.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546"},
{file = "backports.zoneinfo-0.2.1-cp36-cp36m-win32.whl", hash = "sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08"},
{file = "backports.zoneinfo-0.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7"},
{file = "backports.zoneinfo-0.2.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac"},
{file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf"},
{file = "backports.zoneinfo-0.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570"},
{file = "backports.zoneinfo-0.2.1-cp37-cp37m-win32.whl", hash = "sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b"},
{file = "backports.zoneinfo-0.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582"},
{file = "backports.zoneinfo-0.2.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987"},
{file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1"},
{file = "backports.zoneinfo-0.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9"},
{file = "backports.zoneinfo-0.2.1-cp38-cp38-win32.whl", hash = "sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328"},
{file = "backports.zoneinfo-0.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6"},
{file = "backports.zoneinfo-0.2.1.tar.gz", hash = "sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2"},
]
beautifulsoup4 = [
{file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"},
{file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"},
@ -1894,75 +1564,75 @@ colorama = [
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
contourpy = [
{file = "contourpy-1.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:87121b9428ac568fb84fae4af5e7852fc34f02eadc4e3e91f6c8989327692186"},
{file = "contourpy-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1fb782982c42cee667b892a0b0c52a9f6c7ecf1da5c5f4345845f04eaa862f93"},
{file = "contourpy-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:689d7d2a840619915d0abd1ecc6e399fee202f8ad315acda2807f4ca420d0802"},
{file = "contourpy-1.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d88814befbd1433152c5f6dd536905149ba028d795a22555b149ae0a36024d9e"},
{file = "contourpy-1.0.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df65f4b2b4e74977f0336bef12a88051ab24e6a16873cd9249f34d67cb3e345d"},
{file = "contourpy-1.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6b4c0c723664f65c2a47c8cb6ebbf660b0b2e2d936adf2e8503d4e93359465"},
{file = "contourpy-1.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bcc98d397c3dea45d5b262029564b29cb8e945f2607a38bee6163694c0a8b4ef"},
{file = "contourpy-1.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2bf5c846c257578b03d498b20f54f53551616a507d8e5463511c58bb58e9a9cf"},
{file = "contourpy-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdacddb18d55ffec42d1907079cdc04ec4fa8a990cdf5b9d9fe67d281fc0d12e"},
{file = "contourpy-1.0.5-cp310-cp310-win32.whl", hash = "sha256:434942fa2f9019b9ae525fb752dc523800c49a1a28fbd6d9240b0fa959573dcc"},
{file = "contourpy-1.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:3b3082ade8849130203d461b98c2a061b382c46074b43b4edd5cefd81af92b8a"},
{file = "contourpy-1.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:057114f698ffb9e54657e8fda6802e2f5c8fad609845cf6afaf31590ef6a33c0"},
{file = "contourpy-1.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:218722a29c5c26677d37c44f5f8a372daf6f07870aad793a97d47eb6ad6b3290"},
{file = "contourpy-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6c02e22cf09996194bcb3a4784099975cf527d5c29caf759abadf29ebdb2fe27"},
{file = "contourpy-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0d5ee865b5fd16bf62d72122aadcc90aab296c30c1adb0a32b4b66bd843163e"},
{file = "contourpy-1.0.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45822b0a2a452327ab4f95efe368d234d5294bbf89a99968be27c7938a21108"},
{file = "contourpy-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dca5be83a6dfaf933a46e3bc2b9f2685e5ec61b22f6a38ad740aac9c16e9a0ff"},
{file = "contourpy-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3c3f2f6b898a40207843ae01970e57e33d22a26b22f23c6a5e07b4716751085f"},
{file = "contourpy-1.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c2b4eab7c12f9cb460509bc34a3b086f9802f0dba27c89a63df4123819ad64af"},
{file = "contourpy-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09ed9b63f4df8a7591b7a4a26c1ad066dcaafda1f846250fdcb534074a411692"},
{file = "contourpy-1.0.5-cp311-cp311-win32.whl", hash = "sha256:f670686d99c867d0f24b28ce8c6f02429c6eef5e2674aab287850d0ee2d20437"},
{file = "contourpy-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:c51568e94f7f232296de30002f2a50f77a7bd346673da3e4f2aaf9d2b833f2e5"},
{file = "contourpy-1.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7c9e99aac7b430f6a9f15eebf058c742097cea3369f23a2bfc5e64d374b67e3a"},
{file = "contourpy-1.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3210d93ad2af742b6a96cf39792f7181822edbb8fe11c3ef29d1583fe637a8d8"},
{file = "contourpy-1.0.5-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:128bd7acf569f8443ad5b2227f30ac909e4f5399ed221727eeacf0c6476187e6"},
{file = "contourpy-1.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:813c2944e940ef8dccea71305bacc942d4b193a021140874b3e58933ec44f5b6"},
{file = "contourpy-1.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a74afd8d560eaafe0d9e3e1db8c06081282a05ca4de00ee416195085a79d7d3d"},
{file = "contourpy-1.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d0ad9a85f208473b1f3613c45756c7aa6fcc288266a8c7b873f896aaf741b6b"},
{file = "contourpy-1.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:60f37acd4e4227c5a29f737d9a85ca3145c529a8dd4bf70af7f0637c61b49222"},
{file = "contourpy-1.0.5-cp37-cp37m-win32.whl", hash = "sha256:b50e481a4317a8efcfffcfddcd4c9b36eacba440440e70cbe0256aeb6fd6abae"},
{file = "contourpy-1.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:0395ae71164bfeb2dedd136e03c71a2718a5aa9873a46f518f4133be0d63e1d2"},
{file = "contourpy-1.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3ca40d7844b391d90b864c6a6d1bb6b88b09035fb4d866d64d43c4d26fb0ab64"},
{file = "contourpy-1.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3109fa601d2a448cec4643abd3a31f972bf05b7c2f2e83df9d3429878f8c10ae"},
{file = "contourpy-1.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:06c4d1dde5ee4f909a8a95ba1eb04040c6c26946b4f3b5beaf10d45f14e940ee"},
{file = "contourpy-1.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f54dcc9bb9390fd0636301ead134d46d5229fe86da0db4d974c0fda349f560e"},
{file = "contourpy-1.0.5-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46b8e24813e2fb5a3e598c1f8b9ae403e1438cb846a80cc2b33cddf19dddd7f2"},
{file = "contourpy-1.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:061e1f066c419ffe25b615a1df031b4832ea1d7f2676937e69e8e00e24512005"},
{file = "contourpy-1.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:19ea64fa0cf389d2ebc10974616acfa1fdecbd73d1fd9c72215b782f3c40f561"},
{file = "contourpy-1.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dfe924e5a63861c82332a12adeeab955dc8c8009ddbbd80cc2fcca049ff89a49"},
{file = "contourpy-1.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bed3a2a823a041e8d249b1a7ec132933e1505299329b5cfe1b2b5ec689ec7675"},
{file = "contourpy-1.0.5-cp38-cp38-win32.whl", hash = "sha256:0389349875424aa8c5e61f757e894687916bc4e9616cc6afcbd8051aa2428952"},
{file = "contourpy-1.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:2b5e334330d82866923015b455260173cb3b9e3b4e297052d758abd262031289"},
{file = "contourpy-1.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:def9a01b73c9e27d70ea03b381fb3e7aadfac1f398dbd63751313c3a46747ef5"},
{file = "contourpy-1.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:59c827e536bb5e3ef58e06da0faba61fd89a14f30b68bcfeca41f43ca83a1942"},
{file = "contourpy-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f05d311c937da03b0cd26ac3e14cb991f6ff8fc94f98b3df9713537817539795"},
{file = "contourpy-1.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:970a4be7ec84ccda7c27cb4ae74930bbbd477bc8d849ed55ea798084dd5fca8c"},
{file = "contourpy-1.0.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f7672148f8fca48e4efc16aba24a7455b40c22d4f8abe42475dec6a12b0bb9a"},
{file = "contourpy-1.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eba62b7c21a33e72dd8adab2b92dd5610d8527f0b2ac28a8e0770e71b21a13f9"},
{file = "contourpy-1.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:dd084459ecdb224e617e4ab3f1d5ebe4d1c48facb41f24952b76aa6ba9712bb0"},
{file = "contourpy-1.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c5158616ab39d34b76c50f40c81552ee180598f7825dc7a66fd187d29958820f"},
{file = "contourpy-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f856652f9b533c6cd2b9ad6836a7fc0e43917d7ff15be46c5baf1350f8cdc5d9"},
{file = "contourpy-1.0.5-cp39-cp39-win32.whl", hash = "sha256:f1cc623fd6855b25da52b3275e0c9e51711b86a9dccc75f8c9ab4432fd8e42c7"},
{file = "contourpy-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:e67dcaa34dcd908fcccbf49194211d847c731b6ebaac661c1c889f1bf6af1e44"},
{file = "contourpy-1.0.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfd634cb9685161b2a51f73a7fc4736fd0d67a56632d52319317afaa27f08243"},
{file = "contourpy-1.0.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79908b9d02b1d6c1c71ff3b7ad127f3f82e14a8e091ab44b3c7e34b649fea733"},
{file = "contourpy-1.0.5-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4963cf08f4320d98ae72ec7694291b8ab85cb7da3b0cd824bc32701bc992edf"},
{file = "contourpy-1.0.5-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cfc067ddde78b76dcbc9684d82688b7d3c5158fa2254a085f9bcb9586c1e2d8"},
{file = "contourpy-1.0.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9939796abcadb2810a63dfb26ff8ca4595fe7dd70a3ceae7f607a2639b714307"},
{file = "contourpy-1.0.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d8150579bf30cdf896906baf256aa200cd50dbe6e565c17d6fd3d678e21ff5de"},
{file = "contourpy-1.0.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed9c91bf4ce614efed5388c3f989a7cfe08728ab871d995a486ea74ff88993db"},
{file = "contourpy-1.0.5-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b46a04588ceb7cf132568e0e564a854627ef87a1ed3bf536234540a79ced44b0"},
{file = "contourpy-1.0.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b85553699862c09937a7a5ea14ee6229087971a7d51ae97d5f4b407f571a2c17"},
{file = "contourpy-1.0.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:99a8071e351b50827ad976b92ed91845fb614ac67a3c41109b24f3d8bd3afada"},
{file = "contourpy-1.0.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fb0458d74726937ead9e2effc91144aea5a58ecee9754242f8539a782bed685a"},
{file = "contourpy-1.0.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f89f0608a5aa8142ed0e53957916623791a88c7f5e5f07ae530c328beeb888f"},
{file = "contourpy-1.0.5-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce763369e646e59e4ca2c09735cd1bdd3048d909ad5f2bc116e83166a9352f3c"},
{file = "contourpy-1.0.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c16fa267740d67883899e054cccb4279e002f3f4872873b752c1ba15045ff49"},
{file = "contourpy-1.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a30e95274f5c0e007ccc759ec258aa5708c534ec058f153ee25ac700a2f1438b"},
{file = "contourpy-1.0.5.tar.gz", hash = "sha256:896631cd40222aef3697e4e51177d14c3709fda49d30983269d584f034acc8a4"},
{file = "contourpy-1.0.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:613c665529899b5d9fade7e5d1760111a0b011231277a0d36c49f0d3d6914bd6"},
{file = "contourpy-1.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78ced51807ccb2f45d4ea73aca339756d75d021069604c2fccd05390dc3c28eb"},
{file = "contourpy-1.0.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b3b1bd7577c530eaf9d2bc52d1a93fef50ac516a8b1062c3d1b9bcec9ebe329b"},
{file = "contourpy-1.0.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8834c14b8c3dd849005e06703469db9bf96ba2d66a3f88ecc539c9a8982e0ee"},
{file = "contourpy-1.0.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4052a8a4926d4468416fc7d4b2a7b2a3e35f25b39f4061a7e2a3a2748c4fc48"},
{file = "contourpy-1.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c0e1308307a75e07d1f1b5f0f56b5af84538a5e9027109a7bcf6cb47c434e72"},
{file = "contourpy-1.0.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fc4e7973ed0e1fe689435842a6e6b330eb7ccc696080dda9a97b1a1b78e41db"},
{file = "contourpy-1.0.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08e8d09d96219ace6cb596506fb9b64ea5f270b2fb9121158b976d88871fcfd1"},
{file = "contourpy-1.0.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f33da6b5d19ad1bb5e7ad38bb8ba5c426d2178928bc2b2c44e8823ea0ecb6ff3"},
{file = "contourpy-1.0.6-cp310-cp310-win32.whl", hash = "sha256:12a7dc8439544ed05c6553bf026d5e8fa7fad48d63958a95d61698df0e00092b"},
{file = "contourpy-1.0.6-cp310-cp310-win_amd64.whl", hash = "sha256:eadad75bf91897f922e0fb3dca1b322a58b1726a953f98c2e5f0606bd8408621"},
{file = "contourpy-1.0.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:913bac9d064cff033cf3719e855d4f1db9f1c179e0ecf3ba9fdef21c21c6a16a"},
{file = "contourpy-1.0.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46deb310a276cc5c1fd27958e358cce68b1e8a515fa5a574c670a504c3a3fe30"},
{file = "contourpy-1.0.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b64f747e92af7da3b85631a55d68c45a2d728b4036b03cdaba4bd94bcc85bd6f"},
{file = "contourpy-1.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50627bf76abb6ba291ad08db583161939c2c5fab38c38181b7833423ab9c7de3"},
{file = "contourpy-1.0.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:358f6364e4873f4d73360b35da30066f40387dd3c427a3e5432c6b28dd24a8fa"},
{file = "contourpy-1.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c78bfbc1a7bff053baf7e508449d2765964d67735c909b583204e3240a2aca45"},
{file = "contourpy-1.0.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e43255a83835a129ef98f75d13d643844d8c646b258bebd11e4a0975203e018f"},
{file = "contourpy-1.0.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:375d81366afd547b8558c4720337218345148bc2fcffa3a9870cab82b29667f2"},
{file = "contourpy-1.0.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b98c820608e2dca6442e786817f646d11057c09a23b68d2b3737e6dcb6e4a49b"},
{file = "contourpy-1.0.6-cp311-cp311-win32.whl", hash = "sha256:0e4854cc02006ad6684ce092bdadab6f0912d131f91c2450ce6dbdea78ee3c0b"},
{file = "contourpy-1.0.6-cp311-cp311-win_amd64.whl", hash = "sha256:d2eff2af97ea0b61381828b1ad6cd249bbd41d280e53aea5cccd7b2b31b8225c"},
{file = "contourpy-1.0.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5b117d29433fc8393b18a696d794961464e37afb34a6eeb8b2c37b5f4128a83e"},
{file = "contourpy-1.0.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:341330ed19074f956cb20877ad8d2ae50e458884bfa6a6df3ae28487cc76c768"},
{file = "contourpy-1.0.6-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:371f6570a81dfdddbb837ba432293a63b4babb942a9eb7aaa699997adfb53278"},
{file = "contourpy-1.0.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9447c45df407d3ecb717d837af3b70cfef432138530712263730783b3d016512"},
{file = "contourpy-1.0.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:730c27978a0003b47b359935478b7d63fd8386dbb2dcd36c1e8de88cbfc1e9de"},
{file = "contourpy-1.0.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:da1ef35fd79be2926ba80fbb36327463e3656c02526e9b5b4c2b366588b74d9a"},
{file = "contourpy-1.0.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:cd2bc0c8f2e8de7dd89a7f1c10b8844e291bca17d359373203ef2e6100819edd"},
{file = "contourpy-1.0.6-cp37-cp37m-win32.whl", hash = "sha256:3a1917d3941dd58732c449c810fa7ce46cc305ce9325a11261d740118b85e6f3"},
{file = "contourpy-1.0.6-cp37-cp37m-win_amd64.whl", hash = "sha256:06ca79e1efbbe2df795822df2fa173d1a2b38b6e0f047a0ec7903fbca1d1847e"},
{file = "contourpy-1.0.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e626cefff8491bce356221c22af5a3ea528b0b41fbabc719c00ae233819ea0bf"},
{file = "contourpy-1.0.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dbe6fe7a1166b1ddd7b6d887ea6fa8389d3f28b5ed3f73a8f40ece1fc5a3d340"},
{file = "contourpy-1.0.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e13b31d1b4b68db60b3b29f8e337908f328c7f05b9add4b1b5c74e0691180109"},
{file = "contourpy-1.0.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a79d239fc22c3b8d9d3de492aa0c245533f4f4c7608e5749af866949c0f1b1b9"},
{file = "contourpy-1.0.6-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e8e686a6db92a46111a1ee0ee6f7fbfae4048f0019de207149f43ac1812cf95"},
{file = "contourpy-1.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2bd02f1a7adff3a1f33e431eb96ab6d7987b039d2946a9b39fe6fb16a1036"},
{file = "contourpy-1.0.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:03d1b9c6b44a9e30d554654c72be89af94fab7510b4b9f62356c64c81cec8b7d"},
{file = "contourpy-1.0.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b48d94386f1994db7c70c76b5808c12e23ed7a4ee13693c2fc5ab109d60243c0"},
{file = "contourpy-1.0.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:208bc904889c910d95aafcf7be9e677726df9ef71e216780170dbb7e37d118fa"},
{file = "contourpy-1.0.6-cp38-cp38-win32.whl", hash = "sha256:444fb776f58f4906d8d354eb6f6ce59d0a60f7b6a720da6c1ccb839db7c80eb9"},
{file = "contourpy-1.0.6-cp38-cp38-win_amd64.whl", hash = "sha256:9bc407a6af672da20da74823443707e38ece8b93a04009dca25856c2d9adadb1"},
{file = "contourpy-1.0.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:aa4674cf3fa2bd9c322982644967f01eed0c91bb890f624e0e0daf7a5c3383e9"},
{file = "contourpy-1.0.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f56515e7c6fae4529b731f6c117752247bef9cdad2b12fc5ddf8ca6a50965a5"},
{file = "contourpy-1.0.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:344cb3badf6fc7316ad51835f56ac387bdf86c8e1b670904f18f437d70da4183"},
{file = "contourpy-1.0.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b1e66346acfb17694d46175a0cea7d9036f12ed0c31dfe86f0f405eedde2bdd"},
{file = "contourpy-1.0.6-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8468b40528fa1e15181cccec4198623b55dcd58306f8815a793803f51f6c474a"},
{file = "contourpy-1.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dedf4c64185a216c35eb488e6f433297c660321275734401760dafaeb0ad5c2"},
{file = "contourpy-1.0.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:494efed2c761f0f37262815f9e3c4bb9917c5c69806abdee1d1cb6611a7174a0"},
{file = "contourpy-1.0.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:75a2e638042118118ab39d337da4c7908c1af74a8464cad59f19fbc5bbafec9b"},
{file = "contourpy-1.0.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a628bba09ba72e472bf7b31018b6281fd4cc903f0888049a3724afba13b6e0b8"},
{file = "contourpy-1.0.6-cp39-cp39-win32.whl", hash = "sha256:e1739496c2f0108013629aa095cc32a8c6363444361960c07493818d0dea2da4"},
{file = "contourpy-1.0.6-cp39-cp39-win_amd64.whl", hash = "sha256:a457ee72d9032e86730f62c5eeddf402e732fdf5ca8b13b41772aa8ae13a4563"},
{file = "contourpy-1.0.6-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d912f0154a20a80ea449daada904a7eb6941c83281a9fab95de50529bfc3a1da"},
{file = "contourpy-1.0.6-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4081918147fc4c29fad328d5066cfc751da100a1098398742f9f364be63803fc"},
{file = "contourpy-1.0.6-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0537cc1195245bbe24f2913d1f9211b8f04eb203de9044630abd3664c6cc339c"},
{file = "contourpy-1.0.6-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcd556c8fc37a342dd636d7eef150b1399f823a4462f8c968e11e1ebeabee769"},
{file = "contourpy-1.0.6-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:f6ca38dd8d988eca8f07305125dec6f54ac1c518f1aaddcc14d08c01aebb6efc"},
{file = "contourpy-1.0.6-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c1baa49ab9fedbf19d40d93163b7d3e735d9cd8d5efe4cce9907902a6dad391f"},
{file = "contourpy-1.0.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:211dfe2bd43bf5791d23afbe23a7952e8ac8b67591d24be3638cabb648b3a6eb"},
{file = "contourpy-1.0.6-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c38c6536c2d71ca2f7e418acaf5bca30a3af7f2a2fa106083c7d738337848dbe"},
{file = "contourpy-1.0.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b1ee48a130da4dd0eb8055bbab34abf3f6262957832fd575e0cab4979a15a41"},
{file = "contourpy-1.0.6-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5641927cc5ae66155d0c80195dc35726eae060e7defc18b7ab27600f39dd1fe7"},
{file = "contourpy-1.0.6-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ee394502026d68652c2824348a40bf50f31351a668977b51437131a90d777ea"},
{file = "contourpy-1.0.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b97454ed5b1368b66ed414c754cba15b9750ce69938fc6153679787402e4cdf"},
{file = "contourpy-1.0.6-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0236875c5a0784215b49d00ebbe80c5b6b5d5244b3655a36dda88105334dea17"},
{file = "contourpy-1.0.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c593aeff7a0171f639da92cb86d24954bbb61f8a1b530f74eb750a14685832"},
{file = "contourpy-1.0.6-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9b0e7fe7f949fb719b206548e5cde2518ffb29936afa4303d8a1c4db43dcb675"},
{file = "contourpy-1.0.6.tar.gz", hash = "sha256:6e459ebb8bb5ee4c22c19cc000174f8059981971a33ce11e17dddf6aca97a142"},
]
cookiecutter = [
{file = "cookiecutter-1.7.3-py2.py3-none-any.whl", hash = "sha256:f8671531fa96ab14339d0c59b4f662a4f12a2ecacd94a0f70a3500843da588e2"},
@ -1996,62 +1666,6 @@ gitpython = [
{file = "GitPython-3.1.29-py3-none-any.whl", hash = "sha256:41eea0deec2deea139b459ac03656f0dd28fc4a3387240ec1d3c259a2c47850f"},
{file = "GitPython-3.1.29.tar.gz", hash = "sha256:cc36bfc4a3f913e66805a28e84703e419d9c264c1077e537b54f0e1af85dbefd"},
]
greenlet = [
{file = "greenlet-1.1.3-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:8c287ae7ac921dfde88b1c125bd9590b7ec3c900c2d3db5197f1286e144e712b"},
{file = "greenlet-1.1.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:870a48007872d12e95a996fca3c03a64290d3ea2e61076aa35d3b253cf34cd32"},
{file = "greenlet-1.1.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:7c5227963409551ae4a6938beb70d56bf1918c554a287d3da6853526212fbe0a"},
{file = "greenlet-1.1.3-cp27-cp27m-win32.whl", hash = "sha256:9fae214f6c43cd47f7bef98c56919b9222481e833be2915f6857a1e9e8a15318"},
{file = "greenlet-1.1.3-cp27-cp27m-win_amd64.whl", hash = "sha256:de431765bd5fe62119e0bc6bc6e7b17ac53017ae1782acf88fcf6b7eae475a49"},
{file = "greenlet-1.1.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:510c3b15587afce9800198b4b142202b323bf4b4b5f9d6c79cb9a35e5e3c30d2"},
{file = "greenlet-1.1.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:9951dcbd37850da32b2cb6e391f621c1ee456191c6ae5528af4a34afe357c30e"},
{file = "greenlet-1.1.3-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:07c58e169bbe1e87b8bbf15a5c1b779a7616df9fd3e61cadc9d691740015b4f8"},
{file = "greenlet-1.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df02fdec0c533301497acb0bc0f27f479a3a63dcdc3a099ae33a902857f07477"},
{file = "greenlet-1.1.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c88e134d51d5e82315a7c32b914a58751b7353eb5268dbd02eabf020b4c4700"},
{file = "greenlet-1.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b41d19c0cfe5c259fe6c539fd75051cd39a5d33d05482f885faf43f7f5e7d26"},
{file = "greenlet-1.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:6f5d4b2280ceea76c55c893827961ed0a6eadd5a584a7c4e6e6dd7bc10dfdd96"},
{file = "greenlet-1.1.3-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:184416e481295832350a4bf731ba619a92f5689bf5d0fa4341e98b98b1265bd7"},
{file = "greenlet-1.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd0404d154084a371e6d2bafc787201612a1359c2dee688ae334f9118aa0bf47"},
{file = "greenlet-1.1.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a43bbfa9b6cfdfaeefbd91038dde65ea2c421dc387ed171613df340650874f2"},
{file = "greenlet-1.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce5b64dfe8d0cca407d88b0ee619d80d4215a2612c1af8c98a92180e7109f4b5"},
{file = "greenlet-1.1.3-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:903fa5716b8fbb21019268b44f73f3748c41d1a30d71b4a49c84b642c2fed5fa"},
{file = "greenlet-1.1.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:0118817c9341ef2b0f75f5af79ac377e4da6ff637e5ee4ac91802c0e379dadb4"},
{file = "greenlet-1.1.3-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:466ce0928e33421ee84ae04c4ac6f253a3a3e6b8d600a79bd43fd4403e0a7a76"},
{file = "greenlet-1.1.3-cp35-cp35m-win32.whl", hash = "sha256:65ad1a7a463a2a6f863661329a944a5802c7129f7ad33583dcc11069c17e622c"},
{file = "greenlet-1.1.3-cp35-cp35m-win_amd64.whl", hash = "sha256:7532a46505470be30cbf1dbadb20379fb481244f1ca54207d7df3bf0bbab6a20"},
{file = "greenlet-1.1.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:caff52cb5cd7626872d9696aee5b794abe172804beb7db52eed1fd5824b63910"},
{file = "greenlet-1.1.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:db41f3845eb579b544c962864cce2c2a0257fe30f0f1e18e51b1e8cbb4e0ac6d"},
{file = "greenlet-1.1.3-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e8533f5111704d75de3139bf0b8136d3a6c1642c55c067866fa0a51c2155ee33"},
{file = "greenlet-1.1.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9537e4baf0db67f382eb29255a03154fcd4984638303ff9baaa738b10371fa57"},
{file = "greenlet-1.1.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8bfd36f368efe0ab2a6aa3db7f14598aac454b06849fb633b762ddbede1db90"},
{file = "greenlet-1.1.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0877a9a2129a2c56a2eae2da016743db7d9d6a05d5e1c198f1b7808c602a30e"},
{file = "greenlet-1.1.3-cp36-cp36m-win32.whl", hash = "sha256:88b04e12c9b041a1e0bcb886fec709c488192638a9a7a3677513ac6ba81d8e79"},
{file = "greenlet-1.1.3-cp36-cp36m-win_amd64.whl", hash = "sha256:4f166b4aca8d7d489e82d74627a7069ab34211ef5ebb57c300ec4b9337b60fc0"},
{file = "greenlet-1.1.3-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:cd16a89efe3a003029c87ff19e9fba635864e064da646bc749fc1908a4af18f3"},
{file = "greenlet-1.1.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5b756e6730ea59b2745072e28ad27f4c837084688e6a6b3633c8b1e509e6ae0e"},
{file = "greenlet-1.1.3-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:9b2f7d0408ddeb8ea1fd43d3db79a8cefaccadd2a812f021333b338ed6b10aba"},
{file = "greenlet-1.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44b4817c34c9272c65550b788913620f1fdc80362b209bc9d7dd2f40d8793080"},
{file = "greenlet-1.1.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d58a5a71c4c37354f9e0c24c9c8321f0185f6945ef027460b809f4bb474bfe41"},
{file = "greenlet-1.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dd51d2650e70c6c4af37f454737bf4a11e568945b27f74b471e8e2a9fd21268"},
{file = "greenlet-1.1.3-cp37-cp37m-win32.whl", hash = "sha256:048d2bed76c2aa6de7af500ae0ea51dd2267aec0e0f2a436981159053d0bc7cc"},
{file = "greenlet-1.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:77e41db75f9958f2083e03e9dd39da12247b3430c92267df3af77c83d8ff9eed"},
{file = "greenlet-1.1.3-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:1626185d938d7381631e48e6f7713e8d4b964be246073e1a1d15c2f061ac9f08"},
{file = "greenlet-1.1.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:1ec2779774d8e42ed0440cf8bc55540175187e8e934f2be25199bf4ed948cd9e"},
{file = "greenlet-1.1.3-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:f2f908239b7098799b8845e5936c2ccb91d8c2323be02e82f8dcb4a80dcf4a25"},
{file = "greenlet-1.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b181e9aa6cb2f5ec0cacc8cee6e5a3093416c841ba32c185c30c160487f0380"},
{file = "greenlet-1.1.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cf45e339cabea16c07586306a31cfcc5a3b5e1626d365714d283732afed6809"},
{file = "greenlet-1.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6200a11f003ec26815f7e3d2ded01b43a3810be3528dd760d2f1fa777490c3cd"},
{file = "greenlet-1.1.3-cp38-cp38-win32.whl", hash = "sha256:db5b25265010a1b3dca6a174a443a0ed4c4ab12d5e2883a11c97d6e6d59b12f9"},
{file = "greenlet-1.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:095a980288fe05adf3d002fbb180c99bdcf0f930e220aa66fcd56e7914a38202"},
{file = "greenlet-1.1.3-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:cbc1eb55342cbac8f7ec159088d54e2cfdd5ddf61c87b8bbe682d113789331b2"},
{file = "greenlet-1.1.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:694ffa7144fa5cc526c8f4512665003a39fa09ef00d19bbca5c8d3406db72fbe"},
{file = "greenlet-1.1.3-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:aa741c1a8a8cc25eb3a3a01a62bdb5095a773d8c6a86470bde7f607a447e7905"},
{file = "greenlet-1.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3a669f11289a8995d24fbfc0e63f8289dd03c9aaa0cc8f1eab31d18ca61a382"},
{file = "greenlet-1.1.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76a53bfa10b367ee734b95988bd82a9a5f0038a25030f9f23bbbc005010ca600"},
{file = "greenlet-1.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fb0aa7f6996879551fd67461d5d3ab0c3c0245da98be90c89fcb7a18d437403"},
{file = "greenlet-1.1.3-cp39-cp39-win32.whl", hash = "sha256:5fbe1ab72b998ca77ceabbae63a9b2e2dc2d963f4299b9b278252ddba142d3f1"},
{file = "greenlet-1.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:ffe73f9e7aea404722058405ff24041e59d31ca23d1da0895af48050a07b6932"},
{file = "greenlet-1.1.3.tar.gz", hash = "sha256:bcb6c6dd1d6be6d38d6db283747d07fda089ff8c559a835236560a4410340455"},
]
h11 = [
{file = "h11-0.12.0-py3-none-any.whl", hash = "sha256:36a3cb8c0a032f56e2da7084577878a035d3b61d104230d4bd49c0c6b555a9c6"},
{file = "h11-0.12.0.tar.gz", hash = "sha256:47222cb6067e4a307d535814917cd98fd0a57b6788ce715755fa2b6c28b56042"},
@ -2111,10 +1725,6 @@ idna = [
{file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"},
{file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
]
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"},
]
iso8601 = [
{file = "iso8601-1.1.0-py3-none-any.whl", hash = "sha256:8400e90141bf792bce2634df533dc57e3bee19ea120a87bebcd3da89a58ad73f"},
{file = "iso8601-1.1.0.tar.gz", hash = "sha256:32811e7b81deee2063ea6d2e94f8819a86d1f3811e49d23623a41fa832bef03f"},
@ -2281,10 +1891,6 @@ lxml = [
{file = "lxml-4.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:287605bede6bd36e930577c5925fcea17cb30453d96a7b4c63c14a257118dbb9"},
{file = "lxml-4.9.1.tar.gz", hash = "sha256:fe749b052bb7233fe5d072fcb549221a8cb1a16725c47c37e42b0b9cb3ff2c3f"},
]
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"},
@ -2493,14 +2099,6 @@ nonebot-adapter-onebot = [
{file = "nonebot_adapter_onebot-2.1.5-py3-none-any.whl", hash = "sha256:d2a46694c402d5f3c5f6951955a78bbf779e17039d282c612cc1fcff77bc6044"},
{file = "nonebot_adapter_onebot-2.1.5.tar.gz", hash = "sha256:e740422cceebc1f0379da788ccddaa7937f7d88c140e2a5ea9ba0e91ddee867e"},
]
nonebot-plugin-apscheduler = [
{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.0rc1-py3-none-any.whl", hash = "sha256:99c70300b9d0755bba6ed50b7399f44f6213e119157bc026b960b3e157a38416"},
{file = "nonebot2-2.0.0rc1.tar.gz", hash = "sha256:6e5a0abf24086d05d5c2a56c971a551ece2a343ff29f83b76b398bf717b92e16"},
@ -2540,73 +2138,65 @@ packaging = [
{file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"},
]
pillow = [
{file = "Pillow-9.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a9c9bc489f8ab30906d7a85afac4b4944a572a7432e00698a7239f44a44e6efb"},
{file = "Pillow-9.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:510cef4a3f401c246cfd8227b300828715dd055463cdca6176c2e4036df8bd4f"},
{file = "Pillow-9.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7888310f6214f19ab2b6df90f3f06afa3df7ef7355fc025e78a3044737fab1f5"},
{file = "Pillow-9.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831e648102c82f152e14c1a0938689dbb22480c548c8d4b8b248b3e50967b88c"},
{file = "Pillow-9.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cc1d2451e8a3b4bfdb9caf745b58e6c7a77d2e469159b0d527a4554d73694d1"},
{file = "Pillow-9.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:136659638f61a251e8ed3b331fc6ccd124590eeff539de57c5f80ef3a9594e58"},
{file = "Pillow-9.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:6e8c66f70fb539301e064f6478d7453e820d8a2c631da948a23384865cd95544"},
{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-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"},
{file = "Pillow-9.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:15928f824870535c85dbf949c09d6ae7d3d6ac2d6efec80f3227f73eefba741c"},
{file = "Pillow-9.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:bdd0de2d64688ecae88dd8935012c4a72681e5df632af903a1dca8c5e7aa871a"},
{file = "Pillow-9.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5b87da55a08acb586bad5c3aa3b86505f559b84f39035b233d5bf844b0834b1"},
{file = "Pillow-9.2.0-cp311-cp311-win32.whl", hash = "sha256:b6d5e92df2b77665e07ddb2e4dbd6d644b78e4c0d2e9272a852627cdba0d75cf"},
{file = "Pillow-9.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6bf088c1ce160f50ea40764f825ec9b72ed9da25346216b91361eef8ad1b8f8c"},
{file = "Pillow-9.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:2c58b24e3a63efd22554c676d81b0e57f80e0a7d3a5874a7e14ce90ec40d3069"},
{file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef7592281f7c174d3d6cbfbb7ee5984a671fcd77e3fc78e973d492e9bf0eb3f"},
{file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dcd7b9c7139dc8258d164b55696ecd16c04607f1cc33ba7af86613881ffe4ac8"},
{file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a138441e95562b3c078746a22f8fca8ff1c22c014f856278bdbdd89ca36cff1b"},
{file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:93689632949aff41199090eff5474f3990b6823404e45d66a5d44304e9cdc467"},
{file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:f3fac744f9b540148fa7715a435d2283b71f68bfb6d4aae24482a890aed18b59"},
{file = "Pillow-9.2.0-cp37-cp37m-win32.whl", hash = "sha256:fa768eff5f9f958270b081bb33581b4b569faabf8774726b283edb06617101dc"},
{file = "Pillow-9.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:69bd1a15d7ba3694631e00df8de65a8cb031911ca11f44929c97fe05eb9b6c1d"},
{file = "Pillow-9.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:030e3460861488e249731c3e7ab59b07c7853838ff3b8e16aac9561bb345da14"},
{file = "Pillow-9.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:74a04183e6e64930b667d321524e3c5361094bb4af9083db5c301db64cd341f3"},
{file = "Pillow-9.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d33a11f601213dcd5718109c09a52c2a1c893e7461f0be2d6febc2879ec2402"},
{file = "Pillow-9.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fd6f5e3c0e4697fa7eb45b6e93996299f3feee73a3175fa451f49a74d092b9f"},
{file = "Pillow-9.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a647c0d4478b995c5e54615a2e5360ccedd2f85e70ab57fbe817ca613d5e63b8"},
{file = "Pillow-9.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:4134d3f1ba5f15027ff5c04296f13328fecd46921424084516bdb1b2548e66ff"},
{file = "Pillow-9.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:bc431b065722a5ad1dfb4df354fb9333b7a582a5ee39a90e6ffff688d72f27a1"},
{file = "Pillow-9.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1536ad017a9f789430fb6b8be8bf99d2f214c76502becc196c6f2d9a75b01b76"},
{file = "Pillow-9.2.0-cp38-cp38-win32.whl", hash = "sha256:2ad0d4df0f5ef2247e27fc790d5c9b5a0af8ade9ba340db4a73bb1a4a3e5fb4f"},
{file = "Pillow-9.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:ec52c351b35ca269cb1f8069d610fc45c5bd38c3e91f9ab4cbbf0aebc136d9c8"},
{file = "Pillow-9.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ed2c4ef2451de908c90436d6e8092e13a43992f1860275b4d8082667fbb2ffc"},
{file = "Pillow-9.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ad2f835e0ad81d1689f1b7e3fbac7b01bb8777d5a985c8962bedee0cc6d43da"},
{file = "Pillow-9.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea98f633d45f7e815db648fd7ff0f19e328302ac36427343e4432c84432e7ff4"},
{file = "Pillow-9.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7761afe0126d046974a01e030ae7529ed0ca6a196de3ec6937c11df0df1bc91c"},
{file = "Pillow-9.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a54614049a18a2d6fe156e68e188da02a046a4a93cf24f373bffd977e943421"},
{file = "Pillow-9.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:5aed7dde98403cd91d86a1115c78d8145c83078e864c1de1064f52e6feb61b20"},
{file = "Pillow-9.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:13b725463f32df1bfeacbf3dd197fb358ae8ebcd8c5548faa75126ea425ccb60"},
{file = "Pillow-9.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:808add66ea764ed97d44dda1ac4f2cfec4c1867d9efb16a33d158be79f32b8a4"},
{file = "Pillow-9.2.0-cp39-cp39-win32.whl", hash = "sha256:337a74fd2f291c607d220c793a8135273c4c2ab001b03e601c36766005f36885"},
{file = "Pillow-9.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:fac2d65901fb0fdf20363fbd345c01958a742f2dc62a8dd4495af66e3ff502a4"},
{file = "Pillow-9.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ad2277b185ebce47a63f4dc6302e30f05762b688f8dc3de55dbae4651872cdf3"},
{file = "Pillow-9.2.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c7b502bc34f6e32ba022b4a209638f9e097d7a9098104ae420eb8186217ebbb"},
{file = "Pillow-9.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d1f14f5f691f55e1b47f824ca4fdcb4b19b4323fe43cc7bb105988cad7496be"},
{file = "Pillow-9.2.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:dfe4c1fedfde4e2fbc009d5ad420647f7730d719786388b7de0999bf32c0d9fd"},
{file = "Pillow-9.2.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:f07f1f00e22b231dd3d9b9208692042e29792d6bd4f6639415d2f23158a80013"},
{file = "Pillow-9.2.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1802f34298f5ba11d55e5bb09c31997dc0c6aed919658dfdf0198a2fe75d5490"},
{file = "Pillow-9.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17d4cafe22f050b46d983b71c707162d63d796a1235cdf8b9d7a112e97b15bac"},
{file = "Pillow-9.2.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96b5e6874431df16aee0c1ba237574cb6dff1dcb173798faa6a9d8b399a05d0e"},
{file = "Pillow-9.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0030fdbd926fb85844b8b92e2f9449ba89607231d3dd597a21ae72dc7fe26927"},
{file = "Pillow-9.2.0.tar.gz", hash = "sha256:75e636fd3e0fb872693f23ccb8a5ff2cd578801251f3a4f6854c6a5d437d3c04"},
]
playwright = [
{file = "playwright-1.27.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:3b584bc23bfacfbfb91777663d2b68891d8a16c5c2228b4702c6a7d29c0ac364"},
{file = "playwright-1.27.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:771d690aaa933bb40f60abbe7935979cfa9a5bec498bbc57cd87baf038348d2b"},
{file = "playwright-1.27.1-py3-none-macosx_11_0_universal2.whl", hash = "sha256:db89faac3c535e289f8463b184ffd4523d97b5e959d97bae330d29522c5bfb9d"},
{file = "playwright-1.27.1-py3-none-manylinux1_x86_64.whl", hash = "sha256:5e7be8dc52b9e3340a08fd15b7d3cdd635efd51c0c62bd1edba55f0bfeea293c"},
{file = "playwright-1.27.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c32bfbbb6e6529f7f7176551eda7061e9f205e19259052ef663dcae7109c1f12"},
{file = "playwright-1.27.1-py3-none-win32.whl", hash = "sha256:464f3a0ea48aeb42adbdada88a91fd36d4311ae7020d2ab58f410c4c92e0ddfe"},
{file = "playwright-1.27.1-py3-none-win_amd64.whl", hash = "sha256:fc8ce323cf116e27902f327cee1cba6fc0c5400e9281df8e53d3355de88336ba"},
{file = "Pillow-9.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:0b7257127d646ff8676ec8a15520013a698d1fdc48bc2a79ba4e53df792526f2"},
{file = "Pillow-9.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b90f7616ea170e92820775ed47e136208e04c967271c9ef615b6fbd08d9af0e3"},
{file = "Pillow-9.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68943d632f1f9e3dce98908e873b3a090f6cba1cbb1b892a9e8d97c938871fbe"},
{file = "Pillow-9.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be55f8457cd1eac957af0c3f5ece7bc3f033f89b114ef30f710882717670b2a8"},
{file = "Pillow-9.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d77adcd56a42d00cc1be30843d3426aa4e660cab4a61021dc84467123f7a00c"},
{file = "Pillow-9.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:829f97c8e258593b9daa80638aee3789b7df9da5cf1336035016d76f03b8860c"},
{file = "Pillow-9.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:801ec82e4188e935c7f5e22e006d01611d6b41661bba9fe45b60e7ac1a8f84de"},
{file = "Pillow-9.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:871b72c3643e516db4ecf20efe735deb27fe30ca17800e661d769faab45a18d7"},
{file = "Pillow-9.3.0-cp310-cp310-win32.whl", hash = "sha256:655a83b0058ba47c7c52e4e2df5ecf484c1b0b0349805896dd350cbc416bdd91"},
{file = "Pillow-9.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:9f47eabcd2ded7698106b05c2c338672d16a6f2a485e74481f524e2a23c2794b"},
{file = "Pillow-9.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:57751894f6618fd4308ed8e0c36c333e2f5469744c34729a27532b3db106ee20"},
{file = "Pillow-9.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7db8b751ad307d7cf238f02101e8e36a128a6cb199326e867d1398067381bff4"},
{file = "Pillow-9.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3033fbe1feb1b59394615a1cafaee85e49d01b51d54de0cbf6aa8e64182518a1"},
{file = "Pillow-9.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22b012ea2d065fd163ca096f4e37e47cd8b59cf4b0fd47bfca6abb93df70b34c"},
{file = "Pillow-9.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a65733d103311331875c1dca05cb4606997fd33d6acfed695b1232ba1df193"},
{file = "Pillow-9.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:502526a2cbfa431d9fc2a079bdd9061a2397b842bb6bc4239bb176da00993812"},
{file = "Pillow-9.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:90fb88843d3902fe7c9586d439d1e8c05258f41da473952aa8b328d8b907498c"},
{file = "Pillow-9.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:89dca0ce00a2b49024df6325925555d406b14aa3efc2f752dbb5940c52c56b11"},
{file = "Pillow-9.3.0-cp311-cp311-win32.whl", hash = "sha256:3168434d303babf495d4ba58fc22d6604f6e2afb97adc6a423e917dab828939c"},
{file = "Pillow-9.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:18498994b29e1cf86d505edcb7edbe814d133d2232d256db8c7a8ceb34d18cef"},
{file = "Pillow-9.3.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:772a91fc0e03eaf922c63badeca75e91baa80fe2f5f87bdaed4280662aad25c9"},
{file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa4107d1b306cdf8953edde0534562607fe8811b6c4d9a486298ad31de733b2"},
{file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4012d06c846dc2b80651b120e2cdd787b013deb39c09f407727ba90015c684f"},
{file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77ec3e7be99629898c9a6d24a09de089fa5356ee408cdffffe62d67bb75fdd72"},
{file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:6c738585d7a9961d8c2821a1eb3dcb978d14e238be3d70f0a706f7fa9316946b"},
{file = "Pillow-9.3.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:828989c45c245518065a110434246c44a56a8b2b2f6347d1409c787e6e4651ee"},
{file = "Pillow-9.3.0-cp37-cp37m-win32.whl", hash = "sha256:82409ffe29d70fd733ff3c1025a602abb3e67405d41b9403b00b01debc4c9a29"},
{file = "Pillow-9.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:41e0051336807468be450d52b8edd12ac60bebaa97fe10c8b660f116e50b30e4"},
{file = "Pillow-9.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:b03ae6f1a1878233ac620c98f3459f79fd77c7e3c2b20d460284e1fb370557d4"},
{file = "Pillow-9.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4390e9ce199fc1951fcfa65795f239a8a4944117b5935a9317fb320e7767b40f"},
{file = "Pillow-9.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40e1ce476a7804b0fb74bcfa80b0a2206ea6a882938eaba917f7a0f004b42502"},
{file = "Pillow-9.3.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0a06a052c5f37b4ed81c613a455a81f9a3a69429b4fd7bb913c3fa98abefc20"},
{file = "Pillow-9.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03150abd92771742d4a8cd6f2fa6246d847dcd2e332a18d0c15cc75bf6703040"},
{file = "Pillow-9.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:15c42fb9dea42465dfd902fb0ecf584b8848ceb28b41ee2b58f866411be33f07"},
{file = "Pillow-9.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:51e0e543a33ed92db9f5ef69a0356e0b1a7a6b6a71b80df99f1d181ae5875636"},
{file = "Pillow-9.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3dd6caf940756101205dffc5367babf288a30043d35f80936f9bfb37f8355b32"},
{file = "Pillow-9.3.0-cp38-cp38-win32.whl", hash = "sha256:f1ff2ee69f10f13a9596480335f406dd1f70c3650349e2be67ca3139280cade0"},
{file = "Pillow-9.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:276a5ca930c913f714e372b2591a22c4bd3b81a418c0f6635ba832daec1cbcfc"},
{file = "Pillow-9.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:73bd195e43f3fadecfc50c682f5055ec32ee2c933243cafbfdec69ab1aa87cad"},
{file = "Pillow-9.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c7c8ae3864846fc95f4611c78129301e203aaa2af813b703c55d10cc1628535"},
{file = "Pillow-9.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e0918e03aa0c72ea56edbb00d4d664294815aa11291a11504a377ea018330d3"},
{file = "Pillow-9.3.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0915e734b33a474d76c28e07292f196cdf2a590a0d25bcc06e64e545f2d146c"},
{file = "Pillow-9.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0372acb5d3598f36ec0914deed2a63f6bcdb7b606da04dc19a88d31bf0c05b"},
{file = "Pillow-9.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:ad58d27a5b0262c0c19b47d54c5802db9b34d38bbf886665b626aff83c74bacd"},
{file = "Pillow-9.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:97aabc5c50312afa5e0a2b07c17d4ac5e865b250986f8afe2b02d772567a380c"},
{file = "Pillow-9.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9aaa107275d8527e9d6e7670b64aabaaa36e5b6bd71a1015ddd21da0d4e06448"},
{file = "Pillow-9.3.0-cp39-cp39-win32.whl", hash = "sha256:bac18ab8d2d1e6b4ce25e3424f709aceef668347db8637c2296bcf41acb7cf48"},
{file = "Pillow-9.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:b472b5ea442148d1c3e2209f20f1e0bb0eb556538690fa70b5e1f79fa0ba8dc2"},
{file = "Pillow-9.3.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ab388aaa3f6ce52ac1cb8e122c4bd46657c15905904b3120a6248b5b8b0bc228"},
{file = "Pillow-9.3.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbb8e7f2abee51cef77673be97760abff1674ed32847ce04b4af90f610144c7b"},
{file = "Pillow-9.3.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca31dd6014cb8b0b2db1e46081b0ca7d936f856da3b39744aef499db5d84d02"},
{file = "Pillow-9.3.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c7025dce65566eb6e89f56c9509d4f628fddcedb131d9465cacd3d8bac337e7e"},
{file = "Pillow-9.3.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ebf2029c1f464c59b8bdbe5143c79fa2045a581ac53679733d3a91d400ff9efb"},
{file = "Pillow-9.3.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b59430236b8e58840a0dfb4099a0e8717ffb779c952426a69ae435ca1f57210c"},
{file = "Pillow-9.3.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12ce4932caf2ddf3e41d17fc9c02d67126935a44b86df6a206cf0d7161548627"},
{file = "Pillow-9.3.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae5331c23ce118c53b172fa64a4c037eb83c9165aba3a7ba9ddd3ec9fa64a699"},
{file = "Pillow-9.3.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0b07fffc13f474264c336298d1b4ce01d9c5a011415b79d4ee5527bb69ae6f65"},
{file = "Pillow-9.3.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:073adb2ae23431d3b9bcbcff3fe698b62ed47211d0716b067385538a1b0f28b8"},
{file = "Pillow-9.3.0.tar.gz", hash = "sha256:c935a22a557a560108d780f9a0fc426dd7459940dc54faa49d83249c8d3e760f"},
]
poyo = [
{file = "poyo-0.5.0-py2.py3-none-any.whl", hash = "sha256:3e2ca8e33fdc3c411cd101ca395668395dd5dc7ac775b8e809e3def9f9fe041a"},
@ -2695,26 +2285,14 @@ pydantic = [
{file = "pydantic-1.9.2-py3-none-any.whl", hash = "sha256:78a4d6bdfd116a559aeec9a4cfe77dda62acc6233f8b56a716edad2651023e5e"},
{file = "pydantic-1.9.2.tar.gz", hash = "sha256:8cb0bc509bfb71305d7a59d00163d5f9fc4530f0881ea32c74ff4f74c85f3d3d"},
]
pyee = [
{file = "pyee-8.1.0-py2.py3-none-any.whl", hash = "sha256:383973b63ad7ed5e3c0311f8b179c52981f9e7b3eaea0e9a830d13ec34dde65f"},
{file = "pyee-8.1.0.tar.gz", hash = "sha256:92dacc5bd2bdb8f95aa8dd2585d47ca1c4840e2adb95ccf90034d64f725bfd31"},
]
pyfiglet = [
{file = "pyfiglet-0.8.post1-py2.py3-none-any.whl", hash = "sha256:d555bcea17fbeaf70eaefa48bb119352487e629c9b56f30f383e2c62dd67a01c"},
{file = "pyfiglet-0.8.post1.tar.gz", hash = "sha256:c6c2321755d09267b438ec7b936825a4910fec696292139e664ca8670e103639"},
]
pygments = [
{file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"},
{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.7-py3-none-any.whl", hash = "sha256:767d07d9dead0f52f5135545c01f4ed627f9a7918ee86c646d893e24c59db87d"},
{file = "pymdown_extensions-9.7.tar.gz", hash = "sha256:651b0107bc9ee790aedea3673cb88832c0af27d2569cf45c2de06f1d65292e96"},
]
pyparsing = [
{file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"},
{file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"},
@ -2739,21 +2317,13 @@ 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-slugify = [
{file = "python-slugify-6.1.2.tar.gz", hash = "sha256:272d106cb31ab99b3496ba085e3fea0e9e76dcde967b5e9992500d1f785ce4e1"},
{file = "python_slugify-6.1.2-py2.py3-none-any.whl", hash = "sha256:7b2c274c308b62f4269a9ba701aa69a797e9bca41aeee5b3a9e79e36b6656927"},
]
pytz = [
{file = "pytz-2022.5-py2.py3-none-any.whl", hash = "sha256:335ab46900b1465e714b4fda4963d87363264eb662aab5e65da039c25f1f5b22"},
{file = "pytz-2022.5.tar.gz", hash = "sha256:c4d88f472f54d615e9cd582a5004d1e5f624854a6a27a6211591c251f22a6914"},
]
pytz-deprecation-shim = [
{file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"},
{file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"},
{file = "pytz-2022.6-py2.py3-none-any.whl", hash = "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427"},
{file = "pytz-2022.6.tar.gz", hash = "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"},
]
pyyaml = [
{file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
@ -2842,24 +2412,27 @@ rsa = [
{file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"},
]
scikit-learn = [
{file = "scikit-learn-1.1.2.tar.gz", hash = "sha256:7c22d1305b16f08d57751a4ea36071e2215efb4c09cb79183faa4e8e82a3dbf8"},
{file = "scikit_learn-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6c840f662b5d3377c4ccb8be1fc21bb52cb5d8b8790f8d6bf021739f84e543cf"},
{file = "scikit_learn-1.1.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:2b8db962360c93554cab7bb3c096c4a24695da394dd4b3c3f13409f409b425bc"},
{file = "scikit_learn-1.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e7d1fc817867a350133f937aaebcafbc06192517cbdf0cf7e5774ad4d1adb9f"},
{file = "scikit_learn-1.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ec3ea40d467966821843210c02117d82b097b54276fdcfb50f4dfb5c60dbe39"},
{file = "scikit_learn-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:bbef6ea1c012ff9f3e6f6e9ca006b8772d8383e177b898091e68fbd9b3f840f9"},
{file = "scikit_learn-1.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a90ca42fe8242fd6ff56cda2fecc5fca586a88a24ab602d275d2d0dcc0b928fb"},
{file = "scikit_learn-1.1.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a682ec0f82b6f30fb07486daed1c8001b6683cc66b51877644dfc532bece6a18"},
{file = "scikit_learn-1.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c33e16e9a165af6012f5be530ccfbb672e2bc5f9b840238a05eb7f6694304e3f"},
{file = "scikit_learn-1.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f94c0146bad51daef919c402a3da8c1c6162619653e1c00c92baa168fda292f2"},
{file = "scikit_learn-1.1.2-cp38-cp38-win32.whl", hash = "sha256:2f46c6e3ff1054a5ec701646dcfd61d43b8ecac4d416014daed8843cf4c33d4d"},
{file = "scikit_learn-1.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1e706deca9b2ad87ae27dafd5ac4e8eff01b6db492ed5c12cef4735ec5f21ea"},
{file = "scikit_learn-1.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:567417dbbe6a6278399c3e6daf1654414a5a1a4d818d28f251fa7fc28730a1bf"},
{file = "scikit_learn-1.1.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:d6f232779023c3b060b80b5c82e5823723bc424dcac1d1a148aa2492c54d245d"},
{file = "scikit_learn-1.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:589d46f28460469f444b898223b13d99db9463e1038dc581ba698111f612264b"},
{file = "scikit_learn-1.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76800652fb6d6bf527bce36ecc2cc25738b28fe1a17bd294a218fff8e8bd6d50"},
{file = "scikit_learn-1.1.2-cp39-cp39-win32.whl", hash = "sha256:1c8fecb7c9984d9ec2ea48898229f98aad681a0873e0935f2b7f724fbce4a047"},
{file = "scikit_learn-1.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:407e9a1cb9e6ba458a539986a9bd25546a757088095b3aab91d465b79a760d37"},
{file = "scikit-learn-1.1.3.tar.gz", hash = "sha256:bef51978a51ec19977700fe7b86aecea49c825884f3811756b74a3b152bb4e35"},
{file = "scikit_learn-1.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8e9dd76c7274055d1acf4526b8efb16a3531c26dcda714a0c16da99bf9d41900"},
{file = "scikit_learn-1.1.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ee47f68d973cee7009f06edb956f2f5588a0f230f24a2a70175fd0ecf36e2653"},
{file = "scikit_learn-1.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da5a2e95fef9805b1750e4abda4e834bf8835d26fc709a391543b53feee7bd0e"},
{file = "scikit_learn-1.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:701181792a28c82fecae12adb5d15d0ecf57bffab7cf4bdbb52c7b3fd428d540"},
{file = "scikit_learn-1.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:30e27721adc308e8fd9f419f43068e43490005f911edf4476a9e585059fa8a83"},
{file = "scikit_learn-1.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5699cded6c0685426433c7e5afe0fecad80ec831ec7fa264940e50c796775cc5"},
{file = "scikit_learn-1.1.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:2ee2c649f2231b68511aabb0dc827edd8936aad682acc6263c34aed11bc95dac"},
{file = "scikit_learn-1.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d1c1394e38a3319ace620381f6f23cc807d8780e9915c152449a86fc8f1db21"},
{file = "scikit_learn-1.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:250da993701da88bf475e7c5746abf1285ea0ae47e4d0917cd13afd6600bb162"},
{file = "scikit_learn-1.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:fd3ee69d36d42a7dcbb17e355a5653af5fd241a7dfd9133080b3dde8d9e2aafb"},
{file = "scikit_learn-1.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f5644663987ee221f5d1f47a593271b966c271c236fe05634e6bdc06041b5a2b"},
{file = "scikit_learn-1.1.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:748f2bd632d6993e8918d43f1a26c380aeda4e122a88840d4c3a9af99d4239fe"},
{file = "scikit_learn-1.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd55c6fbef7608dbce1f22baf289dfcc6eb323247daa3c3542f73d389c724786"},
{file = "scikit_learn-1.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38814f66285318f2e241305cca545eaa9b4126c65aa5dd78c69371f235f78e2b"},
{file = "scikit_learn-1.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:f4931f2a6c06e02c6c17a05f8ae397e2545965bc7a0a6cb38c8cd7d4fba8624d"},
{file = "scikit_learn-1.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6785b8a3093329bf90ac01801be5525551728ae73edb11baa175df660820add4"},
{file = "scikit_learn-1.1.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:28b2bd6a1419acd522ff45d282c8ba23dbccb5338802ab0ee12baa4ade0aba4c"},
{file = "scikit_learn-1.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23fb9e74b813cc2528b5167d82ed08950b11106ccf50297161875e45152fb311"},
{file = "scikit_learn-1.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5d4231af7199531e77da1b78a4cc6b3d960a00b1ec672578ac818aae2b9c35d"},
{file = "scikit_learn-1.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:4d3a19166d4e1cdfcab975c68f471e046ce01e74c42a9a33fa89a14c2fcedf60"},
]
scipy = [
{file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"},
@ -2977,14 +2550,6 @@ typing-extensions = [
{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.5-py2.py3-none-any.whl", hash = "sha256:323161b22b7802fdc78f20ca5f6073639c64f1a7227c40cd3e19fd1d0ce6650a"},
{file = "tzdata-2022.5.tar.gz", hash = "sha256:e15b2b3005e2546108af42a0eb4ccab4d9e225e2dfbf4f77aad50c70a4b1f3ab"},
]
tzlocal = [
{file = "tzlocal-4.2-py3-none-any.whl", hash = "sha256:89885494684c929d9191c57aa27502afc87a579be5cdd3225c77c463ea043745"},
{file = "tzlocal-4.2.tar.gz", hash = "sha256:ee5842fa3a795f023514ac2d801c4a81d1743bbe642e3940143326b3a00addd7"},
]
ujson = [
{file = "ujson-5.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff4928dc1e9704b567171c16787238201fdbf023665573c12c02146fe1e02eec"},
{file = "ujson-5.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1dc2f46c31ef22b0aaa28cd71be897bea271e700636658d573df9c43c49ebbd0"},
@ -3252,7 +2817,3 @@ yarl = [
{file = "yarl-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:de49d77e968de6626ba7ef4472323f9d2e5a56c1d85b7c0e2a190b2173d3b9be"},
{file = "yarl-1.8.1.tar.gz", hash = "sha256:af887845b8c2e060eb5605ff72b6f2dd2aab7a761379373fd89d314f4752abbf"},
]
zipp = [
{file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"},
{file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"},
]

View File

@ -1,6 +1,6 @@
[tool.poetry]
name = "LittlePaimon"
version = "3.0.0rc1"
version = "3.0.0rc2"
description = "小派蒙原神qq群机器人基于NoneBot2的UID查询、抽卡导出分析、模拟抽卡、实时便签、札记等多功能小助手。"
authors = ["惜月 <277073121@qq.com>"]
license = "AGPL"
@ -14,8 +14,6 @@ url = "https://pypi.tuna.tsinghua.edu.cn/simple"
python = "^3.8"
nonebot2 = "~2.0.0-beta.5"
nonebot-adapter-onebot = "^2.1"
nonebot-plugin-apscheduler = "^0.2.0"
nonebot-plugin-htmlrender = "^0.1.1"
beautifulsoup4 = "^4.10.0"
httpx = "^0.23.0"
lxml = "^4.8.0"

View File

@ -1,93 +1,76 @@
--index-url https://pypi.tuna.tsinghua.edu.cn/simple
aiofiles==0.8.0; python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.7.3" and python_full_version < "4.0.0"
aiosqlite==0.17.0; python_version >= "3.7" and python_version < "4.0"
amis-python==1.0.5; python_version >= "3.7" and python_version < "4.0"
anyio==3.6.2; python_full_version >= "3.6.2" and python_version >= "3.8" and python_version < "4.0"
apscheduler==3.9.1; python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.8"
backports.zoneinfo==0.2.1; python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "3.9" and (python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8") or python_full_version >= "3.5.0" and python_version < "3.9" and python_version >= "3.8" and (python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8")
beautifulsoup4==4.11.1; python_full_version >= "3.6.0"
certifi==2022.9.24; python_version >= "3.7"
click==8.1.3; python_version >= "3.8" and python_version < "4.0"
colorama==0.4.6; python_version >= "3.8" and python_full_version < "3.0.0" and platform_system == "Windows" and python_version < "4.0" and sys_platform == "win32" or python_full_version >= "3.7.0" and platform_system == "Windows" and python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32"
contourpy==1.0.5; python_version >= "3.8"
contourpy==1.0.6; python_version >= "3.8"
cycler==0.11.0; python_version >= "3.8"
ecdsa==0.18.0; python_version >= "2.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0"
expandvars==0.9.0; python_version >= "3.4"
fastapi==0.79.1; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.3" and python_full_version < "4.0.0"
fastapi==0.79.1; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.6.1"
fonttools==4.38.0; python_version >= "3.8"
gitdb==4.0.9; python_version >= "3.7"
gitpython==3.1.29; python_version >= "3.7"
greenlet==1.1.3; python_full_version >= "3.7.3" and python_full_version < "4.0.0" and python_version >= "3.7"
h11==0.12.0; python_version >= "3.8" and python_version < "4.0"
httpcore==0.15.0; python_version >= "3.7"
httptools==0.5.0; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.5.0"
httpx==0.23.0; python_version >= "3.7"
idna==3.4
importlib-metadata==5.0.0; python_full_version >= "3.7.3" and python_full_version < "4.0.0" and python_version >= "3.7" and python_version < "3.10"
iso8601==1.1.0; python_full_version >= "3.6.2" and python_version < "4.0" and python_version >= "3.7"
jieba==0.42.1
jinja2==3.1.2; python_full_version >= "3.7.3" and python_full_version < "4.0.0" and python_version >= "3.7" and python_version < "4.0"
jinja2==3.1.2; python_version >= "3.7" and python_version < "4.0"
joblib==1.2.0; python_version >= "3.8"
kiwisolver==1.4.4; python_version >= "3.8"
loguru==0.6.0; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.3" and python_full_version < "4.0.0"
loguru==0.6.0; python_version >= "3.8" and python_version < "4.0"
lxml==4.9.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.5.0")
markdown==3.4.1; python_full_version >= "3.7.3" and python_full_version < "4.0.0" and python_version >= "3.7"
markupsafe==2.1.1; python_full_version >= "3.7.3" and python_full_version < "4.0.0" and python_version >= "3.7" and python_version < "4.0"
markupsafe==2.1.1; python_version >= "3.7" and python_version < "4.0"
matplotlib==3.6.1; python_version >= "3.8"
msgpack==1.0.4; python_version >= "3.8" and python_version < "4.0"
multidict==6.0.2; python_version >= "3.8" and python_version < "4.0"
nonebot-adapter-onebot==2.1.5; python_version >= "3.8" and python_version < "4.0"
nonebot-plugin-apscheduler==0.2.0; python_version >= "3.8" and python_version < "4.0"
nonebot-plugin-htmlrender==0.1.1; python_full_version >= "3.7.3" and python_full_version < "4.0.0"
nonebot2==2.0.0rc1; python_version >= "3.8" and python_version < "4.0"
numpy==1.23.4; python_version >= "3.8"
packaging==21.3; python_version >= "3.8"
pillow==9.2.0; python_version >= "3.7"
playwright==1.27.1; python_full_version >= "3.7.3" and python_full_version < "4.0.0" and python_version >= "3.7"
pillow==9.3.0; python_version >= "3.7"
psutil==5.9.3; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0")
pyasn1==0.4.8; python_version >= "3.6" and python_version < "4"
pydantic==1.9.2; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.3" and python_full_version < "4.0.0"
pyee==8.1.0; python_full_version >= "3.7.3" and python_full_version < "4.0.0" and python_version >= "3.7"
pygments==2.13.0; python_full_version >= "3.7.3" and python_full_version < "4.0.0" and python_version >= "3.6"
pygtrie==2.5.0; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.3" and python_full_version < "4.0.0"
pymdown-extensions==9.7; python_full_version >= "3.7.3" and python_full_version < "4.0.0" and python_version >= "3.7"
pydantic==1.9.2; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.6.1"
pygtrie==2.5.0; python_version >= "3.8" and python_version < "4.0"
pyparsing==3.0.9; python_full_version >= "3.6.8" and python_version >= "3.8"
pypika-tortoise==0.1.6; python_version >= "3.7" and python_version < "4.0"
pypinyin==0.47.1; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0" and python_version < "4")
python-dateutil==2.8.2; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.8"
python-dotenv==0.21.0
python-jose==3.3.0
python-markdown-math==0.8; python_full_version >= "3.7.3" and python_full_version < "4.0.0" and python_version >= "3.6"
pytz-deprecation-shim==0.1.0.post0; python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8"
pytz==2022.5; python_version >= "3.7" and python_version < "4.0" and (python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.8")
pytz==2022.6; python_version >= "3.7" and python_version < "4.0"
pyyaml==6.0; python_version >= "3.8" and python_version < "4.0"
rfc3986==1.5.0; python_version >= "3.7"
rsa==4.9; python_version >= "3.6" and python_version < "4"
ruamel.yaml.clib==0.2.7; platform_python_implementation == "CPython" and python_version < "3.11" and python_version >= "3.5"
ruamel.yaml==0.17.21; python_version >= "3"
scikit-learn==1.1.2; python_version >= "3.8"
scikit-learn==1.1.3; python_version >= "3.8"
scipy==1.9.3; python_version >= "3.8"
setuptools-scm==7.0.5; python_version >= "3.8"
shapely==1.8.5.post1; python_version >= "3.6"
six==1.16.0; python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.8"
six==1.16.0; python_version >= "3.8" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.8"
smmap==5.0.0; python_version >= "3.7"
sniffio==1.3.0; python_full_version >= "3.6.2" and python_version >= "3.8" and python_version < "4.0"
soupsieve==2.3.2.post1; python_version >= "3.6" and python_full_version >= "3.6.0"
starlette==0.19.1; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.6.1"
threadpoolctl==3.1.0; python_version >= "3.8"
tomli==2.0.1; python_version >= "3.8"
tomlkit==0.10.2; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.3" and python_full_version < "4.0.0"
tomlkit==0.10.2; python_version >= "3.8" and python_version < "4.0"
tortoise-orm==0.19.2; python_version >= "3.7" and python_version < "4.0"
tqdm==4.64.1; (python_version >= "2.7" and python_full_version < "3.0.0") or (python_full_version >= "3.4.0")
typing-extensions==4.4.0; python_version >= "3.8" and python_version <= "3.8" and python_full_version >= "3.7.3" and python_full_version < "4.0.0"
tzdata==2022.5; python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" and platform_system == "Windows" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.8" and platform_system == "Windows"
tzlocal==4.2; python_version >= "3.8" and python_full_version < "3.0.0" and python_version < "4.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.8"
typing-extensions==4.4.0; python_version >= "3.8" and python_version < "3.10" and python_full_version >= "3.6.1"
ujson==5.5.0; python_version >= "3.7"
uvicorn==0.18.3; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.3" and python_full_version < "4.0.0"
uvicorn==0.18.3; python_version >= "3.8" and python_version < "4.0"
uvloop==0.17.0; sys_platform != "win32" and sys_platform != "cygwin" and platform_python_implementation != "PyPy" and python_version >= "3.8" and python_version < "4.0"
watchfiles==0.18.0; python_version >= "3.8" and python_version < "4.0"
websockets==10.4; python_version >= "3.8" and python_version < "4.0"
win32-setctime==1.1.0; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32"
yarl==1.8.1; python_version >= "3.8" and python_version < "4.0" and python_full_version >= "3.7.3" and python_full_version < "4.0.0"
zipp==3.10.0; python_full_version >= "3.7.3" and python_full_version < "4.0.0" and python_version >= "3.7" and python_version < "3.10"
yarl==1.8.1; python_version >= "3.8" and python_version < "4.0"