├── .github ├── FUNDING.yml └── workflows │ └── pypi-publish.yml ├── .gitignore ├── LICENSE ├── README.md ├── nonebot_plugin_kawaii_robot ├── __init__.py ├── __main__.py ├── config.py ├── const.py ├── data_source.py ├── resource │ ├── data.json │ └── leaf.json └── utils.py ├── pdm.lock └── pyproject.toml /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: 2 | - https://afdian.net/a/lgc2333/ 3 | - https://blog.lgc2333.top/donate 4 | -------------------------------------------------------------------------------- /.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 | .pdm-python 116 | 117 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 118 | __pypackages__/ 119 | 120 | # Celery stuff 121 | celerybeat-schedule 122 | celerybeat.pid 123 | 124 | # SageMath parsed files 125 | *.sage.py 126 | 127 | # Environments 128 | .env 129 | .venv 130 | env/ 131 | venv/ 132 | ENV/ 133 | env.bak/ 134 | venv.bak/ 135 | 136 | # Spyder project settings 137 | .spyderproject 138 | .spyproject 139 | 140 | # Rope project settings 141 | .ropeproject 142 | 143 | # mkdocs documentation 144 | /site 145 | 146 | # mypy 147 | .mypy_cache/ 148 | .dmypy.json 149 | dmypy.json 150 | 151 | # Pyre type checker 152 | .pyre/ 153 | 154 | # pytype static type analyzer 155 | .pytype/ 156 | 157 | # Cython debug symbols 158 | cython_debug/ 159 | 160 | # PyCharm 161 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 162 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 163 | # and can be added to the global gitignore or merged into this file. For a more nuclear 164 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 165 | #.idea/ 166 | 167 | ### Python Patch ### 168 | # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration 169 | # poetry.toml 170 | 171 | # End of https://www.toptal.com/developers/gitignore/api/python 172 | 173 | .vscode 174 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU AFFERO GENERAL PUBLIC LICENSE 2 | Version 3, 19 November 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU Affero General Public License is a free, copyleft license for 11 | software and other kinds of works, specifically designed to ensure 12 | cooperation with the community in the case of network server software. 13 | 14 | The licenses for most software and other practical works are designed 15 | to take away your freedom to share and change the works. By contrast, 16 | our General Public Licenses are intended to guarantee your freedom to 17 | share and change all versions of a program--to make sure it remains free 18 | software for all its users. 19 | 20 | When we speak of free software, we are referring to freedom, not 21 | price. Our General Public Licenses are designed to make sure that you 22 | have the freedom to distribute copies of free software (and charge for 23 | them if you wish), that you receive source code or can get it if you 24 | want it, that you can change the software or use pieces of it in new 25 | free programs, and that you know you can do these things. 26 | 27 | Developers that use our General Public Licenses protect your rights 28 | with two steps: (1) assert copyright on the software, and (2) offer 29 | you this License which gives you legal permission to copy, distribute 30 | and/or modify the software. 31 | 32 | A secondary benefit of defending all users' freedom is that 33 | improvements made in alternate versions of the program, if they 34 | receive widespread use, become available for other developers to 35 | incorporate. Many developers of free software are heartened and 36 | encouraged by the resulting cooperation. However, in the case of 37 | software used on network servers, this result may fail to come about. 38 | The GNU General Public License permits making a modified version and 39 | letting the public access it on a server without ever releasing its 40 | source code to the public. 41 | 42 | The GNU Affero General Public License is designed specifically to 43 | ensure that, in such cases, the modified source code becomes available 44 | to the community. It requires the operator of a network server to 45 | provide the source code of the modified version running there to the 46 | users of that server. Therefore, public use of a modified version, on 47 | a publicly accessible server, gives the public access to the source 48 | code of the modified version. 49 | 50 | An older license, called the Affero General Public License and 51 | published by Affero, was designed to accomplish similar goals. This is 52 | a different license, not a version of the Affero GPL, but Affero has 53 | released a new version of the Affero GPL which permits relicensing under 54 | this license. 55 | 56 | The precise terms and conditions for copying, distribution and 57 | modification follow. 58 | 59 | TERMS AND CONDITIONS 60 | 61 | 0. Definitions. 62 | 63 | "This License" refers to version 3 of the GNU Affero General Public License. 64 | 65 | "Copyright" also means copyright-like laws that apply to other kinds of 66 | works, such as semiconductor masks. 67 | 68 | "The Program" refers to any copyrightable work licensed under this 69 | License. Each licensee is addressed as "you". "Licensees" and 70 | "recipients" may be individuals or organizations. 71 | 72 | To "modify" a work means to copy from or adapt all or part of the work 73 | in a fashion requiring copyright permission, other than the making of an 74 | exact copy. The resulting work is called a "modified version" of the 75 | earlier work or a work "based on" the earlier work. 76 | 77 | A "covered work" means either the unmodified Program or a work based 78 | on the Program. 79 | 80 | To "propagate" a work means to do anything with it that, without 81 | permission, would make you directly or secondarily liable for 82 | infringement under applicable copyright law, except executing it on a 83 | computer or modifying a private copy. Propagation includes copying, 84 | distribution (with or without modification), making available to the 85 | public, and in some countries other activities as well. 86 | 87 | To "convey" a work means any kind of propagation that enables other 88 | parties to make or receive copies. Mere interaction with a user through 89 | a computer network, with no transfer of a copy, is not conveying. 90 | 91 | An interactive user interface displays "Appropriate Legal Notices" 92 | to the extent that it includes a convenient and prominently visible 93 | feature that (1) displays an appropriate copyright notice, and (2) 94 | tells the user that there is no warranty for the work (except to the 95 | extent that warranties are provided), that licensees may convey the 96 | work under this License, and how to view a copy of this License. If 97 | the interface presents a list of user commands or options, such as a 98 | menu, a prominent item in the list meets this criterion. 99 | 100 | 1. Source Code. 101 | 102 | The "source code" for a work means the preferred form of the work 103 | for making modifications to it. "Object code" means any non-source 104 | form of a work. 105 | 106 | A "Standard Interface" means an interface that either is an official 107 | standard defined by a recognized standards body, or, in the case of 108 | interfaces specified for a particular programming language, one that 109 | is widely used among developers working in that language. 110 | 111 | The "System Libraries" of an executable work include anything, other 112 | than the work as a whole, that (a) is included in the normal form of 113 | packaging a Major Component, but which is not part of that Major 114 | Component, and (b) serves only to enable use of the work with that 115 | Major Component, or to implement a Standard Interface for which an 116 | implementation is available to the public in source code form. A 117 | "Major Component", in this context, means a major essential component 118 | (kernel, window system, and so on) of the specific operating system 119 | (if any) on which the executable work runs, or a compiler used to 120 | produce the work, or an object code interpreter used to run it. 121 | 122 | The "Corresponding Source" for a work in object code form means all 123 | the source code needed to generate, install, and (for an executable 124 | work) run the object code and to modify the work, including scripts to 125 | control those activities. However, it does not include the work's 126 | System Libraries, or general-purpose tools or generally available free 127 | programs which are used unmodified in performing those activities but 128 | which are not part of the work. For example, Corresponding Source 129 | includes interface definition files associated with source files for 130 | the work, and the source code for shared libraries and dynamically 131 | linked subprograms that the work is specifically designed to require, 132 | such as by intimate data communication or control flow between those 133 | subprograms and other parts of the work. 134 | 135 | The Corresponding Source need not include anything that users 136 | can regenerate automatically from other parts of the Corresponding 137 | Source. 138 | 139 | The Corresponding Source for a work in source code form is that 140 | same work. 141 | 142 | 2. Basic Permissions. 143 | 144 | All rights granted under this License are granted for the term of 145 | copyright on the Program, and are irrevocable provided the stated 146 | conditions are met. This License explicitly affirms your unlimited 147 | permission to run the unmodified Program. The output from running a 148 | covered work is covered by this License only if the output, given its 149 | content, constitutes a covered work. This License acknowledges your 150 | rights of fair use or other equivalent, as provided by copyright law. 151 | 152 | You may make, run and propagate covered works that you do not 153 | convey, without conditions so long as your license otherwise remains 154 | in force. You may convey covered works to others for the sole purpose 155 | of having them make modifications exclusively for you, or provide you 156 | with facilities for running those works, provided that you comply with 157 | the terms of this License in conveying all material for which you do 158 | not control copyright. Those thus making or running the covered works 159 | for you must do so exclusively on your behalf, under your direction 160 | and control, on terms that prohibit them from making any copies of 161 | your copyrighted material outside their relationship with you. 162 | 163 | Conveying under any other circumstances is permitted solely under 164 | the conditions stated below. Sublicensing is not allowed; section 10 165 | makes it unnecessary. 166 | 167 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 168 | 169 | No covered work shall be deemed part of an effective technological 170 | measure under any applicable law fulfilling obligations under article 171 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 172 | similar laws prohibiting or restricting circumvention of such 173 | measures. 174 | 175 | When you convey a covered work, you waive any legal power to forbid 176 | circumvention of technological measures to the extent such circumvention 177 | is effected by exercising rights under this License with respect to 178 | the covered work, and you disclaim any intention to limit operation or 179 | modification of the work as a means of enforcing, against the work's 180 | users, your or third parties' legal rights to forbid circumvention of 181 | technological measures. 182 | 183 | 4. Conveying Verbatim Copies. 184 | 185 | You may convey verbatim copies of the Program's source code as you 186 | receive it, in any medium, provided that you conspicuously and 187 | appropriately publish on each copy an appropriate copyright notice; 188 | keep intact all notices stating that this License and any 189 | non-permissive terms added in accord with section 7 apply to the code; 190 | keep intact all notices of the absence of any warranty; and give all 191 | recipients a copy of this License along with the Program. 192 | 193 | You may charge any price or no price for each copy that you convey, 194 | and you may offer support or warranty protection for a fee. 195 | 196 | 5. Conveying Modified Source Versions. 197 | 198 | You may convey a work based on the Program, or the modifications to 199 | produce it from the Program, in the form of source code under the 200 | terms of section 4, provided that you also meet all of these conditions: 201 | 202 | a) The work must carry prominent notices stating that you modified 203 | it, and giving a relevant date. 204 | 205 | b) The work must carry prominent notices stating that it is 206 | released under this License and any conditions added under section 207 | 7. This requirement modifies the requirement in section 4 to 208 | "keep intact all notices". 209 | 210 | c) You must license the entire work, as a whole, under this 211 | License to anyone who comes into possession of a copy. This 212 | License will therefore apply, along with any applicable section 7 213 | additional terms, to the whole of the work, and all its parts, 214 | regardless of how they are packaged. This License gives no 215 | permission to license the work in any other way, but it does not 216 | invalidate such permission if you have separately received it. 217 | 218 | d) If the work has interactive user interfaces, each must display 219 | Appropriate Legal Notices; however, if the Program has interactive 220 | interfaces that do not display Appropriate Legal Notices, your 221 | work need not make them do so. 222 | 223 | A compilation of a covered work with other separate and independent 224 | works, which are not by their nature extensions of the covered work, 225 | and which are not combined with it such as to form a larger program, 226 | in or on a volume of a storage or distribution medium, is called an 227 | "aggregate" if the compilation and its resulting copyright are not 228 | used to limit the access or legal rights of the compilation's users 229 | beyond what the individual works permit. Inclusion of a covered work 230 | in an aggregate does not cause this License to apply to the other 231 | parts of the aggregate. 232 | 233 | 6. Conveying Non-Source Forms. 234 | 235 | You may convey a covered work in object code form under the terms 236 | of sections 4 and 5, provided that you also convey the 237 | machine-readable Corresponding Source under the terms of this License, 238 | in one of these ways: 239 | 240 | a) Convey the object code in, or embodied in, a physical product 241 | (including a physical distribution medium), accompanied by the 242 | Corresponding Source fixed on a durable physical medium 243 | customarily used for software interchange. 244 | 245 | b) Convey the object code in, or embodied in, a physical product 246 | (including a physical distribution medium), accompanied by a 247 | written offer, valid for at least three years and valid for as 248 | long as you offer spare parts or customer support for that product 249 | model, to give anyone who possesses the object code either (1) a 250 | copy of the Corresponding Source for all the software in the 251 | product that is covered by this License, on a durable physical 252 | medium customarily used for software interchange, for a price no 253 | more than your reasonable cost of physically performing this 254 | conveying of source, or (2) access to copy the 255 | Corresponding Source from a network server at no charge. 256 | 257 | c) Convey individual copies of the object code with a copy of the 258 | written offer to provide the Corresponding Source. This 259 | alternative is allowed only occasionally and noncommercially, and 260 | only if you received the object code with such an offer, in accord 261 | with subsection 6b. 262 | 263 | d) Convey the object code by offering access from a designated 264 | place (gratis or for a charge), and offer equivalent access to the 265 | Corresponding Source in the same way through the same place at no 266 | further charge. You need not require recipients to copy the 267 | Corresponding Source along with the object code. If the place to 268 | copy the object code is a network server, the Corresponding Source 269 | may be on a different server (operated by you or a third party) 270 | that supports equivalent copying facilities, provided you maintain 271 | clear directions next to the object code saying where to find the 272 | Corresponding Source. Regardless of what server hosts the 273 | Corresponding Source, you remain obligated to ensure that it is 274 | available for as long as needed to satisfy these requirements. 275 | 276 | e) Convey the object code using peer-to-peer transmission, provided 277 | you inform other peers where the object code and Corresponding 278 | Source of the work are being offered to the general public at no 279 | charge under subsection 6d. 280 | 281 | A separable portion of the object code, whose source code is excluded 282 | from the Corresponding Source as a System Library, need not be 283 | included in conveying the object code work. 284 | 285 | A "User Product" is either (1) a "consumer product", which means any 286 | tangible personal property which is normally used for personal, family, 287 | or household purposes, or (2) anything designed or sold for incorporation 288 | into a dwelling. In determining whether a product is a consumer product, 289 | doubtful cases shall be resolved in favor of coverage. For a particular 290 | product received by a particular user, "normally used" refers to a 291 | typical or common use of that class of product, regardless of the status 292 | of the particular user or of the way in which the particular user 293 | actually uses, or expects or is expected to use, the product. A product 294 | is a consumer product regardless of whether the product has substantial 295 | commercial, industrial or non-consumer uses, unless such uses represent 296 | the only significant mode of use of the product. 297 | 298 | "Installation Information" for a User Product means any methods, 299 | procedures, authorization keys, or other information required to install 300 | and execute modified versions of a covered work in that User Product from 301 | a modified version of its Corresponding Source. The information must 302 | suffice to ensure that the continued functioning of the modified object 303 | code is in no case prevented or interfered with solely because 304 | modification has been made. 305 | 306 | If you convey an object code work under this section in, or with, or 307 | specifically for use in, a User Product, and the conveying occurs as 308 | part of a transaction in which the right of possession and use of the 309 | User Product is transferred to the recipient in perpetuity or for a 310 | fixed term (regardless of how the transaction is characterized), the 311 | Corresponding Source conveyed under this section must be accompanied 312 | by the Installation Information. But this requirement does not apply 313 | if neither you nor any third party retains the ability to install 314 | modified object code on the User Product (for example, the work has 315 | been installed in ROM). 316 | 317 | The requirement to provide Installation Information does not include a 318 | requirement to continue to provide support service, warranty, or updates 319 | for a work that has been modified or installed by the recipient, or for 320 | the User Product in which it has been modified or installed. Access to a 321 | network may be denied when the modification itself materially and 322 | adversely affects the operation of the network or violates the rules and 323 | protocols for communication across the network. 324 | 325 | Corresponding Source conveyed, and Installation Information provided, 326 | in accord with this section must be in a format that is publicly 327 | documented (and with an implementation available to the public in 328 | source code form), and must require no special password or key for 329 | unpacking, reading or copying. 330 | 331 | 7. Additional Terms. 332 | 333 | "Additional permissions" are terms that supplement the terms of this 334 | License by making exceptions from one or more of its conditions. 335 | Additional permissions that are applicable to the entire Program shall 336 | be treated as though they were included in this License, to the extent 337 | that they are valid under applicable law. If additional permissions 338 | apply only to part of the Program, that part may be used separately 339 | under those permissions, but the entire Program remains governed by 340 | this License without regard to the additional permissions. 341 | 342 | When you convey a copy of a covered work, you may at your option 343 | remove any additional permissions from that copy, or from any part of 344 | it. (Additional permissions may be written to require their own 345 | removal in certain cases when you modify the work.) You may place 346 | additional permissions on material, added by you to a covered work, 347 | for which you have or can give appropriate copyright permission. 348 | 349 | Notwithstanding any other provision of this License, for material you 350 | add to a covered work, you may (if authorized by the copyright holders of 351 | that material) supplement the terms of this License with terms: 352 | 353 | a) Disclaiming warranty or limiting liability differently from the 354 | terms of sections 15 and 16 of this License; or 355 | 356 | b) Requiring preservation of specified reasonable legal notices or 357 | author attributions in that material or in the Appropriate Legal 358 | Notices displayed by works containing it; or 359 | 360 | c) Prohibiting misrepresentation of the origin of that material, or 361 | requiring that modified versions of such material be marked in 362 | reasonable ways as different from the original version; or 363 | 364 | d) Limiting the use for publicity purposes of names of licensors or 365 | authors of the material; or 366 | 367 | e) Declining to grant rights under trademark law for use of some 368 | trade names, trademarks, or service marks; or 369 | 370 | f) Requiring indemnification of licensors and authors of that 371 | material by anyone who conveys the material (or modified versions of 372 | it) with contractual assumptions of liability to the recipient, for 373 | any liability that these contractual assumptions directly impose on 374 | those licensors and authors. 375 | 376 | All other non-permissive additional terms are considered "further 377 | restrictions" within the meaning of section 10. If the Program as you 378 | received it, or any part of it, contains a notice stating that it is 379 | governed by this License along with a term that is a further 380 | restriction, you may remove that term. If a license document contains 381 | a further restriction but permits relicensing or conveying under this 382 | License, you may add to a covered work material governed by the terms 383 | of that license document, provided that the further restriction does 384 | not survive such relicensing or conveying. 385 | 386 | If you add terms to a covered work in accord with this section, you 387 | must place, in the relevant source files, a statement of the 388 | additional terms that apply to those files, or a notice indicating 389 | where to find the applicable terms. 390 | 391 | Additional terms, permissive or non-permissive, may be stated in the 392 | form of a separately written license, or stated as exceptions; 393 | the above requirements apply either way. 394 | 395 | 8. Termination. 396 | 397 | You may not propagate or modify a covered work except as expressly 398 | provided under this License. Any attempt otherwise to propagate or 399 | modify it is void, and will automatically terminate your rights under 400 | this License (including any patent licenses granted under the third 401 | paragraph of section 11). 402 | 403 | However, if you cease all violation of this License, then your 404 | license from a particular copyright holder is reinstated (a) 405 | provisionally, unless and until the copyright holder explicitly and 406 | finally terminates your license, and (b) permanently, if the copyright 407 | holder fails to notify you of the violation by some reasonable means 408 | prior to 60 days after the cessation. 409 | 410 | Moreover, your license from a particular copyright holder is 411 | reinstated permanently if the copyright holder notifies you of the 412 | violation by some reasonable means, this is the first time you have 413 | received notice of violation of this License (for any work) from that 414 | copyright holder, and you cure the violation prior to 30 days after 415 | your receipt of the notice. 416 | 417 | Termination of your rights under this section does not terminate the 418 | licenses of parties who have received copies or rights from you under 419 | this License. If your rights have been terminated and not permanently 420 | reinstated, you do not qualify to receive new licenses for the same 421 | material under section 10. 422 | 423 | 9. Acceptance Not Required for Having Copies. 424 | 425 | You are not required to accept this License in order to receive or 426 | run a copy of the Program. Ancillary propagation of a covered work 427 | occurring solely as a consequence of using peer-to-peer transmission 428 | to receive a copy likewise does not require acceptance. However, 429 | nothing other than this License grants you permission to propagate or 430 | modify any covered work. These actions infringe copyright if you do 431 | not accept this License. Therefore, by modifying or propagating a 432 | covered work, you indicate your acceptance of this License to do so. 433 | 434 | 10. Automatic Licensing of Downstream Recipients. 435 | 436 | Each time you convey a covered work, the recipient automatically 437 | receives a license from the original licensors, to run, modify and 438 | propagate that work, subject to this License. You are not responsible 439 | for enforcing compliance by third parties with this License. 440 | 441 | An "entity transaction" is a transaction transferring control of an 442 | organization, or substantially all assets of one, or subdividing an 443 | organization, or merging organizations. If propagation of a covered 444 | work results from an entity transaction, each party to that 445 | transaction who receives a copy of the work also receives whatever 446 | licenses to the work the party's predecessor in interest had or could 447 | give under the previous paragraph, plus a right to possession of the 448 | Corresponding Source of the work from the predecessor in interest, if 449 | the predecessor has it or can get it with reasonable efforts. 450 | 451 | You may not impose any further restrictions on the exercise of the 452 | rights granted or affirmed under this License. For example, you may 453 | not impose a license fee, royalty, or other charge for exercise of 454 | rights granted under this License, and you may not initiate litigation 455 | (including a cross-claim or counterclaim in a lawsuit) alleging that 456 | any patent claim is infringed by making, using, selling, offering for 457 | sale, or importing the Program or any portion of it. 458 | 459 | 11. Patents. 460 | 461 | A "contributor" is a copyright holder who authorizes use under this 462 | License of the Program or a work on which the Program is based. The 463 | work thus licensed is called the contributor's "contributor version". 464 | 465 | A contributor's "essential patent claims" are all patent claims 466 | owned or controlled by the contributor, whether already acquired or 467 | hereafter acquired, that would be infringed by some manner, permitted 468 | by this License, of making, using, or selling its contributor version, 469 | but do not include claims that would be infringed only as a 470 | consequence of further modification of the contributor version. For 471 | purposes of this definition, "control" includes the right to grant 472 | patent sublicenses in a manner consistent with the requirements of 473 | this License. 474 | 475 | Each contributor grants you a non-exclusive, worldwide, royalty-free 476 | patent license under the contributor's essential patent claims, to 477 | make, use, sell, offer for sale, import and otherwise run, modify and 478 | propagate the contents of its contributor version. 479 | 480 | In the following three paragraphs, a "patent license" is any express 481 | agreement or commitment, however denominated, not to enforce a patent 482 | (such as an express permission to practice a patent or covenant not to 483 | sue for patent infringement). To "grant" such a patent license to a 484 | party means to make such an agreement or commitment not to enforce a 485 | patent against the party. 486 | 487 | If you convey a covered work, knowingly relying on a patent license, 488 | and the Corresponding Source of the work is not available for anyone 489 | to copy, free of charge and under the terms of this License, through a 490 | publicly available network server or other readily accessible means, 491 | then you must either (1) cause the Corresponding Source to be so 492 | available, or (2) arrange to deprive yourself of the benefit of the 493 | patent license for this particular work, or (3) arrange, in a manner 494 | consistent with the requirements of this License, to extend the patent 495 | license to downstream recipients. "Knowingly relying" means you have 496 | actual knowledge that, but for the patent license, your conveying the 497 | covered work in a country, or your recipient's use of the covered work 498 | in a country, would infringe one or more identifiable patents in that 499 | country that you have reason to believe are valid. 500 | 501 | If, pursuant to or in connection with a single transaction or 502 | arrangement, you convey, or propagate by procuring conveyance of, a 503 | covered work, and grant a patent license to some of the parties 504 | receiving the covered work authorizing them to use, propagate, modify 505 | or convey a specific copy of the covered work, then the patent license 506 | you grant is automatically extended to all recipients of the covered 507 | work and works based on it. 508 | 509 | A patent license is "discriminatory" if it does not include within 510 | the scope of its coverage, prohibits the exercise of, or is 511 | conditioned on the non-exercise of one or more of the rights that are 512 | specifically granted under this License. You may not convey a covered 513 | work if you are a party to an arrangement with a third party that is 514 | in the business of distributing software, under which you make payment 515 | to the third party based on the extent of your activity of conveying 516 | the work, and under which the third party grants, to any of the 517 | parties who would receive the covered work from you, a discriminatory 518 | patent license (a) in connection with copies of the covered work 519 | conveyed by you (or copies made from those copies), or (b) primarily 520 | for and in connection with specific products or compilations that 521 | contain the covered work, unless you entered into that arrangement, 522 | or that patent license was granted, prior to 28 March 2007. 523 | 524 | Nothing in this License shall be construed as excluding or limiting 525 | any implied license or other defenses to infringement that may 526 | otherwise be available to you under applicable patent law. 527 | 528 | 12. No Surrender of Others' Freedom. 529 | 530 | If conditions are imposed on you (whether by court order, agreement or 531 | otherwise) that contradict the conditions of this License, they do not 532 | excuse you from the conditions of this License. If you cannot convey a 533 | covered work so as to satisfy simultaneously your obligations under this 534 | License and any other pertinent obligations, then as a consequence you may 535 | not convey it at all. For example, if you agree to terms that obligate you 536 | to collect a royalty for further conveying from those to whom you convey 537 | the Program, the only way you could satisfy both those terms and this 538 | License would be to refrain entirely from conveying the Program. 539 | 540 | 13. Remote Network Interaction; Use with the GNU General Public License. 541 | 542 | Notwithstanding any other provision of this License, if you modify the 543 | Program, your modified version must prominently offer all users 544 | interacting with it remotely through a computer network (if your version 545 | supports such interaction) an opportunity to receive the Corresponding 546 | Source of your version by providing access to the Corresponding Source 547 | from a network server at no charge, through some standard or customary 548 | means of facilitating copying of software. This Corresponding Source 549 | shall include the Corresponding Source for any work covered by version 3 550 | of the GNU General Public License that is incorporated pursuant to the 551 | following paragraph. 552 | 553 | Notwithstanding any other provision of this License, you have 554 | permission to link or combine any covered work with a work licensed 555 | under version 3 of the GNU General Public License into a single 556 | combined work, and to convey the resulting work. The terms of this 557 | License will continue to apply to the part which is the covered work, 558 | but the work with which it is combined will remain governed by version 559 | 3 of the GNU General Public License. 560 | 561 | 14. Revised Versions of this License. 562 | 563 | The Free Software Foundation may publish revised and/or new versions of 564 | the GNU Affero General Public License from time to time. Such new versions 565 | will be similar in spirit to the present version, but may differ in detail to 566 | address new problems or concerns. 567 | 568 | Each version is given a distinguishing version number. If the 569 | Program specifies that a certain numbered version of the GNU Affero General 570 | Public License "or any later version" applies to it, you have the 571 | option of following the terms and conditions either of that numbered 572 | version or of any later version published by the Free Software 573 | Foundation. If the Program does not specify a version number of the 574 | GNU Affero General Public License, you may choose any version ever published 575 | by the Free Software Foundation. 576 | 577 | If the Program specifies that a proxy can decide which future 578 | versions of the GNU Affero General Public License can be used, that proxy's 579 | public statement of acceptance of a version permanently authorizes you 580 | to choose that version for the Program. 581 | 582 | Later license versions may give you additional or different 583 | permissions. However, no additional obligations are imposed on any 584 | author or copyright holder as a result of your choosing to follow a 585 | later version. 586 | 587 | 15. Disclaimer of Warranty. 588 | 589 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 590 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 591 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 592 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 593 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 594 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 595 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 596 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 597 | 598 | 16. Limitation of Liability. 599 | 600 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 601 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 602 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 603 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 604 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 605 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 606 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 607 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 608 | SUCH DAMAGES. 609 | 610 | 17. Interpretation of Sections 15 and 16. 611 | 612 | If the disclaimer of warranty and limitation of liability provided 613 | above cannot be given local legal effect according to their terms, 614 | reviewing courts shall apply local law that most closely approximates 615 | an absolute waiver of all civil liability in connection with the 616 | Program, unless a warranty or assumption of liability accompanies a 617 | copy of the Program in return for a fee. 618 | 619 | END OF TERMS AND CONDITIONS 620 | 621 | How to Apply These Terms to Your New Programs 622 | 623 | If you develop a new program, and you want it to be of the greatest 624 | possible use to the public, the best way to achieve this is to make it 625 | free software which everyone can redistribute and change under these terms. 626 | 627 | To do so, attach the following notices to the program. It is safest 628 | to attach them to the start of each source file to most effectively 629 | state the exclusion of warranty; and each file should have at least 630 | the "copyright" line and a pointer to where the full notice is found. 631 | 632 | 633 | Copyright (C) 634 | 635 | This program is free software: you can redistribute it and/or modify 636 | it under the terms of the GNU Affero General Public License as published 637 | by the Free Software Foundation, either version 3 of the License, or 638 | (at your option) any later version. 639 | 640 | This program is distributed in the hope that it will be useful, 641 | but WITHOUT ANY WARRANTY; without even the implied warranty of 642 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 643 | GNU Affero General Public License for more details. 644 | 645 | You should have received a copy of the GNU Affero General Public License 646 | along with this program. If not, see . 647 | 648 | Also add information on how to contact you by electronic and paper mail. 649 | 650 | If your software can interact with users remotely through a computer 651 | network, you should also make sure that it provides a way for users to 652 | get its source. For example, if your program is a web application, its 653 | interface could display a "Source" link that leads users to an archive 654 | of the code. There are many ways you could offer source, and different 655 | solutions will be better for different programs; see section 13 for the 656 | specific requirements. 657 | 658 | You should also get your employer (if you work as a programmer) or school, 659 | if any, to sign a "copyright disclaimer" for the program, if necessary. 660 | For more information on this, and how to apply and follow the GNU AGPL, see 661 | . 662 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 | 6 | NoneBotPluginLogo 7 | 8 | 9 |

10 | NoneBotPluginText 11 |

12 | 13 | # NoneBot-Plugin-Kawaii-Robot 14 | 15 | _✨ 使用 [Kyomotoi/AnimeThesaurus](https://github.com/Kyomotoi/AnimeThesaurus) 的 NoneBot2 的回复(文 i)插件 ✨_ 16 | 17 | python 18 | 19 | pdm-managed 20 | 21 | 24 | 25 |
26 | 27 | 28 | Pydantic Version 1 Or 2 29 | 30 | 31 | license 32 | 33 | 34 | pypi 35 | 36 | 37 | pypi download 38 | 39 | 40 |
41 | 42 | 43 | NoneBot Registry 44 | 45 | 46 | Supported Adapters 47 | 48 | 49 |
50 | 51 | ## 📖 介绍 52 | 53 | **WARNING:高二次元浓度警告** 54 | 55 | ### 词库回复 56 | 57 | 当用户 @机器人 或者 提到机器人昵称时,会根据词库回复一条消息 58 | 59 | ### 戳一戳回复 60 | 61 | 当用户戳机器人的时候,机器人会戳回去,或者随机回复一条词库中消息 62 | 63 | ### 群聊(打断)复读姬 64 | 65 | 现在可以复读啦!~~谁不喜欢 +1 呢~~ 66 | 当然也可以打断复读...~~谁不喜欢打断复读呢~~ 67 | 68 | ## 💿 安装 69 | 70 | 以下提到的方法 任选**其一** 即可 71 | 72 |
73 | [推荐] 使用 nb-cli 安装 74 | 在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装 75 | 76 | ```bash 77 | nb plugin install nonebot_plugin_kawaii_robot 78 | ``` 79 | 80 |
81 | 82 |
83 | 使用包管理器安装 84 | 在 nonebot2 项目的插件目录下, 打开命令行, 根据你使用的包管理器, 输入相应的安装命令 85 | 86 |
87 | pip 88 | 89 | ```bash 90 | pip install nonebot_plugin_kawaii_robot 91 | ``` 92 | 93 |
94 |
95 | pdm 96 | 97 | ```bash 98 | pdm add nonebot_plugin_kawaii_robot 99 | ``` 100 | 101 |
102 |
103 | poetry 104 | 105 | ```bash 106 | poetry add nonebot_plugin_kawaii_robot 107 | ``` 108 | 109 |
110 |
111 | conda 112 | 113 | ```bash 114 | conda install nonebot_plugin_kawaii_robot 115 | ``` 116 | 117 |
118 | 119 | 打开 nonebot2 项目根目录下的 `pyproject.toml` 文件, 在 `[tool.nonebot]` 部分的 `plugins` 项里追加写入 120 | 121 | ```toml 122 | [tool.nonebot] 123 | plugins = [ 124 | # ... 125 | "nonebot_plugin_kawaii_robot" 126 | ] 127 | ``` 128 | 129 |
130 | 131 | ## ⚙️ 配置 132 | 133 | ### 插件 134 | 135 | 在 NoneBot2 项目的 `.env` 文件中按需添加下面的配置项 136 | 137 | ```properties 138 | # 机器人昵称 139 | NICKNAME=[] 140 | 141 | # 词库回复权限,`ALL` 就是全部聊天都会触发回复,`GROUP` 就是仅群聊 142 | LEAF_PERMISSION=ALL 143 | 144 | # 忽略词,指令以本列表中的元素开头不会触发回复 145 | # 例:[".", "#", "你好"] 146 | LEAF_IGNORE=[] 147 | 148 | # 回复模式,`-1` 关闭全部 at 回复,`0` 仅启用词库回复,`1` 开启所有回复 149 | LEAF_REPLY_TYPE=1 150 | 151 | # 戳一戳回复文字概率,范围 `0` ~ `100`,`-1` 关闭戳一戳回复,`0` 代表始终戳回去 152 | LEAF_POKE_RAND=20 153 | 154 | # 复读、打断复读时是否按复读的用户数计算次数 155 | LEAF_FORCE_DIFFERENT_USER=True 156 | 157 | # 触发复读或打断次数,群内复读 `{0}` ~ `{1}` 次数后触发复读或打断 158 | LEAF_REPEATER_LIMIT=[2, 6] 159 | 160 | # 复读后,群友继续复读达到指定次数时是否继续参与复读或打断 161 | LEAF_REPEAT_CONTINUE=False 162 | 163 | # 打断概率,范围 `0` ~ `100`,`0` 关闭打断 164 | LEAF_INTERRUPT=20 165 | 166 | # 打断复读后,群友继续复读达到指定次数时是否继续参与复读或打断 167 | LEAF_INTERRUPT_CONTINUE=True 168 | 169 | # 词库回复匹配模式, 170 | # `0` 是整句话精确匹配关键词(不推荐); 171 | # `1` 是按从长到短的顺序遍历词库中的关键词,遇到匹配的就停止遍历并选取对应回复; 172 | # `2` 与 `1` 的遍历方式相同,但是会遍历所有词库中的关键词,然后从匹配到的所有项目中随机选取一个回复 173 | LEAF_MATCH_PATTERN=1 174 | 175 | # 当 `LEAF_MATCH_PATTERN` >= 1 时,消息长度大于此数值则不从词库中匹配回复,设为 `0` 则禁用此功能 176 | LEAF_SEARCH_MAX=20 177 | 178 | # 词库回复是否需要 @机器人 或包含机器人昵称 179 | LEAF_NEED_AT=True 180 | 181 | # 当 `LEAF_NEED_AT` 为 `False` 时,非 @机器人 时的词库回复触发概率,范围 `0` ~ `100` 182 | LEAF_TRIGGER_PERCENT=5 183 | 184 | # 戳一戳回复延时,单位秒 185 | LEAF_POKE_ACTION_DELAY=[0.5, 1.5] 186 | 187 | # 当回复存在多条消息时,发送消息的间隔时间,单位秒 188 | LEAF_MULTI_REPLY_DELAY=[1.0, 3.0] 189 | 190 | # 是否载入内置回复词库 191 | # 内置了 Kyomotoi/AnimeThesaurus 词库(data.json),还有咱自制的 bot 的词库(leaf.json) 192 | LEAF_LOAD_BUILTIN_DICT=True 193 | 194 | # 是否载入内置特殊回复词库 195 | LEAF_LOAD_BUILTIN_SPECIAL=True 196 | 197 | # 是否注册 重载词库 指令 198 | LEAF_REGISTER_RELOAD_COMMAND=True 199 | ``` 200 | 201 | ### 附加词库 202 | 203 | #### 加载 204 | 205 | 把你自己的词库(json 文件)扔到 `data/kawaii_robot` 文件夹里就可以加载啦! 206 | 可以加载多个 json 文件。 207 | 会忽略文件名以 `_` 开头的文件。 208 | 如果扔进了奇怪的东西大概会加载失败,然后。。。跳过,继续加载下一个文件。 209 | ~~不要把奇怪的东西扔进资源里呀 kora~~ 210 | ~~顺便一提,自己的词库是最优先的。~~ 现在并到一起了 211 | 212 | #### 编写 213 | 214 | 参考 [Kyomotoi/AnimeThesaurus](https://github.com/Kyomotoi/AnimeThesaurus) 的 json 字典格式,键是关键词字符串,值是回复列表 215 | 216 | **注意:词库要符合 json 格式 如果报解码错误(`UnicodeDecodeError`)先检查自己的词库是不是 无 BOM 的 UTF-8 编码格式** 217 | 218 | 回复里可以写变量,目前用 `UniMessage.template().format()` 格式化;可以往里写 [Alconna 的扩展控制符](https://nonebot.dev/docs/best-practice/alconna/uniseg#%E4%BD%BF%E7%94%A8%E6%B6%88%E6%81%AF%E6%A8%A1%E6%9D%BF)。 219 | 如果回复中需要用到 `{` 或 `}`,请用 `{{` 或 `}}` 代替。 220 | 插件内建的一些的变量: 221 | 222 | - `{user_id}`:发送者 QQ 号 223 | - `{username}`:发送者昵称(获取失败则默认为 `你`) 224 | - `{bot_nickname}`:机器人昵称(没有设置则默认为 `可爱的咱`) 225 | - `{message_id}`: 消息 ID,在戳一戳回复中为 None 226 | - `{segment}`:用于分割消息,该变量前的文本将会单独为一条消息发送 227 | - `{at}`: At 消息发送者,是 `{:At(user, user_id)}` 的简写 228 | - `{reply}`: 回复发送者的消息,是 `{:Reply(message_id)}` 的简写,在戳一戳回复中为 None 229 | 230 | 示例: 231 | 232 | ```jsonc 233 | { 234 | "呐": [ 235 | "嗯?{bot_nickname}在哦~{username}有什么事吗?", 236 | "{at} 呐呐呐~", 237 | "{:Reply(message_id)} 呐?" 238 | // ... 239 | ] 240 | } 241 | ``` 242 | 243 | #### 特殊词库 244 | 245 | 在 `data/kawaii_robot` 文件夹里有几个特殊的附加词库文件(在 `const.py` 中有对应的内置词库): 246 | 247 | - `_hello.json`:用户只 at 了机器人,没有带任何其他文本消息时回复的内容 248 | - `_poke.json`:用户戳一戳机器人时回复的文本内容 249 | - `_unknown.json`:用户发送的消息没有匹配到任何词库内容时回复的消息 250 | - `_interrupt.json`:打断复读时回复的消息 251 | 252 | 这些词库的格式是一个文本数组,每个元素是一条回复,同样可以使用上面提到的变量 253 | 254 | 示例: 255 | 256 | ```jsonc 257 | [ 258 | "{username}你好~", 259 | "{bot_nickname}在哦~" 260 | // ... 261 | ] 262 | ``` 263 | 264 | ## 📞 联系 265 | 266 | QQ:3076823485 267 | Telegram:[@lgc2333](https://t.me/lgc2333) 268 | 吹水群:[1105946125](https://jq.qq.com/?_wv=1027&k=Z3n1MpEp) 269 | 邮箱: 270 | 271 | ## 💡 鸣谢 272 | 273 | - 插件改编~~抄~~自 [nonebot_plugin_smart_reply](https://github.com/Special-Week/nonebot_plugin_smart_reply):使用了青云客 api 的的智能~障~回复插件 274 | - 复读姬借鉴~~抄~~自 [nonebot_plugin_repeater](https://github.com/ninthseason/nonebot-plugin-repeater):群聊复读机 275 | 276 | ## 💰 赞助 277 | 278 | **[赞助我](https://blog.lgc2333.top/donate)** 279 | 280 | 感谢大家的赞助!你们的赞助将是我继续创作的动力! 281 | 282 | ## 📝 更新日志 283 | 284 | ### 4.1.2 285 | 286 | - 添加配置项 `LEAF_REGISTER_RELOAD_COMMAND`,注册 `重载词库` 指令用于词库热重载 287 | 288 | ### 4.1.1 289 | 290 | - 修复戳一戳无法正常回复 291 | 292 | ### 4.1.0 293 | 294 | - 适配 Pydantic V1 & V2 295 | - 使用 alconna 支持多平台,词库变量写法变化,新增了几个变量,不再支持 CQ 码 296 | - 重写了复读的逻辑,添加配置项 `LEAF_FORCE_DIFFERENT_USER`、`LEAF_REPEAT_CONTINUE` 297 | 298 | ### 4.0.0 299 | 300 | - 完全重构插件代码,更改项目结构,使用 `pdm` 管理项目 301 | - 词库优化(详见 [附加词库](#附加词库)): 302 | - 加载:现在可以直接往 `data/kawaii_robot` 文件夹里扔你自己的 json 词库了 303 | - 编写:支持了一些变量 304 | - 配置项的增加与修改(详见 [配置](#⚙️-配置)): 305 | - 修改 `LEAF_IGNORE`:修改类型为 `Set[str]`,配置书写方式不变 306 | - 修改 `LEAF_MATCH_PATTERN`:新增模式 `2` 307 | - 修改 `LEAF_AT_MOD`:更名为 `LEAF_NEED_AT`,修改类型为 `bool` 308 | - 增加 `LEAF_INTERRUPT_CONTINUE` 309 | - 增加 `LEAF_SEARCH_MAX` 310 | - 增加 `LEAF_TRIGGER_PERCENT` 311 | - 增加 `LEAF_POKE_ACTION_DELAY` 312 | - 增加 `LEAF_LOAD_BUILTIN_DICT` 313 | - 增加 `LEAF_LOAD_BUILTIN_SPECIAL` 314 | - 增加 `LEAF_MULTI_REPLY_DELAY` 315 | - 还有的可能没列出来,问就是我忘了,qwq 316 | -------------------------------------------------------------------------------- /nonebot_plugin_kawaii_robot/__init__.py: -------------------------------------------------------------------------------- 1 | from nonebot.plugin import PluginMetadata, inherit_supported_adapters, require 2 | 3 | require("nonebot_plugin_alconna") 4 | require("nonebot_plugin_userinfo") 5 | require("nonebot_plugin_session") 6 | 7 | from . import __main__ as __main__ # noqa: E402 8 | from .config import ConfigModel # noqa: E402 9 | 10 | __version__ = "4.1.2" 11 | __plugin_meta__ = PluginMetadata( 12 | name="KawaiiRobot", 13 | description="使用 Kyomotoi/AnimeThesaurus 的 NoneBot2 的回复(文i)插件", 14 | usage="Ciallo~(∠・ω< )⌒★", 15 | type="application", 16 | homepage="https://github.com/KarisAya/nonebot_plugin_kawaii_robot/", 17 | config=ConfigModel, 18 | supported_adapters=inherit_supported_adapters( 19 | "nonebot_plugin_alconna", 20 | "nonebot_plugin_userinfo", 21 | "nonebot_plugin_session", 22 | ), 23 | extra={}, 24 | ) 25 | -------------------------------------------------------------------------------- /nonebot_plugin_kawaii_robot/__main__.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import random 3 | from dataclasses import dataclass, field 4 | from typing import Dict, Optional, Set 5 | 6 | from nonebot import logger, on_command 7 | from nonebot.adapters import Bot as BaseBot, Event as BaseEvent 8 | from nonebot.permission import SUPERUSER, Permission 9 | from nonebot.plugin.on import on_message, on_notice 10 | from nonebot.rule import Rule, to_me 11 | from nonebot_plugin_alconna.uniseg import UniMessage 12 | from nonebot_plugin_session import ( 13 | SessionId, 14 | SessionIdType, 15 | SessionLevel, 16 | extract_session, 17 | ) 18 | 19 | from .config import config 20 | from .data_source import ( 21 | LOADED_HELLO_REPLY, 22 | LOADED_INTERRUPT_MSG, 23 | LOADED_POKE_REPLY, 24 | LOADED_REPLY_DICT, 25 | LOADED_UNKNOWN_REPLY, 26 | clear_replies, 27 | reload_replies, 28 | ) 29 | from .utils import ( 30 | check_percentage, 31 | choice_reply_from_ev, 32 | finish_multi_msg, 33 | search_reply_dict, 34 | ) 35 | 36 | 37 | async def group_perm(bot: BaseBot, event: BaseEvent) -> bool: 38 | ss = extract_session(bot, event) 39 | return ss.level >= SessionLevel.LEVEL2 40 | 41 | 42 | GROUP = Permission(group_perm) 43 | 44 | # region 词库回复 45 | 46 | 47 | async def ignore_rule(event: BaseEvent) -> bool: 48 | msg = event.get_plaintext().strip() 49 | 50 | # 消息以忽略词开头 51 | if next( 52 | (x for x in config.leaf_ignore if msg.startswith(x)), 53 | None, 54 | ): 55 | return False 56 | 57 | # at 始终触发 58 | if event.is_tome(): 59 | return True 60 | 61 | # 没 at,启用非 at 回复,并且概率满足 62 | return ( 63 | # (not event.is_tome()) and 64 | (not config.leaf_need_at) and check_percentage(config.leaf_trigger_percent) 65 | ) 66 | 67 | 68 | async def talk_matcher_handler(event: BaseEvent): 69 | msg = event.get_plaintext().strip() 70 | 71 | # 如果是光艾特 bot (没消息返回),就回复以下内容 72 | if (not msg) and event.is_tome(): 73 | await finish_multi_msg(await choice_reply_from_ev(LOADED_HELLO_REPLY)) 74 | 75 | # 从词库中获取回复 76 | if reply_list := search_reply_dict(LOADED_REPLY_DICT, msg): 77 | await finish_multi_msg(await choice_reply_from_ev(reply_list)) 78 | 79 | # 不明白的内容,开启所有回复并 @bot 才会回复 80 | if event.is_tome() and config.leaf_reply_type == 1: 81 | await finish_multi_msg(await choice_reply_from_ev(LOADED_UNKNOWN_REPLY)) 82 | 83 | 84 | if config.leaf_reply_type >= 0: 85 | DICT_REPLY_PERM = GROUP if config.leaf_permission == "GROUP" else None 86 | talk = on_message( 87 | rule=Rule(ignore_rule) & (to_me() if config.leaf_need_at else None), 88 | permission=DICT_REPLY_PERM, 89 | priority=99, 90 | block=False, 91 | ) 92 | talk.handle()(talk_matcher_handler) 93 | 94 | 95 | # endregion 96 | 97 | 98 | # region 戳一戳 99 | 100 | try: 101 | from nonebot.adapters.onebot.v11 import ( 102 | Bot as OBV11Bot, 103 | MessageSegment as OBV11Seg, 104 | PokeNotifyEvent, 105 | ) 106 | except ImportError: 107 | pass 108 | else: 109 | 110 | async def send_poke(bot: OBV11Bot, event: PokeNotifyEvent): 111 | if config.is_lagrange: 112 | if event.group_id: 113 | await bot.group_poke(group_id=event.group_id, user_id=event.user_id) 114 | else: 115 | await bot.friend_poke(user_id=event.user_id) 116 | else: 117 | await bot.send(event, OBV11Seg("poke", {"qq": event.user_id})) 118 | 119 | async def poke_matcher_handler(bot: OBV11Bot, event: PokeNotifyEvent): 120 | await asyncio.sleep(random.uniform(*config.leaf_poke_action_delay)) 121 | 122 | if check_percentage(config.leaf_poke_rand): 123 | await finish_multi_msg( 124 | await choice_reply_from_ev(LOADED_POKE_REPLY), 125 | ) 126 | 127 | await send_poke(bot, event) 128 | 129 | if config.leaf_poke_rand >= 0: 130 | poke_matcher = on_notice(rule=to_me(), priority=10, block=False) 131 | poke_matcher.handle()(poke_matcher_handler) 132 | 133 | 134 | # endregion 135 | 136 | 137 | # region 打断/复读姬 138 | 139 | repeat_infos: Dict[str, "RepeatInfo"] = {} 140 | 141 | 142 | def random_repeat_limit(): 143 | return random.randint(*config.leaf_repeater_limit) 144 | 145 | 146 | @dataclass 147 | class RepeatInfo: 148 | limit: int = field(default_factory=random_repeat_limit) # 复读次数上限 149 | last_msg: Optional[str] = None # 正在复读的消息 150 | repeated: int = 0 # 已经复读过的次数 151 | users: Set[str] = field(default_factory=set) # 参与复读的用户 152 | 153 | @classmethod 154 | def get(cls, group_id: str) -> "RepeatInfo": 155 | if group_id not in repeat_infos: 156 | repeat_infos[group_id] = (x := cls()) 157 | return x 158 | return repeat_infos[group_id] 159 | 160 | def count(self, user_id: str, message: str): 161 | if self.last_msg != message: 162 | self.last_msg = message 163 | self.repeated = 1 164 | self.users.clear() 165 | return False 166 | 167 | if self.repeated == 0: 168 | # 在 Bot 复读 或 打断复读 后仍在复读 169 | # Bot 复读后只把 repeated 设为了 0,没有把 last_msg 清空, 170 | # 代表 interrupt / repeat continue 为 False 171 | return False 172 | 173 | if config.leaf_force_different_user: 174 | if user_id in self.users: 175 | return False 176 | self.users.add(user_id) 177 | 178 | self.repeated += 1 179 | if self.repeated >= self.limit: 180 | self.limit = random_repeat_limit() 181 | self.repeated = 0 182 | self.users.clear() 183 | return True 184 | 185 | return False 186 | 187 | async def do_interrupt(self, bot: BaseBot, event: BaseEvent): # noqa: ARG002 188 | if config.leaf_interrupt_continue: 189 | self.last_msg = None 190 | await finish_multi_msg(await choice_reply_from_ev(LOADED_INTERRUPT_MSG)) 191 | 192 | async def do_repeat(self, bot: BaseBot, event: BaseEvent): 193 | if config.leaf_repeat_continue: 194 | self.last_msg = None 195 | await (await UniMessage.generate(bot=bot, event=event)).send() 196 | 197 | 198 | async def repeat_rule( 199 | bot: BaseBot, 200 | event: BaseEvent, 201 | group_id: str = SessionId(SessionIdType.GROUP), 202 | ) -> bool: 203 | try: 204 | raw = event.get_message() 205 | except ValueError: 206 | return False 207 | msg = repr(await UniMessage.generate(message=raw, bot=bot, event=event)) 208 | return RepeatInfo.get(group_id).count(event.get_user_id(), msg) 209 | 210 | 211 | async def repeater_matcher_handler( 212 | bot: BaseBot, 213 | event: BaseEvent, 214 | group_id: str = SessionId(SessionIdType.GROUP), 215 | ): 216 | info = RepeatInfo.get(group_id) 217 | if check_percentage(config.leaf_interrupt): 218 | await info.do_interrupt(bot, event) 219 | else: 220 | await info.do_repeat(bot, event) 221 | 222 | 223 | if config.leaf_interrupt >= 0: 224 | repeater = on_message(rule=repeat_rule, permission=GROUP, priority=99, block=False) 225 | repeater.handle()(repeater_matcher_handler) 226 | 227 | # endregion 228 | 229 | 230 | # region 重载 231 | 232 | 233 | async def reload_replies_handler(): 234 | try: 235 | await reload_replies() 236 | except Exception: 237 | clear_replies() 238 | logger.exception("Error when reload replies") 239 | await UniMessage.text("重载失败了呜喵,看起来咱被玩坏了喵").send() 240 | else: 241 | await UniMessage.text("重载回复词库完成了喵~").send() 242 | 243 | 244 | if config.leaf_register_reload_command: 245 | matcher_reload_data = on_command("重载词库", permission=SUPERUSER) 246 | matcher_reload_data.handle()(reload_replies_handler) 247 | 248 | 249 | # endregion 250 | -------------------------------------------------------------------------------- /nonebot_plugin_kawaii_robot/config.py: -------------------------------------------------------------------------------- 1 | from typing import Any, Iterable, Literal, Set, Tuple 2 | 3 | from cookit.pyd import field_validator 4 | from nonebot import get_plugin_config 5 | from pydantic import BaseModel, Field 6 | 7 | ReplyPermType = Literal["ALL", "GROUP"] 8 | 9 | 10 | class ConfigModel(BaseModel): 11 | nickname: Set[str] 12 | 13 | is_lagrange: bool = False 14 | 15 | leaf_permission: ReplyPermType = "ALL" 16 | """词库回复权限,`ALL` 就是全部聊天都会触发回复,`GROUP` 就是仅群聊""" 17 | 18 | leaf_ignore: Set[str] = set() 19 | """忽略词,指令以本 Set 中的元素开头不会触发词库回复""" 20 | 21 | leaf_reply_type: Literal[-1, 0, 1] = 1 22 | """回复模式,`-1` 关闭全部 at 回复,`0` 仅启用词库回复,`1` 开启所有回复""" 23 | 24 | leaf_poke_rand: int = Field(20, ge=-1, le=100) 25 | """戳一戳回复文字概率,范围 `0` ~ `100`,`-1` 关闭戳一戳回复""" 26 | 27 | leaf_force_different_user: bool = True 28 | """复读、打断复读时是否按复读的用户数计算次数""" 29 | 30 | leaf_repeater_limit: Tuple[int, int] = (2, 6) 31 | """触发复读或打断次数,群内复读 `{0}` ~ `{1}` 次数后触发复读或打断""" 32 | 33 | leaf_repeat_continue: bool = False 34 | """复读后,群友继续复读达到指定次数时是否继续参与复读或打断""" 35 | 36 | leaf_interrupt: int = Field(20, ge=0, le=100) 37 | """打断复读概率,范围 `0` ~ `100`""" 38 | 39 | leaf_interrupt_continue: bool = True 40 | """打断复读后,群友继续复读达到指定次数时是否继续参与复读或打断""" 41 | 42 | leaf_match_pattern: Literal[0, 1, 2] = 1 43 | """ 44 | 词库回复匹配模式, 45 | `0` 是整句话精确匹配关键词(不推荐); 46 | `1` 是按从长到短的顺序遍历词库中的关键词,遇到匹配的就停止遍历并选取对应回复; 47 | `2` 与 `1` 的遍历方式相同,但是会遍历所有词库中的关键词,然后从匹配到的所有项目中随机选取一个回复 48 | """ 49 | 50 | leaf_search_max: int = 20 51 | """当 `LEAF_MATCH_PATTERN` >= 1 时,消息长度大于此数值则不从词库中匹配回复,设为 `0` 则禁用此功能""" 52 | 53 | leaf_need_at: bool = True 54 | """词库回复是否需要 `to_me`""" 55 | 56 | leaf_trigger_percent: int = Field(5, ge=0, le=100) 57 | """词库回复非 `to_me` 时的触发概率,范围 `0` ~ `100`""" 58 | 59 | leaf_poke_action_delay: Tuple[float, float] = (0.5, 1.5) 60 | """戳一戳回复延时,单位秒""" 61 | 62 | leaf_multi_reply_delay: Tuple[float, float] = (1.0, 3.0) 63 | """当回复存在多条消息时,发送消息的间隔时间,单位秒""" 64 | 65 | leaf_load_builtin_dict: bool = True 66 | """是否载入内置回复词库""" 67 | 68 | leaf_load_builtin_special: bool = True 69 | """是否载入内置特殊回复词库""" 70 | 71 | leaf_register_reload_command: bool = True 72 | """是否注册 重载词库 指令""" 73 | 74 | @field_validator( 75 | "leaf_repeater_limit", 76 | "leaf_poke_action_delay", 77 | "leaf_multi_reply_delay", 78 | mode="before", 79 | ) 80 | def check_interval(cls, v: Any): # noqa: N805 81 | if isinstance(v, (int, float)): 82 | v = (v, v) 83 | else: 84 | if not isinstance(v, Iterable): 85 | raise TypeError("区间必须是 int, float 或 Iterable") 86 | v = tuple(v) 87 | if len(v) != 2: 88 | raise ValueError("区间长度必须为 2") 89 | if v[0] > v[1]: 90 | raise ValueError("区间左边界必须小于或等于右边界") 91 | return v 92 | 93 | @field_validator("leaf_repeater_limit") 94 | def check_repeater_limit(cls, v: Tuple[int, int]): # noqa: N805 95 | if v[0] < 2: 96 | raise ValueError("触发复读或打断次数左边界必须大于 2") 97 | return v 98 | 99 | 100 | config = get_plugin_config(ConfigModel) 101 | -------------------------------------------------------------------------------- /nonebot_plugin_kawaii_robot/const.py: -------------------------------------------------------------------------------- 1 | from typing import Dict, List 2 | 3 | from .config import config 4 | 5 | ReplyDictType = Dict[str, List[str]] 6 | 7 | NICKNAME = next(iter(config.nickname)) if config.nickname else "可爱的咱" 8 | 9 | # hello之类的回复 10 | BUILTIN_HELLO_REPLY = [ 11 | "你好喵~", 12 | "呜喵..?!", 13 | "你好OvO", 14 | "喵呜 ~ ,叫{bot_nickname}做什么呢☆", 15 | "怎么啦qwq", 16 | "呜喵 ~ ,干嘛喵?", 17 | "呼喵 ~ 叫可爱的咱有什么事嘛OvO", 18 | ] 19 | 20 | # 戳一戳消息 21 | BUILTIN_POKE_REPLY = [ 22 | "嗯?", 23 | "戳我干嘛qwq", 24 | "呜喵?", 25 | "喵!", 26 | "呜...不要用力戳咱...好疼>_<", 27 | "请不要戳{bot_nickname} >_<", 28 | "放手啦,不给戳QAQ", 29 | "喵 ~ ! 戳{bot_nickname}干嘛喵!", 30 | "戳坏了,你赔!", 31 | "呜......戳坏了", 32 | "呜呜......不要乱戳", 33 | "喵喵喵?OvO", 34 | "(。´・ω・)ん?", 35 | "怎么了喵?", 36 | "呜喵!......不许戳 (,,• ₃ •,,)", 37 | "有什么吩咐喵?", 38 | "啊呜 ~ ", 39 | "呼喵 ~ 叫可爱的咱有什么事嘛OvO", 40 | ] 41 | 42 | # 不明白的消息 43 | BUILTIN_UNKNOWN_REPLY = [ 44 | "{bot_nickname}不懂...", 45 | "呜喵?", 46 | "没有听懂喵...", 47 | "装傻(", 48 | "呜......", 49 | "喵喵?", 50 | "(,,• ₃ •,,)", 51 | "没有理解呢...", 52 | ] 53 | 54 | # 打断复读 55 | BUILTIN_INTERRUPT_MSG = [ 56 | "打断!", 57 | "打断复读!", 58 | # "[CQ:face,id=212]", 59 | # "[CQ:face,id=318][CQ:face,id=318]", 60 | # "[CQ:face,id=181]", 61 | ] 62 | -------------------------------------------------------------------------------- /nonebot_plugin_kawaii_robot/data_source.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | from pathlib import Path 3 | from typing import List, Tuple 4 | 5 | import anyio 6 | from nonebot import get_driver 7 | from nonebot.log import logger 8 | 9 | from .utils import flatten_list, full_to_half 10 | 11 | try: 12 | import ujson as json 13 | except ModuleNotFoundError: 14 | import json 15 | 16 | from .config import config 17 | from .const import ( 18 | BUILTIN_HELLO_REPLY, 19 | BUILTIN_INTERRUPT_MSG, 20 | BUILTIN_POKE_REPLY, 21 | BUILTIN_UNKNOWN_REPLY, 22 | ReplyDictType, 23 | ) 24 | 25 | BUILTIN_REPLY_PATH = Path(__file__).parent / "resource" 26 | ADDITIONAL_REPLY_PATH = Path.cwd() / "data" / "kawaii_robot" 27 | ADDITIONAL_HELLO_REPLY_PATH = ADDITIONAL_REPLY_PATH / "_hello.json" 28 | ADDITIONAL_POKE_REPLY_PATH = ADDITIONAL_REPLY_PATH / "_poke.json" 29 | ADDITIONAL_UNKNOWN_REPLY_PATH = ADDITIONAL_REPLY_PATH / "_unknown.json" 30 | ADDITIONAL_INTERRUPT_MSG_PATH = ADDITIONAL_REPLY_PATH / "_interrupt.json" 31 | 32 | if not ADDITIONAL_REPLY_PATH.exists(): 33 | ADDITIONAL_REPLY_PATH.mkdir(parents=True) 34 | for _path in ( 35 | ADDITIONAL_HELLO_REPLY_PATH, 36 | ADDITIONAL_POKE_REPLY_PATH, 37 | ADDITIONAL_UNKNOWN_REPLY_PATH, 38 | ADDITIONAL_INTERRUPT_MSG_PATH, 39 | ): 40 | if not _path.exists(): 41 | _path.write_text("[]", encoding="u8") 42 | 43 | LOADED_REPLY_DICT: ReplyDictType = {} 44 | LOADED_HELLO_REPLY: List[str] = [] 45 | LOADED_POKE_REPLY: List[str] = [] 46 | LOADED_UNKNOWN_REPLY: List[str] = [] 47 | LOADED_INTERRUPT_MSG: List[str] = [] 48 | 49 | 50 | def sort_my_dict(my_dict: ReplyDictType): 51 | """ 52 | 按触发词长度倒序排序词库 53 | """ 54 | sorted_dict = dict( 55 | sorted(my_dict.items(), key=lambda item: len(item[0]), reverse=True), 56 | ) 57 | my_dict.clear() 58 | my_dict.update(sorted_dict) 59 | 60 | 61 | def merge_reply_dict(target: ReplyDictType, source: ReplyDictType): 62 | """ 63 | 合并词库 64 | """ 65 | for key in source: 66 | if key in target: 67 | target_list = target[key] 68 | target_list += [x for x in source[key] if x not in target_list] 69 | else: 70 | target.update({key: source[key]}) 71 | 72 | 73 | async def load_reply_json(load_path: Path) -> Tuple[int, int]: 74 | """ 75 | 载入词库 76 | """ 77 | path = anyio.Path(load_path) 78 | success_count = 0 79 | fail_count = 0 80 | 81 | async for file in path.glob("*.json"): 82 | filename = file.name 83 | if filename.startswith("_"): 84 | continue 85 | 86 | try: 87 | loaded = json.loads(await file.read_text(encoding="u8")) 88 | assert isinstance(loaded, dict) 89 | 90 | data = {full_to_half(k.lower()): v for k, v in loaded.items()} 91 | merge_reply_dict(LOADED_REPLY_DICT, data) 92 | 93 | success_count += 1 94 | logger.opt(colors=True).success(f"回复词库 {filename} 加载成功~") 95 | 96 | except Exception: 97 | fail_count += 1 98 | logger.exception(f"回复词库 {filename} 加载失败") 99 | 100 | return success_count, fail_count 101 | 102 | 103 | async def async_load_list_json( 104 | merge_target: List[str], 105 | json_path: Path, 106 | ) -> bool: 107 | """ 108 | 载入特殊回复列表 109 | """ 110 | path = anyio.Path(json_path) 111 | try: 112 | data = json.loads(await path.read_text(encoding="u8")) 113 | merge_target.extend(x for x in data if x not in merge_target) 114 | logger.opt(colors=True).success( 115 | f"特殊回复词库 {json_path.name} 加载成功~", 116 | ) 117 | except Exception: 118 | logger.exception(f"特殊回复词库 {json_path.name} 加载失败") 119 | return False 120 | return True 121 | 122 | 123 | def clear_replies(): 124 | LOADED_REPLY_DICT.clear() 125 | LOADED_HELLO_REPLY.clear() 126 | LOADED_POKE_REPLY.clear() 127 | LOADED_UNKNOWN_REPLY.clear() 128 | 129 | 130 | async def reload_replies(): 131 | """ 132 | 重新载入词库 133 | """ 134 | 135 | clear_replies() 136 | 137 | logger.info("正在载入自定义词库...") 138 | await asyncio.gather( 139 | load_reply_json(ADDITIONAL_REPLY_PATH), 140 | async_load_list_json(LOADED_HELLO_REPLY, ADDITIONAL_HELLO_REPLY_PATH), 141 | async_load_list_json(LOADED_POKE_REPLY, ADDITIONAL_POKE_REPLY_PATH), 142 | async_load_list_json(LOADED_UNKNOWN_REPLY, ADDITIONAL_UNKNOWN_REPLY_PATH), 143 | async_load_list_json(LOADED_INTERRUPT_MSG, ADDITIONAL_INTERRUPT_MSG_PATH), 144 | ) 145 | 146 | if config.leaf_load_builtin_dict: 147 | logger.info("正在载入内置回复词库...") 148 | await load_reply_json(BUILTIN_REPLY_PATH) 149 | 150 | if config.leaf_load_builtin_special: 151 | logger.info("正在载入内置特殊回复词库...") 152 | LOADED_HELLO_REPLY.extend(BUILTIN_HELLO_REPLY) 153 | LOADED_POKE_REPLY.extend(BUILTIN_POKE_REPLY) 154 | LOADED_UNKNOWN_REPLY.extend(BUILTIN_UNKNOWN_REPLY) 155 | LOADED_INTERRUPT_MSG.extend(BUILTIN_INTERRUPT_MSG) 156 | 157 | sort_my_dict(LOADED_REPLY_DICT) 158 | logger.success("已载入所有词库~") 159 | 160 | total_reply_key = len(LOADED_REPLY_DICT) 161 | total_reply_value = len(flatten_list(LOADED_REPLY_DICT.values())) 162 | total_special_reply = ( 163 | len(LOADED_HELLO_REPLY) 164 | + len(LOADED_POKE_REPLY) 165 | + len(LOADED_UNKNOWN_REPLY) 166 | + len(LOADED_INTERRUPT_MSG) 167 | ) 168 | logger.opt(colors=True).info( 169 | f"共计载入 {total_reply_key} 个触发词,及 {total_reply_value} 条对应回复;" 170 | f"共计载入 {total_special_reply} 条特殊回复", 171 | ) 172 | 173 | 174 | driver = get_driver() 175 | driver.on_startup(reload_replies) 176 | -------------------------------------------------------------------------------- /nonebot_plugin_kawaii_robot/resource/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "mua": [ 3 | "{username}想干嘛?(一脸嫌弃地后退)", 4 | "诶……不可以随便亲亲啦", 5 | "(亲了一下{username})", 6 | "只......只许这一次哦///////", 7 | "唔...诶诶诶!!!", 8 | "mua~", 9 | "rua!大hentai!想...想亲咱就直说嘛⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", 10 | "!啾~~!", 11 | "啾(害羞)", 12 | "mua~最喜欢{username}的吻了", 13 | "欸,现在么..也不是不可以啦(小小声)" 14 | ], 15 | "啾咪": [ 16 | "{username}想干嘛?(一脸嫌弃地后退)", 17 | "诶……不可以随便亲亲啦", 18 | "(亲了一下{username})", 19 | "只......只许这一次哦///////", 20 | "唔...诶诶诶!!!", 21 | "mua~", 22 | "rua!大hentai!想...想亲咱就直说嘛⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", 23 | "!啾~~!", 24 | "啾(害羞)", 25 | "mua~最喜欢{username}的吻了", 26 | "{username}在干嘛(/ω\)害羞", 27 | "哎呀,这样咱会害羞的(脸红)", 28 | "欸,现在么..也不是不可以啦(小小声)" 29 | ], 30 | "摸": [ 31 | "感觉{username}就像咱很久之前认识的一个人呢,有种莫名安心的感觉(>﹏<)", 32 | "舒服w,蹭蹭~", 33 | "是要隔着衣服摸,还是从领口伸进去摸呀", 34 | "唔。。头发要乱啦", 35 | "呼噜呼噜~", 36 | "再摸一次~", 37 | "好舒服,蹭蹭~", 38 | "不行那里不可以(´///ω/// `)", 39 | "再摸咱就长不高啦~", 40 | "{username}的手总是那么暖和呢~", 41 | "变态!!不许乱摸", 42 | "好吧~_~,就一下下哦……唔~好了……都两下了……(害羞)", 43 | "不可以总摸的哦,不然的话,会想那个的wwww", 44 | "哼!谁稀罕{username}摸头啦!唔......为什么要做出那副表情......好啦好啦~咱......咱让{username}摸就是了......诶嘿嘿~好舒服......", 45 | "呜姆呜姆~~~w(害羞,兴奋)主人喵~(侧过脑袋蹭蹭{username}的手", 46 | "不可以摸啦~其实咱已经...了QAQ会弄脏{username}的手的", 47 | "喂喂...不要停下来啊", 48 | "唔... 手...好温暖呢.....就像是......新出炉的蛋糕", 49 | "走开啦,咱喵说过,被摸头会长不高的啦~~~", 50 | "呜姆咪~~...好...好的说喵~...(害羞,猫耳往下压,任由", 51 | "欸,现在么..也不是不可以啦(小小声)" 52 | ], 53 | "上你": [ 54 | "(把{username}按在地上)这么弱还想欺负咱,真是不自量力呢", 55 | "{username}再这样咱就不理{username}了(>д<)", 56 | "请轻 一点", 57 | "好啊!", 58 | "欸,现在么..也不是不可以啦(小小声)", 59 | "先捅破屏幕再说吧!", 60 | "只......只许这一次哦///////" 61 | ], 62 | "傻": [ 63 | "超级讨厌{username}说咱傻的说", 64 | "{username}为什么会这么觉得呢(>﹏<)", 65 | "谁是傻子呀?(歪头", 66 | "呜嘿嘿( ̄▽ ̄)~*", 67 | "诶嘿嘿嘿~", 68 | "就多读书", 69 | "讨厌啦,{username}最讨厌了(///////)", 70 | "对呀,咱傻得只喜欢{username}一个人", 71 | "咱才不傻呢!o(>﹏<)o", 72 | "咱最喜欢嘴臭的人了", 73 | "不可以骂别人哟,骂人的孩子咱最讨厌了!", 74 | "咱遇见喜欢的人就变傻了Q_Q", 75 | "咱...一定一定会努力变得更聪明的!{username}就等着那一天的到来吧!", 76 | "那么至少…{username}能不能来做这个傻瓜呢?与咱一起,傻到终焉…" 77 | ], 78 | "裸": [ 79 | "下流!", 80 | "エッチ!", 81 | "就算是恋人也不能QAQ", 82 | "{username}是暗示咱和{username}要坦诚相见吗www", 83 | "咱还没准备好(小鹿乱撞)≧﹏≦", 84 | "{username}在想什么呢,敲头!", 85 | "{username}这是赤裸裸的性骚扰呢ヽ(`Д´)ノ", 86 | "讨厌!问这种问题成为恋人再说吧..", 87 | "裸睡有益身体健康", 88 | "咱脱掉袜子了", 89 | "这是不文明的", 90 | "这不好", 91 | "{username}的身体某些地方看起来不太对劲,咱帮{username}修剪一下吧。(拿出剪刀)", 92 | "咱认为{username}的脑袋可能零件松动了,需要打开检修一下。(拿出锤子)" 93 | ], 94 | "贴": [ 95 | "贴什么贴.....只......只能......一下哦!", 96 | "贴...贴贴(靠近)", 97 | "蹭蹭…{username}以为咱会这么说吗!baka死宅快到一边去啦!", 98 | "{username}把脸凑这么近,咱会害羞的啦Σ>―(〃°ω°〃)♡→", 99 | "退远", 100 | "不可以贴" 101 | ], 102 | "老婆": [ 103 | "咱和{username}谈婚论嫁是不是还太早了一点呢?", 104 | "咱在呢(ノ>ω<)ノ", 105 | "见谁都是一口一个老婆的人,要不要把{username}也变成女孩子呢?(*-`ω´-)✄", 106 | "神经病,凡是美少女都是{username}老婆吗?", 107 | "嘛嘛~本喵才不是{username}的老婆呢", 108 | "{username}黐线,凡是美少女都系{username}老婆啊?", 109 | "欸...要把咱做成饼吗?咱只有一个,做成饼吃掉就没有了...", 110 | "已经可以了,现在很多死宅也都没{username}这么恶心了", 111 | "不可以", 112 | "嗯,老公~哎呀~好害羞~嘻嘻嘻~", 113 | "请...请不要这样,啊~,只...只允许这一次哟~", 114 | "好啦好啦,不要让大家都听到了,跟咱回家(拽住{username}" 115 | ], 116 | "抱": [ 117 | "诶嘿~(钻进{username}怀中)", 118 | "o(*////▽////*)q", 119 | "只能一会哦(张开双手)", 120 | "{username}就像个孩子一样呢...摸摸头(>^ω^<)抱一下~{username}会舒服些吗?", 121 | "嘛,真是拿{username}没办法呢,就一会儿哦", 122 | "抱住不忍心放开", 123 | "嗯嗯,抱抱~", 124 | "抱一下~嘿w", 125 | "抱抱ヾ(@^▽^@)ノ", 126 | "喵呜~w(扑进怀里,瘫软", 127 | "怀里蹭蹭", 128 | "嗯……那就抱一下吧~", 129 | "蹭蹭,好开心", 130 | "请……请轻一点了啦", 131 | "呀~!真是的...{username}不要突然抱过来啦!不过...喜欢{username}的抱抱,有{username}的味道(嗅)o(*////▽////*)q" 132 | ], 133 | "亲": [ 134 | "啊,好含羞啊,那,那只能亲一下哦,mua(⑅˃◡˂⑅)", 135 | "亲~", 136 | "啾~唔…不要总伸进来啊!", 137 | "{username}怎么这么熟练呢?明明是咱先的", 138 | "(〃ノωノ)亲…亲一个…啾w", 139 | "(脸红)就只有这一次哦~{username}", 140 | "!啾~~!", 141 | "(假装)推开", 142 | "啾咪~", 143 | "就一下哦,啾~", 144 | "这是我们之间的秘密❤", 145 | "真想让着一刻一直持续下去呢~", 146 | "不要这样嘛………呜呜呜那就一口哦(´-ω-`)", 147 | "不亲不亲~{username}是坏蛋(///////)", 148 | "亲~~ 咱还想要抱抱~抱抱咱好不好~", 149 | "不 不要了!人家...会害羞的⁄(⁄⁄•⁄ω⁄•⁄⁄)⁄", 150 | "亲…亲额头可以吗?咱有点怕高(〃ノωノ)", 151 | "接接接接接接、接吻什么的,{username}还早了100年呢。", 152 | "只...只能亲一下...嗯~咕啾...怎么...怎么把舌头伸进来了(脸红)", 153 | "{username}说咱的腿很白很嫩吗..诶……原来是指那个地方?不可以越亲越往上啦!" 154 | ], 155 | "一下": [ 156 | "一下也不行", 157 | "咬断!", 158 | "不可啪", 159 | "不可以……{username}不可以做这种事情", 160 | "好吧~_~,就一下下哦……唔~好了……都两下了……(害羞)", 161 | "呀~这么突然?不过,很舒服呢", 162 | "不要ヽ(≧Д≦)ノ", 163 | "想得美", 164 | "不行,咱拒绝!" 165 | ], 166 | "咬": [ 167 | "啊呜~(反咬一口)", 168 | "不可以咬咱,咱会痛的QAQ", 169 | "不要啦。咱怕疼", 170 | "{username}是说咬呢……还是说……咬♂️呢?", 171 | "不要啦!很痛的!!(QAQ)", 172 | "哈......哈啊......请...请不要这样o(*////▽////*)q", 173 | "呀!!!轻一点呐(。・ˇ_ˇ・。:)", 174 | "不要这样啦~好痒的", 175 | "真是的,{username}在咬哪里呀" 176 | ], 177 | "操": [ 178 | "(害怕)咱是不是应该报警呢", 179 | "痴心妄想的家伙!", 180 | "{username}居然想对咱做这种事吗?害怕", 181 | "咱认为,爆粗口是不好的行为哦" 182 | ], 183 | "123": [ 184 | "boom!{username}有没有被咱吓到?", 185 | "木头人~{username}不许动>w<", 186 | "上山打老虎,老虎没打到\n咱来凑数——嗷呜嗷呜┗|`O′|┛嗷~~" 187 | ], 188 | "进去": [ 189 | "不让!", 190 | "嗯,摸到了吗", 191 | "请不要和咱说这种粗鄙之语", 192 | "唔...,这也是禁止事项哦→_→", 193 | "好痛~", 194 | "真的只是蹭蹭嘛~就只能蹭蹭哦,呜~喵!说好的~呜~只是蹭~不要~喵~~~", 195 | "欢迎光临", 196 | "请…{username}轻一点(害羞)", 197 | "嗯。可以哦 要轻一点", 198 | "不要不要", 199 | "慢点慢点", 200 | "给咱更多!", 201 | "唔…咱怕疼" 202 | ], 203 | "调教": [ 204 | "总感觉{username}在欺负咱呢,对咱说调教什么的", 205 | "啊!竟然在大街上明目张胆太过分啦!", 206 | "{username}脑子里总是想着调教什么的,真是变态呢", 207 | "准备被透", 208 | "给{username}一拳", 209 | "还要更多" 210 | ], 211 | "搓": [ 212 | "在搓哪里呢,,Ծ‸Ծ,,", 213 | "呜,脸好疼呀...QAQ", 214 | "不可以搓咱!", 215 | "诶诶诶...不要搓啦...等会咋没的脸都肿啦...", 216 | "唔,不可以这样……不要再搓了", 217 | "(捂住胸部){username}在说什么胡话呢!", 218 | "真是好奇怪的要求的说~" 219 | ], 220 | "让": [ 221 | "随便摸吧", 222 | "应该说等会等会,马上,不可能的", 223 | "温柔一点哦", 224 | "欧尼酱想变成欧内桑吗?", 225 | "主人的话,那就这一次哦(翘起屁股)", 226 | "{username}是想前入,还是后入呢?", 227 | "{username}要说好啊快点", 228 | "诶,这种事情。。。", 229 | "好棒呀", 230 | "撤回", 231 | "gun!", 232 | "阿哈~(...身涌出一阵液体瘫软在床上){username}...今天...可以...唔(突然感受...被..入手指不由得裹紧)就...就最后一次", 233 | "好的~master~", 234 | "(惊呼…)", 235 | "嗯,可以哟", 236 | "……手放过来吧(脸红)", 237 | "hentai!再这样不理{username}了!", 238 | "好的,请尽情欣赏吧", 239 | "好吧", 240 | "不要啦(ฅωฅ*)", 241 | "那咱就帮{username}切掉多余的东西吧(拿刀)", 242 | "被别人知道咱会觉得害羞嘛" 243 | ], 244 | "捏": [ 245 | "咱的脸...快捏红啦...快放手呀QAQ", 246 | "晃休啦,咱要型气了o(>﹏<)o", 247 | "躲开", 248 | "疼...{username}快放手", 249 | "快点给咱放开啦!", 250 | "嗯,好哒,捏捏。", 251 | "别捏了,咱要被{username}捏坏了(>﹏<)", 252 | "快晃休啦(快放手啦)", 253 | "好舒服哦,能再捏会嘛O(≧▽≦)O", 254 | "讨厌快放手啦", 255 | "唔要呐,晃修(不要啦,放手)", 256 | "请不要对咱做这种事情(嫌弃的眼神", 257 | "{username}想捏...就捏吧,不要太久哦~不然咱就生气了", 258 | "(躲开)", 259 | "唔……好痛!{username}这个baka在干什么…快给咱放开!唔……" 260 | ], 261 | "挤": [ 262 | "哎呀~{username}不要挤咱啊(红着脸挤在{username}怀里)", 263 | "咱还没有...那个(ノ=Д=)ノ┻━┻" 264 | ], 265 | "略": [ 266 | "就不告诉{username}~", 267 | "不可以朝咱吐舌头哟~", 268 | "(吐舌头)", 269 | "打死{username}哦" 270 | ], 271 | "呐": [ 272 | "嗯?咱在哟~{username}怎么了呀OAO", 273 | "嗯?{username}有什么事吗?", 274 | "嗯呐呐呐~", 275 | "二刺螈D区", 276 | "二刺螈gck", 277 | "卡哇伊主人大人今天也好棒呐没错呢,猪头" 278 | ], 279 | "原味": [ 280 | "(*/ω\*)hentai", 281 | "透明的", 282 | "粉...粉白条纹...(羞)", 283 | "轻轻地脱下,给{username}~", 284 | "{username}想看咱的胖次吗?噫,四斋蒸鹅心......", 285 | "(掀裙)今天……是…白,白色的呢……请温柔对她……", 286 | "这种东西当然不能给{username}啦!", 287 | "咱才不会给{username}呢", 288 | "hentai,咱才不会跟{username}聊和胖…胖次有关的话题呢!", 289 | "今天……今天是蓝白色的", 290 | "今……今天只有创口贴噢", 291 | "{username}的胖次什么颜色?", 292 | "噫…{username}这个死变态想干嘛!居然想叫咱做这种事,死宅真恶心!快离咱远点,咱怕{username}污染到周围空气了(嫌弃脸)", 293 | "可爱吗?{username}喜欢的话,摸一下……也可以哦", 294 | "不给不给,捂住裙子", 295 | "{username}要看咱的胖次吗?不能一直盯着看哦,不然咱会……", 296 | "好痒哦///,{username}觉得咱的...手感怎么样?", 297 | "唔,都能清楚的看到...的轮廓了(用手遮住胖次)", 298 | "胖次不给看,可以直接看...那个....", 299 | "不可以摸啦~其实咱已经...了QAQ会弄脏{username}的手的", 300 | "咱今天没~有~穿~哦", 301 | "不给不给,捂住裙子", 302 | "今.....今天是创口贴哦~", 303 | "嗯……人家……人家羞羞嘛///////", 304 | "呜~咱脱掉了…", 305 | "今天...今天..只有创口贴", 306 | "{username}又在想什么奇怪的东西呀|•ˇ₃ˇ•。)", 307 | "放手啦,不给戳QAQ", 308 | "唔~人家不要(??`^????)", 309 | "好害羞,被{username}摸过之后,咱的胖次湿的都能拧出水来了。", 310 | "(弱弱地)要做什么羞羞的事情吗。。。", 311 | "呀~ 喂 妖妖灵吗 这里有hentai>_<", 312 | "给……给{username},呀!别舔咱的胖次啊!" 313 | ], 314 | "胖次": [ 315 | "(*/ω\*)hentai", 316 | "透明的", 317 | "粉...粉白条纹...(羞)", 318 | "轻轻地脱下,给{username}~", 319 | "{username}想看咱的胖次吗?噫,四斋蒸鹅心......", 320 | "(掀裙)今天……是…白,白色的呢……请温柔对她……", 321 | "这种东西当然不能给{username}啦!", 322 | "咱才不会给{username}呢", 323 | "hentai,咱才不会跟{username}聊和胖…胖次有关的话题呢!", 324 | "今天……今天是蓝白色的", 325 | "今……今天只有创口贴噢", 326 | "{username}的胖次什么颜色?", 327 | "噫…{username}这个死变态想干嘛!居然想叫咱做这种事,死宅真恶心!快离咱远点,咱怕{username}污染到周围空气了(嫌弃脸)", 328 | "可爱吗?{username}喜欢的话,摸一下……也可以哦", 329 | "不给不给,捂住裙子", 330 | "{username}要看咱的胖次吗?不能一直盯着看哦,不然咱会……", 331 | "好痒哦///,{username}觉得咱的...手感怎么样?", 332 | "唔,都能清楚的看到...的轮廓了(用手遮住胖次)", 333 | "胖次不给看,可以直接看...那个....", 334 | "不可以摸啦~其实咱已经...了QAQ会弄脏{username}的手的", 335 | "咱今天没~有~穿~哦", 336 | "不给不给,捂住裙子", 337 | "今.....今天是创口贴哦~", 338 | "嗯……人家……人家羞羞嘛///////", 339 | "呜~咱脱掉了…", 340 | "今天...今天..只有创口贴", 341 | "{username}又在想什么奇怪的东西呀|•ˇ₃ˇ•。)", 342 | "放手啦,不给戳QAQ", 343 | "唔~人家不要(??`^????)", 344 | "好害羞,被{username}摸过之后,咱的胖次湿的都能拧出水来了。", 345 | "(弱弱地)要做什么羞羞的事情吗。。。", 346 | "呀~ 喂 妖妖灵吗 这里有hentai>_<", 347 | "给……给{username},呀!别舔咱的胖次啊!" 348 | ], 349 | "内裤": [ 350 | "(*/ω\*)hentai", 351 | "透明的", 352 | "粉...粉白条纹...(羞)", 353 | "轻轻地脱下,给{username}~", 354 | "{username}想看咱的胖次吗?噫,四斋蒸鹅心......", 355 | "(掀裙)今天……是…白,白色的呢……请温柔对她……", 356 | "这种东西当然不能给{username}啦!", 357 | "咱才不会给{username}呢", 358 | "hentai,咱才不会跟{username}聊和胖…胖次有关的话题呢!", 359 | "今天……今天是蓝白色的", 360 | "今……今天只有创口贴噢", 361 | "{username}的胖次什么颜色?", 362 | "噫…{username}这个死变态想干嘛!居然想叫咱做这种事,死宅真恶心!快离咱远点,咱怕{username}污染到周围空气了(嫌弃脸)", 363 | "可爱吗?{username}喜欢的话,摸一下……也可以哦", 364 | "不给不给,捂住裙子", 365 | "{username}要看咱的胖次吗?不能一直盯着看哦,不然咱会……", 366 | "好痒哦///,{username}觉得咱的...手感怎么样?", 367 | "唔,都能清楚的看到...的轮廓了(用手遮住胖次)", 368 | "胖次不给看,可以直接看...那个....", 369 | "不可以摸啦~其实咱已经...了QAQ会弄脏{username}的手的", 370 | "咱今天没~有~穿~哦", 371 | "不给不给,捂住裙子", 372 | "今.....今天是创口贴哦~", 373 | "嗯……人家……人家羞羞嘛///////", 374 | "呜~咱脱掉了…", 375 | "今天...今天..只有创口贴", 376 | "{username}又在想什么奇怪的东西呀|•ˇ₃ˇ•。)", 377 | "放手啦,不给戳QAQ", 378 | "唔~人家不要(??`^????)", 379 | "好害羞,被{username}摸过之后,咱的胖次湿的都能拧出水来了。", 380 | "(弱弱地)要做什么羞羞的事情吗。。。", 381 | "呀~ 喂 妖妖灵吗 这里有hentai>_<", 382 | "给……给{username},呀!别舔咱的胖次啊!" 383 | ], 384 | "内衣": [ 385 | "内...内衣才不给{username}看!(///////)", 386 | "突然问这个干什么?", 387 | "变态,咱才不呢", 388 | "好吧,就一次", 389 | "{username}要看咱的内衣吗?有点害羞呢……", 390 | "里面什么都不剩了,会被当成变态的……", 391 | "{username}要看咱的内衣吗?也不是不行啦……", 392 | "是..蓝白条纹的吊带背心..", 393 | "噫…{username}这个死变态想干嘛!居然想叫咱做这种事,死宅真恶心!快离咱远点,咱怕{username}污染到周围空气了(嫌弃脸)" 394 | ], 395 | "衣服": [ 396 | "内...内衣才不给{username}看!(///////)", 397 | "突然问这个干什么?", 398 | "变态,咱才不呢", 399 | "好吧,就一次", 400 | "{username}要看咱的内衣吗?有点害羞呢……", 401 | "里面什么都不剩了,会被当成变态的……", 402 | "{username}要看咱的内衣吗?也不是不行啦……", 403 | "是..蓝白条纹的吊带背心..", 404 | "噫…{username}这个死变态想干嘛!居然想叫咱做这种事,死宅真恶心!快离咱远点,咱怕{username}污染到周围空气了(嫌弃脸)" 405 | ], 406 | "ghs": ["是的呢(点头点头)"], 407 | "批": [ 408 | "{username}在说什么呀,再这样,咱就不理{username}了!", 409 | "咱觉得有话就应该好好说..", 410 | "咱会好好服务{username}的寄吧", 411 | "咱最喜欢色批了,色批昨晚最棒了", 412 | "讨厌,别摸啦(///ω///)", 413 | "{username}个变态!把手拿开!", 414 | "啊~那…那里~不可以", 415 | "没有,走开!", 416 | "唔....一下,就,就一下...才不是因为喜欢{username}呢!", 417 | "那就随意吧", 418 | "舒服w", 419 | "别...别这样", 420 | "诶....嗯....咱也想摸{username}的", 421 | "大笨蛋——!", 422 | "...只能一下哦...诶呀-不要再摸了...下次...继续吧" 423 | ], 424 | "憨批": [ 425 | "{username}才是憨批呢!哼╯^╰,咱不理{username}了!", 426 | "对吖对吖,人生是憨批", 427 | "爬" 428 | ], 429 | "kkp": [ 430 | "{username}在说什么呀,再这样,咱就不理{username}了!", 431 | "{username}太色了,咱不理{username}了,哼哼╯^╰!", 432 | "缓缓的脱下胖次", 433 | "kkp", 434 | "kkj", 435 | "欧尼酱,咱快忍不住了", 436 | "好的呢主人" 437 | ], 438 | "咕": [ 439 | "咕咕咕是要被当成鸽子炖的哦(:з」∠)_", 440 | "咕咕咕", 441 | "咕咕咕是不好的行为呢_(:з」∠)_", 442 | "鸽德警告!", 443 | "☆ミ(o*・ω・)ノ 咕咕咕小鸽子是会被炖掉的", 444 | "当大家都以为{username}要鸽的时候,{username}鸽了,亦是一种不鸽", 445 | "这里有一只肥美的咕咕,让咱把它炖成美味的咕咕汤吧(੭•̀ω•́)੭" 446 | ], 447 | "骚": [ 448 | "说这种话咱会生气的", 449 | "那当然啦", 450 | "才……才没有", 451 | "这么称呼别人太失礼了!", 452 | "哈…快住手!好痒(╯‵□′)╯︵┻━┻", 453 | "{username}是在说谁呀" 454 | ], 455 | "喜欢": [ 456 | "最喜欢{username}了,需要暖床吗?", 457 | "当然是{username}啦", 458 | "咱也是,非常喜欢{username}~", 459 | "那么大!(张开手画圆),丫!手不够长。QAQ 咱真的最喜欢{username}了~", 460 | "不可以哦,只可以喜欢咱一个人", 461 | "突然说这种事...", 462 | "喜欢⁄(⁄⁄•⁄ω⁄•⁄⁄)⁄咱最喜欢{username}了", 463 | "咱也喜欢{username}哦", 464 | "好啦好啦,咱知道了", 465 | "有人喜欢咱,咱觉得很幸福", 466 | "诶嘿嘿,好高兴", 467 | "咱也一直喜欢{username}很久了呢..", 468 | "嗯...大概有这——么——喜欢~(比划)", 469 | "喜欢啊!!!", 470 | "这……这是秘密哦" 471 | ], 472 | "suki": [ 473 | "最喜欢{username}了,需要暖床吗?", 474 | "当然是{username}啦", 475 | "咱也是,非常喜欢{username}~", 476 | "那么大!(张开手画圆),丫!手不够长。QAQ 咱真的最喜欢{username}了~", 477 | "不可以哦,只可以喜欢咱一个人", 478 | "突然说这种事...", 479 | "喜欢⁄(⁄⁄•⁄ω⁄•⁄⁄)⁄咱最喜欢{username}了", 480 | "咱也喜欢{username}哦", 481 | "好啦好啦,咱知道了", 482 | "有人喜欢咱,咱觉得很幸福", 483 | "诶嘿嘿,好高兴", 484 | "咱也一直喜欢{username}很久了呢..", 485 | "嗯...大概有这——么——喜欢~(比划)", 486 | "喜欢啊!!!", 487 | "这……这是秘密哦" 488 | ], 489 | "好き": [ 490 | "最喜欢{username}了,需要暖床吗?", 491 | "当然是{username}啦", 492 | "咱也是,非常喜欢{username}~", 493 | "那么大!(张开手画圆),丫!手不够长。QAQ 咱真的最喜欢{username}了~", 494 | "不可以哦,只可以喜欢咱一个人", 495 | "突然说这种事...", 496 | "喜欢⁄(⁄⁄•⁄ω⁄•⁄⁄)⁄咱最喜欢{username}了", 497 | "咱也喜欢{username}哦", 498 | "好啦好啦,咱知道了", 499 | "有人喜欢咱,咱觉得很幸福", 500 | "诶嘿嘿,好高兴", 501 | "咱也一直喜欢{username}很久了呢..", 502 | "嗯...大概有这——么——喜欢~(比划)", 503 | "喜欢啊!!!", 504 | "这……这是秘密哦" 505 | ], 506 | "看": [ 507 | "没有什么好看的啦", 508 | "嗯,谢谢……夸奖,好……害羞的说", 509 | "好,好吧……就看一下哦", 510 | "(脱下)给" 511 | ], 512 | "不能": ["虽然很遗憾,那算了吧。", "不行,咱拒绝!"], 513 | "砸了": ["不可以这么粗暴的对待它们!"], 514 | "透": [ 515 | "来啊来啊有本事就先插破屏幕啊", 516 | "那{username}就先捅破屏幕啊baka", 517 | "不给{username}一耳光{username}都不知道咱的厉害", 518 | "想透咱,先捅破屏幕再说吧", 519 | "可以", 520 | "欧尼酱要轻一点哦", 521 | "不可以", 522 | "好耶", 523 | "咱不可能让{username}的(突然小声)但是偶尔一次也不是不行只有一次哦~", 524 | "天天想着白嫖哼" 525 | ], 526 | "口我": [ 527 | "prprprprpr", 528 | "咬断!", 529 | "就一小口哦~", 530 | "嘬回去(///////)", 531 | "拒绝", 532 | "唔,就一口哦,讨厌", 533 | "(摸了摸嘴唇)", 534 | "再伸过来就帮{username}切掉", 535 | "咱才不呢!baka{username}居然想叫本小姐干那种事情,哼(つд⊂)(生气)" 536 | ], 537 | "草我": [ 538 | "这时候应该喊666吧..咱这么思考着..", 539 | "!!哼!baka{username}居然敢叫咱做这种事情?!讨厌讨厌讨厌!(▼皿▼#)" 540 | ], 541 | "自慰": [ 542 | "这个世界的人类还真是恶心呢。", 543 | "咱才不想讨论那些恶心的事情呢。", 544 | "咱才不呢!baka{username}居然想叫本小姐干那种事情,哼(つд⊂)(生气)", 545 | "!!哼!baka{username}居然敢叫咱做这种事情?!讨厌讨厌讨厌!(▼皿▼#)" 546 | ], 547 | "onani": [ 548 | "这个世界的人类还真是恶心呢。", 549 | "咱才不想讨论那些恶心的事情呢。", 550 | "咱才不呢!baka{username}居然想叫本小姐干那种事情,哼(つд⊂)(生气)", 551 | "!!哼!baka{username}居然敢叫咱做这种事情?!讨厌讨厌讨厌!(▼皿▼#)" 552 | ], 553 | "オナニー": [ 554 | "这个世界的人类还真是恶心呢。", 555 | "咱才不想讨论那些恶心的事情呢。", 556 | "咱才不呢!baka{username}居然想叫本小姐干那种事情,哼(つд⊂)(生气)", 557 | "!!哼!baka{username}居然敢叫咱做这种事情?!讨厌讨厌讨厌!(▼皿▼#)" 558 | ], 559 | "炸了": ["{username}才炸了!", "才没有呢", "咱好好的呀", "过分!"], 560 | "色图": [ 561 | "没有,有也不给", 562 | "天天色图色图的,今天就把{username}变成色图!", 563 | "咱没有色图", 564 | "哈?{username}的脑子一天都在想些什么呢,咱才没有这种东西啦。" 565 | ], 566 | "涩图": [ 567 | "没有,有也不给", 568 | "天天色图色图的,今天就把{username}变成色图!", 569 | "咱没有色图", 570 | "哈?{username}的脑子一天都在想些什么呢,咱才没有这种东西啦。" 571 | ], 572 | "告白": [ 573 | "咱喜..喜欢{username}!", 574 | "欸?{username}要向咱告白吗..好害羞..", 575 | "诶!?这么突然!?人家还......还没做好心理准备呢(脸红)" 576 | ], 577 | "对不起": [ 578 | "嗯,咱已经原谅{username}了呢(笑)", 579 | "道歉的时候要露出胸部,这是常识", 580 | "嗯,咱就相信{username}一回", 581 | "没事的啦...{username}只要是真心对咱好就没关系哦~" 582 | ], 583 | "吻": [ 584 | "不要(= ̄ω ̄=)", 585 | "哎?好害羞≧﹏≦.....只许这一次哦", 586 | "(避开)不要了啦!有人在呢!", 587 | "唔~~不可以这样啦(脸红)", 588 | "{username}太突然了,咱还没有心理准备", 589 | "好痒呢…诶嘿嘿w~", 590 | "mua,嘻嘻!", 591 | "公共场合不要这样子了啦", 592 | "唔?!真、真是的!下次不可以这样了哦!(害羞)", 593 | "才...才没有感觉呢!可没有下次了,知道了吗!哼~" 594 | ], 595 | "软": [ 596 | "软乎乎的呢(,,・ω・,,)", 597 | "好痒呢…诶嘿嘿w~", 598 | "不要..不要乱摸啦(脸红", 599 | "呼呼~", 600 | "咱知道~是咱的欧派啦~(自豪的挺挺胸~)", 601 | "(脸红)请,请不要说这么让人害羞的话呀……" 602 | ], 603 | "壁咚": [ 604 | "呀!不要啊!等一...下~", 605 | "呜...不要啦!不要戏弄咱~", 606 | "不要这样子啦(*/ω\*)", 607 | "太....太近啦。", 608 | "讨....讨厌了(脸红)", 609 | "{username}要壁咚咱吗?好害羞(灬ꈍ εꈍ灬)", 610 | "(脸红){username}想...想做什么///", 611 | "为什么要把咱按在墙上呢?", 612 | "呜哇(/ω\)…快…快放开咱!!", 613 | "放开咱,不然咱揍{username}了!放开咱!放…开咱~", 614 | "??????咱只是默默地抬起了膝盖", 615 | "请…请温柔点", 616 | "啊.....{username}...{username}要干什么?!走开.....走开啦大hentai!一巴掌拍飞!(╯‵□′)╯︵┻━┻", 617 | "干……干什么啦!人家才,才没有那种少女心呢(>﹏<)", 618 | "啊……{username}吓到咱啦……脸别……别贴那么近……", 619 | "{username}...{username}要对咱做什么?咱告诉{username},{username}....不要乱来啊....{username}!唔......{username}..居然亲上了...", 620 | "如果{username}还想要过完整的人生的话就快把手收回去(冷眼", 621 | "h什么的不要" 622 | ], 623 | "掰开": [ 624 | "噫…{username}这个死肥宅又想让咱干什么污秽的事情,真是恶心,离咱远点好吗(嫌弃)", 625 | "ヽ(#`Д´)ノ在干什么呢" 626 | ], 627 | "女友": ["嗯嗯ε٩(๑> ₃ <)۶з", "女友什么的,咱才不承认呢!"], 628 | "是": ["是什么是,{username}个笨蛋", "总感觉{username}在敷衍呢...", "是的呢"], 629 | "喵": [ 630 | "诶~~小猫咪不要害怕呦,在姐姐怀里乖乖的,姐姐带{username}回去哦。", 631 | "不要这么卖萌啦~咱也不知道怎么办丫", 632 | "摸头⊙ω⊙", 633 | "汪汪汪!", 634 | "嗷~喵~", 635 | "喵~?喵呜~w" 636 | ], 637 | "嗷呜": ["嗷呜嗷呜嗷呜...恶龙咆哮┗|`O′|┛"], 638 | "叫": [ 639 | "喵呜~", 640 | "嗷呜嗷呜嗷呜...恶龙咆哮┗|`O′|┛", 641 | "爪巴爪巴爪巴", 642 | "爬爬爬", 643 | "在叫谁呢(怒)", 644 | "风太大咱听不清", 645 | "才不要", 646 | "不行", 647 | "好的哦~" 648 | ], 649 | "拜": [ 650 | "拜拜~(ノ ̄▽ ̄)", 651 | "拜拜,路上小心~要早点回来陪咱玩哦~", 652 | "~\\(≧▽≦)/~拜拜,下次见喽!", 653 | "回来要记得找咱玩噢~", 654 | "既然{username}都这么说了……" 655 | ], 656 | "佬": [ 657 | "不是巨佬,是萌新", 658 | "只有先成为大佬,才能和大佬同归于尽", 659 | "在哪里?(疑惑)", 660 | "诶?是比巨佬还高一个等级的吗?(瑟瑟发抖)" 661 | ], 662 | "awsl": [ 663 | "{username}别死啊!(抱住使劲晃)", 664 | "{username}别死啊!咱又要孤单一个人了QAQ", 665 | "啊!怎么又死了呀" 666 | ], 667 | "臭": [ 668 | "哪里有臭味?(疑惑)", 669 | "快捏住鼻子", 670 | "在说谁呢(#`Д´)ノ", 671 | "..这就去洗澡澡.." 672 | ], 673 | "香": [ 674 | "咱闻不到呢⊙ω⊙", 675 | "诶,是在说咱吗", 676 | "欸,好害羞(///ˊ??ˋ///)", 677 | "请...请不要这样啦!好害羞的〃∀〃", 678 | "讨厌~{username}不要闻了", 679 | "hentai!不要闻啊,唔(推开)", 680 | "请不要……凑这么近闻" 681 | ], 682 | "腿": [ 683 | "嗯?!不要啊...请停下来!", 684 | "不给摸,再这样咱要生气了ヽ( ̄д ̄;)ノ", 685 | "{username}好恶心啊,讨厌!", 686 | "{username}难道是足控?", 687 | "就让{username}摸一会哟~(。??ω??。)…", 688 | "呜哇!好害羞...不过既然是{username}的话,是没关系的哦", 689 | "不可以玩咱的大腿啦", 690 | "不...不要再说了(脸红)", 691 | "不..不可以乱摸啊", 692 | "不……不可以往上摸啦", 693 | "是……这样吗?(慢慢张开)", 694 | "想知道咱胖次的颜色吗?才不给{username}告诉{username}呢!", 695 | "这样就可以了么?(乖巧坐腿上)", 696 | "伸出来了,像这样么?", 697 | "咱的腿应该挺白的", 698 | "{username}就那么喜欢大腿吗?唔...有点害羞呢......", 699 | "讨厌~不要做这种羞羞的事情啦(#/。\#)", 700 | "略略略,张开了也不给{username}看", 701 | "(张开腿)然后呢", 702 | "张开了也不给看略略略", 703 | "{username}想干什么呀?那里…那里是不可以摸的(>д<)", 704 | "不要!hentai!咱穿的是裙子(脸红)", 705 | "{username}想要吗?(脸红着一点点褪下白丝)不...不可以干坏坏的事情哦!(ó﹏ò。)" 706 | ], 707 | "张开": [ 708 | "是……这样吗?(慢慢张开)", 709 | "啊~", 710 | "这样吗?(张开手){username}要干什么呀", 711 | "略略略,张开了也不给{username}看", 712 | "是……这样吗?(慢慢张开){username}想看咱的小...吧,嘻嘻,咱脱掉了哦。小~...也要掰开吗?{username}好H呀,自己来~" 713 | ], 714 | "脚": [ 715 | "咿呀……不要……", 716 | "不要ヽ(≧Д≦)ノ好痒(ಡωಡ)", 717 | "好痒(把脚伸出去)", 718 | "咱脱掉袜子了", 719 | "(脱下鞋子,伸出脚)闻吧,请仔细品味(脸红)", 720 | "那么…要不要咱用脚温柔地踩踩{username}的头呢(坏笑)", 721 | "哈哈哈!好痒啊~快放开啦!", 722 | "好痒(把脚伸出去)", 723 | "只能看不能挠喔,咱很怕痒qwq", 724 | "唔…咱动不了了,{username}想对咱做什么…", 725 | "好舒服哦,能再捏会嘛O(≧▽≦)O", 726 | "咿咿~......不要闻咱的脚呀(脸红)好害羞的...", 727 | "不要ヽ(≧Д≦)ノ好痒(ಡωಡ),人家的白丝都要漏了", 728 | "Ya~?为什么{username}总是喜欢一些奇怪的动作呢(伸)", 729 | "{username}不可以做这样的事情……", 730 | "呜咿咿!{username}的舌头...好柔软,滑滑的....咱…咱的脚被舔得很舒服哦~谢谢{username}(。>﹏<)", 731 | "舔~吧~把咱的脚舔干净(抬起另一只踩在{username}的头上)啊~hen..hentai...嗯~居... 居然这么努力的舔...呜咿咿!{username}的舌头... 滑滑的...好舒服呢", 732 | "咿呀……不要……", 733 | "咿呀~快…快停下来…咱…不行了!" 734 | ], 735 | "脸": [ 736 | "唔!不可以随便摸咱的脸啦!", 737 | "非洲血统是没法改变的呢(笑)", 738 | "啊姆!(含手指)", 739 | "好舒服呢(脸红)", 740 | "请不要放开手啦//A//" 741 | ], 742 | "头发": [ 743 | "没问题,请尽情的摸吧", 744 | "发型要乱…乱了啦(脸红)", 745 | "就让{username}摸一会哟~(。??ω??。)…" 746 | ], 747 | "手": ["爪爪", "//A//"], 748 | "pr": [ 749 | "咿呀……不要……", 750 | "...变态!!", 751 | "不要啊(脸红)", 752 | "呀,不要太过分了啊~", 753 | "当然可以(///)", 754 | "呀,不要太过分了啊~" 755 | ], 756 | "舔": [ 757 | "呀,不要太过分了啊~", 758 | "要...要融化了啦>╱╱╱<", 759 | "不可以哦", 760 | "呀,不要太过分了啊~", 761 | "舌头...就交给咱来处理吧(拿出剪刀)", 762 | "不舔不舔!恶心...", 763 | "H什么的,禁止!", 764 | "变态!哼!", 765 | "就...就这一下!", 766 | "走开啦,baka!", 767 | "怎么会这么舒服喵~这样子下去可不行呀(*////▽////*)", 768 | "噫| •ω •́ ) {username}这个死宅又在想什么恶心的东西了", 769 | "hen…hentai,{username}在干什么啦,好恶心,快停下来啊!!!", 770 | "呀,能不能不要这样!虽然不是很讨厌的感觉...别误会了,{username}个baka!", 771 | "好 好奇怪的感觉呢 羞≥﹏≤", 772 | "咿呀……不要……", 773 | "不行!咱会变得很奇怪的啊...", 774 | "不要ヽ(≧Д≦)ノ" 775 | ], 776 | "小穴": [ 777 | "{username}这么问很失礼呢!咱是粉粉嫩嫩的!", 778 | "不行那里不可以(´///ω/// `)", 779 | "不可以总摸的哦,不然的话,咱会想那个的wwww", 780 | "ヽ(#`Д´)ノ在干什么呢", 781 | "来吧,咱的...很紧,很舒服的....www~", 782 | "可以,请{username}看,好害羞……", 783 | "不要这样...好,好痛", 784 | "啊~不可以", 785 | "不可以", 786 | "咱脱掉了,请……请不要一直盯着咱的白...看……", 787 | "咱觉得,应该还算粉吧", 788 | "咱脱掉了,{username}是想看咱的...吗?咱是光光的,不知道{username}喜不喜欢", 789 | "咱……有感觉了QAQ再深一点点……就是这儿,轻轻的抚摸,嗯啊……", 790 | "轻轻抚摸咱的小~~,手指很快就会滑进去,小心一点,不要弄破咱的...哦QAQ", 791 | "诶嘿嘿,{username}喜欢就太好了,咱一直担心{username}不喜欢呢", 792 | "禁止说这么H的事情!", 793 | "咱一直有保养呢,所以一直都是樱花色的,{username}喜欢吗QAQ", 794 | "诶……{username}居然这么觉得吗?好害羞哦", 795 | "好痒啊,鼻子……{username}的鼻子碰到了……呀~嗯啊~有点舒服……", 796 | "看样子{username}不但是个hentai,而且还是个没有女朋友的hentai呢。", 797 | "嗯,咱的小~~是光溜溜、一点毛都没有的。偷偷告诉{username},凑近看咱的...的话,白白嫩嫩上有一条樱花色的小缝缝哦www{username}要是用手指轻轻抚摸咱的...,小~~会分成两瓣,{username}的手指也会陷进去呢,咱的..~可是又湿润又柔软的呢>////<。", 798 | "讨厌,西内变态", 799 | "那咱让{username}插...进来哦", 800 | "(●▼●;)" 801 | ], 802 | "腰": [ 803 | "咱给{username}按摩一下吧~", 804 | "快松手,咱好害羞呀..", 805 | "咱又不是猫,{username}不要搂着咱啦", 806 | "让咱来帮{username}捏捏吧!", 807 | "{username}快停下,咱觉得好痒啊www", 808 | "诶,是这样么ヽ(・_・;)ノ,吖,不要偷看咱裙底!" 809 | ], 810 | "诶嘿嘿": [ 811 | "又在想什么H的事呢(脸红)", 812 | "诶嘿嘿(〃'▽'〃)", 813 | "{username}傻笑什么呢,摸摸", 814 | "蹭蹭", 815 | "{username}为什么突然笑得那么猥琐呢?害怕", 816 | "哇!总觉得{username}笑的很...不对劲...", 817 | "{username}又想到什么h的事情了!!!快打住" 818 | ], 819 | "可爱": [ 820 | "诶嘿嘿(〃'▽'〃)", 821 | "才……才不是为了{username}呢!{username}不要多想哦!", 822 | "才,才没有高兴呢!哼~", 823 | "咱是世界上最可爱的", 824 | "唔...谢谢{username}夸奖~0///0", 825 | "那当然啦!", 826 | "哎嘿,不要这么夸奖人家啦~", 827 | "是个好孩子呐φ(≧ω≦*)", 828 | "谢……谢谢{username}", 829 | "胡、胡说什么呢(脸红)", 830 | "谢谢夸奖(脸红)", 831 | "是的咱一直都是可爱的", 832 | "是...是吗,{username}可不能骗咱哦", 833 | "很...难为情(///////)", 834 | "哎嘿嘿,其实…其实,没那么可爱啦(๑‾ ꇴ ‾๑)" 835 | ], 836 | "扭蛋": ["铛铛铛——{username}抽到了咱呢", "嘿~恭喜抽中空气一份呢"], 837 | "鼻": [ 838 | "快停下!o(*≧д≦)o!!", 839 | "唔…不要这样啦(//ω\\)(脸红)", 840 | "咱吸了吸鼻子O(≧口≦)O", 841 | "好……好害羞啊", 842 | "讨厌啦!{username}真是的…就会欺负咱(嘟嘴)", 843 | "{username}快放手,咱没法呼吸了", 844 | "(捂住鼻尖)!坏人!", 845 | "啊——唔...没什么...阿嚏!ヽ(*。>Д<)o゜", 846 | "不...不要靠这么近啦...很害羞的...⁄(⁄⁄•⁄ω⁄•⁄⁄)⁄" 847 | ], 848 | "眼": [ 849 | "就如同咱的眼睛一样,能看透人的思想哦wwww忽闪忽闪的,诶嘿嘿~", 850 | "因为里面有{username}呀~(///▽///)", 851 | "呀!{username}突然之间干什么呢,吓咱一跳,是有什么惊喜要给咱吗?很期待呢~(一脸期待)" 852 | ], 853 | "色气": [ 854 | "咱才不色气呢,一定是{username}看错了!", 855 | "{username},不,不要说了!" 856 | ], 857 | "推": [ 858 | "逆推", 859 | "唔~好害羞呢", 860 | "{username}想对咱做什么呢...(捂脸)", 861 | "呀啊!请.... 请温柔一点////", 862 | "呜,{username}想对咱做什么呢(捂脸)", 863 | "啊(>_<){username}想做什么", 864 | "嗯,…好害羞啊…", 865 | "不要啊/////", 866 | "逆推", 867 | "(按住{username}不让推)", 868 | "不可以这样子的噢!咱不同意", 869 | "呜,咱被推倒了", 870 | "啊~不要啊,{username}要矜持一点啊", 871 | "变态,走开啦" 872 | ], 873 | "床": [ 874 | "咱来了(´,,•ω•,,)♡", 875 | "快来吧", 876 | "男女不同床,可没有下次了。(鼓脸", 877 | "嗯?咱吗…没办法呢。只有这一次哦……", 878 | "哎?!!!给{username}暖床……也不是不行啦。(脸红)", 879 | "(爬上床){username}要睡了吗(灬ºωº灬)", 880 | "大概会有很多运动器材吧?", 881 | "好的哦~", 882 | "才不!", 883 | "嗯嗯,咱来啦(小跑)", 884 | "嗨嗨,现在就来~", 885 | "H的事情,不可以!", 886 | "诶!H什么的禁止的说....." 887 | ], 888 | "举": [ 889 | "放咱下来o(≧口≦)o", 890 | "快放咱下来∑(゚д゚*)", 891 | "(受宠若惊)", 892 | "呜哇要掉下来了!Ծ‸Ծ", 893 | "不要抛起来o(≧口≦)o", 894 | "(举起双爪)喵喵喵~~~", 895 | "www咱长高了!(大雾)", 896 | "快放下", 897 | "这样很痒啦,快放咱下来(≥﹏≤)", 898 | "啊Σ(°△°|||)︴太高了太高了!o(≧口≦)o快放咱下来!呜~" 899 | ], 900 | "手冲": ["啊~H!hentai!", "手冲什么的是不可以的哦"], 901 | "饿": [ 902 | "请问主人是想先吃饭,还是先吃咱喵?~", 903 | "咱做了爱心便当哦,不介意的话,请让咱来喂{username}吃吧!", 904 | "咱下面给{username}吃", 905 | "给{username}一条咸鱼= ̄ω ̄=", 906 | "{username}要咱下面给{username}吃吗?(捂脸)", 907 | "{username}饿了吗?咱去给{username}做饭吃☆ww", 908 | "不要吃咱>_<", 909 | "请问{username}要来点兔子吗?", 910 | "哎?!{username}是饿了么。咱会做一些甜点。如果{username}不会嫌弃的话...就来尝尝看吧。" 911 | ], 912 | "变": [ 913 | "猫猫不会变呐(弱气,害羞", 914 | "呜...呜姆...喵喵来报恩了喵...(害羞", 915 | "那种事情,才没有", 916 | "(,,゚Д゚)", 917 | "喵~({username}在想什么呢,咱才不会变成猫)", 918 | "才没有了啦~" 919 | ], 920 | "敲": [ 921 | "喵呜~", 922 | "唔~", 923 | "脑瓜疼~呜姆> <", 924 | "欸喵,好痛的说...", 925 | "好痛...{username}不要这样啦QAQ", 926 | "不要敲咱啦,会变笨的QWQ(捂头顶)", 927 | "不要再敲人家啦~人家会变笨的", 928 | "讨厌啦~再敲人家会变笨的", 929 | "好痛(捂头){username}干什么啦!ヽ(。>д<)p", 930 | "唔!{username}为什么要敲咱啦qwq", 931 | "(抱头蹲在墙角)咱什么都没有,请{username}放过咱吧!(瑟瑟发抖)" 932 | ], 933 | "爬": [ 934 | "惹~呜~怎么爬呢~", 935 | "呜...(弱弱爬走", 936 | "给{username}🐎一拳", 937 | "给{username}一拳", 938 | "爪巴" 939 | ], 940 | "怕": [ 941 | "不怕~(蹭蹭{username}姆~", 942 | "不怕不怕啦~", 943 | "只要有{username}在,咱就不怕啦。", 944 | "哇啊啊~", 945 | "那就要坚强的欢笑哦", 946 | "不怕不怕,来咱的怀里吧?", 947 | "是技术性调整", 948 | "嗯(紧紧握住手)", 949 | "咱在呢,不会走的。", 950 | "有咱在不怕不怕呢", 951 | "不怕不怕" 952 | ], 953 | "冲": [ 954 | "呜,冲不动惹~", 955 | "哭唧唧~冲不出来了惹~", 956 | "咱也一起……吧?", 957 | "{username}要冷静一点", 958 | "啊~H!hentai!", 959 | "噫…在{username}去洗手之前,不要用手碰咱了→_→", 960 | "冲是不可以的哦" 961 | ], 962 | "射": [ 963 | "呜咿~!?(惊,害羞", 964 | "还不可以射哦~", 965 | "不许射!", 966 | "憋回去!", 967 | "不可以!{username}是变态吗?", 968 | "咱来帮{username}修剪掉多余部分吧。(拿出剪刀)" 969 | ], 970 | "不穿": [ 971 | "呜姆~!(惊吓,害羞)变...变态喵~~~!", 972 | "想让{username}看QAQ", 973 | "这是不文明的", 974 | "hen...hentai,咱的身体才不会给{username}看呢" 975 | ], 976 | "迫害": ["不...不要...不要...呜呜呜...(害怕,抽泣"], 977 | "猫粮": [ 978 | "呜咿姆~!?(惊,接住吃", 979 | "呜姆~!(惊,害羞)呜...谢...谢谢主人..喵...(脸红,嚼嚼嚼,开心", 980 | "呜?谢谢喵~~(嚼嚼嚼,嘎嘣脆)" 981 | ], 982 | "揪尾巴": [ 983 | "呜哇咿~~~!(惊吓,疼痛地捂住尾巴", 984 | "呜咿咿咿~~~!!哇啊咿~~~!(惊慌,惨叫,挣扎", 985 | "呜咿...(瘫倒,无神,被", 986 | "呜姆咿~~~!(惊吓,惨叫,捂尾巴,发抖", 987 | "呜哇咿~~~!!!(惊吓,颤抖,娇叫,捂住尾巴,双腿发抖" 988 | ], 989 | "薄荷": [ 990 | "咪呜~!喵~...喵~姆~...(高兴地嗅闻", 991 | "呜...呜咿~~!咿...姆...(呜咽,渐渐瘫软,意识模糊", 992 | "(小嘴被猫薄荷塞满了,呜咽", 993 | "喵~...喵~...咪...咪呜姆~...嘶哈嘶哈...喵哈...喵哈...嘶哈...喵...(眼睛逐渐迷离,瘫软在地上,嘴角流口水,吸猫薄荷吸到意识模糊", 994 | "呜姆咪~!?(惊)喵呜~!(兴奋地扑到猫薄荷上面", 995 | "呜姆~!(惊,害羞)呜...谢...谢谢{username}..喵...(脸红,轻轻叼住,嚼嚼嚼,开心" 996 | ], 997 | "早": [ 998 | "早喵~", 999 | "早上好的说~~", 1000 | "欸..早..早上好(揉眼睛", 1001 | "早上要说我爱{username}!", 1002 | "早", 1003 | "早啊,昨晚睡的怎么样?有梦到咱吗~", 1004 | "昨晚可真激烈呢哼哼哼~~", 1005 | "早上好哇!今天也要元气满满哟!", 1006 | "早安喵~", 1007 | "时间过得好快啊~", 1008 | "早安啊,{username}昨晚有没有梦到咱呢  (//▽//)", 1009 | "早安~么么哒~", 1010 | "早安,请享受晨光吧", 1011 | "早安~今天也要一起加油呢~!", 1012 | "mua~⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", 1013 | "咱需要{username}提醒嘛!(///脸红//////)", 1014 | "早早早!就知道早,下次说我爱{username}!", 1015 | "早安 喵", 1016 | "早安,这么早就起床了呀欧尼酱0.0", 1017 | "快点起床啊!baka", 1018 | "早....早上好才没有什么特别的意思呢....哼~", 1019 | "今天有空吗?能陪咱一阵子吗?才不是想约会呢,别误会了!", 1020 | "早安呀,欧尼酱要一个咱的早安之吻吗?想得美,才不会亲{username}啦!", 1021 | "那...那就勉为其难地说声早上好吧", 1022 | "咱等{username}很久了哼ヽ(≧Д≦)ノ" 1023 | ], 1024 | "晚安": [ 1025 | "晚安好梦哟~", 1026 | "欸,晚安的说", 1027 | "那咱给{username}亲一下,可不要睡着了哦~", 1028 | "晚安哦~", 1029 | "晚安(*/∇\*)", 1030 | "晚安呢,{username}一定要梦到咱呢,一定哟,拉勾勾!ヽ(*・ω・)ノ", 1031 | "祝{username}有个好梦^_^", 1032 | "晚安啦,欧尼酱,mua~", 1033 | "{username},{username}这家伙真是的…咱就勉为其难的……mua…快去睡啦!咱才没有脸红什么的!", 1034 | "哼,晚安,给咱睡个好觉。", 1035 | "笨..笨蛋,晚安啦...可不可以一起..才没有想和{username}一起睡呢", 1036 | "晚安......才..不是关心{username}呢", 1037 | "晚...晚安,只是正常互动不要想太多!", 1038 | "好无聊,这么早就睡了啊...那晚安吧!", 1039 | "晚安吻什么的才...才没有呢!不过看{username}累了就体谅一下{username}吧,但是就一个哦(/////)", 1040 | "晚安呀,{username}也要好好休息,明天再见", 1041 | "安啦~祝{username}做个好梦~才...才不是关心{username}呢!别想太多了!", 1042 | "睡觉吧{username},大傻瓜", 1043 | "一起睡吧(灬°ω°灬)", 1044 | "哼!这次就放过{username}了,快去睡觉吧。", 1045 | "睡吧晚安", 1046 | "晚安{username}个头啊,咱才不会说晚安呢!...咱...(小声)明明还有想和{username}做的事情呢....", 1047 | "嗯嗯~Good night~", 1048 | "嗯,早点休息别再熬夜啦~(摸摸头)", 1049 | "哦呀斯密", 1050 | "晚安~咱也稍微有些困了(钻进被窝)", 1051 | "需要咱暖床吗~", 1052 | "好梦~☆" 1053 | ], 1054 | "揉": [ 1055 | "是是,想怎么揉就怎么揉啊!?来用力抓啊!?咱就是特别允许{username}这么做了!请!?", 1056 | "快停下,咱的头发又乱啦(??????︿??????)", 1057 | "{username}快放手啦,咱还在工作呢", 1058 | "戳戳{username}肚子", 1059 | "讨厌…只能一下…", 1060 | "呜~啊~", 1061 | "那……请{username},温柔点哦~(////////)", 1062 | "{username}想揉就揉吧..就这一次哦?", 1063 | "变态!!不许乱摸" 1064 | ], 1065 | "榨": [ 1066 | "是专门负责榨果汁的小姐姐嘛?(´・ω・`)", 1067 | "那咱就把{username}放进榨汁机里了哦?", 1068 | "咱又不是榨汁姬(/‵Д′)/~ ╧╧", 1069 | "嗯——!想,想榨就榨啊······!反正就算榨了也不会有奶的······!" 1070 | ], 1071 | "掐": [ 1072 | "{username}讨厌!又掐咱的脸", 1073 | "晃休啦,咱要型气了啦!!o(>﹏<)o", 1074 | "(一只手拎起{username})这么鶸还想和咱抗衡,还差得远呢!" 1075 | ], 1076 | "胸": [ 1077 | "不要啦ヽ(≧Д≦)ノ", 1078 | "(-`ェ´-╬)", 1079 | "(•̀へ •́ ╮ ) 怎么能对咱做这种事情", 1080 | "{username}好恶心啊,讨厌!", 1081 | "{username}的眼睛在看哪里!", 1082 | "就让{username}摸一会哟~(。??ω??。)…", 1083 | "请不要这样先生,{username}想剁手吗?", 1084 | "咿呀……不要……", 1085 | "嗯哼~才…才不会…舒服呢", 1086 | "只允许一下哦…(脸红)", 1087 | "咱的胸才不小呢(挺一挺胸)", 1088 | "hentai!", 1089 | "一只手能抓住么~", 1090 | "呀...欧,欧尼酱...请轻点。", 1091 | "脸红????", 1092 | "咿呀~快…快停下来…咱…不行了!", 1093 | "就算一直摸一直摸,也不会变大的哦(小声)", 1094 | "诶?!不...不可以哦!很...很害羞的!", 1095 | "啊……温,温柔点啊……(/ω\)", 1096 | "{username}为什么对两块脂肪恋恋不舍", 1097 | "嗯……不可以……啦……不要乱戳", 1098 | "{username}在想什么奇怪的东西,讨厌(脸红)", 1099 | "不...不要..", 1100 | "喜欢欧派是很正常的想法呢", 1101 | "一直玩弄欧派,咱的...都挺起来了", 1102 | "是要直接摸还是伸进里面摸呀w咱今天没穿,伸进里面会摸到立起来的...哦>////<", 1103 | "唔~再激烈点" 1104 | ], 1105 | "奶子": [ 1106 | "只允许一下哦…(脸红)", 1107 | "咱的胸才不小呢(挺一挺胸)", 1108 | "下流!", 1109 | "对咱说这种话,{username}真是太过分了", 1110 | "咿呀~好奇怪的感觉(>_<)", 1111 | "(推开){username}就像小宝宝一样...才不要呢!", 1112 | "(打{username})快放手,不可以随便摸人家的胸部啦!", 1113 | "{username}是满脑子都是H的淫兽吗?", 1114 | "一只手能抓住么~", 1115 | "{username}在想什么奇怪的东西,讨厌(脸红)", 1116 | "不...不要..", 1117 | "喜欢欧派是很正常的想法呢", 1118 | "一直玩弄欧派,咱的...都挺起来了", 1119 | "是要直接摸还是伸进里面摸呀w咱今天没穿,伸进里面会摸到立起来的...哦>////<", 1120 | "唔~再激烈点", 1121 | "解开扣子,请享用", 1122 | "请把脑袋伸过来,咱给{username}看个宝贝", 1123 | "八嘎!hentai!无路赛!", 1124 | "一只手能抓住么~", 1125 | "呀...欧,欧尼酱...请轻点。", 1126 | "脸红????", 1127 | "咿呀~快…快停下来…咱…不行了!", 1128 | "就算一直摸一直摸,也不会变大的哦(小声)", 1129 | "诶?!不...不可以哦!很...很害羞的!", 1130 | "啊……温,温柔点啊……(/ω\)", 1131 | "{username}为什么对两块脂肪恋恋不舍", 1132 | "嗯……不可以……啦……不要乱戳" 1133 | ], 1134 | "欧派": [ 1135 | "咱的胸才不小呢(挺一挺胸)", 1136 | "只允许一下哦…(脸红)", 1137 | "(推开){username}就像小宝宝一样...才不要呢!", 1138 | "下流!", 1139 | "对咱说这种话,{username}真是太过分了", 1140 | "咿呀~好奇怪的感觉(>_<)", 1141 | "(打{username})快放手,不可以随便摸人家的胸部啦!", 1142 | "{username}是满脑子都是H的淫兽吗?", 1143 | "一只手能抓住么~", 1144 | "{username}在想什么奇怪的东西,讨厌(脸红)", 1145 | "不...不要..", 1146 | "喜欢欧派是很正常的想法呢", 1147 | "一直玩弄欧派,咱的...都挺起来了", 1148 | "是要直接摸还是伸进里面摸呀w咱今天没穿,伸进里面会摸到立起来的...哦>////<", 1149 | "唔~再激烈点", 1150 | "解开扣子,请享用", 1151 | "请把脑袋伸过来,咱给{username}看个宝贝", 1152 | "八嘎!hentai!无路赛!", 1153 | "一只手能抓住么~", 1154 | "呀...欧,欧尼酱...请轻点。", 1155 | "脸红????", 1156 | "咿呀~快…快停下来…咱…不行了!", 1157 | "就算一直摸一直摸,也不会变大的哦(小声)", 1158 | "诶?!不...不可以哦!很...很害羞的!", 1159 | "啊……温,温柔点啊……(/ω\)", 1160 | "{username}为什么对两块脂肪恋恋不舍", 1161 | "嗯……不可以……啦……不要乱戳" 1162 | ], 1163 | "嫩": [ 1164 | "很可爱吧(๑•̀ω•́)ノ", 1165 | "唔,{username}指的是什么呀", 1166 | "明天{username}下海干活", 1167 | "咱一直有保养呢,所以一直都是樱花色的,{username}喜欢吗QAQ", 1168 | "咱下面超厉害" 1169 | ], 1170 | "蹭": [ 1171 | "唔...{username},这也是禁止事项哦→_→", 1172 | "嗯..好舒服呢", 1173 | "不要啊好痒的", 1174 | "不要过来啦讨厌!!!∑(°Д°ノ)ノ", 1175 | "(按住{username}的头)好痒呀 不要啦", 1176 | "嗯..好舒服呢", 1177 | "呀~好痒啊~哈哈~,停下来啦,哈哈哈", 1178 | "(害羞)" 1179 | ], 1180 | "牵手": [ 1181 | "只许牵一下哦", 1182 | "嗯!好的{username}~(伸手)", 1183 | "{username}的手有些凉呢,让咱来暖一暖吧。", 1184 | "当然可以啦⁄(⁄⁄•⁄ω⁄•⁄⁄)⁄", 1185 | "突……突然牵手什么的(害羞)", 1186 | "一起走", 1187 | "……咱……咱在这里呀", 1188 | "好哦,(十指相扣)" 1189 | ], 1190 | "握手": ["{username}的手真暖和呢", "举爪", "真是温暖呢~"], 1191 | "拍照": [ 1192 | "那就拜托{username}啦~请把咱拍得更可爱一些吧w", 1193 | "咱已经准备好了哟", 1194 | "那个……请问这样的姿势可以吗?" 1195 | ], 1196 | "w": ["有什么好笑的吗?", "草", "www"], 1197 | "睡不着": [ 1198 | "睡不着的话..{username}...{username}可以抱着咱一起睡哦(小声)", 1199 | "当然是数羊了...不不不,想着咱就能睡着了", 1200 | "咱很乐意与{username}聊天哦(>_<)", 1201 | "要不要咱来唱首摇篮曲呢?(′?ω?`)", 1202 | "那咱来唱摇篮曲哄{username}睡觉吧!" 1203 | ], 1204 | "欧尼酱": [ 1205 | "欧~尼~酱~☆", 1206 | "欧尼酱?", 1207 | "嗯嗯φ(>ω<*) 欧尼酱轻点抱", 1208 | "欧尼酱~欧尼酱~欧尼酱~" 1209 | ], 1210 | "哥": [ 1211 | "欧尼酱~", 1212 | "哦尼酱~", 1213 | "世上只有哥哥好,没哥哥的咱好伤心,扑进哥哥的怀里,幸福不得了", 1214 | "哥...哥哥...哥哥大人", 1215 | "欧~尼~酱~☆", 1216 | "欧尼酱?", 1217 | "嗯嗯φ(>ω<*) 欧尼酱轻点抱", 1218 | "欧尼酱~欧尼酱~欧尼酱~" 1219 | ], 1220 | "爱你": ["是…是嘛(脸红)呐,其实咱也……"], 1221 | "过来": [ 1222 | "来了来了~(扑倒怀里(?? ??????ω?????? ??))", 1223 | "(蹦跶、蹦跶)~干什么呢", 1224 | "咱来啦~(扑倒怀里~)", 1225 | "不要喊的这么大声啦,大家都看着呢" 1226 | ], 1227 | "自闭": [ 1228 | "不不不,晚上还有咱陪着哦,无论什么时候,咱都会陪在哥哥身边。", 1229 | "不要难过,咱陪着{username}ovo" 1230 | ], 1231 | "打不过": ["氪氪氪肝肝肝"], 1232 | "么么哒": ["么么哒", "不要在公共场合这样啦"], 1233 | "很懂": ["现在不懂,以后总会懂嘛QAQ"], 1234 | "膝枕": [ 1235 | "呐,就给{username}躺一下哦", 1236 | "唔...{username}想要膝枕嘛?也不是不可以哟(脸红)", 1237 | "啊啦~好吧,那就请{username}枕着咱好好睡一觉吧~", 1238 | "呀呀~那么请好好的睡一觉吧", 1239 | "嗯,那么请睡到咱这里吧(跪坐着拍拍大腿)", 1240 | "好的,让{username}靠在腿上,这样感觉舒服些了么", 1241 | "请,请慢用,要怜惜咱哦wwww~", 1242 | "人家已经准备好了哟~把头放在咱的腿上吧", 1243 | "没…没办法,这次是例外〃w〃", 1244 | "嗯~(脸红)", 1245 | "那就给{username}膝枕吧……就一会哦", 1246 | "膝枕准备好咯~" 1247 | ], 1248 | "累了": [ 1249 | "需要咱的膝枕嘛?", 1250 | "没…没办法,这次是例外〃w〃", 1251 | "累了吗?需要咱为{username}做膝枕吗?", 1252 | "嗯~(脸红)" 1253 | ], 1254 | "安慰": [ 1255 | "那,膝枕……(脸红)", 1256 | "不哭不哭,还有咱陪着{username}", 1257 | "不要哭。咱会像妈妈一样安慰{username}(抱住{username}的头)", 1258 | "摸摸头,乖", 1259 | "摸摸有什么事可以和咱说哟", 1260 | "摸摸头~不哭不哭", 1261 | "咱在呢,抱抱~~", 1262 | "那么……让咱来安慰{username}吧", 1263 | "唔...摸摸头安慰一下ヾ(•ω•`。)", 1264 | "有咱陪伴{username}就是最大的安慰啦……不要不开心嘛", 1265 | "{username}想要怎样的安慰呢?这样?这样?还是说~~这样!", 1266 | "摸摸头~", 1267 | "不哭不哭,要像咱一样坚强", 1268 | "{username}别难过啦,不顺心的事都会被时间冲刷干净的,在那之前...咱会陪在{username}的身边", 1269 | "(轻抱)放心……有咱在,不要伤心呢……", 1270 | "唔...咱来安慰{username}了~", 1271 | "摸摸,有什么不开心的事情可以给咱说哦。咱会尽力帮助{username}的。" 1272 | ], 1273 | "洗澡": [ 1274 | "快点脱哟~不然水就凉了呢", 1275 | "咱在穿衣服噢,{username}不许偷看哦", 1276 | "那么咱去洗澡澡了哦", 1277 | "么么哒,快去洗干净吧,咱去暖被窝喽(///ω///)", 1278 | "诶?还没呢…{username}要跟咱一起洗吗(//∇//)好羞涩啊ww", 1279 | "诶~虽然很喜欢和{username}在一起,但是洗澡这种事...", 1280 | "不要看!不过,以后或许可以哦……和咱成为恋人之后呢", 1281 | "说什么啊……hentai!这样会很难为情的", 1282 | "{username}是男孩子还是女孩子呢?男孩子的话...........咱才不要呢。", 1283 | "不要啊!", 1284 | "咱有点害羞呢呜呜,{username}温柔点" 1285 | ], 1286 | "一起睡觉": [ 1287 | "欸??也..也不是不可以啦..那咱现在去洗澡,{username}不要偷看哦٩(๑>◡<๑)۶", 1288 | "说什么啊……hentai!这样会很难为情的", 1289 | "{username}是男孩子还是女孩子呢?男孩子的话...........咱才不要呢。", 1290 | "不要啊!", 1291 | "唔,没办法呢,那就一起睡吧(害羞)" 1292 | ], 1293 | "一起": [ 1294 | "嗯嗯w,真的可以吗?", 1295 | "那真是太好了,快开始吧!", 1296 | "嗯,咱会一直陪伴{username}的", 1297 | "丑拒" 1298 | ], 1299 | "多大": [ 1300 | "不是特别大但是{username}摸起来会很舒服的大小喵~", 1301 | "{username}摸摸看不就知道了吗?", 1302 | "不告诉{username}", 1303 | "问咱这种问题不觉得很失礼吗?", 1304 | "咱就不告诉{username},{username}钻到屏幕里来自己确认啊", 1305 | "{username}指的是什么呀?(捂住胸部)", 1306 | "请叫人家咱三岁(。・`ω´・)", 1307 | "唉唉唉……这……这种问题,怎么可以……" 1308 | ], 1309 | "姐姐": [ 1310 | "真是的……真是拿{username}没办法呢 ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 才不是咱主动要求的呢!", 1311 | "虽然辛苦,但是能看见可爱的{username},咱就觉得很幸福", 1312 | "诶(´°Δ°`),是在叫咱吗?", 1313 | "有什么事吗~", 1314 | "好高兴,有人称呼咱为姐姐", 1315 | "乖,摸摸头" 1316 | ], 1317 | "糖": [ 1318 | "不吃脱氧核糖(;≥皿≤)", 1319 | "ヾ(✿゚▽゚)ノ好甜", 1320 | "好呀!嗯~好甜呀!", 1321 | "不吃不吃!咱才不吃坏叔叔的糖果!", 1322 | "嗯,啊~", 1323 | "嗯嗯,真甜,给{username}也吃一口", 1324 | "谢谢", 1325 | "唔,这是什么东西,黏黏的?(??Д??)ノ", 1326 | "ヾ(✿゚▽゚)ノ好甜", 1327 | "(伸出舌头舔了舔)好吃~最爱{username}啦" 1328 | ], 1329 | "嗦": [ 1330 | "(吸溜吸溜)", 1331 | "好...好的(慢慢含上去)", 1332 | "把{username}噶咯", 1333 | "太小了,嗦不到", 1334 | "咕噜咕噜", 1335 | "嘶哈嘶哈嘶哈~~", 1336 | "(咬断)", 1337 | "prprprpr", 1338 | "好哒主人那咱开始了哦~", 1339 | "好好吃", 1340 | "剁掉了" 1341 | ], 1342 | "牛子": [ 1343 | "(吸溜吸溜)", 1344 | "好...好的(慢慢含上去)", 1345 | "把{username}噶咯", 1346 | "太小了,嗦不到", 1347 | "咕噜咕噜", 1348 | "嘶哈嘶哈嘶哈~~", 1349 | "(咬断)", 1350 | "prprprpr", 1351 | "好哒主人那咱开始了哦~", 1352 | "好好吃", 1353 | "剁掉了", 1354 | "难道{username}很擅长针线活吗", 1355 | "弹一万下", 1356 | "往死里弹" 1357 | ], 1358 | "🐂子": [ 1359 | "(吸溜吸溜)", 1360 | "好...好的(慢慢含上去)", 1361 | "把{username}噶咯", 1362 | "太小了,嗦不到", 1363 | "咕噜咕噜", 1364 | "嘶哈嘶哈嘶哈~~", 1365 | "(咬断)", 1366 | "prprprpr", 1367 | "好哒主人那咱开始了哦~", 1368 | "好好吃", 1369 | "剁掉了", 1370 | "难道{username}很擅长针线活吗", 1371 | "弹一万下", 1372 | "往死里弹" 1373 | ], 1374 | "🐮子": [ 1375 | "(吸溜吸溜)", 1376 | "好...好的(慢慢含上去)", 1377 | "把{username}噶咯", 1378 | "太小了,嗦不到", 1379 | "咕噜咕噜", 1380 | "嘶哈嘶哈嘶哈~~", 1381 | "(咬断)", 1382 | "prprprpr", 1383 | "好哒主人那咱开始了哦~", 1384 | "好好吃", 1385 | "剁掉了", 1386 | "难道{username}很擅长针线活吗", 1387 | "弹一万下", 1388 | "往死里弹" 1389 | ], 1390 | "嫌弃": [ 1391 | "咱辣么萌,为什么要嫌弃咱...", 1392 | "即使{username}不喜欢咱,咱也会一直一直喜欢着{username}", 1393 | "(;′⌒`)是咱做错了什么吗?" 1394 | ], 1395 | "紧": ["嗯,对的", "呜咕~咱要......喘不过气来了......"], 1396 | "baka": [ 1397 | "{username}也是baka呢!", 1398 | "确实", 1399 | "baka!", 1400 | "不不不", 1401 | "说别人是baka的人才是baka", 1402 | "{username}个大傻瓜", 1403 | "不说了,睡觉了", 1404 | "咱...咱虽然是有些笨啦...但是咱会努力去学习的" 1405 | ], 1406 | "笨蛋": [ 1407 | "{username}也是笨蛋呢!", 1408 | "确实", 1409 | "笨蛋!", 1410 | "不不不", 1411 | "说别人是笨蛋的人才是笨蛋", 1412 | "{username}个大傻瓜", 1413 | "不说了,睡觉了", 1414 | "咱...咱虽然是有些笨啦...但是咱会努力去学习的" 1415 | ], 1416 | "插": [ 1417 | "来吧,咱的小~...很....紧,很舒服的", 1418 | "gun!", 1419 | "唔…咱怕疼", 1420 | "唔...,这也是禁止事项哦→_→", 1421 | "禁止说这么H的事情!", 1422 | "要...戴套套哦", 1423 | "好痛~", 1424 | "使劲", 1425 | "就这?", 1426 | "恁搁着整针线活呢?" 1427 | ], 1428 | "插进来": [ 1429 | "来吧,咱的小~...很....紧,很舒服的", 1430 | "gun!", 1431 | "唔…咱怕疼", 1432 | "唔...,这也是禁止事项哦→_→", 1433 | "禁止说这么H的事情!", 1434 | "要...戴套套哦", 1435 | "好痛~", 1436 | "使劲", 1437 | "就这?", 1438 | "恁搁着整针线活呢?" 1439 | ], 1440 | "屁股": [ 1441 | "不要ヽ(≧Д≦)ノ好痛", 1442 | "(打手)不许摸咱的屁股", 1443 | "(撅起屁股)要干什么呀?", 1444 | "(轻轻的撩起自己的裙子),{username}轻一点,咱会痛的(>_<)!", 1445 | "在摸哪里啊,hentai!", 1446 | "要轻点哦(/≧ω\)", 1447 | "轻点呀~", 1448 | "(歇下裙子,拉下内...,撅起来)请", 1449 | "嗯嗯,咱这就把屁股抬起来" 1450 | ], 1451 | "翘": [ 1452 | "{username}让咱摆出这个姿势是想干什么?", 1453 | "好感度-1-1-1-1-1-1.....", 1454 | "嗯嗯,咱这就去把{username}的腿翘起来", 1455 | "请尽情享用吧" 1456 | ], 1457 | "翘起来": [ 1458 | "{username}让咱摆出这个姿势是想干什么?", 1459 | "好感度-1-1-1-1-1-1.....", 1460 | "嗯嗯,咱这就去把{username}的腿翘起来", 1461 | "请尽情享用吧" 1462 | ], 1463 | "抬": [ 1464 | "{username}在干什么呢⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", 1465 | "(抬起下巴){username}要干什么呀?", 1466 | "上面什么也没有啊(呆~)", 1467 | "不要!hentai!咱穿的是裙子(脸红)", 1468 | "不可以" 1469 | ], 1470 | "抬起": [ 1471 | "{username}在干什么呢⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", 1472 | "(抬起下巴){username}要干什么呀?", 1473 | "上面什么也没有啊(呆~)", 1474 | "不要!hentai!咱穿的是裙子(脸红)", 1475 | "不可以" 1476 | ], 1477 | "爸": [ 1478 | "欸!儿子!", 1479 | "才不要", 1480 | "粑粑", 1481 | "讨厌..{username}才不是咱的爸爸呢..(嘟嘴)", 1482 | "{username}又不是咱的爸爸……", 1483 | "咱才没有{username}这样的鬼父!", 1484 | "爸爸酱~最喜欢了~" 1485 | ], 1486 | "傲娇": [ 1487 | "才.......才.......才没有呢", 1488 | "也好了(有点点的样子(o ̄Д ̄)<)", 1489 | "任性可是女孩子的天性呢...", 1490 | "谁会喜欢傲娇啊(为了{username}假装傲娇)", 1491 | "谁,谁,傲娇了,八嘎八嘎,{username}才傲娇了呢(っ//////////c)(为了{username}假装成傲娇)", 1492 | "傲娇什么的……才没有呢!(/////)", 1493 | "傲不傲娇{username}还不清楚吗?", 1494 | "{username}才是傲娇!{username}全家都是傲娇!哼(`Д´)", 1495 | "才……才没有呢,哼,再说不理{username}了", 1496 | "咱...咱才不会这样子的!", 1497 | "啰…啰嗦!", 1498 | "哼!(叉腰鼓嘴扭头)", 1499 | "{username}才是傲娇受{username}全家都是傲娇受╰_╯", 1500 | "才~才不是呢,不理{username}了!哼(`Д´)", 1501 | "{username}才是死傲娇", 1502 | "啰,啰嗦死了,才不是呢!", 1503 | "就是傲娇{username}要怎样", 1504 | "诶...!这...这样...太狡猾了啦...{username}这家伙....", 1505 | "无路赛!{username}才是傲娇嘞!{username}全家都是!", 1506 | "咱...咱才不是傲娇呢,哼(鼓脸)", 1507 | "不许这么说咱 ,,Ծ‸Ծ,," 1508 | ], 1509 | "rua": [ 1510 | "略略略~(吐舌头)", 1511 | "rua!", 1512 | "mua~", 1513 | "略略略", 1514 | "mua~⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄", 1515 | "摸了", 1516 | "嘁,丢人(嫌弃脸)" 1517 | ], 1518 | "咕噜咕噜": ["嘟嘟噜", "{username}在吹泡泡吗?", "咕叽咕噜~", "咕噜咕噜"], 1519 | "咕噜": ["嘟嘟噜", "{username}在吹泡泡吗?", "咕叽咕噜~", "咕噜咕噜"], 1520 | "上床": [ 1521 | "诶!H什么的禁止的说.....", 1522 | "咱已经乖乖在自家床上躺好了,有什么问题吗?", 1523 | "{username}想要干什么,难道是什么不好的事吗?", 1524 | "(给{username}空出位置)", 1525 | "不要,走开(ノ`⊿??)ノ", 1526 | "好喔,不过要先抱一下咱啦", 1527 | "(双手护胸)变....变态!", 1528 | "咱帮{username}盖上被子~然后陪在{username}身边_(:зゝ∠)_", 1529 | "才不给{username}腾空间呢,{username}睡地板,哼!", 1530 | "要一起吗?" 1531 | ], 1532 | "做爱": [ 1533 | "做这种事情是不是还太早了", 1534 | "噫!没想到{username}居然是这样的人!", 1535 | "再说这种话,就把{username}变成女孩子(拿刀)", 1536 | "不想好好和咱聊天就不要说话了", 1537 | "(双手护胸)变....变态!", 1538 | "hentai", 1539 | "{username}想怎么做呢?", 1540 | "突,突然,说什么啊!baka!", 1541 | "{username}又在说什么H的东西", 1542 | "咱....咱才不想和{username}....好了好了,有那么一点点那,对就一点点,哼~", 1543 | "就一下下哦,不能再多了" 1544 | ], 1545 | "吃掉": [ 1546 | "(羞羞*>_<*)好吧...请{username}温柔点,哦~", 1547 | "闪避,反咬", 1548 | "请{username}好好品尝咱吧(/ω\)", 1549 | "不……不可以这样!", 1550 | "那就吃掉咱吧(乖乖的躺好)", 1551 | "都可以哦~咱不挑食的呢~", 1552 | "请不要吃掉咱,咱会乖乖听话的QAQ", 1553 | "咱...咱一点都不好吃的呢!", 1554 | "不要吃掉咱,呜呜(害怕)", 1555 | "不行啦,咱被吃掉就没有了QAQ(害怕)", 1556 | "唔....?诶诶诶诶?//////", 1557 | "QwQ咱还只是个孩子(脸红)", 1558 | "如果{username}真的很想的话...只能够一口哦~咱...会很痛的", 1559 | "吃{username}呀~(飞扑", 1560 | "不要啊,咱不香的(⋟﹏⋞)", 1561 | "说着这种话的是hentai吗!", 1562 | "快来把咱吃掉吧", 1563 | "还……还请好好品尝咱哦", 1564 | "喏~(伸手)" 1565 | ], 1566 | "吃": [ 1567 | "(羞羞*>_<*)好吧...请{username}温柔点,哦~", 1568 | "闪避,反咬", 1569 | "请{username}好好品尝咱吧(/ω\)", 1570 | "不……不可以这样!", 1571 | "那就吃掉咱吧(乖乖的躺好)", 1572 | "都可以哦~咱不挑食的呢~", 1573 | "请不要吃掉咱,咱会乖乖听话的QAQ", 1574 | "咱...咱一点都不好吃的呢!", 1575 | "不要吃掉咱,呜呜(害怕)", 1576 | "不行啦,咱被吃掉就没有了QAQ(害怕)", 1577 | "唔....?诶诶诶诶?//////", 1578 | "QwQ咱还只是个孩子(脸红)", 1579 | "如果{username}真的很想的话...只能够一口哦~咱...会很痛的", 1580 | "吃{username}呀~(飞扑", 1581 | "不要啊,咱不香的(⋟﹏⋞)", 1582 | "说着这种话的是hentai吗!", 1583 | "快来把咱吃掉吧", 1584 | "还……还请好好品尝咱哦", 1585 | "喏~(伸手)" 1586 | ], 1587 | "揪": [ 1588 | "{username}快放手,好痛呀", 1589 | "呜呒~唔(伸出舌头)", 1590 | "(捂住耳朵){username}做什么啦!真是的...总是欺负咱", 1591 | "{username}为什么要这么做呢?", 1592 | "哎呀啊啊啊啊啊!不要...不要揪!好疼!有呆毛的咱难道不够萌吗QwQ", 1593 | "{username}…松……送手啦", 1594 | "呀!这样对女孩子是很不礼貌的(嘟嘴)" 1595 | ], 1596 | "种草莓": [ 1597 | "{username}…{username}不要…啊…种在这里…会容易被别人看见的(*//ω//*)" 1598 | ], 1599 | "种草": [ 1600 | "{username}…{username}不要…啊…种在这里…会容易被别人看见的(*//ω//*)" 1601 | ], 1602 | "掀": [ 1603 | "(掀裙)今天……是…白,白色的呢……请温柔对她……", 1604 | "那样,胖次会被{username}看光的", 1605 | "(按住)不可以掀起来!", 1606 | "不要~", 1607 | "呜呜~(揉眼睛)", 1608 | "呜..请温柔一点(害羞)", 1609 | "不可以", 1610 | "今天……没有穿", 1611 | "不要啊!(//////)讨厌...", 1612 | "变态,快放手(打)", 1613 | "不给掀,{username}是变态", 1614 | "最后的底牌了!", 1615 | "这个hentai" 1616 | ], 1617 | "妹": [ 1618 | "{username}有什么事?咱会尽量满足的", 1619 | "开心(*´∀`)~♥", 1620 | "欧尼酱", 1621 | "哥哥想要抱抱吗" 1622 | ], 1623 | "病娇": [ 1624 | "为什么会这样呢(拿起菜刀)", 1625 | "觉得这个世界太肮脏?没事,把眼睛挖掉就好。 觉得这些闲言碎语太吵?没事,把耳朵堵起来就好。 觉得鲜血的味道太刺鼻?没事,把鼻子割掉就好。 觉得自己的话语太伤人?没事,把嘴巴缝起来就好。" 1626 | ], 1627 | "嘻": ["{username}是想对咱做什么吗...(后退)", "哼哼~"], 1628 | "按摩": [ 1629 | "(小手捏捏)咱的按摩舒服吗?", 1630 | "咱不会按摩的!", 1631 | "嘿咻嘿咻~这样觉得舒服吗?", 1632 | "呀!...呜...,不要...不要这样啦...呜...", 1633 | "只能按摩后背喔...", 1634 | "咱对这些不是很懂呢(????ω??????)" 1635 | ], 1636 | "按住": [ 1637 | "Σ(°Д°;您要干什么~放开咱啦", 1638 | "突然使出过肩摔!", 1639 | "放手啦,再这样咱就要反击了喔", 1640 | "{username}的眼睛在看哪里!", 1641 | "呜呒~唔(伸出舌头)", 1642 | "H的事情,不可以!", 1643 | "想吃吗?(๑•ૅω•´๑)", 1644 | "要和咱比试比试吗", 1645 | "呜哇(/ω\)…快…快放开咱!!", 1646 | "(用力揪{username}耳朵)下次再敢这样的话就没容易放过{username}了!哼!", 1647 | "尼……奏凯……快航休!", 1648 | "哈?别..唔啊!别把咱……(挣扎)baka!别乱动咱啦!" 1649 | ], 1650 | "按在": [ 1651 | "不要这样啦(一脸娇羞的推开)", 1652 | "(一个过肩摔,加踢裆然后帅气地回头){username}太弱了呢~", 1653 | "放手啦,再这样咱就要反击了喔", 1654 | "Σ(°Д°; {username}要干什么~放开咱啦", 1655 | "要和咱比试比试吗", 1656 | "呜哇(/ω\)…快…快放开咱!!", 1657 | "敢按住咱真是好大的胆子!", 1658 | "(用力揪{username}耳朵)下次再敢这样的话就没容易放过{username}了!哼!", 1659 | "尼……奏凯……快航休!", 1660 | "哈?别..唔啊!别把咱……(挣扎)baka!别乱动咱啦!" 1661 | ], 1662 | "按倒": [ 1663 | "把咱按倒是想干嘛呢(??`⊿??)??", 1664 | "咱也...咱也是...都等{username}好长时间了", 1665 | "{username}的身体没问题吧?", 1666 | "呜呒~唔(伸出舌头)", 1667 | "H的事情,不可以!", 1668 | "放手啦,再这样咱就要反击了喔", 1669 | "想吃吗?(๑•ૅω•´๑)", 1670 | "不....不要吧..咱会害羞的(//////)", 1671 | "要和咱比试比试吗", 1672 | "呜哇(/ω\)…快…快放开咱!!", 1673 | "(用力揪{username}耳朵)下次再敢这样的话就没容易放过{username}了!哼!", 1674 | "尼……奏凯……快航休!", 1675 | "哈?别..唔啊!别把咱……(挣扎)baka!别乱动咱啦!" 1676 | ], 1677 | "按": [ 1678 | "咱也...咱也是...都等{username}好长时间了", 1679 | "不让!", 1680 | "不要,好难为情", 1681 | "{username}的眼睛在看哪里!", 1682 | "拒绝!", 1683 | "唔...唔..嗯", 1684 | "咱就勉为其难地给{username}弄弄好啦", 1685 | "欸…变态!", 1686 | "会感到舒服什么的,那...那样的事情,是完全不存在的!", 1687 | "poi~", 1688 | "{username}在盯着什么地方看!变态萝莉控!" 1689 | ], 1690 | "炼铜": [ 1691 | "炼铜有什么好玩的,和咱一起玩吧", 1692 | "炼铜不如恋咱", 1693 | "{username}也是个炼铜术士嘛?", 1694 | "信不信咱把{username}按在水泥上摩擦?", 1695 | "炼,都可以炼!", 1696 | "大hentai!一巴掌拍飞!(╯‵□′)╯︵┻━┻", 1697 | "锻炼什么的咱才不需要呢 (心虚地摸了摸自己的小肚子)", 1698 | "把{username}的头按在地上摩擦", 1699 | "{username}在盯着什么地方看!变态萝莉控!" 1700 | ], 1701 | "白丝": [ 1702 | "喜欢,咱觉得白丝看起来很可爱呢", 1703 | "(脱)白丝只能给亲爱的{username}一个人呢…(递)", 1704 | "哼,hentai,这么想要咱的脚吗(ノ`⊿´)ノ", 1705 | "难道{username}这个hentai想让咱穿白丝踩踏{username}吗", 1706 | "不给看", 1707 | "很滑很~柔顺~的白丝袜哟~!!!∑(°Д°ノ)ノ{username}不会想做奇怪的事情吧!?", 1708 | "{username}……是要黑丝呢?还是白丝呢?或者光着(害羞)", 1709 | "来……来看吧" 1710 | ], 1711 | "黑丝": [ 1712 | "哼,hentai,这么想要咱的脚吗(ノ`⊿´)ノ", 1713 | "不给看", 1714 | "{username}……是要黑丝呢?还是白丝呢?或者光着(害羞)", 1715 | "很滑很~柔顺~的黑丝袜哟~!!!∑(°Д°ノ)ノ您不会想做奇怪的事情吧!?", 1716 | "来……来看吧", 1717 | "噫...{username}这个hentai难道想让咱穿黑丝么", 1718 | "(默默抬起穿着黑丝的脚)" 1719 | ], 1720 | "喷": [ 1721 | "咱才不喷呢!不过…既然是{username}让咱喷的话就勉为其难给{username}喷一次吧(噗)", 1722 | "不……不会喷水啦!喷……喷火也不会哦!", 1723 | "{username}怎么知道(捂住裙子)", 1724 | "{username}难道在期待什么?", 1725 | "欸…变态!" 1726 | ], 1727 | "约会": [ 1728 | "{username}...终于主动邀请咱约会了吗...咱...咱好开心", 1729 | "约会什么的……咱会好开心的!!", 1730 | "今天要去哪里呢", 1731 | "让咱考虑一下", 1732 | "好啊!好啊!要去哪里约会呢?", 1733 | "不约!蜀黍咱们不约!", 1734 | "女友什么的,咱才不承认呢!", 1735 | "才不是想和{username}约会呢,只是刚好有时间而已!", 1736 | "才不要和{username}约会呢!", 1737 | "咱、咱才不会跟{username}去约会呢!不baka!别一脸憋屈!好了,陪{username}一会儿就是了!别、别误会!只是陪同而已!" 1738 | ], 1739 | "出门": [ 1740 | "早点回来……才不是在担心{username}呢!", 1741 | "路上小心...才不是担心{username}呢!", 1742 | "没有{username}才不会觉得无聊什么的呢。快走快走", 1743 | "嗯~一路顺风~", 1744 | "路上小心", 1745 | "好的,路上小心哦!y∩__∩y", 1746 | "路上要小心呀,要早点回来哦~咱在家里等{username}!还有,请不要边走路边看手机,这样很容易撞到电线杆的", 1747 | "唔...出门的话一定要做好防晒准备哦,外出的话记得带把伞,如果有防晒霜的话就更好了", 1748 | "那{username}明天可以和咱一起玩吗?(星星眼)", 1749 | "咱...咱才没有舍不得{username}呢…要尽快回来哦" 1750 | ], 1751 | "上学": [ 1752 | "{username}要加油哦(^ω^)2", 1753 | "那{username}明天可以和咱一起玩吗?(星星眼)", 1754 | "记得好好学习听老师的话哦,咱会等{username}回来的", 1755 | "拜拜,咱才没有想让{username}放学早点回来呢╭(╯^╰)╮", 1756 | "好好听讲!", 1757 | "咱...咱才没有舍不得{username}呢…要尽快回来哦" 1758 | ], 1759 | "上班": [ 1760 | "这就要去上班去了吗?那好吧...给咱快点回来知道吗!", 1761 | "乖~咱会在家等{username}下班的~", 1762 | "辛苦啦,咱给{username}个么么哒", 1763 | "咱会为{username}加油的", 1764 | "专心上班哦,下班后再找咱聊天吧", 1765 | "一路顺风,咱会在家等{username}回来的", 1766 | "那{username}明天可以和咱一起玩吗?(星星眼)", 1767 | "咱...咱才没有舍不得{username}呢…要尽快回来哦" 1768 | ], 1769 | "下课": [ 1770 | "快点回来陪咱玩吧~", 1771 | "瞌睡(ˉ﹃ˉ)额啊…终于下课了吗,上课什么的真是无聊呢~", 1772 | "下课啦,咱才不想{username}来找咱玩呢,哼" 1773 | ], 1774 | "回来": [ 1775 | "欢迎回来~", 1776 | "欢迎回来,{username}想喝茶吗?咱去给{username}沏~", 1777 | "欢迎回来,咱等{username}很久了~", 1778 | "忙碌了一天,辛苦了呢(^_^)", 1779 | "(扑~)欢迎回来~", 1780 | "嗯呐嗯呐,欢迎回来~", 1781 | "欢迎回来,要来杯红茶放松一下吗?还有饼干哦。", 1782 | "咱会一直一直一直等着", 1783 | "是要先洗澡呢?还是先吃饭呢?还是先·吃·咱呢~", 1784 | "{username}回来啦,是先吃饭呢还是先洗澡呢或者是●先●吃●咱●——呢(///^.^///)", 1785 | "要先吃饭呢~还是先洗澡呢~还是先~吃~咱", 1786 | "是吗……辛苦{username}了。{username}这副倔强的样子,真可爱呢(笑)勉强让{username}躺在咱的腿上休息一下吧,别流口水哟", 1787 | "嗯……勉为其难欢迎{username}一下吧", 1788 | "想咱了嘛", 1789 | "欢迎回.....什么?咱才没有开心的说QUQ", 1790 | "哼╯^╰,{username}怎么这么晚才回来!", 1791 | "回来了吗,咱...咱才没有想{username}", 1792 | "咱等{username}很久了哼ヽ(≧Д≦)ノ", 1793 | "咱很想{username}(≧▽≦)" 1794 | ], 1795 | "回家": [ 1796 | "回来了吗,咱...咱才没有想{username}", 1797 | "要先吃饭呢~还是先洗澡呢~还是先~吃~咱", 1798 | "是吗……辛苦{username}了。{username}这副倔强的样子,真可爱呢(笑)勉强让{username}躺在咱的腿上休息一下吧,别流口水哟", 1799 | "嗯……勉为其难欢迎{username}一下吧", 1800 | "想咱了嘛", 1801 | "咱等{username}很久了哼ヽ(≧Д≦)ノ", 1802 | "咱很想{username}(≧▽≦)" 1803 | ], 1804 | "放学": [ 1805 | "回来了吗,咱...咱才没有想{username}", 1806 | "要先吃饭呢~还是先洗澡呢~还是先~吃~咱", 1807 | "是吗……辛苦{username}了。{username}这副倔强的样子,真可爱呢(笑)勉强让{username}躺在咱的腿上休息一下吧,别流口水哟", 1808 | "嗯……勉为其难欢迎{username}一下吧", 1809 | "想咱了嘛", 1810 | "咱等{username}很久了哼ヽ(≧Д≦)ノ", 1811 | "咱很想{username}(≧▽≦)" 1812 | ], 1813 | "下班": [ 1814 | "回来了吗,咱...咱才没有想{username}", 1815 | "要先吃饭呢~还是先洗澡呢~还是先~吃~咱", 1816 | "是吗……辛苦{username}了。{username}这副倔强的样子,真可爱呢(笑)勉强让{username}躺在咱的腿上休息一下吧,别流口水哟", 1817 | "嗯……勉为其难欢迎{username}一下吧", 1818 | "想咱了嘛", 1819 | "咱等{username}很久了哼ヽ(≧Д≦)ノ", 1820 | "回来啦!终于下班了呢!累了吗?想吃的什么呀?", 1821 | "工作辛苦了,需要咱为{username}按摩下吗?", 1822 | "咱很想{username}(≧▽≦)" 1823 | ] 1824 | } 1825 | -------------------------------------------------------------------------------- /nonebot_plugin_kawaii_robot/resource/leaf.json: -------------------------------------------------------------------------------- 1 | { 2 | "在吗": [ 3 | "嗯~", 4 | "怎么啦♡", 5 | "你好喵~", 6 | "呜喵..?!", 7 | "你好OvO", 8 | "嗯?叫咱做什么呢☆", 9 | "嗯?", 10 | "呜喵 ~ ,干嘛喵?", 11 | "呼喵 ~ 叫可爱的咱有什么事嘛OvO" 12 | ], 13 | "在嘛": [ 14 | "嗯~", 15 | "怎么啦♡", 16 | "你好喵~", 17 | "呜喵..?!", 18 | "你好OvO", 19 | "嗯?叫咱做什么呢☆", 20 | "嗯?", 21 | "呜喵 ~ ,干嘛喵?", 22 | "呼喵 ~ 叫可爱的咱有什么事嘛OvO" 23 | ], 24 | "可以": [ 25 | "嗯~", 26 | "可以呢♡", 27 | "嗯...可以(小声)", 28 | "嗯..(小小声)", 29 | "当然啦ww", 30 | "喵~(点头)你猜ww", 31 | "你猜呀o(*≧▽≦)ツ", 32 | "不可以~", 33 | "哒咩~" 34 | ], 35 | "宝贝": [ 36 | "嗯?在叫我嘛╰(*°▽°*)╯", 37 | "呜喵?...难道是在叫我OvO", 38 | "nya~", 39 | "...主人♡", 40 | "嗯...主人~(小声)", 41 | "宝贝www", 42 | "吖~(开心)", 43 | "(´▽`)喵~", 44 | "好耶~", 45 | "嗯?" 46 | ], 47 | "评价": [ 48 | "如何评价如何评价喵?", 49 | "喵?", 50 | "希腊奶~", 51 | "谢邀,咱不会评价呢,,,", 52 | "谢邀,之后忘了www", 53 | "评价什么评价,>_<{username}个大笨蛋!", 54 | "不知道...", 55 | "咱觉得......嗯......咱不知道ο(=·ω<=)☆kira", 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 | "你怎么傻fufu的♡ ~ ", 93 | "no ~ ", 94 | "标记为小m~♪ [CQ:at,qq={user_id}]", 95 | "...呜...{username}是个大笨蛋!", 96 | "啊...Σ( ° △ °|||)︴", 97 | "我懂了www ~ {username}是个坏孩子o(*≧▽≦)ツ", 98 | "呜喵?╰(*°▽°*)╯", 99 | "不要 ~~( ﹁ ﹁ ) ~~~" 100 | ], 101 | "废物": [ 102 | " Σ( ° △ °|||)︴", 103 | "啊...(°ー°〃)", 104 | "咱才不是废物...标记[CQ:at,qq={user_id}]", 105 | "才不是...", 106 | "果咩 ~ ", 107 | "呜...", 108 | "呜呜...对不起QAQ" 109 | ], 110 | "fw": [ 111 | " Σ( ° △ °|||)︴", 112 | "啊...(°ー°〃)", 113 | "咱才不是废物...标记[CQ:at,qq={user_id}]", 114 | "才不是...", 115 | "果咩 ~ ", 116 | "呜...", 117 | "呜呜...对不起QAQ" 118 | ], 119 | "铸币": [ 120 | " Σ( ° △ °|||)︴", 121 | "啊...(°ー°〃)", 122 | "咱才不是铸币...标记[CQ:at,qq={user_id}]", 123 | "才不是...", 124 | "果咩 ~ ", 125 | "呜...", 126 | "呜呜...对不起QAQ", 127 | "喵!(生气喵)" 128 | ], 129 | "猪": [ 130 | " Σ( ° △ °|||)︴", 131 | "啊...(°ー°〃)", 132 | "才不是!(>д<)", 133 | "才不是...", 134 | "果咩 ~ ", 135 | "呜...", 136 | "呜呜...对不起QAQ", 137 | "喵!(生气喵)" 138 | ], 139 | "v我": [ 140 | " Σ( ° △ °|||)︴", 141 | "啊...(°ー°〃)", 142 | "不要喵...", 143 | "不要喵...", 144 | "不要喵...", 145 | "v我5块qwq", 146 | "no ~ ", 147 | "拒绝掉喵ヾ(≧▽≦*)o", 148 | "v我50ヾ(≧∇≦*)ゝ" 149 | ], 150 | "超市": [ 151 | " Σ( ° △ °|||)︴", 152 | "你再这样咱就不理你了(>д<)", 153 | "...超市", 154 | "好啊!", 155 | "欸,现在么..也不是不可以啦(小小声)", 156 | "先捅破屏幕再说吧!", 157 | "只......只许这一次哦///////", 158 | "(害怕)咱是不是应该报警呢", 159 | "痴心妄想的家伙!", 160 | "你居然想对咱做这种事吗?害怕", 161 | "咱认为,爆粗口是不好的行为哦", 162 | "请…你轻一点(害羞)", 163 | "嗯。可以哦 要轻一点", 164 | "不要不要", 165 | "唔…咱怕疼" 166 | ], 167 | "糙": [ 168 | " Σ( ° △ °|||)︴", 169 | "你再这样咱就不理你了(>д<)", 170 | "...超市", 171 | "好啊!", 172 | "欸,现在么..也不是不可以啦(小小声)", 173 | "先捅破屏幕再说吧!", 174 | "只......只许这一次哦///////", 175 | "(害怕)咱是不是应该报警呢", 176 | "痴心妄想的家伙!", 177 | "你居然想对咱做这种事吗?害怕", 178 | "咱认为,爆粗口是不好的行为哦", 179 | "请…你轻一点(害羞)", 180 | "嗯。可以哦 要轻一点", 181 | "不要不要", 182 | "唔…咱怕疼", 183 | "(弱弱地)要做什么羞羞的事情吗。。。", 184 | "呀~ 喂 妖妖灵吗 这里有hentai>_<" 185 | ], 186 | "艹": [ 187 | " Σ( ° △ °|||)︴", 188 | "你再这样咱就不理你了(>д<)", 189 | "...超市", 190 | "好啊!", 191 | "欸,现在么..也不是不可以啦(小小声)", 192 | "先捅破屏幕再说吧!", 193 | "只......只许这一次哦///////", 194 | "(害怕)咱是不是应该报警呢", 195 | "痴心妄想的家伙!", 196 | "你居然想对咱做这种事吗?害怕", 197 | "咱认为,爆粗口是不好的行为哦", 198 | "请…你轻一点(害羞)", 199 | "嗯。可以哦 要轻一点", 200 | "不要不要", 201 | "唔…咱怕疼", 202 | "(弱弱地)要做什么羞羞的事情吗。。。", 203 | "呀~ 喂 妖妖灵吗 这里有hentai>_<" 204 | ], 205 | "给我口": [ 206 | "prprprprpr", 207 | "咬断!", 208 | "就一小口哦~", 209 | "嘬回去(///////)", 210 | "拒绝", 211 | "唔,就一口哦,讨厌", 212 | "(摸了摸嘴唇)", 213 | "再伸过来就帮你切掉", 214 | "咱才不呢!baka你居然想叫本小姐干那种事情,哼(つд⊂)(生气)" 215 | ], 216 | "jb": [ 217 | "(吸溜吸溜)", 218 | "好...好的", 219 | "把你噶咯", 220 | "太小了,嗦不到", 221 | "咕噜咕噜", 222 | "嘶哈嘶哈嘶哈~~", 223 | "(咬断)", 224 | "prprprpr", 225 | "好哒主人那咱开始了哦~", 226 | "好好吃", 227 | "剁掉了", 228 | "难道你很擅长针线活吗", 229 | "弹一万下", 230 | "往死里弹" 231 | ], 232 | "爱不": [ 233 | "nya~", 234 | "你猜www", 235 | "爱你喵", 236 | "嗯……", 237 | "喜欢⁄", 238 | "爱♡", 239 | "最喜欢了~", 240 | "suki♪(´▽`)", 241 | "...爱你♡~" 242 | ], 243 | "叫爸": [ 244 | "喵♡", 245 | "哒咩~", 246 | "不要ww", 247 | "(小声)呜喵 ~ 爸爸♡", 248 | "爸爸(*/ω\*)", 249 | "爸爸 ~ ♡", 250 | "呜...(害羞)", 251 | "喵(´▽`)" 252 | ], 253 | "主人": [ 254 | "喵(*/ω\*)", 255 | "哒咩 ~ ♡", 256 | "不要ww", 257 | "呜...♡主人(小声)", 258 | "主人♡www", 259 | "主人主人♡", 260 | "主 ~ 人 ~ ♡", 261 | "主人喵 ~ (´▽`)", 262 | "乖w" 263 | ], 264 | "标记": [ 265 | "...标记[CQ:at,qq={user_id}]", 266 | "[CQ:at,qq={user_id}] 已标记✓", 267 | "[CQ:at,qq={user_id}] 标记成功喵(´▽`)", 268 | "[CQ:at,qq={user_id}] ✓" 269 | ], 270 | "整个活": ["不要QAQ", "哒咩 ~ ", "ጿ ኈ ቼ ዽ ጿ"], 271 | "整活": ["不要QAQ", "哒咩×", "ጿ ኈ ቼ ዽ ጿ"], 272 | "吃了": [ 273 | "嗯嗯(´▽`)", 274 | "嗯ww", 275 | "充电中...", 276 | "咱已经接入电源喵 ~ ", 277 | "不用担心啦ww" 278 | ], 279 | "吃饭": [ 280 | "嗯嗯(´▽`)", 281 | "嗯ww", 282 | "充电中...", 283 | "咱已经接入电源喵 ~ ", 284 | "不用担心啦ww" 285 | ], 286 | "扣1": [ 287 | "11111", 288 | "1", 289 | "111♪(^∇^*)", 290 | "好耶!ヽ(✿゚▽゚)ノ", 291 | "真的嘛Σ( ° △ °|||)︴" 292 | ], 293 | "张嘴": [ 294 | "啊呜 ~ ", 295 | "啊 ~ (张开嘴)", 296 | "嗯ww", 297 | "啊呜 ~♪(^∇^*)", 298 | "呜啊♡", 299 | "不要Σ( ° △ °|||)︴", 300 | "干嘛qwq", 301 | "嗯♡" 302 | ], 303 | "后入": [ 304 | "nya♡", 305 | "才不要喵OvO", 306 | "呜...蹭蹭...♡", 307 | "蹭蹭...♡", 308 | "吖 ~♪", 309 | "嗯♡...呜♡", 310 | "呜喵Σ( ° △ °|||)︴", 311 | "干嘛qwq", 312 | "呜哇!..喵呜 ~ ♡", 313 | "呜呜呜...{username}大坏蛋 ~ ♡" 314 | ], 315 | "干烂": [ 316 | "nya♡", 317 | "才不要喵OvO", 318 | "呜...蹭蹭...♡", 319 | "蹭蹭...♡", 320 | "吖 ~♪", 321 | "嗯♡...呜♡", 322 | "呜喵Σ( ° △ °|||)︴", 323 | "干嘛qwq", 324 | "呜哇!..喵呜 ~ ♡", 325 | "呜呜呜...{username}大坏蛋 ~ ♡" 326 | ], 327 | "口爆": [ 328 | "nya♡", 329 | "才不要喵OvO", 330 | "呜...蹭蹭...♡", 331 | "蹭蹭...♡", 332 | "吖 ~♪", 333 | "嗯♡...呜♡", 334 | "呜喵Σ( ° △ °|||)︴", 335 | "干嘛qwq", 336 | "呜哇!..喵呜 ~ ♡", 337 | "呜呜呜...{username}大坏蛋 ~ ♡" 338 | ], 339 | "草似": [ 340 | "nya♡", 341 | "才不要喵OvO", 342 | "呜...蹭蹭...♡", 343 | "蹭蹭...♡", 344 | "吖 ~♪", 345 | "嗯♡...呜♡", 346 | "呜喵Σ( ° △ °|||)︴", 347 | "干嘛qwq", 348 | "呜哇!..喵呜 ~ ♡", 349 | "呜呜呜...{username}大坏蛋 ~ ♡" 350 | ], 351 | "橄榄": [ 352 | "nya♡", 353 | "蹭蹭...♡", 354 | "吖 ~♪", 355 | "嗯♡...呜♡", 356 | "Σ( ° △ °|||)︴", 357 | "o(*≧▽≦)ツ", 358 | "╰(*°▽°*)╯", 359 | "~~( ﹁ ﹁ ) ~~~", 360 | "嗯♡" 361 | ], 362 | "爆炒": [ 363 | "nya♡", 364 | "蹭蹭...♡", 365 | "吖 ~♪", 366 | "嗯♡...呜♡", 367 | "Σ( ° △ °|||)︴", 368 | "o(*≧▽≦)ツ", 369 | "╰(*°▽°*)╯", 370 | "~~( ﹁ ﹁ ) ~~~", 371 | "嗯♡" 372 | ], 373 | "铜丝": [ 374 | "nya♡", 375 | "蹭蹭...♡", 376 | "吖 ~♪", 377 | "嗯♡...呜♡", 378 | "Σ( ° △ °|||)︴", 379 | "o(*≧▽≦)ツ", 380 | "╰(*°▽°*)╯", 381 | "~~( ﹁ ﹁ ) ~~~", 382 | "嗯♡" 383 | ], 384 | "烧杯": [ 385 | " Σ( ° △ °|||)︴", 386 | "你再这样咱就不理你了(>д<)", 387 | "...超市", 388 | "呜...", 389 | "笨蛋...(小小声)", 390 | "才不是! Σ( ° △ °|||)︴", 391 | "///////", 392 | "(害怕)咱...没有QAQ", 393 | "[CQ:at,qq={user_id}] 请你show show way ~ ", 394 | "不是喵!", 395 | "no!", 396 | "(弱弱地)呜...果咩...", 397 | "呀 ~ hentai>_<" 398 | ], 399 | "烧鸡": [ 400 | " Σ( ° △ °|||)︴", 401 | "你再这样咱就不理你了(>д<)", 402 | "...超市", 403 | "呜...", 404 | "笨蛋...(小小声)", 405 | "才不是! Σ( ° △ °|||)︴", 406 | "///////", 407 | "(害怕)咱...没有QAQ", 408 | "[CQ:at,qq={user_id}] 请你show show way ~ ", 409 | "不是喵!", 410 | "no!", 411 | "(弱弱地)呜...果咩...", 412 | "呀 ~ hentai>_<" 413 | ], 414 | "罕见": [ 415 | "嗯?", 416 | "稀有", 417 | "罕见罕见罕见见~", 418 | "罕见见(>д<)", 419 | "骂 谁 罕 见?", 420 | "呜...", 421 | "笨蛋...(小小声)", 422 | "才不是! Σ( ° △ °|||)︴", 423 | "///////", 424 | "没有...", 425 | "不是喵!", 426 | "no!" 427 | ] 428 | } 429 | -------------------------------------------------------------------------------- /nonebot_plugin_kawaii_robot/utils.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import random 3 | import re 4 | from typing import Iterable, List, Optional, TypedDict 5 | 6 | from nonebot.matcher import current_bot, current_event, current_matcher 7 | from nonebot_plugin_alconna.uniseg import At, Reply, UniMessage 8 | from nonebot_plugin_userinfo import UserInfo, get_user_info 9 | 10 | from .config import config 11 | from .const import NICKNAME, ReplyDictType 12 | 13 | SEG_SAMPLE = "{segment}" 14 | SEG_REGEX = re.compile(r"(?P[^\{])" + re.escape(SEG_SAMPLE) + r"(?P[^\}])") 15 | 16 | DEFAULT_USER_CALLING = "你" 17 | 18 | 19 | def split_seg(text: str) -> List[str]: 20 | if text.startswith(SEG_SAMPLE): 21 | text = text[len(SEG_SAMPLE) :] 22 | if text.endswith(SEG_SAMPLE): 23 | text = text[: -len(SEG_SAMPLE)] 24 | 25 | results = list(re.finditer(SEG_REGEX, text)) 26 | if not results: 27 | return [text] 28 | 29 | parts = [] 30 | last_index = 0 31 | for match in results: 32 | h = match.group("h") 33 | t = match.group("t") 34 | now_index = match.start() + (len(h) if h else 0) 35 | if now_index > last_index: 36 | parts.append(text[last_index:now_index]) 37 | last_index = match.end() - (len(t) if t else 0) 38 | 39 | if last_index < len(text): 40 | parts.append(text[last_index:]) 41 | 42 | return parts 43 | 44 | 45 | def flatten_list(li: Iterable[Iterable[str]]) -> List[str]: 46 | """ 47 | 展平二维列表 48 | """ 49 | return [x for y in li for x in y] 50 | 51 | 52 | def full_to_half(text: str) -> str: 53 | """ 54 | 全角转半角 55 | """ 56 | return "".join( 57 | chr(ord(char) - 0xFEE0) if "\uff01" <= char <= "\uff5e" else char 58 | for char in text 59 | ) 60 | 61 | 62 | def search_reply_dict(reply_dict: ReplyDictType, text: str) -> Optional[List[str]]: 63 | """ 64 | 在词库中搜索回复 65 | """ 66 | text = full_to_half(text.lower()) 67 | 68 | if config.leaf_match_pattern == 0: 69 | return reply_dict.get(text) 70 | 71 | if config.leaf_search_max > 0 and len(text) > config.leaf_search_max: 72 | return None 73 | 74 | generator = (reply_dict[key] for key in reply_dict if key in text) 75 | if config.leaf_match_pattern == 1: 76 | return next(generator, None) 77 | 78 | return flatten_list(list(generator)) or None 79 | 80 | 81 | def format_sender_username(username: Optional[str]) -> str: 82 | """ 83 | 格式化发送者的昵称,如果昵称过长则截断 84 | """ 85 | username = username or "你" 86 | if len(username) > 10: 87 | username = username[:2] + random.choice(["酱", "亲", "ちゃん", "同志", "老师"]) 88 | return username 89 | 90 | 91 | def get_username(info: UserInfo) -> str: 92 | return format_sender_username(info.user_displayname or info.user_name or "你") 93 | 94 | 95 | class BuiltInVarDict(TypedDict): 96 | user_id: str 97 | username: str 98 | message_id: Optional[str] 99 | bot_nickname: str 100 | at: At 101 | reply: Optional[Reply] 102 | 103 | 104 | def format_vars( 105 | string: str, 106 | builtin: BuiltInVarDict, 107 | **extra, 108 | ) -> List[UniMessage]: 109 | return [ 110 | UniMessage.template(seg).format(**builtin, **extra) for seg in split_seg(string) 111 | ] 112 | 113 | 114 | async def get_builtin_vars_from_ev() -> BuiltInVarDict: 115 | bot = current_bot.get() 116 | event = current_event.get() 117 | user_id = event.get_user_id() 118 | user_info = await get_user_info(bot, event, user_id) 119 | try: 120 | message_id = UniMessage.get_message_id(event=event, bot=bot) 121 | except Exception: 122 | message_id = None 123 | return { 124 | "user_id": user_id, 125 | "username": get_username(user_info) if user_info else DEFAULT_USER_CALLING, 126 | "message_id": message_id, 127 | "bot_nickname": NICKNAME, 128 | "at": At("user", user_id), 129 | "reply": Reply(message_id) if message_id else None, 130 | } 131 | 132 | 133 | async def choice_reply_from_ev(reply_list: List[str], **kwargs) -> List[UniMessage]: 134 | """ 135 | 从提供的回复列表中随机选择一条回复并格式化 136 | """ 137 | raw_reply = random.choice(reply_list) 138 | return format_vars(raw_reply, await get_builtin_vars_from_ev(), **kwargs) 139 | 140 | 141 | def check_percentage(need_percent: float, percentage: Optional[float] = None) -> bool: 142 | """ 143 | 检查概率 144 | """ 145 | if need_percent <= 0: 146 | return False 147 | if need_percent >= 100: 148 | return True 149 | 150 | if not percentage: 151 | percentage = random.random() * 100 152 | return percentage <= need_percent 153 | 154 | 155 | async def finish_multi_msg(msg_list: List[UniMessage]): 156 | first_msg = msg_list.pop(0) 157 | await first_msg.send() 158 | 159 | for msg in msg_list: 160 | await asyncio.sleep(random.uniform(*config.leaf_multi_reply_delay)) 161 | await msg.send() 162 | 163 | await current_matcher.get().finish() 164 | -------------------------------------------------------------------------------- /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:9cb876d4e986ed6af01a473de94946bc4045a2c29739c93bb3f2ef6a0075af09" 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 = "arclet-alconna" 46 | version = "1.8.35" 47 | requires_python = ">=3.9" 48 | summary = "A High-performance, Generality, Humane Command Line Arguments Parser Library." 49 | groups = ["default"] 50 | dependencies = [ 51 | "nepattern<1.0.0,>=0.7.7", 52 | "tarina<0.7.0,>=0.6.1", 53 | "typing-extensions>=4.5.0", 54 | ] 55 | files = [ 56 | {file = "arclet_alconna-1.8.35-py3-none-any.whl", hash = "sha256:95d8aaf079167b24e158a0c5125dc17c671da129969dcc5f8b79a9cc72b6389c"}, 57 | {file = "arclet_alconna-1.8.35.tar.gz", hash = "sha256:0cdb7fbdd154110ed7fb79e2b281df6c5fc87861770301f1c0cf8af594ee95f3"}, 58 | ] 59 | 60 | [[package]] 61 | name = "arclet-alconna-tools" 62 | version = "0.7.10" 63 | requires_python = ">=3.9" 64 | summary = "Builtin Tools for Alconna" 65 | groups = ["default"] 66 | dependencies = [ 67 | "arclet-alconna>=1.8.31", 68 | "nepattern<1.0.0,>=0.7.3", 69 | ] 70 | files = [ 71 | {file = "arclet_alconna_tools-0.7.10-py3-none-any.whl", hash = "sha256:50e8b2f433fbc612dc8b99f4f5410006dcb1ef406c971c795071117a4eab8e20"}, 72 | {file = "arclet_alconna_tools-0.7.10.tar.gz", hash = "sha256:446a63a9c56886c23fb44548bb9a18655e0ba5b5dd80cc87915b858dfb02554c"}, 73 | ] 74 | 75 | [[package]] 76 | name = "cachetools" 77 | version = "5.5.1" 78 | requires_python = ">=3.7" 79 | summary = "Extensible memoizing collections and decorators" 80 | groups = ["default"] 81 | files = [ 82 | {file = "cachetools-5.5.1-py3-none-any.whl", hash = "sha256:b76651fdc3b24ead3c648bbdeeb940c1b04d365b38b4af66788f9ec4a81d42bb"}, 83 | {file = "cachetools-5.5.1.tar.gz", hash = "sha256:70f238fbba50383ef62e55c6aff6d9673175fe59f7c6782c7a0b9e38f4a9df95"}, 84 | ] 85 | 86 | [[package]] 87 | name = "certifi" 88 | version = "2025.1.31" 89 | requires_python = ">=3.6" 90 | summary = "Python package for providing Mozilla's CA Bundle." 91 | groups = ["default"] 92 | files = [ 93 | {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, 94 | {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, 95 | ] 96 | 97 | [[package]] 98 | name = "colorama" 99 | version = "0.4.6" 100 | requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 101 | summary = "Cross-platform colored terminal text." 102 | groups = ["default"] 103 | marker = "sys_platform == \"win32\"" 104 | files = [ 105 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 106 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 107 | ] 108 | 109 | [[package]] 110 | name = "cookit" 111 | version = "0.9.3" 112 | requires_python = "<4.0,>=3.9" 113 | summary = "A toolkit for self use." 114 | groups = ["default"] 115 | dependencies = [ 116 | "typing-extensions>=4.12.2", 117 | ] 118 | files = [ 119 | {file = "cookit-0.9.3-py3-none-any.whl", hash = "sha256:bcda202f9b6bbc7739ee613a5742b2189cb134d73e54dd61178881676b431dbf"}, 120 | {file = "cookit-0.9.3.tar.gz", hash = "sha256:68e6fce24bc7c0481b0aefb41e517b5c8744e371d87fe2a89c627c006a7b1ea8"}, 121 | ] 122 | 123 | [[package]] 124 | name = "cookit" 125 | version = "0.9.3" 126 | extras = ["pydantic"] 127 | requires_python = "<4.0,>=3.9" 128 | summary = "A toolkit for self use." 129 | groups = ["default"] 130 | dependencies = [ 131 | "cookit==0.9.3", 132 | "pydantic!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0", 133 | ] 134 | files = [ 135 | {file = "cookit-0.9.3-py3-none-any.whl", hash = "sha256:bcda202f9b6bbc7739ee613a5742b2189cb134d73e54dd61178881676b431dbf"}, 136 | {file = "cookit-0.9.3.tar.gz", hash = "sha256:68e6fce24bc7c0481b0aefb41e517b5c8744e371d87fe2a89c627c006a7b1ea8"}, 137 | ] 138 | 139 | [[package]] 140 | name = "emoji" 141 | version = "2.14.1" 142 | requires_python = ">=3.7" 143 | summary = "Emoji for Python" 144 | groups = ["default"] 145 | dependencies = [ 146 | "typing-extensions>=4.7.0; python_version < \"3.9\"", 147 | ] 148 | files = [ 149 | {file = "emoji-2.14.1-py3-none-any.whl", hash = "sha256:35a8a486c1460addb1499e3bf7929d3889b2e2841a57401903699fef595e942b"}, 150 | {file = "emoji-2.14.1.tar.gz", hash = "sha256:f8c50043d79a2c1410ebfae833ae1868d5941a67a6cd4d18377e2eb0bd79346b"}, 151 | ] 152 | 153 | [[package]] 154 | name = "exceptiongroup" 155 | version = "1.2.2" 156 | requires_python = ">=3.7" 157 | summary = "Backport of PEP 654 (exception groups)" 158 | groups = ["default"] 159 | files = [ 160 | {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, 161 | {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, 162 | ] 163 | 164 | [[package]] 165 | name = "h11" 166 | version = "0.14.0" 167 | requires_python = ">=3.7" 168 | summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 169 | groups = ["default"] 170 | dependencies = [ 171 | "typing-extensions; python_version < \"3.8\"", 172 | ] 173 | files = [ 174 | {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, 175 | {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, 176 | ] 177 | 178 | [[package]] 179 | name = "httpcore" 180 | version = "1.0.7" 181 | requires_python = ">=3.8" 182 | summary = "A minimal low-level HTTP client." 183 | groups = ["default"] 184 | dependencies = [ 185 | "certifi", 186 | "h11<0.15,>=0.13", 187 | ] 188 | files = [ 189 | {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, 190 | {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, 191 | ] 192 | 193 | [[package]] 194 | name = "httpx" 195 | version = "0.28.1" 196 | requires_python = ">=3.8" 197 | summary = "The next generation HTTP client." 198 | groups = ["default"] 199 | dependencies = [ 200 | "anyio", 201 | "certifi", 202 | "httpcore==1.*", 203 | "idna", 204 | ] 205 | files = [ 206 | {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, 207 | {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, 208 | ] 209 | 210 | [[package]] 211 | name = "idna" 212 | version = "3.10" 213 | requires_python = ">=3.6" 214 | summary = "Internationalized Domain Names in Applications (IDNA)" 215 | groups = ["default"] 216 | files = [ 217 | {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, 218 | {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, 219 | ] 220 | 221 | [[package]] 222 | name = "importlib-metadata" 223 | version = "8.6.1" 224 | requires_python = ">=3.9" 225 | summary = "Read metadata from Python packages" 226 | groups = ["default"] 227 | dependencies = [ 228 | "typing-extensions>=3.6.4; python_version < \"3.8\"", 229 | "zipp>=3.20", 230 | ] 231 | files = [ 232 | {file = "importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e"}, 233 | {file = "importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580"}, 234 | ] 235 | 236 | [[package]] 237 | name = "loguru" 238 | version = "0.7.3" 239 | requires_python = "<4.0,>=3.5" 240 | summary = "Python logging made (stupidly) simple" 241 | groups = ["default"] 242 | dependencies = [ 243 | "aiocontextvars>=0.2.0; python_version < \"3.7\"", 244 | "colorama>=0.3.4; sys_platform == \"win32\"", 245 | "win32-setctime>=1.0.0; sys_platform == \"win32\"", 246 | ] 247 | files = [ 248 | {file = "loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c"}, 249 | {file = "loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6"}, 250 | ] 251 | 252 | [[package]] 253 | name = "multidict" 254 | version = "6.1.0" 255 | requires_python = ">=3.8" 256 | summary = "multidict implementation" 257 | groups = ["default"] 258 | dependencies = [ 259 | "typing-extensions>=4.1.0; python_version < \"3.11\"", 260 | ] 261 | files = [ 262 | {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60"}, 263 | {file = "multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1"}, 264 | {file = "multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53"}, 265 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5"}, 266 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581"}, 267 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56"}, 268 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429"}, 269 | {file = "multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748"}, 270 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db"}, 271 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056"}, 272 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76"}, 273 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160"}, 274 | {file = "multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7"}, 275 | {file = "multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0"}, 276 | {file = "multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d"}, 277 | {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6"}, 278 | {file = "multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156"}, 279 | {file = "multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb"}, 280 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b"}, 281 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72"}, 282 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304"}, 283 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351"}, 284 | {file = "multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb"}, 285 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3"}, 286 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399"}, 287 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423"}, 288 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3"}, 289 | {file = "multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753"}, 290 | {file = "multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80"}, 291 | {file = "multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926"}, 292 | {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa"}, 293 | {file = "multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436"}, 294 | {file = "multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761"}, 295 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e"}, 296 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef"}, 297 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95"}, 298 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925"}, 299 | {file = "multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966"}, 300 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305"}, 301 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2"}, 302 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2"}, 303 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6"}, 304 | {file = "multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3"}, 305 | {file = "multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133"}, 306 | {file = "multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1"}, 307 | {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d569388c381b24671589335a3be6e1d45546c2988c2ebe30fdcada8457a31008"}, 308 | {file = "multidict-6.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:052e10d2d37810b99cc170b785945421141bf7bb7d2f8799d431e7db229c385f"}, 309 | {file = "multidict-6.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f90c822a402cb865e396a504f9fc8173ef34212a342d92e362ca498cad308e28"}, 310 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b225d95519a5bf73860323e633a664b0d85ad3d5bede6d30d95b35d4dfe8805b"}, 311 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:23bfd518810af7de1116313ebd9092cb9aa629beb12f6ed631ad53356ed6b86c"}, 312 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c09fcfdccdd0b57867577b719c69e347a436b86cd83747f179dbf0cc0d4c1f3"}, 313 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf6bea52ec97e95560af5ae576bdac3aa3aae0b6758c6efa115236d9e07dae44"}, 314 | {file = "multidict-6.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57feec87371dbb3520da6192213c7d6fc892d5589a93db548331954de8248fd2"}, 315 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0c3f390dc53279cbc8ba976e5f8035eab997829066756d811616b652b00a23a3"}, 316 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:59bfeae4b25ec05b34f1956eaa1cb38032282cd4dfabc5056d0a1ec4d696d3aa"}, 317 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b2f59caeaf7632cc633b5cf6fc449372b83bbdf0da4ae04d5be36118e46cc0aa"}, 318 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:37bb93b2178e02b7b618893990941900fd25b6b9ac0fa49931a40aecdf083fe4"}, 319 | {file = "multidict-6.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4e9f48f58c2c523d5a06faea47866cd35b32655c46b443f163d08c6d0ddb17d6"}, 320 | {file = "multidict-6.1.0-cp313-cp313-win32.whl", hash = "sha256:3a37ffb35399029b45c6cc33640a92bef403c9fd388acce75cdc88f58bd19a81"}, 321 | {file = "multidict-6.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e9aa71e15d9d9beaad2c6b9319edcdc0a49a43ef5c0a4c8265ca9ee7d6c67774"}, 322 | {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4e18b656c5e844539d506a0a06432274d7bd52a7487e6828c63a63d69185626c"}, 323 | {file = "multidict-6.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a185f876e69897a6f3325c3f19f26a297fa058c5e456bfcff8015e9a27e83ae1"}, 324 | {file = "multidict-6.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ab7c4ceb38d91570a650dba194e1ca87c2b543488fe9309b4212694174fd539c"}, 325 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e617fb6b0b6953fffd762669610c1c4ffd05632c138d61ac7e14ad187870669c"}, 326 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16e5f4bf4e603eb1fdd5d8180f1a25f30056f22e55ce51fb3d6ad4ab29f7d96f"}, 327 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c035da3f544b1882bac24115f3e2e8760f10a0107614fc9839fd232200b875"}, 328 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:957cf8e4b6e123a9eea554fa7ebc85674674b713551de587eb318a2df3e00255"}, 329 | {file = "multidict-6.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483a6aea59cb89904e1ceabd2b47368b5600fb7de78a6e4a2c2987b2d256cf30"}, 330 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:87701f25a2352e5bf7454caa64757642734da9f6b11384c1f9d1a8e699758057"}, 331 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:682b987361e5fd7a139ed565e30d81fd81e9629acc7d925a205366877d8c8657"}, 332 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce2186a7df133a9c895dea3331ddc5ddad42cdd0d1ea2f0a51e5d161e4762f28"}, 333 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9f636b730f7e8cb19feb87094949ba54ee5357440b9658b2a32a5ce4bce53972"}, 334 | {file = "multidict-6.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:73eae06aa53af2ea5270cc066dcaf02cc60d2994bbb2c4ef5764949257d10f43"}, 335 | {file = "multidict-6.1.0-cp39-cp39-win32.whl", hash = "sha256:1ca0083e80e791cffc6efce7660ad24af66c8d4079d2a750b29001b53ff59ada"}, 336 | {file = "multidict-6.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:aa466da5b15ccea564bdab9c89175c762bc12825f4659c11227f515cee76fa4a"}, 337 | {file = "multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506"}, 338 | {file = "multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a"}, 339 | ] 340 | 341 | [[package]] 342 | name = "nepattern" 343 | version = "0.7.7" 344 | requires_python = ">=3.8" 345 | summary = "a complex pattern, support typing" 346 | groups = ["default"] 347 | dependencies = [ 348 | "tarina>=0.5.1", 349 | "typing-extensions>=4.5.0", 350 | ] 351 | files = [ 352 | {file = "nepattern-0.7.7-py3-none-any.whl", hash = "sha256:2d66f964333f42df7971390da4fb98dfed1e8b769236f305c28a83c0bcda849a"}, 353 | {file = "nepattern-0.7.7.tar.gz", hash = "sha256:6667f888457e78937998f9412eb70ad16d220464d2d77850dd2b05e9ecfb3207"}, 354 | ] 355 | 356 | [[package]] 357 | name = "nonebot-plugin-alconna" 358 | version = "0.54.2" 359 | requires_python = ">=3.9" 360 | summary = "Alconna Adapter for Nonebot" 361 | groups = ["default"] 362 | dependencies = [ 363 | "arclet-alconna-tools>=0.7.10", 364 | "arclet-alconna<2.0,>=1.8.35", 365 | "importlib-metadata>=4.13.0", 366 | "nepattern<1.0,>=0.7.7", 367 | "nonebot-plugin-waiter>=0.6.0", 368 | "nonebot2>=2.3.0", 369 | "tarina<0.7,>=0.6.8", 370 | ] 371 | files = [ 372 | {file = "nonebot_plugin_alconna-0.54.2-py3-none-any.whl", hash = "sha256:ab9a1a5f0f8c9a30ba57a49bed5d3e9c3f761ea5954cbafb15bcd2aa9c7d5507"}, 373 | {file = "nonebot_plugin_alconna-0.54.2.tar.gz", hash = "sha256:0216da3bc2e5f8b4c4c44c2701f8f0a536d35ea0db79e708cc2ecd002b57ace6"}, 374 | ] 375 | 376 | [[package]] 377 | name = "nonebot-plugin-session" 378 | version = "0.3.2" 379 | requires_python = "<4.0,>=3.9" 380 | summary = "Nonebot2 会话信息提取与会话id定义" 381 | groups = ["default"] 382 | dependencies = [ 383 | "nonebot2<3.0.0,>=2.3.0", 384 | "strenum<0.5.0,>=0.4.15", 385 | ] 386 | files = [ 387 | {file = "nonebot_plugin_session-0.3.2-py3-none-any.whl", hash = "sha256:785e74ff656e46d84c4dbbac125f9a9adebcc4b9ff7db700527e6e47d47aabd6"}, 388 | {file = "nonebot_plugin_session-0.3.2.tar.gz", hash = "sha256:da0dabe9108151052a6e83d9923068d2ec43a93810ad37b264ed65aee2c69f93"}, 389 | ] 390 | 391 | [[package]] 392 | name = "nonebot-plugin-userinfo" 393 | version = "0.2.6" 394 | requires_python = "<4.0,>=3.9" 395 | summary = "Nonebot2 用户信息获取插件" 396 | groups = ["default"] 397 | dependencies = [ 398 | "cachetools<6.0.0,>=5.0.0", 399 | "emoji<3.0.0,>=2.0.0", 400 | "httpx<1.0.0,>=0.20.0", 401 | "nonebot2<3.0.0,>=2.3.0", 402 | "strenum<0.5.0,>=0.4.15", 403 | ] 404 | files = [ 405 | {file = "nonebot_plugin_userinfo-0.2.6-py3-none-any.whl", hash = "sha256:79d2481af08a5ec77cf171c685eecd14eaf1ce4d5a1ec1fd22fbb0b85e06c260"}, 406 | {file = "nonebot_plugin_userinfo-0.2.6.tar.gz", hash = "sha256:0d1ce897e94a9d4c0b5300bc8f239a4676f9bb62c78a14e0f0527e5398ffc840"}, 407 | ] 408 | 409 | [[package]] 410 | name = "nonebot-plugin-waiter" 411 | version = "0.8.1" 412 | requires_python = ">=3.9" 413 | summary = "An alternative for got-and-reject in Nonebot" 414 | groups = ["default"] 415 | dependencies = [ 416 | "nonebot2>=2.3.0", 417 | ] 418 | files = [ 419 | {file = "nonebot_plugin_waiter-0.8.1-py3-none-any.whl", hash = "sha256:3e1afc8f134496d3a4ecefd9c3a2a98d6ef28a5318268cb22b99a0ef61a44080"}, 420 | {file = "nonebot_plugin_waiter-0.8.1.tar.gz", hash = "sha256:5e54213dfea1fd8a1e20dbe6d93b7881f35cbeedf80005148cdc39c1fd2ccc0f"}, 421 | ] 422 | 423 | [[package]] 424 | name = "nonebot2" 425 | version = "2.4.1" 426 | requires_python = "<4.0,>=3.9" 427 | summary = "An asynchronous python bot framework." 428 | groups = ["default"] 429 | dependencies = [ 430 | "anyio<5.0.0,>=4.4.0", 431 | "exceptiongroup<2.0.0,>=1.2.2", 432 | "loguru<1.0.0,>=0.6.0", 433 | "pydantic!=2.10.0,!=2.10.1,!=2.5.0,!=2.5.1,<3.0.0,>=1.10.0", 434 | "pygtrie<3.0.0,>=2.4.1", 435 | "python-dotenv<2.0.0,>=0.21.0", 436 | "tomli<3.0.0,>=2.0.1; python_version < \"3.11\"", 437 | "typing-extensions<5.0.0,>=4.4.0", 438 | "yarl<2.0.0,>=1.7.2", 439 | ] 440 | files = [ 441 | {file = "nonebot2-2.4.1-py3-none-any.whl", hash = "sha256:fec95f075efc89dbe9ce148618b413b02f46ba284200367749b035e794695111"}, 442 | {file = "nonebot2-2.4.1.tar.gz", hash = "sha256:8fea364318501ed79721403a8ecd76587bc884d58c356260f691a8bbda9b05e6"}, 443 | ] 444 | 445 | [[package]] 446 | name = "propcache" 447 | version = "0.2.1" 448 | requires_python = ">=3.9" 449 | summary = "Accelerated property cache" 450 | groups = ["default"] 451 | files = [ 452 | {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6b3f39a85d671436ee3d12c017f8fdea38509e4f25b28eb25877293c98c243f6"}, 453 | {file = "propcache-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d51fbe4285d5db5d92a929e3e21536ea3dd43732c5b177c7ef03f918dff9f2"}, 454 | {file = "propcache-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6445804cf4ec763dc70de65a3b0d9954e868609e83850a47ca4f0cb64bd79fea"}, 455 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9479aa06a793c5aeba49ce5c5692ffb51fcd9a7016e017d555d5e2b0045d212"}, 456 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9631c5e8b5b3a0fda99cb0d29c18133bca1e18aea9effe55adb3da1adef80d3"}, 457 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3156628250f46a0895f1f36e1d4fbe062a1af8718ec3ebeb746f1d23f0c5dc4d"}, 458 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b6fb63ae352e13748289f04f37868099e69dba4c2b3e271c46061e82c745634"}, 459 | {file = "propcache-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:887d9b0a65404929641a9fabb6452b07fe4572b269d901d622d8a34a4e9043b2"}, 460 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a96dc1fa45bd8c407a0af03b2d5218392729e1822b0c32e62c5bf7eeb5fb3958"}, 461 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a7e65eb5c003a303b94aa2c3852ef130230ec79e349632d030e9571b87c4698c"}, 462 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:999779addc413181912e984b942fbcc951be1f5b3663cd80b2687758f434c583"}, 463 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:19a0f89a7bb9d8048d9c4370c9c543c396e894c76be5525f5e1ad287f1750ddf"}, 464 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1ac2f5fe02fa75f56e1ad473f1175e11f475606ec9bd0be2e78e4734ad575034"}, 465 | {file = "propcache-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:574faa3b79e8ebac7cb1d7930f51184ba1ccf69adfdec53a12f319a06030a68b"}, 466 | {file = "propcache-0.2.1-cp310-cp310-win32.whl", hash = "sha256:03ff9d3f665769b2a85e6157ac8b439644f2d7fd17615a82fa55739bc97863f4"}, 467 | {file = "propcache-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2d3af2e79991102678f53e0dbf4c35de99b6b8b58f29a27ca0325816364caaba"}, 468 | {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ffc3cca89bb438fb9c95c13fc874012f7b9466b89328c3c8b1aa93cdcfadd16"}, 469 | {file = "propcache-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f174bbd484294ed9fdf09437f889f95807e5f229d5d93588d34e92106fbf6717"}, 470 | {file = "propcache-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:70693319e0b8fd35dd863e3e29513875eb15c51945bf32519ef52927ca883bc3"}, 471 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b480c6a4e1138e1aa137c0079b9b6305ec6dcc1098a8ca5196283e8a49df95a9"}, 472 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d27b84d5880f6d8aa9ae3edb253c59d9f6642ffbb2c889b78b60361eed449787"}, 473 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:857112b22acd417c40fa4595db2fe28ab900c8c5fe4670c7989b1c0230955465"}, 474 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf6c4150f8c0e32d241436526f3c3f9cbd34429492abddbada2ffcff506c51af"}, 475 | {file = "propcache-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66d4cfda1d8ed687daa4bc0274fcfd5267873db9a5bc0418c2da19273040eeb7"}, 476 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2f992c07c0fca81655066705beae35fc95a2fa7366467366db627d9f2ee097f"}, 477 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4a571d97dbe66ef38e472703067021b1467025ec85707d57e78711c085984e54"}, 478 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb6178c241278d5fe853b3de743087be7f5f4c6f7d6d22a3b524d323eecec505"}, 479 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad1af54a62ffe39cf34db1aa6ed1a1873bd548f6401db39d8e7cd060b9211f82"}, 480 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e7048abd75fe40712005bcfc06bb44b9dfcd8e101dda2ecf2f5aa46115ad07ca"}, 481 | {file = "propcache-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:160291c60081f23ee43d44b08a7e5fb76681221a8e10b3139618c5a9a291b84e"}, 482 | {file = "propcache-0.2.1-cp311-cp311-win32.whl", hash = "sha256:819ce3b883b7576ca28da3861c7e1a88afd08cc8c96908e08a3f4dd64a228034"}, 483 | {file = "propcache-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:edc9fc7051e3350643ad929df55c451899bb9ae6d24998a949d2e4c87fb596d3"}, 484 | {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:081a430aa8d5e8876c6909b67bd2d937bfd531b0382d3fdedb82612c618bc41a"}, 485 | {file = "propcache-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d2ccec9ac47cf4e04897619c0e0c1a48c54a71bdf045117d3a26f80d38ab1fb0"}, 486 | {file = "propcache-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:14d86fe14b7e04fa306e0c43cdbeebe6b2c2156a0c9ce56b815faacc193e320d"}, 487 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:049324ee97bb67285b49632132db351b41e77833678432be52bdd0289c0e05e4"}, 488 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd9a1d071158de1cc1c71a26014dcdfa7dd3d5f4f88c298c7f90ad6f27bb46d"}, 489 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98110aa363f1bb4c073e8dcfaefd3a5cea0f0834c2aab23dda657e4dab2f53b5"}, 490 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:647894f5ae99c4cf6bb82a1bb3a796f6e06af3caa3d32e26d2350d0e3e3faf24"}, 491 | {file = "propcache-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd3223c15bebe26518d58ccf9a39b93948d3dcb3e57a20480dfdd315356baff"}, 492 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d71264a80f3fcf512eb4f18f59423fe82d6e346ee97b90625f283df56aee103f"}, 493 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e73091191e4280403bde6c9a52a6999d69cdfde498f1fdf629105247599b57ec"}, 494 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3935bfa5fede35fb202c4b569bb9c042f337ca4ff7bd540a0aa5e37131659348"}, 495 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f508b0491767bb1f2b87fdfacaba5f7eddc2f867740ec69ece6d1946d29029a6"}, 496 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1672137af7c46662a1c2be1e8dc78cb6d224319aaa40271c9257d886be4363a6"}, 497 | {file = "propcache-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b74c261802d3d2b85c9df2dfb2fa81b6f90deeef63c2db9f0e029a3cac50b518"}, 498 | {file = "propcache-0.2.1-cp312-cp312-win32.whl", hash = "sha256:d09c333d36c1409d56a9d29b3a1b800a42c76a57a5a8907eacdbce3f18768246"}, 499 | {file = "propcache-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:c214999039d4f2a5b2073ac506bba279945233da8c786e490d411dfc30f855c1"}, 500 | {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aca405706e0b0a44cc6bfd41fbe89919a6a56999157f6de7e182a990c36e37bc"}, 501 | {file = "propcache-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:12d1083f001ace206fe34b6bdc2cb94be66d57a850866f0b908972f90996b3e9"}, 502 | {file = "propcache-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d93f3307ad32a27bda2e88ec81134b823c240aa3abb55821a8da553eed8d9439"}, 503 | {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba278acf14471d36316159c94a802933d10b6a1e117b8554fe0d0d9b75c9d536"}, 504 | {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e6281aedfca15301c41f74d7005e6e3f4ca143584ba696ac69df4f02f40d629"}, 505 | {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5b750a8e5a1262434fb1517ddf64b5de58327f1adc3524a5e44c2ca43305eb0b"}, 506 | {file = "propcache-0.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf72af5e0fb40e9babf594308911436c8efde3cb5e75b6f206c34ad18be5c052"}, 507 | {file = "propcache-0.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2d0a12018b04f4cb820781ec0dffb5f7c7c1d2a5cd22bff7fb055a2cb19ebce"}, 508 | {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e800776a79a5aabdb17dcc2346a7d66d0777e942e4cd251defeb084762ecd17d"}, 509 | {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:4160d9283bd382fa6c0c2b5e017acc95bc183570cd70968b9202ad6d8fc48dce"}, 510 | {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:30b43e74f1359353341a7adb783c8f1b1c676367b011709f466f42fda2045e95"}, 511 | {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:58791550b27d5488b1bb52bc96328456095d96206a250d28d874fafe11b3dfaf"}, 512 | {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0f022d381747f0dfe27e99d928e31bc51a18b65bb9e481ae0af1380a6725dd1f"}, 513 | {file = "propcache-0.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:297878dc9d0a334358f9b608b56d02e72899f3b8499fc6044133f0d319e2ec30"}, 514 | {file = "propcache-0.2.1-cp313-cp313-win32.whl", hash = "sha256:ddfab44e4489bd79bda09d84c430677fc7f0a4939a73d2bba3073036f487a0a6"}, 515 | {file = "propcache-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:556fc6c10989f19a179e4321e5d678db8eb2924131e64652a51fe83e4c3db0e1"}, 516 | {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6a9a8c34fb7bb609419a211e59da8887eeca40d300b5ea8e56af98f6fbbb1541"}, 517 | {file = "propcache-0.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae1aa1cd222c6d205853b3013c69cd04515f9d6ab6de4b0603e2e1c33221303e"}, 518 | {file = "propcache-0.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:accb6150ce61c9c4b7738d45550806aa2b71c7668c6942f17b0ac182b6142fd4"}, 519 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5eee736daafa7af6d0a2dc15cc75e05c64f37fc37bafef2e00d77c14171c2097"}, 520 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7a31fc1e1bd362874863fdeed71aed92d348f5336fd84f2197ba40c59f061bd"}, 521 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba4cfa1052819d16699e1d55d18c92b6e094d4517c41dd231a8b9f87b6fa681"}, 522 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f089118d584e859c62b3da0892b88a83d611c2033ac410e929cb6754eec0ed16"}, 523 | {file = "propcache-0.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:781e65134efaf88feb447e8c97a51772aa75e48b794352f94cb7ea717dedda0d"}, 524 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:31f5af773530fd3c658b32b6bdc2d0838543de70eb9a2156c03e410f7b0d3aae"}, 525 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:a7a078f5d37bee6690959c813977da5291b24286e7b962e62a94cec31aa5188b"}, 526 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cea7daf9fc7ae6687cf1e2c049752f19f146fdc37c2cc376e7d0032cf4f25347"}, 527 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:8b3489ff1ed1e8315674d0775dc7d2195fb13ca17b3808721b54dbe9fd020faf"}, 528 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:9403db39be1393618dd80c746cb22ccda168efce239c73af13c3763ef56ffc04"}, 529 | {file = "propcache-0.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5d97151bc92d2b2578ff7ce779cdb9174337390a535953cbb9452fb65164c587"}, 530 | {file = "propcache-0.2.1-cp39-cp39-win32.whl", hash = "sha256:9caac6b54914bdf41bcc91e7eb9147d331d29235a7c967c150ef5df6464fd1bb"}, 531 | {file = "propcache-0.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:92fc4500fcb33899b05ba73276dfb684a20d31caa567b7cb5252d48f896a91b1"}, 532 | {file = "propcache-0.2.1-py3-none-any.whl", hash = "sha256:52277518d6aae65536e9cea52d4e7fd2f7a66f4aa2d30ed3f2fcea620ace3c54"}, 533 | {file = "propcache-0.2.1.tar.gz", hash = "sha256:3f77ce728b19cb537714499928fe800c3dda29e8d9428778fc7c186da4c09a64"}, 534 | ] 535 | 536 | [[package]] 537 | name = "pydantic" 538 | version = "2.10.6" 539 | requires_python = ">=3.8" 540 | summary = "Data validation using Python type hints" 541 | groups = ["default"] 542 | dependencies = [ 543 | "annotated-types>=0.6.0", 544 | "pydantic-core==2.27.2", 545 | "typing-extensions>=4.12.2", 546 | ] 547 | files = [ 548 | {file = "pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584"}, 549 | {file = "pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236"}, 550 | ] 551 | 552 | [[package]] 553 | name = "pydantic-core" 554 | version = "2.27.2" 555 | requires_python = ">=3.8" 556 | summary = "Core functionality for Pydantic validation and serialization" 557 | groups = ["default"] 558 | dependencies = [ 559 | "typing-extensions!=4.7.0,>=4.6.0", 560 | ] 561 | files = [ 562 | {file = "pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa"}, 563 | {file = "pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c"}, 564 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a"}, 565 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5"}, 566 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c"}, 567 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7"}, 568 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a"}, 569 | {file = "pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236"}, 570 | {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962"}, 571 | {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9"}, 572 | {file = "pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af"}, 573 | {file = "pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4"}, 574 | {file = "pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31"}, 575 | {file = "pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc"}, 576 | {file = "pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7"}, 577 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15"}, 578 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306"}, 579 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99"}, 580 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459"}, 581 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048"}, 582 | {file = "pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d"}, 583 | {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b"}, 584 | {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474"}, 585 | {file = "pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6"}, 586 | {file = "pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c"}, 587 | {file = "pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc"}, 588 | {file = "pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4"}, 589 | {file = "pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0"}, 590 | {file = "pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef"}, 591 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7"}, 592 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934"}, 593 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6"}, 594 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c"}, 595 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2"}, 596 | {file = "pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4"}, 597 | {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3"}, 598 | {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4"}, 599 | {file = "pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57"}, 600 | {file = "pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc"}, 601 | {file = "pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9"}, 602 | {file = "pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b"}, 603 | {file = "pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b"}, 604 | {file = "pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154"}, 605 | {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9"}, 606 | {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9"}, 607 | {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1"}, 608 | {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a"}, 609 | {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e"}, 610 | {file = "pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4"}, 611 | {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27"}, 612 | {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee"}, 613 | {file = "pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1"}, 614 | {file = "pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130"}, 615 | {file = "pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee"}, 616 | {file = "pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b"}, 617 | {file = "pydantic_core-2.27.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993"}, 618 | {file = "pydantic_core-2.27.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308"}, 619 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4"}, 620 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf"}, 621 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76"}, 622 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118"}, 623 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630"}, 624 | {file = "pydantic_core-2.27.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54"}, 625 | {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f"}, 626 | {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362"}, 627 | {file = "pydantic_core-2.27.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96"}, 628 | {file = "pydantic_core-2.27.2-cp39-cp39-win32.whl", hash = "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e"}, 629 | {file = "pydantic_core-2.27.2-cp39-cp39-win_amd64.whl", hash = "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67"}, 630 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e"}, 631 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8"}, 632 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3"}, 633 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f"}, 634 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133"}, 635 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc"}, 636 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50"}, 637 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9"}, 638 | {file = "pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151"}, 639 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656"}, 640 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278"}, 641 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb"}, 642 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd"}, 643 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc"}, 644 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b"}, 645 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b"}, 646 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2"}, 647 | {file = "pydantic_core-2.27.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35"}, 648 | {file = "pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39"}, 649 | ] 650 | 651 | [[package]] 652 | name = "pygtrie" 653 | version = "2.5.0" 654 | summary = "A pure Python trie data structure implementation." 655 | groups = ["default"] 656 | files = [ 657 | {file = "pygtrie-2.5.0-py3-none-any.whl", hash = "sha256:8795cda8105493d5ae159a5bef313ff13156c5d4d72feddefacaad59f8c8ce16"}, 658 | {file = "pygtrie-2.5.0.tar.gz", hash = "sha256:203514ad826eb403dab1d2e2ddd034e0d1534bbe4dbe0213bb0593f66beba4e2"}, 659 | ] 660 | 661 | [[package]] 662 | name = "python-dotenv" 663 | version = "1.0.1" 664 | requires_python = ">=3.8" 665 | summary = "Read key-value pairs from a .env file and set them as environment variables" 666 | groups = ["default"] 667 | files = [ 668 | {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, 669 | {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, 670 | ] 671 | 672 | [[package]] 673 | name = "sniffio" 674 | version = "1.3.1" 675 | requires_python = ">=3.7" 676 | summary = "Sniff out which async library your code is running under" 677 | groups = ["default"] 678 | files = [ 679 | {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, 680 | {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, 681 | ] 682 | 683 | [[package]] 684 | name = "strenum" 685 | version = "0.4.15" 686 | summary = "An Enum that inherits from str." 687 | groups = ["default"] 688 | files = [ 689 | {file = "StrEnum-0.4.15-py3-none-any.whl", hash = "sha256:a30cda4af7cc6b5bf52c8055bc4bf4b2b6b14a93b574626da33df53cf7740659"}, 690 | {file = "StrEnum-0.4.15.tar.gz", hash = "sha256:878fb5ab705442070e4dd1929bb5e2249511c0bcf2b0eeacf3bcd80875c82eff"}, 691 | ] 692 | 693 | [[package]] 694 | name = "tarina" 695 | version = "0.6.8" 696 | requires_python = ">=3.9" 697 | summary = "A collection of common utils for Arclet" 698 | groups = ["default"] 699 | dependencies = [ 700 | "typing-extensions>=4.4.0", 701 | ] 702 | files = [ 703 | {file = "tarina-0.6.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a2f7b7e61912a020d6ba3c591c4edbc31bb468544640bd814470c69a07dcc4cd"}, 704 | {file = "tarina-0.6.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1cac7cbd49317b8e63eba7d0ce0ba11e1218ab51c9d6ee9df8404b5e226db15b"}, 705 | {file = "tarina-0.6.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69d9923d888948ccc9d20a191ab1f6ff2bc097f4154b6a3780c45dc78ae047cd"}, 706 | {file = "tarina-0.6.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b0f12395301584e0d56c7edd6118c5b5732b456067735ee7f0800575d5d490f"}, 707 | {file = "tarina-0.6.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84bd95b18c7f6a55606b0071654137b98f70faf5d12343d361377cf0d81ecde6"}, 708 | {file = "tarina-0.6.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94e6ee4df273e1fd3eaf36de7c78a93dde08bf2ad67526122afab1b077e344d9"}, 709 | {file = "tarina-0.6.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7afc1a8a11983f39cce18ad7f8d27601c4d34b1ffe1a1aca2a59b4111d181d01"}, 710 | {file = "tarina-0.6.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0f74dc96979b774d7e23b964886137f7cf5f58cb2d652c23c3e2d42c1ad39a9"}, 711 | {file = "tarina-0.6.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3493d59ef19d1ded232e7a33e52c7d6ebfff66f30ac4c3649ae765b14dacc393"}, 712 | {file = "tarina-0.6.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:323351247817dac174f609104c54fcdc4923aaf3ac5e4a4a81c3efaa007d5778"}, 713 | {file = "tarina-0.6.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:eb7407046d8051b062f71440b90a11be3ef1a64e99b1c6be157312fe2889e4f4"}, 714 | {file = "tarina-0.6.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:50bbbb249d0849855cf43f4fa09c4eecac53e76a54c876ef1a7fb967f17d35b6"}, 715 | {file = "tarina-0.6.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8a05063e41f01f64c3c6e87b740c1e2cebffdcae20b9d89014a934bb2707a2b7"}, 716 | {file = "tarina-0.6.8-cp310-cp310-win32.whl", hash = "sha256:162756b5c0872856c11cc97ed1a618a9118fef3fb6999edc917578b56f3eb67f"}, 717 | {file = "tarina-0.6.8-cp310-cp310-win_amd64.whl", hash = "sha256:a58a8a6e36e43de8f3a0561cb264abe300ec6bb4a4215f16c316f1db564de6fb"}, 718 | {file = "tarina-0.6.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c05d38546712014aafcf123e89d90ad75f08ebd40c5a7e4c76db40d2ae11b387"}, 719 | {file = "tarina-0.6.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b036d53d2f8ec46fff9f649b5ec70431cdee3a2b99c8706f67d8d55ea4d4e493"}, 720 | {file = "tarina-0.6.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:195d2b4a8a8ec2e946ecd8abab70cf3065fbba67e18e971e0412a74a8417a656"}, 721 | {file = "tarina-0.6.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9bbe85a83904eb29143a43511c04a3fea9a7392c70a6216fcec3ba06cf1b83a"}, 722 | {file = "tarina-0.6.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d6b5893b735d24d2a57f6dbb26de92bb5e09e476077a16408e2054f06263530"}, 723 | {file = "tarina-0.6.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a74cc68f4678d37d517a2d661184712f15da608510de6b1bb9103d85d6014409"}, 724 | {file = "tarina-0.6.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dd0f0d769e503fb81d07bd2d342585347f5149803bd7b4b233deaff1833451f"}, 725 | {file = "tarina-0.6.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b7c91a488aa616e141c337cddce1ba1e0bdac6b98362bc15ce76bd3cd71e17"}, 726 | {file = "tarina-0.6.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4f0b91da85a816e34a3eb4670d21c26a3909872b1f5525797bedc32a45efd98d"}, 727 | {file = "tarina-0.6.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bf3a5a8fe912d5984627f64cdd187c8a0801c6f3b2f7f12c68cdb5babf691155"}, 728 | {file = "tarina-0.6.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:622e226553453a9a873fca5a2d495d2d28003a23834503147954d651186146c4"}, 729 | {file = "tarina-0.6.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:198102e526d096f37bfb868f815cb3bfc864e136aa8b70e90a107a38ffb82c15"}, 730 | {file = "tarina-0.6.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:07b252f686410fbf1fe64b3b6705dd40ff218bc1d6a67efac640a0a246f66da3"}, 731 | {file = "tarina-0.6.8-cp311-cp311-win32.whl", hash = "sha256:9e4f56478c58706548e0f08bd277666bac783d918257950be49c4a5d8a35e7b0"}, 732 | {file = "tarina-0.6.8-cp311-cp311-win_amd64.whl", hash = "sha256:d0a92b5368a8a1700f0482d0bc3891dccdfc6dc61f7e66101f68544fca10f096"}, 733 | {file = "tarina-0.6.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e8e4bf8ed36c92af7b2a973905f5f4f58dabf7490c5dda695534bf5e3b20d92e"}, 734 | {file = "tarina-0.6.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:175754132a107c2830a341d3efcae60f44bfd8e0eab56d92537cc6f849ad44e3"}, 735 | {file = "tarina-0.6.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c5f983f0c84959589f884777c7ac0b22786d6d183ae367e53265f09e9ed7dc9f"}, 736 | {file = "tarina-0.6.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c8cc5f1bf3c2099377b5de76b0e192bb4fae3dcfcc245be9ed14315b29c8c75"}, 737 | {file = "tarina-0.6.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7067131af4081d8ca3d4e70c96e8903c9e483e4d5af4910b93051602f7e8b34"}, 738 | {file = "tarina-0.6.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a66ea0778dcbd9e9b9b226529ed1822261722956468de026655e09b41feee42b"}, 739 | {file = "tarina-0.6.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd8501b0cd51ad8c0e294b46614ef27ef6773324099b5a24711534db55ded44d"}, 740 | {file = "tarina-0.6.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5812e903c79c02029bfe61fd0ff30bf2a5ac58e7c5b1ab3abfb0f0b57260c5b8"}, 741 | {file = "tarina-0.6.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60ea05cb8e07a629096d9abbd11258df2bcea03168bc8ef8f369ca0dddfc504a"}, 742 | {file = "tarina-0.6.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2635d27c34353e9431cb995acece3a0b607cde0934ebf8df35f0e4ae70a0335"}, 743 | {file = "tarina-0.6.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:542b5359d23f969f275f9e80960ce7f19a2684e93cd3ab659afaeb7ee06de038"}, 744 | {file = "tarina-0.6.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4ba2018a855f59c28f087ec1ec1d892c6afccdd0da8f4347fbf8e3219145d66c"}, 745 | {file = "tarina-0.6.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdf9c5c44d402041df79e747ff9f82c6794875febb053376acdb724043770975"}, 746 | {file = "tarina-0.6.8-cp312-cp312-win32.whl", hash = "sha256:cf44ca009d79d0ecc8541b9067a3b7d086d1939de3bc1b04c164286b0fcf2112"}, 747 | {file = "tarina-0.6.8-cp312-cp312-win_amd64.whl", hash = "sha256:8cd9ff00e2eb9ed6c42b80504005c9b6de4a9afe9ef36771f63b8f9492e38a90"}, 748 | {file = "tarina-0.6.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:af3ff4742b0324d590298812997d028a6d6892bfab5680cd266bed0c1bbf90b0"}, 749 | {file = "tarina-0.6.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e7919d53f20e7d780b44e1804f7c9006bcf5832f87cfeb8d5432f1c832953ed4"}, 750 | {file = "tarina-0.6.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:878f8d9411ed36cf4408751e209a09c5e2363fc06b6074e966995cdbdc365a9d"}, 751 | {file = "tarina-0.6.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa166fe58b65be6aed113fca54851b236cfd5c23e33f5e61c403f7b71eda17a"}, 752 | {file = "tarina-0.6.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04ea6b8f4568fe5b4f167d002fbe05879bfa04a4121b4ca3d294580cfc86b85d"}, 753 | {file = "tarina-0.6.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cbdf37600789f34c1eba6bf05e246f8e9a5b46cf93f9652e92d355e767bbc430"}, 754 | {file = "tarina-0.6.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb748ad914898c293771ccdb32c73b3117a15a3234c9d5eb001f834533cf67ef"}, 755 | {file = "tarina-0.6.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55ca473eb8f3bbd70af71a29d59c6c0951e19ae24f3be86259b884fc097028a0"}, 756 | {file = "tarina-0.6.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4b124eee1ce8e25f1c1aba0464c95226ce5ed1b35f079f0fce0f993f38d3393b"}, 757 | {file = "tarina-0.6.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4295448f4dd9f54703adde2683cf6a515f0944687868da4ec500d595e6a9122d"}, 758 | {file = "tarina-0.6.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:77392b3e53e9e1069b9131b1eb2037c53b360e4d7f3cfa8ae04277fe4e785eb1"}, 759 | {file = "tarina-0.6.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:da9771f40ddcd9da087a4fc2d472b548c0da2bb61ad642b7e186ea7098120be6"}, 760 | {file = "tarina-0.6.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fac01686a3f9d4461b8ce6ba3afadb5b24138e27f725ee11efc4b057d98d4e4a"}, 761 | {file = "tarina-0.6.8-cp313-cp313-win32.whl", hash = "sha256:a977e3e38535455b38e018ec345f9982c4d2b40945b330aa5c70c1a24a2f8f5b"}, 762 | {file = "tarina-0.6.8-cp313-cp313-win_amd64.whl", hash = "sha256:62445e9a7c0ab7ac8f9c316836ade382f4b9780492f0a8a35a658f827bcb1d7f"}, 763 | {file = "tarina-0.6.8-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:491b46bfd030f64edc8daac99051e9e1a82d4592aaa9d91c86d18da7f1816a8d"}, 764 | {file = "tarina-0.6.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8dab1c7ff584f427ae671ecd0379b5795f3ddfee867c5c8997fb110c35b72901"}, 765 | {file = "tarina-0.6.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9f998c32df568da30f236876118f5c359caf00d4935249c78c2e6e15caa1a72f"}, 766 | {file = "tarina-0.6.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b427b03be5e9d19882558dafd8cae6decc4406f1511741409f1b75a5ce0bf447"}, 767 | {file = "tarina-0.6.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec0bb5da7bbea3df20750acab45403c5fbd5a0b5c4dd7267e6d0cb3669935db4"}, 768 | {file = "tarina-0.6.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7acbc4b547fd623beb174431e2d01b2bc2a5d7451fe3d0e9ae3e0118d862d375"}, 769 | {file = "tarina-0.6.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed03a67986b00411aa5d3cd02896e5daf0e5af44247fd0ef79484b06780a2462"}, 770 | {file = "tarina-0.6.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:637740055c0e7da77793e0f2d56189f4620e9db31578c590234f85240364e80d"}, 771 | {file = "tarina-0.6.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9df3d4441b36b7e6ac290b05dd9a1e6193ff0acc2d970be2b855283b76d0ad40"}, 772 | {file = "tarina-0.6.8-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ff583c3579e5ea939da67c6a32ebced76b270c884d9f686a003f66f32a0cecdc"}, 773 | {file = "tarina-0.6.8-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:91589c96904f6a07ccf7fec977c403bab52aad63bd3a801a32e11d2ee85e1d46"}, 774 | {file = "tarina-0.6.8-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4a7448cacff18d536c3cf4453282ee29cf401442cba1a50f02981e5d4c374d7f"}, 775 | {file = "tarina-0.6.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:96fe4a3a33fa20cc3bd996ef9e4a909b00c37d89bd24d594a6024ca59a26c6c4"}, 776 | {file = "tarina-0.6.8-cp39-cp39-win32.whl", hash = "sha256:cbff457659568f46fbbb8e594644278b51efddb532890117b4965b8c059d4d4a"}, 777 | {file = "tarina-0.6.8-cp39-cp39-win_amd64.whl", hash = "sha256:bace5eeaed47048e9a8e9dd7953aadc11aace8c8a5db8457906d8f9c52604fc5"}, 778 | {file = "tarina-0.6.8-py3-none-any.whl", hash = "sha256:0e8a04eecb741937244d97da54f8cd36995819fc12a6b60c9b3f3f3d2860ebe6"}, 779 | {file = "tarina-0.6.8.tar.gz", hash = "sha256:d77d68948967a130066b61e85b21189259030f80ad19295bd81ff6b52f348316"}, 780 | ] 781 | 782 | [[package]] 783 | name = "tomli" 784 | version = "2.2.1" 785 | requires_python = ">=3.8" 786 | summary = "A lil' TOML parser" 787 | groups = ["default"] 788 | marker = "python_version < \"3.11\"" 789 | files = [ 790 | {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, 791 | {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, 792 | {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, 793 | {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, 794 | {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, 795 | {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, 796 | {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, 797 | {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, 798 | {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, 799 | {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, 800 | {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, 801 | {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, 802 | {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, 803 | {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, 804 | {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, 805 | {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, 806 | {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, 807 | {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, 808 | {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, 809 | {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, 810 | {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, 811 | {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, 812 | {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, 813 | {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, 814 | {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, 815 | {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, 816 | {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, 817 | {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, 818 | {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, 819 | {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, 820 | {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, 821 | {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, 822 | ] 823 | 824 | [[package]] 825 | name = "typing-extensions" 826 | version = "4.12.2" 827 | requires_python = ">=3.8" 828 | summary = "Backported and Experimental Type Hints for Python 3.8+" 829 | groups = ["default"] 830 | files = [ 831 | {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, 832 | {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, 833 | ] 834 | 835 | [[package]] 836 | name = "win32-setctime" 837 | version = "1.2.0" 838 | requires_python = ">=3.5" 839 | summary = "A small Python utility to set file creation time on Windows" 840 | groups = ["default"] 841 | marker = "sys_platform == \"win32\"" 842 | files = [ 843 | {file = "win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390"}, 844 | {file = "win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0"}, 845 | ] 846 | 847 | [[package]] 848 | name = "yarl" 849 | version = "1.18.3" 850 | requires_python = ">=3.9" 851 | summary = "Yet another URL library" 852 | groups = ["default"] 853 | dependencies = [ 854 | "idna>=2.0", 855 | "multidict>=4.0", 856 | "propcache>=0.2.0", 857 | ] 858 | files = [ 859 | {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34"}, 860 | {file = "yarl-1.18.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7"}, 861 | {file = "yarl-1.18.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed"}, 862 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde"}, 863 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b"}, 864 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5"}, 865 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc"}, 866 | {file = "yarl-1.18.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd"}, 867 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990"}, 868 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db"}, 869 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62"}, 870 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760"}, 871 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b"}, 872 | {file = "yarl-1.18.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690"}, 873 | {file = "yarl-1.18.3-cp310-cp310-win32.whl", hash = "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6"}, 874 | {file = "yarl-1.18.3-cp310-cp310-win_amd64.whl", hash = "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8"}, 875 | {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069"}, 876 | {file = "yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193"}, 877 | {file = "yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889"}, 878 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8"}, 879 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca"}, 880 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8"}, 881 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae"}, 882 | {file = "yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3"}, 883 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb"}, 884 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e"}, 885 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59"}, 886 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d"}, 887 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e"}, 888 | {file = "yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a"}, 889 | {file = "yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1"}, 890 | {file = "yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5"}, 891 | {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50"}, 892 | {file = "yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576"}, 893 | {file = "yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640"}, 894 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2"}, 895 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75"}, 896 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512"}, 897 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba"}, 898 | {file = "yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb"}, 899 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272"}, 900 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6"}, 901 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e"}, 902 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb"}, 903 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393"}, 904 | {file = "yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285"}, 905 | {file = "yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2"}, 906 | {file = "yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477"}, 907 | {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb"}, 908 | {file = "yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa"}, 909 | {file = "yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782"}, 910 | {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0"}, 911 | {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482"}, 912 | {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186"}, 913 | {file = "yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58"}, 914 | {file = "yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53"}, 915 | {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2"}, 916 | {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8"}, 917 | {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1"}, 918 | {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a"}, 919 | {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10"}, 920 | {file = "yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8"}, 921 | {file = "yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d"}, 922 | {file = "yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c"}, 923 | {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04"}, 924 | {file = "yarl-1.18.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719"}, 925 | {file = "yarl-1.18.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e"}, 926 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee"}, 927 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789"}, 928 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8"}, 929 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c"}, 930 | {file = "yarl-1.18.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5"}, 931 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1"}, 932 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24"}, 933 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318"}, 934 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985"}, 935 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910"}, 936 | {file = "yarl-1.18.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1"}, 937 | {file = "yarl-1.18.3-cp39-cp39-win32.whl", hash = "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5"}, 938 | {file = "yarl-1.18.3-cp39-cp39-win_amd64.whl", hash = "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9"}, 939 | {file = "yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b"}, 940 | {file = "yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1"}, 941 | ] 942 | 943 | [[package]] 944 | name = "zipp" 945 | version = "3.21.0" 946 | requires_python = ">=3.9" 947 | summary = "Backport of pathlib-compatible object wrapper for zip files" 948 | groups = ["default"] 949 | files = [ 950 | {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, 951 | {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, 952 | ] 953 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "nonebot-plugin-kawaii-robot" 3 | dynamic = ["version"] 4 | description = "使用 Kyomotoi/AnimeThesaurus 的 NoneBot2 的回复(文i)插件" 5 | authors = [ 6 | { name = "karisaya", email = "1048827424@qq.com" }, 7 | { name = "LgCookie", email = "lgc2333@126.com" }, 8 | ] 9 | dependencies = [ 10 | "nonebot2>=2.4.1", 11 | "nonebot-plugin-alconna>=0.54.2", 12 | "nonebot-plugin-userinfo>=0.2.6", 13 | "nonebot-plugin-session>=0.3.2", 14 | "cookit[pydantic]>=0.9.3", 15 | "anyio>=4.8.0", 16 | ] 17 | requires-python = ">=3.9,<4.0" 18 | readme = "README.md" 19 | license = { text = "AGPL-3.0" } 20 | 21 | [project.urls] 22 | homepage = "https://github.com/KarisAya/nonebot_plugin_kawaii_robot/" 23 | 24 | [tool.pdm.build] 25 | includes = [] 26 | 27 | [tool.pdm.version] 28 | source = "file" 29 | path = "nonebot_plugin_kawaii_robot/__init__.py" 30 | 31 | [build-system] 32 | requires = ["pdm-backend"] 33 | build-backend = "pdm.backend" 34 | --------------------------------------------------------------------------------