├── .dockerignore ├── .github └── workflows │ └── docker-image.yml ├── .gitignore ├── Dockerfile ├── README.md ├── doc └── Plugins-DEV.md ├── gugumoe_bot ├── __init__.py ├── __main__.py ├── db │ └── mongodb_helper.py ├── fonts │ ├── Sarasa-Mono-SC-Bold-Nerd.ttf │ └── Sarasa-Mono-SC-Semibold-Nerd.ttf ├── plugin_interface.py ├── plugins │ └── jrrp.py ├── settings.py └── utils │ ├── nexttrace_helper.py │ ├── nslookup_helper.py │ └── redis_helper.py ├── invalidate └── nexttrace.py ├── poetry.lock ├── pyproject.toml └── tests ├── __init__.py └── mongodb_test.py /.dockerignore: -------------------------------------------------------------------------------- 1 | ### Python template 2 | 3 | deploy/ 4 | .idea/ 5 | .vscode/ 6 | .git/ 7 | # Byte-compiled / optimized / DLL files 8 | __pycache__/ 9 | *.py[cod] 10 | *$py.class 11 | 12 | # C extensions 13 | *.so 14 | 15 | # Distribution / packaging 16 | .Python 17 | build/ 18 | develop-eggs/ 19 | dist/ 20 | downloads/ 21 | eggs/ 22 | .eggs/ 23 | lib/ 24 | lib64/ 25 | parts/ 26 | sdist/ 27 | var/ 28 | wheels/ 29 | share/python-wheels/ 30 | *.egg-info/ 31 | .installed.cfg 32 | *.egg 33 | MANIFEST 34 | 35 | # PyInstaller 36 | # Usually these files are written by a python script from a template 37 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 38 | *.manifest 39 | *.spec 40 | 41 | # Installer logs 42 | pip-log.txt 43 | pip-delete-this-directory.txt 44 | 45 | # Unit test / coverage reports 46 | htmlcov/ 47 | .tox/ 48 | .nox/ 49 | .coverage 50 | .coverage.* 51 | .cache 52 | nosetests.xml 53 | coverage.xml 54 | *.cover 55 | *.py,cover 56 | .hypothesis/ 57 | .pytest_cache/ 58 | cover/ 59 | 60 | # Translations 61 | *.mo 62 | *.pot 63 | 64 | # Django stuff: 65 | *.log 66 | local_settings.py 67 | db.sqlite3 68 | db.sqlite3-journal 69 | 70 | # Flask stuff: 71 | instance/ 72 | .webassets-cache 73 | 74 | # Scrapy stuff: 75 | .scrapy 76 | 77 | # Sphinx documentation 78 | docs/_build/ 79 | 80 | # PyBuilder 81 | .pybuilder/ 82 | target/ 83 | 84 | # Jupyter Notebook 85 | .ipynb_checkpoints 86 | 87 | # IPython 88 | profile_default/ 89 | ipython_config.py 90 | 91 | # pyenv 92 | # For a library or package, you might want to ignore these files since the code is 93 | # intended to run in multiple environments; otherwise, check them in: 94 | # .python-version 95 | 96 | # pipenv 97 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 98 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 99 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 100 | # install all needed dependencies. 101 | #Pipfile.lock 102 | 103 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 104 | __pypackages__/ 105 | 106 | # Celery stuff 107 | celerybeat-schedule 108 | celerybeat.pid 109 | 110 | # SageMath parsed files 111 | *.sage.py 112 | 113 | # Environments 114 | .env 115 | .venv 116 | env/ 117 | venv/ 118 | ENV/ 119 | env.bak/ 120 | venv.bak/ 121 | 122 | # Spyder project settings 123 | .spyderproject 124 | .spyproject 125 | 126 | # Rope project settings 127 | .ropeproject 128 | 129 | # mkdocs documentation 130 | /site 131 | 132 | # mypy 133 | .mypy_cache/ 134 | .dmypy.json 135 | dmypy.json 136 | 137 | # Pyre type checker 138 | .pyre/ 139 | 140 | # pytype static type analyzer 141 | .pytype/ 142 | 143 | # Cython debug symbols 144 | cython_debug/ 145 | -------------------------------------------------------------------------------- /.github/workflows/docker-image.yml: -------------------------------------------------------------------------------- 1 | name: Docker Image CI 2 | 3 | on: 4 | push: 5 | branches: [ "main" ] 6 | pull_request: 7 | branches: [ "main" ] 8 | 9 | jobs: 10 | 11 | build: 12 | 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v2 17 | 18 | - name: Set up Docker Buildx 19 | uses: docker/setup-buildx-action@v1 20 | 21 | - name: Login to GitHub Container Registry 22 | uses: docker/login-action@v1 23 | with: 24 | registry: ghcr.io 25 | username: ${{ github.actor }} 26 | password: ${{ secrets.GITHUB_TOKEN }} 27 | 28 | - name: Convert repo name to lower case 29 | id: repo-name-lower 30 | run: | 31 | echo "REPO_NAME=$(echo '${{ github.repository }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV 32 | 33 | - name: Build and push Docker image 34 | uses: docker/build-push-action@v2 35 | with: 36 | context: . 37 | file: ./Dockerfile 38 | push: true 39 | tags: ghcr.io/${{ env.REPO_NAME }}:latest 40 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Django stuff: 39 | *.log 40 | local_settings.py 41 | db.sqlite3 42 | 43 | # PyBuilder 44 | target/ 45 | 46 | # Environments 47 | .env 48 | .venv 49 | env/ 50 | venv/ 51 | ENV/ 52 | env.bak/ 53 | venv.bak/ 54 | 55 | # Extra Ignores 56 | config.yml 57 | user/ 58 | 59 | # 屏蔽.idea文件夹及里面的文件 60 | .idea/ 61 | .idea/* 62 | !.idea/.gitignore 63 | 64 | .idea/vcs.xml 65 | .idea/modules.xml 66 | .idea/inspectionProfiles/Project_Default.xml 67 | .idea/inspectionProfiles/profiles_settings.xml 68 | .idea/Gugumoe-bot.iml 69 | 70 | /test -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:latest as base 2 | 3 | # Avoiding user interaction with tzdata 4 | ENV DEBIAN_FRONTEND=noninteractive 5 | 6 | # Installing necessary locales and system dependencies 7 | RUN apt-get update && apt-get install -y locales python3 python3-pip curl libffi-dev libcairo2 && \ 8 | locale-gen en_US.UTF-8 9 | ENV LC_ALL=en_US.UTF-8 \ 10 | LANG=en_US.UTF-8 \ 11 | LANGUAGE=en_US.UTF-8 \ 12 | GUGUMOE_BOT_TOKEN="" \ 13 | GUGUMOE_BOT_USERNAME="" \ 14 | GUGUMOE_BOT_MONGODB_URL="" \ 15 | GUGUMOE_BOT_PROXY="" 16 | 17 | 18 | 19 | # Installing tzdata and configuring timezone 20 | RUN apt-get update && apt-get install -y tzdata && \ 21 | ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ 22 | dpkg-reconfigure --frontend noninteractive tzdata 23 | 24 | # Installing poetry 25 | RUN pip install poetry==1.4.2 26 | 27 | # Configuring poetry 28 | RUN poetry config virtualenvs.create false 29 | 30 | # Running the nexttrace installation script 31 | RUN bash -c "$(curl -Ls https://raw.githubusercontent.com/sjlleo/nexttrace/main/nt_install.sh)" 32 | 33 | # Setting Working directory 34 | WORKDIR /app 35 | 36 | # Copying requirements of a project 37 | COPY pyproject.toml poetry.lock /app/ 38 | 39 | # Copying actual application 40 | COPY . /app/ 41 | 42 | # Installing requirements 43 | RUN poetry install --no-dev 44 | 45 | CMD ["/usr/bin/python3", "-m", "gugumoe_bot"] 46 | 47 | FROM base as dev 48 | 49 | RUN poetry install 50 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Gugumoe-bot 2 | 3 |
4 | 5 | 6 | 7 | 这是咕谷酱的Telegram机器人 (咕小酱)。是基于 [pyTelegramBotAPI](https://github.com/eternnoir/pyTelegramBotAPI) 的一个 Python 机器人。 8 | 9 | ~~同时会有一堆运行Bug~~ 10 | 11 | **咕小酱在这呢👉[@gugumoe_bot](http://t.me/gugumoe_bot)** 12 | 13 |
14 | 15 | ![Alt](https://repobeats.axiom.co/api/embed/1931234205856e05e4269eba31551c98b6eb632c.svg "Repobeats analytics image") 16 | 17 | ## **⚠️项目正在重构** 18 | 19 |
20 | 21 | ## 部署 22 | 23 | 咕小酱 提供了多种部署方式,你可以根据自己的需求选择合适的部署方式。 24 | 25 | ### 本地部署 26 | 27 | 本项目使用 [Python](https://www.python.org/) 和 [poetry](https://python-poetry.org/)。请确保你本地安装了它们,当然你也可以选择其他部署方式。 28 | 29 | 注意:需要 Python 3.10 或以上版本。 30 | 31 | ```sh 32 | # 检查 Python 版本 33 | $ python --version 34 | 35 | # 如果你还未安装 Poetry,使用下列命令进行安装 36 | $ curl -sSL https://install.python-poetry.org | python - 37 | ``` 38 | 39 | 首先,克隆并进入项目: 40 | 41 | ```sh 42 | $ git clone https://github.com/GooGuJiang/Gugumoe-bot.git 43 | $ cd Gugumoe-bot 44 | ``` 45 | 46 | 使用 poetry 安装项目依赖: 47 | 48 | ```sh 49 | $ poetry install 50 | ``` 51 | 52 | ## 使用说明 53 | 54 | 使用 Gugumoe-bot,你首先需要在本地运行它。使用以下命令启动 Gugumoe-bot: 55 | 56 | ```sh 57 | $ poetry run python -m gugumoe_bot 58 | ``` 59 | 60 | 在 Telegram 中,你可以使用 `@gugumoe_bot` 来与 Gugumoe-bot 互动。 61 | 62 | ## 插件开发 63 | 64 | 你可以参考[插件开发文档](./doc/Plugins-DEV.md)来创建你自己的插件,以扩展 Gugumoe-bot 的功能。 65 | 66 | ## 项目状态 67 | 68 | 此项目正在进行重构。在重构期间可能会出现一些问题。我们将尽快解决这些问题。 69 | 70 | ## 开源许可 71 | 72 | 此项目遵循 [MIT](https://opensource.org/licenses/MIT) 开源许可协议。 -------------------------------------------------------------------------------- /doc/Plugins-DEV.md: -------------------------------------------------------------------------------- 1 | # GuguMoe Bot Plugin 开发文档 2 | 3 | ## 1. 介绍 4 | 5 | GuguMoe Bot 使用插件化设计,方便开发者为其添加新功能。这份文档将指导你如何创建一个新插件。 6 | 7 | ## 2. 插件结构 8 | 9 | 一个插件由一个 Python 文件构成,必须定义一个继承自 `PluginInterface` 的类,且这个类必须实现 `handle_message` 方法。下面是一个基本的插件文件的结构: 10 | 11 | ```python 12 | class MyPlugin(PluginInterface): 13 | command = 'my_command' 14 | 15 | async def handle_message(self, bot, message): 16 | # TODO: 在此处理所有的文本消息 17 | ``` 18 | 19 | 在这个例子中,`MyPlugin` 是插件类的名字,`my_command` 是这个插件的命令。插件类中的 `handle_message` 方法将处理所有的文本消息。 20 | 21 | ## 3. 命令处理 22 | 23 | 如果你的插件需要处理特定的命令,你需要在插件类中定义一个 `handle_command` 方法: 24 | 25 | ```python 26 | class MyPlugin(PluginInterface): 27 | command = 'my_command' 28 | 29 | async def handle_command(self, bot, message): 30 | # TODO: 在此处理特定的命令 31 | ``` 32 | 33 | 在这个例子中,当用户发送 `/my_command` 时,`handle_command` 方法将被调用。 34 | 35 | ## 4. 其他消息类型 36 | 37 | 除了文本消息和命令,GuguMoe Bot 还支持处理其他类型的消息,比如音频、视频、图片等。要处理这些消息,你需要在插件类中定义相应的处理方法,比如 `handle_audio`、`handle_video` 等: 38 | 39 | ```python 40 | class MyPlugin(PluginInterface): 41 | async def handle_audio(self, bot, message): 42 | # TODO: 在此处理音频消息 43 | 44 | async def handle_video(self, bot, message): 45 | # TODO: 在此处理视频消息 46 | ``` 47 | 48 | 这些处理方法将在收到相应类型的消息时被调用。 49 | 50 | ## 5. 权限检查 51 | 52 | 如果你希望只有特定的用户可以使用你的插件,你可以在插件的处理方法中添加权限检查: 53 | 54 | ```python 55 | from gugumoe_bot.settings import settings 56 | 57 | class MyPlugin(PluginInterface): 58 | command = 'my_command' 59 | 60 | async def handle_command(self, bot, message): 61 | if message.from_user.id in settings.admins: 62 | # TODO: 在此处理命令 63 | else: 64 | await bot.reply_to(message, 'You are not an admin.') 65 | ``` 66 | 67 | 在这个例子中,只有在管理员列表中的用户可以使用这个插件。 68 | 69 | ## 6. 错误处理 70 | 71 | 你的插件应该能够正确处理可能发生的错误。为了这个目标,你可以使用 Python 的 `try/except` 语句: 72 | 73 | ```python 74 | class MyPlugin(PluginInterface): 75 | async def handle_message(self, bot, message): 76 | try: 77 | # TODO: 在此处理消息 78 | except Exception as e: 79 | await bot.reply_to(message, 'An error occurred.') 80 | ``` 81 | 82 | 在这个例子中,如果在处理消息时发生错误,插件将向用户发送一条错误消息。 83 | 84 | ## 7. 总结 85 | 86 | 这就是 GuguMoe Bot 插件的基本结构。你可以根据这个指南创建你自己的插件。 -------------------------------------------------------------------------------- /gugumoe_bot/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GooGuJiang/Gugumoe-bot/919036693d79c98cca9e5be9a31166f5a19ecec4/gugumoe_bot/__init__.py -------------------------------------------------------------------------------- /gugumoe_bot/__main__.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import importlib 3 | import os 4 | import sys 5 | 6 | from loguru import logger 7 | from telebot import asyncio_helper 8 | from telebot.async_telebot import AsyncTeleBot 9 | from telebot.types import Message, CallbackQuery 10 | 11 | from gugumoe_bot.settings import settings 12 | 13 | # 插件目录 14 | PLUGIN_DIR = 'plugins' 15 | 16 | # 初始化 TeleBot 17 | if settings.proxy != "": 18 | asyncio_helper.proxy = settings.proxy 19 | bot = AsyncTeleBot(settings.token) 20 | 21 | # 设置日志格式和级别 22 | logger.add(sys.stderr, level=settings.log_level) 23 | 24 | # 动态加载插件 25 | plugins = [] 26 | for filename in os.listdir(os.path.join(os.path.dirname(__file__), PLUGIN_DIR)): 27 | if filename.endswith('.py'): 28 | module_name = filename[:-3] 29 | module = importlib.import_module(f'.{PLUGIN_DIR}.{module_name}', 'gugumoe_bot') 30 | plugin_class = getattr(module, f'{module_name.capitalize()}Plugin') 31 | plugins.append(plugin_class()) 32 | logger.info(f'Loaded plugin: {module_name}') 33 | 34 | logger.info('All plugins loaded, bot is starting...') 35 | 36 | 37 | # Handle all text messages 38 | @bot.message_handler(func=lambda m: True) 39 | async def handle_all_text_messages(message: Message) -> None: 40 | if message.text.startswith('/'): 41 | command = message.text.split(' ', 1)[0][1:] 42 | # Add these lines to handle commands in the form of /command@botusername 43 | if '@' in command: 44 | command, at_botusername = command.split('@', 1) 45 | if at_botusername != settings.username: 46 | return # Ignore commands for other bots 47 | for plugin in plugins: 48 | if plugin.command == command: 49 | logger.info(f'Handling command: {command}') 50 | await plugin.handle_command(bot, message) 51 | else: 52 | for plugin in plugins: 53 | await plugin.handle_message(bot, message) 54 | 55 | 56 | @bot.callback_query_handler(func=lambda call: True) 57 | async def handle_callback_query(call: CallbackQuery) -> None: 58 | for plugin in plugins: 59 | if hasattr(plugin, 'handle_callback_query'): 60 | await plugin.handle_callback_query(bot, call) 61 | 62 | 63 | @bot.message_handler(content_types=['audio']) 64 | async def handle_audio(message: Message) -> None: 65 | for plugin in plugins: 66 | if hasattr(plugin, 'handle_audio'): 67 | await plugin.handle_audio(bot, message) 68 | 69 | 70 | @bot.message_handler(content_types=['video']) 71 | async def handle_video(message: Message) -> None: 72 | for plugin in plugins: 73 | if hasattr(plugin, 'handle_video'): 74 | await plugin.handle_video(bot, message) 75 | 76 | 77 | @bot.message_handler(content_types=['photo']) 78 | async def handle_photo(message: Message) -> None: 79 | for plugin in plugins: 80 | if hasattr(plugin, 'handle_photo'): 81 | await plugin.handle_photo(bot, message) 82 | 83 | 84 | @bot.message_handler(content_types=['document']) 85 | async def handle_document(message: Message) -> None: 86 | for plugin in plugins: 87 | if hasattr(plugin, 'handle_document'): 88 | await plugin.handle_document(bot, message) 89 | 90 | 91 | @bot.message_handler(content_types=['sticker']) 92 | async def handle_sticker(message: Message) -> None: 93 | for plugin in plugins: 94 | if hasattr(plugin, 'handle_sticker'): 95 | await plugin.handle_sticker(bot, message) 96 | 97 | 98 | @bot.message_handler(content_types=['voice']) 99 | async def handle_voice(message: Message) -> None: 100 | for plugin in plugins: 101 | if hasattr(plugin, 'handle_voice'): 102 | await plugin.handle_voice(bot, message) 103 | 104 | 105 | @bot.message_handler(content_types=['video_note']) 106 | async def handle_video_note(message: Message) -> None: 107 | for plugin in plugins: 108 | if hasattr(plugin, 'handle_video_note'): 109 | await plugin.handle_video_note(bot, message) 110 | 111 | 112 | @bot.message_handler(content_types=['contact']) 113 | async def handle_contact(message: Message) -> None: 114 | for plugin in plugins: 115 | if hasattr(plugin, 'handle_contact'): 116 | await plugin.handle_contact(bot, message) 117 | 118 | 119 | @bot.message_handler(content_types=['location']) 120 | async def handle_location(message: Message) -> None: 121 | for plugin in plugins: 122 | if hasattr(plugin, 'handle_location'): 123 | await plugin.handle_location(bot, message) 124 | 125 | 126 | @bot.message_handler(content_types=['venue']) 127 | async def handle_venue(message: Message) -> None: 128 | for plugin in plugins: 129 | if hasattr(plugin, 'handle_venue'): 130 | await plugin.handle_venue(bot, message) 131 | 132 | 133 | @bot.message_handler(content_types=['poll']) 134 | async def handle_poll(message: Message) -> None: 135 | for plugin in plugins: 136 | if hasattr(plugin, 'handle_poll'): 137 | await plugin.handle_poll(bot, message) 138 | 139 | 140 | @bot.message_handler(content_types=['dice']) 141 | async def handle_dice(message: Message) -> None: 142 | for plugin in plugins: 143 | if hasattr(plugin, 'handle_dice'): 144 | await plugin.handle_dice(bot, message) 145 | 146 | 147 | @bot.message_handler(content_types=['new_chat_members']) 148 | async def handle_new_chat_members(message: Message) -> None: 149 | for plugin in plugins: 150 | if hasattr(plugin, 'handle_new_chat_members'): 151 | await plugin.handle_new_chat_members(bot, message) 152 | 153 | 154 | @bot.message_handler(content_types=['left_chat_member']) 155 | async def handle_left_chat_member(message: Message) -> None: 156 | for plugin in plugins: 157 | if hasattr(plugin, 'handle_left_chat_member'): 158 | await plugin.handle_left_chat_member(bot, message) 159 | 160 | 161 | @bot.message_handler(content_types=['new_chat_title']) 162 | async def handle_new_chat_title(message: Message) -> None: 163 | for plugin in plugins: 164 | if hasattr(plugin, 'handle_new_chat_title'): 165 | await plugin.handle_new_chat_title(bot, message) 166 | 167 | 168 | @bot.message_handler(content_types=['new_chat_photo']) 169 | async def handle_new_chat_photo(message: Message) -> None: 170 | for plugin in plugins: 171 | if hasattr(plugin, 'handle_new_chat_photo'): 172 | await plugin.handle_new_chat_photo(bot, message) 173 | 174 | 175 | @bot.message_handler(content_types=['delete_chat_photo']) 176 | async def handle_delete_chat_photo(message: Message) -> None: 177 | for plugin in plugins: 178 | if hasattr(plugin, 'handle_delete_chat_photo'): 179 | await plugin.handle_delete_chat_photo(bot, message) 180 | 181 | 182 | @bot.message_handler(content_types=['group_chat_created']) 183 | async def handle_group_chat_created(message: Message) -> None: 184 | for plugin in plugins: 185 | if hasattr(plugin, 'handle_group_chat_created'): 186 | await plugin.handle_group_chat_created(bot, message) 187 | 188 | 189 | @bot.message_handler(content_types=['supergroup_chat_created']) 190 | async def handle_supergroup_chat_created(message: Message) -> None: 191 | for plugin in plugins: 192 | if hasattr(plugin, 'handle_supergroup_chat_created'): 193 | await plugin.handle_supergroup_chat_created(bot, message) 194 | 195 | 196 | @bot.message_handler(content_types=['channel_chat_created']) 197 | async def handle_channel_chat_created(message: Message) -> None: 198 | for plugin in plugins: 199 | if hasattr(plugin, 'handle_channel_chat_created'): 200 | await plugin.handle_channel_chat_created(bot, message) 201 | 202 | 203 | @bot.message_handler(content_types=['migrate_to_chat_id']) 204 | async def handle_migrate_to_chat_id(message: Message) -> None: 205 | for plugin in plugins: 206 | if hasattr(plugin, 'handle_migrate_to_chat_id'): 207 | await plugin.handle_migrate_to_chat_id(bot, message) 208 | 209 | 210 | @bot.message_handler(content_types=['migrate_from_chat_id']) 211 | async def handle_migrate_from_chat_id(message: Message) -> None: 212 | for plugin in plugins: 213 | if hasattr(plugin, 'handle_migrate_from_chat_id'): 214 | await plugin.handle_migrate_from_chat_id(bot, message) 215 | 216 | 217 | @bot.message_handler(content_types=['pinned_message']) 218 | async def handle_pinned_message(message: Message) -> None: 219 | for plugin in plugins: 220 | if hasattr(plugin, 'handle_pinned_message'): 221 | await plugin.handle_pinned_message(bot, message) 222 | 223 | 224 | # Start the bot 225 | asyncio.run(bot.polling()) 226 | logger.info('Bot has started.') 227 | -------------------------------------------------------------------------------- /gugumoe_bot/db/mongodb_helper.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | from typing import Any, Dict, Optional 3 | 4 | from loguru import logger 5 | from motor.motor_asyncio import AsyncIOMotorClient 6 | 7 | from gugumoe_bot.settings import settings 8 | 9 | CONFIG_MONGODB = { 10 | "host": settings.mongodb_url, 11 | "db_name": settings.mongodb_db_name, 12 | "collection_jrrp": settings.mongodb_collection_jrrp, 13 | } 14 | 15 | 16 | class MongoDBHelper: 17 | """MongoDB Helper Class.""" 18 | 19 | def __init__(self) -> None: 20 | """Initializes the MongoDBHelper instance.""" 21 | self.client = AsyncIOMotorClient( 22 | CONFIG_MONGODB["host"], 23 | ) 24 | self.db = self.client[CONFIG_MONGODB["db_name"]] 25 | self.jrrp_collection = self.db[CONFIG_MONGODB["collection_jrrp"]] 26 | 27 | async def initialize_db(self) -> bool: 28 | """Initialize the database.""" 29 | config_collection = self.db['config'] 30 | config = await config_collection.find_one({'name': 'jrrp'}) 31 | 32 | if config and config.get('initialized'): 33 | return True 34 | 35 | try: 36 | await self.jrrp_collection.create_index( 37 | [("user_id", 1), ("date", 1), ("jrrp_nub", 1)], unique=True 38 | ) 39 | await config_collection.insert_one({'name': 'jrrp', 'initialized': True}) 40 | return True 41 | except Exception as e: 42 | logger.error(f"Failed to initialize database: {e}") 43 | return False 44 | 45 | # 检测jrrp数据库是否存在 46 | async def check_jrrp_db(self) -> bool: 47 | """Check if the database exists.""" 48 | try: 49 | await self.jrrp_collection.find_one() 50 | return True 51 | except Exception as e: 52 | logger.error(f"Failed to check database: {e}") 53 | return False 54 | 55 | async def store_daily_luck(self, user_id: str, date: datetime.date, luck_number: int) -> bool: 56 | """Store the user's luck number for the day in the database.""" 57 | try: 58 | datetime_obj = datetime.datetime(date.year, date.month, date.day) 59 | document = {"user_id": user_id, "date": datetime_obj, "jrrp_nub": luck_number} 60 | await self.jrrp_collection.insert_one(document) 61 | return True 62 | except Exception as e: 63 | logger.error(f"Failed to store daily luck: {e}") 64 | return False 65 | 66 | # 只通过user_id获取jrrp 67 | async def get_daily_luck(self, user_id: str) -> Optional[Dict[str, Any]]: 68 | """Get the user's luck number for the day from the database.""" 69 | try: 70 | document = await self.jrrp_collection.find_one({"user_id": user_id}) 71 | return document 72 | except Exception as e: 73 | logger.error(f"Failed to get daily luck: {e}") 74 | return None 75 | 76 | async def update_daily_luck(self, user_id: str, new_date: Optional[datetime.date] = None, 77 | new_luck_number: Optional[int] = None, 78 | ) -> bool: 79 | """Update the date or luck number for a given user ID.""" 80 | # 基于UID更新日期和幸运数值 81 | try: 82 | # datetime_obj = datetime.datetime(date.year, date.month, date.day) 83 | new_datetime_obj = datetime.datetime(new_date.year, new_date.month, new_date.day) 84 | await self.jrrp_collection.update_one( 85 | {"user_id": user_id}, 86 | {"$set": {"date": new_datetime_obj, "jrrp_nub": new_luck_number}}, 87 | ) 88 | return True 89 | except Exception as e: 90 | logger.error(f"Failed to update daily luck: {e}") 91 | return False 92 | 93 | async def check_user_exists(self, user_id: str) -> bool: 94 | """Check if a user ID exists in the database.""" 95 | try: 96 | document = await self.jrrp_collection.find_one({"user_id": user_id}) 97 | return document is not None 98 | except Exception as e: 99 | logger.error(f"Failed to check user existence: {e}") 100 | return False 101 | -------------------------------------------------------------------------------- /gugumoe_bot/fonts/Sarasa-Mono-SC-Bold-Nerd.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GooGuJiang/Gugumoe-bot/919036693d79c98cca9e5be9a31166f5a19ecec4/gugumoe_bot/fonts/Sarasa-Mono-SC-Bold-Nerd.ttf -------------------------------------------------------------------------------- /gugumoe_bot/fonts/Sarasa-Mono-SC-Semibold-Nerd.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GooGuJiang/Gugumoe-bot/919036693d79c98cca9e5be9a31166f5a19ecec4/gugumoe_bot/fonts/Sarasa-Mono-SC-Semibold-Nerd.ttf -------------------------------------------------------------------------------- /gugumoe_bot/plugin_interface.py: -------------------------------------------------------------------------------- 1 | from typing import Any 2 | 3 | from telebot.types import Message, CallbackQuery 4 | 5 | 6 | class PluginInterface: 7 | command: str = None 8 | 9 | async def handle_message(self, bot: Any, message: Message) -> None: 10 | pass 11 | 12 | async def handle_command(self, bot: Any, message: Message) -> None: 13 | pass 14 | 15 | async def handle_callback_query(self, bot: Any, call: CallbackQuery) -> None: 16 | pass 17 | 18 | async def handle_audio(self, bot: Any, message: Message) -> None: 19 | pass 20 | 21 | async def handle_video(self, bot: Any, message: Message) -> None: 22 | pass 23 | 24 | async def handle_photo(self, bot: Any, message: Message) -> None: 25 | pass 26 | 27 | async def handle_document(self, bot: Any, message: Message) -> None: 28 | pass 29 | 30 | async def handle_sticker(self, bot: Any, message: Message) -> None: 31 | pass 32 | 33 | async def handle_voice(self, bot: Any, message: Message) -> None: 34 | pass 35 | 36 | async def handle_video_note(self, bot: Any, message: Message) -> None: 37 | pass 38 | 39 | async def handle_contact(self, bot: Any, message: Message) -> None: 40 | pass 41 | 42 | async def handle_location(self, bot: Any, message: Message) -> None: 43 | pass 44 | 45 | async def handle_venue(self, bot: Any, message: Message) -> None: 46 | pass 47 | 48 | async def handle_poll(self, bot: Any, message: Message) -> None: 49 | pass 50 | 51 | async def handle_dice(self, bot: Any, message: Message) -> None: 52 | pass 53 | 54 | async def handle_new_chat_members(self, bot: Any, message: Message) -> None: 55 | pass 56 | 57 | async def handle_left_chat_member(self, bot: Any, message: Message) -> None: 58 | pass 59 | 60 | async def handle_new_chat_title(self, bot: Any, message: Message) -> None: 61 | pass 62 | 63 | async def handle_new_chat_photo(self, bot: Any, message: Message) -> None: 64 | pass 65 | 66 | async def handle_delete_chat_photo(self, bot: Any, message: Message) -> None: 67 | pass 68 | 69 | async def handle_group_chat_created(self, bot: Any, message: Message) -> None: 70 | pass 71 | 72 | async def handle_supergroup_chat_created(self, bot: Any, message: Message) -> None: 73 | pass 74 | 75 | async def handle_channel_chat_created(self, bot: Any, message: Message) -> None: 76 | pass 77 | 78 | async def handle_migrate_to_chat_id(self, bot: Any, message: Message) -> None: 79 | pass 80 | 81 | async def handle_migrate_from_chat_id(self, bot: Any, message: Message) -> None: 82 | pass 83 | 84 | async def handle_pinned_message(self, bot: Any, message: Message) -> None: 85 | pass 86 | -------------------------------------------------------------------------------- /gugumoe_bot/plugins/jrrp.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import concurrent.futures 3 | import socket 4 | from datetime import datetime 5 | 6 | import httpx 7 | import ntplib 8 | import pytz 9 | from loguru import logger 10 | 11 | from gugumoe_bot.db.mongodb_helper import MongoDBHelper 12 | from gugumoe_bot.plugin_interface import PluginInterface 13 | 14 | mongo = MongoDBHelper() 15 | 16 | 17 | async def jrrp_text_init(nub_in): 18 | nub = int(nub_in) 19 | if nub == 100: 20 | return "100 人品好评!!!" 21 | elif nub >= 90: 22 | return "今天的人品非常不错呢" 23 | elif nub >= 70: 24 | return "哇,人品还挺好的!" 25 | elif nub >= 60: 26 | return "今天是 非常¿ 不错的一天呢!" 27 | elif nub > 50: 28 | return f"{nub} 你的人品还不错呢" 29 | elif nub == 50: 30 | return "五五开!" 31 | elif nub >= 40: 32 | return f"还好还好只有 {nub}" 33 | elif nub >= 20: 34 | return f"{nub} 这数字太....要命了" 35 | elif nub >= 0: 36 | return "抽大奖¿" 37 | 38 | 39 | def get_local_time_in_utc_plus_8(): 40 | local_time = datetime.now() 41 | local_time = pytz.timezone('UTC').localize(local_time) 42 | local_time_in_utc_plus_8 = local_time.astimezone(pytz.timezone('Asia/Shanghai')) 43 | return local_time_in_utc_plus_8 44 | 45 | 46 | async def get_random_number(): 47 | url = 'https://www.random.org/integers/?num=1&min=0&max=100&col=1&base=10&format=plain&rnd=new' 48 | async with httpx.AsyncClient() as client: 49 | res = await client.get(url) 50 | return int(res.text.strip("\n")) 51 | 52 | 53 | def get_ntp_time_sync(host="pool.ntp.org"): 54 | ntp_client = ntplib.NTPClient() 55 | try: 56 | response = ntp_client.request(host) 57 | return datetime.fromtimestamp(response.tx_time) 58 | except (ntplib.NTPException, socket.gaierror, socket.timeout): 59 | logger.error("Error while syncing with NTP server, using local time in UTC+8 instead") 60 | return get_local_time_in_utc_plus_8() 61 | 62 | 63 | async def get_ntp_time(host="time.apple.com"): 64 | loop = asyncio.get_running_loop() 65 | 66 | with concurrent.futures.ThreadPoolExecutor() as pool: 67 | time = await loop.run_in_executor(pool, get_ntp_time_sync, host) 68 | return time 69 | 70 | 71 | async def convert_to_tz(time: datetime, tz: str = "Asia/Shanghai"): 72 | return time.astimezone(pytz.timezone(tz)) 73 | 74 | 75 | async def get_jrrp(user_id: int) -> str: 76 | """Get jrrp from database.""" 77 | try: 78 | try: 79 | today = await get_ntp_time() 80 | today = await convert_to_tz(today) 81 | today = today.date() 82 | except Exception as e: 83 | logger.error(f"Error while getting NTP time: {e}, using local time instead") 84 | today = datetime.now() 85 | today = today.date() 86 | 87 | user_id = str(user_id) 88 | document = await mongo.get_daily_luck(user_id) 89 | # 只取日期, 不取时间 90 | if document is not None and document["date"].date() == today: 91 | return f'今天的人品是:{document["jrrp_nub"]}\n你今天已经抽过人品了哦' 92 | else: 93 | try: 94 | luck_number = await get_random_number() 95 | except Exception as e: 96 | luck_number = hash(str(user_id) + str(today)) % 100 97 | # 如果日期不是今天,就存入数据库 98 | if document is not None and document["date"].date() != today: 99 | await mongo.update_daily_luck(user_id, today, luck_number) 100 | else: 101 | await mongo.store_daily_luck(user_id, today, luck_number) 102 | return f'今天的人品是:{luck_number}\n{await jrrp_text_init(luck_number)}' 103 | except Exception as e: 104 | logger.error(f"Error while getting jrrp: {e}") 105 | return "获取人品失败了呢" 106 | 107 | 108 | class JrrpPlugin(PluginInterface): 109 | command = 'jrrp' 110 | 111 | async def handle_command(self, bot, message): 112 | """Handle the /jrrp command.""" 113 | if message.from_user.id == 136817688: 114 | user_id = message.sender_chat.id 115 | else: 116 | user_id = message.from_user.id 117 | await bot.send_chat_action(message.chat.id, 'typing') 118 | await bot.reply_to(message, await get_jrrp(user_id), parse_mode='HTML') 119 | -------------------------------------------------------------------------------- /gugumoe_bot/settings.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | from tempfile import gettempdir 3 | 4 | from pydantic_settings import BaseSettings, SettingsConfigDict 5 | 6 | TEMP_DIR = Path(gettempdir()) 7 | 8 | 9 | class Settings(BaseSettings): 10 | """ 11 | Bot settings. 12 | """ 13 | 14 | log_level: str = "INFO" 15 | 16 | # Bot token 17 | token: str = "" 18 | proxy: str = "" 19 | username: str = "" 20 | 21 | # MongoDB settings 22 | mongodb_url: str = "" 23 | mongodb_db_name: str = "gugumoe_bot" 24 | mongodb_collection_jrrp: str = "jrrp" 25 | 26 | # Redis settings 27 | redis_host: str = "localhost" 28 | redis_port: int = 6379 29 | redis_password: str = "" 30 | 31 | model_config = SettingsConfigDict( 32 | env_file=".env", 33 | env_prefix="GUGUMOE_BOT_", 34 | env_file_encoding="utf-8", 35 | ) 36 | 37 | 38 | settings = Settings() 39 | -------------------------------------------------------------------------------- /gugumoe_bot/utils/nexttrace_helper.py: -------------------------------------------------------------------------------- 1 | import math 2 | import os 3 | import platform 4 | import subprocess 5 | from io import BytesIO 6 | 7 | from PIL import Image, ImageDraw, ImageFont 8 | from loguru import logger 9 | 10 | # 获取当前文件上一级目录 11 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 12 | 13 | 14 | def parse_nexttrace_output(output): 15 | lines = output.strip().split('\n')[4:] # skip the header lines 16 | hops = [] 17 | 18 | i = 0 19 | while i < len(lines): 20 | line = lines[i].strip() 21 | 22 | if line: 23 | parts = line.split() 24 | 25 | # Check if line is a hop (starts with a number) or a response time 26 | if parts[0].isdigit(): 27 | # Initialize a basic hop dictionary 28 | hop = { 29 | "number": int(parts[0]), 30 | "ip": parts[1], 31 | } 32 | 33 | # Fill in additional information if available 34 | if len(parts) > 2: 35 | hop["as_number"] = parts[2] if "AS" in parts[2] else None 36 | hop["location"] = " ".join(parts[3:-1]) if len(parts) > 3 else None 37 | hop["website"] = parts[-1] if "." in parts[-1] else None 38 | 39 | # If the next line contains response time 40 | if i + 1 < len(lines) and "ms" in lines[i + 1]: 41 | i += 1 42 | hop["response_times"] = lines[i].strip() 43 | 44 | hops.append(hop) 45 | 46 | i += 1 47 | 48 | return hops 49 | 50 | 51 | def run_traceroute(host): 52 | """Runs the nexttrace command and returns the output as a string.""" 53 | current_os = platform.system().lower() 54 | 55 | # 根据操作系统来确定使用哪个命令 56 | if current_os == 'windows': 57 | cmd = ['nexttrace', '--map=false', '-q', '1', '--send-time', '1', host] 58 | elif current_os == 'linux': 59 | cmd = ['nexttrace', '--map=false', '-q', '1', '--send-time', '1', host] 60 | else: 61 | logger.error(f"Unsupported platform: {current_os}") 62 | return 63 | 64 | # 使用subprocess.Popen来执行命令 65 | process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, 66 | encoding='utf-8') 67 | 68 | results = '' 69 | 70 | # 读取子进程的输出 71 | for line in iter(process.stdout.readline, ''): 72 | line = line.strip() # 去除行尾的 \n 73 | # 组合成文本 74 | results += line + '\n' 75 | 76 | return results 77 | 78 | 79 | class NextTraceHelper: 80 | 81 | def __init__(self): 82 | self.colors = { 83 | "number": "#fdc47d", 84 | "ip": "#d2549a", 85 | "as_number": "#3ed7b9", 86 | "as_number_asterisk": "#1fb065", 87 | "location": "#e2e3e8", 88 | "response_times_text": "#8d91a5", 89 | "response_times": "#44a7ff", 90 | "asterisk": "#e2e3e8", 91 | "website": "#1bb568", 92 | "bg": "#141729" 93 | } 94 | 95 | def nexttrace_generate_image(self, json_list): 96 | def draw_colored_text(draw, x, y, text, key, font): 97 | color = self.colors.get(key, "black") 98 | draw.text((x, y), text, font=font, fill=color) 99 | return font.getlength(text) 100 | 101 | font_size = 20 102 | font = ImageFont.truetype(f"{BASE_DIR}/fonts/Sarasa-Mono-SC-Semibold-Nerd.ttf", font_size) 103 | bold_font = ImageFont.truetype(f"{BASE_DIR}/fonts/Sarasa-Mono-SC-Bold-Nerd.ttf", font_size) 104 | # 计算每一项的最大宽度 105 | number_width = max([bold_font.getlength("{:<4}".format(item["number"])) for item in json_list]) + 10 106 | ip_width = max([bold_font.getlength(item["ip"]) for item in json_list]) + 10 107 | as_number_width = max([bold_font.getlength(item.get("as_number") or "*") for item in json_list]) 108 | location_width = max([bold_font.getlength(item.get("location", "")) for item in json_list]) 109 | website_width = max([font.getlength(item.get("website") or "") for item in json_list]) + 10 110 | response_times_width = max([bold_font.getlength(item.get("response_times", "")) for item in json_list]) 111 | 112 | # 根据最大宽度来计算整个图片的最大宽度 113 | max_width = 10 + number_width + ip_width + as_number_width + location_width + website_width + response_times_width 114 | 115 | max_width = math.ceil(max_width) + 130 # 加上左右的间距 116 | ip_width = max([bold_font.getlength("{:<15}".format(item["ip"])) for item in json_list]) 117 | 118 | # 绘制每一行 119 | lines = [] 120 | for item in json_list: 121 | image = Image.new('RGB', (max_width, font_size * 4), color=self.colors["bg"]) # 设置为4倍的字体高度 122 | draw = ImageDraw.Draw(image) 123 | 124 | x = 10 125 | y = 10 126 | 127 | x += draw_colored_text(draw, x, y, "{:<4}".format(item["number"]), "number", bold_font) 128 | x += draw_colored_text(draw, x, y, "{:<16}".format(item["ip"]), "ip", bold_font) 129 | x += draw_colored_text(draw, x, y, "{:<10}".format(item.get("as_number") or "*"), "as_number", bold_font) 130 | x += draw_colored_text(draw, x, y, "{:<40}".format(item.get("location", "")), "location", bold_font) 131 | x += draw_colored_text(draw, x, y, "{:<10}".format(item.get("website") or ""), "website", font) 132 | 133 | align_x = ip_width + as_number_width + location_width + website_width + 150 # 对齐的x坐标 134 | # 移动response_times到下一行,并与ip对齐 135 | if len(item.get("response_times", "").split(" ")) >= 3: 136 | # x = align_x - font.getlength(item.get("response_times", "")) 137 | y += font_size + 10 # 移动到下一行 138 | response_times_ms = item.get("response_times", "").split(" ", 1)[1] 139 | response_times_text = item.get("response_times", "").split(" ", 1)[0] 140 | x_1 = align_x - font.getlength(response_times_ms) 141 | draw_colored_text(draw, x_1, y, response_times_ms, "response_times", bold_font) 142 | draw_colored_text(draw, 50, y, response_times_text, "response_times_text", bold_font) 143 | else: 144 | x = align_x - font.getlength(item.get("response_times", "")) 145 | y += font_size + 10 # 移动到下一行 146 | draw_colored_text(draw, x, y, item.get("response_times", ""), "response_times", bold_font) 147 | lines.append(image) 148 | 149 | # 合并图像 150 | final_height = sum([img.height for img in lines]) 151 | final_image = Image.new('RGB', (max_width, final_height), color=self.colors["bg"]) 152 | 153 | y_offset = 0 154 | for img in lines: 155 | final_image.paste(img, (0, y_offset)) 156 | y_offset += img.height 157 | 158 | img_byte_array = BytesIO() 159 | final_image.save(img_byte_array, format='PNG') 160 | return img_byte_array.getvalue() 161 | 162 | def execute_and_generate_image(self, host): 163 | results = run_traceroute(host) 164 | hops = parse_nexttrace_output(results) 165 | return self.nexttrace_generate_image(hops) 166 | 167 | 168 | if __name__ == '__main__': 169 | helper = NextTraceHelper() 170 | img_bytes = helper.execute_and_generate_image("58.49.243.65") 171 | with open("traceroute_result.png", "wb") as f: 172 | f.write(img_bytes) 173 | -------------------------------------------------------------------------------- /gugumoe_bot/utils/nslookup_helper.py: -------------------------------------------------------------------------------- 1 | import ipaddress 2 | import re 3 | 4 | import dns.resolver 5 | 6 | 7 | def identify_and_extract_ip(input_str): 8 | # Patterns 9 | domain_pattern = r'^[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?$' 10 | url_pattern = r'https?://([\w\-\.]+)/?' 11 | 12 | # Try to interpret as IP address 13 | try: 14 | ip = ipaddress.ip_address(input_str) 15 | if ip.version == 4: 16 | if ip.is_loopback: 17 | return "Loopback", input_str 18 | elif ip.is_private: 19 | return "Private", input_str 20 | else: 21 | return "IPv4", input_str 22 | elif ip.version == 6: 23 | if ip.is_loopback: 24 | return "Loopback", input_str 25 | elif ip.is_private: 26 | return "Private", input_str 27 | else: 28 | return "IPv6", input_str 29 | except ValueError: 30 | pass 31 | 32 | # Check URL 33 | match = re.match(url_pattern, input_str) 34 | if match: 35 | domain = match.group(1) 36 | if re.match(domain_pattern, domain): 37 | return "Domain", domain 38 | 39 | # Check Domain 40 | if re.match(domain_pattern, input_str): 41 | return "Domain", input_str 42 | 43 | return "Unknown", None 44 | 45 | 46 | def get_records(domain, nameserver="1.1.1.1"): 47 | # 创建一个解析器实例 48 | resolver = dns.resolver.Resolver() 49 | 50 | # 指定DNS服务器 51 | resolver.nameservers = [nameserver] 52 | 53 | # 定义字典用来保存解析结果 54 | records = {'A': [], 'AAAA': []} 55 | 56 | for record_type in ['A', 'AAAA']: 57 | try: 58 | # 使用resolver.resolve进行解析 59 | answers = resolver.resolve(domain, record_type) 60 | for rdata in answers: 61 | records[record_type].append(rdata.to_text()) 62 | except dns.resolver.NoAnswer: 63 | print(f"No {record_type} record found for {domain}") 64 | except dns.resolver.NXDOMAIN: 65 | print(f"Domain {domain} does not exist") 66 | break 67 | return records 68 | 69 | 70 | if __name__ == '__main__': 71 | print(get_records('www.gmoe.cc', '1.1.1.1')) # 使用Google的公共DNS服务器 72 | -------------------------------------------------------------------------------- /gugumoe_bot/utils/redis_helper.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | 3 | import redis.asyncio as redis 4 | 5 | from gugumoe_bot.settings import settings 6 | 7 | redis_setting = { 8 | "host": settings.redis_host, 9 | "port": settings.redis_port, 10 | "password": settings.redis_password, 11 | } 12 | 13 | 14 | class RedisHelper: 15 | 16 | def __init__(self): 17 | self.redis = redis.Redis(host=redis_setting["host"], port=redis_setting["port"], 18 | password=redis_setting["password"]) 19 | 20 | async def set_object(self, key, obj, expire=None): 21 | """将对象存储到Redis中。""" 22 | serialized_value = pickle.dumps(obj) 23 | await self.redis.set(key, serialized_value) 24 | 25 | if expire: 26 | await self.redis.expire(key, expire) 27 | 28 | async def get_object(self, key): 29 | """从Redis中检索对象。""" 30 | serialized_value = await self.redis.get(key) 31 | if serialized_value: 32 | return pickle.loads(serialized_value) 33 | else: 34 | return None 35 | 36 | async def delete_object(self, key): 37 | """从Redis中删除对象。""" 38 | await self.redis.delete(key) 39 | return True 40 | 41 | 42 | # 使用示例 43 | if __name__ == '__main__': 44 | import asyncio 45 | 46 | 47 | async def main(): 48 | redis_helper = RedisHelper() 49 | await redis_helper.set_object("test_key", {"name": "John", "age": 30}, expire=60) 50 | retrieved_data = await redis_helper.get_object("test_key") 51 | print(retrieved_data) 52 | 53 | 54 | asyncio.run(main()) 55 | -------------------------------------------------------------------------------- /invalidate/nexttrace.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | 3 | from telebot.types import InlineKeyboardMarkup, InlineKeyboardButton 4 | 5 | import gugumoe_bot.utils.nslookup_helper as nslookup_helper 6 | from gugumoe_bot.plugin_interface import PluginInterface 7 | from gugumoe_bot.utils.nexttrace_helper import NextTraceHelper 8 | from gugumoe_bot.utils.redis_helper import RedisHelper 9 | 10 | CANCEL_SEC = 60 11 | 12 | 13 | def generate_hash(data: str) -> str: 14 | sha256 = hashlib.sha256() 15 | sha256.update(data.encode('utf-8')) 16 | return sha256.hexdigest() 17 | 18 | 19 | class NexttracePlugin(PluginInterface): 20 | command = 'gutrace' 21 | 22 | def __init__(self): 23 | self.nexttrace_helper = NextTraceHelper() 24 | self.redis_helper = RedisHelper() 25 | 26 | async def handle_command(self, bot, message): 27 | await bot.send_chat_action(message.chat.id, 'typing') 28 | if len(message.text.split()) == 1: 29 | await bot.reply_to(message, "抱歉,指令格式似乎存在错误呢。\n正确的格式应为:*/guip_trace [地址]* ", 30 | parse_mode="Markdown") 31 | return 32 | host = message.text.split()[1] 33 | get_identify_and_extract_ip = nslookup_helper.identify_and_extract_ip(host) 34 | if get_identify_and_extract_ip[0] == "Unknown": 35 | await bot.reply_to(message, "抱歉,咕小酱貌似无法识别这个地址的类型呢。") 36 | return 37 | 38 | if get_identify_and_extract_ip[0] == "Loopback": 39 | await bot.reply_to(message, "抱歉,咕小酱认为这个地址是本地回环地址,已经拒绝你的请求啦。") 40 | return 41 | 42 | if get_identify_and_extract_ip[0] == "Private": 43 | await bot.reply_to(message, "抱歉,咕小酱认为这个地址是私有地址,已经拒绝你的请求啦。") 44 | return 45 | 46 | if get_identify_and_extract_ip[0] == "Domain": 47 | host = get_identify_and_extract_ip[1] 48 | msg_tmp = await bot.reply_to(message, "咕小酱正在尝试解析域名,请稍等哦。") 49 | get_records = nslookup_helper.get_records(host) 50 | if len(get_records['A']) == 0 and len(get_records['AAAA']) == 0: 51 | await bot.edit_message_text("抱歉,咕小酱貌似无法解析这个域名呢。", message.chat.id, msg_tmp.message_id) 52 | return 53 | if len(get_records['A']) == 1 and len(get_records['AAAA']) == 0: 54 | ipv4 = get_records['A'][0] 55 | gu_tmp_msg = await bot.edit_message_text("咕小酱已经成功解析域名,正在尝试进行下路由追踪,请稍等哦。", 56 | message.chat.id, 57 | msg_tmp.message_id) 58 | image_data = self.nexttrace_helper.execute_and_generate_image(ipv4) 59 | await bot.send_chat_action(message.chat.id, 'upload_photo') 60 | await bot.send_photo(message.chat.id, image_data, reply_to_message_id=message.message_id) 61 | await bot.delete_message(message.chat.id, gu_tmp_msg.message_id) 62 | return 63 | if len(get_records['A']) == 0 and len(get_records['AAAA']) == 1: 64 | ipv6 = get_records['AAAA'][0] 65 | gu_tmp_msg = bot.edit_message_text("咕小酱已经成功解析域名,正在尝试进行路由追踪,请稍等哦。", 66 | message.chat.id, 67 | msg_tmp.message_id) 68 | image_data = self.nexttrace_helper.execute_and_generate_image(ipv6) 69 | await bot.send_chat_action(message.chat.id, 'upload_photo') 70 | await bot.send_photo(message.chat.id, image_data, reply_to_message_id=message.message_id) 71 | await bot.delete_message(message.chat.id, gu_tmp_msg.message_id) 72 | return 73 | if len(get_records['A']) >= 1 and len(get_records['AAAA']) >= 1: 74 | make_json_v4 = { 75 | "action": "nexttrace", 76 | "ips": get_records['A'], 77 | "message_id": msg_tmp.message_id, 78 | "chat_id": message.chat.id, 79 | "user_id": message.from_user.id, 80 | "tmp_message_id": msg_tmp.message_id, 81 | "host": host 82 | } 83 | make_json_v6 = { 84 | "action": "nexttrace", 85 | "ips": get_records['AAAA'], 86 | "message_id": msg_tmp.message_id, 87 | "chat_id": message.chat.id, 88 | "user_id": message.from_user.id, 89 | "tmp_message_id": msg_tmp.message_id, 90 | "host": host 91 | } 92 | make_hash_v4 = generate_hash(str(make_json_v4)) 93 | make_hash_v6 = generate_hash(str(make_json_v6)) 94 | 95 | await self.redis_helper.set_object(make_hash_v4, make_json_v4, expire=CANCEL_SEC) 96 | await self.redis_helper.set_object(make_hash_v6, make_json_v6, expire=CANCEL_SEC) 97 | cancel_json = { 98 | "action": "cancel", 99 | "message_id": msg_tmp.message_id, 100 | "chat_id": message.chat.id, 101 | "user_id": message.from_user.id, 102 | "tmp_message_id": msg_tmp.message_id, 103 | "delete_hash_list": [make_hash_v4, make_hash_v6] 104 | } 105 | cancel_hash = generate_hash(str(cancel_json)) 106 | await self.redis_helper.set_object(cancel_hash, cancel_json, expire=CANCEL_SEC) 107 | keyboard = InlineKeyboardMarkup() 108 | keyboard.add( 109 | InlineKeyboardButton("IPv4", callback_data=make_hash_v4), 110 | InlineKeyboardButton("IPv6", callback_data=make_hash_v6) 111 | ) 112 | keyboard.add(InlineKeyboardButton("取消", callback_data=cancel_hash)) 113 | await bot.edit_message_text( 114 | f"咕小酱检测到这个域名同时存在IPv4和IPv6地址,请在 {CANCEL_SEC} 秒内选择要检测的类型:", 115 | message.chat.id, 116 | msg_tmp.message_id, reply_markup=keyboard) 117 | return 118 | if get_identify_and_extract_ip[0] == "IPv4" or get_identify_and_extract_ip[0] == "IPv6": 119 | ip = get_identify_and_extract_ip[1] 120 | msg_tmp = await bot.reply_to(message, "咕小酱正在尝试进行路由追踪,请稍等哦。") 121 | image_data = self.nexttrace_helper.execute_and_generate_image(ip) 122 | await bot.send_chat_action(message.chat.id, 'upload_photo') 123 | await bot.send_photo(message.chat.id, image_data, reply_to_message_id=message.message_id) 124 | await bot.delete_message(message.chat.id, msg_tmp.message_id) 125 | return 126 | 127 | async def handle_callback_query(self, bot, call): 128 | # await bot.answer_callback_query(call.id, "正在通知咕小酱响应事件,请稍等哦。") 129 | get_data = await self.redis_helper.get_object(call.data) 130 | if get_data is None: 131 | await bot.answer_callback_query(call.id, "抱歉,此请求无法找到或已失效。", show_alert=True) 132 | # 删除消息 133 | await bot.delete_message(call.message.chat.id, call.message.message_id) 134 | return 135 | if get_data['user_id'] != call.from_user.id: 136 | await bot.answer_callback_query(call.id, "抱歉,此请求不属于你。", show_alert=True) 137 | return 138 | if get_data['action'] == "cancel": 139 | await bot.answer_callback_query(call.id, "正在通知咕小酱响应事件,请稍等哦。") 140 | delete_hash_list = get_data["delete_hash_list"] 141 | for i in delete_hash_list: 142 | await self.redis_helper.delete_object(i) 143 | await bot.delete_message(call.message.chat.id, call.message.message_id) 144 | return 145 | if get_data['action'] == "nexttrace": 146 | if len(get_data["ips"]) > 1: 147 | await bot.answer_callback_query(call.id, "正在通知咕小酱响应事件,请稍等哦。") 148 | ips_list = get_data["ips"] 149 | keyboard = InlineKeyboardMarkup() 150 | delete_hash_list = [] 151 | for i in range(min(len(ips_list), 5)): 152 | ips_data = { 153 | "action": "nexttrace-start", 154 | "ip": ips_list[i], 155 | "message_id": get_data["message_id"], 156 | "chat_id": get_data["chat_id"], 157 | "user_id": get_data["user_id"], 158 | "tmp_message_id": get_data["tmp_message_id"], 159 | "host": get_data["host"] 160 | } 161 | ips_hash = generate_hash(str(ips_data)) 162 | await self.redis_helper.set_object(ips_hash, ips_data, expire=CANCEL_SEC) 163 | keyboard.add(InlineKeyboardButton(ips_list[i], callback_data=ips_hash)) 164 | delete_hash_list.append(ips_hash) 165 | cancel_json = { 166 | "action": "cancel", 167 | "message_id": get_data["message_id"], 168 | "chat_id": get_data["chat_id"], 169 | "user_id": get_data["user_id"], 170 | "tmp_message_id": get_data["tmp_message_id"], 171 | "delete_hash_list": delete_hash_list 172 | } 173 | cancel_hash = generate_hash(str(cancel_json)) 174 | await self.redis_helper.set_object(cancel_hash, cancel_json, expire=CANCEL_SEC) 175 | keyboard.add(InlineKeyboardButton("取消", callback_data=cancel_hash)) 176 | await bot.edit_message_text("咕小酱解析发现该域名存在多个地址,请选择一个进行路由跟踪", 177 | call.message.chat.id, 178 | call.message.message_id, reply_markup=keyboard) 179 | return 180 | if get_data['action'] == "nexttrace-start": 181 | await bot.answer_callback_query(call.id, "正在通知咕小酱响应事件,请稍等哦。") 182 | ip = get_data["ip"] 183 | await bot.send_chat_action(call.message.chat.id, 'typing') 184 | gu_tmp_msg = await bot.edit_message_text("咕小酱正在尝试进行路由追踪,请稍等哦。", call.message.chat.id, 185 | call.message.message_id) 186 | image_data = self.nexttrace_helper.execute_and_generate_image(ip) 187 | await bot.send_chat_action(call.message.chat.id, 'upload_photo') 188 | await bot.send_photo(call.message.chat.id, image_data, reply_to_message_id=get_data["tmp_message_id"]) 189 | await bot.delete_message(call.message.chat.id, gu_tmp_msg.message_id) 190 | return 191 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. 2 | 3 | [[package]] 4 | name = "aiohttp" 5 | version = "3.8.5" 6 | description = "Async http client/server framework (asyncio)" 7 | optional = false 8 | python-versions = ">=3.6" 9 | files = [ 10 | {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, 11 | {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, 12 | {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, 13 | {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, 14 | {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, 15 | {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, 16 | {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, 17 | {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, 18 | {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, 19 | {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, 20 | {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, 21 | {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, 22 | {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, 23 | {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, 24 | {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, 25 | {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, 26 | {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, 27 | {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, 28 | {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, 29 | {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, 30 | {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, 31 | {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, 32 | {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, 33 | {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, 34 | {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, 35 | {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, 36 | {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, 37 | {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, 38 | {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, 39 | {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, 40 | {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, 41 | {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, 42 | {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, 43 | {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, 44 | {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, 45 | {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, 46 | {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, 47 | {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, 48 | {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, 49 | {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, 50 | {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, 51 | {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, 52 | {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, 53 | {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, 54 | {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, 55 | {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, 56 | {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, 57 | {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, 58 | {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, 59 | {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, 60 | {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, 61 | {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, 62 | {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, 63 | {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, 64 | {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, 65 | {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, 66 | {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, 67 | {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, 68 | {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, 69 | {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, 70 | {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, 71 | {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, 72 | {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, 73 | {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, 74 | {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, 75 | {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, 76 | {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, 77 | {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, 78 | {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, 79 | {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, 80 | {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, 81 | {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, 82 | {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, 83 | {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, 84 | {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, 85 | {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, 86 | {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, 87 | {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, 88 | {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, 89 | {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, 90 | {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, 91 | {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, 92 | {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, 93 | {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, 94 | {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, 95 | {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, 96 | {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, 97 | ] 98 | 99 | [package.dependencies] 100 | aiosignal = ">=1.1.2" 101 | async-timeout = ">=4.0.0a3,<5.0" 102 | attrs = ">=17.3.0" 103 | charset-normalizer = ">=2.0,<4.0" 104 | frozenlist = ">=1.1.1" 105 | multidict = ">=4.5,<7.0" 106 | yarl = ">=1.0,<2.0" 107 | 108 | [package.extras] 109 | speedups = ["Brotli", "aiodns", "cchardet"] 110 | 111 | [[package]] 112 | name = "aiohttp-socks" 113 | version = "0.8.0" 114 | description = "Proxy connector for aiohttp" 115 | optional = false 116 | python-versions = "*" 117 | files = [ 118 | {file = "aiohttp_socks-0.8.0-py3-none-any.whl", hash = "sha256:bb662f50bb5d234f72e2b9ac85b655cb1aed806dce4fec71398b5a9ac0480c17"}, 119 | {file = "aiohttp_socks-0.8.0.tar.gz", hash = "sha256:927b1d3b347448f86ff5245c9ca19e40f397eb93906682be592790678c982f37"}, 120 | ] 121 | 122 | [package.dependencies] 123 | aiohttp = ">=2.3.2" 124 | python-socks = {version = ">=2.0.0,<3.0.0", extras = ["asyncio"]} 125 | 126 | [[package]] 127 | name = "aiosignal" 128 | version = "1.3.1" 129 | description = "aiosignal: a list of registered asynchronous callbacks" 130 | optional = false 131 | python-versions = ">=3.7" 132 | files = [ 133 | {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, 134 | {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, 135 | ] 136 | 137 | [package.dependencies] 138 | frozenlist = ">=1.1.0" 139 | 140 | [[package]] 141 | name = "annotated-types" 142 | version = "0.5.0" 143 | description = "Reusable constraint types to use with typing.Annotated" 144 | optional = false 145 | python-versions = ">=3.7" 146 | files = [ 147 | {file = "annotated_types-0.5.0-py3-none-any.whl", hash = "sha256:58da39888f92c276ad970249761ebea80ba544b77acddaa1a4d6cf78287d45fd"}, 148 | {file = "annotated_types-0.5.0.tar.gz", hash = "sha256:47cdc3490d9ac1506ce92c7aaa76c579dc3509ff11e098fc867e5130ab7be802"}, 149 | ] 150 | 151 | [[package]] 152 | name = "anyio" 153 | version = "3.7.1" 154 | description = "High level compatibility layer for multiple asynchronous event loop implementations" 155 | optional = false 156 | python-versions = ">=3.7" 157 | files = [ 158 | {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, 159 | {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, 160 | ] 161 | 162 | [package.dependencies] 163 | exceptiongroup = { version = "*", markers = "python_version < \"3.11\"" } 164 | idna = ">=2.8" 165 | sniffio = ">=1.1" 166 | 167 | [package.extras] 168 | doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] 169 | test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] 170 | trio = ["trio (<0.22)"] 171 | 172 | [[package]] 173 | name = "async-timeout" 174 | version = "4.0.2" 175 | description = "Timeout context manager for asyncio programs" 176 | optional = false 177 | python-versions = ">=3.6" 178 | files = [ 179 | {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, 180 | {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, 181 | ] 182 | 183 | [[package]] 184 | name = "attrs" 185 | version = "23.1.0" 186 | description = "Classes Without Boilerplate" 187 | optional = false 188 | python-versions = ">=3.7" 189 | files = [ 190 | {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, 191 | {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, 192 | ] 193 | 194 | [package.extras] 195 | cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] 196 | dev = ["attrs[docs,tests]", "pre-commit"] 197 | docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] 198 | tests = ["attrs[tests-no-zope]", "zope-interface"] 199 | tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] 200 | 201 | [[package]] 202 | name = "certifi" 203 | version = "2023.7.22" 204 | description = "Python package for providing Mozilla's CA Bundle." 205 | optional = false 206 | python-versions = ">=3.6" 207 | files = [ 208 | {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, 209 | {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, 210 | ] 211 | 212 | [[package]] 213 | name = "charset-normalizer" 214 | version = "3.2.0" 215 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 216 | optional = false 217 | python-versions = ">=3.7.0" 218 | files = [ 219 | {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, 220 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, 221 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, 222 | {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, 223 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, 224 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, 225 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, 226 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, 227 | {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, 228 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, 229 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, 230 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, 231 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, 232 | {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, 233 | {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, 234 | {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, 235 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, 236 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, 237 | {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, 238 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, 239 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, 240 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, 241 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, 242 | {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, 243 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, 244 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, 245 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, 246 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, 247 | {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, 248 | {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, 249 | {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, 250 | {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, 251 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, 252 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, 253 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, 254 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, 255 | {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, 256 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, 257 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, 258 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, 259 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, 260 | {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, 261 | {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, 262 | {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, 263 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, 264 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, 265 | {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, 266 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, 267 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, 268 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, 269 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, 270 | {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, 271 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, 272 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, 273 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, 274 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, 275 | {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, 276 | {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, 277 | {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, 278 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, 279 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, 280 | {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, 281 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, 282 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, 283 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, 284 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, 285 | {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, 286 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, 287 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, 288 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, 289 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, 290 | {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, 291 | {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, 292 | {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, 293 | {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, 294 | ] 295 | 296 | [[package]] 297 | name = "colorama" 298 | version = "0.4.6" 299 | description = "Cross-platform colored terminal text." 300 | optional = false 301 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" 302 | files = [ 303 | {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, 304 | {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, 305 | ] 306 | 307 | [[package]] 308 | name = "dnspython" 309 | version = "2.4.1" 310 | description = "DNS toolkit" 311 | optional = false 312 | python-versions = ">=3.8,<4.0" 313 | files = [ 314 | {file = "dnspython-2.4.1-py3-none-any.whl", hash = "sha256:5b7488477388b8c0b70a8ce93b227c5603bc7b77f1565afe8e729c36c51447d7"}, 315 | {file = "dnspython-2.4.1.tar.gz", hash = "sha256:c33971c79af5be968bb897e95c2448e11a645ee84d93b265ce0b7aabe5dfdca8"}, 316 | ] 317 | 318 | [package.extras] 319 | dnssec = ["cryptography (>=2.6,<42.0)"] 320 | doh = ["h2 (>=4.1.0)", "httpcore (>=0.17.3)", "httpx (>=0.24.1)"] 321 | doq = ["aioquic (>=0.9.20)"] 322 | idna = ["idna (>=2.1,<4.0)"] 323 | trio = ["trio (>=0.14,<0.23)"] 324 | wmi = ["wmi (>=1.5.1,<2.0.0)"] 325 | 326 | [[package]] 327 | name = "exceptiongroup" 328 | version = "1.1.2" 329 | description = "Backport of PEP 654 (exception groups)" 330 | optional = false 331 | python-versions = ">=3.7" 332 | files = [ 333 | { file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f" }, 334 | { file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5" }, 335 | ] 336 | 337 | [package.extras] 338 | test = ["pytest (>=6)"] 339 | 340 | [[package]] 341 | name = "frozenlist" 342 | version = "1.4.0" 343 | description = "A list-like structure which implements collections.abc.MutableSequence" 344 | optional = false 345 | python-versions = ">=3.8" 346 | files = [ 347 | {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, 348 | {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, 349 | {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, 350 | {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, 351 | {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, 352 | {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, 353 | {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, 354 | {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, 355 | {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, 356 | {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, 357 | {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, 358 | {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, 359 | {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, 360 | {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, 361 | {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, 362 | {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, 363 | {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, 364 | {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, 365 | {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, 366 | {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, 367 | {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, 368 | {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, 369 | {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, 370 | {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, 371 | {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, 372 | {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, 373 | {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, 374 | {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, 375 | {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, 376 | {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, 377 | {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, 378 | {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, 379 | {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, 380 | {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, 381 | {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, 382 | {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, 383 | {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, 384 | {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, 385 | {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, 386 | {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, 387 | {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, 388 | {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, 389 | {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, 390 | {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, 391 | {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, 392 | {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, 393 | {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, 394 | {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, 395 | {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, 396 | {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, 397 | {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, 398 | {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, 399 | {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, 400 | {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, 401 | {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, 402 | {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, 403 | {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, 404 | {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, 405 | {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, 406 | {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, 407 | {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, 408 | ] 409 | 410 | [[package]] 411 | name = "gunicorn" 412 | version = "21.2.0" 413 | description = "WSGI HTTP Server for UNIX" 414 | optional = false 415 | python-versions = ">=3.5" 416 | files = [ 417 | {file = "gunicorn-21.2.0-py3-none-any.whl", hash = "sha256:3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0"}, 418 | {file = "gunicorn-21.2.0.tar.gz", hash = "sha256:88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033"}, 419 | ] 420 | 421 | [package.dependencies] 422 | packaging = "*" 423 | 424 | [package.extras] 425 | eventlet = ["eventlet (>=0.24.1)"] 426 | gevent = ["gevent (>=1.4.0)"] 427 | setproctitle = ["setproctitle"] 428 | tornado = ["tornado (>=0.2)"] 429 | 430 | [[package]] 431 | name = "h11" 432 | version = "0.14.0" 433 | description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" 434 | optional = false 435 | python-versions = ">=3.7" 436 | files = [ 437 | {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, 438 | {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, 439 | ] 440 | 441 | [[package]] 442 | name = "hiredis" 443 | version = "2.2.3" 444 | description = "Python wrapper for hiredis" 445 | optional = false 446 | python-versions = ">=3.7" 447 | files = [ 448 | { file = "hiredis-2.2.3-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:9a1a80a8fa767f2fdc3870316a54b84fe9fc09fa6ab6a2686783de6a228a4604" }, 449 | { file = "hiredis-2.2.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3f006c28c885deb99b670a5a66f367a175ab8955b0374029bad7111f5357dcd4" }, 450 | { file = "hiredis-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ffaf841546905d90ff189de7397aa56413b1ce5e54547f17a98f0ebf3a3b0a3b" }, 451 | { file = "hiredis-2.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cadb0ac7ba3babfd804e425946bec9717b320564a1390f163a54af9365a720a" }, 452 | { file = "hiredis-2.2.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:33bc4721632ef9708fa44e5df0066053fccc8e65410a2c48573192517a533b48" }, 453 | { file = "hiredis-2.2.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:227c5b4bcb60f89008c275d596e4a7b6625a6b3c827b8a66ae582eace7051f71" }, 454 | { file = "hiredis-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61995eb826009d99ed8590747bc0da683a5f4fbb4faa8788166bf3810845cd5c" }, 455 | { file = "hiredis-2.2.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f969edc851efe23010e0f53a64269f2629a9364135e9ec81c842e8b2277d0c1" }, 456 | { file = "hiredis-2.2.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d27e560eefb57914d742a837f1da98d3b29cb22eff013c8023b7cf52ae6e051d" }, 457 | { file = "hiredis-2.2.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3759f4789ae1913b7df278dfc9e8749205b7a106f888cd2903d19461e24a7697" }, 458 | { file = "hiredis-2.2.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c6cb613148422c523945cdb8b6bed617856f2602fd8750e33773ede2616e55d5" }, 459 | { file = "hiredis-2.2.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:1d274d5c511dfc03f83f997d3238eaa9b6ee3f982640979f509373cced891e98" }, 460 | { file = "hiredis-2.2.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3b7fe075e91b9d9cff40eba4fb6a8eff74964d3979a39be9a9ef58b1b4cb3604" }, 461 | { file = "hiredis-2.2.3-cp310-cp310-win32.whl", hash = "sha256:77924b0d32fd1f493d3df15d9609ddf9d94c31a364022a6bf6b525ce9da75bea" }, 462 | { file = "hiredis-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:dcb0569dd5bfe6004658cd0f229efa699a3169dcb4f77bd72e188adda302063d" }, 463 | { file = "hiredis-2.2.3-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:d115790f18daa99b5c11a506e48923b630ef712e9e4b40482af942c3d40638b8" }, 464 | { file = "hiredis-2.2.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c3b8be557e08b234774925622e196f0ee36fe4eab66cd19df934d3efd8f3743" }, 465 | { file = "hiredis-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f5446068197b35a11ccc697720c41879c8657e2e761aaa8311783aac84cef20" }, 466 | { file = "hiredis-2.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa17a3b22b3726d54d7af20394f65d4a1735a842a4e0f557dc67a90f6965c4bc" }, 467 | { file = "hiredis-2.2.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7df645b6b7800e8b748c217fbd6a4ca8361bcb9a1ae6206cc02377833ec8a1aa" }, 468 | { file = "hiredis-2.2.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2fb9300959a0048138791f3d68359d61a788574ec9556bddf1fec07f2dbc5320" }, 469 | { file = "hiredis-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d7e459fe7313925f395148d36d9b7f4f8dac65be06e45d7af356b187cef65fc" }, 470 | { file = "hiredis-2.2.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8eceffca3941775b646cd585cd19b275d382de43cc3327d22f7c75d7b003d481" }, 471 | { file = "hiredis-2.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b17baf702c6e5b4bb66e1281a3efbb1d749c9d06cdb92b665ad81e03118f78fc" }, 472 | { file = "hiredis-2.2.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e43e2b5acaad09cf48c032f7e4926392bb3a3f01854416cf6d82ebff94d5467" }, 473 | { file = "hiredis-2.2.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a7205497d7276a81fe92951a29616ef96562ed2f91a02066f72b6f93cb34b40e" }, 474 | { file = "hiredis-2.2.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:126623b03c31cb6ac3e0d138feb6fcc36dd43dd34fc7da7b7a0c38b5d75bc896" }, 475 | { file = "hiredis-2.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:071c5814b850574036506a8118034f97c3cbf2fe9947ff45a27b07a48da56240" }, 476 | { file = "hiredis-2.2.3-cp311-cp311-win32.whl", hash = "sha256:d1be9e30e675f5bc1cb534633324578f6f0944a1bcffe53242cf632f554f83b6" }, 477 | { file = "hiredis-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9a7c987e161e3c58f992c63b7e26fea7fe0777f3b975799d23d65bbb8cb5899" }, 478 | { file = "hiredis-2.2.3-cp37-cp37m-macosx_10_12_x86_64.whl", hash = "sha256:f2dcb8389fa3d453927b1299f46bdb38473c293c8269d5c777d33ea0e526b610" }, 479 | { file = "hiredis-2.2.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2df98f5e071320c7d84e8bd07c0542acdd0a7519307fc31774d60e4b842ec4f" }, 480 | { file = "hiredis-2.2.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:61a72e4a523cdfc521762137559c08dfa360a3caef63620be58c699d1717dac1" }, 481 | { file = "hiredis-2.2.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9b9e5bde7030cae83aa900b5bd660decc65afd2db8c400f3c568c815a47ca2a" }, 482 | { file = "hiredis-2.2.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd2614f17e261f72efc2f19f5e5ff2ee19e2296570c0dcf33409e22be30710de" }, 483 | { file = "hiredis-2.2.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:46525fbd84523cac75af5bf524bc74aaac848beaf31b142d2df8a787d9b4bbc4" }, 484 | { file = "hiredis-2.2.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d1a4ce40ba11da9382c14da31f4f9e88c18f7d294f523decd0fadfb81f51ad18" }, 485 | { file = "hiredis-2.2.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cda592405bbd29d53942e0389dc3fa77b49c362640210d7e94a10c14a677d4d" }, 486 | { file = "hiredis-2.2.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5e6674a017629284ef373b50496d9fb1a89b85a20a7fa100ecd109484ec748e5" }, 487 | { file = "hiredis-2.2.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:e62ec131816c6120eff40dffe43424e140264a15fa4ab88c301bd6a595913af3" }, 488 | { file = "hiredis-2.2.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:17e938d9d3ee92e1adbff361706f1c36cc60eeb3e3eeca7a3a353eae344f4c91" }, 489 | { file = "hiredis-2.2.3-cp37-cp37m-win32.whl", hash = "sha256:95d2305fd2a7b179cacb48b10f618872fc565c175f9f62b854e8d1acac3e8a9e" }, 490 | { file = "hiredis-2.2.3-cp37-cp37m-win_amd64.whl", hash = "sha256:8f9dbe12f011a9b784f58faecc171d22465bb532c310bd588d769ba79a59ef5a" }, 491 | { file = "hiredis-2.2.3-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:5a4bcef114fc071d5f52c386c47f35aae0a5b43673197b9288a15b584da8fa3a" }, 492 | { file = "hiredis-2.2.3-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:232d0a70519865741ba56e1dfefd160a580ae78c30a1517bad47b3cf95a3bc7d" }, 493 | { file = "hiredis-2.2.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9076ce8429785c85f824650735791738de7143f61f43ae9ed83e163c0ca0fa44" }, 494 | { file = "hiredis-2.2.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec58fb7c2062f835595c12f0f02dcda76d0eb0831423cc191d1e18c9276648de" }, 495 | { file = "hiredis-2.2.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f2b34a6444b8f9c1e9f84bd2c639388e5d14f128afd14a869dfb3d9af893aa2" }, 496 | { file = "hiredis-2.2.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:818dfd310aa1020a13cd08ee48e116dd8c3bb2e23b8161f8ac4df587dd5093d7" }, 497 | { file = "hiredis-2.2.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96d9ea6c8d4cbdeee2e0d43379ce2881e4af0454b00570677c59f33f2531cd38" }, 498 | { file = "hiredis-2.2.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1eadbcd3de55ac42310ff82550d3302cb4efcd4e17d76646a17b6e7004bb42b" }, 499 | { file = "hiredis-2.2.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:477c34c4489666dc73cb5e89dafe2617c3e13da1298917f73d55aac4696bd793" }, 500 | { file = "hiredis-2.2.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:14824e457e4f5cda685c3345d125da13949bcf3bb1c88eb5d248c8d2c3dee08f" }, 501 | { file = "hiredis-2.2.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9cd32326dfa6ce87edf754153b0105aca64486bebe93b9600ccff74fa0b224df" }, 502 | { file = "hiredis-2.2.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:51341e70b467004dcbec3a6ce8c478d2d6241e0f6b01e4c56764afd5022e1e9d" }, 503 | { file = "hiredis-2.2.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2443659c76b226267e2a04dbbb21bc2a3f91aa53bdc0c22964632753ae43a247" }, 504 | { file = "hiredis-2.2.3-cp38-cp38-win32.whl", hash = "sha256:4e3e3e31423f888d396b1fc1f936936e52af868ac1ec17dd15e3eeba9dd4de24" }, 505 | { file = "hiredis-2.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:20f509e3a1a20d6e5f5794fc37ceb21f70f409101fcfe7a8bde783894d51b369" }, 506 | { file = "hiredis-2.2.3-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:d20891e3f33803b26d54c77fd5745878497091e33f4bbbdd454cf6e71aee8890" }, 507 | { file = "hiredis-2.2.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:50171f985e17970f87d5a29e16603d1e5b03bdbf5c2691a37e6c912942a6b657" }, 508 | { file = "hiredis-2.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9944a2cac25ffe049a7e89f306e11b900640837d1ef38d9be0eaa4a4e2b73a52" }, 509 | { file = "hiredis-2.2.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a5c8019ff94988d56eb49b15de76fe83f6b42536d76edeb6565dbf7fe14b973" }, 510 | { file = "hiredis-2.2.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a286ded34eb16501002e3713b3130c987366eee2ba0d58c33c72f27778e31676" }, 511 | { file = "hiredis-2.2.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b3e974ad15eb32b1f537730dea70b93a4c3db7b026de3ad2b59da49c6f7454d" }, 512 | { file = "hiredis-2.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08415ea74c1c29b9d6a4ca3dd0e810dc1af343c1d1d442e15ba133b11ab5be6a" }, 513 | { file = "hiredis-2.2.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e17d04ea58ab8cf3f2dc52e875db16077c6357846006780086fff3189fb199d" }, 514 | { file = "hiredis-2.2.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6ccdcb635dae85b006592f78e32d97f4bc7541cb27829d505f9c7fefcef48298" }, 515 | { file = "hiredis-2.2.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69536b821dd1bc78058a6e7541743f8d82bf2d981b91280b14c4daa6cdc7faba" }, 516 | { file = "hiredis-2.2.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:3753df5f873d473f055e1f8837bfad0bd3b277c86f3c9bf058c58f14204cd901" }, 517 | { file = "hiredis-2.2.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6f88cafe46612b6fa68e6dea49e25bebf160598bba00101caa51cc8c1f18d597" }, 518 | { file = "hiredis-2.2.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:33ee3ea5cad3a8cb339352cd230b411eb437a2e75d7736c4899acab32056ccdb" }, 519 | { file = "hiredis-2.2.3-cp39-cp39-win32.whl", hash = "sha256:b4f3d06dc16671b88a13ae85d8ca92534c0b637d59e49f0558d040a691246422" }, 520 | { file = "hiredis-2.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4f674e309cd055ee7a48304ceb8cf43265d859faf4d7d01d270ce45e976ae9d3" }, 521 | { file = "hiredis-2.2.3-pp37-pypy37_pp73-macosx_10_12_x86_64.whl", hash = "sha256:8f280ab4e043b089777b43b4227bdc2035f88da5072ab36588e0ccf77d45d058" }, 522 | { file = "hiredis-2.2.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15c2a551f3b8a26f7940d6ee10b837810201754b8d7e6f6b1391655370882c5a" }, 523 | { file = "hiredis-2.2.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60c4e3c258eafaab21b174b17270a0cc093718d61cdbde8c03f85ec4bf835343" }, 524 | { file = "hiredis-2.2.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc36a9dded458d4e37492fe3e619c6c83caae794d26ad925adbce61d592f8428" }, 525 | { file = "hiredis-2.2.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:4ed68a3b1ccb4313d2a42546fd7e7439ad4745918a48b6c9bcaa61e1e3e42634" }, 526 | { file = "hiredis-2.2.3-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3bf4b5bae472630c229518e4a814b1b68f10a3d9b00aeaec45f1a330f03a0251" }, 527 | { file = "hiredis-2.2.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33a94d264e6e12a79d9bb8af333b01dc286b9f39c99072ab5fef94ce1f018e17" }, 528 | { file = "hiredis-2.2.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fa6811a618653164f918b891a0fa07052bd71a799defa5c44d167cac5557b26" }, 529 | { file = "hiredis-2.2.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af33f370be90b48bbaf0dab32decbdcc522b1fa95d109020a963282086518a8e" }, 530 | { file = "hiredis-2.2.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b9953d87418ac228f508d93898ab572775e4d3b0eeb886a1a7734553bcdaf291" }, 531 | { file = "hiredis-2.2.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5e7bb4dd524f50b71c20ef5a12bd61da9b463f8894b18a06130942fe31509881" }, 532 | { file = "hiredis-2.2.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89a258424158eb8b3ed9f65548d68998da334ef155d09488c5637723eb1cd697" }, 533 | { file = "hiredis-2.2.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f4a65276f6ecdebe75f2a53f578fbc40e8d2860658420d5e0611c56bbf5054c" }, 534 | { file = "hiredis-2.2.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:334f2738700b20faa04a0d813366fb16ed17287430a6b50584161d5ad31ca6d7" }, 535 | { file = "hiredis-2.2.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d194decd9608f11c777946f596f31d5aacad13972a0a87829ae1e6f2d26c1885" }, 536 | { file = "hiredis-2.2.3.tar.gz", hash = "sha256:e75163773a309e56a9b58165cf5a50e0f84b755f6ff863b2c01a38918fe92daa" }, 537 | ] 538 | 539 | [[package]] 540 | name = "httpcore" 541 | version = "0.17.3" 542 | description = "A minimal low-level HTTP client." 543 | optional = false 544 | python-versions = ">=3.7" 545 | files = [ 546 | {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, 547 | {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, 548 | ] 549 | 550 | [package.dependencies] 551 | anyio = ">=3.0,<5.0" 552 | certifi = "*" 553 | h11 = ">=0.13,<0.15" 554 | sniffio = "==1.*" 555 | 556 | [package.extras] 557 | http2 = ["h2 (>=3,<5)"] 558 | socks = ["socksio (==1.*)"] 559 | 560 | [[package]] 561 | name = "httpx" 562 | version = "0.24.1" 563 | description = "The next generation HTTP client." 564 | optional = false 565 | python-versions = ">=3.7" 566 | files = [ 567 | {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, 568 | {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, 569 | ] 570 | 571 | [package.dependencies] 572 | certifi = "*" 573 | httpcore = ">=0.15.0,<0.18.0" 574 | idna = "*" 575 | sniffio = "*" 576 | 577 | [package.extras] 578 | brotli = ["brotli", "brotlicffi"] 579 | cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] 580 | http2 = ["h2 (>=3,<5)"] 581 | socks = ["socksio (==1.*)"] 582 | 583 | [[package]] 584 | name = "idna" 585 | version = "3.4" 586 | description = "Internationalized Domain Names in Applications (IDNA)" 587 | optional = false 588 | python-versions = ">=3.5" 589 | files = [ 590 | {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, 591 | {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, 592 | ] 593 | 594 | [[package]] 595 | name = "loguru" 596 | version = "0.7.0" 597 | description = "Python logging made (stupidly) simple" 598 | optional = false 599 | python-versions = ">=3.5" 600 | files = [ 601 | {file = "loguru-0.7.0-py3-none-any.whl", hash = "sha256:b93aa30099fa6860d4727f1b81f8718e965bb96253fa190fab2077aaad6d15d3"}, 602 | {file = "loguru-0.7.0.tar.gz", hash = "sha256:1612053ced6ae84d7959dd7d5e431a0532642237ec21f7fd83ac73fe539e03e1"}, 603 | ] 604 | 605 | [package.dependencies] 606 | colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} 607 | win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} 608 | 609 | [package.extras] 610 | dev = ["Sphinx (==5.3.0)", "colorama (==0.4.5)", "colorama (==0.4.6)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v0.990)", "pre-commit (==3.2.1)", "pytest (==6.1.2)", "pytest (==7.2.1)", "pytest-cov (==2.12.1)", "pytest-cov (==4.0.0)", "pytest-mypy-plugins (==1.10.1)", "pytest-mypy-plugins (==1.9.3)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.2.0)", "tox (==3.27.1)", "tox (==4.4.6)"] 611 | 612 | [[package]] 613 | name = "motor" 614 | version = "3.2.0" 615 | description = "Non-blocking MongoDB driver for Tornado or asyncio" 616 | optional = false 617 | python-versions = ">=3.7" 618 | files = [ 619 | {file = "motor-3.2.0-py3-none-any.whl", hash = "sha256:82cd3d8a3b57e322c3fa382a393b52828c9a2e98b315c78af36f01bae78af6a6"}, 620 | {file = "motor-3.2.0.tar.gz", hash = "sha256:4fb1e8502260f853554f24115421584e83904a6debb577354d33e9711ee99008"}, 621 | ] 622 | 623 | [package.dependencies] 624 | pymongo = ">=4.4,<5" 625 | 626 | [package.extras] 627 | aws = ["pymongo[aws] (>=4.4,<5)"] 628 | encryption = ["pymongo[encryption] (>=4.4,<5)"] 629 | gssapi = ["pymongo[gssapi] (>=4.4,<5)"] 630 | ocsp = ["pymongo[ocsp] (>=4.4,<5)"] 631 | snappy = ["pymongo[snappy] (>=4.4,<5)"] 632 | srv = ["pymongo[srv] (>=4.4,<5)"] 633 | zstd = ["pymongo[zstd] (>=4.4,<5)"] 634 | 635 | [[package]] 636 | name = "multidict" 637 | version = "6.0.4" 638 | description = "multidict implementation" 639 | optional = false 640 | python-versions = ">=3.7" 641 | files = [ 642 | {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, 643 | {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, 644 | {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, 645 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, 646 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, 647 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, 648 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, 649 | {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, 650 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, 651 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, 652 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, 653 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, 654 | {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, 655 | {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, 656 | {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, 657 | {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, 658 | {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, 659 | {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, 660 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, 661 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, 662 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, 663 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, 664 | {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, 665 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, 666 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, 667 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, 668 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, 669 | {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, 670 | {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, 671 | {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, 672 | {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, 673 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, 674 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, 675 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, 676 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, 677 | {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, 678 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, 679 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, 680 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, 681 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, 682 | {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, 683 | {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, 684 | {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, 685 | {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, 686 | {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, 687 | {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, 688 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, 689 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, 690 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, 691 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, 692 | {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, 693 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, 694 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, 695 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, 696 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, 697 | {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, 698 | {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, 699 | {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, 700 | {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, 701 | {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, 702 | {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, 703 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, 704 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, 705 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, 706 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, 707 | {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, 708 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, 709 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, 710 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, 711 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, 712 | {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, 713 | {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, 714 | {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, 715 | {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, 716 | ] 717 | 718 | [[package]] 719 | name = "ntplib" 720 | version = "0.4.0" 721 | description = "Python NTP library" 722 | optional = false 723 | python-versions = "*" 724 | files = [ 725 | {file = "ntplib-0.4.0-py2.py3-none-any.whl", hash = "sha256:8d27375329ed7ff38755f7b6d4658b28edc147cadf40338a63a0da8133469d60"}, 726 | {file = "ntplib-0.4.0.tar.gz", hash = "sha256:899d8fb5f8c2555213aea95efca02934c7343df6ace9d7628a5176b176906267"}, 727 | ] 728 | 729 | [[package]] 730 | name = "packaging" 731 | version = "23.1" 732 | description = "Core utilities for Python packages" 733 | optional = false 734 | python-versions = ">=3.7" 735 | files = [ 736 | {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, 737 | {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, 738 | ] 739 | 740 | [[package]] 741 | name = "pillow" 742 | version = "10.0.0" 743 | description = "Python Imaging Library (Fork)" 744 | optional = false 745 | python-versions = ">=3.8" 746 | files = [ 747 | { file = "Pillow-10.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891" }, 748 | { file = "Pillow-10.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614" }, 749 | { file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b" }, 750 | { file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c" }, 751 | { file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1" }, 752 | { file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf" }, 753 | { file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3" }, 754 | { file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992" }, 755 | { file = "Pillow-10.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de" }, 756 | { file = "Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485" }, 757 | { file = "Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f" }, 758 | { file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3" }, 759 | { file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d" }, 760 | { file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd" }, 761 | { file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629" }, 762 | { file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538" }, 763 | { file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d" }, 764 | { file = "Pillow-10.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f" }, 765 | { file = "Pillow-10.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37" }, 766 | { file = "Pillow-10.0.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883" }, 767 | { file = "Pillow-10.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e" }, 768 | { file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640" }, 769 | { file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568" }, 770 | { file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223" }, 771 | { file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff" }, 772 | { file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551" }, 773 | { file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5" }, 774 | { file = "Pillow-10.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199" }, 775 | { file = "Pillow-10.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca" }, 776 | { file = "Pillow-10.0.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3" }, 777 | { file = "Pillow-10.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3" }, 778 | { file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43" }, 779 | { file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d" }, 780 | { file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530" }, 781 | { file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51" }, 782 | { file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86" }, 783 | { file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7" }, 784 | { file = "Pillow-10.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0" }, 785 | { file = "Pillow-10.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa" }, 786 | { file = "Pillow-10.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90" }, 787 | { file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967" }, 788 | { file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d" }, 789 | { file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3" }, 790 | { file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba" }, 791 | { file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3" }, 792 | { file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017" }, 793 | { file = "Pillow-10.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6" }, 794 | { file = "Pillow-10.0.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0" }, 795 | { file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba" }, 796 | { file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3" }, 797 | { file = "Pillow-10.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334" }, 798 | { file = "Pillow-10.0.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2" }, 799 | { file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed" }, 800 | { file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684" }, 801 | { file = "Pillow-10.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3" }, 802 | { file = "Pillow-10.0.0.tar.gz", hash = "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396" }, 803 | ] 804 | 805 | [package.extras] 806 | docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] 807 | tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] 808 | 809 | [[package]] 810 | name = "pydantic" 811 | version = "2.1.1" 812 | description = "Data validation using Python type hints" 813 | optional = false 814 | python-versions = ">=3.7" 815 | files = [ 816 | {file = "pydantic-2.1.1-py3-none-any.whl", hash = "sha256:43bdbf359d6304c57afda15c2b95797295b702948082d4c23851ce752f21da70"}, 817 | {file = "pydantic-2.1.1.tar.gz", hash = "sha256:22d63db5ce4831afd16e7c58b3192d3faf8f79154980d9397d9867254310ba4b"}, 818 | ] 819 | 820 | [package.dependencies] 821 | annotated-types = ">=0.4.0" 822 | pydantic-core = "2.4.0" 823 | typing-extensions = ">=4.6.1" 824 | 825 | [package.extras] 826 | email = ["email-validator (>=2.0.0)"] 827 | 828 | [[package]] 829 | name = "pydantic-core" 830 | version = "2.4.0" 831 | description = "" 832 | optional = false 833 | python-versions = ">=3.7" 834 | files = [ 835 | {file = "pydantic_core-2.4.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:2ca4687dd996bde7f3c420def450797feeb20dcee2b9687023e3323c73fc14a2"}, 836 | {file = "pydantic_core-2.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:782fced7d61469fd1231b184a80e4f2fa7ad54cd7173834651a453f96f29d673"}, 837 | {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6213b471b68146af97b8551294e59e7392c2117e28ffad9c557c65087f4baee3"}, 838 | {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63797499a219d8e81eb4e0c42222d0a4c8ec896f5c76751d4258af95de41fdf1"}, 839 | {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_armv7l.whl", hash = "sha256:0455876d575a35defc4da7e0a199596d6c773e20d3d42fa1fc29f6aa640369ed"}, 840 | {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_ppc64le.whl", hash = "sha256:8c938c96294d983dcf419b54dba2d21056959c22911d41788efbf949a29ae30d"}, 841 | {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_24_s390x.whl", hash = "sha256:878a5017d93e776c379af4e7b20f173c82594d94fa073059bcc546789ad50bf8"}, 842 | {file = "pydantic_core-2.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:69159afc2f2dc43285725f16143bc5df3c853bc1cb7df6021fce7ef1c69e8171"}, 843 | {file = "pydantic_core-2.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54df7df399b777c1fd144f541c95d351b3aa110535a6810a6a569905d106b6f3"}, 844 | {file = "pydantic_core-2.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e412607ca89a0ced10758dfb8f9adcc365ce4c1c377e637c01989a75e9a9ec8a"}, 845 | {file = "pydantic_core-2.4.0-cp310-none-win32.whl", hash = "sha256:853f103e2b9a58832fdd08a587a51de8b552ae90e1a5d167f316b7eabf8d7dde"}, 846 | {file = "pydantic_core-2.4.0-cp310-none-win_amd64.whl", hash = "sha256:3ba2c9c94a9176f6321a879c8b864d7c5b12d34f549a4c216c72ce213d7d953c"}, 847 | {file = "pydantic_core-2.4.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:a8b7acd04896e8f161e1500dc5f218017db05c1d322f054e89cbd089ce5d0071"}, 848 | {file = "pydantic_core-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:16468bd074fa4567592d3255bf25528ed41e6b616d69bf07096bdb5b66f947d1"}, 849 | {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cba5ad5eef02c86a1f3da00544cbc59a510d596b27566479a7cd4d91c6187a11"}, 850 | {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7206e41e04b443016e930e01685bab7a308113c0b251b3f906942c8d4b48fcb"}, 851 | {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_armv7l.whl", hash = "sha256:c1375025f0bfc9155286ebae8eecc65e33e494c90025cda69e247c3ccd2bab00"}, 852 | {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_ppc64le.whl", hash = "sha256:3534118289e33130ed3f1cc487002e8d09b9f359be48b02e9cd3de58ce58fba9"}, 853 | {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_24_s390x.whl", hash = "sha256:94d2b36a74623caab262bf95f0e365c2c058396082bd9d6a9e825657d0c1e7fa"}, 854 | {file = "pydantic_core-2.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:af24ad4fbaa5e4a2000beae0c3b7fd1c78d7819ab90f9370a1cfd8998e3f8a3c"}, 855 | {file = "pydantic_core-2.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bf10963d8aed8bbe0165b41797c9463d4c5c8788ae6a77c68427569be6bead41"}, 856 | {file = "pydantic_core-2.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68199ada7c310ddb8c76efbb606a0de656b40899388a7498954f423e03fc38be"}, 857 | {file = "pydantic_core-2.4.0-cp311-none-win32.whl", hash = "sha256:6f855bcc96ed3dd56da7373cfcc9dcbabbc2073cac7f65c185772d08884790ce"}, 858 | {file = "pydantic_core-2.4.0-cp311-none-win_amd64.whl", hash = "sha256:de39eb3bab93a99ddda1ac1b9aa331b944d8bcc4aa9141148f7fd8ee0299dafc"}, 859 | {file = "pydantic_core-2.4.0-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:f773b39780323a0499b53ebd91a28ad11cde6705605d98d999dfa08624caf064"}, 860 | {file = "pydantic_core-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a297c0d6c61963c5c3726840677b798ca5b7dfc71bc9c02b9a4af11d23236008"}, 861 | {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:546064c55264156b973b5e65e5fafbe5e62390902ce3cf6b4005765505e8ff56"}, 862 | {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36ba9e728588588f0196deaf6751b9222492331b5552f865a8ff120869d372e0"}, 863 | {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_armv7l.whl", hash = "sha256:57a53a75010c635b3ad6499e7721eaa3b450e03f6862afe2dbef9c8f66e46ec8"}, 864 | {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_ppc64le.whl", hash = "sha256:4b262bbc13022f2097c48a21adcc360a81d83dc1d854c11b94953cd46d7d3c07"}, 865 | {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_24_s390x.whl", hash = "sha256:01947ad728f426fa07fcb26457ebf90ce29320259938414bc0edd1476e75addb"}, 866 | {file = "pydantic_core-2.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b2799c2eaf182769889761d4fb4d78b82bc47dae833799fedbf69fc7de306faa"}, 867 | {file = "pydantic_core-2.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a08fd490ba36d1fbb2cd5dcdcfb9f3892deb93bd53456724389135712b5fc735"}, 868 | {file = "pydantic_core-2.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1e8a7c62d15a5c4b307271e4252d76ebb981d6251c6ecea4daf203ef0179ea4f"}, 869 | {file = "pydantic_core-2.4.0-cp312-none-win32.whl", hash = "sha256:9206c14a67c38de7b916e486ae280017cf394fa4b1aa95cfe88621a4e1d79725"}, 870 | {file = "pydantic_core-2.4.0-cp312-none-win_amd64.whl", hash = "sha256:884235507549a6b2d3c4113fb1877ae263109e787d9e0eb25c35982ab28d0399"}, 871 | {file = "pydantic_core-2.4.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:4cbe929efa77a806e8f1a97793f2dc3ea3475ae21a9ed0f37c21320fe93f6f50"}, 872 | {file = "pydantic_core-2.4.0-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:9137289de8fe845c246a8c3482dd0cb40338846ba683756d8f489a4bd8fddcae"}, 873 | {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5d8e764b5646623e57575f624f8ebb8f7a9f7fd1fae682ef87869ca5fec8dcf"}, 874 | {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fba0aff4c407d0274e43697e785bcac155ad962be57518d1c711f45e72da70f"}, 875 | {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_24_armv7l.whl", hash = "sha256:30527d173e826f2f7651f91c821e337073df1555e3b5a0b7b1e2c39e26e50678"}, 876 | {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_24_ppc64le.whl", hash = "sha256:bd7d1dde70ff3e09e4bc7a1cbb91a7a538add291bfd5b3e70ef1e7b45192440f"}, 877 | {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_24_s390x.whl", hash = "sha256:72f1216ca8cef7b8adacd4c4c6b89c3b0c4f97503197f5284c80f36d6e4edd30"}, 878 | {file = "pydantic_core-2.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b013c7861a7c7bfcec48fd709513fea6f9f31727e7a0a93ca0dd12e056740717"}, 879 | {file = "pydantic_core-2.4.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:478f5f6d7e32bd4a04d102160efb2d389432ecf095fe87c555c0a6fc4adfc1a4"}, 880 | {file = "pydantic_core-2.4.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d9610b47b5fe4aacbbba6a9cb5f12cbe864eec99dbfed5710bd32ef5dd8a5d5b"}, 881 | {file = "pydantic_core-2.4.0-cp37-none-win32.whl", hash = "sha256:ff246c0111076c8022f9ba325c294f2cb5983403506989253e04dbae565e019b"}, 882 | {file = "pydantic_core-2.4.0-cp37-none-win_amd64.whl", hash = "sha256:d0c2b713464a8e263a243ae7980d81ce2de5ac59a9f798a282e44350b42dc516"}, 883 | {file = "pydantic_core-2.4.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:12ef6838245569fd60a179fade81ca4b90ae2fa0ef355d616f519f7bb27582db"}, 884 | {file = "pydantic_core-2.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49db206eb8fdc4b4f30e6e3e410584146d813c151928f94ec0db06c4f2595538"}, 885 | {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a507d7fa44688bbac76af6521e488b3da93de155b9cba6f2c9b7833ce243d59"}, 886 | {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffe18407a4d000c568182ce5388bbbedeb099896904e43fc14eee76cfae6dec5"}, 887 | {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_24_armv7l.whl", hash = "sha256:fa8e48001b39d54d97d7b380a0669fa99fc0feeb972e35a2d677ba59164a9a22"}, 888 | {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_24_ppc64le.whl", hash = "sha256:394f12a2671ff8c4dfa2e85be6c08be0651ad85bc1e6aa9c77c21671baaf28cd"}, 889 | {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_24_s390x.whl", hash = "sha256:2f9ea0355f90db2a76af530245fa42f04d98f752a1236ed7c6809ec484560d5b"}, 890 | {file = "pydantic_core-2.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:61d4e713f467abcdd59b47665d488bb898ad3dd47ce7446522a50e0cbd8e8279"}, 891 | {file = "pydantic_core-2.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:453862ab268f6326b01f067ed89cb3a527d34dc46f6f4eeec46a15bbc706d0da"}, 892 | {file = "pydantic_core-2.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:56a85fa0dab1567bd0cac10f0c3837b03e8a0d939e6a8061a3a420acd97e9421"}, 893 | {file = "pydantic_core-2.4.0-cp38-none-win32.whl", hash = "sha256:0d726108c1c0380b88b6dd4db559f0280e0ceda9e077f46ff90bc85cd4d03e77"}, 894 | {file = "pydantic_core-2.4.0-cp38-none-win_amd64.whl", hash = "sha256:047580388644c473b934d27849f8ed8dbe45df0adb72104e78b543e13bf69762"}, 895 | {file = "pydantic_core-2.4.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:867d3eea954bea807cabba83cfc939c889a18576d66d197c60025b15269d7cc0"}, 896 | {file = "pydantic_core-2.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:664402ef0c238a7f8a46efb101789d5f2275600fb18114446efec83cfadb5b66"}, 897 | {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64e8012ad60a5f0da09ed48725e6e923d1be25f2f091a640af6079f874663813"}, 898 | {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac2b680de398f293b68183317432b3d67ab3faeba216aec18de0c395cb5e3060"}, 899 | {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_armv7l.whl", hash = "sha256:8efc1be43b036c2b6bcfb1451df24ee0ddcf69c31351003daf2699ed93f5687b"}, 900 | {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_ppc64le.whl", hash = "sha256:d93aedbc4614cc21b9ab0d0c4ccd7143354c1f7cffbbe96ae5216ad21d1b21b5"}, 901 | {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_24_s390x.whl", hash = "sha256:af788b64e13d52fc3600a68b16d31fa8d8573e3ff2fc9a38f8a60b8d94d1f012"}, 902 | {file = "pydantic_core-2.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:97c6349c81cee2e69ef59eba6e6c08c5936e6b01c2d50b9e4ac152217845ae09"}, 903 | {file = "pydantic_core-2.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc086ddb6dc654a15deeed1d1f2bcb1cb924ebd70df9dca738af19f64229b06c"}, 904 | {file = "pydantic_core-2.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e953353180bec330c3b830891d260b6f8e576e2d18db3c78d314e56bb2276066"}, 905 | {file = "pydantic_core-2.4.0-cp39-none-win32.whl", hash = "sha256:6feb4b64d11d5420e517910d60a907d08d846cacaf4e029668725cd21d16743c"}, 906 | {file = "pydantic_core-2.4.0-cp39-none-win_amd64.whl", hash = "sha256:153a61ac4030fa019b70b31fb7986461119230d3ba0ab661c757cfea652f4332"}, 907 | {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:3fcf529382b282a30b466bd7af05be28e22aa620e016135ac414f14e1ee6b9e1"}, 908 | {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2edef05b63d82568b877002dc4cb5cc18f8929b59077120192df1e03e0c633f8"}, 909 | {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da055a1b0bfa8041bb2ff586b2cb0353ed03944a3472186a02cc44a557a0e661"}, 910 | {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:77dadc764cf7c5405e04866181c5bd94a447372a9763e473abb63d1dfe9b7387"}, 911 | {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:a4ea23b07f29487a7bef2a869f68c7ee0e05424d81375ce3d3de829314c6b5ec"}, 912 | {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:382f0baa044d674ad59455a5eff83d7965572b745cc72df35c52c2ce8c731d37"}, 913 | {file = "pydantic_core-2.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:08f89697625e453421401c7f661b9d1eb4c9e4c0a12fd256eeb55b06994ac6af"}, 914 | {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-macosx_10_7_x86_64.whl", hash = "sha256:43a405ce520b45941df9ff55d0cd09762017756a7b413bbad3a6e8178e64a2c2"}, 915 | {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:584a7a818c84767af16ce8bda5d4f7fedb37d3d231fc89928a192f567e4ef685"}, 916 | {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04922fea7b13cd480586fa106345fe06e43220b8327358873c22d8dfa7a711c7"}, 917 | {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17156abac20a9feed10feec867fddd91a80819a485b0107fe61f09f2117fe5f3"}, 918 | {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4e562cc63b04636cde361fd47569162f1daa94c759220ff202a8129902229114"}, 919 | {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:90f3785146f701e053bb6b9e8f53acce2c919aca91df88bd4975be0cb926eb41"}, 920 | {file = "pydantic_core-2.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e40b1e97edd3dc127aa53d8a5e539a3d0c227d71574d3f9ac1af02d58218a122"}, 921 | {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:b27f3e67f6e031f6620655741b7d0d6bebea8b25d415924b3e8bfef2dd7bd841"}, 922 | {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be86c2eb12fb0f846262ace9d8f032dc6978b8cb26a058920ecb723dbcb87d05"}, 923 | {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4665f7ed345012a8d2eddf4203ef145f5f56a291d010382d235b94e91813f88a"}, 924 | {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:79262be5a292d1df060f29b9a7cdd66934801f987a817632d7552534a172709a"}, 925 | {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5fd905a69ac74eaba5041e21a1e8b1a479dab2b41c93bdcc4c1cede3c12a8d86"}, 926 | {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:2ad538b7e07343001934417cdc8584623b4d8823c5b8b258e75ec8d327cec969"}, 927 | {file = "pydantic_core-2.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:dd2429f7635ad4857b5881503f9c310be7761dc681c467a9d27787b674d1250a"}, 928 | {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:efff8b6761a1f6e45cebd1b7a6406eb2723d2d5710ff0d1b624fe11313693989"}, 929 | {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32a1e0352558cd7ccc014ffe818c7d87b15ec6145875e2cc5fa4bb7351a1033d"}, 930 | {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a027f41c5008571314861744d83aff75a34cf3a07022e0be32b214a5bc93f7f1"}, 931 | {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1927f0e15d190f11f0b8344373731e28fd774c6d676d8a6cfadc95c77214a48b"}, 932 | {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:7aa82d483d5fb867d4fb10a138ffd57b0f1644e99f2f4f336e48790ada9ada5e"}, 933 | {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:b85778308bf945e9b33ac604e6793df9b07933108d20bdf53811bc7c2798a4af"}, 934 | {file = "pydantic_core-2.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3ded19dcaefe2f6706d81e0db787b59095f4ad0fbadce1edffdf092294c8a23f"}, 935 | {file = "pydantic_core-2.4.0.tar.gz", hash = "sha256:ec3473c9789cc00c7260d840c3db2c16dbfc816ca70ec87a00cddfa3e1a1cdd5"}, 936 | ] 937 | 938 | [package.dependencies] 939 | typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" 940 | 941 | [[package]] 942 | name = "pydantic-settings" 943 | version = "2.0.2" 944 | description = "Settings management using Pydantic" 945 | optional = false 946 | python-versions = ">=3.7" 947 | files = [ 948 | {file = "pydantic_settings-2.0.2-py3-none-any.whl", hash = "sha256:6183a2abeab465d5a3ab69758e9a22d38b0cc2ba193f0b85f6971a252ea630f6"}, 949 | {file = "pydantic_settings-2.0.2.tar.gz", hash = "sha256:342337fff50b23585e807a86dec85037900972364435c55c2fc00d16ff080539"}, 950 | ] 951 | 952 | [package.dependencies] 953 | pydantic = ">=2.0.1" 954 | python-dotenv = ">=0.21.0" 955 | 956 | [[package]] 957 | name = "pymongo" 958 | version = "4.4.1" 959 | description = "Python driver for MongoDB " 960 | optional = false 961 | python-versions = ">=3.7" 962 | files = [ 963 | {file = "pymongo-4.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bbdd6c719cc2ea440d7245ba71ecdda507275071753c6ffe9c8232647246f575"}, 964 | {file = "pymongo-4.4.1-cp310-cp310-manylinux1_i686.whl", hash = "sha256:a438508dd8007a4a724601c3790db46fe0edc3d7d172acafc5f148ceb4a07815"}, 965 | {file = "pymongo-4.4.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:3a350d03959f9d5b7f2ea0621f5bb2eb3927b8fc1c4031d12cfd3949839d4f66"}, 966 | {file = "pymongo-4.4.1-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:e6d5d2c97c35f83dc65ccd5d64c7ed16eba6d9403e3744e847aee648c432f0bb"}, 967 | {file = "pymongo-4.4.1-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:1944b16ffef3573ae064196460de43eb1c865a64fed23551b5eac1951d80acca"}, 968 | {file = "pymongo-4.4.1-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:912b0fdc16500125dc1837be8b13c99d6782d93d6cd099d0e090e2aca0b6d100"}, 969 | {file = "pymongo-4.4.1-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:d1b1c8eb21de4cb5e296614e8b775d5ecf9c56b7d3c6000f4bfdb17f9e244e72"}, 970 | {file = "pymongo-4.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3b508e0de613b906267f2c484cb5e9afd3a64680e1af23386ca8f99a29c6145"}, 971 | {file = "pymongo-4.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f41feb8cf429799ac43ed34504839954aa7d907f8bd9ecb52ed5ff0d2ea84245"}, 972 | {file = "pymongo-4.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1897123c4bede1af0c264a3bc389a2505bae50d85e4f211288d352928c02d017"}, 973 | {file = "pymongo-4.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c4bcd285bf0f5272d50628e4ea3989738e3af1251b2dd7bf50da2d593f3a56"}, 974 | {file = "pymongo-4.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:995b868ccc9df8d36cb28142363e3911846fe9f43348d942951f60cdd7f62224"}, 975 | {file = "pymongo-4.4.1-cp310-cp310-win32.whl", hash = "sha256:a5198beca36778f19a98b56f541a0529502046bc867b352dda5b6322e1ddc4fd"}, 976 | {file = "pymongo-4.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:a86d20210c9805a032cda14225087ec483613aff0955327c7871a3c980562c5b"}, 977 | {file = "pymongo-4.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5a2a1da505ea78787b0382c92dc21a45d19918014394b220c4734857e9c73694"}, 978 | {file = "pymongo-4.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35545583396684ea70a0b005034a469bf3f447732396e5b3d50bec94890b8d5c"}, 979 | {file = "pymongo-4.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5248fdf7244a5e976279fe154d116c73f6206e0be71074ea9d9b1e73b5893dd5"}, 980 | {file = "pymongo-4.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:44381b817eeb47a41bbfbd279594a7fb21017e0e3e15550eb0fd3758333097f3"}, 981 | {file = "pymongo-4.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f0bd25de90b804cc95e548f55f430df2b47f242a4d7bbce486db62f3b3c981f"}, 982 | {file = "pymongo-4.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d67f4029c57b36a0278aeae044ce382752c078c7625cef71b5e2cf3e576961f9"}, 983 | {file = "pymongo-4.4.1-cp311-cp311-win32.whl", hash = "sha256:8082eef0d8c711c9c272906fa469965e52b44dbdb8a589b54857b1351dc2e511"}, 984 | {file = "pymongo-4.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:980da627edc1275896d7d4670596433ec66e1f452ec244e07bbb2f91c955b581"}, 985 | {file = "pymongo-4.4.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:6cf08997d3ecf9a1eabe12c35aa82a5c588f53fac054ed46fe5c16a0a20ea43d"}, 986 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:a6750449759f0a83adc9df3a469483a8c3eef077490b76f30c03dc8f7a4b1d66"}, 987 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:efa67f46c1678df541e8f41247d22430905f80a3296d9c914aaa793f2c9fa1db"}, 988 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d9a5e16a32fb1000c72a8734ddd8ae291974deb5d38d40d1bdd01dbe4024eeb0"}, 989 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:36b0b06c6e830d190215fced82872e5fd8239771063afa206f9adc09574018a3"}, 990 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:4ec9c6d4547c93cf39787c249969f7348ef6c4d36439af10d57b5ee65f3dfbf9"}, 991 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:5368801ca6b66aacc5cc013258f11899cd6a4c3bb28cec435dd67f835905e9d2"}, 992 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:91848d555155ad4594de5e575b6452adc471bc7bc4b4d2b1f4f15a78a8af7843"}, 993 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0f08a2dba1469252462c414b66cb416c7f7295f2c85e50f735122a251fcb131"}, 994 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2fe4bbf2b2c91e4690b5658b0fbb98ca6e0a8fba9ececd65b4e7d2d1df3e9b01"}, 995 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7e307d67641d0e2f7e7d6ee3dad880d090dace96cc1d95c99d15bd9f545a1168"}, 996 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d43634594f2486cc9bb604a1dc0914234878c4faf6604574a25260cb2faaa06"}, 997 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef0e3279e72cccc3dc7be75b12b1e54cc938d7ce13f5f22bea844b9d9d5fecd4"}, 998 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05935f5a4bbae0a99482147588351b7b17999f4a4e6e55abfb74367ac58c0634"}, 999 | {file = "pymongo-4.4.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:854d92d2437e3496742e17342496e1f3d9efb22455501fd6010aa3658138e457"}, 1000 | {file = "pymongo-4.4.1-cp37-cp37m-win32.whl", hash = "sha256:ddffc0c6d0e92cf43dc6c47639d1ef9ab3c280db2998a33dbb9953bd864841e1"}, 1001 | {file = "pymongo-4.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2259302d8ab51cd56c3d9d5cca325977e35a0bb3a15a297ec124d2da56c214f7"}, 1002 | {file = "pymongo-4.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:262a4073d2ee0654f0314ef4d9aab1d8c13dc8dae5c102312e152c02bfa7bdb7"}, 1003 | {file = "pymongo-4.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:022c91e2a41eefbcddc844c534520a13c6f613666c37b9fb9ed039eff47bd2e4"}, 1004 | {file = "pymongo-4.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a0d326c3ba989091026fbc4827638dc169abdbb0c0bbe593716921543f530af6"}, 1005 | {file = "pymongo-4.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:5a1e5b931bf729b2eacd720a0e40201c2d5ed0e2bada60863f19b069bb5016c4"}, 1006 | {file = "pymongo-4.4.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:54d0b8b6f2548e15b09232827d9ba8e03a599c9a30534f7f2c7bae79df2d1f91"}, 1007 | {file = "pymongo-4.4.1-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:e426e213ab07a73f8759ab8d69e87d05d7a60b3ecbf7673965948dcf8ebc1c9f"}, 1008 | {file = "pymongo-4.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:53831effe4dc0243231a944dfbd87896e42b1cf081776930de5cc74371405e3b"}, 1009 | {file = "pymongo-4.4.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:977c34b5b0b50bd169fbca1a4dd06fbfdfd8ac47734fdc3473532c10098e16ce"}, 1010 | {file = "pymongo-4.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fab52db4d3aa3b73bcf920fb375dbea63bf0df0cb4bdb38c5a0a69e16568cc21"}, 1011 | {file = "pymongo-4.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bb935789276422d8875f051837356edfccdb886e673444d91e4941a8142bd48"}, 1012 | {file = "pymongo-4.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9d45243ff4800320c842c45e01c91037e281840e8c6ed2949ed82a70f55c0e6a"}, 1013 | {file = "pymongo-4.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32d6d2b7e14bb6bc052f6cba0c1cf4d47a2b49c56ea1ed0f960a02bc9afaefb2"}, 1014 | {file = "pymongo-4.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:85b92b3828b2c923ed448f820c147ee51fa4566e35c9bf88415586eb0192ced2"}, 1015 | {file = "pymongo-4.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3f345380f6d6d6d1dc6db9fa5c8480c439ea79553b71a2cbe3030a1f20676595"}, 1016 | {file = "pymongo-4.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0dcc64747b628a96bcfc6405c42acae3762c85d8ae8c1ce18834b8151cad7486"}, 1017 | {file = "pymongo-4.4.1-cp38-cp38-win32.whl", hash = "sha256:ebe1683ec85d8bca389183d01ecf4640c797d6f22e6dac3453a6c492920d5ec3"}, 1018 | {file = "pymongo-4.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:58c492e28057838792bed67875f982ffbd3c9ceb67341cc03811859fddb8efbf"}, 1019 | {file = "pymongo-4.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:aed21b3142311ad139629c4e101b54f25447ec40d6f42c72ad5c1a6f4f851f3a"}, 1020 | {file = "pymongo-4.4.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98764ae13de0ab80ba824ca0b84177006dec51f48dfb7c944d8fa78ab645c67f"}, 1021 | {file = "pymongo-4.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7b7127bb35f10d974ec1bd5573389e99054c558b821c9f23bb8ff94e7ae6e612"}, 1022 | {file = "pymongo-4.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:48409bac0f6a62825c306c9a124698df920afdc396132908a8e88b466925a248"}, 1023 | {file = "pymongo-4.4.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:55b6ebeeabe32a9d2e38eeb90f07c020cb91098b34b5fca42ff3991cb6e6e621"}, 1024 | {file = "pymongo-4.4.1-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:4e6a70c9d437b043fb07eef1796060f476359e5b7d8e23baa49f1a70379d6543"}, 1025 | {file = "pymongo-4.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:0bdbbcc1ef3a56347630c57eda5cd9536bdbdb82754b3108c66cbc51b5233dfb"}, 1026 | {file = "pymongo-4.4.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:04ec1c5451ad358fdbff28ddc6e8a3d1b5f62178d38cd08007a251bc3f59445a"}, 1027 | {file = "pymongo-4.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a7739bcebdbeb5648edb15af00fd38f2ab5de20851a1341d229494a638284cc"}, 1028 | {file = "pymongo-4.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02dba4ea2a6f22de4b50864d3957a0110b75d3eeb40aeab0b0ff64bcb5a063e6"}, 1029 | {file = "pymongo-4.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:884a35c0740744a48f67210692841581ab83a4608d3a031e7125022989ef65f8"}, 1030 | {file = "pymongo-4.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2aab6d1cff00d68212eca75d2260980202b14038d9298fed7d5c455fe3285c7c"}, 1031 | {file = "pymongo-4.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae1f85223193f249320f695eec4242cdcc311357f5f5064c2e72cfd18017e8ee"}, 1032 | {file = "pymongo-4.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b25d2ccdb2901655cc56c0fc978c5ddb35029c46bfd30d182d0e23fffd55b14b"}, 1033 | {file = "pymongo-4.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:334d41649f157c56a47fb289bae3b647a867c1a74f5f3a8a371fb361580bd9d3"}, 1034 | {file = "pymongo-4.4.1-cp39-cp39-win32.whl", hash = "sha256:c409e5888a94a3ff99783fffd9477128ffab8416e3f8b2c633993eecdcd5c267"}, 1035 | {file = "pymongo-4.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:3681caf37edbe05f72f0d351e4a6cb5874ec7ab5eeb99df3a277dbf110093739"}, 1036 | {file = "pymongo-4.4.1.tar.gz", hash = "sha256:a4df87dbbd03ac6372d24f2a8054b4dc33de497d5227b50ec649f436ad574284"}, 1037 | ] 1038 | 1039 | [package.dependencies] 1040 | dnspython = ">=1.16.0,<3.0.0" 1041 | 1042 | [package.extras] 1043 | aws = ["pymongo-auth-aws (<2.0.0)"] 1044 | encryption = ["pymongo-auth-aws (<2.0.0)", "pymongocrypt (>=1.6.0,<2.0.0)"] 1045 | gssapi = ["pykerberos"] 1046 | ocsp = ["certifi", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] 1047 | snappy = ["python-snappy"] 1048 | zstd = ["zstandard"] 1049 | 1050 | [[package]] 1051 | name = "pysocks" 1052 | version = "1.7.1" 1053 | description = "A Python SOCKS client module. See https://github.com/Anorov/PySocks for more information." 1054 | optional = false 1055 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 1056 | files = [ 1057 | {file = "PySocks-1.7.1-py27-none-any.whl", hash = "sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299"}, 1058 | {file = "PySocks-1.7.1-py3-none-any.whl", hash = "sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5"}, 1059 | {file = "PySocks-1.7.1.tar.gz", hash = "sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0"}, 1060 | ] 1061 | 1062 | [[package]] 1063 | name = "pytelegrambotapi" 1064 | version = "4.12.0" 1065 | description = "Python Telegram bot api." 1066 | optional = false 1067 | python-versions = "*" 1068 | files = [ 1069 | {file = "pyTelegramBotAPI-4.12.0.tar.gz", hash = "sha256:11a482c8add3b8235aa1de4984f1e10df2fac38decac8676d0e5e070e7c3880e"}, 1070 | ] 1071 | 1072 | [package.dependencies] 1073 | requests = "*" 1074 | 1075 | [package.extras] 1076 | aiohttp = ["aiohttp"] 1077 | aioredis = ["aioredis"] 1078 | coloredlogs = ["coloredlogs"] 1079 | fastapi = ["fastapi"] 1080 | json = ["ujson"] 1081 | pil = ["Pillow"] 1082 | psutil = ["psutil"] 1083 | redis = ["redis (>=3.4.1)"] 1084 | uvicorn = ["uvicorn"] 1085 | watchdog = ["watchdog"] 1086 | 1087 | [[package]] 1088 | name = "python-dotenv" 1089 | version = "1.0.0" 1090 | description = "Read key-value pairs from a .env file and set them as environment variables" 1091 | optional = false 1092 | python-versions = ">=3.8" 1093 | files = [ 1094 | {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, 1095 | {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, 1096 | ] 1097 | 1098 | [package.extras] 1099 | cli = ["click (>=5.0)"] 1100 | 1101 | [[package]] 1102 | name = "python-socks" 1103 | version = "2.3.0" 1104 | description = "Core proxy (SOCKS4, SOCKS5, HTTP tunneling) functionality for Python" 1105 | optional = false 1106 | python-versions = "*" 1107 | files = [ 1108 | {file = "python-socks-2.3.0.tar.gz", hash = "sha256:2002f20f32366861bec90e6b520e4696671587b3dd56e476477e5a07ec49a094"}, 1109 | {file = "python_socks-2.3.0-py3-none-any.whl", hash = "sha256:eb385a33bcc3909401aa29fc0a277cdd0c2ce586a99b61be1ddd1a4939f23061"}, 1110 | ] 1111 | 1112 | [package.dependencies] 1113 | async-timeout = {version = ">=3.0.1", optional = true, markers = "extra == \"asyncio\""} 1114 | 1115 | [package.extras] 1116 | anyio = ["anyio (>=3.3.4)"] 1117 | asyncio = ["async-timeout (>=3.0.1)"] 1118 | curio = ["curio (>=1.4)"] 1119 | trio = ["trio (>=0.16.0)"] 1120 | 1121 | [[package]] 1122 | name = "pytz" 1123 | version = "2023.3" 1124 | description = "World timezone definitions, modern and historical" 1125 | optional = false 1126 | python-versions = "*" 1127 | files = [ 1128 | {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, 1129 | {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, 1130 | ] 1131 | 1132 | [[package]] 1133 | name = "redis" 1134 | version = "4.6.0" 1135 | description = "Python client for Redis database and key-value store" 1136 | optional = false 1137 | python-versions = ">=3.7" 1138 | files = [ 1139 | { file = "redis-4.6.0-py3-none-any.whl", hash = "sha256:e2b03db868160ee4591de3cb90d40ebb50a90dd302138775937f6a42b7ed183c" }, 1140 | { file = "redis-4.6.0.tar.gz", hash = "sha256:585dc516b9eb042a619ef0a39c3d7d55fe81bdb4df09a52c9cdde0d07bf1aa7d" }, 1141 | ] 1142 | 1143 | [package.dependencies] 1144 | async-timeout = { version = ">=4.0.2", markers = "python_full_version <= \"3.11.2\"" } 1145 | hiredis = { version = ">=1.0.0", optional = true, markers = "extra == \"hiredis\"" } 1146 | 1147 | [package.extras] 1148 | hiredis = ["hiredis (>=1.0.0)"] 1149 | ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] 1150 | 1151 | [[package]] 1152 | name = "requests" 1153 | version = "2.31.0" 1154 | description = "Python HTTP for Humans." 1155 | optional = false 1156 | python-versions = ">=3.7" 1157 | files = [ 1158 | {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, 1159 | {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, 1160 | ] 1161 | 1162 | [package.dependencies] 1163 | certifi = ">=2017.4.17" 1164 | charset-normalizer = ">=2,<4" 1165 | idna = ">=2.5,<4" 1166 | urllib3 = ">=1.21.1,<3" 1167 | 1168 | [package.extras] 1169 | socks = ["PySocks (>=1.5.6,!=1.5.7)"] 1170 | use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] 1171 | 1172 | [[package]] 1173 | name = "sniffio" 1174 | version = "1.3.0" 1175 | description = "Sniff out which async library your code is running under" 1176 | optional = false 1177 | python-versions = ">=3.7" 1178 | files = [ 1179 | {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, 1180 | {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, 1181 | ] 1182 | 1183 | [[package]] 1184 | name = "typing-extensions" 1185 | version = "4.7.1" 1186 | description = "Backported and Experimental Type Hints for Python 3.7+" 1187 | optional = false 1188 | python-versions = ">=3.7" 1189 | files = [ 1190 | {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, 1191 | {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, 1192 | ] 1193 | 1194 | [[package]] 1195 | name = "urllib3" 1196 | version = "2.0.4" 1197 | description = "HTTP library with thread-safe connection pooling, file post, and more." 1198 | optional = false 1199 | python-versions = ">=3.7" 1200 | files = [ 1201 | {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, 1202 | {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, 1203 | ] 1204 | 1205 | [package.extras] 1206 | brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] 1207 | secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] 1208 | socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] 1209 | zstd = ["zstandard (>=0.18.0)"] 1210 | 1211 | [[package]] 1212 | name = "win32-setctime" 1213 | version = "1.1.0" 1214 | description = "A small Python utility to set file creation time on Windows" 1215 | optional = false 1216 | python-versions = ">=3.5" 1217 | files = [ 1218 | {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, 1219 | {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, 1220 | ] 1221 | 1222 | [package.extras] 1223 | dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] 1224 | 1225 | [[package]] 1226 | name = "yarl" 1227 | version = "1.9.2" 1228 | description = "Yet another URL library" 1229 | optional = false 1230 | python-versions = ">=3.7" 1231 | files = [ 1232 | {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, 1233 | {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, 1234 | {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, 1235 | {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, 1236 | {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, 1237 | {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, 1238 | {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, 1239 | {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, 1240 | {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, 1241 | {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, 1242 | {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, 1243 | {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, 1244 | {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, 1245 | {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, 1246 | {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, 1247 | {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, 1248 | {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, 1249 | {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, 1250 | {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, 1251 | {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, 1252 | {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, 1253 | {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, 1254 | {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, 1255 | {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, 1256 | {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, 1257 | {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, 1258 | {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, 1259 | {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, 1260 | {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, 1261 | {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, 1262 | {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, 1263 | {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, 1264 | {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, 1265 | {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, 1266 | {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, 1267 | {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, 1268 | {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, 1269 | {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, 1270 | {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, 1271 | {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, 1272 | {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, 1273 | {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, 1274 | {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, 1275 | {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, 1276 | {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, 1277 | {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, 1278 | {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, 1279 | {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, 1280 | {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, 1281 | {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, 1282 | {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, 1283 | {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, 1284 | {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, 1285 | {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, 1286 | {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, 1287 | {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, 1288 | {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, 1289 | {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, 1290 | {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, 1291 | {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, 1292 | {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, 1293 | {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, 1294 | {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, 1295 | {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, 1296 | {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, 1297 | {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, 1298 | {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, 1299 | {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, 1300 | {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, 1301 | {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, 1302 | {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, 1303 | {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, 1304 | {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, 1305 | {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, 1306 | ] 1307 | 1308 | [package.dependencies] 1309 | idna = ">=2.0" 1310 | multidict = ">=4.0" 1311 | 1312 | [metadata] 1313 | lock-version = "2.0" 1314 | python-versions = "^3.10" 1315 | content-hash = "19c097c7dac0465b936915f50755d59a1c996b3bf6303b7a609dffb5592865f5" 1316 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "gugumoe-bot" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["咕谷酱 "] 6 | readme = "README.md" 7 | packages = [{include = "gugumoe_bot"}] 8 | 9 | [tool.poetry.dependencies] 10 | python = "^3.10" 11 | pytelegrambotapi = "^4.12.0" 12 | loguru = "^0.7.0" 13 | aiohttp-socks = "^0.8.0" 14 | aiohttp = "^3.8.5" 15 | requests = "^2.31.0" 16 | gunicorn = "^21.2.0" 17 | pysocks = "^1.7.1" 18 | urllib3 = "^2.0.4" 19 | pydantic-settings = "^2.0.2" 20 | motor = "^3.2.0" 21 | pytz = "^2023.3" 22 | ntplib = "^0.4.0" 23 | httpx = "^0.24.1" 24 | pillow = "^10.0.0" 25 | redis = { extras = ["hiredis"], version = "^4.6.0" } 26 | 27 | 28 | [build-system] 29 | requires = ["poetry-core"] 30 | build-backend = "poetry.core.masonry.api" 31 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GooGuJiang/Gugumoe-bot/919036693d79c98cca9e5be9a31166f5a19ecec4/tests/__init__.py -------------------------------------------------------------------------------- /tests/mongodb_test.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | import datetime 3 | from gugumoe_bot.settings import settings 4 | from gugumoe_bot.db.mongodb_helper import MongoDBHelper 5 | 6 | 7 | async def test_mongodb_helper(): 8 | # 创建一个 MongoDBHelper 对象 9 | mongodb_helper = MongoDBHelper() 10 | 11 | # 初始化数据库 12 | await mongodb_helper.initialize_db() 13 | 14 | # 测试用户ID和日期 15 | user_id = "test_user" 16 | date = datetime.date.today() 17 | 18 | # 检查用户是否存在 19 | user_exists = await mongodb_helper.check_user_exists(user_id) 20 | print(f"User exists before insertion: {user_exists}") 21 | 22 | # 插入新的人品数值 23 | luck_number = 88 24 | await mongodb_helper.store_daily_luck(user_id, date, luck_number) 25 | 26 | # 再次检查用户是否存在 27 | user_exists = await mongodb_helper.check_user_exists(user_id) 28 | print(f"User exists after insertion: {user_exists}") 29 | 30 | # 获取插入的人品数值 31 | luck_info = await mongodb_helper.get_daily_luck(user_id, date) 32 | print(f"Retrieved luck info: {luck_info}") 33 | 34 | # 更新人品数值 35 | new_luck_number = 99 36 | await mongodb_helper.update_daily_luck(user_id, date, new_luck_number=new_luck_number) 37 | 38 | # 获取更新后的人品数值 39 | updated_luck_info = await mongodb_helper.get_daily_luck(user_id, date) 40 | print(f"Updated luck info: {updated_luck_info}") 41 | 42 | 43 | # 运行测试 44 | loop = asyncio.get_event_loop() 45 | loop.run_until_complete(test_mongodb_helper()) 46 | loop.close() 47 | --------------------------------------------------------------------------------