├── .github ├── FUNDING.yml └── workflows │ ├── gen-sidebar.yml │ └── pypi-publish.yml ├── .gitignore ├── .prettierignore ├── LICENSE ├── README.md ├── marketplace ├── .nojekyll ├── _coverpage.md ├── _navbar.md ├── configuring │ ├── README.md │ └── _sidebar.md ├── favicon.ico ├── index.html ├── market │ ├── README.md │ ├── _sidebar.md │ ├── contributing.md │ └── replies │ │ ├── README.md │ │ ├── are_you_here.md │ │ ├── fortran.md │ │ ├── fuck_you.md │ │ └── i_am_rubbish.md ├── replies │ ├── are_you_here │ │ ├── info.md │ │ ├── meta.json │ │ └── reply.yml │ ├── fortran │ │ ├── meta.json │ │ ├── reply.yaml │ │ ├── severe147.jpeg │ │ ├── 提问的艺术(新).png │ │ ├── 无依赖.png │ │ ├── 能跑就行.gif │ │ ├── 英特尔oneAPI版本表.png │ │ └── 运行时错误介绍.png │ ├── fuck_you │ │ ├── info.md │ │ ├── meta.json │ │ └── reply.yml │ └── i_am_rubbish │ │ ├── info.md │ │ ├── meta.json │ │ └── reply.yml └── scripts │ ├── action.sh │ └── gen_market.py ├── nonebot_plugin_autoreply ├── __init__.py ├── __main__.py ├── config.py ├── cool_down.py └── util.py ├── pdm.lock └── pyproject.toml /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | custom: ["https://afdian.net/@lgc2333/"] 4 | -------------------------------------------------------------------------------- /.github/workflows/gen-sidebar.yml: -------------------------------------------------------------------------------- 1 | name: Generate Sidebar 2 | 3 | on: [push, workflow_dispatch] 4 | 5 | permissions: write-all 6 | 7 | jobs: 8 | generate: 9 | runs-on: ubuntu-latest 10 | strategy: 11 | matrix: 12 | python-version: ['3.10'] 13 | steps: 14 | - uses: actions/checkout@v3 15 | - name: Set up Python ${{ matrix.python-version }} 16 | uses: actions/setup-python@v3 17 | with: 18 | python-version: ${{ matrix.python-version }} 19 | - name: Run Script 20 | run: | 21 | sh marketplace/scripts/action.sh 22 | - name: Push 23 | run: | 24 | git config user.name github-actions[bot] 25 | git config user.email github-actions[bot]@users.noreply.github.com 26 | git add . 27 | git commit -m "generate market content" || exit 0 28 | git push 29 | -------------------------------------------------------------------------------- /.github/workflows/pypi-publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish Python 🐍 distributions 📦 to PyPI 2 | 3 | on: 4 | release: 5 | types: [published] 6 | workflow_dispatch: 7 | 8 | jobs: 9 | build-n-publish: 10 | name: Use PDM to Build and publish Python 🐍 distributions 📦 to PyPI 11 | runs-on: ubuntu-latest 12 | 13 | permissions: 14 | # IMPORTANT: this permission is mandatory for trusted publishing 15 | id-token: write 16 | 17 | steps: 18 | - name: Checkout 19 | uses: actions/checkout@master 20 | with: 21 | submodules: true 22 | 23 | - name: Setup PDM 24 | uses: pdm-project/setup-pdm@v3 25 | 26 | - name: Build and Publish distribution 📦 to PyPI 27 | run: pdm publish 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/python 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=python 3 | 4 | ### Python ### 5 | # Byte-compiled / optimized / DLL files 6 | __pycache__/ 7 | *.py[cod] 8 | *$py.class 9 | 10 | # C extensions 11 | *.so 12 | 13 | # Distribution / packaging 14 | .Python 15 | build/ 16 | develop-eggs/ 17 | dist/ 18 | downloads/ 19 | eggs/ 20 | .eggs/ 21 | lib/ 22 | lib64/ 23 | parts/ 24 | sdist/ 25 | var/ 26 | wheels/ 27 | share/python-wheels/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | MANIFEST 32 | 33 | # PyInstaller 34 | # Usually these files are written by a python script from a template 35 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .nox/ 47 | .coverage 48 | .coverage.* 49 | .cache 50 | nosetests.xml 51 | coverage.xml 52 | *.cover 53 | *.py,cover 54 | .hypothesis/ 55 | .pytest_cache/ 56 | cover/ 57 | 58 | # Translations 59 | *.mo 60 | *.pot 61 | 62 | # Django stuff: 63 | *.log 64 | local_settings.py 65 | db.sqlite3 66 | db.sqlite3-journal 67 | 68 | # Flask stuff: 69 | instance/ 70 | .webassets-cache 71 | 72 | # Scrapy stuff: 73 | .scrapy 74 | 75 | # Sphinx documentation 76 | docs/_build/ 77 | 78 | # PyBuilder 79 | .pybuilder/ 80 | target/ 81 | 82 | # Jupyter Notebook 83 | .ipynb_checkpoints 84 | 85 | # IPython 86 | profile_default/ 87 | ipython_config.py 88 | 89 | # pyenv 90 | # For a library or package, you might want to ignore these files since the code is 91 | # intended to run in multiple environments; otherwise, check them in: 92 | # .python-version 93 | 94 | # pipenv 95 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 96 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 97 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 98 | # install all needed dependencies. 99 | #Pipfile.lock 100 | 101 | # poetry 102 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 103 | # This is especially recommended for binary packages to ensure reproducibility, and is more 104 | # commonly ignored for libraries. 105 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 106 | poetry.lock 107 | 108 | # pdm 109 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 110 | #pdm.lock 111 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 112 | # in version control. 113 | # https://pdm.fming.dev/#use-with-ide 114 | .pdm.toml 115 | 116 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 117 | __pypackages__/ 118 | 119 | # Celery stuff 120 | celerybeat-schedule 121 | celerybeat.pid 122 | 123 | # SageMath parsed files 124 | *.sage.py 125 | 126 | # Environments 127 | .env 128 | .venv 129 | env/ 130 | venv/ 131 | ENV/ 132 | env.bak/ 133 | venv.bak/ 134 | 135 | # Spyder project settings 136 | .spyderproject 137 | .spyproject 138 | 139 | # Rope project settings 140 | .ropeproject 141 | 142 | # mkdocs documentation 143 | /site 144 | 145 | # mypy 146 | .mypy_cache/ 147 | .dmypy.json 148 | dmypy.json 149 | 150 | # Pyre type checker 151 | .pyre/ 152 | 153 | # pytype static type analyzer 154 | .pytype/ 155 | 156 | # Cython debug symbols 157 | cython_debug/ 158 | 159 | # PyCharm 160 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 161 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 162 | # and can be added to the global gitignore or merged into this file. For a more nuclear 163 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 164 | #.idea/ 165 | 166 | ### Python Patch ### 167 | # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration 168 | # poetry.toml 169 | 170 | 171 | # End of https://www.toptal.com/developers/gitignore/api/python 172 | 173 | testnb2/ 174 | .idea/ 175 | .pdm-python 176 | all.log 177 | error.log 178 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | venv/ 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 LgCookie 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 | 5 | 6 | NoneBotPluginLogo 7 | 8 | 9 |

10 | NoneBotPluginText 11 |

12 | 13 | # NoneBot-Plugin-AutoReply 14 | 15 | _✨ 自动回复 ✨_ 16 | 17 | python 18 | 19 | pdm-managed 20 | 21 | 22 | wakatime 23 | 24 | 25 |
26 | 27 | 28 | Pydantic Version 1 Or 2 29 | 30 | 31 | license 32 | 33 | 34 | pypi 35 | 36 | 37 | pypi download 38 | 39 | 40 |
41 | 42 | 43 | NoneBot Registry 44 | 45 | 46 | Supported Adapters 47 | 48 | 49 |
50 | 51 | ## 🛒 回复市场 52 | 53 | ![market](https://raw.githubusercontent.com/lgc-NB2Dev/readme/main/autoreply/QQ截图20230423192951.png) 54 | 55 | ### [点击进入](https://autoreply.lgc2333.top) 56 | 57 | 我们的回复配置市场和文档站一起上线啦~ 58 | 在这里,你可以分享你的回复配置,也可以找到其他人分享的回复配置,欢迎各位使用! 59 | 60 | _如果大家需要,我可以做一个直接使用指令下载安装市场中回复配置的功能 qwq_ 61 | _想要的话就提个 issue 吧,没人想要的话就不做了(_ 62 | 63 | ## 📖 介绍 64 | 65 | 一个简单的关键词自动回复插件,支持 模糊匹配、完全匹配 与 正则匹配,配置文件高度自定义 66 | 因为商店里没有我想要的那种关键词回复,所以我就自己写了一个 67 | 这个插件是从 [ShigureBot](https://github.com/lgc2333/ShigureBot/tree/main/src/plugins/shigure_bot/plugins/keyword_reply) 那边拆出来的,我重写了一下做成了单品插件 68 | 69 | 插件并没有经过深度测试,如果在使用中遇到任何问题请一定一定要过来发 issue 向我汇报,我会尽快解决 70 | 如果有功能请求也可以直接发 issue 来 dd 我 71 | 72 | ## 💿 安装 73 | 74 |
75 | [推荐] 使用 nb-cli 安装 76 | 在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装 77 | 78 | ```bash 79 | nb plugin install nonebot-plugin-autoreply 80 | ``` 81 | 82 |
83 | 84 |
85 | 使用包管理器安装 86 | 在 nonebot2 项目的插件目录下, 打开命令行, 根据你使用的包管理器, 输入相应的安装命令 87 | 88 |
89 | pip 90 | 91 | ```bash 92 | pip install nonebot-plugin-autoreply 93 | ``` 94 | 95 |
96 |
97 | pdm 98 | 99 | ```bash 100 | pdm add nonebot-plugin-autoreply 101 | ``` 102 | 103 |
104 |
105 | poetry 106 | 107 | ```bash 108 | poetry add nonebot-plugin-autoreply 109 | ``` 110 | 111 |
112 |
113 | conda 114 | 115 | ```bash 116 | conda install nonebot-plugin-autoreply 117 | ``` 118 | 119 |
120 | 121 | 打开 nonebot2 项目的 `bot.py` 文件, 在其中写入 122 | 123 | ```py 124 | nonebot.load_plugin('nonebot_plugin_autoreply') 125 | ``` 126 | 127 |
128 | 129 | ## ⚙️ 配置 130 | 131 | ### 回复配置 132 | 133 | 请访问 [配置文档](https://autoreply.lgc2333.top/#/configuring/) 134 | 135 | ### 常规配置 136 | 137 | 下方的配置皆为可选,如果不需要可以忽略不配置 138 | 配置项请参考下面的文本 139 | 140 | ```ini 141 | # matcher 是否阻断消息,默认 False 142 | AUTOREPLY_BLOCK=False 143 | 144 | # matcher 优先级 145 | AUTOREPLY_PRIORITY=99 146 | ``` 147 | 148 | ## 💬 指令 149 | 150 | ### `重载自动回复` 151 | 152 | 此命令用于重载自动回复配置,仅 `SUPERUSER` 可以执行 153 | 154 | ## 📞 联系 155 | 156 | QQ:3076823485 157 | Telegram:[@lgc2333](https://t.me/lgc2333) 158 | 吹水群:[1105946125](https://jq.qq.com/?_wv=1027&k=Z3n1MpEp) 159 | 邮箱: 160 | 161 | ## 💰 赞助 162 | 163 | **[赞助我](https://blog.lgc2333.top/donate)** 164 | 165 | 感谢大家的赞助!你们的赞助将是我继续创作的动力! 166 | 167 | ## 📝 更新日志 168 | 169 | ### 0.2.13 170 | 171 | - 当 `image` 或 `record` 的 `file` 参数为本地路径且路径为文件夹时,将会随机选取文件夹中文件发送(包括子文件夹) 172 | 173 | ### 0.2.12 174 | 175 | - 适配 Pydantic V1 & V2 176 | - 修复 [#17](https://github.com/lgc-NB2Dev/nonebot-plugin-autoreply/issues/17) 177 | 178 | ### 0.2.11 179 | 180 | - 🎉 NoneBot 2.0 🚀 181 | 182 | ### 0.2.10 183 | 184 | - 新增了 `start`、`end` 匹配方式 185 | - 添加变量 `message`、`plaintext` 186 | - 可以使用变量获取 `regex` 类型的匹配结果 187 | 188 | ### 0.2.9 189 | 190 | - 当回复中含有 `image` / `record` 类型的消息段(无论是 `normal` 还是 `array` 类型的消息),且其 `file` 属性为 `file:///` 开头时,插件将会读取该路径文件并转为 `base64` 发送 191 | - `multi` 类型消息的 `delay` 支持了整数型值,会被解析为固定时长延时 192 | - `multi` 类型新增 `shuffle` 属性,支持打乱消息顺序发送 193 | 194 | ### 0.2.8 195 | 196 | - 支持解析 `yaml` 格式配置,会将 `.yml` 和 `.yaml` 的文件作为 `yaml` 格式配置加载 197 | - 现在会寻找 `data/autoreply` 文件夹下所有子文件夹中的配置并加载 198 | - 新增变量 `{at}`、`{reply}` 199 | - 换用 `MessageTemplate` 格式化变量;由于这玩意不支持 `{{` 及 `}}` 转义,所以加入了变量 `{bs}` 和 `{be}` 200 | 201 | ### 0.2.7 202 | 203 | - 新增了配置的 `block` 和 `priority` 属性 204 | - 新增 `type` 为 `poke` (双击头像,戳一戳) 的 `match` 205 | - 新增了 `match` 的 `possibility` 属性 206 | - 新增了 `{target_id}` 与 `{display_name}` 变量 207 | 208 | ### 0.2.6 209 | 210 | - 回复中可以使用变量了 211 | - 新增配置市场 212 | 213 | ### 0.2.5 214 | 215 | - 可以加载多个回复 Json 216 | 217 | ### 0.2.4 218 | 219 | - 让字符串可以作为默认属性的 `match` 使用 220 | - 让 `@` 开头的字符串 `reply` 解析为 `plain` 形式的回复 221 | 222 | ### 0.2.3 223 | 224 | - 修复一处 py 3.8 无法使用的类型注解 225 | 226 | ### 0.2.2 227 | 228 | - 修复群聊和用户过滤器无法正常使用的问题 229 | 230 | ### 0.2.1 231 | 232 | - 修复多 `match` 无法使用的问题 233 | 234 | ### 0.2.0 235 | 236 | - 使用 `rule` 匹配消息,避免日志刷屏 237 | - 支持一次回复多条消息,调整配置文件结构 238 | - 增加了两个 `.env` 配置项 239 | - 增加热重载配置文件的指令 240 | -------------------------------------------------------------------------------- /marketplace/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/nonebot-plugin-autoreply/0259181fbf66aaa28b99b8b3eda24ee202a3900a/marketplace/.nojekyll -------------------------------------------------------------------------------- /marketplace/_coverpage.md: -------------------------------------------------------------------------------- 1 | # AutoReply 文档站 2 | 3 | [配置文档](configuring/) 4 | [回复市场](market/replies/) 5 | -------------------------------------------------------------------------------- /marketplace/_navbar.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [配置文档](configuring/) 4 | - [回复市场](market/) 5 | -------------------------------------------------------------------------------- /marketplace/configuring/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 配置文档 4 | 5 | 插件的配置文件位于 `data/autoreply` 下,下面是插件支持的配置格式以及他们的特点: 6 | 7 | - **YAML** - 后缀名为 `.yml` 或 `.yaml`,结构较清晰,功能强大,推荐熟悉该格式的用户作为首选格式使用 8 | - **JSON** - 后缀名为 `.json`,结构简明清晰,推荐小白使用 9 | 10 | 直接在插件配置文件夹下新建对应后缀名的文本文件即可开始配置,插件会自动寻找并加载 11 | 12 | > Tip: 文档较长,善用侧边栏导航功能 13 | 14 | ## 配置结构 15 | 16 | 请根据下面的注释来编辑配置文件 17 | 18 | 19 | 20 | ### **YAML** 21 | 22 | ```yml 23 | # 注意整个 yml 文件是一个数组,里面包含了多个回复规则 24 | 25 | - # 该组配置是否阻塞其他回复配置 26 | # 可以不填,默认为 `true` 27 | block: true 28 | 29 | # 该组配置的优先级,越小越高 30 | # 可以不填,默认为 1 31 | priority: 1 32 | 33 | # 消息的匹配规则,是数组,可以放置多个 34 | matches: 35 | - # 匹配模式 36 | # 37 | # 可选: 38 | # - `full` - 完全匹配 39 | # - `fuzzy` - 模糊匹配 40 | # - `start` - 开头匹配 41 | # - `end` - 结尾匹配 42 | # - `regex` - 正则匹配 43 | # - `poke` - 双击头像戳一戳(拍一拍) 44 | # 45 | # 使用 `poke` 匹配时,除了 `possibility` 和 `to_me` 条件,其他的匹配条件都会被忽略 46 | # 注意:`poke` 会匹配所有戳一戳事件,如果你只想要匹配 Bot 被戳的事件,请将 `to_me` 设为 `true` 47 | # 48 | # 可以不填,默认为 `fuzzy` 49 | type: fuzzy 50 | 51 | # 该匹配触发的概率,范围在 0 ~ 1 之间 52 | # 可以不填,默认为 1.0 53 | possibility: 1 54 | 55 | # 用于匹配消息的文本 56 | match: '测试' 57 | 58 | # 是否需要 at 机器人才能触发(叫机器人昵称也可以) 59 | # 当匹配模式为 `poke` 时,只有 被戳 的对象是 Bot,事件才会匹配成功 60 | # 可以不填,默认为 `false` 61 | to_me: false 62 | 63 | # 是否忽略大小写 64 | # 可以不填,默认为 `true` 65 | ignore_case: true 66 | 67 | # 是否去掉消息前后的空格再匹配 68 | # 可以不填,默认为 `true` 69 | strip: true 70 | 71 | # 当带 CQ 码的消息匹配失败时,是否使用去掉 CQ 码的消息再匹配一遍 72 | # 可以不填,默认为 `true` 73 | allow_plaintext: true 74 | 75 | # 如果规则为一个字符串,则会转换为一个 除 `match` 外 其他属性全部默认 的规则来匹配 76 | - '测试2' 77 | 78 | # 匹配成功后,回复的消息 79 | # 是数组,如果有多个,将随机抽取一个回复 80 | replies: 81 | # type=normal 时,message 需要为字符串,会解析 message 中的 CQ 码并发送 82 | - type: normal 83 | message: '这是一条消息,可以使用CQ码[CQ:image,file=https://pixiv.re/103981177.png]' 84 | 85 | # 直接写字符串也能表示 type=normal 86 | - '这是一条消息,可以使用CQ码[CQ:image,file=https://pixiv.re/103981177.png]' 87 | 88 | # type=plain 时,message 需要为字符串,但是 message 中的 CQ 码不会被解析 89 | - type: plain 90 | message: '这条消息后面的CQ码会以原样发送[CQ:at,qq=3076823485]' 91 | 92 | # 直接写 @ 开头的字符串也能表示 type=plain 93 | - '@这条消息后面的CQ码也会以原样发送[CQ:at,qq=3076823485]' 94 | 95 | # type=array 时,message 中需要填 CQ 码的 json 格式 96 | - type: array 97 | message: 98 | - type: text 99 | data: 100 | text: '我后面带了一张图片哦' 101 | - type: image 102 | data: 103 | file: 'https://pixiv.re/103981177.png' 104 | 105 | # 直接写数组也能代表 type=array 106 | # 注意这里在 replies 数组里嵌套了一个数组 107 | - - type: text 108 | data: 109 | text: '我可以正常发送哦' 110 | 111 | # type=multi 时,message 需要为上面提到的消息类型的数组 112 | # 会按顺序发送 message 中的所有内容 113 | # message 中不允许嵌套其他的 type=multi 类型的回复 114 | - type: multi 115 | 116 | # delay 是每条消息发送成功后的延时,格式为 [最低延时, 最高延时] 117 | # 单位为毫秒(1000 毫秒 = 1 秒),可以不填,默认为 [0, 0] 118 | delay: [1000, 1500] 119 | 120 | # 当 delay 值仅为一个整数时,代表固定延时发送,等同 [delay, delay] 121 | # delay: 1000 122 | 123 | # 是否打乱 message 数组发送 124 | # 可以不填,默认为 `false` 125 | shuffle: false 126 | 127 | # 要发送的多条消息 128 | message: 129 | # normal 类型 130 | - 'hello! 一会给你发张图哦~' 131 | - '[CQ:image,file=https://pixiv.re/103981177.png]一会给你分享首歌哦awa~' 132 | 133 | # array 类型 134 | - - type: music 135 | data: 136 | type: 163 137 | id: 2008994667 138 | 139 | # 过滤指定群聊 140 | # 可以不填,默认为空的黑名单 141 | groups: 142 | # 黑名单类型,可选 `black`(黑名单)、`white`(白名单) 143 | type: black 144 | 145 | # 要过滤的群号 146 | values: 147 | - 123456789 148 | - 987654321 149 | 150 | # 过滤指定用户 151 | # 可以不填,默认为空的黑名单 152 | users: 153 | # 结构同上 154 | type: black 155 | values: 156 | - 1145141919 157 | - 9191415411 158 | ``` 159 | 160 | ### **JSON** 161 | 162 | **实际 JSON 配置文件内不可以包含注释** 163 | 164 | ```json 165 | [ 166 | { 167 | // 该组配置是否阻塞其他回复配置 168 | // 可以不填,默认为 `true` 169 | "block": true, 170 | 171 | // 该组配置的优先级,越小越高 172 | // 可以不填,默认为 1 173 | "priority": 1, 174 | 175 | // 消息的匹配规则,可以放置多个 176 | "matches": [ 177 | { 178 | // 匹配模式,可选 `full`(完全匹配)、`fuzzy`(模糊匹配)、`regex`(正则匹配)、`poke`(双击头像戳一戳) 179 | // 180 | // 使用 `poke` 匹配时,除了 `possibility` 和 `to_me` 条件,其他的匹配条件都会被忽略 181 | // 注意:`poke` 会匹配所有戳一戳事件,如果你只想要匹配 Bot 被戳的事件,请将 `to_me` 设为 `true` 182 | // 183 | // 可以不填,默认为 `fuzzy` 184 | "type": "fuzzy", 185 | 186 | // 该匹配触发的概率,范围在 0 ~ 1 之间 187 | // 可以不填,默认为 1.0 188 | "possibility": 1.0, 189 | 190 | // 用于匹配消息的文本 191 | // 在正则匹配下,注意使用 `\\` 在 json 里的正则表达式里表示 `\`,因为 json 解析时本身就会将 `\` 作为转义字符 192 | "match": "测试", 193 | 194 | // 是否需要 at 机器人才能触发(叫机器人昵称也可以) 195 | // 当匹配模式为 `poke` 时,只有 被戳 的对象是 Bot,事件才会匹配成功 196 | // 可以不填,默认为 `false` 197 | "to_me": false, 198 | 199 | // 是否忽略大小写 200 | // 可以不填,默认为 `true` 201 | "ignore_case": true, 202 | 203 | // 是否去掉消息前后的空格再匹配 204 | // 可以不填,默认为 `true` 205 | "strip": true, 206 | 207 | // 当带 CQ 码的消息匹配失败时,是否使用去掉 CQ 码的消息再匹配一遍 208 | // 可以不填,默认为 `true` 209 | "allow_plaintext": true 210 | }, 211 | 212 | // 如果规则为一个字符串,则会转换为一个属性全部默认的 `match` 来匹配 213 | "测试2" 214 | 215 | // 更多匹配规则... 216 | ], 217 | 218 | // 匹配成功后,回复的消息 219 | // 如果有多个,将随机抽取一个回复 220 | "replies": [ 221 | // type=normal 时,message 需要为字符串,会解析 message 中的 CQ 码并发送 222 | { 223 | "type": "normal", 224 | "message": "这是一条消息,可以使用CQ码[CQ:image,file=https://pixiv.re/103981177.png]" 225 | }, 226 | 227 | // 直接写字符串也能表示 type=normal 228 | "这是一条消息,可以使用CQ码[CQ:image,file=https://pixiv.re/103981177.png]", 229 | 230 | // type=plain 时,message 需要为字符串,但是 message 中的 CQ 码不会被解析 231 | { 232 | "type": "plain", 233 | "message": "这条消息后面的CQ码会以原样发送[CQ:at,qq=3076823485]" 234 | }, 235 | 236 | // 直接写 @ 开头的字符串也能表示 type=plain 237 | "@这条消息后面的CQ码也会以原样发送[CQ:at,qq=3076823485]", 238 | 239 | // type=array 时,message 中需要填 CQ 码的 json 格式 240 | { 241 | "type": "array", 242 | "message": [ 243 | { 244 | "type": "text", 245 | "data": { 246 | "text": "我后面带了一张图片哦" 247 | } 248 | }, 249 | { 250 | "type": "image", 251 | "data": { 252 | "file": "https://pixiv.re/103981177.png" 253 | } 254 | } 255 | ] 256 | }, 257 | 258 | // 直接写数组也能代表 type=array 259 | [ 260 | { 261 | "type": "text", 262 | "data": { 263 | "text": "我可以正常发送哦" 264 | } 265 | } 266 | ], 267 | 268 | // type=multi 时,message 需要为上面提到的消息类型的数组 269 | // 会按顺序发送 message 中的所有内容 270 | // message 中不允许嵌套其他的 type=multi 类型的回复 271 | { 272 | "type": "multi", 273 | 274 | // delay 是每条消息发送成功后的延时,格式为 [最低延时, 最高延时] 275 | // 单位为毫秒(1000 毫秒 = 1 秒),可以不填,默认为 [0, 0] 276 | "delay": [1000, 1500], 277 | 278 | // 当 delay 值仅为一个整数时,代表固定延时发送,等同 [delay, delay] 279 | // "delay": 1000, 280 | 281 | // 是否打乱 message 数组发送 282 | // 可以不填,默认为 `false` 283 | "shuffle": false, 284 | 285 | // 要发送的多条消息 286 | "message": [ 287 | "hello! 一会给你发张图哦~", 288 | "[CQ:image,file=https://pixiv.re/103981177.png]一会给你分享首歌哦awa~", 289 | [ 290 | { 291 | "type": "music", 292 | "data": { 293 | "type": "163", 294 | "id": "2008994667" 295 | } 296 | } 297 | ] 298 | ] 299 | } 300 | 301 | // 更多消息... 302 | ], 303 | 304 | // 过滤指定群聊 305 | // 可以不填,默认为空的黑名单 306 | "groups": { 307 | // 黑名单类型,可选 `black`(黑名单)、`white`(白名单) 308 | "type": "black", 309 | 310 | // 要过滤的群号 311 | "values": [ 312 | 123456789, 987654321 313 | // 更多群号... 314 | ] 315 | }, 316 | 317 | // 过滤指定用户 318 | // 可以不填,默认为空的黑名单 319 | "users": { 320 | // 黑名单类型,可选 `black`(黑名单)、`white`(白名单) 321 | "type": "black", 322 | 323 | // 要过滤的QQ号 324 | "values": [ 325 | 1145141919, 9191415411 326 | // 更多QQ号... 327 | ] 328 | } 329 | } 330 | 331 | // ... 332 | ] 333 | ``` 334 | 335 | 336 | 337 | ## 关于变量 338 | 339 | 配置文件中的变量使用 [MessageTemplate.format_map()](https://v2.nonebot.dev/docs/tutorial/message#%E4%BD%BF%E7%94%A8%E6%B6%88%E6%81%AF%E6%A8%A1%E6%9D%BF) 替换; 340 | 非 `type=text` 的 `array` 类型消息则使用 `str.format()` 替换 341 | 342 | 下面两种类型变量的使用场景: 343 | 344 | - 普通变量可以在 `normal` 和 `array` 类型的消息中使用 345 | - 特殊变量只能在 `normal` 和 `type=text` 的 `array` 类型消息中使用 346 | - `plain` 类型消息则无法使用变量 347 | - `multi` 类型中嵌套的上述类型消息遵循同样的规则 348 | 349 | ### 变量列表 350 | 351 | #### 普通变量 352 | 353 | - `{bs}` - “`{`”,转义用 _(`bracket start` 的缩写)_ 354 | - `{be}` - “`}`”,转义用 _(`bracket end` 的缩写)_ 355 | - `{self_id}` - 机器人 QQ 356 | - `{message_id}` - 消息 ID _(当 `match` 的 `type` 为 `poke` 时为 `None`)_ 357 | - `{user_id}` - 发送者 QQ 358 | - `{group_id}` - 消息来源群号 _(私聊等为 `None`)_ 359 | - `{target_id}` - 被戳者 QQ _(仅当 `match` 的 `type` 为 `poke` 时有值,其他情况为 `None`)_ 360 | - `{nickname}` - 发送者昵称 361 | - `{card}` - 发送者群名片 362 | - `{display_name}` - 发送者显示名称 _(优先群名片,当群名片为空时为昵称)_ 363 | - `{plaintext}` - 原消息纯文本 364 | - regex 类型 匹配规则 的 匹配结果 365 | 366 | #### 特殊变量 367 | 368 | - `{at}` - 艾特发送者 369 | - `{reply}` - 回复发送者 _(当 `match` 的 `type` 为 `poke` 时为 `None`)_ 370 | - `{message}` - 收到的原消息 371 | 372 | ### 示例 373 | 374 | 下面放出几个示例,帮助大家更好的理解如何使用变量 375 | 376 | 377 | 378 | #### **YAML** 379 | 380 | ```yml 381 | # 注意整个 yml 文件是一个数组,里面包含了多个回复规则 382 | 383 | # 变量使用示例 384 | - matches: 385 | - match: '^(@|at|艾特)我$' 386 | type: regex 387 | 388 | replies: 389 | # 在 normal 类型消息中使用 390 | - '[normal] At了 [CQ:at,qq={user_id}]' 391 | 392 | # 在 array 类型消息中使用,注意插件只会替换 data 中值类型为 字符串 其中的变量 393 | # 注意这里在 replies 数组里嵌套了一个数组 394 | - - type: text 395 | data: 396 | text: '[array] At了 ' 397 | 398 | - type: at 399 | data: 400 | qq: '{user_id}' 401 | 402 | # 在 multi 类型消息中使用 403 | - type: multi 404 | message: 405 | # 嵌套的 array 类型消息 406 | - - type: at 407 | data: 408 | qq: '{user_id}' 409 | 410 | # 嵌套的 normal 类型消息 411 | - '[multi] 我刚刚 At 了一下你哦~ 收到了吗?' 412 | 413 | # 无法在 plain 类型消息中使用,{user_id}、{nickname} 会原样显示 414 | - '@[plain] [CQ:at,qq={user_id}] 啊咧?怎么 At 不了 {nickname}?' 415 | 416 | # 可以在消息中使用 {bs} 和 {be} 来转义大括号 417 | # 前面的 {bs}user_id{be} 会转义成 {user_id} 发送 418 | # 而后面的 {nickname} 会被替换为发送者昵称 419 | - '[normal] [CQ:at,qq={bs}user_id{be}] 啊咧?怎么 At 不了 {nickname}?' 420 | 421 | # 也可以使用 {{ 和 }} 来转义,效果同上 422 | - '[normal] [CQ:at,qq={{user_id}}] 啊咧?怎么 At 不了 {nickname}?' 423 | 424 | # 在变量中获取 regex 匹配结果示例 425 | # 注意:目前的 regex 匹配结果为纯文本,归属于普通变量,消息段会匹配为 CQ 码 426 | - matches: 427 | - match: '^你(.+?)(了)?([吗嘛么])??$' 428 | type: regex 429 | replies: 430 | # 可以直接使用变量 v<序号> 引用 regex 括号中内容 431 | # 括号内容从 v1 开始,v0 为整个正则的匹配内容 432 | - '我{v1}了' 433 | 434 | - matches: 435 | - match: '^我是(?P.+)$' 436 | type: regex 437 | replies: 438 | # 也可以直接使用变量引用 match.groupdict() 中的内容 439 | - '你是一个一个一个{name}' 440 | ``` 441 | 442 | #### **JSON** 443 | 444 | **实际 JSON 配置文件内不可以包含注释** 445 | 446 | ```json 447 | [ 448 | // 变量使用示例 449 | { 450 | "matches": [ 451 | { 452 | "match": "^(@|at|艾特)我$", 453 | "type": "regex" 454 | } 455 | ], 456 | "replies": [ 457 | // 在 normal 类型消息中使用 458 | "[normal] At了 [CQ:at,qq={user_id}]", 459 | 460 | // 在 array 类型消息中使用,注意插件只会替换 data 中值类型为 字符串 其中的变量 461 | [ 462 | { 463 | "type": "text", 464 | "data": { 465 | "text": "[array] At了 " 466 | } 467 | }, 468 | { 469 | "type": "at", 470 | "data": { 471 | "qq": "{user_id}" 472 | } 473 | } 474 | ], 475 | 476 | // 在 multi 类型消息中使用 477 | { 478 | "type": "multi", 479 | "message": [ 480 | // 嵌套的 array 类型消息 481 | [ 482 | { 483 | "type": "at", 484 | "data": { 485 | "qq": "{user_id}" 486 | } 487 | } 488 | ], 489 | 490 | // 嵌套的 normal 类型消息 491 | "[multi] 我刚刚 At 了一下你哦~ 收到了吗?" 492 | ] 493 | }, 494 | 495 | // 无法在 plain 类型消息中使用,{user_id}、{nickname} 会原样显示 496 | "@[plain] [CQ:at,qq={user_id}] 啊咧?怎么 At 不了 {nickname}?", 497 | 498 | // 可以在消息中使用 {bs} 和 {be} 来转义大括号 499 | // 前面的 {bs}user_id{be} 会转义成 {user_id} 发送 500 | // 而后面的 {nickname} 会被替换为发送者昵称 501 | "[normal] [CQ:at,qq={bs}user_id{be}] 啊咧?怎么 At 不了 {nickname}?" 502 | ] 503 | }, 504 | 505 | // 在变量中获取 regex 匹配结果示例 506 | // 注意:目前的 regex 匹配结果为纯文本,归属于普通变量,消息段会匹配为 CQ 码 507 | { 508 | "matches": [ 509 | { 510 | "match": "^你(.+?)(了)?([吗嘛么])??$", 511 | "type": "regex" 512 | } 513 | ], 514 | "replies": [ 515 | // 可以直接使用变量 v<序号> 引用 regex 括号中内容 516 | // 括号内容从 v1 开始,v0 为整个正则的匹配内容 517 | "我{v1}了" 518 | ] 519 | }, 520 | { 521 | "matches": [ 522 | { 523 | "match": "^我是(?P.+)$", 524 | "type": "regex" 525 | } 526 | ], 527 | "replies": [ 528 | // 也可以直接使用变量引用 match.groupdict() 中的内容 529 | "你是一个一个一个{name}" 530 | ] 531 | } 532 | ] 533 | ``` 534 | 535 | 536 | -------------------------------------------------------------------------------- /marketplace/configuring/_sidebar.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/nonebot-plugin-autoreply/0259181fbf66aaa28b99b8b3eda24ee202a3900a/marketplace/configuring/_sidebar.md -------------------------------------------------------------------------------- /marketplace/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/nonebot-plugin-autoreply/0259181fbf66aaa28b99b8b3eda24ee202a3900a/marketplace/favicon.ico -------------------------------------------------------------------------------- /marketplace/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AutoReply 文档站 6 | 7 | 8 | 12 | 13 | 14 | 20 | 24 | 25 | 56 | 57 | 58 | 62 | 71 | 72 | 73 | 74 |
75 | 76 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | -------------------------------------------------------------------------------- /marketplace/market/README.md: -------------------------------------------------------------------------------- 1 | # 回复市场 2 | 3 | ## [贡献指南](market/contributing) 4 | 5 | > _查看如何向市场提交回复配置!_ 6 | 7 | ## [市场列表](market/replies/) 8 | 9 | > _查看市场中已经上架的回复配置!_ 10 | -------------------------------------------------------------------------------- /marketplace/market/_sidebar.md: -------------------------------------------------------------------------------- 1 | 2 | - [回复市场](market/) 3 | - [贡献指南](market/contributing) 4 | - [市场列表](market/replies/) 5 | - [Fortran](market/replies/fortran "Fortran | AutoReply 回复市场") 6 | - [FuckYou](market/replies/fuck_you "FuckYou | AutoReply 回复市场") 7 | - [菜鸡语录](market/replies/i_am_rubbish "菜鸡语录 | AutoReply 回复市场") 8 | - [在吗?](market/replies/are_you_here "在吗? | AutoReply 回复市场") -------------------------------------------------------------------------------- /marketplace/market/contributing.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # 贡献指南 4 | 5 | 1. Fork 本仓库 6 | 7 | 2. 在仓库 `marketplace/replies` 文件夹下新建一个文件夹,文件夹名称要求和你的配置内容相关,且只允许小写字母、数字和下划线 8 | 9 | 3. 在你新创建的文件夹内,新建下述文件 10 | 11 | - `reply.json` / `reply.yml` / `reply.yaml`- 回复配置本体 12 | 13 | - `meta.json` - 该回复配置的元信息,具体内容: 14 | 15 | ```json 16 | { 17 | // 该配置在侧边栏中的显示名称,以及介绍页面中显示的标题 18 | "name": "测试", 19 | 20 | // 该配置在介绍页面中显示的简介 21 | "desc": "这是一个简介", 22 | 23 | // 该配置的作者在介绍页面中的显示名称 24 | "author": "LgCookie", 25 | 26 | // 该配置的作者在介绍页面的显示名称点击后进入的链接 27 | // 建议填写 GitHub 个人资料页 或 个人主页 28 | "author_link": "https://lgc2333.top", 29 | 30 | // 该配置的标签,会显示在介绍页面 31 | "tags": ["在", "在吗"] 32 | } 33 | ``` 34 | 35 | - _(可选)_ `info.md` - 该回复配置的详细说明,使用 Markdown 格式 36 | 这部分内容会夹在介绍页插件元信息和配置内容的中间,建议第一层标题使用 `##` 开头 37 | 38 | 4. 文件提交完成后,向仓库提交 Pull Request 等待合并即可 :wink: 39 | 40 | 如果有疑问,请看 [这个](https://github.com/lgc-NB2Dev/nonebot-plugin-autoreply/tree/master/marketplace/replies/are_you_here) 示例 41 | -------------------------------------------------------------------------------- /marketplace/market/replies/README.md: -------------------------------------------------------------------------------- 1 | 2 | # 市场列表 3 | 4 | 这里可以看到大家分享的回复配置! 5 | 6 | 想提交自己的回复?来看看 [贡献指南](market/contributing)! 7 | 8 | | 名称 | 作者 | 介绍 | 标签 | 9 | | :- | :- | :- | :- | 10 | | [Fortran](market/replies/fortran) | [Fcoder](http://fcode.cn/) | 此配置为Fortran初学群(群号:100125753)机器人自动回复使用,其中包括但不限于Intel Fortran错误信息列表及解决方法(WIP)、Fortran 相关问题解决办法(WIP) | ![Fortran](https://img.shields.io/badge/-Fortran-brightgreen?style=flat-square) | 11 | | [FuckYou](market/replies/fuck_you) | [xiaoye12123 & LgCookie](https://github.com/lgc-NB2Dev/nonebot-plugin-fuckyou) | 骂我?我他妈骂回去!(移植自 nonebot-plugin-fuckyou) | ![fuck](https://img.shields.io/badge/-fuck-brightgreen?style=flat-square) ![you](https://img.shields.io/badge/-you-brightgreen?style=flat-square) ![骂人](https://img.shields.io/badge/-骂人-brightgreen?style=flat-square) | 12 | | [菜鸡语录](market/replies/i_am_rubbish) | [TennyZhuang & LgCookie](https://github.com/TennyZhuang/Chi-Corpus/blob/master/common.txt) | 我好菜啊 | ![菜](https://img.shields.io/badge/-菜-brightgreen?style=flat-square) ![菜鸡](https://img.shields.io/badge/-菜鸡-brightgreen?style=flat-square) ![废物](https://img.shields.io/badge/-废物-brightgreen?style=flat-square) | 13 | | [在吗?](market/replies/are_you_here) | [LgCookie](https://lgc2333.top) | @Bot 并带上“在吗”时回复 | ![在](https://img.shields.io/badge/-在-brightgreen?style=flat-square) ![在吗](https://img.shields.io/badge/-在吗-brightgreen?style=flat-square) | -------------------------------------------------------------------------------- /marketplace/market/replies/are_you_here.md: -------------------------------------------------------------------------------- 1 | 2 | # 在吗? 3 | 4 | 作者:[LgCookie](https://lgc2333.top) 5 | 6 | ![在](https://img.shields.io/badge/-在-brightgreen?style=flat-square) ![在吗](https://img.shields.io/badge/-在吗-brightgreen?style=flat-square) 7 | 8 | > @Bot 并带上“在吗”时回复 9 | 10 |
11 | 12 | 13 | 14 | ## 介绍 15 | 16 | 本回复规则会在以下情况向用户作回应答: 17 | 18 | - 用户 `@Bot` 并发送 `在(吗)(?)` / `zai(ma)(?)` 时 19 | - 用户 `@Bot` 并不带任何参数时 20 | 21 | 其中,`@Bot` 可以换成 Bot 昵称 22 | 23 | ## 触发示例 24 | 25 | - `@Bot 在吗` 26 | - `@Bot zai ma` 27 | - `@Bot` 28 | 29 | 30 | ## 配置内容 31 | 32 | [右键点击我,选择 “链接另存为...” 即可下载](https://autoreply.lgc2333.top/replies/are_you_here/reply.yml) 33 | 34 |
35 | 点击展开 36 | 37 | ```yml 38 | - matches: 39 | # @Bot 在/在吗/zai ma 40 | - match: '^(,|,)?\s*(在吗?|zai(\s*ma)?)\s*(?|\?)?$' 41 | type: regex 42 | to_me: true 43 | 44 | # 只 @Bot 不带任何文本 45 | - match: '' 46 | type: full 47 | to_me: true 48 | allow_plaintext: false 49 | 50 | replies: 51 | - '{at}在哦~' 52 | - '{at}有什么事吗?' 53 | - '{at}需要帮助吗?' 54 | - '{at}来了!' 55 | 56 | ``` 57 |
-------------------------------------------------------------------------------- /marketplace/market/replies/fortran.md: -------------------------------------------------------------------------------- 1 | 2 | # Fortran 3 | 4 | 作者:[Fcoder](http://fcode.cn/) 5 | 6 | ![Fortran](https://img.shields.io/badge/-Fortran-brightgreen?style=flat-square) 7 | 8 | > 此配置为Fortran初学群(群号:100125753)机器人自动回复使用,其中包括但不限于Intel Fortran错误信息列表及解决方法(WIP)、Fortran 相关问题解决办法(WIP) 9 | 10 |
11 | 12 | 13 | 14 | ## 配置内容 15 | 16 | [右键点击我,选择 “链接另存为...” 即可下载](https://autoreply.lgc2333.top/replies/fortran/reply.yaml) 17 | 18 |
19 | 点击展开 20 | 21 | ```yaml 22 | # 自用本地路径:plugins\\py-plugin\\data\\autoreply\\ 23 | # Intel Fortran 运行时错误相关配置(WIP) 24 | - matches: 25 | - match: '运行时错误' 26 | type: full 27 | 28 | replies: 29 | - type: normal 30 | message: |- 31 | 运行时错误,是源代码正确地编译链接后,在执行阶段遇到的错误。几乎没有任何程序可以完全的避免运行时错误。它可能发生在某些意想不到的情况下。比如:磁盘满了,内存不够了,文件被只读保护了,杀毒软件拦截了等等 32 | 具体如何看懂运行时错误,请参考: 33 | 『教你看懂 Intel Fortran 的运行时错误』 34 | http://fcode.cn/guide-64-1.html 35 | ## ------------------ 36 | - matches: 37 | - match: '运行时错误信息介绍' 38 | type: full 39 | 40 | replies: 41 | - type: normal 42 | message: |- 43 | [CQ:image,file=https://autoreply.lgc2333.top/replies/fortran/运行时错误介绍.png] 44 | ## ------------------ 45 | - matches: 46 | - match: '^severe\(10\)$|^severe10$|^s10$|^10$' 47 | type: regex 48 | 49 | replies: 50 | - type: normal 51 | message: |- 52 | severe (10): Cannot overwrite existing file 53 | unit x, file X:\Fortran\example.dat 54 | 55 | 原因: 56 | 当使用 I/O 过程中 OPEN 语句 的 'Unit=x' 和 'STATUS='NEW' 子句(创建新文件)时,指定的文件 example.dat 已存在。 57 | 58 | 解决: 59 | 确保在源程序中指定了正确的文件名、目录路径、unit 等。 并且决定是否: 60 | • 在重新运行程序之前重命名或删除现有文件 61 | • 修改源文件以指定不同的文件规范、I/O unit 或 STATUS 子句 62 | 63 | PS:open 语句相关内容请参考:群文件 → Fortran程序设计_StephenJ·Champan_第四版(添加了各章节小标题版本).pdf 64 | ## ------------------ 65 | - matches: 66 | - match: '^severe\(24\)$|^severe24$|^s24$|^24$' 67 | type: regex 68 | 69 | replies: 70 | - type: normal 71 | message: |- 72 | severe (24): End-of-fle during read 73 | 74 | 原因: 75 | 这是读取文件时遇到了文件的结束。例如,代码要求数据有 3 行数据,而实际输入文件只有 2 行。在某些时候,甚至输入文件根本不存在或是空白文件。此外,数据文件缺失某些行某此列也是较大的可能。当然,也可能是循环读取文件时没控制住。比如想读 100 行,结果写错了,读了 1000 行。有时候,可能是文件路径错误,导致实际读取了另一个空白的文件。或者文件扩展名被隐藏了,比如读取 a.txt,但实际的文件名却是 a.txt.txt。 76 | 77 | 解决: 78 | 补足数据文件,或者修改代码使得读取的数据与实际数据文件一致。 79 | ## ------------------ 80 | - matches: 81 | - match: '^severe\(29\)$|^severe29$|^s29$|^29$' 82 | type: regex 83 | 84 | replies: 85 | - type: normal 86 | message: |- 87 | severe (29): File not found 88 | 89 | 原因: 90 | 这个就简单了,文件找不到。最大的可能是文件名写错了,路径 (文件夹) 放置不正确。 91 | 92 | 解决: 93 | 增加应有的文件,或放置到合适的路径下。 94 | ## ------------------ 95 | - matches: 96 | - match: '^severe\(36\)$|^severe36$|^s36$|^36$' 97 | type: regex 98 | 99 | replies: 100 | - type: normal 101 | message: |- 102 | severe (36): Attempt to access non-existent record 103 | 104 | 原因: 105 | 一般针对直接读取文件,意思是读写了一个不存在的记录。例如文件只有2个记录,却视图读取第3个。也可能是记录长度的字节数设置不正确,使得应该在第2记录的字节超出了文件的字节。 106 | 107 | 解决: 108 | 修改代码或修改文件,使得记录长度与个数相匹配。 109 | ## ------------------ 110 | - matches: 111 | - match: '^severe\(41\)$|^severe41$|^s41$|^41$' 112 | type: regex 113 | 114 | replies: 115 | - type: normal 116 | message: |- 117 | severe (41): Insufficient virtual memory 118 | 119 | 原因: 120 | 程序试图访问一个受保护或不存在的内存地址。多数为可分配数组,指针等动态内存引发的错误。 121 | 122 | 解决: 123 | 确保数组已经经过分配后才访问,确保指针指向可用的内容。 124 | ## ------------------ 125 | - matches: 126 | - match: '^info\(58\)$|^info58$|^s58$|^58$' 127 | type: regex 128 | 129 | replies: 130 | - type: normal 131 | message: |- 132 | info (58): Format syntax error at or near xx 133 | 134 | 原因: 135 | 在xx位置或附近的格式符x错误。因为使用了错误的输入输出格式符。 136 | 137 | 解决: 138 | 修改源代码中对应的格式符,或输入正确的可识别的格式符。 139 | ## ------------------ 140 | - matches: 141 | - match: '^severe\(59\)$|^severe59$|^s59$|^59$' 142 | type: regex 143 | 144 | replies: 145 | - type: normal 146 | message: |- 147 | severe (59): List-directed I/O syntax error 148 | 149 | 原因: 150 | 输入数据不正确。例如从文件或字符串中读取整型或浮点数数据,而遇到非数字的符号,比如“abc”。 151 | 152 | 解决: 153 | 这个问题多数需要修改输入文件。 154 | ## ------------------ 155 | - matches: 156 | - match: '^severe\(64\)$|^severe64$|^s64$|^64$' 157 | type: regex 158 | 159 | replies: 160 | - type: normal 161 | message: |- 162 | severe (64): Input conversion error 163 | 164 | 原因: 165 | 输入时,遇到了异常的转换错误。可能是输入中包含非法的字符(比如输入一个整数,遇到了!1.7a3!),或者输入数据超过了转换数据的范围(比如输入一个32位整数,但!输入值超过了 2147483648!)。 166 | 167 | 解决: 168 | 修改文件,去除非法字符。或使用更长的变量类型容纳大数据。 169 | ## ------------------ 170 | - matches: 171 | - match: '^error\(65\)$|^error65|^e65$|^65$' 172 | type: regex 173 | 174 | replies: 175 | - type: normal 176 | message: |- 177 | error (65): Floating invalid 178 | 179 | 原因: 180 | 这是计算式最容易发生的错误,它表示浮点数错误,数学函数错误(如超出数学函数的定义域,负数开放,分母为零等等)。 181 | 182 | 解决: 183 | 对数据进行合理控制判断是否在定义域内,如每个算例均出现,应进行 Debug 调试。 184 | ## ------------------ 185 | - matches: 186 | - match: '^severe\(71\)$|^severe71$|^s71$|^71$' 187 | type: regex 188 | 189 | replies: 190 | - type: normal 191 | message: |- 192 | severe (71): Integer divide by zero 193 | 194 | 原因: 195 | 这是计算式最容易发生的错误,它表示浮点数错误,数学函数错误(如超出数学函数的定义域,负数开方,分母为零等等)。 196 | 197 | 解决: 198 | 对数据进行合理控制判断是否在定义域内,如每个算例均出现,应进行 Debug 调试。 199 | ## ------------------ 200 | - matches: 201 | - match: '^severe\(147\)$|^severe147$|^s147$|^147$' 202 | type: regex 203 | 204 | replies: 205 | - type: normal 206 | message: |- 207 | severe (147): Stack overflow 208 | 209 | 原因: 210 | 堆栈溢出。可能性较多:堆栈不够;程序内局部变量太大或太多;递归调用终止失控。 211 | 212 | 解决: 213 | 首先尝试该大堆栈,在不同编译器上具体操作不同。VS 中可设置工程属性,如图:[CQ:image,file=https://autoreply.lgc2333.top/replies/fortran/severe147.jpeg] 214 | 命令行下增加链接开关:!/STACK:1000000000,1000000000! 215 | 如果还是不足,可将大的局部数组改为可分配数组。如有递归调用函数,检查其终止条件是否设置合理。 216 | ## ------------------ 217 | - matches: 218 | - match: '^severe\(157\)$|^severe157$|^s157$|^157$' 219 | type: regex 220 | 221 | replies: 222 | - type: normal 223 | message: |- 224 | severe (157): Program Exception - access violation 225 | 226 | 原因: 227 | 这个问题可能性很多,属于比较麻烦的运行时错误。表示程序尝试读写一个非法的内存地址。常见于可分配数组尚未分配就传入子程序使用,子程序中修改了虚参但对应的实参为常数,等等。 228 | 229 | 解决: 230 | Debug 调试,检查错误所在位置。 231 | ## ------------------ 232 | - matches: 233 | - match: '^severe\(161\)$|^severe161$|^s161$|^161$' 234 | type: regex 235 | 236 | replies: 237 | - type: normal 238 | message: |- 239 | severe (161): Program Exception - array bounds exceeded 240 | 241 | 原因: 242 | 这是数组越界,即,数组引用的元素超出了定义它的范围。比如定义 a(50:100),如引用 a(49)或 a(101) 则会越界。很多时候,这是循环对数组操作时,没控制好,比如Doi= 50,100 然后引用了 a(i+1),当 i=100 时,i+1=101,就会越界。Intel Fortran 的数组越界会给出很详细的错误提示,包括具体越界的数组名,定义范围和引用角标。 243 | 244 | 解决: 245 | 检查越界数组,根据情况修改代码。 246 | ## ------------------ 247 | - matches: 248 | - match: '^severe\(256\)$|^severe256$|^s256$|^256$' 249 | type: regex 250 | 251 | replies: 252 | - type: normal 253 | message: |- 254 | severe (256): Unformatted I/O to unit open for formatted transfers 255 | 256 | 原因: 257 | 使用无格式打开的文件,但使用了有格式的输入输出。或反之。 258 | 259 | 解决: 260 | 使用匹配的格式打开和输入输出。 261 | ## ------------------ 262 | - matches: 263 | - match: '^severe\(257\)$|^severe257$|^s257$|^257$' 264 | type: regex 265 | 266 | replies: 267 | - type: normal 268 | message: |- 269 | severe (257): Formatted I/O to unit open for unformatted transfers 270 | 271 | 原因: 272 | 使用无格式打开的文件,但使用了有格式的输入输出。或反之。 273 | 274 | 解决: 275 | 使用匹配的格式打开和输入输出。 276 | ## ------------------ 277 | - matches: 278 | - match: '^severe\(257\)$|^severe257$|^s257$|^257$' 279 | type: regex 280 | 281 | replies: 282 | - type: normal 283 | message: |- 284 | severe (259): Sequential-access I/O to unit open for direct access 285 | 286 | 原因: 287 | 使用直接读写方式打开的文件,但使用了顺序读取的输入输出。 288 | 289 | 解决: 290 | 使用匹配的读写方式打开和输入输出。 291 | # 一些 Fortran 相关问题配置(WIP) 292 | - matches: 293 | - match: '版本' 294 | type: full 295 | 296 | replies: 297 | - type: normal 298 | message: |- 299 | [CQ:image,file=https://autoreply.lgc2333.top/replies/fortran/英特尔oneAPI版本表.png] 300 | 若想了解更多信息,请访问: 301 | https://www.intel.com/content/www/us/en/developer/articles/reference-implementation/intel-compilers-compatibility-with-microsoft-visual-studio-and-xcode.html 302 | 303 | - matches: 304 | - match: '^无依赖$|^运行exe$|^vs运行exe$' 305 | type: regex 306 | 307 | replies: 308 | - type: normal 309 | message: |- 310 | 若想直接运行 VS 编译出的 Fortran 程序可执行文件,请按照下图进行编译器配置,选择无依赖 311 | [CQ:image,file=https://autoreply.lgc2333.top/replies/fortran/无依赖.png] 312 | 313 | # 一些和 Fortran 没那么有关系,但有意思的东西 314 | - matches: 315 | - match: '能跑就行' 316 | type: full 317 | 318 | replies: 319 | - type: normal 320 | message: |- 321 | [CQ:image,file=https://autoreply.lgc2333.top/replies/fortran/能跑就行.gif] 322 | ## ------------------ 323 | - matches: 324 | - match: '提问的艺术' 325 | type: full 326 | 327 | replies: 328 | - type: normal 329 | message: |- 330 | 带有🔗链接的项,可以在群文件→其他→提问的艺术(新).pdf中点击跳转到对应网站 331 | [CQ:image,file=https://autoreply.lgc2333.top/replies/fortran/提问的艺术(新).png] 332 | 333 | 334 | ``` 335 |
-------------------------------------------------------------------------------- /marketplace/market/replies/i_am_rubbish.md: -------------------------------------------------------------------------------- 1 | 2 | # 菜鸡语录 3 | 4 | 作者:[TennyZhuang & LgCookie](https://github.com/TennyZhuang/Chi-Corpus/blob/master/common.txt) 5 | 6 | ![菜](https://img.shields.io/badge/-菜-brightgreen?style=flat-square) ![菜鸡](https://img.shields.io/badge/-菜鸡-brightgreen?style=flat-square) ![废物](https://img.shields.io/badge/-废物-brightgreen?style=flat-square) 7 | 8 | > 我好菜啊 9 | 10 |
11 | 12 | 13 | 14 | ## 介绍 15 | 16 | 配置来源请点击作者链接查看 17 | 18 | 本规则会在群友抱怨自己太菜时,以 50% 的概率触发菜鸡语录的发送 19 | 20 | 具体的触发规则请看配置文件 21 | 22 | 23 | ## 配置内容 24 | 25 | [右键点击我,选择 “链接另存为...” 即可下载](https://autoreply.lgc2333.top/replies/i_am_rubbish/reply.yml) 26 | 27 |
28 | 点击展开 29 | 30 | ```yml 31 | - matches: 32 | - match: '(我是(菜(鸡|逼|b)|废物|fw|fvv|five|傻逼|sb))|我好菜|太强了|tql|大佬|带带我' 33 | type: regex 34 | possibility: 0.5 35 | 36 | replies: 37 | - '我好菜啊' 38 | - '我菜爆了' 39 | - '我是什么垃圾' 40 | - '我好堕落' 41 | - '我好菜菜啊 再这样下去就没人要了 我就只能混吃等死了' 42 | - '我越来越觉得自己是废物一个' 43 | - '我想要有大佬带' 44 | - '哭哭' 45 | - '哭了' 46 | - '我现在啥也不想干' 47 | - '求大佬带我' 48 | - '💩' 49 | - '我好废物啊' 50 | - '?' 51 | - '求大佬带我' 52 | - '越来越觉得自己毫无水平' 53 | - '有意思吗 没意思' 54 | - '自闭了' 55 | - '我好菜啊.png' 56 | - '又是变菜菜的一天' 57 | - '太真实了' 58 | - '算了我啥也不会' 59 | - '好难啊 都不会 我好菜啊' 60 | - '越来越觉得自己是废物了……哭哭.png' 61 | - '又是堕落的一天' 62 | - '我好菜' 63 | - '我连抱大腿的机会都没有' 64 | - '我就什么都不会' 65 | - '大佬都这么强 而我呢 哭哭' 66 | - '唉 能理解我菜的人真的不多' 67 | - '反正……我真的上到自闭' 68 | - '唉 我不适合' 69 | - '你们都那么强' 70 | - '有些人啊 整天就知道卖弱 不像我 是什么水平 就是什么水平' 71 | - '我觉得我没了' 72 | - '我这种就只能靠 天天做做题 否则迟早被退学' 73 | - '我这种不行的就下线了吧' 74 | - '求大家带带我' 75 | - '我已经感受到被大佬摁在地上摩擦的恐惧了' 76 | - '我是真的不行' 77 | - '你们可以约我奶茶 同我讲我不行的故事' 78 | - '唉……我是真的不行……谁见谁知道……' 79 | - '幸亏交大招的人多,不然我这种闲鱼进不来' 80 | - '大家高考都好强 因为我不行' 81 | - '我自闭了' 82 | - '我就知道我没救了' 83 | - '我现在真的觉得 菜还是可以补救一下的' 84 | - '我真的好羡慕那些 不用学 也可以满绩的 我真的不一样 我去年真的是 学到自闭 没有办法 毕竟水平不行' 85 | - '说到这里 我就不得不提我高考排名四位数的事情' 86 | - '草' 87 | - '???' 88 | - '唉……' 89 | - '嘤嘤嘤' 90 | - '太强了' 91 | - '羡慕' 92 | - '我觉得我以后找工作好困难' 93 | - '我就整天学一些 学了没用的东西' 94 | - '我看不到历史的进程 我觉得我也快被淘汰了' 95 | - '我已经佛了 开学要凉' 96 | - '我已经预感到我后面的暑假有多悲惨了' 97 | - '一开学被各位摁在地上摩擦' 98 | - '唉 我想写故事了' 99 | - '我是什么水平 就说自己是什么水平' 100 | - '我像是会卖弱的人吗' 101 | - '??我不是' 102 | - '我现在觉得我会的太少' 103 | - '我好自卑啊' 104 | - '有人和我一起挣扎一下吗' 105 | - '吾日三省吾身 每天起床第一句 迟先生世界最菜' 106 | - '我是一条酸菜鱼 又酸又菜又多余' 107 | - '没有人能知道我多菜' 108 | - '我好难过' 109 | - '我好久没卖弱了' 110 | - '可是我真的是菜' 111 | - '我说自己菜我就菜' 112 | - '我太垃圾了' 113 | - '有人带带我吗' 114 | - '又是新的一天 迟先生又变弱了' 115 | - '我好菜啊 求求各位带带我吧' 116 | - '做不动了' 117 | - '有大佬救救迟先生' 118 | - '唉 我好菜啊' 119 | - '下学期就被退学了' 120 | - '好怕自己挂科' 121 | - '求大佬安慰菜鸡迟' 122 | - '我真的只求 不挂科 不退学' 123 | - '我感觉我要被退学了' 124 | - '为什么我啥也学不会' 125 | - '为什么大佬都是学得又快又多又好 可我呢 就学这么点东西 整天还学的快要自闭了' 126 | - '学习好难 生活好难' 127 | - '我太卑微了' 128 | - '什么也不会 什么都不行.png' 129 | - '我要挂科了 怎么办啊' 130 | - '我要死了 死透了' 131 | - '我就是个菜鸡' 132 | - '我就是个菜逼' 133 | - '这学期过不下去了' 134 | - '感觉事情做不完了' 135 | - '自己真的啥也不会' 136 | - '我觉得我越来越不行了' 137 | - '我随时都可以让你觉得自己很强' 138 | - '毕业好难啊' 139 | - '我课都要修不完了' 140 | - '为什么别人的数学都能证出来 我连题目也看不懂 求大佬指导' 141 | - '人这一生啊' 142 | - '唉 想想自己已经荒废了这么多年 我还能做什么呢' 143 | - '我是废物了 嘤嘤嘤' 144 | - '我现在啥也不想干' 145 | - '我怕不是下学期就要垫底了' 146 | - '我又要变得更菜了' 147 | - '我是真的弱' 148 | - '我已经学不动了' 149 | - '希望大家下学期带带我' 150 | - '我觉得我对我自己有多菜,一直有比较清晰的认识' 151 | - '我自闭了 我甚至不会 cpp' 152 | - '我的脑子就是知识的筛子 以至于我什么都不会' 153 | - '我学的不好 希望有大佬可以带我' 154 | - '不是我卖弱,是我真的不会' 155 | - '可是我除了学习什么都不会' 156 | - '我卖个弱,大家给我小红花好不好啊' 157 | - '我哭了 我现在就开始卖弱' 158 | - '唉 我能力有限 水平有限' 159 | - '我觉得自己真是太渣了' 160 | - '比菜更菜,我是菜渣' 161 | - '我好()啊' 162 | - '我太菜了 可没人觉得我菜 这就很让人苦恼' 163 | - '大佬们不仅比我努力 还比我聪明 我是怎么活到现在的' 164 | - '唉 我的学积分已经凉了' 165 | - '我这么菜 是怎么活到现在的' 166 | - '流下了不学无术的眼泪' 167 | - '带带我吧 我啥也不会' 168 | - '我觉得我要早点想明白 GPA 无所谓的' 169 | - '这改变不了我菜的本质' 170 | - '我奔三了 我好菜' 171 | - '又菜又弱小' 172 | - '我的未来没有希望' 173 | - '为什么要学习呢 gpa 高了我菜 gpa 低了我还是菜' 174 | - '我真是又菜又弱小' 175 | - '我好菜 因为太菜 和大家格格不入' 176 | - '不好意思我就是菜 我菜到大家了 我道歉' 177 | - '是我觉得自己太菜了 所以要把菜带给更多的人 这样大家就知道 菜也没关系 总有更菜的迟先生给你们垫底' 178 | - '我这种保研也没得保 出国也没学校要' 179 | - '啥也不想干 天天就想堕落' 180 | - '我觉得我讲自己菜的故事 可以讲一晚上 而且真的很菜' 181 | - '我觉得我天天被大佬摁在地上摩擦' 182 | - '我自闭了' 183 | - '我好难过 为什么我这么菜' 184 | - '满绩是不可能满绩的 只有退学才是唯一的选择' 185 | - '我真的搞不懂了 为什么会招我这种 在上海排 1200 的菜鸡' 186 | - '真的是把我招过来 给大家虐 给大家找自信的吗' 187 | - '我真的觉得我唯一的出路是 退学和搬砖' 188 | - '大部分人都是我这样的鶸' 189 | - '你好棒棒哦' 190 | - '我啥也不会啊 哭了' 191 | - '做废物真是太快乐了 每天养养生 听听课 写写作业 快乐的一天就过去了' 192 | - '像我这种 slightly above average 的菜鸡是没有未来的 我太菜了' 193 | - '我啥也不会,除了在卖弱方面是砖家.png' 194 | - '哭了,又是无所事事的一天' 195 | - '觉得自己是废物一个' 196 | - '我要么哪天也直播卖弱吧' 197 | 198 | ``` 199 |
-------------------------------------------------------------------------------- /marketplace/replies/are_you_here/info.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## 介绍 4 | 5 | 本回复规则会在以下情况向用户作回应答: 6 | 7 | - 用户 `@Bot` 并发送 `在(吗)(?)` / `zai(ma)(?)` 时 8 | - 用户 `@Bot` 并不带任何参数时 9 | 10 | 其中,`@Bot` 可以换成 Bot 昵称 11 | 12 | ## 触发示例 13 | 14 | - `@Bot 在吗` 15 | - `@Bot zai ma` 16 | - `@Bot` 17 | -------------------------------------------------------------------------------- /marketplace/replies/are_you_here/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "在吗?", 3 | "desc": "@Bot 并带上“在吗”时回复", 4 | "author": "LgCookie", 5 | "author_link": "https://lgc2333.top", 6 | "tags": ["在", "在吗"] 7 | } 8 | -------------------------------------------------------------------------------- /marketplace/replies/are_you_here/reply.yml: -------------------------------------------------------------------------------- 1 | - matches: 2 | # @Bot 在/在吗/zai ma 3 | - match: '^(,|,)?\s*(在吗?|zai(\s*ma)?)\s*(?|\?)?$' 4 | type: regex 5 | to_me: true 6 | 7 | # 只 @Bot 不带任何文本 8 | - match: '' 9 | type: full 10 | to_me: true 11 | allow_plaintext: false 12 | 13 | replies: 14 | - '{at}在哦~' 15 | - '{at}有什么事吗?' 16 | - '{at}需要帮助吗?' 17 | - '{at}来了!' 18 | -------------------------------------------------------------------------------- /marketplace/replies/fortran/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Fortran", 3 | 4 | "desc": "此配置为Fortran初学群(群号:100125753)机器人自动回复使用,其中包括但不限于Intel Fortran错误信息列表及解决方法(WIP)、Fortran 相关问题解决办法(WIP)", 5 | 6 | "author": "Fcoder", 7 | 8 | "author_link": "http://fcode.cn/", 9 | 10 | "tags": ["Fortran"] 11 | } 12 | -------------------------------------------------------------------------------- /marketplace/replies/fortran/reply.yaml: -------------------------------------------------------------------------------- 1 | # 自用本地路径:plugins\\py-plugin\\data\\autoreply\\ 2 | # Intel Fortran 运行时错误相关配置(WIP) 3 | - matches: 4 | - match: '运行时错误' 5 | type: full 6 | 7 | replies: 8 | - type: normal 9 | message: |- 10 | 运行时错误,是源代码正确地编译链接后,在执行阶段遇到的错误。几乎没有任何程序可以完全的避免运行时错误。它可能发生在某些意想不到的情况下。比如:磁盘满了,内存不够了,文件被只读保护了,杀毒软件拦截了等等 11 | 具体如何看懂运行时错误,请参考: 12 | 『教你看懂 Intel Fortran 的运行时错误』 13 | http://fcode.cn/guide-64-1.html 14 | ## ------------------ 15 | - matches: 16 | - match: '运行时错误信息介绍' 17 | type: full 18 | 19 | replies: 20 | - type: normal 21 | message: |- 22 | [CQ:image,file=https://autoreply.lgc2333.top/replies/fortran/运行时错误介绍.png] 23 | ## ------------------ 24 | - matches: 25 | - match: '^severe\(10\)$|^severe10$|^s10$|^10$' 26 | type: regex 27 | 28 | replies: 29 | - type: normal 30 | message: |- 31 | severe (10): Cannot overwrite existing file 32 | unit x, file X:\Fortran\example.dat 33 | 34 | 原因: 35 | 当使用 I/O 过程中 OPEN 语句 的 'Unit=x' 和 'STATUS='NEW' 子句(创建新文件)时,指定的文件 example.dat 已存在。 36 | 37 | 解决: 38 | 确保在源程序中指定了正确的文件名、目录路径、unit 等。 并且决定是否: 39 | • 在重新运行程序之前重命名或删除现有文件 40 | • 修改源文件以指定不同的文件规范、I/O unit 或 STATUS 子句 41 | 42 | PS:open 语句相关内容请参考:群文件 → Fortran程序设计_StephenJ·Champan_第四版(添加了各章节小标题版本).pdf 43 | ## ------------------ 44 | - matches: 45 | - match: '^severe\(24\)$|^severe24$|^s24$|^24$' 46 | type: regex 47 | 48 | replies: 49 | - type: normal 50 | message: |- 51 | severe (24): End-of-fle during read 52 | 53 | 原因: 54 | 这是读取文件时遇到了文件的结束。例如,代码要求数据有 3 行数据,而实际输入文件只有 2 行。在某些时候,甚至输入文件根本不存在或是空白文件。此外,数据文件缺失某些行某此列也是较大的可能。当然,也可能是循环读取文件时没控制住。比如想读 100 行,结果写错了,读了 1000 行。有时候,可能是文件路径错误,导致实际读取了另一个空白的文件。或者文件扩展名被隐藏了,比如读取 a.txt,但实际的文件名却是 a.txt.txt。 55 | 56 | 解决: 57 | 补足数据文件,或者修改代码使得读取的数据与实际数据文件一致。 58 | ## ------------------ 59 | - matches: 60 | - match: '^severe\(29\)$|^severe29$|^s29$|^29$' 61 | type: regex 62 | 63 | replies: 64 | - type: normal 65 | message: |- 66 | severe (29): File not found 67 | 68 | 原因: 69 | 这个就简单了,文件找不到。最大的可能是文件名写错了,路径 (文件夹) 放置不正确。 70 | 71 | 解决: 72 | 增加应有的文件,或放置到合适的路径下。 73 | ## ------------------ 74 | - matches: 75 | - match: '^severe\(36\)$|^severe36$|^s36$|^36$' 76 | type: regex 77 | 78 | replies: 79 | - type: normal 80 | message: |- 81 | severe (36): Attempt to access non-existent record 82 | 83 | 原因: 84 | 一般针对直接读取文件,意思是读写了一个不存在的记录。例如文件只有2个记录,却视图读取第3个。也可能是记录长度的字节数设置不正确,使得应该在第2记录的字节超出了文件的字节。 85 | 86 | 解决: 87 | 修改代码或修改文件,使得记录长度与个数相匹配。 88 | ## ------------------ 89 | - matches: 90 | - match: '^severe\(41\)$|^severe41$|^s41$|^41$' 91 | type: regex 92 | 93 | replies: 94 | - type: normal 95 | message: |- 96 | severe (41): Insufficient virtual memory 97 | 98 | 原因: 99 | 程序试图访问一个受保护或不存在的内存地址。多数为可分配数组,指针等动态内存引发的错误。 100 | 101 | 解决: 102 | 确保数组已经经过分配后才访问,确保指针指向可用的内容。 103 | ## ------------------ 104 | - matches: 105 | - match: '^info\(58\)$|^info58$|^s58$|^58$' 106 | type: regex 107 | 108 | replies: 109 | - type: normal 110 | message: |- 111 | info (58): Format syntax error at or near xx 112 | 113 | 原因: 114 | 在xx位置或附近的格式符x错误。因为使用了错误的输入输出格式符。 115 | 116 | 解决: 117 | 修改源代码中对应的格式符,或输入正确的可识别的格式符。 118 | ## ------------------ 119 | - matches: 120 | - match: '^severe\(59\)$|^severe59$|^s59$|^59$' 121 | type: regex 122 | 123 | replies: 124 | - type: normal 125 | message: |- 126 | severe (59): List-directed I/O syntax error 127 | 128 | 原因: 129 | 输入数据不正确。例如从文件或字符串中读取整型或浮点数数据,而遇到非数字的符号,比如“abc”。 130 | 131 | 解决: 132 | 这个问题多数需要修改输入文件。 133 | ## ------------------ 134 | - matches: 135 | - match: '^severe\(64\)$|^severe64$|^s64$|^64$' 136 | type: regex 137 | 138 | replies: 139 | - type: normal 140 | message: |- 141 | severe (64): Input conversion error 142 | 143 | 原因: 144 | 输入时,遇到了异常的转换错误。可能是输入中包含非法的字符(比如输入一个整数,遇到了!1.7a3!),或者输入数据超过了转换数据的范围(比如输入一个32位整数,但!输入值超过了 2147483648!)。 145 | 146 | 解决: 147 | 修改文件,去除非法字符。或使用更长的变量类型容纳大数据。 148 | ## ------------------ 149 | - matches: 150 | - match: '^error\(65\)$|^error65|^e65$|^65$' 151 | type: regex 152 | 153 | replies: 154 | - type: normal 155 | message: |- 156 | error (65): Floating invalid 157 | 158 | 原因: 159 | 这是计算式最容易发生的错误,它表示浮点数错误,数学函数错误(如超出数学函数的定义域,负数开放,分母为零等等)。 160 | 161 | 解决: 162 | 对数据进行合理控制判断是否在定义域内,如每个算例均出现,应进行 Debug 调试。 163 | ## ------------------ 164 | - matches: 165 | - match: '^severe\(71\)$|^severe71$|^s71$|^71$' 166 | type: regex 167 | 168 | replies: 169 | - type: normal 170 | message: |- 171 | severe (71): Integer divide by zero 172 | 173 | 原因: 174 | 这是计算式最容易发生的错误,它表示浮点数错误,数学函数错误(如超出数学函数的定义域,负数开方,分母为零等等)。 175 | 176 | 解决: 177 | 对数据进行合理控制判断是否在定义域内,如每个算例均出现,应进行 Debug 调试。 178 | ## ------------------ 179 | - matches: 180 | - match: '^severe\(147\)$|^severe147$|^s147$|^147$' 181 | type: regex 182 | 183 | replies: 184 | - type: normal 185 | message: |- 186 | severe (147): Stack overflow 187 | 188 | 原因: 189 | 堆栈溢出。可能性较多:堆栈不够;程序内局部变量太大或太多;递归调用终止失控。 190 | 191 | 解决: 192 | 首先尝试该大堆栈,在不同编译器上具体操作不同。VS 中可设置工程属性,如图:[CQ:image,file=https://autoreply.lgc2333.top/replies/fortran/severe147.jpeg] 193 | 命令行下增加链接开关:!/STACK:1000000000,1000000000! 194 | 如果还是不足,可将大的局部数组改为可分配数组。如有递归调用函数,检查其终止条件是否设置合理。 195 | ## ------------------ 196 | - matches: 197 | - match: '^severe\(157\)$|^severe157$|^s157$|^157$' 198 | type: regex 199 | 200 | replies: 201 | - type: normal 202 | message: |- 203 | severe (157): Program Exception - access violation 204 | 205 | 原因: 206 | 这个问题可能性很多,属于比较麻烦的运行时错误。表示程序尝试读写一个非法的内存地址。常见于可分配数组尚未分配就传入子程序使用,子程序中修改了虚参但对应的实参为常数,等等。 207 | 208 | 解决: 209 | Debug 调试,检查错误所在位置。 210 | ## ------------------ 211 | - matches: 212 | - match: '^severe\(161\)$|^severe161$|^s161$|^161$' 213 | type: regex 214 | 215 | replies: 216 | - type: normal 217 | message: |- 218 | severe (161): Program Exception - array bounds exceeded 219 | 220 | 原因: 221 | 这是数组越界,即,数组引用的元素超出了定义它的范围。比如定义 a(50:100),如引用 a(49)或 a(101) 则会越界。很多时候,这是循环对数组操作时,没控制好,比如Doi= 50,100 然后引用了 a(i+1),当 i=100 时,i+1=101,就会越界。Intel Fortran 的数组越界会给出很详细的错误提示,包括具体越界的数组名,定义范围和引用角标。 222 | 223 | 解决: 224 | 检查越界数组,根据情况修改代码。 225 | ## ------------------ 226 | - matches: 227 | - match: '^severe\(256\)$|^severe256$|^s256$|^256$' 228 | type: regex 229 | 230 | replies: 231 | - type: normal 232 | message: |- 233 | severe (256): Unformatted I/O to unit open for formatted transfers 234 | 235 | 原因: 236 | 使用无格式打开的文件,但使用了有格式的输入输出。或反之。 237 | 238 | 解决: 239 | 使用匹配的格式打开和输入输出。 240 | ## ------------------ 241 | - matches: 242 | - match: '^severe\(257\)$|^severe257$|^s257$|^257$' 243 | type: regex 244 | 245 | replies: 246 | - type: normal 247 | message: |- 248 | severe (257): Formatted I/O to unit open for unformatted transfers 249 | 250 | 原因: 251 | 使用无格式打开的文件,但使用了有格式的输入输出。或反之。 252 | 253 | 解决: 254 | 使用匹配的格式打开和输入输出。 255 | ## ------------------ 256 | - matches: 257 | - match: '^severe\(257\)$|^severe257$|^s257$|^257$' 258 | type: regex 259 | 260 | replies: 261 | - type: normal 262 | message: |- 263 | severe (259): Sequential-access I/O to unit open for direct access 264 | 265 | 原因: 266 | 使用直接读写方式打开的文件,但使用了顺序读取的输入输出。 267 | 268 | 解决: 269 | 使用匹配的读写方式打开和输入输出。 270 | # 一些 Fortran 相关问题配置(WIP) 271 | - matches: 272 | - match: '版本' 273 | type: full 274 | 275 | replies: 276 | - type: normal 277 | message: |- 278 | [CQ:image,file=https://autoreply.lgc2333.top/replies/fortran/英特尔oneAPI版本表.png] 279 | 若想了解更多信息,请访问: 280 | https://www.intel.com/content/www/us/en/developer/articles/reference-implementation/intel-compilers-compatibility-with-microsoft-visual-studio-and-xcode.html 281 | 282 | - matches: 283 | - match: '^无依赖$|^运行exe$|^vs运行exe$' 284 | type: regex 285 | 286 | replies: 287 | - type: normal 288 | message: |- 289 | 若想直接运行 VS 编译出的 Fortran 程序可执行文件,请按照下图进行编译器配置,选择无依赖 290 | [CQ:image,file=https://autoreply.lgc2333.top/replies/fortran/无依赖.png] 291 | 292 | # 一些和 Fortran 没那么有关系,但有意思的东西 293 | - matches: 294 | - match: '能跑就行' 295 | type: full 296 | 297 | replies: 298 | - type: normal 299 | message: |- 300 | [CQ:image,file=https://autoreply.lgc2333.top/replies/fortran/能跑就行.gif] 301 | ## ------------------ 302 | - matches: 303 | - match: '提问的艺术' 304 | type: full 305 | 306 | replies: 307 | - type: normal 308 | message: |- 309 | 带有🔗链接的项,可以在群文件→其他→提问的艺术(新).pdf中点击跳转到对应网站 310 | [CQ:image,file=https://autoreply.lgc2333.top/replies/fortran/提问的艺术(新).png] 311 | 312 | -------------------------------------------------------------------------------- /marketplace/replies/fortran/severe147.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/nonebot-plugin-autoreply/0259181fbf66aaa28b99b8b3eda24ee202a3900a/marketplace/replies/fortran/severe147.jpeg -------------------------------------------------------------------------------- /marketplace/replies/fortran/提问的艺术(新).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/nonebot-plugin-autoreply/0259181fbf66aaa28b99b8b3eda24ee202a3900a/marketplace/replies/fortran/提问的艺术(新).png -------------------------------------------------------------------------------- /marketplace/replies/fortran/无依赖.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/nonebot-plugin-autoreply/0259181fbf66aaa28b99b8b3eda24ee202a3900a/marketplace/replies/fortran/无依赖.png -------------------------------------------------------------------------------- /marketplace/replies/fortran/能跑就行.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/nonebot-plugin-autoreply/0259181fbf66aaa28b99b8b3eda24ee202a3900a/marketplace/replies/fortran/能跑就行.gif -------------------------------------------------------------------------------- /marketplace/replies/fortran/英特尔oneAPI版本表.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/nonebot-plugin-autoreply/0259181fbf66aaa28b99b8b3eda24ee202a3900a/marketplace/replies/fortran/英特尔oneAPI版本表.png -------------------------------------------------------------------------------- /marketplace/replies/fortran/运行时错误介绍.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lgc-NB2Dev/nonebot-plugin-autoreply/0259181fbf66aaa28b99b8b3eda24ee202a3900a/marketplace/replies/fortran/运行时错误介绍.png -------------------------------------------------------------------------------- /marketplace/replies/fuck_you/info.md: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | NoneBotPluginLogo 7 | 8 | 9 | ## AutoReply-FuckYou 10 | 11 | _😅 你有几个 🐴,这么狂? 😅_ 12 | 13 |
14 | 15 | ## 📖 介绍 16 | 17 | AutoReply 对骂规则,攻击性极强 18 | 19 | 注意本规则默认包含暴力词库,如果不需要请自行删除(从 784 行开始) 20 | 21 | 配置文件移植自 [nonebot-plugin-fuckyou](https://github.com/lgc-NB2Dev/nonebot-plugin-fuckyou) 22 | 23 | 原词库:[xiaoye12123/js](https://gitee.com/xiaoye12123/js) 24 | 25 | ## 🎉 使用 26 | 27 | 直接 @Bot 对骂即可,插件为关键词检测,触发关键词可以看配置文件 28 | -------------------------------------------------------------------------------- /marketplace/replies/fuck_you/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "FuckYou", 3 | "desc": "骂我?我他妈骂回去!(移植自 nonebot-plugin-fuckyou)", 4 | "author": "xiaoye12123 & LgCookie", 5 | "author_link": "https://github.com/lgc-NB2Dev/nonebot-plugin-fuckyou", 6 | "tags": ["fuck", "you", "骂人"] 7 | } 8 | -------------------------------------------------------------------------------- /marketplace/replies/i_am_rubbish/info.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## 介绍 4 | 5 | 配置来源请点击作者链接查看 6 | 7 | 本规则会在群友抱怨自己太菜时,以 50% 的概率触发菜鸡语录的发送 8 | 9 | 具体的触发规则请看配置文件 10 | -------------------------------------------------------------------------------- /marketplace/replies/i_am_rubbish/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "菜鸡语录", 3 | "desc": "我好菜啊", 4 | "author": "TennyZhuang & LgCookie", 5 | "author_link": "https://github.com/TennyZhuang/Chi-Corpus/blob/master/common.txt", 6 | "tags": ["菜", "菜鸡", "废物"] 7 | } 8 | -------------------------------------------------------------------------------- /marketplace/replies/i_am_rubbish/reply.yml: -------------------------------------------------------------------------------- 1 | - matches: 2 | - match: '(我是(菜(鸡|逼|b)|废物|fw|fvv|five|傻逼|sb))|我好菜|太强了|tql|大佬|带带我' 3 | type: regex 4 | possibility: 0.5 5 | 6 | replies: 7 | - '我好菜啊' 8 | - '我菜爆了' 9 | - '我是什么垃圾' 10 | - '我好堕落' 11 | - '我好菜菜啊 再这样下去就没人要了 我就只能混吃等死了' 12 | - '我越来越觉得自己是废物一个' 13 | - '我想要有大佬带' 14 | - '哭哭' 15 | - '哭了' 16 | - '我现在啥也不想干' 17 | - '求大佬带我' 18 | - '💩' 19 | - '我好废物啊' 20 | - '?' 21 | - '求大佬带我' 22 | - '越来越觉得自己毫无水平' 23 | - '有意思吗 没意思' 24 | - '自闭了' 25 | - '我好菜啊.png' 26 | - '又是变菜菜的一天' 27 | - '太真实了' 28 | - '算了我啥也不会' 29 | - '好难啊 都不会 我好菜啊' 30 | - '越来越觉得自己是废物了……哭哭.png' 31 | - '又是堕落的一天' 32 | - '我好菜' 33 | - '我连抱大腿的机会都没有' 34 | - '我就什么都不会' 35 | - '大佬都这么强 而我呢 哭哭' 36 | - '唉 能理解我菜的人真的不多' 37 | - '反正……我真的上到自闭' 38 | - '唉 我不适合' 39 | - '你们都那么强' 40 | - '有些人啊 整天就知道卖弱 不像我 是什么水平 就是什么水平' 41 | - '我觉得我没了' 42 | - '我这种就只能靠 天天做做题 否则迟早被退学' 43 | - '我这种不行的就下线了吧' 44 | - '求大家带带我' 45 | - '我已经感受到被大佬摁在地上摩擦的恐惧了' 46 | - '我是真的不行' 47 | - '你们可以约我奶茶 同我讲我不行的故事' 48 | - '唉……我是真的不行……谁见谁知道……' 49 | - '幸亏交大招的人多,不然我这种闲鱼进不来' 50 | - '大家高考都好强 因为我不行' 51 | - '我自闭了' 52 | - '我就知道我没救了' 53 | - '我现在真的觉得 菜还是可以补救一下的' 54 | - '我真的好羡慕那些 不用学 也可以满绩的 我真的不一样 我去年真的是 学到自闭 没有办法 毕竟水平不行' 55 | - '说到这里 我就不得不提我高考排名四位数的事情' 56 | - '草' 57 | - '???' 58 | - '唉……' 59 | - '嘤嘤嘤' 60 | - '太强了' 61 | - '羡慕' 62 | - '我觉得我以后找工作好困难' 63 | - '我就整天学一些 学了没用的东西' 64 | - '我看不到历史的进程 我觉得我也快被淘汰了' 65 | - '我已经佛了 开学要凉' 66 | - '我已经预感到我后面的暑假有多悲惨了' 67 | - '一开学被各位摁在地上摩擦' 68 | - '唉 我想写故事了' 69 | - '我是什么水平 就说自己是什么水平' 70 | - '我像是会卖弱的人吗' 71 | - '??我不是' 72 | - '我现在觉得我会的太少' 73 | - '我好自卑啊' 74 | - '有人和我一起挣扎一下吗' 75 | - '吾日三省吾身 每天起床第一句 迟先生世界最菜' 76 | - '我是一条酸菜鱼 又酸又菜又多余' 77 | - '没有人能知道我多菜' 78 | - '我好难过' 79 | - '我好久没卖弱了' 80 | - '可是我真的是菜' 81 | - '我说自己菜我就菜' 82 | - '我太垃圾了' 83 | - '有人带带我吗' 84 | - '又是新的一天 迟先生又变弱了' 85 | - '我好菜啊 求求各位带带我吧' 86 | - '做不动了' 87 | - '有大佬救救迟先生' 88 | - '唉 我好菜啊' 89 | - '下学期就被退学了' 90 | - '好怕自己挂科' 91 | - '求大佬安慰菜鸡迟' 92 | - '我真的只求 不挂科 不退学' 93 | - '我感觉我要被退学了' 94 | - '为什么我啥也学不会' 95 | - '为什么大佬都是学得又快又多又好 可我呢 就学这么点东西 整天还学的快要自闭了' 96 | - '学习好难 生活好难' 97 | - '我太卑微了' 98 | - '什么也不会 什么都不行.png' 99 | - '我要挂科了 怎么办啊' 100 | - '我要死了 死透了' 101 | - '我就是个菜鸡' 102 | - '我就是个菜逼' 103 | - '这学期过不下去了' 104 | - '感觉事情做不完了' 105 | - '自己真的啥也不会' 106 | - '我觉得我越来越不行了' 107 | - '我随时都可以让你觉得自己很强' 108 | - '毕业好难啊' 109 | - '我课都要修不完了' 110 | - '为什么别人的数学都能证出来 我连题目也看不懂 求大佬指导' 111 | - '人这一生啊' 112 | - '唉 想想自己已经荒废了这么多年 我还能做什么呢' 113 | - '我是废物了 嘤嘤嘤' 114 | - '我现在啥也不想干' 115 | - '我怕不是下学期就要垫底了' 116 | - '我又要变得更菜了' 117 | - '我是真的弱' 118 | - '我已经学不动了' 119 | - '希望大家下学期带带我' 120 | - '我觉得我对我自己有多菜,一直有比较清晰的认识' 121 | - '我自闭了 我甚至不会 cpp' 122 | - '我的脑子就是知识的筛子 以至于我什么都不会' 123 | - '我学的不好 希望有大佬可以带我' 124 | - '不是我卖弱,是我真的不会' 125 | - '可是我除了学习什么都不会' 126 | - '我卖个弱,大家给我小红花好不好啊' 127 | - '我哭了 我现在就开始卖弱' 128 | - '唉 我能力有限 水平有限' 129 | - '我觉得自己真是太渣了' 130 | - '比菜更菜,我是菜渣' 131 | - '我好()啊' 132 | - '我太菜了 可没人觉得我菜 这就很让人苦恼' 133 | - '大佬们不仅比我努力 还比我聪明 我是怎么活到现在的' 134 | - '唉 我的学积分已经凉了' 135 | - '我这么菜 是怎么活到现在的' 136 | - '流下了不学无术的眼泪' 137 | - '带带我吧 我啥也不会' 138 | - '我觉得我要早点想明白 GPA 无所谓的' 139 | - '这改变不了我菜的本质' 140 | - '我奔三了 我好菜' 141 | - '又菜又弱小' 142 | - '我的未来没有希望' 143 | - '为什么要学习呢 gpa 高了我菜 gpa 低了我还是菜' 144 | - '我真是又菜又弱小' 145 | - '我好菜 因为太菜 和大家格格不入' 146 | - '不好意思我就是菜 我菜到大家了 我道歉' 147 | - '是我觉得自己太菜了 所以要把菜带给更多的人 这样大家就知道 菜也没关系 总有更菜的迟先生给你们垫底' 148 | - '我这种保研也没得保 出国也没学校要' 149 | - '啥也不想干 天天就想堕落' 150 | - '我觉得我讲自己菜的故事 可以讲一晚上 而且真的很菜' 151 | - '我觉得我天天被大佬摁在地上摩擦' 152 | - '我自闭了' 153 | - '我好难过 为什么我这么菜' 154 | - '满绩是不可能满绩的 只有退学才是唯一的选择' 155 | - '我真的搞不懂了 为什么会招我这种 在上海排 1200 的菜鸡' 156 | - '真的是把我招过来 给大家虐 给大家找自信的吗' 157 | - '我真的觉得我唯一的出路是 退学和搬砖' 158 | - '大部分人都是我这样的鶸' 159 | - '你好棒棒哦' 160 | - '我啥也不会啊 哭了' 161 | - '做废物真是太快乐了 每天养养生 听听课 写写作业 快乐的一天就过去了' 162 | - '像我这种 slightly above average 的菜鸡是没有未来的 我太菜了' 163 | - '我啥也不会,除了在卖弱方面是砖家.png' 164 | - '哭了,又是无所事事的一天' 165 | - '觉得自己是废物一个' 166 | - '我要么哪天也直播卖弱吧' 167 | -------------------------------------------------------------------------------- /marketplace/scripts/action.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | pip install PyYAML cn-sort 4 | python marketplace/scripts/gen_market.py 5 | -------------------------------------------------------------------------------- /marketplace/scripts/gen_market.py: -------------------------------------------------------------------------------- 1 | import json 2 | import logging 3 | from dataclasses import dataclass 4 | from pathlib import Path 5 | 6 | from cn_sort import sort_text_list 7 | 8 | logging.disable(999) 9 | 10 | ROOT_PATH = Path(__file__).parent.parent 11 | REPLIES_PATH = ROOT_PATH / "replies" 12 | REPLIES_INDEX_PATH = ROOT_PATH / "replies" / "index.json" 13 | MARKET_ROOT_PATH = ROOT_PATH / "market" 14 | MARKET_REPLY_PATH = MARKET_ROOT_PATH / "replies" 15 | MARKET_LIST_README_PATH = MARKET_REPLY_PATH / "README.md" 16 | SIDEBAR_MD_PATH = MARKET_ROOT_PATH / "_sidebar.md" 17 | 18 | ALLOWED_SUFFIXES = (".json", ".yml", ".yaml") 19 | 20 | 21 | @dataclass 22 | class ReplyMeta: 23 | name: str 24 | desc: str 25 | author: str 26 | author_link: str 27 | tags: list[str] 28 | 29 | 30 | def find_reply_file(path: Path) -> Path: 31 | for suffix in ALLOWED_SUFFIXES: 32 | file_path = path / f"reply{suffix}" 33 | 34 | if file_path.exists(): 35 | return file_path 36 | 37 | raise ValueError 38 | 39 | 40 | def main(): 41 | reply_paths = [x for x in REPLIES_PATH.iterdir() if x.is_dir()] 42 | 43 | reply_index = [] 44 | 45 | md_entries: dict[str, tuple[str, str]] = {} 46 | 47 | for path in reply_paths: 48 | dir_name = path.name 49 | 50 | meta_path = path / "meta.json" 51 | reply_path = find_reply_file(path) 52 | info_readme_path = path / "info.md" 53 | 54 | meta = ReplyMeta(**json.loads(meta_path.read_text(encoding="u8"))) 55 | reply = reply_path.read_text(encoding="u8") 56 | 57 | tags = " ".join( 58 | [ 59 | f"![{x}](https://img.shields.io/badge/-{x}-brightgreen?style=flat-square)" 60 | for x in meta.tags 61 | ], 62 | ) 63 | desc = "".join([f"> {x}" for x in meta.desc.splitlines()]) 64 | 65 | readme = ( 66 | "\n" 67 | f"# {meta.name}\n" 68 | "\n" 69 | f"作者:[{meta.author}]({meta.author_link})\n" 70 | "\n" 71 | f"{tags}\n" 72 | "\n" 73 | f"{desc}" 74 | "\n\n
\n\n" 75 | ) 76 | 77 | if info_readme_path.exists(): 78 | info = info_readme_path.read_text(encoding="u8") 79 | readme = f"{readme}{info}" 80 | 81 | readme = ( 82 | f"{readme}\n" 83 | "\n" 84 | "## 配置内容\n" 85 | "\n" 86 | f"[右键点击我,选择 “链接另存为...” 即可下载](https://autoreply.lgc2333.top/replies/{dir_name}/{reply_path.name})\n" 87 | "\n" 88 | "
\n" 89 | "点击展开\n" 90 | "\n" 91 | f"```{reply_path.suffix[1:]}\n" 92 | f"{reply}\n" 93 | "```" 94 | "\n" 95 | "
" 96 | ) 97 | 98 | info_url = f"market/replies/{dir_name}" 99 | br_desc = meta.desc.replace("\n", "
") 100 | 101 | sidebar_md = ( 102 | f' - [{meta.name}]({info_url} "{meta.name} | AutoReply 回复市场")' 103 | ) 104 | market_list_md = ( 105 | f"| [{meta.name}]({info_url}) " 106 | f"| [{meta.author}]({meta.author_link}) " 107 | f"| {br_desc} " 108 | f"| {tags} |" 109 | ) 110 | 111 | reply_index.append( 112 | {"dir": dir_name, "filename": reply_path.name, **meta.__dict__}, 113 | ) 114 | md_entries[meta.name] = (sidebar_md, market_list_md) 115 | readme_path = MARKET_REPLY_PATH / f"{dir_name}.md" 116 | readme_path.write_text(readme, encoding="u8") 117 | print(f"OK - {dir_name} - {meta.name}") 118 | 119 | market_list_md_li = [ 120 | "", 121 | "# 市场列表\n", 122 | "这里可以看到大家分享的回复配置!\n", 123 | "想提交自己的回复?来看看 [贡献指南](market/contributing)!\n", 124 | "| 名称 | 作者 | 介绍 | 标签 |", 125 | "| :- | :- | :- | :- |", 126 | ] 127 | sidebar_md_li = [ 128 | "", 129 | "- [回复市场](market/)", 130 | " - [贡献指南](market/contributing)", 131 | " - [市场列表](market/replies/)", 132 | ] 133 | 134 | for name in sort_text_list(md_entries.keys()): 135 | md_side, md_market = md_entries[name] 136 | sidebar_md_li.append(md_side) 137 | market_list_md_li.append(md_market) 138 | 139 | MARKET_LIST_README_PATH.write_text("\n".join(market_list_md_li), encoding="u8") 140 | SIDEBAR_MD_PATH.write_text("\n".join(sidebar_md_li), encoding="u8") 141 | # REPLIES_INDEX_PATH.write_text(json.dumps(reply_index), encoding="u8") 142 | 143 | 144 | if __name__ == "__main__": 145 | main() 146 | -------------------------------------------------------------------------------- /nonebot_plugin_autoreply/__init__.py: -------------------------------------------------------------------------------- 1 | from nonebot.plugin import PluginMetadata 2 | 3 | from . import __main__ as __main__ 4 | from .config import ConfigModel, reload_replies as reload_replies 5 | 6 | __version__ = "0.2.13" 7 | __plugin_meta__ = PluginMetadata( 8 | name="AutoReply", 9 | description="配置文件高度可自定义的自动回复插件", 10 | usage="这是一个一个一个自动回复插件啊啊啊", 11 | homepage="https://github.com/lgc-NB2Dev/nonebot-plugin-autoreply", 12 | type="application", 13 | config=ConfigModel, 14 | supported_adapters={"~onebot.v11"}, 15 | extra={"License": "MIT", "Author": "LgCookie"}, 16 | ) 17 | -------------------------------------------------------------------------------- /nonebot_plugin_autoreply/__main__.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import random 3 | import re 4 | from itertools import starmap 5 | from typing import ( 6 | Any, 7 | Callable, 8 | Dict, 9 | Iterable, 10 | List, 11 | Optional, 12 | Tuple, 13 | TypeVar, 14 | Union, 15 | cast, 16 | ) 17 | from typing_extensions import TypeVarTuple, Unpack 18 | 19 | from nonebot import on_command, on_message, on_notice 20 | from nonebot.adapters.onebot.v11 import ( 21 | Bot, 22 | GroupMessageEvent, 23 | Message, 24 | MessageEvent, 25 | MessageSegment, 26 | PokeNotifyEvent, 27 | ) 28 | from nonebot.matcher import Matcher 29 | from nonebot.permission import SUPERUSER 30 | from nonebot.typing import T_State 31 | 32 | from .config import ( 33 | FilterModel, 34 | MatchModel, 35 | MatchType, 36 | MessageSegmentModel, 37 | ReplyModel, 38 | ReplyType, 39 | config, 40 | reload_replies, 41 | replies, 42 | ) 43 | from .util import VarDictType, get_var_dict, replace_message_var 44 | 45 | T = TypeVar("T") 46 | TArgs = TypeVarTuple("TArgs") 47 | 48 | 49 | # 感谢 nb2 群内 Bryan不可思议 佬的帮助!! 50 | def check_list( 51 | function: Callable[ 52 | [Unpack[TArgs]], 53 | Union[ 54 | bool, 55 | Tuple[bool, Optional[Dict[str, Any]]], 56 | ], 57 | ], 58 | will_check: Iterable[Tuple[Unpack[TArgs]]], 59 | is_any: bool = False, 60 | ) -> Tuple[bool, Optional[Dict[str, Any]]]: 61 | var_dict_total = {} 62 | 63 | for val in starmap(function, will_check): 64 | if not isinstance(val, tuple): 65 | val = val, None 66 | 67 | ok, var_d = val 68 | 69 | # any,任意一个为 True 就返回 True 70 | if is_any and ok: 71 | return val 72 | 73 | if not is_any: 74 | # all,有一个不为 True 就返回 False 75 | if not ok: 76 | return False, None 77 | 78 | # 合并 var_dict 79 | if var_d: 80 | var_dict_total.update(var_d) 81 | 82 | # any,循环结束代表所有都是 False,返回 False 83 | if is_any: 84 | return False, None 85 | 86 | # all,循环结束代表所有都是 True,返回 True 87 | return True, var_dict_total 88 | 89 | 90 | def check_filter(will_check: FilterModel[T], val: Optional[T]) -> bool: 91 | ok = val not in will_check.values # 判断黑名单 值不在列表中 ok 92 | return (not ok) if will_check.type == "white" else ok # 白名单则反过来 93 | 94 | 95 | def check_message( 96 | match: MatchModel, 97 | event: MessageEvent, 98 | ) -> Tuple[bool, Optional[Dict[str, Any]]]: 99 | if match.type == "poke": 100 | return False, None 101 | 102 | if match.match is None: 103 | raise ValueError("存在 type 不为 poke,且 match 为空的不合法匹配规则") 104 | 105 | if match.to_me and (not event.is_tome()): 106 | return False, None 107 | 108 | msg_str = str(event.message) 109 | msg_plaintext = event.message.extract_plain_text() 110 | match_template = match.match 111 | 112 | if match.strip: 113 | msg_str = msg_str.strip() 114 | msg_plaintext = msg_plaintext.strip() 115 | 116 | if match.type == "regex": 117 | plaintext = False 118 | flag = re.IGNORECASE if match.ignore_case else 0 119 | match_obj = re.search(match_template, msg_str, flag) 120 | if (not match_obj) and match.allow_plaintext: 121 | plaintext = True 122 | match_obj = re.search(match_template, msg_plaintext, flag) 123 | 124 | if match_obj: 125 | var_dict = {} 126 | var_dict["v0"] = ( 127 | match_obj.string if plaintext else Message(match_obj.string) 128 | ) 129 | var_dict.update( 130 | { 131 | f"v{i + 1}": (str(x) if plaintext else Message(x) if x else "") 132 | for i, x in enumerate(match_obj.groups()) 133 | }, 134 | ) 135 | var_dict.update( 136 | { 137 | k: (str(v) if plaintext else Message(v) if v else "") 138 | for k, v in match_obj.groupdict().items() 139 | }, 140 | ) 141 | return True, var_dict 142 | 143 | return False, None 144 | 145 | if match.ignore_case: 146 | # regex 匹配已经处理过了,这边不需要管 147 | msg_str = msg_str.lower() 148 | match_template = match_template.lower() 149 | 150 | if match.type == "full": 151 | return ( 152 | ( 153 | (msg_str == match_template) 154 | or (msg_plaintext == match_template if match.allow_plaintext else False) 155 | ), 156 | None, 157 | ) 158 | 159 | if match.type == "start": 160 | return ( 161 | ( 162 | msg_str.startswith(match_template) 163 | or ( 164 | msg_plaintext.startswith(match_template) 165 | if match.allow_plaintext 166 | else False 167 | ) 168 | ), 169 | None, 170 | ) 171 | 172 | if match.type == "end": 173 | return ( 174 | ( 175 | msg_str.endswith(match_template) 176 | or ( 177 | msg_plaintext.endswith(match_template) 178 | if match.allow_plaintext 179 | else False 180 | ) 181 | ), 182 | None, 183 | ) 184 | 185 | # default fuzzy 186 | if (not msg_str) or (match.allow_plaintext and (not msg_plaintext)): 187 | return False, None 188 | return ( 189 | ( 190 | (match_template in msg_str) 191 | or ((match_template in msg_plaintext) if match.allow_plaintext else False) 192 | ), 193 | None, 194 | ) 195 | 196 | 197 | def check_poke(match: MatchModel, event: PokeNotifyEvent) -> bool: 198 | if match.type != "poke": 199 | return False 200 | return event.is_tome() if match.to_me else True 201 | 202 | 203 | def check_match( 204 | match: MatchType, 205 | event: Union[MessageEvent, PokeNotifyEvent], 206 | ) -> Tuple[bool, Optional[Dict[str, Any]]]: 207 | if isinstance(match, str): 208 | match = MatchModel(match=match) 209 | 210 | if match.possibility < 1 and random.random() > match.possibility: 211 | return False, None 212 | 213 | return ( 214 | check_message(match, event) 215 | if isinstance(event, MessageEvent) 216 | else (check_poke(match, event), None) 217 | ) 218 | 219 | 220 | async def message_checker( 221 | event: Union[MessageEvent, PokeNotifyEvent], 222 | state: T_State, 223 | ) -> bool: 224 | group = ( 225 | event.group_id 226 | if isinstance(event, (GroupMessageEvent, PokeNotifyEvent)) 227 | else None 228 | ) 229 | 230 | state_reply: List[Tuple[ReplyType, Optional[Dict[str, Any]]]] = [] 231 | for reply in replies: 232 | filter_checks = [(reply.groups, group), (reply.users, event.user_id)] 233 | match_checks = [(x, event) for x in reply.matches] 234 | 235 | if not ( 236 | check_list(check_filter, filter_checks)[0] 237 | and (match_result := check_list(check_match, match_checks, is_any=True))[0] 238 | ): 239 | continue 240 | 241 | state_reply.append((random.choice(reply.replies), match_result[1])) 242 | if reply.block: 243 | break 244 | 245 | state["reply"] = state_reply 246 | return bool(state_reply) 247 | 248 | 249 | ReplyMessagesType = Tuple[List[Message], Optional[Tuple[int, int]]] 250 | 251 | 252 | async def get_reply_msgs( 253 | reply: ReplyType, 254 | var_dict: VarDictType, 255 | refuse_multi: bool = False, 256 | ) -> ReplyMessagesType: 257 | if isinstance(reply, str): 258 | is_plain = reply.startswith("@") 259 | if is_plain: 260 | reply = reply[1:] 261 | 262 | reply = ReplyModel(type="plain" if is_plain else "normal", message=reply) 263 | 264 | elif isinstance(reply, list): 265 | reply = ReplyModel(type="array", message=reply) 266 | 267 | rt = reply.type 268 | msg = reply.message 269 | 270 | if rt == "plain": 271 | msg = cast(str, msg) 272 | return [Message() + msg], None 273 | 274 | if rt == "array": 275 | msg = cast(List[MessageSegmentModel], msg) 276 | msg = Message(MessageSegment(type=x.type, data=x.data) for x in msg) 277 | msg = await replace_message_var(msg, var_dict) 278 | return [msg], None 279 | 280 | if rt == "multi": 281 | if refuse_multi: 282 | raise ValueError("Nested `multi` is not allowed") 283 | 284 | delay = reply.delay 285 | if isinstance(delay, int): 286 | delay = (delay, delay) 287 | 288 | msg = cast(List[ReplyModel], msg) 289 | msgs = [ 290 | (await get_reply_msgs(x, var_dict, refuse_multi=True))[0][0] for x in msg 291 | ] 292 | if reply.shuffle: 293 | random.shuffle(msgs) 294 | 295 | return msgs, delay 296 | 297 | # default normal 298 | msg = cast(str, msg) 299 | return [await replace_message_var(Message(msg), var_dict)], None 300 | 301 | 302 | message_matcher = on_message( 303 | rule=message_checker, 304 | block=config.autoreply_block, 305 | priority=config.autoreply_priority, 306 | ) 307 | 308 | poke_matcher = on_notice( 309 | rule=message_checker, 310 | block=config.autoreply_block, 311 | priority=config.autoreply_priority, 312 | ) 313 | 314 | 315 | @message_matcher.handle() 316 | @poke_matcher.handle() 317 | async def _( 318 | bot: Bot, 319 | event: Union[MessageEvent, PokeNotifyEvent], 320 | matcher: Matcher, 321 | state: T_State, 322 | ): 323 | reply: List[Tuple[ReplyType, Optional[Dict[str, Any]]]] = state["reply"] 324 | 325 | var_dict = await get_var_dict(bot, event) 326 | reply_msgs: List[ReplyMessagesType] = await asyncio.gather( 327 | *( 328 | get_reply_msgs( 329 | x[0], 330 | ( 331 | {**var_dict[0], **(var if (var := x[1]) else {})}, 332 | var_dict[1], 333 | ), 334 | ) 335 | for x in reply 336 | ), 337 | ) 338 | 339 | for msgs, delay_tuple in reply_msgs: 340 | for x in msgs: 341 | await matcher.send(x) 342 | 343 | if delay_tuple: 344 | d_min, d_max = delay_tuple 345 | delay = d_min if d_min == d_max else random.randint(d_min, d_max) 346 | delay /= 1000 347 | await asyncio.sleep(delay) 348 | 349 | 350 | reload_matcher = on_command("重载自动回复", permission=SUPERUSER) 351 | 352 | 353 | @reload_matcher.handle() 354 | async def _(matcher: Matcher): 355 | success, fail = reload_replies() 356 | await matcher.finish(f"重载回复配置完毕~\n成功 {success} 个,失败 {fail} 个") 357 | -------------------------------------------------------------------------------- /nonebot_plugin_autoreply/config.py: -------------------------------------------------------------------------------- 1 | import json 2 | from pathlib import Path 3 | from typing import ( 4 | Any, 5 | Dict, 6 | Generic, 7 | Iterator, 8 | List, 9 | Literal, 10 | Optional, 11 | Tuple, 12 | TypeVar, 13 | Union, 14 | ) 15 | 16 | import yaml 17 | from nonebot import get_plugin_config 18 | from nonebot.log import logger 19 | from pydantic import BaseModel 20 | 21 | T = TypeVar("T") 22 | 23 | DATA_PATH = Path.cwd() / "data" / "autoreply" 24 | if not DATA_PATH.exists(): 25 | DATA_PATH.mkdir(parents=True) 26 | 27 | ALLOWED_SUFFIXES = (".json", ".yml", ".yaml") 28 | 29 | MatchType = Union[str, "MatchModel"] 30 | ReplyType = Union[str, List["MessageSegmentModel"], "ReplyModel"] 31 | MessageType = Union[str, List["MessageSegmentModel"], List[ReplyType]] 32 | 33 | 34 | class MatchModel(BaseModel): 35 | type: Literal[ # noqa: A003 36 | "full", 37 | "fuzzy", 38 | "start", 39 | "end", 40 | "regex", 41 | "poke", 42 | ] = "fuzzy" 43 | possibility: float = 1.0 44 | 45 | match: Optional[str] = None 46 | to_me: bool = False 47 | ignore_case: bool = True 48 | strip: bool = True 49 | allow_plaintext: bool = True 50 | 51 | 52 | class MessageSegmentModel(BaseModel): 53 | type: str # noqa: A003 54 | data: Dict[str, Any] 55 | 56 | 57 | class ReplyModel(BaseModel): 58 | type: Literal["normal", "plain", "array", "multi"] # noqa: A003 59 | message: MessageType 60 | shuffle: bool = False 61 | delay: Union[Tuple[int, int], int] = (0, 0) 62 | 63 | 64 | class FilterModel(BaseModel, Generic[T]): 65 | type: Literal["black", "white"] = "black" # noqa: A003 66 | values: List[T] 67 | 68 | 69 | # TODO cool down 70 | # class CoolDownModel(BaseModel): 71 | # type: Literal["user", "group"] = "group" # noqa: A003 72 | # """cd类型,user为每个人的cd,group为每个群的cd""" 73 | # time: float 74 | # """cd时长,单位秒""" 75 | # tip: Optional[str] = None 76 | # """正在cd中的提示,None或空字符串为不提示""" 77 | 78 | 79 | class ReplyEntryModel(BaseModel): 80 | block: bool = True 81 | priority: int = 1 82 | # cool_down: Optional[CoolDownModel] = None 83 | matches: List[MatchType] 84 | replies: List[ReplyType] 85 | groups: FilterModel[int] = FilterModel(values=[]) 86 | users: FilterModel[int] = FilterModel(values=[]) 87 | 88 | 89 | # TODO class ResolvedReplyEntryModel 90 | # 在配置项载入的之后就规范化配置项模型,减少运行时开销 91 | 92 | 93 | class ConfigModel(BaseModel): 94 | autoreply_block: bool = False 95 | autoreply_priority: int = 99 96 | 97 | 98 | replies: List[ReplyEntryModel] = [] 99 | config = get_plugin_config(ConfigModel) 100 | 101 | 102 | def iter_config_path(root_path: Path = DATA_PATH) -> Iterator[Path]: 103 | for path in root_path.iterdir(): 104 | if path.is_dir(): 105 | yield from iter_config_path(path) 106 | 107 | if path.is_file() and (path.suffix in ALLOWED_SUFFIXES): 108 | yield path 109 | 110 | 111 | def load_config(path: Path) -> List[ReplyEntryModel]: 112 | content = path.read_text(encoding="u8") 113 | 114 | if path.suffix in (".yml", ".yaml"): 115 | obj = yaml.safe_load(content) 116 | else: 117 | obj = json.loads(content) 118 | 119 | return [ReplyEntryModel(**x) for x in obj] 120 | 121 | 122 | def reload_replies() -> Tuple[int, int]: 123 | replies.clear() 124 | 125 | success = 0 126 | fail = 0 127 | 128 | for path in iter_config_path(): 129 | file_name = path.name 130 | 131 | try: 132 | replies.extend(load_config(path)) 133 | 134 | except Exception: 135 | logger.opt(colors=True).exception( 136 | f"加载回复配置 {file_name} 失败", 137 | ) 138 | fail += 1 139 | 140 | else: 141 | logger.opt(colors=True).info( 142 | f"加载回复配置 {file_name} 成功", 143 | ) 144 | success += 1 145 | 146 | replies.sort(key=lambda x: x.priority) 147 | logger.opt(colors=True).info( 148 | f"加载回复配置完毕,成功 {success} 个,失败 {fail}", 149 | ) 150 | return success, fail 151 | 152 | 153 | reload_replies() 154 | -------------------------------------------------------------------------------- /nonebot_plugin_autoreply/cool_down.py: -------------------------------------------------------------------------------- 1 | # TODO cool down 2 | class CoolDownManager: 3 | pass 4 | -------------------------------------------------------------------------------- /nonebot_plugin_autoreply/util.py: -------------------------------------------------------------------------------- 1 | import mimetypes 2 | import random 3 | from typing import Any, Dict, Optional, Tuple, Union, cast 4 | 5 | from anyio import Path 6 | from nonebot import logger 7 | from nonebot.adapters.onebot.utils import f2s 8 | from nonebot.adapters.onebot.v11 import ( 9 | Bot, 10 | GroupMessageEvent, 11 | Message, 12 | MessageEvent, 13 | MessageSegment, 14 | PokeNotifyEvent, 15 | ) 16 | 17 | VarDictType = Tuple[Dict[str, Any], Dict[str, Any]] 18 | 19 | 20 | async def get_var_dict( 21 | bot: Bot, 22 | event: Union[MessageEvent, PokeNotifyEvent], 23 | ) -> VarDictType: 24 | is_message = isinstance(event, MessageEvent) 25 | is_group = isinstance(event, GroupMessageEvent) 26 | is_poke = isinstance(event, PokeNotifyEvent) 27 | 28 | message = event.get_message() if is_message else None 29 | plaintext = event.get_plaintext() if is_message else None 30 | message_id = event.message_id if is_message else None 31 | user_id = event.user_id 32 | group_id = event.group_id if is_group or is_poke else None 33 | 34 | if is_poke: 35 | sender = ( 36 | await bot.get_group_member_info(group_id=group_id, user_id=user_id) 37 | if group_id 38 | else await bot.get_stranger_info(user_id=user_id) 39 | ) 40 | nickname = sender["nickname"] 41 | card = sender.get("card") 42 | 43 | else: 44 | sender = event.sender 45 | nickname = sender.nickname 46 | card = sender.card 47 | 48 | normal_var = { 49 | "bs": "{", 50 | "be": "}", 51 | "self_id": event.self_id, 52 | "message_id": message_id, 53 | "user_id": user_id, 54 | "group_id": group_id, 55 | "target_id": event.target_id if is_poke else None, 56 | "nickname": nickname, 57 | "card": card, 58 | "display_name": card or nickname, 59 | "plaintext": plaintext, 60 | } 61 | seg_var = { 62 | "at": MessageSegment.at(user_id), 63 | "reply": MessageSegment.reply(message_id) if message_id else None, 64 | "message": message, 65 | } 66 | return normal_var, seg_var 67 | 68 | 69 | SEG_MIMETYPES = { 70 | "image": "image/", 71 | "record": "audio/", 72 | } 73 | 74 | 75 | async def process_res_seg(seg: MessageSegment): 76 | file = seg.data.get("file") 77 | if not (isinstance(file, str) and file.startswith("file:///")): 78 | return 79 | 80 | path = Path(file[8:]) 81 | if await path.is_dir(): 82 | f = await get_random_file(path, SEG_MIMETYPES[seg.type]) 83 | if not f: 84 | logger.warning(f"No files matched expected file type for {seg.type}") 85 | return 86 | path = f 87 | 88 | try: 89 | seg.data["file"] = f2s(await path.read_bytes()) 90 | except Exception as e: 91 | logger.error(f"Failed to read file {path}: {type(e).__name__}: {e}") 92 | logger.opt(exception=e).debug("Stacktrace") 93 | 94 | 95 | async def replace_message_var(message: Message, var_dict: VarDictType) -> Message: 96 | normal_var, seg_var = var_dict 97 | message = cast( 98 | Message, 99 | Message.template(message).format_map({**normal_var, **seg_var}), 100 | ) 101 | 102 | for seg in message: 103 | if not seg.is_text(): 104 | for k, v in seg.data.items(): 105 | if isinstance(v, str): 106 | seg.data[k] = v.format(**normal_var) 107 | 108 | if seg.type in ("image", "record"): 109 | await process_res_seg(seg) 110 | 111 | return message 112 | 113 | 114 | async def get_random_file(base_path: Path, mime_pfx: str) -> Optional[Path]: 115 | async def inner(p: Path): 116 | async for x in p.iterdir(): 117 | if await x.is_dir(): 118 | async for y in inner(x): 119 | yield y 120 | 121 | mime = mimetypes.guess_type(x.name)[0] 122 | if mime and mime.startswith(mime_pfx): 123 | yield x 124 | 125 | return random.choice([x async for x in inner(base_path)]) 126 | -------------------------------------------------------------------------------- /pdm.lock: -------------------------------------------------------------------------------- 1 | # This file is @generated by PDM. 2 | # It is not intended for manual editing. 3 | 4 | [metadata] 5 | groups = ["default"] 6 | strategy = ["inherit_metadata"] 7 | lock_version = "4.5.0" 8 | content_hash = "sha256:7cd8a21512c22e79090737699a3333dac1d2fcc5145769cc932225e3ba8a89ac" 9 | 10 | [[metadata.targets]] 11 | requires_python = "~=3.9" 12 | 13 | [[package]] 14 | name = "annotated-types" 15 | version = "0.7.0" 16 | requires_python = ">=3.8" 17 | summary = "Reusable constraint types to use with typing.Annotated" 18 | groups = ["default"] 19 | dependencies = [ 20 | "typing-extensions>=4.0.0; python_version < \"3.9\"", 21 | ] 22 | files = [ 23 | {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, 24 | {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, 25 | ] 26 | 27 | [[package]] 28 | name = "anyio" 29 | version = "4.8.0" 30 | requires_python = ">=3.9" 31 | summary = "High level compatibility layer for multiple asynchronous event loop implementations" 32 | groups = ["default"] 33 | dependencies = [ 34 | "exceptiongroup>=1.0.2; python_version < \"3.11\"", 35 | "idna>=2.8", 36 | "sniffio>=1.1", 37 | "typing-extensions>=4.5; python_version < \"3.13\"", 38 | ] 39 | files = [ 40 | {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, 41 | {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, 42 | ] 43 | 44 | [[package]] 45 | name = "colorama" 46 | version = "0.4.6" 47 | requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 48 | summary = "Cross-platform colored terminal text." 49 | groups = ["default"] 50 | marker = "sys_platform == \"win32\"" 51 | files = [ 52 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 53 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 54 | ] 55 | 56 | [[package]] 57 | name = "exceptiongroup" 58 | version = "1.2.2" 59 | requires_python = ">=3.7" 60 | summary = "Backport of PEP 654 (exception groups)" 61 | groups = ["default"] 62 | files = [ 63 | {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, 64 | {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, 65 | ] 66 | 67 | [[package]] 68 | name = "idna" 69 | version = "3.10" 70 | requires_python = ">=3.6" 71 | summary = "Internationalized Domain Names in Applications (IDNA)" 72 | groups = ["default"] 73 | files = [ 74 | {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, 75 | {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, 76 | ] 77 | 78 | [[package]] 79 | name = "loguru" 80 | version = "0.7.3" 81 | requires_python = "<4.0,>=3.5" 82 | summary = "Python logging made (stupidly) simple" 83 | groups = ["default"] 84 | dependencies = [ 85 | "aiocontextvars>=0.2.0; python_version < \"3.7\"", 86 | "colorama>=0.3.4; sys_platform == \"win32\"", 87 | "win32-setctime>=1.0.0; sys_platform == \"win32\"", 88 | ] 89 | files = [ 90 | {file = "loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c"}, 91 | {file = "loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6"}, 92 | ] 93 | 94 | [[package]] 95 | name = "msgpack" 96 | version = "1.1.0" 97 | requires_python = ">=3.8" 98 | summary = "MessagePack serializer" 99 | groups = ["default"] 100 | files = [ 101 | {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd"}, 102 | {file = "msgpack-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d"}, 103 | {file = "msgpack-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5"}, 104 | {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5"}, 105 | {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e"}, 106 | {file = "msgpack-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b"}, 107 | {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f"}, 108 | {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68"}, 109 | {file = "msgpack-1.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b"}, 110 | {file = "msgpack-1.1.0-cp310-cp310-win32.whl", hash = "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044"}, 111 | {file = "msgpack-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f"}, 112 | {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7"}, 113 | {file = "msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa"}, 114 | {file = "msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701"}, 115 | {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6"}, 116 | {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59"}, 117 | {file = "msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0"}, 118 | {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e"}, 119 | {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6"}, 120 | {file = "msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5"}, 121 | {file = "msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88"}, 122 | {file = "msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788"}, 123 | {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d"}, 124 | {file = "msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2"}, 125 | {file = "msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420"}, 126 | {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2"}, 127 | {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39"}, 128 | {file = "msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f"}, 129 | {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247"}, 130 | {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c"}, 131 | {file = "msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b"}, 132 | {file = "msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b"}, 133 | {file = "msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f"}, 134 | {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf"}, 135 | {file = "msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330"}, 136 | {file = "msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734"}, 137 | {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e"}, 138 | {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca"}, 139 | {file = "msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915"}, 140 | {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d"}, 141 | {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434"}, 142 | {file = "msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c"}, 143 | {file = "msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc"}, 144 | {file = "msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f"}, 145 | {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1"}, 146 | {file = "msgpack-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48"}, 147 | {file = "msgpack-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c"}, 148 | {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468"}, 149 | {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74"}, 150 | {file = "msgpack-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846"}, 151 | {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346"}, 152 | {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b"}, 153 | {file = "msgpack-1.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8"}, 154 | {file = "msgpack-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd"}, 155 | {file = "msgpack-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325"}, 156 | {file = "msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e"}, 157 | ] 158 | 159 | [[package]] 160 | name = "multidict" 161 | version = "6.1.0" 162 | requires_python = ">=3.8" 163 | summary = "multidict implementation" 164 | groups = ["default"] 165 | dependencies = [ 166 | "typing-extensions>=4.1.0; python_version < \"3.11\"", 167 | ] 168 | files = [ 169 | {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, 170 | {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, 171 | {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, 172 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, 173 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, 174 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, 175 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, 176 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, 177 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, 178 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, 179 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, 180 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, 181 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, 182 | {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, 183 | {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, 184 | {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, 185 | {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, 186 | {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, 187 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, 188 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, 189 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, 190 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, 191 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, 192 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, 193 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, 194 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, 195 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, 196 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, 197 | {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, 198 | {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, 199 | {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, 200 | {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, 201 | {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, 202 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, 203 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, 204 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, 205 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, 206 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, 207 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, 208 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, 209 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, 210 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, 211 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, 212 | {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, 213 | {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, 214 | {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, 215 | {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, 216 | {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, 217 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, 218 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, 219 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, 220 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, 221 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, 222 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, 223 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, 224 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, 225 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, 226 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, 227 | {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, 228 | {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, 229 | {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, 230 | {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, 231 | {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, 232 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, 233 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, 234 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, 235 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, 236 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, 237 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, 238 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, 239 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, 240 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, 241 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, 242 | {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, 243 | {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, 244 | {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, 245 | {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, 246 | ] 247 | 248 | [[package]] 249 | name = "nonebot-adapter-onebot" 250 | version = "2.4.6" 251 | requires_python = "<4.0,>=3.9" 252 | summary = "OneBot(CQHTTP) adapter for nonebot2" 253 | groups = ["default"] 254 | dependencies = [ 255 | "msgpack<2.0.0,>=1.0.3", 256 | "nonebot2<3.0.0,>=2.2.0", 257 | "pydantic!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0", 258 | "typing-extensions<5.0.0,>=4.0.0", 259 | ] 260 | files = [ 261 | {file = "nonebot_adapter_onebot-2.4.6-py3-none-any.whl", hash = "sha256:b1ec7023fd83d731f63b513217327a57d12893a261944934b9195f79173791ad"}, 262 | {file = "nonebot_adapter_onebot-2.4.6.tar.gz", hash = "sha256:e33c93649ad11b320d8e9ff213635f29b23b4d0413c9158bd031c513c2f8f701"}, 263 | ] 264 | 265 | [[package]] 266 | name = "nonebot2" 267 | version = "2.4.1" 268 | requires_python = "<4.0,>=3.9" 269 | summary = "An asynchronous python bot framework." 270 | groups = ["default"] 271 | dependencies = [ 272 | "anyio<5.0.0,>=4.4.0", 273 | "exceptiongroup<2.0.0,>=1.2.2", 274 | "loguru<1.0.0,>=0.6.0", 275 | "pydantic!=2.10.0,!=2.10.1,!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0", 276 | "pygtrie<3.0.0,>=2.4.1", 277 | "python-dotenv<2.0.0,>=0.21.0", 278 | "tomli<3.0.0,>=2.0.1; python_version < \"3.11\"", 279 | "typing-extensions<5.0.0,>=4.4.0", 280 | "yarl<2.0.0,>=1.7.2", 281 | ] 282 | files = [ 283 | {file = "nonebot2-2.4.1-py3-none-any.whl", hash = "sha256:fec95f075efc89dbe9ce148618b413b02f46ba284200367749b035e794695111"}, 284 | {file = "nonebot2-2.4.1.tar.gz", hash = "sha256:8fea364318501ed79721403a8ecd76587bc884d58c356260f691a8bbda9b05e6"}, 285 | ] 286 | 287 | [[package]] 288 | name = "propcache" 289 | version = "0.2.1" 290 | requires_python = ">=3.9" 291 | summary = "Accelerated property cache" 292 | groups = ["default"] 293 | files = [ 294 | {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, 295 | {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, 296 | {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, 297 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, 298 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, 299 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, 300 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, 301 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, 302 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, 303 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, 304 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, 305 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, 306 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, 307 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, 308 | {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, 309 | {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, 310 | {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, 311 | {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, 312 | {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, 313 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, 314 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, 315 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, 316 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, 317 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, 318 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, 319 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, 320 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, 321 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, 322 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, 323 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, 324 | {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, 325 | {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, 326 | {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, 327 | {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, 328 | {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, 329 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, 330 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, 331 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, 332 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, 333 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, 334 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, 335 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, 336 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, 337 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, 338 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, 339 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, 340 | {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, 341 | {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, 342 | {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"}, 343 | {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"}, 344 | {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"}, 345 | {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"}, 346 | {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"}, 347 | {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"}, 348 | {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"}, 349 | {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"}, 350 | {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"}, 351 | {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"}, 352 | {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"}, 353 | {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"}, 354 | {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"}, 355 | {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"}, 356 | {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"}, 357 | {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"}, 358 | {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, 359 | {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, 360 | {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, 361 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, 362 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, 363 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, 364 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, 365 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, 366 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, 367 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, 368 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, 369 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, 370 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, 371 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, 372 | {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, 373 | {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, 374 | {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, 375 | {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, 376 | ] 377 | 378 | [[package]] 379 | name = "pydantic" 380 | version = "2.10.6" 381 | requires_python = ">=3.8" 382 | summary = "Data validation using Python type hints" 383 | groups = ["default"] 384 | dependencies = [ 385 | "annotated-types>=0.6.0", 386 | "pydantic-core==2.27.2", 387 | "typing-extensions>=4.12.2", 388 | ] 389 | files = [ 390 | {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, 391 | {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, 392 | ] 393 | 394 | [[package]] 395 | name = "pydantic-core" 396 | version = "2.27.2" 397 | requires_python = ">=3.8" 398 | summary = "Core functionality for Pydantic validation and serialization" 399 | groups = ["default"] 400 | dependencies = [ 401 | "typing-extensions!=4.7.0,>=4.6.0", 402 | ] 403 | files = [ 404 | {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, 405 | {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, 406 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, 407 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, 408 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, 409 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, 410 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, 411 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, 412 | {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, 413 | {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, 414 | {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, 415 | {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, 416 | {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, 417 | {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, 418 | {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, 419 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, 420 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, 421 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, 422 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, 423 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, 424 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, 425 | {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, 426 | {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, 427 | {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, 428 | {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, 429 | {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, 430 | {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, 431 | {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, 432 | {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, 433 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, 434 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, 435 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, 436 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, 437 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, 438 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, 439 | {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, 440 | {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, 441 | {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, 442 | {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, 443 | {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, 444 | {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, 445 | {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, 446 | {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, 447 | {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, 448 | {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, 449 | {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, 450 | {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, 451 | {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, 452 | {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, 453 | {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, 454 | {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, 455 | {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, 456 | {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, 457 | {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, 458 | {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, 459 | {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, 460 | {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, 461 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, 462 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, 463 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, 464 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, 465 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, 466 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, 467 | {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, 468 | {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, 469 | {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, 470 | {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, 471 | {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, 472 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, 473 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, 474 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, 475 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, 476 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, 477 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, 478 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, 479 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, 480 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, 481 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, 482 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, 483 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, 484 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, 485 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, 486 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, 487 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, 488 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, 489 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, 490 | {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, 491 | ] 492 | 493 | [[package]] 494 | name = "pygtrie" 495 | version = "2.5.0" 496 | summary = "A pure Python trie data structure implementation." 497 | groups = ["default"] 498 | files = [ 499 | {file = "pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16"}, 500 | {file = "pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2"}, 501 | ] 502 | 503 | [[package]] 504 | name = "python-dotenv" 505 | version = "1.0.1" 506 | requires_python = ">=3.8" 507 | summary = "Read key-value pairs from a .env file and set them as environment variables" 508 | groups = ["default"] 509 | files = [ 510 | {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, 511 | {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, 512 | ] 513 | 514 | [[package]] 515 | name = "pyyaml" 516 | version = "6.0.2" 517 | requires_python = ">=3.8" 518 | summary = "YAML parser and emitter for Python" 519 | groups = ["default"] 520 | files = [ 521 | {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, 522 | {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, 523 | {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, 524 | {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, 525 | {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, 526 | {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, 527 | {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, 528 | {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, 529 | {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, 530 | {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, 531 | {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, 532 | {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, 533 | {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, 534 | {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, 535 | {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, 536 | {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, 537 | {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, 538 | {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, 539 | {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, 540 | {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, 541 | {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, 542 | {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, 543 | {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, 544 | {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, 545 | {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, 546 | {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, 547 | {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, 548 | {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, 549 | {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, 550 | {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, 551 | {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, 552 | {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, 553 | {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, 554 | {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, 555 | {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, 556 | {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, 557 | {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, 558 | {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, 559 | {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, 560 | {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, 561 | {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, 562 | {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, 563 | {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, 564 | {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, 565 | {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, 566 | {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, 567 | ] 568 | 569 | [[package]] 570 | name = "sniffio" 571 | version = "1.3.1" 572 | requires_python = ">=3.7" 573 | summary = "Sniff out which async library your code is running under" 574 | groups = ["default"] 575 | files = [ 576 | {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, 577 | {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, 578 | ] 579 | 580 | [[package]] 581 | name = "tomli" 582 | version = "2.2.1" 583 | requires_python = ">=3.8" 584 | summary = "A lil' TOML parser" 585 | groups = ["default"] 586 | marker = "python_version < \"3.11\"" 587 | files = [ 588 | {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, 589 | {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, 590 | {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, 591 | {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, 592 | {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, 593 | {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, 594 | {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, 595 | {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, 596 | {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, 597 | {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, 598 | {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, 599 | {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, 600 | {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, 601 | {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, 602 | {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, 603 | {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, 604 | {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, 605 | {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, 606 | {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, 607 | {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, 608 | {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, 609 | {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, 610 | {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, 611 | {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, 612 | {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, 613 | {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, 614 | {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, 615 | {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, 616 | {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, 617 | {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, 618 | {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, 619 | {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, 620 | ] 621 | 622 | [[package]] 623 | name = "typing-extensions" 624 | version = "4.12.2" 625 | requires_python = ">=3.8" 626 | summary = "Backported and Experimental Type Hints for Python 3.8+" 627 | groups = ["default"] 628 | files = [ 629 | {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, 630 | {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, 631 | ] 632 | 633 | [[package]] 634 | name = "win32-setctime" 635 | version = "1.2.0" 636 | requires_python = ">=3.5" 637 | summary = "A small Python utility to set file creation time on Windows" 638 | groups = ["default"] 639 | marker = "sys_platform == \"win32\"" 640 | files = [ 641 | {file = "win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390"}, 642 | {file = "win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0"}, 643 | ] 644 | 645 | [[package]] 646 | name = "yarl" 647 | version = "1.18.3" 648 | requires_python = ">=3.9" 649 | summary = "Yet another URL library" 650 | groups = ["default"] 651 | dependencies = [ 652 | "idna>=2.0", 653 | "multidict>=4.0", 654 | "propcache>=0.2.0", 655 | ] 656 | files = [ 657 | {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, 658 | {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, 659 | {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"}, 660 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"}, 661 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"}, 662 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"}, 663 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"}, 664 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"}, 665 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"}, 666 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"}, 667 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"}, 668 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"}, 669 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"}, 670 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"}, 671 | {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"}, 672 | {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"}, 673 | {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"}, 674 | {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"}, 675 | {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"}, 676 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"}, 677 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"}, 678 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"}, 679 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"}, 680 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"}, 681 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"}, 682 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"}, 683 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"}, 684 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"}, 685 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"}, 686 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"}, 687 | {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"}, 688 | {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"}, 689 | {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"}, 690 | {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"}, 691 | {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"}, 692 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"}, 693 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"}, 694 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"}, 695 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"}, 696 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"}, 697 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"}, 698 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"}, 699 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"}, 700 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"}, 701 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"}, 702 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"}, 703 | {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"}, 704 | {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"}, 705 | {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"}, 706 | {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"}, 707 | {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"}, 708 | {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"}, 709 | {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"}, 710 | {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"}, 711 | {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"}, 712 | {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"}, 713 | {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"}, 714 | {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"}, 715 | {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"}, 716 | {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"}, 717 | {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"}, 718 | {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"}, 719 | {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"}, 720 | {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"}, 721 | {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"}, 722 | {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"}, 723 | {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"}, 724 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"}, 725 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"}, 726 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"}, 727 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"}, 728 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"}, 729 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"}, 730 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"}, 731 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"}, 732 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"}, 733 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"}, 734 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"}, 735 | {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"}, 736 | {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"}, 737 | {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"}, 738 | {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"}, 739 | ] 740 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "nonebot-plugin-autoreply" 3 | dynamic = ["version"] 4 | description = "A powerful auto reply plugin for NoneBot2" 5 | authors = [{ name = "LgCookie", email = "lgc2333@126.com" }] 6 | dependencies = [ 7 | "nonebot2>=2.4.1", 8 | "nonebot-adapter-onebot>=2.4.6", 9 | "typing-extensions>=4.12.2", 10 | "PyYAML>=6.0.2", 11 | "anyio>=4.8.0", 12 | ] 13 | requires-python = ">=3.9,<4.0" 14 | readme = "README.md" 15 | license = { text = "MIT" } 16 | 17 | [project.urls] 18 | homepage = "https://github.com/lgc-NB2Dev/nonebot-plugin-autoreply" 19 | 20 | [tool.pdm.build] 21 | includes = [] 22 | 23 | [tool.pdm.version] 24 | source = "file" 25 | path = "nonebot_plugin_autoreply/__init__.py" 26 | 27 | [build-system] 28 | requires = ["pdm-backend"] 29 | build-backend = "pdm.backend" 30 | --------------------------------------------------------------------------------