├── .editorconfig ├── .github ├── actions │ └── setup-python │ │ └── action.yml └── workflows │ ├── publish.yml │ └── ruff.yml ├── .gitignore ├── .pre-commit-config.yaml ├── LICENSE ├── README.md ├── docs ├── NoneBotPlugin.svg └── rendering.png ├── nonebot_plugin_lxns_maimai ├── __init__.py ├── apis │ ├── __init__.py │ └── request.py ├── config.py ├── exception.py ├── filters.py ├── migrations │ └── ce7ee9d4e359_first_revision.py ├── model.py ├── render.py ├── resources │ ├── fonts │ │ ├── SourceHanSans-Bold.otf │ │ ├── SourceHanSans-Heavy.otf │ │ ├── SourceHanSans-Medium.otf │ │ ├── SourceHanSans-Normal.otf │ │ └── SourceHanSans-Regular.otf │ ├── images │ │ ├── canvas.png │ │ ├── default_icon.png │ │ └── default_nameplate.png │ └── templates │ │ ├── best50.html.jinja2 │ │ ├── icons.macros.html.jinja2 │ │ ├── index.css │ │ └── macros.html.jinja2 ├── schema │ ├── __init__.py │ ├── alias.py │ ├── collection.py │ ├── enum │ │ ├── __init__.py │ │ ├── fctype.py │ │ ├── fstype.py │ │ ├── levelindex.py │ │ ├── ratetype.py │ │ └── songtype.py │ ├── genre.py │ ├── notes.py │ ├── player.py │ ├── score.py │ ├── song.py │ ├── trend.py │ └── version.py └── utils.py ├── pdm.lock └── pyproject.toml /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | # The JSON files contain newlines inconsistently 13 | [*.json] 14 | insert_final_newline = ignore 15 | 16 | [*.md] 17 | trim_trailing_whitespace = false 18 | 19 | [{*.py,*.pyi}] 20 | indent_size = 4 -------------------------------------------------------------------------------- /.github/actions/setup-python/action.yml: -------------------------------------------------------------------------------- 1 | name: Setup Python 2 | description: Setup Python 3 | 4 | inputs: 5 | python-version: 6 | description: Python version 7 | required: false 8 | default: "3.10" 9 | 10 | runs: 11 | using: "composite" 12 | steps: 13 | - name: Install PDM 14 | run: pipx install pdm 15 | shell: bash 16 | 17 | - name: Setup PDM 18 | uses: pdm-project/setup-pdm@v3 19 | with: 20 | python-version: ${{ inputs.python-version }} 21 | architecture: "x64" 22 | cache: true 23 | 24 | - name: Install dependencies 25 | run: pdm install 26 | shell: bash 27 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish 2 | 3 | on: 4 | push: 5 | tags: 6 | - '*' 7 | workflow_dispatch: 8 | 9 | jobs: 10 | pypi-publish: 11 | name: Upload release to PyPI 12 | runs-on: ubuntu-latest 13 | environment: 14 | name: release 15 | url: https://pypi.org/p/nonebot-plugin-lxns-maimai 16 | permissions: 17 | id-token: write 18 | steps: 19 | - uses: actions/checkout@master 20 | 21 | - name: Setup Python environment 22 | uses: ./.github/actions/setup-python 23 | 24 | - name: Install pypa/build 25 | run: >- 26 | python -m 27 | pip install 28 | build 29 | --user 30 | - name: Build a binary wheel and a source tarball 31 | run: >- 32 | python -m 33 | build 34 | --sdist 35 | --wheel 36 | --outdir dist/ 37 | . 38 | - name: Publish distribution to PyPI 39 | uses: pypa/gh-action-pypi-publish@release/v1 40 | -------------------------------------------------------------------------------- /.github/workflows/ruff.yml: -------------------------------------------------------------------------------- 1 | name: Ruff Lint 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | 9 | jobs: 10 | ruff: 11 | name: Ruff Lint 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v4 15 | 16 | - name: Run Ruff Lint 17 | uses: chartboost/ruff-action@v1 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/latest/usage/project/#working-with-version-control 110 | .pdm.toml 111 | .pdm-python 112 | .pdm-build/ 113 | 114 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 115 | __pypackages__/ 116 | 117 | # Celery stuff 118 | celerybeat-schedule 119 | celerybeat.pid 120 | 121 | # SageMath parsed files 122 | *.sage.py 123 | 124 | # Environments 125 | .env 126 | .venv 127 | env/ 128 | venv/ 129 | ENV/ 130 | env.bak/ 131 | venv.bak/ 132 | 133 | # Spyder project settings 134 | .spyderproject 135 | .spyproject 136 | 137 | # Rope project settings 138 | .ropeproject 139 | 140 | # mkdocs documentation 141 | /site 142 | 143 | # mypy 144 | .mypy_cache/ 145 | .dmypy.json 146 | dmypy.json 147 | 148 | # Pyre type checker 149 | .pyre/ 150 | 151 | # pytype static type analyzer 152 | .pytype/ 153 | 154 | # Cython debug symbols 155 | cython_debug/ 156 | 157 | # PyCharm 158 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 159 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 160 | # and can be added to the global gitignore or merged into this file. For a more nuclear 161 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 162 | .idea/ 163 | 164 | data 165 | /bot.py 166 | /maimai.db 167 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | default_install_hook_types: [pre-commit, prepare-commit-msg] 2 | ci: 3 | autofix_commit_msg: ":rotating_light: auto fix by pre-commit hooks" 4 | autofix_prs: true 5 | autoupdate_branch: master 6 | autoupdate_schedule: monthly 7 | autoupdate_commit_msg: ":arrow_up: auto update by pre-commit hooks" 8 | repos: 9 | - repo: https://github.com/astral-sh/ruff-pre-commit 10 | rev: v0.11.4 11 | hooks: 12 | - id: ruff 13 | args: [--fix, --exit-non-zero-on-fix] 14 | stages: [pre-commit] 15 | 16 | - repo: https://github.com/pycqa/isort 17 | rev: 6.0.1 18 | hooks: 19 | - id: isort 20 | stages: [pre-commit] 21 | 22 | - repo: https://github.com/psf/black 23 | rev: 25.1.0 24 | hooks: 25 | - id: black 26 | stages: [pre-commit] 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Komorebi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | logo 5 | 6 |
7 | 8 |
9 | 10 | # NoneBot-Plugin-MaiMai 11 | 12 | _✨ NoneBot maimai DX 查分插件 ✨_ 13 | 14 | 15 | pypi 16 | 17 | python 18 | 19 | pdm-managed 20 | 21 | 22 | alc-resolved 23 | 24 | 25 |
26 | 27 | 28 | NoneBot Registry 29 | 30 | 31 | Supported Adapters 32 | 33 | 34 |
35 | 36 | 37 | 📸 演示与预览 38 | 39 |   |   40 | 41 | 📦️ 下载插件 42 | 43 |   |   44 | 45 | 💬 加入交流群 46 | 47 | 48 |
49 | 50 | ## 📖 介绍 51 | 52 | NoneBot maimai DX 查询插件。 53 | 54 | ## 🎉 配置 & 使用 55 | 56 | 详见 Wiki:[📖 这里](https://github.com/KomoriDev/nonebot-plugin-lxns-maimai/wiki) 57 | 58 | ## 📸 效果图 59 | 60 | rendering 61 | 62 | ## 💖 鸣谢 63 | 64 | - [@Lxns-Network](https://github.com/Lxns-Network):提供了超棒的 maimai DX 查分器 65 | - [@星鹿ELEC](https://space.bilibili.com/628990513):绘制了好康的 Best 50 查分图 66 | 67 | ## 📄 许可证 68 | 69 | 本项目使用 [MIT](./LICENSE) 许可证开源 70 | 71 | ```text 72 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 73 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 74 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 75 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 76 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 77 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 78 | SOFTWARE. 79 | ``` 80 | -------------------------------------------------------------------------------- /docs/rendering.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/docs/rendering.png -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/__init__.py: -------------------------------------------------------------------------------- 1 | import httpx 2 | from nonebot import require 3 | from nonebot.rule import Rule 4 | from nonebot.log import logger 5 | from nonebot.plugin import PluginMetadata, inherit_supported_adapters 6 | 7 | require("nonebot_plugin_orm") 8 | require("nonebot_plugin_user") 9 | require("nonebot_plugin_waiter") 10 | require("nonebot_plugin_alconna") 11 | require("nonebot_plugin_htmlrender") 12 | from nonebot_plugin_waiter import prompt 13 | from nonebot_plugin_user import UserSession 14 | from nonebot_plugin_orm import async_scoped_session 15 | from nonebot_plugin_alconna.uniseg import Button, UniMessage, FallbackStrategy 16 | from nonebot_plugin_alconna import Args, Match, Option, Alconna, CommandMeta, on_alconna 17 | 18 | from .apis import API 19 | from . import migrations 20 | from .render import render_b50 21 | from .schema import RenderProps 22 | from .config import Config, config 23 | from .model import User, bind_user 24 | from .exception import FetchUserException 25 | 26 | __plugin_meta__ = PluginMetadata( 27 | name="maimai DX 查分", 28 | description="maimai DX 查分插件", 29 | usage="/m b50", 30 | type="application", 31 | homepage="https://github.com/KomoriDev/nonebot-plugin-lxns-maimai", 32 | config=Config, 33 | supported_adapters=inherit_supported_adapters( 34 | "nonebot_plugin_alconna", "nonebot_plugin_user" 35 | ), 36 | extra={ 37 | "unique_name": "maimai dx", 38 | "orm_version_location": migrations, 39 | "author": "Komorebi ", 40 | "version": "0.1.2", 41 | }, 42 | ) 43 | 44 | 45 | if not config.api_token: 46 | logger.warning("缺失必要配置项,已禁用该插件") 47 | 48 | 49 | def is_enable() -> Rule: 50 | 51 | def _rule() -> bool: 52 | return bool(config.api_token) 53 | 54 | return Rule(_rule) 55 | 56 | 57 | mai = on_alconna( 58 | Alconna( 59 | "mai", 60 | Option("bind", Args["friend_code?#好友码", int], help_text="绑定好友码"), 61 | Option("best50", alias={"b50"}, help_text="查询 Best50"), 62 | meta=CommandMeta( 63 | description="maimai DX 查分", 64 | usage=__plugin_meta__.usage, 65 | example="/mai bind 123456; /mai b50", 66 | compact=True, 67 | ), 68 | ), 69 | rule=is_enable(), 70 | aliases={"m", "maimai"}, 71 | use_cmd_start=True, 72 | ) 73 | 74 | 75 | @mai.assign("bind") 76 | async def _(friend_code: Match[int], user_session: UserSession): 77 | if friend_code.available: 78 | result = friend_code.result 79 | else: 80 | result = await prompt("请输入好友码", timeout=30) 81 | if result is None: 82 | await ( 83 | UniMessage.text("等待超时") 84 | .keyboard(Button("input", label="重试", text="/mai bind")) 85 | .finish(at_sender=True, fallback=FallbackStrategy.ignore) 86 | ) 87 | result = result.extract_plain_text() 88 | try: 89 | player = await API.get_player_info(int(result)) 90 | await bind_user(user_session.user_id, player.friend_code) 91 | await ( 92 | UniMessage.text(f"绑定成功!欢迎 {player.name}") 93 | .keyboard(Button("input", label="查询 Best50", text="/mai b50")) 94 | .finish(at_sender=True, fallback=FallbackStrategy.ignore) 95 | ) 96 | except FetchUserException as e: 97 | await ( 98 | UniMessage.text(f"绑定失败: {str(e)}") 99 | .keyboard(Button("input", label="重试", text="/mai bind")) 100 | .finish(at_sender=True, fallback=FallbackStrategy.ignore) 101 | ) 102 | 103 | 104 | @mai.assign("best50") 105 | async def _(db_session: async_scoped_session, user_session: UserSession): 106 | user = await db_session.get(User, user_session.user_id) 107 | if user is None: 108 | await ( 109 | UniMessage.text("暂未绑定 maimai DX 查分器账号。") 110 | .text("使用 /mai bind 命令进行绑定") 111 | .keyboard(Button("input", label="Bind", text="/mai bind")) 112 | .finish(at_sender=True, fallback=FallbackStrategy.ignore) 113 | ) 114 | try: 115 | standard_total, dx_total, standard, dx = await API.get_bests(user.friend_code) 116 | player = await API.get_player_info(user.friend_code) 117 | props = RenderProps( 118 | player=player, 119 | standard_total=standard_total, 120 | dx_total=dx_total, 121 | standard=standard, 122 | dx=dx, 123 | ) 124 | await UniMessage.image(raw=await render_b50(props)).finish(at_sender=True) 125 | except FetchUserException as e: 126 | await ( 127 | UniMessage.text(f"Best 50 查询失败: {str(e)}") 128 | .keyboard(Button("input", label="重试", text="/mai b50")) 129 | .finish(at_sender=True, fallback=FallbackStrategy.ignore) 130 | ) 131 | except httpx.ConnectError: 132 | await ( 133 | UniMessage.text("Best 50 查询失败: 网络超时,请稍后再试") 134 | .keyboard(Button("input", label="重试", text="/mai b50")) 135 | .finish(at_sender=True, fallback=FallbackStrategy.ignore) 136 | ) 137 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/apis/__init__.py: -------------------------------------------------------------------------------- 1 | from .request import API as API 2 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/apis/request.py: -------------------------------------------------------------------------------- 1 | from io import BytesIO 2 | 3 | import httpx 4 | 5 | from ..config import config 6 | from ..exception import FetchUserException 7 | from ..schema import Song, Score, Trend, Player 8 | 9 | url = config.api_url 10 | token = config.api_token 11 | 12 | 13 | class API: 14 | headers = {"Authorization": token} 15 | 16 | @classmethod 17 | async def get_player_info(cls, friend_code: int) -> Player: 18 | """ 19 | 通过好友码获取玩家信息。 20 | 当好友码被绑定时,需要查分器用户开启 `allow_third_party_fetch_player` 权限。 21 | """ 22 | async with httpx.AsyncClient() as client: 23 | response = await client.get( 24 | url=f"{url}/player/{friend_code}", headers=cls.headers 25 | ) 26 | if response.status_code != 200: 27 | raise FetchUserException(response.json()["message"]) 28 | return Player(**response.json()["data"]) 29 | 30 | @classmethod 31 | async def get_rating_trend(cls, friend_code: int) -> Trend: 32 | """ 33 | DX Rating 趋势 34 | 当好友码被绑定时,需要查分器用户开启 `allow_third_party_fetch_history` 权限。 35 | """ 36 | async with httpx.AsyncClient() as client: 37 | response = await client.get( 38 | url=f"{url}/player/{friend_code}/trend", headers=cls.headers 39 | ) 40 | if response.status_code != 200: 41 | raise FetchUserException(response.json()["message"]) 42 | return Trend(**response.json()["data"]) 43 | 44 | @classmethod 45 | async def get_bests( 46 | cls, friend_code: int 47 | ) -> tuple[int, int, list[Score], list[Score]]: 48 | """ 49 | 获取玩家缓存的 Best50 50 | Args: 51 | friend_code: 好友码 52 | 53 | Returns: 54 | standard_total: 旧版本谱面 Best 35 总分 55 | dx_total: 现版本谱面 Best 15 总分 56 | standard: 旧版本谱面 Best 35 列表 57 | dx: 现版本谱面 Best 15 列表 58 | """ 59 | async with httpx.AsyncClient() as client: 60 | response = await client.get( 61 | url=f"{url}/player/{friend_code}/bests", headers=cls.headers 62 | ) 63 | if response.status_code != 200: 64 | raise FetchUserException(response.json()["message"]) 65 | data = response.json()["data"] 66 | standard_scores = [Score(**score) for score in data["standard"]] 67 | dx_scores = [Score(**score) for score in data["dx"]] 68 | return data["standard_total"], data["dx_total"], standard_scores, dx_scores 69 | 70 | @classmethod 71 | async def get_song_info(cls, song_id: int) -> Song: 72 | async with httpx.AsyncClient() as client: 73 | response = await client.get(f"{url}/song/{song_id}") 74 | return Song(**response.json()) 75 | 76 | @classmethod 77 | async def download_player_icon(cls, player: Player) -> BytesIO | bytes: 78 | if not player.icon: 79 | return BytesIO() 80 | async with httpx.AsyncClient() as client: 81 | response = await client.get( 82 | f"https://assets.lxns.net/maimai/icon/{player.icon.id}.png!webp" 83 | ) 84 | return BytesIO(response.content) 85 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/config.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | from pydantic import Field, BaseModel 4 | from nonebot.plugin import get_plugin_config 5 | 6 | RESOURCES_DIR: Path = Path(__file__).parent / "resources" 7 | IMAGES_DIR: Path = RESOURCES_DIR / "images" 8 | TEMPLATES_DIR: Path = RESOURCES_DIR / "templates" 9 | 10 | COURSE_RANK = [ 11 | "初学者", 12 | "初段", 13 | "二段", 14 | "三段", 15 | "四段", 16 | "五段", 17 | "六段", 18 | "七段", 19 | "八段", 20 | "九段", 21 | "十段", 22 | "真传", 23 | "真初段", 24 | "真二段", 25 | "真三段", 26 | "真四段", 27 | "真五段", 28 | "真六段", 29 | "真七段", 30 | "真八段", 31 | "真九段", 32 | "真十段", 33 | "真皆传", 34 | "里皆传", 35 | ] 36 | 37 | 38 | class ScopedConfig(BaseModel): 39 | api_url: str = "https://maimai.lxns.net/api/v0/maimai" 40 | api_token: str = "" 41 | 42 | 43 | class Config(BaseModel): 44 | maimai: ScopedConfig = Field(default_factory=ScopedConfig) 45 | """MaiMai Config""" 46 | 47 | 48 | config = get_plugin_config(Config).maimai 49 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/exception.py: -------------------------------------------------------------------------------- 1 | class FetchUserException(Exception): 2 | """Fetch User Info Field""" 3 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/filters.py: -------------------------------------------------------------------------------- 1 | from .config import COURSE_RANK 2 | from .schema.enum import LevelIndex 3 | 4 | 5 | def level_index_to_color(level_index: LevelIndex) -> tuple[str, str]: 6 | match level_index: 7 | case LevelIndex.BASIC: 8 | return "#E1FFE9", "#00FF4430" 9 | case LevelIndex.ADVANCED: 10 | return "#FFF7E1", "#FBFF0030" 11 | case LevelIndex.EXPERT: 12 | return "#FFE1E1", "#FF000030" 13 | case LevelIndex.MASTER: 14 | return "#E7E1FF", "#A100FF30" 15 | case LevelIndex.RE_MASTER: 16 | return "#F0F0F0", "#80808030" 17 | case _: 18 | return "#E1FFE9", "#00FF4430" 19 | 20 | 21 | def star_count_to_color(count: int): 22 | if count == 1 or count == 2: 23 | return "#25FF00", "#0DFF00" 24 | elif count == 3 or count == 4: 25 | return "#FF5100", "#FF0000" 26 | else: 27 | return "#FFCF00", "#FFFB00" 28 | 29 | 30 | def course_rank_id_to_text(course_rank: int) -> str: 31 | return COURSE_RANK[course_rank] 32 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/migrations/ce7ee9d4e359_first_revision.py: -------------------------------------------------------------------------------- 1 | """first revision 2 | 3 | 迁移 ID: ce7ee9d4e359 4 | 父迁移: 5 | 创建时间: 2024-08-21 13:01:53.113592 6 | 7 | """ 8 | 9 | from __future__ import annotations 10 | 11 | from collections.abc import Sequence 12 | 13 | import sqlalchemy as sa 14 | from alembic import op 15 | 16 | revision: str = "ce7ee9d4e359" 17 | down_revision: str | Sequence[str] | None = None 18 | branch_labels: str | Sequence[str] | None = ("nonebot_plugin_lxns_maimai",) 19 | depends_on: str | Sequence[str] | None = None 20 | 21 | 22 | def upgrade(name: str = "") -> None: 23 | if name: 24 | return 25 | # ### commands auto generated by Alembic - please adjust! ### 26 | op.create_table( 27 | "nonebot_plugin_lxns_maimai_user", 28 | sa.Column("id", sa.Integer(), nullable=False), 29 | sa.Column("friend_code", sa.Integer(), nullable=False), 30 | sa.PrimaryKeyConstraint("id", name=op.f("pk_nonebot_plugin_lxns_maimai_user")), 31 | info={"bind_key": "nonebot_plugin_lxns_maimai"}, 32 | ) 33 | # ### end Alembic commands ### 34 | 35 | 36 | def downgrade(name: str = "") -> None: 37 | if name: 38 | return 39 | # ### commands auto generated by Alembic - please adjust! ### 40 | op.drop_table("nonebot_plugin_lxns_maimai_user") 41 | # ### end Alembic commands ### 42 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/model.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy.orm import Mapped, mapped_column 2 | from nonebot_plugin_orm import Model, get_session 3 | 4 | 5 | class User(Model): 6 | 7 | id: Mapped[int] = mapped_column(primary_key=True) 8 | """用户 ID""" 9 | friend_code: Mapped[int] 10 | """好友码""" 11 | 12 | 13 | async def bind_user(id: int, friend_code: int) -> User: 14 | session = get_session() 15 | async with session.begin(): 16 | user = await session.get(User, id) 17 | 18 | if not user: 19 | user = User(friend_code=friend_code) 20 | session.add(user) 21 | 22 | return user 23 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/render.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | 3 | from nonebot_plugin_htmlrender import template_to_pic 4 | 5 | from .schema import RenderProps 6 | from .config import TEMPLATES_DIR 7 | from .utils import calc_star_count 8 | from .filters import star_count_to_color, level_index_to_color, course_rank_id_to_text 9 | 10 | 11 | async def render_b50(props: RenderProps) -> bytes: 12 | tasks = [calc_star_count(score) for score in props.standard + props.dx] 13 | star_counts = await asyncio.gather(*tasks) 14 | 15 | for score, star_count in zip(props.standard + props.dx, star_counts): 16 | score.star_count = star_count # type: ignore 17 | 18 | return await template_to_pic( 19 | template_path=str(TEMPLATES_DIR), 20 | template_name="best50.html.jinja2", 21 | templates={ 22 | "player": props.player, 23 | "standard_total": props.standard_total, 24 | "dx_total": props.dx_total, 25 | "standard": props.standard, 26 | "dx": props.dx, 27 | }, 28 | filters={ 29 | "level_index_to_color": level_index_to_color, 30 | "star_count_to_color": star_count_to_color, 31 | "course_rank_id_to_text": course_rank_id_to_text, 32 | }, 33 | pages={ 34 | "viewport": {"width": 1080, "height": 1512}, 35 | "base_url": f"file://{TEMPLATES_DIR}", 36 | }, 37 | ) 38 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Bold.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Bold.otf -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Heavy.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Heavy.otf -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Medium.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Medium.otf -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Normal.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Normal.otf -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Regular.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/fonts/SourceHanSans-Regular.otf -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/resources/images/canvas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/images/canvas.png -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/resources/images/default_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/images/default_icon.png -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/resources/images/default_nameplate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/KomoriDev/nonebot-plugin-lxns-maimai/f9797b3eaad96e661533152701d85288d4f47e09/nonebot_plugin_lxns_maimai/resources/images/default_nameplate.png -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/resources/templates/best50.html.jinja2: -------------------------------------------------------------------------------- 1 | {% from 'macros.html.jinja2' import header, song_card %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | Best 50 11 | 14 | 15 | 16 | 17 |
18 |
19 | {{ header(player, standard_total, dx_total) }} 20 |
21 | 22 |
23 | {% for score in standard %} 24 | {{ song_card(score, loop.index) }} 25 | {% endfor %} 26 |
27 | 28 |
29 | {% for score in dx %} 30 | {{ song_card(score, loop.index) }} 31 | {% endfor %} 32 |
33 | 34 |
Generated by nonebot-plugin-lxns-maimai | UI Design:星鹿ELEC
35 |
36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/resources/templates/icons.macros.html.jinja2: -------------------------------------------------------------------------------- 1 | {% macro app() %} 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | AP+ 30 |
31 | {% endmacro %} 32 | 33 | {% macro ap() %} 34 |
35 | 36 | 37 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 50 | 51 | 52 | 53 | AP 54 |
55 | {% endmacro %} 56 | 57 | {% macro fcp() %} 58 |
59 | 60 | 61 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | FC+ 87 |
88 | {% endmacro %} 89 | 90 | {% macro fc() %} 91 |
92 | 93 | 94 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 107 | 108 | 109 | 110 | FC 111 |
112 | {% endmacro %} 113 | 114 | {% macro fsdp() %} 115 |
116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | FDX+ 143 |
144 | {% endmacro %} 145 | 146 | {% macro fsd() %} 147 |
148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | FDX 165 |
166 | {% endmacro %} 167 | 168 | {% macro fsp() %} 169 |
170 | 171 | 172 | 174 | 175 | 176 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | FS+ 200 |
201 | {% endmacro %} 202 | 203 | {% macro fs() %} 204 |
205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | FS 222 |
223 | {% endmacro %} 224 | 225 | {% macro sync() %} 226 |
227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | SP 244 |
245 | {% endmacro %} 246 | 247 | {% macro null() %} 248 |
249 |
250 |
251 | {% endmacro %} 252 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/resources/templates/index.css: -------------------------------------------------------------------------------- 1 | /* 2 | ! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com 3 | */ 4 | 5 | /* 6 | 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 7 | 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) 8 | */ 9 | 10 | *, 11 | ::before, 12 | ::after { 13 | box-sizing: border-box; 14 | /* 1 */ 15 | border-width: 0; 16 | /* 2 */ 17 | border-style: solid; 18 | /* 2 */ 19 | border-color: #e5e7eb; 20 | /* 2 */ 21 | } 22 | 23 | ::before, 24 | ::after { 25 | --tw-content: ''; 26 | } 27 | 28 | /* 29 | 1. Use a consistent sensible line-height in all browsers. 30 | 2. Prevent adjustments of font size after orientation changes in iOS. 31 | 3. Use a more readable tab size. 32 | 4. Use the user's configured `sans` font-family by default. 33 | 5. Use the user's configured `sans` font-feature-settings by default. 34 | 6. Use the user's configured `sans` font-variation-settings by default. 35 | 7. Disable tap highlights on iOS 36 | */ 37 | 38 | html, 39 | :host { 40 | line-height: 1.5; 41 | /* 1 */ 42 | -webkit-text-size-adjust: 100%; 43 | /* 2 */ 44 | -moz-tab-size: 4; 45 | /* 3 */ 46 | -o-tab-size: 4; 47 | tab-size: 4; 48 | /* 3 */ 49 | font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; 50 | /* 4 */ 51 | font-feature-settings: normal; 52 | /* 5 */ 53 | font-variation-settings: normal; 54 | /* 6 */ 55 | -webkit-tap-highlight-color: transparent; 56 | /* 7 */ 57 | } 58 | 59 | /* 60 | 1. Remove the margin in all browsers. 61 | 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. 62 | */ 63 | 64 | body { 65 | margin: 0; 66 | /* 1 */ 67 | line-height: inherit; 68 | /* 2 */ 69 | } 70 | 71 | /* 72 | 1. Add the correct height in Firefox. 73 | 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) 74 | 3. Ensure horizontal rules are visible by default. 75 | */ 76 | 77 | hr { 78 | height: 0; 79 | /* 1 */ 80 | color: inherit; 81 | /* 2 */ 82 | border-top-width: 1px; 83 | /* 3 */ 84 | } 85 | 86 | /* 87 | Add the correct text decoration in Chrome, Edge, and Safari. 88 | */ 89 | 90 | abbr:where([title]) { 91 | -webkit-text-decoration: underline dotted; 92 | text-decoration: underline dotted; 93 | } 94 | 95 | /* 96 | Remove the default font size and weight for headings. 97 | */ 98 | 99 | h1, 100 | h2, 101 | h3, 102 | h4, 103 | h5, 104 | h6 { 105 | font-size: inherit; 106 | font-weight: inherit; 107 | } 108 | 109 | /* 110 | Reset links to optimize for opt-in styling instead of opt-out. 111 | */ 112 | 113 | a { 114 | color: inherit; 115 | text-decoration: inherit; 116 | } 117 | 118 | /* 119 | Add the correct font weight in Edge and Safari. 120 | */ 121 | 122 | b, 123 | strong { 124 | font-weight: bolder; 125 | } 126 | 127 | /* 128 | 1. Use the user's configured `mono` font-family by default. 129 | 2. Use the user's configured `mono` font-feature-settings by default. 130 | 3. Use the user's configured `mono` font-variation-settings by default. 131 | 4. Correct the odd `em` font sizing in all browsers. 132 | */ 133 | 134 | code, 135 | kbd, 136 | samp, 137 | pre { 138 | font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 139 | /* 1 */ 140 | font-feature-settings: normal; 141 | /* 2 */ 142 | font-variation-settings: normal; 143 | /* 3 */ 144 | font-size: 1em; 145 | /* 4 */ 146 | } 147 | 148 | /* 149 | Add the correct font size in all browsers. 150 | */ 151 | 152 | small { 153 | font-size: 80%; 154 | } 155 | 156 | /* 157 | Prevent `sub` and `sup` elements from affecting the line height in all browsers. 158 | */ 159 | 160 | sub, 161 | sup { 162 | font-size: 75%; 163 | line-height: 0; 164 | position: relative; 165 | vertical-align: baseline; 166 | } 167 | 168 | sub { 169 | bottom: -0.25em; 170 | } 171 | 172 | sup { 173 | top: -0.5em; 174 | } 175 | 176 | /* 177 | 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) 178 | 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) 179 | 3. Remove gaps between table borders by default. 180 | */ 181 | 182 | table { 183 | text-indent: 0; 184 | /* 1 */ 185 | border-color: inherit; 186 | /* 2 */ 187 | border-collapse: collapse; 188 | /* 3 */ 189 | } 190 | 191 | /* 192 | 1. Change the font styles in all browsers. 193 | 2. Remove the margin in Firefox and Safari. 194 | 3. Remove default padding in all browsers. 195 | */ 196 | 197 | button, 198 | input, 199 | optgroup, 200 | select, 201 | textarea { 202 | font-family: inherit; 203 | /* 1 */ 204 | font-feature-settings: inherit; 205 | /* 1 */ 206 | font-variation-settings: inherit; 207 | /* 1 */ 208 | font-size: 100%; 209 | /* 1 */ 210 | font-weight: inherit; 211 | /* 1 */ 212 | line-height: inherit; 213 | /* 1 */ 214 | letter-spacing: inherit; 215 | /* 1 */ 216 | color: inherit; 217 | /* 1 */ 218 | margin: 0; 219 | /* 2 */ 220 | padding: 0; 221 | /* 3 */ 222 | } 223 | 224 | /* 225 | Remove the inheritance of text transform in Edge and Firefox. 226 | */ 227 | 228 | button, 229 | select { 230 | text-transform: none; 231 | } 232 | 233 | /* 234 | 1. Correct the inability to style clickable types in iOS and Safari. 235 | 2. Remove default button styles. 236 | */ 237 | 238 | button, 239 | input:where([type='button']), 240 | input:where([type='reset']), 241 | input:where([type='submit']) { 242 | -webkit-appearance: button; 243 | /* 1 */ 244 | background-color: transparent; 245 | /* 2 */ 246 | background-image: none; 247 | /* 2 */ 248 | } 249 | 250 | /* 251 | Use the modern Firefox focus style for all focusable elements. 252 | */ 253 | 254 | :-moz-focusring { 255 | outline: auto; 256 | } 257 | 258 | /* 259 | Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) 260 | */ 261 | 262 | :-moz-ui-invalid { 263 | box-shadow: none; 264 | } 265 | 266 | /* 267 | Add the correct vertical alignment in Chrome and Firefox. 268 | */ 269 | 270 | progress { 271 | vertical-align: baseline; 272 | } 273 | 274 | /* 275 | Correct the cursor style of increment and decrement buttons in Safari. 276 | */ 277 | 278 | ::-webkit-inner-spin-button, 279 | ::-webkit-outer-spin-button { 280 | height: auto; 281 | } 282 | 283 | /* 284 | 1. Correct the odd appearance in Chrome and Safari. 285 | 2. Correct the outline style in Safari. 286 | */ 287 | 288 | [type='search'] { 289 | -webkit-appearance: textfield; 290 | /* 1 */ 291 | outline-offset: -2px; 292 | /* 2 */ 293 | } 294 | 295 | /* 296 | Remove the inner padding in Chrome and Safari on macOS. 297 | */ 298 | 299 | ::-webkit-search-decoration { 300 | -webkit-appearance: none; 301 | } 302 | 303 | /* 304 | 1. Correct the inability to style clickable types in iOS and Safari. 305 | 2. Change font properties to `inherit` in Safari. 306 | */ 307 | 308 | ::-webkit-file-upload-button { 309 | -webkit-appearance: button; 310 | /* 1 */ 311 | font: inherit; 312 | /* 2 */ 313 | } 314 | 315 | /* 316 | Add the correct display in Chrome and Safari. 317 | */ 318 | 319 | summary { 320 | display: list-item; 321 | } 322 | 323 | /* 324 | Removes the default spacing and border for appropriate elements. 325 | */ 326 | 327 | blockquote, 328 | dl, 329 | dd, 330 | h1, 331 | h2, 332 | h3, 333 | h4, 334 | h5, 335 | h6, 336 | hr, 337 | figure, 338 | p, 339 | pre { 340 | margin: 0; 341 | } 342 | 343 | fieldset { 344 | margin: 0; 345 | padding: 0; 346 | } 347 | 348 | legend { 349 | padding: 0; 350 | } 351 | 352 | ol, 353 | ul, 354 | menu { 355 | list-style: none; 356 | margin: 0; 357 | padding: 0; 358 | } 359 | 360 | /* 361 | Reset default styling for dialogs. 362 | */ 363 | 364 | dialog { 365 | padding: 0; 366 | } 367 | 368 | /* 369 | Prevent resizing textareas horizontally by default. 370 | */ 371 | 372 | textarea { 373 | resize: vertical; 374 | } 375 | 376 | /* 377 | 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) 378 | 2. Set the default placeholder color to the user's configured gray 400 color. 379 | */ 380 | 381 | input::-moz-placeholder, textarea::-moz-placeholder { 382 | opacity: 1; 383 | /* 1 */ 384 | color: #9ca3af; 385 | /* 2 */ 386 | } 387 | 388 | input::placeholder, 389 | textarea::placeholder { 390 | opacity: 1; 391 | /* 1 */ 392 | color: #9ca3af; 393 | /* 2 */ 394 | } 395 | 396 | /* 397 | Set the default cursor for buttons. 398 | */ 399 | 400 | button, 401 | [role="button"] { 402 | cursor: pointer; 403 | } 404 | 405 | /* 406 | Make sure disabled buttons don't get the pointer cursor. 407 | */ 408 | 409 | :disabled { 410 | cursor: default; 411 | } 412 | 413 | /* 414 | 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) 415 | 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) 416 | This can trigger a poorly considered lint error in some tools but is included by design. 417 | */ 418 | 419 | img, 420 | svg, 421 | video, 422 | canvas, 423 | audio, 424 | iframe, 425 | embed, 426 | object { 427 | display: block; 428 | /* 1 */ 429 | vertical-align: middle; 430 | /* 2 */ 431 | } 432 | 433 | /* 434 | Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) 435 | */ 436 | 437 | img, 438 | video { 439 | max-width: 100%; 440 | height: auto; 441 | } 442 | 443 | /* Make elements with the HTML hidden attribute stay hidden by default */ 444 | 445 | [hidden] { 446 | display: none; 447 | } 448 | 449 | @font-face { 450 | font-family: 'sourcehan'; 451 | 452 | src: url('../fonts/SourceHanSans-Regular.otf'); 453 | } 454 | 455 | @font-face { 456 | font-family: 'sourcehan'; 457 | 458 | src: url('../fonts/SourceHanSans-Normal.otf'); 459 | 460 | font-weight: 350 461 | } 462 | 463 | @font-face { 464 | font-family: 'sourcehan'; 465 | 466 | src: url('../fonts/SourceHanSans-Medium.otf'); 467 | 468 | font-weight: 500 469 | } 470 | 471 | @font-face { 472 | font-family: 'sourcehan'; 473 | 474 | src: url('../fonts/SourceHanSans-Bold.otf'); 475 | 476 | font-weight: 700 477 | } 478 | 479 | @font-face { 480 | font-family: 'sourcehan'; 481 | 482 | src: url('../fonts/SourceHanSans-Heavy.otf'); 483 | 484 | font-weight: 900 485 | } 486 | 487 | *, ::before, ::after { 488 | --tw-border-spacing-x: 0; 489 | --tw-border-spacing-y: 0; 490 | --tw-translate-x: 0; 491 | --tw-translate-y: 0; 492 | --tw-rotate: 0; 493 | --tw-skew-x: 0; 494 | --tw-skew-y: 0; 495 | --tw-scale-x: 1; 496 | --tw-scale-y: 1; 497 | --tw-pan-x: ; 498 | --tw-pan-y: ; 499 | --tw-pinch-zoom: ; 500 | --tw-scroll-snap-strictness: proximity; 501 | --tw-gradient-from-position: ; 502 | --tw-gradient-via-position: ; 503 | --tw-gradient-to-position: ; 504 | --tw-ordinal: ; 505 | --tw-slashed-zero: ; 506 | --tw-numeric-figure: ; 507 | --tw-numeric-spacing: ; 508 | --tw-numeric-fraction: ; 509 | --tw-ring-inset: ; 510 | --tw-ring-offset-width: 0px; 511 | --tw-ring-offset-color: #fff; 512 | --tw-ring-color: rgb(59 130 246 / 0.5); 513 | --tw-ring-offset-shadow: 0 0 #0000; 514 | --tw-ring-shadow: 0 0 #0000; 515 | --tw-shadow: 0 0 #0000; 516 | --tw-shadow-colored: 0 0 #0000; 517 | --tw-blur: ; 518 | --tw-brightness: ; 519 | --tw-contrast: ; 520 | --tw-grayscale: ; 521 | --tw-hue-rotate: ; 522 | --tw-invert: ; 523 | --tw-saturate: ; 524 | --tw-sepia: ; 525 | --tw-drop-shadow: ; 526 | --tw-backdrop-blur: ; 527 | --tw-backdrop-brightness: ; 528 | --tw-backdrop-contrast: ; 529 | --tw-backdrop-grayscale: ; 530 | --tw-backdrop-hue-rotate: ; 531 | --tw-backdrop-invert: ; 532 | --tw-backdrop-opacity: ; 533 | --tw-backdrop-saturate: ; 534 | --tw-backdrop-sepia: ; 535 | --tw-contain-size: ; 536 | --tw-contain-layout: ; 537 | --tw-contain-paint: ; 538 | --tw-contain-style: ; 539 | } 540 | 541 | ::backdrop { 542 | --tw-border-spacing-x: 0; 543 | --tw-border-spacing-y: 0; 544 | --tw-translate-x: 0; 545 | --tw-translate-y: 0; 546 | --tw-rotate: 0; 547 | --tw-skew-x: 0; 548 | --tw-skew-y: 0; 549 | --tw-scale-x: 1; 550 | --tw-scale-y: 1; 551 | --tw-pan-x: ; 552 | --tw-pan-y: ; 553 | --tw-pinch-zoom: ; 554 | --tw-scroll-snap-strictness: proximity; 555 | --tw-gradient-from-position: ; 556 | --tw-gradient-via-position: ; 557 | --tw-gradient-to-position: ; 558 | --tw-ordinal: ; 559 | --tw-slashed-zero: ; 560 | --tw-numeric-figure: ; 561 | --tw-numeric-spacing: ; 562 | --tw-numeric-fraction: ; 563 | --tw-ring-inset: ; 564 | --tw-ring-offset-width: 0px; 565 | --tw-ring-offset-color: #fff; 566 | --tw-ring-color: rgb(59 130 246 / 0.5); 567 | --tw-ring-offset-shadow: 0 0 #0000; 568 | --tw-ring-shadow: 0 0 #0000; 569 | --tw-shadow: 0 0 #0000; 570 | --tw-shadow-colored: 0 0 #0000; 571 | --tw-blur: ; 572 | --tw-brightness: ; 573 | --tw-contrast: ; 574 | --tw-grayscale: ; 575 | --tw-hue-rotate: ; 576 | --tw-invert: ; 577 | --tw-saturate: ; 578 | --tw-sepia: ; 579 | --tw-drop-shadow: ; 580 | --tw-backdrop-blur: ; 581 | --tw-backdrop-brightness: ; 582 | --tw-backdrop-contrast: ; 583 | --tw-backdrop-grayscale: ; 584 | --tw-backdrop-hue-rotate: ; 585 | --tw-backdrop-invert: ; 586 | --tw-backdrop-opacity: ; 587 | --tw-backdrop-saturate: ; 588 | --tw-backdrop-sepia: ; 589 | --tw-contain-size: ; 590 | --tw-contain-layout: ; 591 | --tw-contain-paint: ; 592 | --tw-contain-style: ; 593 | } 594 | 595 | .absolute { 596 | position: absolute; 597 | } 598 | 599 | .relative { 600 | position: relative; 601 | } 602 | 603 | .inset-0 { 604 | inset: 0px; 605 | } 606 | 607 | .inset-4 { 608 | inset: 1rem; 609 | } 610 | 611 | .bottom-8 { 612 | bottom: 2rem; 613 | } 614 | 615 | .bottom-\[2px\] { 616 | bottom: 2px; 617 | } 618 | 619 | .bottom-\[35px\] { 620 | bottom: 35px; 621 | } 622 | 623 | .left-\[50px\] { 624 | left: 50px; 625 | } 626 | 627 | .left-\[128px\] { 628 | left: 128px; 629 | } 630 | 631 | .left-\[355px\] { 632 | left: 355px; 633 | } 634 | 635 | 636 | .left-\[-10px\] { 637 | left: -10px; 638 | } 639 | 640 | .left-\[-14px\] { 641 | left: -14px; 642 | } 643 | 644 | .left-\[-6px\] { 645 | left: -6px; 646 | } 647 | 648 | .left-\[-7px\] { 649 | left: -7px; 650 | } 651 | 652 | .left-\[-8px\] { 653 | left: -8px; 654 | } 655 | 656 | .left-\[-9px\] { 657 | left: -9px; 658 | } 659 | 660 | .left-\[15px\] { 661 | left: 15px; 662 | } 663 | 664 | .left-1\/2 { 665 | left: 50%; 666 | } 667 | 668 | .right-2 { 669 | right: 0.5rem; 670 | } 671 | 672 | .top-1 { 673 | top: 0.25rem; 674 | } 675 | 676 | .top-\[3px\] { 677 | top: 3px; 678 | } 679 | 680 | .top-\[4px\] { 681 | top: 4px; 682 | } 683 | 684 | .top-\[5px\] { 685 | top: 5px; 686 | } 687 | 688 | .top-\[6px\] { 689 | top: 6px; 690 | } 691 | 692 | .top-\[11px\] { 693 | top: 11px; 694 | } 695 | 696 | .top-\[30px\] { 697 | top: 30px; 698 | } 699 | 700 | .top-\[50px\] { 701 | top: 50px; 702 | } 703 | 704 | .top-\[262px\] { 705 | top: 262px; 706 | } 707 | 708 | .top-\[1132px\] { 709 | top: 1132px; 710 | } 711 | 712 | .m-2 { 713 | margin: 0.5rem; 714 | } 715 | 716 | .m-5 { 717 | margin: 1.25rem; 718 | } 719 | 720 | .mx-\[5px\] { 721 | margin-left: 5px; 722 | margin-right: 5px; 723 | } 724 | 725 | .mx-\[50px\] { 726 | margin-left: 50px; 727 | margin-right: 50px; 728 | } 729 | 730 | .mr-2 { 731 | margin-right: 0.5rem; 732 | } 733 | 734 | .-mr-1 { 735 | margin-right: -0.25rem; 736 | } 737 | 738 | .mb-10 { 739 | margin-bottom: 2.5rem; 740 | } 741 | 742 | .mb-2 { 743 | margin-bottom: 0.5rem; 744 | } 745 | 746 | .mb-\[2px\] { 747 | margin-bottom: 2px; 748 | } 749 | 750 | .mb-\[5px\] { 751 | margin-bottom: 5px; 752 | } 753 | 754 | .ml-1 { 755 | margin-left: 0.25rem; 756 | } 757 | 758 | .ml-2 { 759 | margin-left: 0.5rem; 760 | } 761 | 762 | .ml-4 { 763 | margin-left: 1rem; 764 | } 765 | 766 | .ml-\[16px\] { 767 | margin-left: 16px; 768 | } 769 | 770 | .ml-\[20px\] { 771 | margin-left: 20px; 772 | } 773 | 774 | .ml-\[7px\] { 775 | margin-left: 7px; 776 | } 777 | 778 | .mr-10 { 779 | margin-right: 2.5rem; 780 | } 781 | 782 | .mr-5 { 783 | margin-right: 1.25rem; 784 | } 785 | 786 | .mt-1 { 787 | margin-top: 0.25rem; 788 | } 789 | 790 | .mt-10 { 791 | margin-top: 2.5rem; 792 | } 793 | 794 | .mt-2 { 795 | margin-top: 0.5rem; 796 | } 797 | 798 | .mt-5 { 799 | margin-top: 1.25rem; 800 | } 801 | 802 | .mt-\[7px\] { 803 | margin-top: 7px; 804 | } 805 | 806 | .inline-block { 807 | display: inline-block; 808 | } 809 | 810 | .flex { 811 | display: flex; 812 | } 813 | 814 | .grid { 815 | display: grid; 816 | } 817 | 818 | .size-6 { 819 | width: 1.5rem; 820 | height: 1.5rem; 821 | } 822 | 823 | .h-14 { 824 | height: 3.5rem; 825 | } 826 | 827 | .h-2 { 828 | height: 0.5rem; 829 | } 830 | 831 | .h-4 { 832 | height: 1rem; 833 | } 834 | 835 | .h-8 { 836 | height: 2rem; 837 | } 838 | 839 | .h-2\.5 { 840 | height: 0.625rem; 841 | } 842 | 843 | .h-\[100px\] { 844 | height: 100px; 845 | } 846 | 847 | .h-\[132px\] { 848 | height: 132px; 849 | } 850 | 851 | .h-\[50px\] { 852 | height: 50px; 853 | } 854 | 855 | .h-\[75px\] { 856 | height: 75px; 857 | } 858 | 859 | .h-\[1567px\] { 860 | height: 1567px; 861 | } 862 | 863 | .w-0\.5 { 864 | width: 0.125rem; 865 | } 866 | 867 | .w-4 { 868 | width: 1rem; 869 | } 870 | 871 | .w-10 { 872 | width: 2.5rem; 873 | } 874 | 875 | .w-14 { 876 | width: 3.5rem; 877 | } 878 | 879 | .w-40 { 880 | width: 10rem; 881 | } 882 | 883 | .w-\[100px\] { 884 | width: 100px; 885 | } 886 | 887 | .w-\[180px\] { 888 | width: 180px; 889 | } 890 | 891 | .w-\[50px\] { 892 | width: 50px; 893 | } 894 | 895 | .w-\[580px\] { 896 | width: 580px; 897 | } 898 | 899 | .w-\[1080px\] { 900 | width: 1080px; 901 | } 902 | 903 | .w-full { 904 | width: 100%; 905 | } 906 | 907 | .min-w-48 { 908 | min-width: 48px; 909 | } 910 | 911 | .min-w-\[100px\] { 912 | min-width: 100px; 913 | } 914 | 915 | .max-w-48 { 916 | max-width: 12rem; 917 | } 918 | 919 | .max-w-\[100px\] { 920 | max-width: 100px; 921 | } 922 | 923 | .translate-x-1\/2 { 924 | --tw-translate-x: 50%; 925 | transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); 926 | } 927 | 928 | .translate-y-1\/2 { 929 | --tw-translate-y: 50%; 930 | transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); 931 | } 932 | 933 | .rotate-\[-30deg\] { 934 | --tw-rotate: -30deg; 935 | transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); 936 | } 937 | 938 | .transform { 939 | transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); 940 | } 941 | 942 | .grid-cols-2 { 943 | grid-template-columns: repeat(2, minmax(0, 1fr)); 944 | } 945 | 946 | .grid-cols-5 { 947 | grid-template-columns: repeat(5, minmax(0, 1fr)); 948 | } 949 | 950 | .flex-col { 951 | flex-direction: column; 952 | } 953 | 954 | .flex-wrap { 955 | flex-wrap: wrap; 956 | } 957 | 958 | .items-start { 959 | align-items: flex-start; 960 | } 961 | 962 | .items-end { 963 | align-items: flex-end; 964 | } 965 | 966 | .items-center { 967 | align-items: center; 968 | } 969 | 970 | .justify-center { 971 | justify-content: center; 972 | } 973 | 974 | .justify-between { 975 | justify-content: space-between; 976 | } 977 | 978 | .justify-around { 979 | justify-content: space-around; 980 | } 981 | 982 | .justify-evenly { 983 | justify-content: space-evenly; 984 | } 985 | 986 | .gap-3 { 987 | gap: 0.75rem; 988 | } 989 | 990 | .gap-5 { 991 | gap: 1.25rem; 992 | } 993 | 994 | .gap-6 { 995 | gap: 1.5rem; 996 | } 997 | 998 | .gap-x-5 { 999 | column-gap: 1.25rem; 1000 | } 1001 | 1002 | .gap-y-\[15px\] { 1003 | row-gap: 15px; 1004 | } 1005 | 1006 | .space-x-0 > :not([hidden]) ~ :not([hidden]) { 1007 | --tw-space-x-reverse: 0; 1008 | margin-right: calc(0px * var(--tw-space-x-reverse)); 1009 | margin-left: calc(0px * calc(1 - var(--tw-space-x-reverse))); 1010 | } 1011 | 1012 | .space-x-0\.5 > :not([hidden]) ~ :not([hidden]) { 1013 | --tw-space-x-reverse: 0; 1014 | margin-right: calc(0.125rem * var(--tw-space-x-reverse)); 1015 | margin-left: calc(0.125rem * calc(1 - var(--tw-space-x-reverse))); 1016 | } 1017 | 1018 | .space-y-5 > :not([hidden]) ~ :not([hidden]) { 1019 | --tw-space-y-reverse: 0; 1020 | margin-top: calc(1.25rem * calc(1 - var(--tw-space-y-reverse))); 1021 | margin-bottom: calc(1.25rem * var(--tw-space-y-reverse)); 1022 | } 1023 | 1024 | .overflow-hidden { 1025 | overflow: hidden; 1026 | } 1027 | 1028 | .overflow-visible { 1029 | overflow: visible; 1030 | } 1031 | 1032 | .truncate { 1033 | overflow: hidden; 1034 | text-overflow: ellipsis; 1035 | white-space: nowrap; 1036 | } 1037 | 1038 | .whitespace-nowrap { 1039 | white-space: nowrap; 1040 | } 1041 | 1042 | .rounded-full { 1043 | border-radius: 9999px; 1044 | } 1045 | 1046 | .rounded-xl { 1047 | border-radius: 0.75rem; 1048 | } 1049 | 1050 | .rounded-t-xl { 1051 | border-top-left-radius: 0.75rem; 1052 | border-top-right-radius: 0.75rem; 1053 | } 1054 | 1055 | .rounded-bl-\[15px\] { 1056 | border-bottom-left-radius: 15px; 1057 | } 1058 | 1059 | .rounded-br-\[15px\] { 1060 | border-bottom-right-radius: 15px; 1061 | } 1062 | 1063 | .rounded-tl-\[32px\] { 1064 | border-top-left-radius: 32px; 1065 | } 1066 | 1067 | .rounded-tr-\[15px\] { 1068 | border-top-right-radius: 15px; 1069 | } 1070 | 1071 | .border-8 { 1072 | border-width: 8px; 1073 | } 1074 | 1075 | .border-white { 1076 | --tw-border-opacity: 1; 1077 | border-color: rgb(255 255 255 / var(--tw-border-opacity)); 1078 | } 1079 | 1080 | .bg-\[\#9E9E9E\] { 1081 | --tw-bg-opacity: 1; 1082 | background-color: rgb(158 158 158 / var(--tw-bg-opacity)); 1083 | } 1084 | 1085 | .bg-\[\#C28B78\] { 1086 | --tw-bg-opacity: 1; 1087 | background-color: rgb(194 139 120 / var(--tw-bg-opacity)); 1088 | } 1089 | 1090 | .bg-\[\#E1FFE9\] { 1091 | --tw-bg-opacity: 1; 1092 | background-color: rgb(225 255 233 / var(--tw-bg-opacity)); 1093 | } 1094 | 1095 | .bg-\[\#E7E1FF\] { 1096 | --tw-bg-opacity: 1; 1097 | background-color: rgb(231 225 255 / var(--tw-bg-opacity)); 1098 | } 1099 | 1100 | .bg-\[\#F0F0F0\] { 1101 | --tw-bg-opacity: 1; 1102 | background-color: rgb(240 240 240 / var(--tw-bg-opacity)); 1103 | } 1104 | 1105 | .bg-\[\#FFE1E1\] { 1106 | --tw-bg-opacity: 1; 1107 | background-color: rgb(255 225 225 / var(--tw-bg-opacity)); 1108 | } 1109 | 1110 | .bg-\[\#FFF7E1\] { 1111 | --tw-bg-opacity: 1; 1112 | background-color: rgb(255 247 225 / var(--tw-bg-opacity)); 1113 | } 1114 | 1115 | .bg-\[\#FFFFFF\] { 1116 | --tw-bg-opacity: 1; 1117 | background-color: rgb(255 255 255 / var(--tw-bg-opacity)); 1118 | } 1119 | 1120 | .bg-gray-200 { 1121 | --tw-bg-opacity: 1; 1122 | background-color: rgb(229 231 235 / var(--tw-bg-opacity)); 1123 | } 1124 | 1125 | .bg-gray-500 { 1126 | --tw-bg-opacity: 1; 1127 | background-color: rgb(107 114 128 / var(--tw-bg-opacity)); 1128 | } 1129 | 1130 | .bg-green-400 { 1131 | --tw-bg-opacity: 1; 1132 | background-color: rgb(74 222 128 / var(--tw-bg-opacity)); 1133 | } 1134 | 1135 | .bg-indigo-300 { 1136 | --tw-bg-opacity: 1; 1137 | background-color: rgb(165 180 252 / var(--tw-bg-opacity)); 1138 | } 1139 | 1140 | .bg-purple-400 { 1141 | --tw-bg-opacity: 1; 1142 | background-color: rgb(192 132 252 / var(--tw-bg-opacity)); 1143 | } 1144 | 1145 | .bg-purple-500 { 1146 | --tw-bg-opacity: 1; 1147 | background-color: rgb(168 85 247 / var(--tw-bg-opacity)); 1148 | } 1149 | 1150 | .bg-rose-400 { 1151 | --tw-bg-opacity: 1; 1152 | background-color: rgb(251 113 133 / var(--tw-bg-opacity)); 1153 | } 1154 | 1155 | .bg-white { 1156 | --tw-bg-opacity: 1; 1157 | background-color: rgb(255 255 255 / var(--tw-bg-opacity)); 1158 | } 1159 | 1160 | .bg-zinc-700 { 1161 | --tw-bg-opacity: 1; 1162 | background-color: rgb(63 63 70 / var(--tw-bg-opacity)); 1163 | } 1164 | 1165 | .bg-cover { 1166 | background-size: cover; 1167 | } 1168 | 1169 | .bg-center { 1170 | background-position: center; 1171 | } 1172 | 1173 | .p-10 { 1174 | padding: 2.5rem; 1175 | } 1176 | 1177 | .p-2 { 1178 | padding: 0.5rem; 1179 | } 1180 | 1181 | .p-5 { 1182 | padding: 1.25rem; 1183 | } 1184 | 1185 | .px-2 { 1186 | padding-left: 0.5rem; 1187 | padding-right: 0.5rem; 1188 | } 1189 | 1190 | .px-4 { 1191 | padding-left: 1rem; 1192 | padding-right: 1rem; 1193 | } 1194 | 1195 | .px-10 { 1196 | padding-left: 2.5rem; 1197 | padding-right: 2.5rem; 1198 | } 1199 | 1200 | .py-0\.5 { 1201 | padding-top: 0.125rem; 1202 | padding-bottom: 0.125rem; 1203 | } 1204 | 1205 | .py-2 { 1206 | padding-top: 0.5rem; 1207 | padding-bottom: 0.5rem; 1208 | } 1209 | 1210 | .pb-10 { 1211 | padding-bottom: 2.5rem; 1212 | } 1213 | 1214 | .pt-20 { 1215 | padding-top: 5rem; 1216 | } 1217 | 1218 | .text-center { 1219 | text-align: center; 1220 | } 1221 | 1222 | .font-adlam { 1223 | font-family: adlam, sans-serif; 1224 | } 1225 | 1226 | .font-carter { 1227 | font-family: carter, sans-serif; 1228 | } 1229 | 1230 | .font-cherry { 1231 | font-family: cherry, sans-serif; 1232 | } 1233 | 1234 | .font-sourcehan { 1235 | font-family: sourcehan, sans-serif; 1236 | } 1237 | 1238 | .text-2xl { 1239 | font-size: 1.5rem; 1240 | line-height: 2rem; 1241 | } 1242 | 1243 | .text-3xl { 1244 | font-size: 1.875rem; 1245 | line-height: 2.25rem; 1246 | } 1247 | 1248 | .text-4xl { 1249 | font-size: 2.25rem; 1250 | line-height: 2.5rem; 1251 | } 1252 | 1253 | .text-8xl { 1254 | font-size: 6rem; 1255 | line-height: 1; 1256 | } 1257 | 1258 | .text-lg { 1259 | font-size: 1.125rem; 1260 | line-height: 1.75rem; 1261 | } 1262 | 1263 | .text-sm { 1264 | font-size: 0.875rem; 1265 | line-height: 1.25rem; 1266 | } 1267 | 1268 | .text-xl { 1269 | font-size: 1.25rem; 1270 | line-height: 1.75rem; 1271 | } 1272 | 1273 | .text-7xl { 1274 | font-size: 4.5rem; 1275 | line-height: 1; 1276 | } 1277 | 1278 | .text-xs { 1279 | font-size: 0.75rem; 1280 | line-height: 1rem; 1281 | } 1282 | 1283 | .text-\[10px\] { 1284 | font-size: 10px; 1285 | } 1286 | 1287 | .font-\[350\] { 1288 | font-weight: 350; 1289 | } 1290 | 1291 | .font-black { 1292 | font-weight: 900; 1293 | } 1294 | 1295 | .font-bold { 1296 | font-weight: 700; 1297 | } 1298 | 1299 | .font-medium { 1300 | font-weight: 500; 1301 | } 1302 | 1303 | .font-normal { 1304 | font-weight: 400; 1305 | } 1306 | 1307 | .font-semibold { 1308 | font-weight: 600; 1309 | } 1310 | 1311 | .uppercase { 1312 | text-transform: uppercase; 1313 | } 1314 | 1315 | .text-\[\#C28B78\] { 1316 | --tw-text-opacity: 1; 1317 | color: rgb(194 139 120 / var(--tw-text-opacity)); 1318 | } 1319 | 1320 | .text-\[\#D1C3BF\] { 1321 | --tw-text-opacity: 1; 1322 | color: rgb(209 195 191 / var(--tw-text-opacity)); 1323 | } 1324 | 1325 | .text-amber-400 { 1326 | --tw-text-opacity: 1; 1327 | color: rgb(251 191 36 / var(--tw-text-opacity)); 1328 | } 1329 | 1330 | .text-gray-600 { 1331 | --tw-text-opacity: 1; 1332 | color: rgb(75 85 99 / var(--tw-text-opacity)); 1333 | } 1334 | 1335 | .text-indigo-300 { 1336 | --tw-text-opacity: 1; 1337 | color: rgb(165 180 252 / var(--tw-text-opacity)); 1338 | } 1339 | 1340 | .text-white { 1341 | --tw-text-opacity: 1; 1342 | color: rgb(255 255 255 / var(--tw-text-opacity)); 1343 | } 1344 | 1345 | .text-\[\#9DD9ED\] { 1346 | --tw-text-opacity: 1; 1347 | color: rgb(157 217 237 / var(--tw-text-opacity)); 1348 | } 1349 | 1350 | .text-\[\#ED9DB9\] { 1351 | --tw-text-opacity: 1; 1352 | color: rgb(237 157 185 / var(--tw-text-opacity)); 1353 | } 1354 | 1355 | .text-\[\#EDD79D\] { 1356 | --tw-text-opacity: 1; 1357 | color: rgb(237 215 157 / var(--tw-text-opacity)); 1358 | } 1359 | 1360 | .text-\[\#A9C9C6\] { 1361 | --tw-text-opacity: 1; 1362 | color: rgb(169 201 198 / var(--tw-text-opacity)); 1363 | } 1364 | 1365 | .text-\[\#966D56\] { 1366 | --tw-text-opacity: 1; 1367 | color: rgb(150 109 86 / var(--tw-text-opacity)); 1368 | } 1369 | 1370 | .underline { 1371 | text-decoration-line: underline; 1372 | } 1373 | 1374 | .decoration-indigo-400 { 1375 | text-decoration-color: #818cf8; 1376 | } 1377 | 1378 | .decoration-dotted { 1379 | text-decoration-style: dotted; 1380 | } 1381 | 1382 | .underline-offset-8 { 1383 | text-underline-offset: 8px; 1384 | } 1385 | 1386 | .opacity-50 { 1387 | opacity: 0.5; 1388 | } 1389 | 1390 | .opacity-100 { 1391 | opacity: 1; 1392 | } 1393 | 1394 | .shadow-\[0_0_10px_rgba\(0\2c 0\2c 0\2c 0\.3\)\] { 1395 | --tw-shadow: 0 0 10px rgba(0,0,0,0.3); 1396 | --tw-shadow-colored: 0 0 10px var(--tw-shadow-color); 1397 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 1398 | } 1399 | 1400 | .shadow-\[0_0_10px_rgba\(13\2c 255\2c 0\2c 1\)\] { 1401 | --tw-shadow: 0 0 10px rgba(13,255,0,1); 1402 | --tw-shadow-colored: 0 0 10px var(--tw-shadow-color); 1403 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 1404 | } 1405 | 1406 | .shadow-\[0_0_15px_rgba\(0\2c 0\2c 0\2c 0\.4\)\] { 1407 | --tw-shadow: 0 0 15px rgba(0,0,0,0.4); 1408 | --tw-shadow-colored: 0 0 15px var(--tw-shadow-color); 1409 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 1410 | } 1411 | 1412 | .shadow-\[inset_0_0_20px_\#00FF4430\] { 1413 | --tw-shadow: inset 0 0 20px #00FF4430; 1414 | --tw-shadow-colored: inset 0 0 20px var(--tw-shadow-color); 1415 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 1416 | } 1417 | 1418 | .shadow-\[inset_0_0_20px_\#80808030\] { 1419 | --tw-shadow: inset 0 0 20px #80808030; 1420 | --tw-shadow-colored: inset 0 0 20px var(--tw-shadow-color); 1421 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 1422 | } 1423 | 1424 | .shadow-\[inset_0_0_20px_\#A100FF30\] { 1425 | --tw-shadow: inset 0 0 20px #A100FF30; 1426 | --tw-shadow-colored: inset 0 0 20px var(--tw-shadow-color); 1427 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 1428 | } 1429 | 1430 | .shadow-\[inset_0_0_20px_\#FBFF0030\] { 1431 | --tw-shadow: inset 0 0 20px #FBFF0030; 1432 | --tw-shadow-colored: inset 0 0 20px var(--tw-shadow-color); 1433 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 1434 | } 1435 | 1436 | .shadow-\[inset_0_0_20px_\#FF000030\] { 1437 | --tw-shadow: inset 0 0 20px #FF000030; 1438 | --tw-shadow-colored: inset 0 0 20px var(--tw-shadow-color); 1439 | box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); 1440 | } 1441 | 1442 | .blur-\[0\.5px\] { 1443 | --tw-blur: blur(0.5px); 1444 | filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); 1445 | } 1446 | 1447 | .drop-shadow-\[0_0_2px_rgba\(0\2c 0\2c 0\2c 0\.3\)\] { 1448 | --tw-drop-shadow: drop-shadow(0 0 2px rgba(0,0,0,0.3)); 1449 | filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); 1450 | } 1451 | 1452 | .filter { 1453 | filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); 1454 | } 1455 | 1456 | .transition { 1457 | transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; 1458 | transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; 1459 | transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; 1460 | transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); 1461 | transition-duration: 150ms; 1462 | } 1463 | 1464 | .duration-500 { 1465 | transition-duration: 500ms; 1466 | } 1467 | 1468 | @media (min-width: 640px) { 1469 | .sm\:grid-cols-3 { 1470 | grid-template-columns: repeat(3, minmax(0, 1fr)); 1471 | } 1472 | } 1473 | 1474 | @media (min-width: 768px) { 1475 | .md\:grid-cols-4 { 1476 | grid-template-columns: repeat(4, minmax(0, 1fr)); 1477 | } 1478 | } 1479 | 1480 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/resources/templates/macros.html.jinja2: -------------------------------------------------------------------------------- 1 | {% from 'icons.macros.html.jinja2' import app, ap, fcp, fc, fsdp, fsd, fsp, fs, sync, null %} 2 | {% set icon_map = { 3 | 'app': app, 4 | 'ap': ap, 5 | 'fcp': fcp, 6 | 'fc': fc, 7 | 'fsdp': fsdp, 8 | 'fsd': fsd, 9 | 'fsp': fsp, 10 | 'fs': fs, 11 | 'sync': sync 12 | } %} 13 | 14 | {% macro stars(count) %} 15 | {% set background_color, shadow_color = count | star_count_to_color %} 16 |
17 | {% for i in range(5) %} 18 | {% if count == 0 %} 19 |
20 | {% elif count <= 4 %} 21 |
27 | {% else %} 28 |
29 | {% endif %} 30 | {% endfor %} 31 |
32 | {% endmacro %} 33 | 34 | {% macro header(player, standard_total, dx_total) %} 35 |
36 | 37 | {% if player.name_plate %} 38 |
39 | {% else %} 40 |
41 | {% endif %} 42 | 43 |
47 | 48 | {% if player.icon %} 49 | Icon 50 | {% else %} 51 | Icon 52 | {% endif %} 53 | 54 |
55 |
56 |

57 | {{ standard_total + dx_total }} 58 |

59 |
60 |

Rating

61 |

62 | {{ standard_total }}+{{ dx_total }}={{ standard_total + dx_total }} 63 |

64 |
65 |
66 |
67 |

{{ player.name }}

68 |
69 |
70 |

71 | {{ player.course_rank | course_rank_id_to_text}} 72 |

73 |
74 | {% endmacro %} 75 | 76 | {% macro song_card(score, index) %} 77 | {% set background_color, shadow_color = score.level_index | level_index_to_color %} 78 |
79 |
80 |
81 | Icon 82 |
83 |

84 | {{ score.level_index.name }} 85 |

86 |
87 |
88 |

#{{ "%02d" | format(index) }}

89 | {{ stars(score.star_count) }} 90 |
91 |

{{ score.song_name }}

92 |
93 | {% set integer_part, decimal_part = "{:.4f}".format(score.achievements).split('.') %} 94 | {% if score.rate in ['sssp', 'sss'] %} 95 |

{{ integer_part[-3] }}

96 |

{{ integer_part[-2] }}

97 |

{{ integer_part[-1] }}

98 | {% elif score.rate in ['ssp', 'ss', 'sp', 's'] %} 99 |

{{ integer_part }}

100 | {% elif score.rate in ['aaa', 'aa', 'a'] %} 101 |

{{ integer_part }}

102 | {% elif score.rate in ['bbb', 'bb', 'b'] %} 103 |

{{ integer_part }}

104 | {% elif score.rate in ['c', 'd'] %} 105 |

{{ integer_part }}

106 | {% else %} 107 |

{{ integer_part }}

108 | {% endif %} 109 |

.

110 |

{{ decimal_part }}%

111 |
112 |
113 |
114 |
115 | 116 |
117 |
118 |

{{ score.level }}

119 | 120 |

{{ score.dx_rating | int }}

121 |
122 | 123 |
124 | {# FC Type #} 125 | {% if not score.fc %} 126 | {{ null() }} 127 | {% else %} 128 | {{ icon_map[score.fc.value]() }} 129 | {% endif %} 130 | 131 | {# FS Type #} 132 | {% if not score.fs %} 133 | {{ null() }} 134 | {% else %} 135 | {{ icon_map[score.fs.value]() }} 136 | {% endif %} 137 |
138 |
139 |
140 | 141 | {% endmacro %} 142 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/__init__.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | 3 | from .song import Song as Song 4 | from .alias import Alias as Alias 5 | from .genre import Genre as Genre 6 | from .notes import Notes as Notes 7 | from .score import Score as Score 8 | from .trend import Trend as Trend 9 | from .player import Player as Player 10 | from .version import Version as Version 11 | from .collection import Collection as Collection 12 | from .song import SongDifficulty as SongDifficulty 13 | from .song import SongDifficulties as SongDifficulties 14 | from .song import SongDifficultyUtage as SongDifficultyUtage 15 | from .collection import CollectionRequired as CollectionRequired 16 | from .collection import CollectionRequiredSong as CollectionRequiredSong 17 | 18 | 19 | class RenderProps(BaseModel): 20 | player: Player 21 | standard_total: int 22 | dx_total: int 23 | standard: list[Score] 24 | dx: list[Score] 25 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/alias.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | 3 | 4 | class Alias(BaseModel): 5 | """曲目别名""" 6 | 7 | song_id: int 8 | """曲目 ID""" 9 | aliases: list[int] 10 | """曲目所有别名""" 11 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/collection.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | 3 | from .enum import FCType, FSType, RateType, SongType 4 | 5 | 6 | class CollectionGenre(BaseModel): 7 | """收藏品分类""" 8 | 9 | id: int 10 | """收藏品分类 ID""" 11 | title: str 12 | """分类标题""" 13 | genre: str 14 | """分类标题(日文)""" 15 | 16 | 17 | class CollectionRequiredSong(BaseModel): 18 | """收藏品要求曲目""" 19 | 20 | id: int 21 | """曲目 ID""" 22 | title: str 23 | """曲名""" 24 | type: SongType 25 | """谱面类型""" 26 | completed: bool | None = None 27 | """值可空,要求的曲目是否完成""" 28 | completed_difficulties: list[int] | None = None 29 | """值可空,已完成的难度""" 30 | 31 | 32 | class CollectionRequired(BaseModel): 33 | """收藏品要求""" 34 | 35 | difficulties: list[int] | None = None 36 | """ 值可空,要求的谱面难度""" 37 | rate: RateType | None = None 38 | """ 值可空,要求的评级类型""" 39 | fc: FCType | None = None 40 | """ 值可空,要求的 FULL COMBO 类型""" 41 | fs: FSType | None = None 42 | """ 值可空,要求的 FULL SYNC 类型""" 43 | songs: list[CollectionRequiredSong] | None = None 44 | """ 值可空,要求的曲目""" 45 | completed: bool | None = None 46 | """值可空,要求是否全部完成""" 47 | 48 | 49 | class Collection(BaseModel): 50 | """收藏品""" 51 | 52 | id: int 53 | """收藏品 ID""" 54 | name: str 55 | """收藏品名称""" 56 | color: str | None = None 57 | """值可空,仅玩家称号,称号颜色""" 58 | description: str | None = None 59 | """收藏品说明""" 60 | genre: str | None = None 61 | """值可空,除玩家称号,收藏品分类(日文)""" 62 | required: list[CollectionRequired] | None = None 63 | """值可空,收藏品要求""" 64 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/enum/__init__.py: -------------------------------------------------------------------------------- 1 | from .fctype import FCType as FCType 2 | from .fstype import FSType as FSType 3 | from .ratetype import RateType as RateType 4 | from .songtype import SongType as SongType 5 | from .levelindex import LevelIndex as LevelIndex 6 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/enum/fctype.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class FCType(str, Enum): 5 | """FULL COMBO 类型""" 6 | 7 | app = "app" 8 | """AP+""" 9 | ap = "ap" 10 | """AP""" 11 | fcp = "fcp" 12 | """FC+""" 13 | fc = "fc" 14 | """FC""" 15 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/enum/fstype.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class FSType(str, Enum): 5 | """FULL SYNC 类型""" 6 | 7 | fsdp = "fsdp" 8 | """FSD+""" 9 | fsd = "fsd" 10 | """FSD""" 11 | fsp = "fsp" 12 | """FS+""" 13 | fs = "fs" 14 | """FS""" 15 | sync = "sync" 16 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/enum/levelindex.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class LevelIndex(Enum): 5 | """难度""" 6 | 7 | BASIC = 0 8 | ADVANCED = 1 9 | EXPERT = 2 10 | MASTER = 3 11 | RE_MASTER = 4 12 | 13 | @classmethod 14 | def get_level(cls, index: int): 15 | for level in LevelIndex: 16 | if level.value == index: 17 | return level.name 18 | raise ValueError("Invalid value") 19 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/enum/ratetype.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class RateType(str, Enum): 5 | """评级等级""" 6 | 7 | sssp = "sssp" 8 | """SSS+""" 9 | sss = "sss" 10 | """SSS""" 11 | ssp = "ssp" 12 | """SS+""" 13 | ss = "ss" 14 | """SS""" 15 | sp = "sp" 16 | """S+""" 17 | s = "s" 18 | """S""" 19 | aaa = "aaa" 20 | """AAA""" 21 | aa = "aa" 22 | """AA""" 23 | a = "a" 24 | """A""" 25 | bbb = "bbb" 26 | """BBB""" 27 | bb = "bb" 28 | """BB""" 29 | b = "b" 30 | """B""" 31 | c = "c" 32 | """C""" 33 | d = "d" 34 | """D""" 35 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/enum/songtype.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class SongType(str, Enum): 5 | """谱面类型""" 6 | 7 | standard = "standard" 8 | """标准谱面""" 9 | dx = "dx" 10 | """DX 谱面""" 11 | utage = "utage" 12 | """宴会场谱面""" 13 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/genre.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | 3 | 4 | class Genre(BaseModel): 5 | """乐曲分类""" 6 | 7 | id: int 8 | """内部 ID""" 9 | title: str 10 | """分类标题""" 11 | genre: str 12 | """分类标题(日文)""" 13 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/notes.py: -------------------------------------------------------------------------------- 1 | from pydantic import Field, BaseModel 2 | 3 | 4 | class Notes(BaseModel): 5 | """谱面数量""" 6 | 7 | total: int 8 | """总物量""" 9 | tap: int 10 | """TAP 物量""" 11 | hold: int 12 | """HOLD 物量""" 13 | slide: int 14 | """SLIDE 物量""" 15 | touch: int 16 | """TOUCH 物量""" 17 | break_: int = Field(alias="break") 18 | """BREAK 物量""" 19 | 20 | 21 | class BuddyNotes(BaseModel): 22 | """仅宴会场曲目,BUDDY 谱面物量""" 23 | 24 | left: Notes 25 | """1P 谱面物量""" 26 | right: Notes 27 | """2P 谱面物量""" 28 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/player.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | 3 | from .collection import Collection 4 | 5 | 6 | class Player(BaseModel): 7 | """玩家""" 8 | 9 | name: str 10 | """游戏内名称""" 11 | rating: int 12 | """玩家 DX Rating""" 13 | friend_code: int 14 | """好友码""" 15 | trophy: Collection 16 | """仅[获取玩家信息](https://maimai.lxns.net/docs/api/maimai#get-apiv0maimaiplayerfriend_code)返回,称号""" 17 | trophy_name: str | None = None 18 | """仅[创建玩家信息](https://maimai.lxns.net/docs/api/maimai#post-apiv0maimaiplayer)必选,称号""" 19 | course_rank: int 20 | """段位 ID""" 21 | class_rank: int 22 | """阶级 ID""" 23 | star: int 24 | """搭档觉醒数""" 25 | icon: Collection | None = None 26 | """值可空,头像""" 27 | name_plate: Collection | None = None 28 | """值可空,姓名框""" 29 | frame: Collection | None = None 30 | """值可空,背景""" 31 | upload_time: str 32 | """ 33 | 仅[获取玩家信息](https://maimai.lxns.net/docs/api/maimai#get-apiv0maimaiplayerfriend_code)返回, 34 | 玩家被同步时的 UTC 时间 35 | """ 36 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/score.py: -------------------------------------------------------------------------------- 1 | from nonebot.compat import PYDANTIC_V2 2 | from pydantic import BaseModel, ConfigDict 3 | 4 | from .enum import FCType, FSType, RateType, SongType, LevelIndex 5 | 6 | 7 | class Score(BaseModel): 8 | """游玩成绩""" 9 | 10 | id: int 11 | """曲目 ID""" 12 | song_name: str 13 | """仅获取 `Score` 时返回,曲名""" 14 | level: str 15 | """仅获取 `Score` 时返回,难度标级,如 `14+`""" 16 | level_index: LevelIndex 17 | """难度""" 18 | achievements: float 19 | """达成率""" 20 | fc: FCType | None = None 21 | """值可空,FULL COMBO 类型""" 22 | fs: FSType | None = None 23 | """值可空,FULL SYNC 类型""" 24 | dx_score: int 25 | """DX 分数""" 26 | dx_rating: float 27 | """仅获取 `Score` 时返回,DX Rating,计算时需要向下取整""" 28 | rate: RateType 29 | """仅获取 `Score` 时返回,评级类型""" 30 | type: SongType 31 | """谱面类型""" 32 | play_time: str | None = None 33 | """游玩的 UTC 时间,精确到分钟""" 34 | upload_time: str 35 | """仅获取 `Score` 时返回,成绩被同步时的 UTC 时间""" 36 | 37 | if PYDANTIC_V2: 38 | model_config = ConfigDict(extra="allow") # type: ignore 39 | else: 40 | 41 | class Config: 42 | extra = "allow" 43 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/song.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | 3 | from .notes import Notes, BuddyNotes 4 | from .enum import SongType, LevelIndex 5 | 6 | 7 | class SongDifficulty(BaseModel): 8 | """谱面难度""" 9 | 10 | type: SongType 11 | """谱面类型""" 12 | difficulty: LevelIndex 13 | """难度""" 14 | level: str 15 | """难度等级""" 16 | level_value: float 17 | """谱面定数""" 18 | note_designer: str 19 | """谱师""" 20 | version: int 21 | """谱面首次出现版本""" 22 | notes: Notes | None = None 23 | """谱面物量""" 24 | 25 | 26 | class SongDifficultyUtage(SongDifficulty): 27 | """宴会场曲目谱面难度""" 28 | 29 | kanji: str 30 | """谱面属性""" 31 | description: str 32 | """谱面描述""" 33 | is_buddy: bool 34 | """是否为 BUDDY 谱面""" 35 | notes: Notes | BuddyNotes | None = None 36 | """ 值可空,谱面物量。is_buddy 为 true 时,notes 为 BuddyNotes。""" 37 | 38 | 39 | class SongDifficulties(BaseModel): 40 | """谱面难度""" 41 | 42 | standard: list[SongDifficulty] 43 | """曲目标准谱面难度列表""" 44 | dx: list[SongDifficulty] 45 | """曲目 DX 谱面难度列表""" 46 | utage: list[SongDifficultyUtage] | None = None 47 | """可选,宴会场曲目谱面难度列表""" 48 | 49 | 50 | class Song(BaseModel): 51 | """曲目""" 52 | 53 | id: int 54 | """曲目 ID""" 55 | title: str 56 | """曲名""" 57 | artist: str 58 | """艺术家""" 59 | genre: str 60 | """曲目分类""" 61 | bpm: int 62 | """曲目 BPM""" 63 | version: int 64 | """曲目首次出现版本""" 65 | rights: str | None = None 66 | """曲目版权信息""" 67 | disabled: bool | None = False 68 | """值可空,是否被禁用,默认值为 false""" 69 | difficulties: SongDifficulties 70 | """谱面难度""" 71 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/trend.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | 3 | 4 | class Trend(BaseModel): 5 | """DX Rating 趋势""" 6 | 7 | total: int 8 | """总 DX Rating""" 9 | standard: int 10 | """旧版本谱面总 DX Rating""" 11 | dx: int 12 | """现版本谱面总 DX Rating""" 13 | date: str 14 | """日期""" 15 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/schema/version.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | 3 | 4 | class Version(BaseModel): 5 | """曲目版本""" 6 | 7 | id: int 8 | """内部 ID""" 9 | title: str 10 | """版本标题""" 11 | version: int 12 | """主要版本 ID""" 13 | -------------------------------------------------------------------------------- /nonebot_plugin_lxns_maimai/utils.py: -------------------------------------------------------------------------------- 1 | from .apis import API 2 | from .schema.enum import SongType, LevelIndex 3 | from .schema import Song, Score, SongDifficulty, SongDifficultyUtage 4 | 5 | 6 | def get_difficulty( 7 | song: Song, type: SongType, level_index: LevelIndex 8 | ) -> SongDifficulty | SongDifficultyUtage | None: 9 | if type == SongType.utage and song.difficulties.utage: 10 | return song.difficulties.utage[level_index.value] 11 | elif type == SongType.standard: 12 | return song.difficulties.standard[level_index.value] 13 | elif type == SongType.dx: 14 | return song.difficulties.dx[level_index.value] 15 | else: 16 | return None 17 | 18 | 19 | async def calc_star_count(score: Score) -> int | None: 20 | """计算 DX 分数星星数量""" 21 | 22 | song = await API.get_song_info(score.id) 23 | difficulty = get_difficulty(song, score.type, score.level_index) 24 | 25 | if not difficulty or not difficulty.notes: 26 | return None 27 | 28 | if isinstance(difficulty, SongDifficultyUtage): 29 | percentage = ( 30 | score.dx_score / (difficulty.notes.left + difficulty.notes.right) * 3 # type: ignore 31 | ) * 100 32 | else: 33 | percentage = score.dx_score / (difficulty.notes.total * 3) * 100 # type: ignore 34 | 35 | if percentage >= 97: 36 | return 5 37 | elif percentage >= 95: 38 | return 4 39 | elif percentage >= 93: 40 | return 3 41 | elif percentage >= 90: 42 | return 2 43 | elif percentage >= 85: 44 | return 1 45 | else: 46 | return 0 47 | -------------------------------------------------------------------------------- /pdm.lock: -------------------------------------------------------------------------------- 1 | # This file is @generated by PDM. 2 | # It is not intended for manual editing. 3 | 4 | [metadata] 5 | groups = ["default", "adapters", "dev"] 6 | strategy = ["inherit_metadata"] 7 | lock_version = "4.5.0" 8 | content_hash = "sha256:6a5e9c1ce8440773677939933d4ecbf40b7fb4dda3236aa92fbcb1c30cf135f9" 9 | 10 | [[metadata.targets]] 11 | requires_python = ">=3.10" 12 | 13 | [[package]] 14 | name = "aiofiles" 15 | version = "24.1.0" 16 | requires_python = ">=3.8" 17 | summary = "File support for asyncio." 18 | groups = ["default"] 19 | files = [ 20 | {file = "aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5"}, 21 | {file = "aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c"}, 22 | ] 23 | 24 | [[package]] 25 | name = "alembic" 26 | version = "1.13.2" 27 | requires_python = ">=3.8" 28 | summary = "A database migration tool for SQLAlchemy." 29 | groups = ["default"] 30 | dependencies = [ 31 | "Mako", 32 | "SQLAlchemy>=1.3.0", 33 | "importlib-metadata; python_version < \"3.9\"", 34 | "importlib-resources; python_version < \"3.9\"", 35 | "typing-extensions>=4", 36 | ] 37 | files = [ 38 | {file = "alembic-1.13.2-py3-none-any.whl", hash = "sha256:6b8733129a6224a9a711e17c99b08462dbf7cc9670ba8f2e2ae9af860ceb1953"}, 39 | {file = "alembic-1.13.2.tar.gz", hash = "sha256:1ff0ae32975f4fd96028c39ed9bb3c867fe3af956bd7bb37343b54c9fe7445ef"}, 40 | ] 41 | 42 | [[package]] 43 | name = "annotated-types" 44 | version = "0.7.0" 45 | requires_python = ">=3.8" 46 | summary = "Reusable constraint types to use with typing.Annotated" 47 | groups = ["default", "adapters"] 48 | dependencies = [ 49 | "typing-extensions>=4.0.0; python_version < \"3.9\"", 50 | ] 51 | files = [ 52 | {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, 53 | {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, 54 | ] 55 | 56 | [[package]] 57 | name = "anyio" 58 | version = "4.4.0" 59 | requires_python = ">=3.8" 60 | summary = "High level compatibility layer for multiple asynchronous event loop implementations" 61 | groups = ["default"] 62 | dependencies = [ 63 | "exceptiongroup>=1.0.2; python_version < \"3.11\"", 64 | "idna>=2.8", 65 | "sniffio>=1.1", 66 | "typing-extensions>=4.1; python_version < \"3.11\"", 67 | ] 68 | files = [ 69 | {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, 70 | {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, 71 | ] 72 | 73 | [[package]] 74 | name = "arclet-alconna" 75 | version = "1.8.26" 76 | requires_python = ">=3.8" 77 | summary = "A High-performance, Generality, Humane Command Line Arguments Parser Library." 78 | groups = ["default"] 79 | dependencies = [ 80 | "nepattern<1.0.0,>=0.7.6", 81 | "tarina>=0.5.5", 82 | "typing-extensions>=4.5.0", 83 | ] 84 | files = [ 85 | {file = "arclet_alconna-1.8.26-py3-none-any.whl", hash = "sha256:9726c31947efb2cf6786c4a7962f6824e3b2831bb5c45991f2660adfe3958818"}, 86 | {file = "arclet_alconna-1.8.26.tar.gz", hash = "sha256:8acbfc5892aea25772105581cc5e69e765ff4947ac53014ec7feeb5991e0a4e1"}, 87 | ] 88 | 89 | [[package]] 90 | name = "arclet-alconna-tools" 91 | version = "0.7.9" 92 | requires_python = ">=3.8" 93 | summary = "Builtin Tools for Alconna" 94 | groups = ["default"] 95 | dependencies = [ 96 | "arclet-alconna>=1.8.21", 97 | "nepattern<1.0.0,>=0.7.3", 98 | ] 99 | files = [ 100 | {file = "arclet_alconna_tools-0.7.9-py3-none-any.whl", hash = "sha256:01a3462bb9f8dbe55010b394f7a0ac11e331799d463e326738870dce191aa608"}, 101 | {file = "arclet_alconna_tools-0.7.9.tar.gz", hash = "sha256:bded24c4157e13e2d803fe7b77ee246fda456206451337015513f150d1e4449c"}, 102 | ] 103 | 104 | [[package]] 105 | name = "black" 106 | version = "24.4.2" 107 | requires_python = ">=3.8" 108 | summary = "The uncompromising code formatter." 109 | groups = ["dev"] 110 | dependencies = [ 111 | "click>=8.0.0", 112 | "mypy-extensions>=0.4.3", 113 | "packaging>=22.0", 114 | "pathspec>=0.9.0", 115 | "platformdirs>=2", 116 | "tomli>=1.1.0; python_version < \"3.11\"", 117 | "typing-extensions>=4.0.1; python_version < \"3.11\"", 118 | ] 119 | files = [ 120 | {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, 121 | {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, 122 | {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, 123 | {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, 124 | {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, 125 | {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, 126 | {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, 127 | {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, 128 | {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, 129 | {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, 130 | {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, 131 | {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, 132 | {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, 133 | {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, 134 | ] 135 | 136 | [[package]] 137 | name = "certifi" 138 | version = "2024.7.4" 139 | requires_python = ">=3.6" 140 | summary = "Python package for providing Mozilla's CA Bundle." 141 | groups = ["default"] 142 | files = [ 143 | {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, 144 | {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, 145 | ] 146 | 147 | [[package]] 148 | name = "cfgv" 149 | version = "3.4.0" 150 | requires_python = ">=3.8" 151 | summary = "Validate configuration and produce human readable error messages." 152 | groups = ["dev"] 153 | files = [ 154 | {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, 155 | {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, 156 | ] 157 | 158 | [[package]] 159 | name = "click" 160 | version = "8.1.7" 161 | requires_python = ">=3.7" 162 | summary = "Composable command line interface toolkit" 163 | groups = ["default", "dev"] 164 | dependencies = [ 165 | "colorama; platform_system == \"Windows\"", 166 | "importlib-metadata; python_version < \"3.8\"", 167 | ] 168 | files = [ 169 | {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, 170 | {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, 171 | ] 172 | 173 | [[package]] 174 | name = "colorama" 175 | version = "0.4.6" 176 | requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 177 | summary = "Cross-platform colored terminal text." 178 | groups = ["default", "adapters", "dev"] 179 | marker = "platform_system == \"Windows\" or sys_platform == \"win32\"" 180 | files = [ 181 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 182 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 183 | ] 184 | 185 | [[package]] 186 | name = "distlib" 187 | version = "0.3.8" 188 | summary = "Distribution utilities" 189 | groups = ["dev"] 190 | files = [ 191 | {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, 192 | {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, 193 | ] 194 | 195 | [[package]] 196 | name = "exceptiongroup" 197 | version = "1.2.2" 198 | requires_python = ">=3.7" 199 | summary = "Backport of PEP 654 (exception groups)" 200 | groups = ["default"] 201 | marker = "python_version < \"3.11\"" 202 | files = [ 203 | {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, 204 | {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, 205 | ] 206 | 207 | [[package]] 208 | name = "expiringdictx" 209 | version = "1.1.0" 210 | requires_python = "<4,>=3.9" 211 | summary = "提供一个带有过期时间的字典数据结构,适用于缓存和临时存储。" 212 | groups = ["default"] 213 | dependencies = [ 214 | "lru-dict<2.0.0,>=1.3.0", 215 | ] 216 | files = [ 217 | {file = "expiringdictx-1.1.0-py3-none-any.whl", hash = "sha256:f5d38ae23b46a8f97da27ce0dd74e669430d43b2efe98232a4a81f10b43cde25"}, 218 | {file = "expiringdictx-1.1.0.tar.gz", hash = "sha256:f590a4bd656a5317c51e696c2f48fee97e1d3feb6de87e00cebeaad9035824fa"}, 219 | ] 220 | 221 | [[package]] 222 | name = "filelock" 223 | version = "3.15.4" 224 | requires_python = ">=3.8" 225 | summary = "A platform independent file lock." 226 | groups = ["dev"] 227 | files = [ 228 | {file = "filelock-3.15.4-py3-none-any.whl", hash = "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7"}, 229 | {file = "filelock-3.15.4.tar.gz", hash = "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb"}, 230 | ] 231 | 232 | [[package]] 233 | name = "greenlet" 234 | version = "3.0.3" 235 | requires_python = ">=3.7" 236 | summary = "Lightweight in-process concurrent programming" 237 | groups = ["default"] 238 | files = [ 239 | {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, 240 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, 241 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, 242 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, 243 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, 244 | {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, 245 | {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, 246 | {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, 247 | {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, 248 | {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, 249 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, 250 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, 251 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, 252 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, 253 | {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, 254 | {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, 255 | {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, 256 | {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, 257 | {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, 258 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, 259 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, 260 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, 261 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, 262 | {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, 263 | {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, 264 | {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, 265 | {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, 266 | {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, 267 | ] 268 | 269 | [[package]] 270 | name = "h11" 271 | version = "0.14.0" 272 | requires_python = ">=3.7" 273 | summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 274 | groups = ["default"] 275 | dependencies = [ 276 | "typing-extensions; python_version < \"3.8\"", 277 | ] 278 | files = [ 279 | {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, 280 | {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, 281 | ] 282 | 283 | [[package]] 284 | name = "httpcore" 285 | version = "1.0.5" 286 | requires_python = ">=3.8" 287 | summary = "A minimal low-level HTTP client." 288 | groups = ["default"] 289 | dependencies = [ 290 | "certifi", 291 | "h11<0.15,>=0.13", 292 | ] 293 | files = [ 294 | {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, 295 | {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, 296 | ] 297 | 298 | [[package]] 299 | name = "httpx" 300 | version = "0.27.0" 301 | requires_python = ">=3.8" 302 | summary = "The next generation HTTP client." 303 | groups = ["default"] 304 | dependencies = [ 305 | "anyio", 306 | "certifi", 307 | "httpcore==1.*", 308 | "idna", 309 | "sniffio", 310 | ] 311 | files = [ 312 | {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, 313 | {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, 314 | ] 315 | 316 | [[package]] 317 | name = "identify" 318 | version = "2.6.0" 319 | requires_python = ">=3.8" 320 | summary = "File identification library for Python" 321 | groups = ["dev"] 322 | files = [ 323 | {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, 324 | {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, 325 | ] 326 | 327 | [[package]] 328 | name = "idna" 329 | version = "3.7" 330 | requires_python = ">=3.5" 331 | summary = "Internationalized Domain Names in Applications (IDNA)" 332 | groups = ["default", "adapters"] 333 | files = [ 334 | {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, 335 | {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, 336 | ] 337 | 338 | [[package]] 339 | name = "importlib-metadata" 340 | version = "8.2.0" 341 | requires_python = ">=3.8" 342 | summary = "Read metadata from Python packages" 343 | groups = ["default"] 344 | dependencies = [ 345 | "typing-extensions>=3.6.4; python_version < \"3.8\"", 346 | "zipp>=0.5", 347 | ] 348 | files = [ 349 | {file = "importlib_metadata-8.2.0-py3-none-any.whl", hash = "sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369"}, 350 | {file = "importlib_metadata-8.2.0.tar.gz", hash = "sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d"}, 351 | ] 352 | 353 | [[package]] 354 | name = "importlib-resources" 355 | version = "6.4.2" 356 | requires_python = ">=3.8" 357 | summary = "Read resources from Python packages" 358 | groups = ["default"] 359 | marker = "python_version < \"3.12\"" 360 | dependencies = [ 361 | "zipp>=3.1.0; python_version < \"3.10\"", 362 | ] 363 | files = [ 364 | {file = "importlib_resources-6.4.2-py3-none-any.whl", hash = "sha256:8bba8c54a8a3afaa1419910845fa26ebd706dc716dd208d9b158b4b6966f5c5c"}, 365 | {file = "importlib_resources-6.4.2.tar.gz", hash = "sha256:6cbfbefc449cc6e2095dd184691b7a12a04f40bc75dd4c55d31c34f174cdf57a"}, 366 | ] 367 | 368 | [[package]] 369 | name = "isort" 370 | version = "5.13.2" 371 | requires_python = ">=3.8.0" 372 | summary = "A Python utility / library to sort Python imports." 373 | groups = ["dev"] 374 | files = [ 375 | {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, 376 | {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, 377 | ] 378 | 379 | [[package]] 380 | name = "jinja2" 381 | version = "3.1.4" 382 | requires_python = ">=3.7" 383 | summary = "A very fast and expressive template engine." 384 | groups = ["default"] 385 | dependencies = [ 386 | "MarkupSafe>=2.0", 387 | ] 388 | files = [ 389 | {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, 390 | {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, 391 | ] 392 | 393 | [[package]] 394 | name = "loguru" 395 | version = "0.7.2" 396 | requires_python = ">=3.5" 397 | summary = "Python logging made (stupidly) simple" 398 | groups = ["default", "adapters"] 399 | dependencies = [ 400 | "aiocontextvars>=0.2.0; python_version < \"3.7\"", 401 | "colorama>=0.3.4; sys_platform == \"win32\"", 402 | "win32-setctime>=1.0.0; sys_platform == \"win32\"", 403 | ] 404 | files = [ 405 | {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, 406 | {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, 407 | ] 408 | 409 | [[package]] 410 | name = "lru-dict" 411 | version = "1.3.0" 412 | requires_python = ">=3.8" 413 | summary = "An Dict like LRU container." 414 | groups = ["default"] 415 | files = [ 416 | {file = "lru-dict-1.3.0.tar.gz", hash = "sha256:54fd1966d6bd1fcde781596cb86068214edeebff1db13a2cea11079e3fd07b6b"}, 417 | {file = "lru_dict-1.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4073333894db9840f066226d50e6f914a2240711c87d60885d8c940b69a6673f"}, 418 | {file = "lru_dict-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0ad6361e4dd63b47b2fc8eab344198f37387e1da3dcfacfee19bafac3ec9f1eb"}, 419 | {file = "lru_dict-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c637ab54b8cd9802fe19b260261e38820d748adf7606e34045d3c799b6dde813"}, 420 | {file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fce5f95489ca1fc158cc9fe0f4866db9cec82c2be0470926a9080570392beaf"}, 421 | {file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2bf2e24cf5f19c3ff69bf639306e83dced273e6fa775b04e190d7f5cd16f794"}, 422 | {file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e90059f7701bef3c4da073d6e0434a9c7dc551d5adce30e6b99ef86b186f4b4a"}, 423 | {file = "lru_dict-1.3.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ecb7ae557239c64077e9b26a142eb88e63cddb104111a5122de7bebbbd00098"}, 424 | {file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6af36166d22dba851e06a13e35bbf33845d3dd88872e6aebbc8e3e7db70f4682"}, 425 | {file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ee38d420c77eed548df47b7d74b5169a98e71c9e975596e31ab808e76d11f09"}, 426 | {file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0e1845024c31e6ff246c9eb5e6f6f1a8bb564c06f8a7d6d031220044c081090b"}, 427 | {file = "lru_dict-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3ca5474b1649555d014be1104e5558a92497509021a5ba5ea6e9b492303eb66b"}, 428 | {file = "lru_dict-1.3.0-cp310-cp310-win32.whl", hash = "sha256:ebb03a9bd50c2ed86d4f72a54e0aae156d35a14075485b2127c4b01a3f4a63fa"}, 429 | {file = "lru_dict-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:04cda617f4e4c27009005d0a8185ef02829b14b776d2791f5c994cc9d668bc24"}, 430 | {file = "lru_dict-1.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:20c595764695d20bdc3ab9b582e0cc99814da183544afb83783a36d6741a0dac"}, 431 | {file = "lru_dict-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d9b30a8f50c3fa72a494eca6be5810a1b5c89e4f0fda89374f0d1c5ad8d37d51"}, 432 | {file = "lru_dict-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9710737584650a4251b9a566cbb1a86f83437adb209c9ba43a4e756d12faf0d7"}, 433 | {file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b84c321ae34f2f40aae80e18b6fa08b31c90095792ab64bb99d2e385143effaa"}, 434 | {file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eed24272b4121b7c22f234daed99899817d81d671b3ed030c876ac88bc9dc890"}, 435 | {file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd13af06dab7c6ee92284fd02ed9a5613a07d5c1b41948dc8886e7207f86dfd"}, 436 | {file = "lru_dict-1.3.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1efc59bfba6aac33684d87b9e02813b0e2445b2f1c444dae2a0b396ad0ed60c"}, 437 | {file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfaf75ac574447afcf8ad998789071af11d2bcf6f947643231f692948839bd98"}, 438 | {file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c95f8751e2abd6f778da0399c8e0239321d560dbc58cb063827123137d213242"}, 439 | {file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:abd0c284b26b5c4ee806ca4f33ab5e16b4bf4d5ec9e093e75a6f6287acdde78e"}, 440 | {file = "lru_dict-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a47740652b25900ac5ce52667b2eade28d8b5fdca0ccd3323459df710e8210a"}, 441 | {file = "lru_dict-1.3.0-cp311-cp311-win32.whl", hash = "sha256:a690c23fc353681ed8042d9fe8f48f0fb79a57b9a45daea2f0be1eef8a1a4aa4"}, 442 | {file = "lru_dict-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:efd3f4e0385d18f20f7ea6b08af2574c1bfaa5cb590102ef1bee781bdfba84bc"}, 443 | {file = "lru_dict-1.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c279068f68af3b46a5d649855e1fb87f5705fe1f744a529d82b2885c0e1fc69d"}, 444 | {file = "lru_dict-1.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:350e2233cfee9f326a0d7a08e309372d87186565e43a691b120006285a0ac549"}, 445 | {file = "lru_dict-1.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4eafb188a84483b3231259bf19030859f070321b00326dcb8e8c6cbf7db4b12f"}, 446 | {file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73593791047e36b37fdc0b67b76aeed439fcea80959c7d46201240f9ec3b2563"}, 447 | {file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1958cb70b9542773d6241974646e5410e41ef32e5c9e437d44040d59bd80daf2"}, 448 | {file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc1cd3ed2cee78a47f11f3b70be053903bda197a873fd146e25c60c8e5a32cd6"}, 449 | {file = "lru_dict-1.3.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82eb230d48eaebd6977a92ddaa6d788f14cf4f4bcf5bbffa4ddfd60d051aa9d4"}, 450 | {file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5ad659cbc349d0c9ba8e536b5f40f96a70c360f43323c29f4257f340d891531c"}, 451 | {file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ba490b8972531d153ac0d4e421f60d793d71a2f4adbe2f7740b3c55dce0a12f1"}, 452 | {file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:c0131351b8a7226c69f1eba5814cbc9d1d8daaf0fdec1ae3f30508e3de5262d4"}, 453 | {file = "lru_dict-1.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0e88dba16695f17f41701269fa046197a3fd7b34a8dba744c8749303ddaa18df"}, 454 | {file = "lru_dict-1.3.0-cp312-cp312-win32.whl", hash = "sha256:6ffaf595e625b388babc8e7d79b40f26c7485f61f16efe76764e32dce9ea17fc"}, 455 | {file = "lru_dict-1.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf9da32ef2582434842ab6ba6e67290debfae72771255a8e8ab16f3e006de0aa"}, 456 | {file = "lru_dict-1.3.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f8f7824db5a64581180ab9d09842e6dd9fcdc46aac9cb592a0807cd37ea55680"}, 457 | {file = "lru_dict-1.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acd04b7e7b0c0c192d738df9c317093335e7282c64c9d1bb6b7ebb54674b4e24"}, 458 | {file = "lru_dict-1.3.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5c20f236f27551e3f0adbf1a987673fb1e9c38d6d284502cd38f5a3845ef681"}, 459 | {file = "lru_dict-1.3.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca3703ff03b03a1848c563bc2663d0ad813c1cd42c4d9cf75b623716d4415d9a"}, 460 | {file = "lru_dict-1.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a9fb71ba262c6058a0017ce83d343370d0a0dbe2ae62c2eef38241ec13219330"}, 461 | ] 462 | 463 | [[package]] 464 | name = "mako" 465 | version = "1.3.5" 466 | requires_python = ">=3.8" 467 | summary = "A super-fast templating language that borrows the best ideas from the existing templating languages." 468 | groups = ["default"] 469 | dependencies = [ 470 | "MarkupSafe>=0.9.2", 471 | ] 472 | files = [ 473 | {file = "Mako-1.3.5-py3-none-any.whl", hash = "sha256:260f1dbc3a519453a9c856dedfe4beb4e50bd5a26d96386cb6c80856556bb91a"}, 474 | {file = "Mako-1.3.5.tar.gz", hash = "sha256:48dbc20568c1d276a2698b36d968fa76161bf127194907ea6fc594fa81f943bc"}, 475 | ] 476 | 477 | [[package]] 478 | name = "markdown" 479 | version = "3.7" 480 | requires_python = ">=3.8" 481 | summary = "Python implementation of John Gruber's Markdown." 482 | groups = ["default"] 483 | dependencies = [ 484 | "importlib-metadata>=4.4; python_version < \"3.10\"", 485 | ] 486 | files = [ 487 | {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, 488 | {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, 489 | ] 490 | 491 | [[package]] 492 | name = "markupsafe" 493 | version = "2.1.5" 494 | requires_python = ">=3.7" 495 | summary = "Safely add untrusted strings to HTML/XML markup." 496 | groups = ["default"] 497 | files = [ 498 | {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, 499 | {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, 500 | {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, 501 | {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, 502 | {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, 503 | {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, 504 | {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, 505 | {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, 506 | {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, 507 | {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, 508 | {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, 509 | {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, 510 | {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, 511 | {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, 512 | {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, 513 | {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, 514 | {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, 515 | {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, 516 | {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, 517 | {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, 518 | {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, 519 | {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, 520 | {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, 521 | {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, 522 | {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, 523 | {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, 524 | {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, 525 | {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, 526 | {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, 527 | {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, 528 | {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, 529 | ] 530 | 531 | [[package]] 532 | name = "msgpack" 533 | version = "1.0.8" 534 | requires_python = ">=3.8" 535 | summary = "MessagePack serializer" 536 | groups = ["adapters"] 537 | files = [ 538 | {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868"}, 539 | {file = "msgpack-1.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c"}, 540 | {file = "msgpack-1.0.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659"}, 541 | {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2"}, 542 | {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982"}, 543 | {file = "msgpack-1.0.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa"}, 544 | {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128"}, 545 | {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d"}, 546 | {file = "msgpack-1.0.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653"}, 547 | {file = "msgpack-1.0.8-cp310-cp310-win32.whl", hash = "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693"}, 548 | {file = "msgpack-1.0.8-cp310-cp310-win_amd64.whl", hash = "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a"}, 549 | {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836"}, 550 | {file = "msgpack-1.0.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad"}, 551 | {file = "msgpack-1.0.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b"}, 552 | {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba"}, 553 | {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85"}, 554 | {file = "msgpack-1.0.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950"}, 555 | {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a"}, 556 | {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b"}, 557 | {file = "msgpack-1.0.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce"}, 558 | {file = "msgpack-1.0.8-cp311-cp311-win32.whl", hash = "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305"}, 559 | {file = "msgpack-1.0.8-cp311-cp311-win_amd64.whl", hash = "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e"}, 560 | {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee"}, 561 | {file = "msgpack-1.0.8-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b"}, 562 | {file = "msgpack-1.0.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8"}, 563 | {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3"}, 564 | {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc"}, 565 | {file = "msgpack-1.0.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58"}, 566 | {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f"}, 567 | {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04"}, 568 | {file = "msgpack-1.0.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543"}, 569 | {file = "msgpack-1.0.8-cp312-cp312-win32.whl", hash = "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c"}, 570 | {file = "msgpack-1.0.8-cp312-cp312-win_amd64.whl", hash = "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd"}, 571 | {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, 572 | ] 573 | 574 | [[package]] 575 | name = "multidict" 576 | version = "6.0.5" 577 | requires_python = ">=3.7" 578 | summary = "multidict implementation" 579 | groups = ["default", "adapters"] 580 | files = [ 581 | {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, 582 | {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, 583 | {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, 584 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, 585 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, 586 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, 587 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, 588 | {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, 589 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, 590 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, 591 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, 592 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, 593 | {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, 594 | {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, 595 | {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, 596 | {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, 597 | {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, 598 | {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, 599 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, 600 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, 601 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, 602 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, 603 | {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, 604 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, 605 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, 606 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, 607 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, 608 | {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, 609 | {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, 610 | {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, 611 | {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, 612 | {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, 613 | {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, 614 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, 615 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, 616 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, 617 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, 618 | {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, 619 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, 620 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, 621 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, 622 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, 623 | {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, 624 | {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, 625 | {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, 626 | {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, 627 | {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, 628 | ] 629 | 630 | [[package]] 631 | name = "mypy-extensions" 632 | version = "1.0.0" 633 | requires_python = ">=3.5" 634 | summary = "Type system extensions for programs checked with the mypy type checker." 635 | groups = ["dev"] 636 | files = [ 637 | {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, 638 | {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, 639 | ] 640 | 641 | [[package]] 642 | name = "nepattern" 643 | version = "0.7.6" 644 | requires_python = ">=3.8" 645 | summary = "a complex pattern, support typing" 646 | groups = ["default"] 647 | dependencies = [ 648 | "tarina>=0.5.1", 649 | "typing-extensions>=4.5.0", 650 | ] 651 | files = [ 652 | {file = "nepattern-0.7.6-py3-none-any.whl", hash = "sha256:233d0befecc190f228ded3651a85faaf53f1308bba40ab8ddec379d0d3c88051"}, 653 | {file = "nepattern-0.7.6.tar.gz", hash = "sha256:07bd5b2f3b9b9739b703bf723ffd642ca93738a32df7b699d57d6f338d46bad0"}, 654 | ] 655 | 656 | [[package]] 657 | name = "nodeenv" 658 | version = "1.9.1" 659 | requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 660 | summary = "Node.js virtual environment builder" 661 | groups = ["dev"] 662 | files = [ 663 | {file = "nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9"}, 664 | {file = "nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f"}, 665 | ] 666 | 667 | [[package]] 668 | name = "nonebot-adapter-onebot" 669 | version = "2.4.4" 670 | requires_python = "<4.0,>=3.9" 671 | summary = "OneBot(CQHTTP) adapter for nonebot2" 672 | groups = ["adapters"] 673 | dependencies = [ 674 | "msgpack<2.0.0,>=1.0.3", 675 | "nonebot2<3.0.0,>=2.2.0", 676 | "pydantic!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0", 677 | "typing-extensions<5.0.0,>=4.0.0", 678 | ] 679 | files = [ 680 | {file = "nonebot_adapter_onebot-2.4.4-py3-none-any.whl", hash = "sha256:4dceeec7332bb560652c764405e9dd350268303f69b7c0e92b7cfebe876e8d39"}, 681 | {file = "nonebot_adapter_onebot-2.4.4.tar.gz", hash = "sha256:c8a3645f74a3e43c85f092fb670508c662c36831f019a15e4d74eaac686089f0"}, 682 | ] 683 | 684 | [[package]] 685 | name = "nonebot-plugin-alconna" 686 | version = "0.52.0" 687 | requires_python = ">=3.9" 688 | summary = "Alconna Adapter for Nonebot" 689 | groups = ["default"] 690 | dependencies = [ 691 | "arclet-alconna-tools>=0.7.9", 692 | "arclet-alconna>=1.8.25", 693 | "importlib-metadata>=4.13.0", 694 | "nepattern>=0.7.4", 695 | "nonebot-plugin-waiter>=0.6.0", 696 | "nonebot2>=2.3.0", 697 | "tarina>=0.5.5", 698 | ] 699 | files = [ 700 | {file = "nonebot_plugin_alconna-0.52.0-py3-none-any.whl", hash = "sha256:e187a355be39c0fbaeecea358d60b591d0bc2b06849a10387f370a695f880aa7"}, 701 | {file = "nonebot_plugin_alconna-0.52.0.tar.gz", hash = "sha256:f6146163fd2d69cee32cfbbb740ff32a0eaba118b306a212421410661c638ecc"}, 702 | ] 703 | 704 | [[package]] 705 | name = "nonebot-plugin-htmlrender" 706 | version = "0.3.5" 707 | requires_python = "<4.0,>=3.9" 708 | summary = "通过浏览器渲染图片" 709 | groups = ["default"] 710 | dependencies = [ 711 | "Pygments>=2.10.0", 712 | "aiofiles>=0.8.0", 713 | "jinja2>=3.0.3", 714 | "markdown>=3.3.6", 715 | "nonebot2>=2.2.0", 716 | "playwright>=1.17.2", 717 | "pymdown-extensions>=9.1", 718 | "python-markdown-math>=0.8", 719 | ] 720 | files = [ 721 | {file = "nonebot_plugin_htmlrender-0.3.5-py3-none-any.whl", hash = "sha256:a46c6a1b57ae79e26ed996ca1eca2c729f8f4a53aed993b7664f956d7eeca29e"}, 722 | {file = "nonebot_plugin_htmlrender-0.3.5.tar.gz", hash = "sha256:22b3e801bde06e66528582aa085317b27c42e82e8d7e72aa04218635e03c1303"}, 723 | ] 724 | 725 | [[package]] 726 | name = "nonebot-plugin-localstore" 727 | version = "0.7.1" 728 | requires_python = "<4.0,>=3.9" 729 | summary = "Local Storage Support for NoneBot2" 730 | groups = ["default"] 731 | dependencies = [ 732 | "nonebot2<3.0.0,>=2.2.0", 733 | "pydantic!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0", 734 | "typing-extensions<5.0.0,>=4.0.0", 735 | ] 736 | files = [ 737 | {file = "nonebot_plugin_localstore-0.7.1-py3-none-any.whl", hash = "sha256:7908af162d1d0e8c736ae8863723325d057289f6b080ae44ff9ff39294f9ed16"}, 738 | {file = "nonebot_plugin_localstore-0.7.1.tar.gz", hash = "sha256:9c2a7b39b50240896d9306adb79d8047308d0e77b88e3272b19be4908bdaabc9"}, 739 | ] 740 | 741 | [[package]] 742 | name = "nonebot-plugin-orm" 743 | version = "0.7.6" 744 | requires_python = "<4.0,>=3.8" 745 | summary = "SQLAlchemy ORM support for nonebot" 746 | groups = ["default"] 747 | dependencies = [ 748 | "alembic~=1.13", 749 | "click~=8.1", 750 | "importlib-metadata~=7.0; python_version < \"3.10\"", 751 | "importlib-resources~=6.1; python_version < \"3.12\"", 752 | "nonebot-plugin-localstore~=0.6", 753 | "nonebot2~=2.2", 754 | "sqlalchemy~=2.0", 755 | "typing-extensions~=4.9; python_version < \"3.11\"", 756 | ] 757 | files = [ 758 | {file = "nonebot_plugin_orm-0.7.6-py3-none-any.whl", hash = "sha256:6ce808d7e847eb7c1a738609b0e94bb612488650c5150ae1b2d67463034bb255"}, 759 | {file = "nonebot_plugin_orm-0.7.6.tar.gz", hash = "sha256:3ae4ac362a8ea6e6467666f654287855a30447f8fa457af88f1760f155c5d68c"}, 760 | ] 761 | 762 | [[package]] 763 | name = "nonebot-plugin-session" 764 | version = "0.3.2" 765 | requires_python = "<4.0,>=3.9" 766 | summary = "Nonebot2 会话信息提取与会话id定义" 767 | groups = ["default"] 768 | dependencies = [ 769 | "nonebot2<3.0.0,>=2.3.0", 770 | "strenum<0.5.0,>=0.4.15", 771 | ] 772 | files = [ 773 | {file = "nonebot_plugin_session-0.3.2-py3-none-any.whl", hash = "sha256:785e74ff656e46d84c4dbbac125f9a9adebcc4b9ff7db700527e6e47d47aabd6"}, 774 | {file = "nonebot_plugin_session-0.3.2.tar.gz", hash = "sha256:da0dabe9108151052a6e83d9923068d2ec43a93810ad37b264ed65aee2c69f93"}, 775 | ] 776 | 777 | [[package]] 778 | name = "nonebot-plugin-user" 779 | version = "0.4.2" 780 | requires_python = ">=3.9" 781 | summary = "适用于 Nonebot2 的用户插件" 782 | groups = ["default"] 783 | dependencies = [ 784 | "expiringdictx>=1.1.0", 785 | "nonebot-plugin-alconna>=0.37.1", 786 | "nonebot-plugin-orm>=0.7.0", 787 | "nonebot-plugin-session>=0.3.0", 788 | "nonebot2>=2.2.0", 789 | ] 790 | files = [ 791 | {file = "nonebot_plugin_user-0.4.2-py3-none-any.whl", hash = "sha256:c7312109614cb40e1887e534deb1e81dd213b2304dd34cba738b35580971cc9f"}, 792 | {file = "nonebot_plugin_user-0.4.2.tar.gz", hash = "sha256:422062dfa97d8fbd8dbd11ab46b240e86d90fcca3d991886596c3332e4211694"}, 793 | ] 794 | 795 | [[package]] 796 | name = "nonebot-plugin-waiter" 797 | version = "0.7.1" 798 | requires_python = ">=3.9" 799 | summary = "An alternative for got-and-reject in Nonebot" 800 | groups = ["default"] 801 | dependencies = [ 802 | "nonebot2>=2.3.0", 803 | ] 804 | files = [ 805 | {file = "nonebot_plugin_waiter-0.7.1-py3-none-any.whl", hash = "sha256:b9967cc7aeea0db86053ada20929841830aea60bb8c7da26d0483eefda75635c"}, 806 | {file = "nonebot_plugin_waiter-0.7.1.tar.gz", hash = "sha256:8be2adc175e45ca794881e3df449302b8e6e045cd9bae97a809907f4200b4110"}, 807 | ] 808 | 809 | [[package]] 810 | name = "nonebot2" 811 | version = "2.3.3" 812 | requires_python = "<4.0,>=3.9" 813 | summary = "An asynchronous python bot framework." 814 | groups = ["default", "adapters"] 815 | dependencies = [ 816 | "loguru<1.0.0,>=0.6.0", 817 | "pydantic!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0", 818 | "pygtrie<3.0.0,>=2.4.1", 819 | "python-dotenv<2.0.0,>=0.21.0", 820 | "tomli<3.0.0,>=2.0.1; python_version < \"3.11\"", 821 | "typing-extensions<5.0.0,>=4.4.0", 822 | "yarl<2.0.0,>=1.7.2", 823 | ] 824 | files = [ 825 | {file = "nonebot2-2.3.3-py3-none-any.whl", hash = "sha256:5bc8d073091347f29c4a1a2f927c24a8941e5d286c77139376259318b9bbfc68"}, 826 | {file = "nonebot2-2.3.3.tar.gz", hash = "sha256:4fa7707de5d708c27cc49493bc78a07fee2ba01f5516835a2ea5fbebb49b9dfa"}, 827 | ] 828 | 829 | [[package]] 830 | name = "packaging" 831 | version = "24.1" 832 | requires_python = ">=3.8" 833 | summary = "Core utilities for Python packages" 834 | groups = ["dev"] 835 | files = [ 836 | {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, 837 | {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, 838 | ] 839 | 840 | [[package]] 841 | name = "pathspec" 842 | version = "0.12.1" 843 | requires_python = ">=3.8" 844 | summary = "Utility library for gitignore style pattern matching of file paths." 845 | groups = ["dev"] 846 | files = [ 847 | {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, 848 | {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, 849 | ] 850 | 851 | [[package]] 852 | name = "platformdirs" 853 | version = "4.2.2" 854 | requires_python = ">=3.8" 855 | summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." 856 | groups = ["dev"] 857 | files = [ 858 | {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, 859 | {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, 860 | ] 861 | 862 | [[package]] 863 | name = "playwright" 864 | version = "1.46.0" 865 | requires_python = ">=3.8" 866 | summary = "A high-level API to automate web browsers" 867 | groups = ["default"] 868 | dependencies = [ 869 | "greenlet==3.0.3", 870 | "pyee==11.1.0", 871 | ] 872 | files = [ 873 | {file = "playwright-1.46.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:fa60b95c16f6ce954636229a6c9dd885485326bca52d5ba20d02c0bc731a2bbb"}, 874 | {file = "playwright-1.46.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:73dcfc24834f4d004bc862ed0d74b4c1406793a8164734238ad035356fddc8ac"}, 875 | {file = "playwright-1.46.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:f5acfec1dbdc84d02dc696a17a344227e66c91413eab2036428dab405f195b82"}, 876 | {file = "playwright-1.46.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:3b418509f45879f1403d070858657a39bd0b333b23d92c37355682b671726df9"}, 877 | {file = "playwright-1.46.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23580f6a3f99757bb9779d29be37144cb9328cd9bafa178e6db5b3ab4b7faf4c"}, 878 | {file = "playwright-1.46.0-py3-none-win32.whl", hash = "sha256:85f44dd32a23d02850f0ff4dafe51580e5199531fff5121a62489d9838707782"}, 879 | {file = "playwright-1.46.0-py3-none-win_amd64.whl", hash = "sha256:f14a7fd7e24e954eec6ce61d787d499e41937ade811a0818e9a088aabe28ebb6"}, 880 | ] 881 | 882 | [[package]] 883 | name = "pre-commit" 884 | version = "3.7.1" 885 | requires_python = ">=3.9" 886 | summary = "A framework for managing and maintaining multi-language pre-commit hooks." 887 | groups = ["dev"] 888 | dependencies = [ 889 | "cfgv>=2.0.0", 890 | "identify>=1.0.0", 891 | "nodeenv>=0.11.1", 892 | "pyyaml>=5.1", 893 | "virtualenv>=20.10.0", 894 | ] 895 | files = [ 896 | {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"}, 897 | {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"}, 898 | ] 899 | 900 | [[package]] 901 | name = "pydantic" 902 | version = "2.8.2" 903 | requires_python = ">=3.8" 904 | summary = "Data validation using Python type hints" 905 | groups = ["default", "adapters"] 906 | dependencies = [ 907 | "annotated-types>=0.4.0", 908 | "pydantic-core==2.20.1", 909 | "typing-extensions>=4.12.2; python_version >= \"3.13\"", 910 | "typing-extensions>=4.6.1; python_version < \"3.13\"", 911 | ] 912 | files = [ 913 | {file = "pydantic-2.8.2-py3-none-any.whl", hash = "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"}, 914 | {file = "pydantic-2.8.2.tar.gz", hash = "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a"}, 915 | ] 916 | 917 | [[package]] 918 | name = "pydantic-core" 919 | version = "2.20.1" 920 | requires_python = ">=3.8" 921 | summary = "Core functionality for Pydantic validation and serialization" 922 | groups = ["default", "adapters"] 923 | dependencies = [ 924 | "typing-extensions!=4.7.0,>=4.6.0", 925 | ] 926 | files = [ 927 | {file = "pydantic_core-2.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3"}, 928 | {file = "pydantic_core-2.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6"}, 929 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a"}, 930 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3"}, 931 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1"}, 932 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953"}, 933 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98"}, 934 | {file = "pydantic_core-2.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a"}, 935 | {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a"}, 936 | {file = "pydantic_core-2.20.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840"}, 937 | {file = "pydantic_core-2.20.1-cp310-none-win32.whl", hash = "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250"}, 938 | {file = "pydantic_core-2.20.1-cp310-none-win_amd64.whl", hash = "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c"}, 939 | {file = "pydantic_core-2.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312"}, 940 | {file = "pydantic_core-2.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88"}, 941 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc"}, 942 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43"}, 943 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6"}, 944 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121"}, 945 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1"}, 946 | {file = "pydantic_core-2.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b"}, 947 | {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"}, 948 | {file = "pydantic_core-2.20.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b"}, 949 | {file = "pydantic_core-2.20.1-cp311-none-win32.whl", hash = "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a"}, 950 | {file = "pydantic_core-2.20.1-cp311-none-win_amd64.whl", hash = "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2"}, 951 | {file = "pydantic_core-2.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231"}, 952 | {file = "pydantic_core-2.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9"}, 953 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f"}, 954 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52"}, 955 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237"}, 956 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe"}, 957 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e"}, 958 | {file = "pydantic_core-2.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24"}, 959 | {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1"}, 960 | {file = "pydantic_core-2.20.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd"}, 961 | {file = "pydantic_core-2.20.1-cp312-none-win32.whl", hash = "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688"}, 962 | {file = "pydantic_core-2.20.1-cp312-none-win_amd64.whl", hash = "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d"}, 963 | {file = "pydantic_core-2.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686"}, 964 | {file = "pydantic_core-2.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a"}, 965 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b"}, 966 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19"}, 967 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac"}, 968 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703"}, 969 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c"}, 970 | {file = "pydantic_core-2.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83"}, 971 | {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203"}, 972 | {file = "pydantic_core-2.20.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0"}, 973 | {file = "pydantic_core-2.20.1-cp313-none-win32.whl", hash = "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e"}, 974 | {file = "pydantic_core-2.20.1-cp313-none-win_amd64.whl", hash = "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20"}, 975 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906"}, 976 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94"}, 977 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f"}, 978 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482"}, 979 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6"}, 980 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc"}, 981 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99"}, 982 | {file = "pydantic_core-2.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6"}, 983 | {file = "pydantic_core-2.20.1.tar.gz", hash = "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4"}, 984 | ] 985 | 986 | [[package]] 987 | name = "pyee" 988 | version = "11.1.0" 989 | requires_python = ">=3.8" 990 | summary = "A rough port of Node.js's EventEmitter to Python with a few tricks of its own" 991 | groups = ["default"] 992 | dependencies = [ 993 | "typing-extensions", 994 | ] 995 | files = [ 996 | {file = "pyee-11.1.0-py3-none-any.whl", hash = "sha256:5d346a7d0f861a4b2e6c47960295bd895f816725b27d656181947346be98d7c1"}, 997 | {file = "pyee-11.1.0.tar.gz", hash = "sha256:b53af98f6990c810edd9b56b87791021a8f54fd13db4edd1142438d44ba2263f"}, 998 | ] 999 | 1000 | [[package]] 1001 | name = "pygments" 1002 | version = "2.18.0" 1003 | requires_python = ">=3.8" 1004 | summary = "Pygments is a syntax highlighting package written in Python." 1005 | groups = ["default"] 1006 | files = [ 1007 | {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, 1008 | {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, 1009 | ] 1010 | 1011 | [[package]] 1012 | name = "pygtrie" 1013 | version = "2.5.0" 1014 | summary = "A pure Python trie data structure implementation." 1015 | groups = ["default", "adapters"] 1016 | files = [ 1017 | {file = "pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16"}, 1018 | {file = "pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2"}, 1019 | ] 1020 | 1021 | [[package]] 1022 | name = "pymdown-extensions" 1023 | version = "10.9" 1024 | requires_python = ">=3.8" 1025 | summary = "Extension pack for Python Markdown." 1026 | groups = ["default"] 1027 | dependencies = [ 1028 | "markdown>=3.6", 1029 | "pyyaml", 1030 | ] 1031 | files = [ 1032 | {file = "pymdown_extensions-10.9-py3-none-any.whl", hash = "sha256:d323f7e90d83c86113ee78f3fe62fc9dee5f56b54d912660703ea1816fed5626"}, 1033 | {file = "pymdown_extensions-10.9.tar.gz", hash = "sha256:6ff740bcd99ec4172a938970d42b96128bdc9d4b9bcad72494f29921dc69b753"}, 1034 | ] 1035 | 1036 | [[package]] 1037 | name = "python-dotenv" 1038 | version = "1.0.1" 1039 | requires_python = ">=3.8" 1040 | summary = "Read key-value pairs from a .env file and set them as environment variables" 1041 | groups = ["default", "adapters"] 1042 | files = [ 1043 | {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, 1044 | {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, 1045 | ] 1046 | 1047 | [[package]] 1048 | name = "python-markdown-math" 1049 | version = "0.8" 1050 | requires_python = ">=3.6" 1051 | summary = "Math extension for Python-Markdown" 1052 | groups = ["default"] 1053 | dependencies = [ 1054 | "Markdown>=3.0", 1055 | ] 1056 | files = [ 1057 | {file = "python-markdown-math-0.8.tar.gz", hash = "sha256:8564212af679fc18d53f38681f16080fcd3d186073f23825c7ce86fadd3e3635"}, 1058 | {file = "python_markdown_math-0.8-py3-none-any.whl", hash = "sha256:c685249d84b5b697e9114d7beb352bd8ca2e07fd268fd4057ffca888c14641e5"}, 1059 | ] 1060 | 1061 | [[package]] 1062 | name = "pyyaml" 1063 | version = "6.0.1" 1064 | requires_python = ">=3.6" 1065 | summary = "YAML parser and emitter for Python" 1066 | groups = ["default", "dev"] 1067 | files = [ 1068 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, 1069 | {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, 1070 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, 1071 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, 1072 | {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, 1073 | {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, 1074 | {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, 1075 | {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, 1076 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, 1077 | {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, 1078 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, 1079 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, 1080 | {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, 1081 | {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, 1082 | {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, 1083 | {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, 1084 | {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, 1085 | {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, 1086 | {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, 1087 | {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, 1088 | {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, 1089 | {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, 1090 | {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, 1091 | {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, 1092 | ] 1093 | 1094 | [[package]] 1095 | name = "ruff" 1096 | version = "0.6.1" 1097 | requires_python = ">=3.7" 1098 | summary = "An extremely fast Python linter and code formatter, written in Rust." 1099 | groups = ["dev"] 1100 | files = [ 1101 | {file = "ruff-0.6.1-py3-none-linux_armv6l.whl", hash = "sha256:b4bb7de6a24169dc023f992718a9417380301b0c2da0fe85919f47264fb8add9"}, 1102 | {file = "ruff-0.6.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:45efaae53b360c81043e311cdec8a7696420b3d3e8935202c2846e7a97d4edae"}, 1103 | {file = "ruff-0.6.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:bc60c7d71b732c8fa73cf995efc0c836a2fd8b9810e115be8babb24ae87e0850"}, 1104 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c7477c3b9da822e2db0b4e0b59e61b8a23e87886e727b327e7dcaf06213c5cf"}, 1105 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a0af7ab3f86e3dc9f157a928e08e26c4b40707d0612b01cd577cc84b8905cc9"}, 1106 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:392688dbb50fecf1bf7126731c90c11a9df1c3a4cdc3f481b53e851da5634fa5"}, 1107 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5278d3e095ccc8c30430bcc9bc550f778790acc211865520f3041910a28d0024"}, 1108 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fe6d5f65d6f276ee7a0fc50a0cecaccb362d30ef98a110f99cac1c7872df2f18"}, 1109 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2e0dd11e2ae553ee5c92a81731d88a9883af8db7408db47fc81887c1f8b672e"}, 1110 | {file = "ruff-0.6.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d812615525a34ecfc07fd93f906ef5b93656be01dfae9a819e31caa6cfe758a1"}, 1111 | {file = "ruff-0.6.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:faaa4060f4064c3b7aaaa27328080c932fa142786f8142aff095b42b6a2eb631"}, 1112 | {file = "ruff-0.6.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:99d7ae0df47c62729d58765c593ea54c2546d5de213f2af2a19442d50a10cec9"}, 1113 | {file = "ruff-0.6.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9eb18dfd7b613eec000e3738b3f0e4398bf0153cb80bfa3e351b3c1c2f6d7b15"}, 1114 | {file = "ruff-0.6.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:c62bc04c6723a81e25e71715aa59489f15034d69bf641df88cb38bdc32fd1dbb"}, 1115 | {file = "ruff-0.6.1-py3-none-win32.whl", hash = "sha256:9fb4c4e8b83f19c9477a8745e56d2eeef07a7ff50b68a6998f7d9e2e3887bdc4"}, 1116 | {file = "ruff-0.6.1-py3-none-win_amd64.whl", hash = "sha256:c2ebfc8f51ef4aca05dad4552bbcf6fe8d1f75b2f6af546cc47cc1c1ca916b5b"}, 1117 | {file = "ruff-0.6.1-py3-none-win_arm64.whl", hash = "sha256:3bc81074971b0ffad1bd0c52284b22411f02a11a012082a76ac6da153536e014"}, 1118 | {file = "ruff-0.6.1.tar.gz", hash = "sha256:af3ffd8c6563acb8848d33cd19a69b9bfe943667f0419ca083f8ebe4224a3436"}, 1119 | ] 1120 | 1121 | [[package]] 1122 | name = "sniffio" 1123 | version = "1.3.1" 1124 | requires_python = ">=3.7" 1125 | summary = "Sniff out which async library your code is running under" 1126 | groups = ["default"] 1127 | files = [ 1128 | {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, 1129 | {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, 1130 | ] 1131 | 1132 | [[package]] 1133 | name = "sqlalchemy" 1134 | version = "2.0.32" 1135 | requires_python = ">=3.7" 1136 | summary = "Database Abstraction Library" 1137 | groups = ["default"] 1138 | dependencies = [ 1139 | "greenlet!=0.4.17; (platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\") and python_version < \"3.13\"", 1140 | "importlib-metadata; python_version < \"3.8\"", 1141 | "typing-extensions>=4.6.0", 1142 | ] 1143 | files = [ 1144 | {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c9045ecc2e4db59bfc97b20516dfdf8e41d910ac6fb667ebd3a79ea54084619"}, 1145 | {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1467940318e4a860afd546ef61fefb98a14d935cd6817ed07a228c7f7c62f389"}, 1146 | {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5954463675cb15db8d4b521f3566a017c8789222b8316b1e6934c811018ee08b"}, 1147 | {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167e7497035c303ae50651b351c28dc22a40bb98fbdb8468cdc971821b1ae533"}, 1148 | {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27dfb676ac02529fb6e343b3a482303f16e6bc3a4d868b73935b8792edb52d0"}, 1149 | {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bf2360a5e0f7bd75fa80431bf8ebcfb920c9f885e7956c7efde89031695cafb8"}, 1150 | {file = "SQLAlchemy-2.0.32-cp310-cp310-win32.whl", hash = "sha256:306fe44e754a91cd9d600a6b070c1f2fadbb4a1a257b8781ccf33c7067fd3e4d"}, 1151 | {file = "SQLAlchemy-2.0.32-cp310-cp310-win_amd64.whl", hash = "sha256:99db65e6f3ab42e06c318f15c98f59a436f1c78179e6a6f40f529c8cc7100b22"}, 1152 | {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21b053be28a8a414f2ddd401f1be8361e41032d2ef5884b2f31d31cb723e559f"}, 1153 | {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b178e875a7a25b5938b53b006598ee7645172fccafe1c291a706e93f48499ff5"}, 1154 | {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723a40ee2cc7ea653645bd4cf024326dea2076673fc9d3d33f20f6c81db83e1d"}, 1155 | {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295ff8689544f7ee7e819529633d058bd458c1fd7f7e3eebd0f9268ebc56c2a0"}, 1156 | {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49496b68cd190a147118af585173ee624114dfb2e0297558c460ad7495f9dfe2"}, 1157 | {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:acd9b73c5c15f0ec5ce18128b1fe9157ddd0044abc373e6ecd5ba376a7e5d961"}, 1158 | {file = "SQLAlchemy-2.0.32-cp311-cp311-win32.whl", hash = "sha256:9365a3da32dabd3e69e06b972b1ffb0c89668994c7e8e75ce21d3e5e69ddef28"}, 1159 | {file = "SQLAlchemy-2.0.32-cp311-cp311-win_amd64.whl", hash = "sha256:8bd63d051f4f313b102a2af1cbc8b80f061bf78f3d5bd0843ff70b5859e27924"}, 1160 | {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bab3db192a0c35e3c9d1560eb8332463e29e5507dbd822e29a0a3c48c0a8d92"}, 1161 | {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:19d98f4f58b13900d8dec4ed09dd09ef292208ee44cc9c2fe01c1f0a2fe440e9"}, 1162 | {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd33c61513cb1b7371fd40cf221256456d26a56284e7d19d1f0b9f1eb7dd7e8"}, 1163 | {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6ba0497c1d066dd004e0f02a92426ca2df20fac08728d03f67f6960271feec"}, 1164 | {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2b6be53e4fde0065524f1a0a7929b10e9280987b320716c1509478b712a7688c"}, 1165 | {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:916a798f62f410c0b80b63683c8061f5ebe237b0f4ad778739304253353bc1cb"}, 1166 | {file = "SQLAlchemy-2.0.32-cp312-cp312-win32.whl", hash = "sha256:31983018b74908ebc6c996a16ad3690301a23befb643093fcfe85efd292e384d"}, 1167 | {file = "SQLAlchemy-2.0.32-cp312-cp312-win_amd64.whl", hash = "sha256:4363ed245a6231f2e2957cccdda3c776265a75851f4753c60f3004b90e69bfeb"}, 1168 | {file = "SQLAlchemy-2.0.32-py3-none-any.whl", hash = "sha256:e567a8793a692451f706b363ccf3c45e056b67d90ead58c3bc9471af5d212202"}, 1169 | {file = "SQLAlchemy-2.0.32.tar.gz", hash = "sha256:c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8"}, 1170 | ] 1171 | 1172 | [[package]] 1173 | name = "strenum" 1174 | version = "0.4.15" 1175 | summary = "An Enum that inherits from str." 1176 | groups = ["default"] 1177 | files = [ 1178 | {file = "StrEnum-0.4.15-py3-none-any.whl", hash = "sha256:a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659"}, 1179 | {file = "StrEnum-0.4.15.tar.gz", hash = "sha256:878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"}, 1180 | ] 1181 | 1182 | [[package]] 1183 | name = "tarina" 1184 | version = "0.5.5" 1185 | requires_python = ">=3.8" 1186 | summary = "A collection of common utils for Arclet" 1187 | groups = ["default"] 1188 | dependencies = [ 1189 | "typing-extensions>=4.4.0", 1190 | ] 1191 | files = [ 1192 | {file = "tarina-0.5.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fda200701a81ed48e4303ccff10b5d680a7ad3d1772a6830f32995fe04459d6e"}, 1193 | {file = "tarina-0.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:30ffe373da5f9e35179b96e233731e8a7bb83fe6bf8866753f468db53b3ed22e"}, 1194 | {file = "tarina-0.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb7474ba9f9d55dc29df9d317c12fdc870ba10582b0c5ce36550e237881c9ea6"}, 1195 | {file = "tarina-0.5.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a392ac4d4b94a9a51b7540d8194605be621a129147dc874933a524911a09c94e"}, 1196 | {file = "tarina-0.5.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cc131ecab68d7ec31a12dfb8f0ab0638729a9b866043a79b66dcf7022000652"}, 1197 | {file = "tarina-0.5.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:724a3d33ed7c48f68af7fc583aa21abff2cd1b60d0c51d3ba043683d715717f8"}, 1198 | {file = "tarina-0.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b04897665d96ebd55461c0876407c3e569008ba8efee4d4342bad47c32b64b0f"}, 1199 | {file = "tarina-0.5.5-cp310-cp310-win32.whl", hash = "sha256:f58c9eaa087af597cfd7e2885073c9dc93a3f93ba3f6957d55a9dacbcc1270ee"}, 1200 | {file = "tarina-0.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:b7dc4a5e0779fd4ee023abf445c2f801069a5861133c3ad04a5e055d5d5071fb"}, 1201 | {file = "tarina-0.5.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5ffb4ed6bd241809fd76b82bc7df857413cbc4a73a2ac8397374b79cb6e85e9b"}, 1202 | {file = "tarina-0.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f5551815a970cd22d6d609a8769eac3e8b499e54ac5283e01169727f9ce0edd0"}, 1203 | {file = "tarina-0.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4e2c18bcb1a3c59e45dc0fe39880b41d7e4fb5d742ef98a88fb4621aea9da02f"}, 1204 | {file = "tarina-0.5.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2db5c4bc285d73bec00b159dde6ec41b74d14371eb6da29d8b14a382e370567e"}, 1205 | {file = "tarina-0.5.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d74923bc3d6884639e102a6a35bffda9578d934a23c4eb3f2d835e718ac75cee"}, 1206 | {file = "tarina-0.5.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e55686cff98c91ed4982226163ac5daeaf85510b4acab0c3d75331e255fbdce0"}, 1207 | {file = "tarina-0.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:50572901cd69983cfdc9d5a5823d17c49755f9e071eb287e091df014beaf6e73"}, 1208 | {file = "tarina-0.5.5-cp311-cp311-win32.whl", hash = "sha256:9d0a20f8b084af361fab7b070917edad611ede38014bab2cfc4024599586ade0"}, 1209 | {file = "tarina-0.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:8e740532d5a9346079c55613adfb77895f596a9c57e46c06d7d6c03640bd4f38"}, 1210 | {file = "tarina-0.5.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1bab4762a24d9fcd8eacae4376c8fa2d4a96e1a3c5aadbeaad9e113cd679ee7d"}, 1211 | {file = "tarina-0.5.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:05149d5aef6947fcf11a5b6cbbab788202077a734b7a2d184a574283de311725"}, 1212 | {file = "tarina-0.5.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b4ae866721d7b906fb327f847d9f8522f46bbea3b0df61b74d6bcc22dad1a33c"}, 1213 | {file = "tarina-0.5.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c687aa0cfef24b1df2c8f044a72d8993d68b4e13ea8967b79105be7a2e4097dd"}, 1214 | {file = "tarina-0.5.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e609199df957cd35cee6a942028f4caded21f1db8ac4c300c1dba94d61f0080"}, 1215 | {file = "tarina-0.5.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d57033ce9fa1c6c0a3a4851503c7320e7f7eba5dfc77e4e2f98932f1b329ba85"}, 1216 | {file = "tarina-0.5.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:986c5c59e30041e2a223c04b429777d3848c40e70b449f395b4b40290b6ff1ef"}, 1217 | {file = "tarina-0.5.5-cp312-cp312-win32.whl", hash = "sha256:256cf6a4f6a395b90aa4c1305f69a36c5fa6155124b30157a4c7e7af7c6be9ca"}, 1218 | {file = "tarina-0.5.5-cp312-cp312-win_amd64.whl", hash = "sha256:ada4a85937cb7f0c5968ffc1b4914779d35525bff14e451113da94028d6a7a23"}, 1219 | {file = "tarina-0.5.5-py3-none-any.whl", hash = "sha256:4828ace26e49037b2dab624e62ca13a473909b2f535f1b4fd5169dd01e16f6c5"}, 1220 | {file = "tarina-0.5.5.tar.gz", hash = "sha256:762a3871906e3dd79fc82d13ff99f14f1af977c4b8e2ce860209b8fa97a8b321"}, 1221 | ] 1222 | 1223 | [[package]] 1224 | name = "tomli" 1225 | version = "2.0.1" 1226 | requires_python = ">=3.7" 1227 | summary = "A lil' TOML parser" 1228 | groups = ["default", "adapters", "dev"] 1229 | marker = "python_version < \"3.11\"" 1230 | files = [ 1231 | {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, 1232 | {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, 1233 | ] 1234 | 1235 | [[package]] 1236 | name = "typing-extensions" 1237 | version = "4.12.2" 1238 | requires_python = ">=3.8" 1239 | summary = "Backported and Experimental Type Hints for Python 3.8+" 1240 | groups = ["default", "adapters", "dev"] 1241 | files = [ 1242 | {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, 1243 | {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "virtualenv" 1248 | version = "20.26.3" 1249 | requires_python = ">=3.7" 1250 | summary = "Virtual Python Environment builder" 1251 | groups = ["dev"] 1252 | dependencies = [ 1253 | "distlib<1,>=0.3.7", 1254 | "filelock<4,>=3.12.2", 1255 | "importlib-metadata>=6.6; python_version < \"3.8\"", 1256 | "platformdirs<5,>=3.9.1", 1257 | ] 1258 | files = [ 1259 | {file = "virtualenv-20.26.3-py3-none-any.whl", hash = "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589"}, 1260 | {file = "virtualenv-20.26.3.tar.gz", hash = "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a"}, 1261 | ] 1262 | 1263 | [[package]] 1264 | name = "win32-setctime" 1265 | version = "1.1.0" 1266 | requires_python = ">=3.5" 1267 | summary = "A small Python utility to set file creation time on Windows" 1268 | groups = ["default", "adapters"] 1269 | marker = "sys_platform == \"win32\"" 1270 | files = [ 1271 | {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, 1272 | {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, 1273 | ] 1274 | 1275 | [[package]] 1276 | name = "yarl" 1277 | version = "1.9.4" 1278 | requires_python = ">=3.7" 1279 | summary = "Yet another URL library" 1280 | groups = ["default", "adapters"] 1281 | dependencies = [ 1282 | "idna>=2.0", 1283 | "multidict>=4.0", 1284 | "typing-extensions>=3.7.4; python_version < \"3.8\"", 1285 | ] 1286 | files = [ 1287 | {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, 1288 | {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, 1289 | {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, 1290 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, 1291 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, 1292 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, 1293 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, 1294 | {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, 1295 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, 1296 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, 1297 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, 1298 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, 1299 | {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, 1300 | {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, 1301 | {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, 1302 | {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, 1303 | {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, 1304 | {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, 1305 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, 1306 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, 1307 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, 1308 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, 1309 | {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, 1310 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, 1311 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, 1312 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, 1313 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, 1314 | {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, 1315 | {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, 1316 | {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, 1317 | {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, 1318 | {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, 1319 | {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, 1320 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, 1321 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, 1322 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, 1323 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, 1324 | {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, 1325 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, 1326 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, 1327 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, 1328 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, 1329 | {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, 1330 | {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, 1331 | {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, 1332 | {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, 1333 | {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, 1334 | ] 1335 | 1336 | [[package]] 1337 | name = "zipp" 1338 | version = "3.20.0" 1339 | requires_python = ">=3.8" 1340 | summary = "Backport of pathlib-compatible object wrapper for zip files" 1341 | groups = ["default"] 1342 | files = [ 1343 | {file = "zipp-3.20.0-py3-none-any.whl", hash = "sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d"}, 1344 | {file = "zipp-3.20.0.tar.gz", hash = "sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31"}, 1345 | ] 1346 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "nonebot-plugin-lxns-maimai" 3 | version = "0.1.2" 4 | description = "maimai DX 查分" 5 | authors = [ 6 | {name = "KomoriDev", email = "mute231010@gmail.com"}, 7 | ] 8 | dependencies = [ 9 | "nonebot2>=2.3.3", 10 | "httpx>=0.27.0", 11 | "nonebot-plugin-alconna>=0.52.0", 12 | "nonebot-plugin-orm>=0.7.6", 13 | "nonebot-plugin-user>=0.4.2", 14 | "nonebot-plugin-htmlrender>=0.3.5", 15 | ] 16 | requires-python = ">=3.10" 17 | readme = "README.md" 18 | license = {text = "MIT"} 19 | 20 | [project.optional-dependencies] 21 | adapters = [ 22 | "nonebot-adapter-onebot>=2.4.4", 23 | ] 24 | [build-system] 25 | requires = ["pdm-backend"] 26 | build-backend = "pdm.backend" 27 | 28 | [tool.nonebot] 29 | plugins = ["nonebot_plugin_lxns_maimai"] 30 | 31 | [tool.pdm] 32 | distribution = true 33 | 34 | [tool.pdm.dev-dependencies] 35 | dev = [ 36 | "ruff>=0.6.1", 37 | "black>=24.4.2", 38 | "isort>=5.13.2", 39 | "pre-commit>=3.7.1", 40 | ] 41 | 42 | [tool.black] 43 | line-length = 90 44 | target-version = ["py310", "py311", "py312"] 45 | include = '\.pyi?$' 46 | extend-exclude = ''' 47 | ''' 48 | 49 | [tool.isort] 50 | profile = "black" 51 | line_length = 90 52 | length_sort = true 53 | skip_gitignore = true 54 | force_sort_within_sections = true 55 | extra_standard_library = ["typing_extensions"] 56 | 57 | [tool.ruff] 58 | line-length = 90 59 | target-version = "py310" 60 | 61 | [tool.ruff.lint] 62 | select = ["E", "W", "F", "UP", "C", "T", "PYI", "PT", "Q"] 63 | ignore = ["E402", "C901"] 64 | 65 | [tool.pyright] 66 | pythonVersion = "3.10" 67 | pythonPlatform = "All" 68 | typeCheckingMode = "basic" 69 | 70 | --------------------------------------------------------------------------------