diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 0efb58e6..00000000 --- a/.flake8 +++ /dev/null @@ -1,2 +0,0 @@ -[flake8] -ignore = E501, W503, E203 diff --git a/.gitignore b/.gitignore index 4b2d7e52..ed30f024 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ polls.yaml .env poetry.lock */__pycache__ +.devenv diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e0c7dbbf..758718e0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,14 +3,13 @@ repos: rev: 23.7.0 hooks: - id: black - args: [--line-length=88] language_version: python3 - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.0.280 hooks: - id: ruff - args: [--line-length=100, --ignore=E501] + args: [--ignore=E501] - repo: https://github.com/pycqa/isort rev: 5.12.0 diff --git a/.reuse/addheader b/.reuse/addheader index b7f00331..4c524ef3 100755 --- a/.reuse/addheader +++ b/.reuse/addheader @@ -4,4 +4,4 @@ # SPDX-License-Identifier: MPL-2.0 # https://git.joinemm.dev/miso-bot -reuse addheader --copyright="Joonas Rautiola " --license="MPL-2.0" --template="header.jinja2" $@ +reuse annotate --copyright="Joonas Rautiola " --license="MPL-2.0" --template="header.jinja2" "$@" diff --git a/.reuse/dep5 b/.reuse/dep5 index 7f5ad3fd..f66dab0e 100644 --- a/.reuse/dep5 +++ b/.reuse/dep5 @@ -7,6 +7,6 @@ Files: downloads/* images/* data/* Copyright: 2023 Joonas Rautiola License: CC0-1.0 -Files: *.md .* requirements.* dev-requirements.* +Files: *.md .* *.lock Copyright: 2023 Joonas Rautiola -License: MPL-2.0 \ No newline at end of file +License: MPL-2.0 diff --git a/Dockerfile b/Dockerfile index d8937605..5e05e8bb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,19 +2,39 @@ # SPDX-License-Identifier: MPL-2.0 # https://git.joinemm.dev/miso-bot -FROM python:3.11 +# The builder image, used to build the virtual environment +FROM python:3.11-buster as builder + +RUN pip install poetry==1.4.2 + +ENV POETRY_NO_INTERACTION=1 \ + POETRY_VIRTUALENVS_IN_PROJECT=1 \ + POETRY_VIRTUALENVS_CREATE=1 \ + POETRY_CACHE_DIR=/tmp/poetry_cache WORKDIR /app +COPY pyproject.toml poetry.lock ./ +RUN touch README.md + +RUN poetry install --without dev --no-root && rm -rf $POETRY_CACHE_DIR + +# The runtime image, used to just run the code provided its virtual environment +FROM python:3.11-slim-buster as runtime + +RUN apt-get update -y +RUN apt-get install --no-install-recommends -y ffmpeg wget RUN wget --progress=dot:giga https://github.com/isis-project/isis-fonts/blob/master/NanumGothic.ttf?raw=true -O NanumGothic.ttf -RUN apt-get update -y \ - && apt-get install --no-install-recommends -y ffmpeg \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* -COPY requirements.txt ./ -RUN pip install --no-cache-dir -r requirements.txt + +RUN apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +ENV VIRTUAL_ENV=/app/.venv \ + PATH="/app/.venv/bin:$PATH" \ + PYTHONUNBUFFERED=1 + +COPY --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV} COPY . . -ENV PYTHONUNBUFFERED=1 CMD ["python", "-O", "main.py"] diff --git a/README.md b/README.md index 0e774a7d..f08ccbc1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -# Miso Bot - [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Codacy Badge](https://api.codacy.com/project/badge/Grade/84479f7c0f4c44a6aa2ba435e0215436)](https://app.codacy.com/manual/joinemm/miso-bot?utm_source=github.com&utm_medium=referral&utm_content=joinemm/miso-bot&utm_campaign=Badge_Grade_Dashboard) [![DeepSource](https://deepsource.io/gh/joinemm/miso-bot.svg/?label=active+issues&show_trend=true&token=0E1BBh1I4k_HkqRvfRy86yMc)](https://deepsource.io/gh/joinemm/miso-bot/?ref=repository-badge) @@ -8,78 +6,81 @@ [![Discord](https://img.shields.io/discord/652904322706833409.svg?label=&logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/RzDW3Ne) [![Patreon](https://img.shields.io/badge/Patreon-donate-orange.svg)](https://www.patreon.com/joinemm) [![Sponsor](https://img.shields.io/github/sponsors/joinemm?color=%23db61a2)](https://github.com/sponsors/joinemm) - [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/B0B824LWC) - * * * -A discord bot with over 100 commands and features, including but not limited to: - -- Fishing -- LastFM Integration -- Melon charts -- Youtube search -- Twitter media extractor -- Instagram media extractor -- TikTok media extractor -- Moderation (ban, mute, timeout, etc) -- Logs bans, leaves, joins, deleted messages -- Server and user information -- Customizable profiles -- Minecraft server status -- Starboard -- DuckDuckGo bangs -- Colors and color palettes -- Create and search gifs -- Horoscope -- Weather -- Keyword notifications -- Rolepicker -- Color roles -- Typing tests and Typeracer -- Papago Naver and google translator -- Wolfram alpha -- Reminders -- Custom commands -- Configurable prefix -- Cryptocurrency data -- Kpop idol database - -...and much more. Visit for more detailed overview of the features. +# Miso Bot -## Star History +Miso is a multipurpose Discord bot with over 100 commands and features. -[![Star History Chart](https://api.star-history.com/svg?repos=joinemm/miso-bot&type=Date)](https://star-history.com/#joinemm/miso-bot&Date) +For more information and command reference, visit -## Contributor wall +## Development -[![Contributors](https://contrib.rocks/image?repo=joinemm/miso-bot)](https://github.com/joinemm/miso-bot/graphs/contributors) +A Nix development shell is included, using [devenv](https://github.com/cachix/devenv) -## Deployment using docker +This environment installs poetry and some useful packages. -First copy/rename `.env.example` to `.env` and fill it with your own keys. -Everything else should be handled by the `docker-compose.yml` +```sh +nix develop --impure +``` + +The dependencies are managed using [Poetry](https://python-poetry.org/) + +```sh +poetry install +``` - $ docker-compose up --build +The bot can then be run with -## Deploying locally +```sh +poetry run python main.py +``` -The dependencies are compiled using pip-tools from `requirements.in` and `dev-requirements.in`. the dev file just adds linters and pre-commit. +but it will not function without a MariaDB database. +This makes using docker compose the easiest way to run the bot. -Installation using pip-tools: +## Contributing - $ pip-sync requirements.txt dev-requirements.txt +Your pull requests are welcome, as long as they meet the code standards enforced by the [pre-commit](https://pre-commit.com/) hooks. -Installation using pip: +- [Black](https://github.com/psf/black) and [isort](https://pycqa.github.io/isort/) for formatting. +- [Ruff](https://github.com/astral-sh/ruff), for linting. +- [Reuse](https://reuse.software/), for licensing. - $ pip install -r requirements.txt -r dev-requirements.txt +To install the hooks, run this command: -You need to have a mysql/mariadb database running, then run the migrations in `sql/init/...`. After this, you can run the bot: +```sh +pre-commit install +``` - $ python main.py +Now your code should be automatically checked for issues when you commit. -> Note: Running this way, the HTML rendering will not work as it relies on an external docker container. You will have to run that separately. +## Deployment +First copy/rename `.env.example` to `.env` and fill it with your own keys. +Everything else should be handled by the dockerfile. + +```sh +docker-compose up +``` + +The docker compose file bootstraps the entire miso infrastructure, +including prometheus metrics, grafana dashboards and nginx reverse proxy. + +You likely don't want these if you're just running the bot. + +To run only the containers needed for the functionality of the bot, you can specify the service names: + +```sh +docker-compose up db image-server emojifier bot +``` +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=joinemm/miso-bot&type=Date)](https://star-history.com/#joinemm/miso-bot&Date) +## Contributor wall + +[![Contributors](https://contrib.rocks/image?repo=joinemm/miso-bot)](https://github.com/joinemm/miso-bot/graphs/contributors) diff --git a/dev-requirements.in b/dev-requirements.in deleted file mode 100644 index 8af919a9..00000000 --- a/dev-requirements.in +++ /dev/null @@ -1,7 +0,0 @@ --c requirements.txt -pre-commit -black -pylint -isort -ruff -pyright diff --git a/dev-requirements.txt b/dev-requirements.txt deleted file mode 100644 index df650a03..00000000 --- a/dev-requirements.txt +++ /dev/null @@ -1,64 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --resolver=backtracking dev-requirements.in -# -astroid==3.0.1 - # via pylint -black==23.11.0 - # via -r dev-requirements.in -cfgv==3.4.0 - # via pre-commit -click==8.1.7 - # via - # -c requirements.txt - # black -dill==0.3.7 - # via pylint -distlib==0.3.7 - # via virtualenv -filelock==3.13.1 - # via virtualenv -identify==2.5.31 - # via pre-commit -isort==5.12.0 - # via - # -r dev-requirements.in - # pylint -mccabe==0.7.0 - # via pylint -mypy-extensions==1.0.0 - # via black -nodeenv==1.8.0 - # via - # pre-commit - # pyright -packaging==23.2 - # via - # -c requirements.txt - # black -pathspec==0.11.2 - # via black -platformdirs==3.11.0 - # via - # black - # pylint - # virtualenv -pre-commit==3.5.0 - # via -r dev-requirements.in -pylint==3.0.2 - # via -r dev-requirements.in -pyright==1.1.336 - # via -r dev-requirements.in -pyyaml==6.0.1 - # via pre-commit -ruff==0.1.6 - # via -r dev-requirements.in -tomlkit==0.12.3 - # via pylint -virtualenv==20.24.6 - # via pre-commit - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/docker-compose.yml b/docker-compose.yml index 5909564e..365f7e3a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -81,9 +81,7 @@ services: expose: - 3000 volumes: - # Static files - ./static:/app/static:ro - # Handlebar template files - ./templates:/app/templates:ro shlink: diff --git a/flake.lock b/flake.lock new file mode 100644 index 00000000..862af811 --- /dev/null +++ b/flake.lock @@ -0,0 +1,236 @@ +{ + "nodes": { + "devenv": { + "inputs": { + "flake-compat": "flake-compat", + "nix": "nix", + "nixpkgs": "nixpkgs", + "pre-commit-hooks": "pre-commit-hooks" + }, + "locked": { + "lastModified": 1705094340, + "narHash": "sha256-T7d1d5PQXqDbZUnKjRTBf26yTCMSttDQULM8jU4jiro=", + "owner": "cachix", + "repo": "devenv", + "rev": "96b49eb381779bdd4f41ca176a762867c31db5da", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1685518550, + "narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "devenv", + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "lowdown-src": { + "flake": false, + "locked": { + "lastModified": 1633514407, + "narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=", + "owner": "kristapsdz", + "repo": "lowdown", + "rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8", + "type": "github" + }, + "original": { + "owner": "kristapsdz", + "repo": "lowdown", + "type": "github" + } + }, + "nix": { + "inputs": { + "lowdown-src": "lowdown-src", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-regression": "nixpkgs-regression" + }, + "locked": { + "lastModified": 1676545802, + "narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=", + "owner": "domenkozar", + "repo": "nix", + "rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "relaxed-flakes", + "repo": "nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1678875422, + "narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "126f49a01de5b7e35a43fd43f891ecf6d3a51459", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-regression": { + "locked": { + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1685801374, + "narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "c37ca420157f4abc31e26f436c1145f8951ff373", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { + "locked": { + "lastModified": 1704290814, + "narHash": "sha256-LWvKHp7kGxk/GEtlrGYV68qIvPHkU9iToomNFGagixU=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "70bdadeb94ffc8806c0570eb5c2695ad29f0e421", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": [ + "devenv", + "flake-compat" + ], + "flake-utils": "flake-utils", + "gitignore": "gitignore", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1704725188, + "narHash": "sha256-qq8NbkhRZF1vVYQFt1s8Mbgo8knj+83+QlL5LBnYGpI=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "ea96f0c05924341c551a797aaba8126334c505d2", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "devenv": "devenv", + "nixpkgs": "nixpkgs_2" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 00000000..4c760d3b --- /dev/null +++ b/flake.nix @@ -0,0 +1,46 @@ +# SPDX-FileCopyrightText: 2024 Joonas Rautiola +# SPDX-License-Identifier: MPL-2.0 +# https://git.joinemm.dev/miso-bot + +{ + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.05"; + devenv.url = "github:cachix/devenv"; + }; + + nixConfig = { + extra-trusted-public-keys = "devenv.cachix.org-1:w1cLUi8dv3hnoSPGAuibQv+f9TZLr6cv/Hm9XgU50cw="; + extra-substituters = "https://devenv.cachix.org"; + }; + + outputs = { + nixpkgs, + devenv, + ... + } @ inputs: let + pkgs = nixpkgs.legacyPackages."x86_64-linux"; + in { + devShell.x86_64-linux = devenv.lib.mkShell { + inherit inputs pkgs; + modules = [ + ({pkgs, ...}: { + packages = with pkgs; [ + ffmpeg + pre-commit + reuse + black + isort + ruff + ]; + + dotenv.enable = true; + + languages.python = { + enable = true; + poetry.enable = true; + }; + }) + ]; + }; + }; +} diff --git a/pyproject.toml b/pyproject.toml index 005ae7e7..47a615ed 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,8 +2,53 @@ # SPDX-License-Identifier: MPL-2.0 # https://git.joinemm.dev/miso-bot +[tool.poetry] +name = "miso-bot" +version = "6.0" +description = "Multipurpose Discord bot" +authors = ["Joinemm "] +license = "MPL-2.0" +readme = "README.md" +packages = [{include = "miso_bot"}] + +[tool.poetry.dependencies] +python = "^3.10" +aiohttp = "^3.9.1" +discord-py = {extras = ["speed"], version = "^2.3.2"} +aiomysql = "^0.2.0" +arrow = "^1.3.0" +beautifulsoup4 = "^4.12.2" +bleach = "^6.1.0" +colorgram-py = "^1.2.0" +durations-nlp = "^1.0.1" +humanize = "^4.9.0" +jishaku = "^2.5.2" +kdtree = "^0.16" +matplotlib = "^3.8.2" +numpy = "^1.26.3" +pillow = "^10.2.0" +psutil = "^5.9.7" +python-dotenv = "^1.0.0" +regex = "^2023.12.25" +scipy = "^1.11.4" +uvloop = "^0.19.0" +prometheus-async = "^22.2.0" +markdownify = "^0.11.6" +lxml = "^5.1.0" +loguru = "^0.7.2" +redis = "^5.0.1" +shazamio = "^0.4.0.1" +random-user-agent = "^1.0.1" +minestat = "^2.6.2" + +[tool.poetry.group.dev.dependencies] +pre-commit = "^3.6.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + [tool.black] -line-length = 88 exclude = ''' /( \.git @@ -16,28 +61,14 @@ exclude = ''' ''' [tool.ruff] -line-length = 100 target-version = "py311" exclude = [ - ".bzr", ".direnv", - ".eggs", ".git", - ".hg", ".mypy_cache", - ".nox", - ".pants.d", ".ruff_cache", - ".svn", - ".tox", ".venv", - "__pypackages__", - "_build", - "buck-out", - "build", - "dist", - "node_modules", "venv", ".venv", ] diff --git a/requirements.in b/requirements.in deleted file mode 100644 index 3c34aaec..00000000 --- a/requirements.in +++ /dev/null @@ -1,29 +0,0 @@ -discord.py[speed] -aiohttp -aiohttp-cors -aiomysql -arrow -async-cse -beautifulsoup4 -bleach -colorgram.py -durations-nlp -humanize -jishaku -kdtree -matplotlib -numpy -Pillow -psutil -python-dotenv -regex -scipy -uvloop -prometheus-async -markdownify -lxml -loguru -redis -shazamio -random_user_agent -minestat diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 5d83081b..00000000 --- a/requirements.txt +++ /dev/null @@ -1,181 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.11 -# by the following command: -# -# pip-compile --resolver=backtracking requirements.in -# -aiodns==3.1.1 - # via discord-py -aiofiles==22.1.0 - # via shazamio -aiohttp==3.9.0 - # via - # -r requirements.in - # aiohttp-cors - # async-cse - # discord-py - # shazamio -aiohttp-cors==0.7.0 - # via -r requirements.in -aiomysql==0.2.0 - # via -r requirements.in -aiosignal==1.3.1 - # via aiohttp -anyio==3.7.1 - # via shazamio -arrow==1.3.0 - # via -r requirements.in -astunparse==1.6.3 - # via import-expression -async-cse==0.3.0 - # via -r requirements.in -attrs==23.1.0 - # via aiohttp -beautifulsoup4==4.12.2 - # via - # -r requirements.in - # markdownify -bleach==6.1.0 - # via -r requirements.in -braceexpand==0.1.7 - # via jishaku -brotli==1.1.0 - # via discord-py -cffi==1.16.0 - # via pycares -click==8.1.7 - # via jishaku -colorgram-py==1.2.0 - # via -r requirements.in -contourpy==1.2.0 - # via matplotlib -cycler==0.12.1 - # via matplotlib -dataclass-factory==2.16 - # via shazamio -discord-py[speed]==2.3.2 - # via -r requirements.in -dnspython==2.4.2 - # via minestat -durations-nlp==1.0.1 - # via -r requirements.in -fonttools==4.44.3 - # via matplotlib -frozenlist==1.4.0 - # via - # aiohttp - # aiosignal -humanize==4.8.0 - # via -r requirements.in -idna==3.4 - # via - # anyio - # yarl -import-expression==1.1.4 - # via jishaku -iniconfig==2.0.0 - # via pytest -jishaku==2.5.2 - # via -r requirements.in -kdtree==0.16 - # via -r requirements.in -kiwisolver==1.4.5 - # via matplotlib -loguru==0.7.2 - # via -r requirements.in -lxml==4.9.3 - # via -r requirements.in -markdownify==0.11.6 - # via -r requirements.in -matplotlib==3.8.2 - # via -r requirements.in -minestat==2.6.2 - # via -r requirements.in -multidict==6.0.4 - # via - # aiohttp - # yarl -numpy==1.26.2 - # via - # -r requirements.in - # contourpy - # matplotlib - # scipy - # shazamio -orjson==3.9.10 - # via discord-py -packaging==23.2 - # via - # matplotlib - # pytest -pillow==10.1.0 - # via - # -r requirements.in - # colorgram-py - # matplotlib -pluggy==1.3.0 - # via pytest -prometheus-async==22.2.0 - # via -r requirements.in -prometheus-client==0.18.0 - # via prometheus-async -psutil==5.9.6 - # via -r requirements.in -pycares==4.4.0 - # via aiodns -pycparser==2.21 - # via cffi -pydantic==1.10.13 - # via shazamio -pydub==0.25.1 - # via shazamio -pymysql==1.1.0 - # via aiomysql -pyparsing==3.1.1 - # via matplotlib -pytest==7.4.3 - # via - # pytest-asyncio - # shazamio -pytest-asyncio==0.20.3 - # via shazamio -python-dateutil==2.8.2 - # via - # arrow - # matplotlib -python-dotenv==1.0.0 - # via -r requirements.in -random-user-agent==1.0.1 - # via -r requirements.in -redis==5.0.1 - # via -r requirements.in -regex==2023.10.3 - # via -r requirements.in -scipy==1.11.3 - # via -r requirements.in -shazamio==0.4.0.1 - # via -r requirements.in -six==1.16.0 - # via - # astunparse - # bleach - # markdownify - # python-dateutil -sniffio==1.3.0 - # via anyio -soupsieve==2.5 - # via beautifulsoup4 -types-python-dateutil==2.8.19.14 - # via arrow -typing-extensions==4.8.0 - # via pydantic -uvloop==0.19.0 - # via -r requirements.in -webencodings==0.5.1 - # via bleach -wheel==0.41.3 - # via astunparse -wrapt==1.16.0 - # via prometheus-async -yarl==1.9.2 - # via aiohttp