hikari


Namehikari JSON
Version 2.0.0.dev124 PyPI version JSON
download
home_pagehttps://github.com/hikari-py/hikari
SummaryA sane Discord API for Python 3 built on asyncio and good intentions
upload_time2024-04-07 18:56:21
maintainerdavfsa
docs_urlNone
authorNekokatt
requires_python<3.13,>=3.8.0
licenseMIT
keywords
VCS
bugtrack_url
requirements aiohttp attrs colorlog multidict
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <div align="center">
<h1>hikari</h1>
<a href="https://pypi.org/project/hikari"><img height="20" alt="Supported python versions" src="https://img.shields.io/pypi/pyversions/hikari"></a>
<a href="https://pypi.org/project/hikari"><img height="20" alt="PyPI version" src="https://img.shields.io/pypi/v/hikari"></a>
<br>
<a href="https://github.com/hikari-py/hikari/actions"><img height="20" alt="CI status" src="https://github.com/hikari-py/hikari/actions/workflows/ci.yml/badge.svg?branch=master&event=push"></a>
<a href="https://pypi.org/project/mypy/"><img height="20" alt="Mypy badge" src="https://img.shields.io/badge/mypy-checked-blue"></a>
<a href="https://pypi.org/project/black"><img height="20" alt="Black badge" src="https://img.shields.io/badge/code%20style-black-000000.svg"></a>
<a href="https://codeclimate.com/github/hikari-py/hikari/test_coverage"><img height="20" alt="Test coverage" src="https://api.codeclimate.com/v1/badges/f95070b25136a69b0589/test_coverage"></a>
<br>
<a href="https://discord.gg/Jx4cNGG"><img height="20" alt="Discord invite" src="https://discord.com/api/guilds/574921006817476608/widget.png"></a>
<a href="https://docs.hikari-py.dev/en/stable"><img height="20" alt="Documentation Status" src="https://readthedocs.org/projects/hikari-py/badge/?version=latest"></a>
</div>

An opinionated, static typed Discord microframework for Python3 and asyncio that supports Discord's v10 REST and
Gateway APIs.

Built on good intentions and the hope that it will be extendable and reusable, rather than an obstacle for future
development.

Python 3.8, 3.9, 3.10, 3.11 and 3.12 are currently supported.

## Installation

Install hikari from PyPI with the following command:

```bash
python -m pip install -U hikari
# Windows users may need to run this instead...
py -3 -m pip install -U hikari
```

----

## Bots

Hikari provides two different default bot implementations to suit your needs:

- [GatewayBot](#gatewaybot)
- [RESTBot](#restbot)

### GatewayBot

A [`GatewayBot`](https://docs.hikari-py.dev/en/stable/reference/hikari/impl/gateway_bot/#hikari.impl.gateway_bot.GatewayBot)
is one which will connect to Discord through the gateway and receive
events through there. A simple startup example could be the following:

```py
import hikari

bot = hikari.GatewayBot(token="...")

@bot.listen()
async def ping(event: hikari.GuildMessageCreateEvent) -> None:
    """If a non-bot user mentions your bot, respond with 'Pong!'."""

    # Do not respond to bots nor webhooks pinging us, only user accounts
    if not event.is_human:
        return

    me = bot.get_me()

    if me.id in event.message.user_mentions_ids:
        await event.message.respond("Pong!")

bot.run()
```

This will only respond to messages created in guilds. You can use `DMMessageCreateEvent` instead to only listen on
DMs, or `MessageCreateEvent` to listen to both DMs and guild-based messages. A full list of events
can be found in the [events docs](https://docs.hikari-py.dev/en/stable/reference/hikari/events/).

If you wish to customize the intents being used in order to change which events your bot is notified about, then you
can pass the `intents` kwarg to the `GatewayBot` constructor:

```py
import hikari

# the default is to enable all unprivileged intents (all events that do not target the
# presence, activity of a specific member nor message content).
bot = hikari.GatewayBot(intents=hikari.Intents.ALL, token="...")
```

The above example would enable all intents, thus enabling events relating to member presences to be received
(you'd need to whitelist your application first to be able to start the bot if you do this).

Events are determined by the type annotation on the event parameter, or alternatively as a type passed to the
`@bot.listen()` decorator, if you do not want to use type hints.

```py
import hikari

bot = hikari.GatewayBot("...")

@bot.listen()
async def ping(event: hikari.MessageCreateEvent):
    ...

# or

@bot.listen(hikari.MessageCreateEvent)
async def ping(event):
    ...
```

### RESTBot

A [`RESTBot`](https://docs.hikari-py.dev/en/stable/reference/hikari/impl/rest_bot/#hikari.impl.rest_bot.RESTBot)
spawns an interaction server to which Discord will **only** send interaction events,
which can be handled and responded to.

An example of a simple `RESTBot` could be the following:

```py
import asyncio

import hikari


# This function will handle the interactions received
async def handle_command(interaction: hikari.CommandInteraction):
    # Create an initial response to be able to take longer to respond
    yield interaction.build_deferred_response()

    await asyncio.sleep(5)

    # Edit the initial response
    await interaction.edit_initial_response("Edit after 5 seconds!")


# Register the commands on startup.
#
# Note that this is not a nice way to manage this, as it is quite spammy
# to do it every time the bot is started. You can either use a command handler
# or only run this code in a script using `RESTApp` or add checks to not update
# the commands if there were no changes
async def create_commands(bot: hikari.RESTBot):
    application = await bot.rest.fetch_application()

    await bot.rest.set_application_commands(
        application=application.id,
        commands=[
            bot.rest.slash_command_builder("test", "My first test command!"),
        ],
    )


bot = hikari.RESTBot(
    token="...",
    token_type="...",
    public_key="...",
)

bot.add_startup_callback(create_commands)
bot.set_listener(hikari.CommandInteraction, handle_command)

bot.run()
```

Unlike `GatewayBot`, registering listeners is done through `.set_listener`, and it takes in an interaction type
that the handler will take in.

Note that a bit of a setup is required to get the above code to work. You will need to host the project to
the World Wide Web (scary!) and then register the URL on the [Discord application portal](https://discord.com/developers/applications)
for your application under "Interactions Endpoint URL".

A quick way you can get your bot onto the internet and reachable by Discord (**for development environment only**) is
through a tool like [ngrok](https://ngrok.com/) or [localhost.run](https://localhost.run/). More information on how to
use them can be found in their respective websites.

### Common helpful features

Both implementations take in helpful arguments such as [customizing timeouts for requests](https://docs.hikari-py.dev/en/stable/reference/hikari/impl/config/#hikari.impl.config.HTTPSettings.timeouts)
and [enabling a proxy](https://docs.hikari-py.dev/en/stable/reference/hikari/impl/config/#hikari.impl.config.ProxySettings),
which are passed directly into the bot during initialization.

Also note that you could pass extra options to `bot.run` during development, for example:

```py
import hikari

bot = hikari.GatewayBot("...")
# or
bot = hikari.RESTBot("...", "...")

bot.run(
    asyncio_debug=True,             # enable asyncio debug to detect blocking and slow code.

    coroutine_tracking_depth=20,    # enable tracking of coroutines, makes some asyncio
                                    # errors clearer.

    propagate_interrupts=True,      # Any OS interrupts get rethrown as errors.
)
```

Many other helpful options exist for you to take advantage of if you wish. Links to the respective docs can be seen
below:

- [GatewayBot.run](https://docs.hikari-py.dev/en/stable/reference/hikari/impl/gateway_bot/#hikari.impl.gateway_bot.GatewayBot.run)
- [RESTBot.run](https://docs.hikari-py.dev/en/stable/reference/hikari/impl/rest_bot/#hikari.impl.rest_bot.RESTBot.run)

---

## REST-only applications

You may only want to integrate with the REST API, for example if writing a web dashboard.

This is relatively simple to do:

```py
import hikari
import asyncio

rest = hikari.RESTApp()

async def print_my_user(token):
    await rest.start()
  
    # We acquire a client with a given token. This allows one REST app instance
    # with one internal connection pool to be reused.
    async with rest.acquire(token) as client:
        my_user = await client.fetch_my_user()
        print(my_user)

    await rest.close()
        
asyncio.run(print_my_user("user token acquired through OAuth here"))
```

---

## Optional Features

Optional features can be specified when installing hikari:

* `server` - Install dependencies required to enable Hikari's standard interaction server (RESTBot) functionality.
* `speedups` - Detailed in [`hikari[speedups]`](#hikarispeedups).

Example:

```bash
# To install hikari with the speedups feature:
python -m pip install -U hikari[speedups]

# To install hikari with both the speedups and server features:
python -m pip install -U hikari[speedups, server]
```

## Additional resources

You may wish to use a command framework on top of hikari so that you can start writing a bot quickly without
implementing your own command handler.

Hikari does not include a command framework by default, so you will want to pick a third party library to do it:

- [`arc`](https://github.com/hypergonial/hikari-arc) - a bot framework with a focus on type-safety and correctness.
- [`crescent`](https://github.com/magpie-dev/hikari-crescent) - a command handler for hikari that keeps your project neat and tidy.
- [`lightbulb`](https://github.com/tandemdude/hikari-lightbulb) - a simple and easy to use command framework for hikari.
- [`tanjun`](https://github.com/FasterSpeeding/Tanjun) - a flexible command framework designed to extend hikari.

There are also third party libraries to help you manage components:

- [`miru`](https://github.com/hypergonial/hikari-miru) - A component handler for hikari, inspired by discord.py's views.
- [`flare`](https://github.com/brazier-dev/hikari-flare/) - a component manager designed to write simple interactions with persistent data.

---

## Making your application more efficient

As your application scales, you may need to adjust some things to keep it performing nicely.

### Python optimization flags

CPython provides two optimization flags that remove internal safety checks that are useful for development, and change
other internal settings in the interpreter.

- `python bot.py` - no optimization - this is the default.
- `python -O bot.py` - first level optimization - features such as internal assertions will be disabled.
- `python -OO bot.py` - second level optimization - more features (**including all docstrings**) will be removed from
  the loaded code at runtime.

**A minimum of first level of optimization** is recommended when running bots in a production environment.

### `hikari[speedups]`

If you have a C compiler (Microsoft VC++ Redistributable 14.0 or newer, or a modern copy of GCC/G++, Clang, etc), it is
recommended you install Hikari using `pip install -U hikari[speedups]`. This will install `aiohttp` with its available
speedups, `ciso8601` and `orjson` which will provide you with a substantial performance boost.

### `uvloop`

**If you use a UNIX-like system**, you will get additional performance benefits from using a library called `uvloop`.
This replaces the default `asyncio` event loop with one that uses `libuv` internally. You can run `pip install uvloop`
and then amend your script to be something similar to the following example to utilise it in your application:

```py
import asyncio
import os

if os.name != "nt":
    import uvloop
    asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())


# Your code goes here
```

### Compiled extensions

Eventually, we will start providing the option to use compiled components of this library over pure Python ones if it
suits your use case. This should also enable further scalability of your application, should
[_PEP 554 -- Multiple Interpreters in the Stdlib_](https://www.python.org/dev/peps/pep-0554/#abstract) be accepted.

Currently, this functionality does not yet exist.

---

## Developing hikari

To familiarize yourself a bit with the project, we recommend reading our
[contributing manual](https://github.com/hikari-py/hikari/blob/master/CONTRIBUTING.md).

If you wish to contribute something, you should first start by cloning the repository.

In the repository, make a virtual environment (`python -m venv .venv`) and enter it (`source .venv/bin/activate` on
Linux, or for Windows use one of `.venv\Scripts\activate.ps1`, `.venv\Scripts\activate.bat`,
`source .venv/Scripts/activate`).

The first thing you should run is `pip install -r dev-requirements.txt` to install nox.
This handles running predefined tasks and pipelines.

Once this is complete, you can run `nox` without any arguments to ensure everything builds and is correct.

### Where can I start?

Check out the issues tab on GitHub. If you are nervous, look for issues marked as "good first issue" for something
easy to start with!

[![good-first-issues](https://img.shields.io/github/issues/hikari-py/hikari/good%20first%20issue)](https://github.com/hikari-py/hikari/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)

Feel free to also join our [Discord](https://discord.gg/Jx4cNGG) to directly ask questions to the maintainers! They will
be glad to help you out and point you in the right direction.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/hikari-py/hikari",
    "name": "hikari",
    "maintainer": "davfsa",
    "docs_url": null,
    "requires_python": "<3.13,>=3.8.0",
    "maintainer_email": "davfsa@gmail.com",
    "keywords": null,
    "author": "Nekokatt",
    "author_email": null,
    "download_url": "https://files.pythonhosted.org/packages/df/e2/dbe1be28ea0f8f6d76ad2e036bfea2fcd6b264b731849c97027741ee6e77/hikari-2.0.0.dev124.tar.gz",
    "platform": null,
    "description": "<div align=\"center\">\n<h1>hikari</h1>\n<a href=\"https://pypi.org/project/hikari\"><img height=\"20\" alt=\"Supported python versions\" src=\"https://img.shields.io/pypi/pyversions/hikari\"></a>\n<a href=\"https://pypi.org/project/hikari\"><img height=\"20\" alt=\"PyPI version\" src=\"https://img.shields.io/pypi/v/hikari\"></a>\n<br>\n<a href=\"https://github.com/hikari-py/hikari/actions\"><img height=\"20\" alt=\"CI status\" src=\"https://github.com/hikari-py/hikari/actions/workflows/ci.yml/badge.svg?branch=master&event=push\"></a>\n<a href=\"https://pypi.org/project/mypy/\"><img height=\"20\" alt=\"Mypy badge\" src=\"https://img.shields.io/badge/mypy-checked-blue\"></a>\n<a href=\"https://pypi.org/project/black\"><img height=\"20\" alt=\"Black badge\" src=\"https://img.shields.io/badge/code%20style-black-000000.svg\"></a>\n<a href=\"https://codeclimate.com/github/hikari-py/hikari/test_coverage\"><img height=\"20\" alt=\"Test coverage\" src=\"https://api.codeclimate.com/v1/badges/f95070b25136a69b0589/test_coverage\"></a>\n<br>\n<a href=\"https://discord.gg/Jx4cNGG\"><img height=\"20\" alt=\"Discord invite\" src=\"https://discord.com/api/guilds/574921006817476608/widget.png\"></a>\n<a href=\"https://docs.hikari-py.dev/en/stable\"><img height=\"20\" alt=\"Documentation Status\" src=\"https://readthedocs.org/projects/hikari-py/badge/?version=latest\"></a>\n</div>\n\nAn opinionated, static typed Discord microframework for Python3 and asyncio that supports Discord's v10 REST and\nGateway APIs.\n\nBuilt on good intentions and the hope that it will be extendable and reusable, rather than an obstacle for future\ndevelopment.\n\nPython 3.8, 3.9, 3.10, 3.11 and 3.12 are currently supported.\n\n## Installation\n\nInstall hikari from PyPI with the following command:\n\n```bash\npython -m pip install -U hikari\n# Windows users may need to run this instead...\npy -3 -m pip install -U hikari\n```\n\n----\n\n## Bots\n\nHikari provides two different default bot implementations to suit your needs:\n\n- [GatewayBot](#gatewaybot)\n- [RESTBot](#restbot)\n\n### GatewayBot\n\nA [`GatewayBot`](https://docs.hikari-py.dev/en/stable/reference/hikari/impl/gateway_bot/#hikari.impl.gateway_bot.GatewayBot)\nis one which will connect to Discord through the gateway and receive\nevents through there. A simple startup example could be the following:\n\n```py\nimport hikari\n\nbot = hikari.GatewayBot(token=\"...\")\n\n@bot.listen()\nasync def ping(event: hikari.GuildMessageCreateEvent) -> None:\n    \"\"\"If a non-bot user mentions your bot, respond with 'Pong!'.\"\"\"\n\n    # Do not respond to bots nor webhooks pinging us, only user accounts\n    if not event.is_human:\n        return\n\n    me = bot.get_me()\n\n    if me.id in event.message.user_mentions_ids:\n        await event.message.respond(\"Pong!\")\n\nbot.run()\n```\n\nThis will only respond to messages created in guilds. You can use `DMMessageCreateEvent` instead to only listen on\nDMs, or `MessageCreateEvent` to listen to both DMs and guild-based messages. A full list of events\ncan be found in the [events docs](https://docs.hikari-py.dev/en/stable/reference/hikari/events/).\n\nIf you wish to customize the intents being used in order to change which events your bot is notified about, then you\ncan pass the `intents` kwarg to the `GatewayBot` constructor:\n\n```py\nimport hikari\n\n# the default is to enable all unprivileged intents (all events that do not target the\n# presence, activity of a specific member nor message content).\nbot = hikari.GatewayBot(intents=hikari.Intents.ALL, token=\"...\")\n```\n\nThe above example would enable all intents, thus enabling events relating to member presences to be received\n(you'd need to whitelist your application first to be able to start the bot if you do this).\n\nEvents are determined by the type annotation on the event parameter, or alternatively as a type passed to the\n`@bot.listen()` decorator, if you do not want to use type hints.\n\n```py\nimport hikari\n\nbot = hikari.GatewayBot(\"...\")\n\n@bot.listen()\nasync def ping(event: hikari.MessageCreateEvent):\n    ...\n\n# or\n\n@bot.listen(hikari.MessageCreateEvent)\nasync def ping(event):\n    ...\n```\n\n### RESTBot\n\nA [`RESTBot`](https://docs.hikari-py.dev/en/stable/reference/hikari/impl/rest_bot/#hikari.impl.rest_bot.RESTBot)\nspawns an interaction server to which Discord will **only** send interaction events,\nwhich can be handled and responded to.\n\nAn example of a simple `RESTBot` could be the following:\n\n```py\nimport asyncio\n\nimport hikari\n\n\n# This function will handle the interactions received\nasync def handle_command(interaction: hikari.CommandInteraction):\n    # Create an initial response to be able to take longer to respond\n    yield interaction.build_deferred_response()\n\n    await asyncio.sleep(5)\n\n    # Edit the initial response\n    await interaction.edit_initial_response(\"Edit after 5 seconds!\")\n\n\n# Register the commands on startup.\n#\n# Note that this is not a nice way to manage this, as it is quite spammy\n# to do it every time the bot is started. You can either use a command handler\n# or only run this code in a script using `RESTApp` or add checks to not update\n# the commands if there were no changes\nasync def create_commands(bot: hikari.RESTBot):\n    application = await bot.rest.fetch_application()\n\n    await bot.rest.set_application_commands(\n        application=application.id,\n        commands=[\n            bot.rest.slash_command_builder(\"test\", \"My first test command!\"),\n        ],\n    )\n\n\nbot = hikari.RESTBot(\n    token=\"...\",\n    token_type=\"...\",\n    public_key=\"...\",\n)\n\nbot.add_startup_callback(create_commands)\nbot.set_listener(hikari.CommandInteraction, handle_command)\n\nbot.run()\n```\n\nUnlike `GatewayBot`, registering listeners is done through `.set_listener`, and it takes in an interaction type\nthat the handler will take in.\n\nNote that a bit of a setup is required to get the above code to work. You will need to host the project to\nthe World Wide Web (scary!) and then register the URL on the [Discord application portal](https://discord.com/developers/applications)\nfor your application under \"Interactions Endpoint URL\".\n\nA quick way you can get your bot onto the internet and reachable by Discord (**for development environment only**) is\nthrough a tool like [ngrok](https://ngrok.com/) or [localhost.run](https://localhost.run/). More information on how to\nuse them can be found in their respective websites.\n\n### Common helpful features\n\nBoth implementations take in helpful arguments such as [customizing timeouts for requests](https://docs.hikari-py.dev/en/stable/reference/hikari/impl/config/#hikari.impl.config.HTTPSettings.timeouts)\nand [enabling a proxy](https://docs.hikari-py.dev/en/stable/reference/hikari/impl/config/#hikari.impl.config.ProxySettings),\nwhich are passed directly into the bot during initialization.\n\nAlso note that you could pass extra options to `bot.run` during development, for example:\n\n```py\nimport hikari\n\nbot = hikari.GatewayBot(\"...\")\n# or\nbot = hikari.RESTBot(\"...\", \"...\")\n\nbot.run(\n    asyncio_debug=True,             # enable asyncio debug to detect blocking and slow code.\n\n    coroutine_tracking_depth=20,    # enable tracking of coroutines, makes some asyncio\n                                    # errors clearer.\n\n    propagate_interrupts=True,      # Any OS interrupts get rethrown as errors.\n)\n```\n\nMany other helpful options exist for you to take advantage of if you wish. Links to the respective docs can be seen\nbelow:\n\n- [GatewayBot.run](https://docs.hikari-py.dev/en/stable/reference/hikari/impl/gateway_bot/#hikari.impl.gateway_bot.GatewayBot.run)\n- [RESTBot.run](https://docs.hikari-py.dev/en/stable/reference/hikari/impl/rest_bot/#hikari.impl.rest_bot.RESTBot.run)\n\n---\n\n## REST-only applications\n\nYou may only want to integrate with the REST API, for example if writing a web dashboard.\n\nThis is relatively simple to do:\n\n```py\nimport hikari\nimport asyncio\n\nrest = hikari.RESTApp()\n\nasync def print_my_user(token):\n    await rest.start()\n  \n    # We acquire a client with a given token. This allows one REST app instance\n    # with one internal connection pool to be reused.\n    async with rest.acquire(token) as client:\n        my_user = await client.fetch_my_user()\n        print(my_user)\n\n    await rest.close()\n        \nasyncio.run(print_my_user(\"user token acquired through OAuth here\"))\n```\n\n---\n\n## Optional Features\n\nOptional features can be specified when installing hikari:\n\n* `server` - Install dependencies required to enable Hikari's standard interaction server (RESTBot) functionality.\n* `speedups` - Detailed in [`hikari[speedups]`](#hikarispeedups).\n\nExample:\n\n```bash\n# To install hikari with the speedups feature:\npython -m pip install -U hikari[speedups]\n\n# To install hikari with both the speedups and server features:\npython -m pip install -U hikari[speedups, server]\n```\n\n## Additional resources\n\nYou may wish to use a command framework on top of hikari so that you can start writing a bot quickly without\nimplementing your own command handler.\n\nHikari does not include a command framework by default, so you will want to pick a third party library to do it:\n\n- [`arc`](https://github.com/hypergonial/hikari-arc) - a bot framework with a focus on type-safety and correctness.\n- [`crescent`](https://github.com/magpie-dev/hikari-crescent) - a command handler for hikari that keeps your project neat and tidy.\n- [`lightbulb`](https://github.com/tandemdude/hikari-lightbulb) - a simple and easy to use command framework for hikari.\n- [`tanjun`](https://github.com/FasterSpeeding/Tanjun) - a flexible command framework designed to extend hikari.\n\nThere are also third party libraries to help you manage components:\n\n- [`miru`](https://github.com/hypergonial/hikari-miru) - A component handler for hikari, inspired by discord.py's views.\n- [`flare`](https://github.com/brazier-dev/hikari-flare/) - a component manager designed to write simple interactions with persistent data.\n\n---\n\n## Making your application more efficient\n\nAs your application scales, you may need to adjust some things to keep it performing nicely.\n\n### Python optimization flags\n\nCPython provides two optimization flags that remove internal safety checks that are useful for development, and change\nother internal settings in the interpreter.\n\n- `python bot.py` - no optimization - this is the default.\n- `python -O bot.py` - first level optimization - features such as internal assertions will be disabled.\n- `python -OO bot.py` - second level optimization - more features (**including all docstrings**) will be removed from\n  the loaded code at runtime.\n\n**A minimum of first level of optimization** is recommended when running bots in a production environment.\n\n### `hikari[speedups]`\n\nIf you have a C compiler (Microsoft VC++ Redistributable 14.0 or newer, or a modern copy of GCC/G++, Clang, etc), it is\nrecommended you install Hikari using `pip install -U hikari[speedups]`. This will install `aiohttp` with its available\nspeedups, `ciso8601` and `orjson` which will provide you with a substantial performance boost.\n\n### `uvloop`\n\n**If you use a UNIX-like system**, you will get additional performance benefits from using a library called `uvloop`.\nThis replaces the default `asyncio` event loop with one that uses `libuv` internally. You can run `pip install uvloop`\nand then amend your script to be something similar to the following example to utilise it in your application:\n\n```py\nimport asyncio\nimport os\n\nif os.name != \"nt\":\n    import uvloop\n    asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())\n\n\n# Your code goes here\n```\n\n### Compiled extensions\n\nEventually, we will start providing the option to use compiled components of this library over pure Python ones if it\nsuits your use case. This should also enable further scalability of your application, should\n[_PEP 554 -- Multiple Interpreters in the Stdlib_](https://www.python.org/dev/peps/pep-0554/#abstract) be accepted.\n\nCurrently, this functionality does not yet exist.\n\n---\n\n## Developing hikari\n\nTo familiarize yourself a bit with the project, we recommend reading our\n[contributing manual](https://github.com/hikari-py/hikari/blob/master/CONTRIBUTING.md).\n\nIf you wish to contribute something, you should first start by cloning the repository.\n\nIn the repository, make a virtual environment (`python -m venv .venv`) and enter it (`source .venv/bin/activate` on\nLinux, or for Windows use one of `.venv\\Scripts\\activate.ps1`, `.venv\\Scripts\\activate.bat`,\n`source .venv/Scripts/activate`).\n\nThe first thing you should run is `pip install -r dev-requirements.txt` to install nox.\nThis handles running predefined tasks and pipelines.\n\nOnce this is complete, you can run `nox` without any arguments to ensure everything builds and is correct.\n\n### Where can I start?\n\nCheck out the issues tab on GitHub. If you are nervous, look for issues marked as \"good first issue\" for something\neasy to start with!\n\n[![good-first-issues](https://img.shields.io/github/issues/hikari-py/hikari/good%20first%20issue)](https://github.com/hikari-py/hikari/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)\n\nFeel free to also join our [Discord](https://discord.gg/Jx4cNGG) to directly ask questions to the maintainers! They will\nbe glad to help you out and point you in the right direction.\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A sane Discord API for Python 3 built on asyncio and good intentions",
    "version": "2.0.0.dev124",
    "project_urls": {
        "CI": "https://github.com/hikari-py/hikari/actions",
        "Discord": "https://discord.gg/Jx4cNGG",
        "Documentation": "https://docs.hikari-py.dev/en/2.0.0.dev124",
        "Homepage": "https://github.com/hikari-py/hikari",
        "Issue Tracker": "https://github.com/hikari-py/hikari/issues",
        "Source (GitHub)": "https://github.com/hikari-py/hikari"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0aa12892bd35ba49a51a97a4103e6058a4fbcb28ad65eb5a2c8472d000a15971",
                "md5": "2ac50071a4935c109e9599f929d8a208",
                "sha256": "94d0ed699e2e3b7ed09fe351672f943474e9113bcd89329fb49d7313104161b3"
            },
            "downloads": -1,
            "filename": "hikari-2.0.0.dev124-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "2ac50071a4935c109e9599f929d8a208",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<3.13,>=3.8.0",
            "size": 541780,
            "upload_time": "2024-04-07T18:56:17",
            "upload_time_iso_8601": "2024-04-07T18:56:17.283505Z",
            "url": "https://files.pythonhosted.org/packages/0a/a1/2892bd35ba49a51a97a4103e6058a4fbcb28ad65eb5a2c8472d000a15971/hikari-2.0.0.dev124-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "dfe2dbe1be28ea0f8f6d76ad2e036bfea2fcd6b264b731849c97027741ee6e77",
                "md5": "bbf62d3ba975cdd877cf7c9e0b240f89",
                "sha256": "14433674ceb88f1b5167fd75037eb77005498e0ec478764311b4e3657b704a1b"
            },
            "downloads": -1,
            "filename": "hikari-2.0.0.dev124.tar.gz",
            "has_sig": false,
            "md5_digest": "bbf62d3ba975cdd877cf7c9e0b240f89",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<3.13,>=3.8.0",
            "size": 443117,
            "upload_time": "2024-04-07T18:56:21",
            "upload_time_iso_8601": "2024-04-07T18:56:21.287460Z",
            "url": "https://files.pythonhosted.org/packages/df/e2/dbe1be28ea0f8f6d76ad2e036bfea2fcd6b264b731849c97027741ee6e77/hikari-2.0.0.dev124.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-07 18:56:21",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "hikari-py",
    "github_project": "hikari",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "aiohttp",
            "specs": [
                [
                    "~=",
                    "3.9"
                ]
            ]
        },
        {
            "name": "attrs",
            "specs": [
                [
                    "~=",
                    "23.2"
                ]
            ]
        },
        {
            "name": "colorlog",
            "specs": [
                [
                    "~=",
                    "6.8"
                ]
            ]
        },
        {
            "name": "multidict",
            "specs": [
                [
                    "~=",
                    "6.0"
                ]
            ]
        }
    ],
    "lcname": "hikari"
}
        
Elapsed time: 0.22313s