├── .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 |
50 |
51 | ## 🛒 回复市场
52 |
53 | 
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) |  |
11 | | [FuckYou](market/replies/fuck_you) | [xiaoye12123 & LgCookie](https://github.com/lgc-NB2Dev/nonebot-plugin-fuckyou) | 骂我?我他妈骂回去!(移植自 nonebot-plugin-fuckyou) |    |
12 | | [菜鸡语录](market/replies/i_am_rubbish) | [TennyZhuang & LgCookie](https://github.com/TennyZhuang/Chi-Corpus/blob/master/common.txt) | 我好菜啊 |    |
13 | | [在吗?](market/replies/are_you_here) | [LgCookie](https://lgc2333.top) | @Bot 并带上“在吗”时回复 |   |
--------------------------------------------------------------------------------
/marketplace/market/replies/are_you_here.md:
--------------------------------------------------------------------------------
1 |
2 | # 在吗?
3 |
4 | 作者:[LgCookie](https://lgc2333.top)
5 |
6 |  
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 | 
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 |   
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 |
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""
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 |
--------------------------------------------------------------------------------