All Projects → hikari-py → hikari

hikari-py / hikari

Licence: MIT license
A Discord API wrapper for Python and asyncio built on good intentions.

Programming Languages

python
139335 projects - #7 most used programming language

Projects that are alternatives of or similar to hikari

dislash.py
A Python wrapper for discord slash-commands and buttons, designed to extend discord.py.
Stars: ✭ 172 (-72.74%)
Mutual labels:  discord-api, slash-commands
simple-matrix-bot-lib
An easy to use bot library for the Matrix ecosystem written in Python. https://matrix.to/#/#simplematrixbotlib:matrix.org
Stars: ✭ 27 (-95.72%)
Mutual labels:  bot-framework, asyncio
DiscordBot-Template
A boilerplate / template for discord.js bots with 100% coverage of Discord API, command handler, error handler based on https://discordjs.guide/
Stars: ✭ 129 (-79.56%)
Mutual labels:  discord-api, slash-commands
hikari-intro
An introduction to hikari, complete with different examples for different command handlers.
Stars: ✭ 17 (-97.31%)
Mutual labels:  slash-commands, hikari
slash-commands
slash commands handler to make your bot support slash commands.
Stars: ✭ 59 (-90.65%)
Mutual labels:  discord-api, slash-commands
hikari-lightbulb
The official unofficial command handler for the Python discord API wrapper library, Hikari.
Stars: ✭ 152 (-75.91%)
Mutual labels:  discord-api, hikari
Discord-Bot-TypeScript-Template
Discord bot - A discord.js bot template written with TypeScript.
Stars: ✭ 86 (-86.37%)
Mutual labels:  bot-framework, discord-api
Opsdroid
🤖 An open source chat-ops bot framework
Stars: ✭ 563 (-10.78%)
Mutual labels:  bot-framework, asyncio
hata
Async Discord API wrapper.
Stars: ✭ 156 (-75.28%)
Mutual labels:  discord-api, slash-commands
Aiogram
Is a pretty simple and fully asynchronous framework for Telegram Bot API written in Python 3.7 with asyncio and aiohttp.
Stars: ✭ 2,195 (+247.86%)
Mutual labels:  bot-framework, asyncio
nextcord
A Python wrapper for the Discord API forked from discord.py
Stars: ✭ 956 (+51.51%)
Mutual labels:  bot-framework, discord-api
gencord
A simple, beginner-friendly, and easy-to-use library for interacting with the Discord API, with minimal syntax.
Stars: ✭ 20 (-96.83%)
Mutual labels:  discord-api, slash-commands
slshx
⚔️ Strongly-typed Discord commands on Cloudflare Workers
Stars: ✭ 163 (-74.17%)
Mutual labels:  discord-api, slash-commands
racket-cord
A discord library for racket
Stars: ✭ 24 (-96.2%)
Mutual labels:  discord-api
eventkit
Event-driven data pipelines
Stars: ✭ 94 (-85.1%)
Mutual labels:  asyncio
telegram-bot-framework
Python Telegram bot API framework
Stars: ✭ 19 (-96.99%)
Mutual labels:  bot-framework
aiotinydb
asyncio compatibility shim for tinydb
Stars: ✭ 42 (-93.34%)
Mutual labels:  asyncio
discord-rose
The simple Discord library for advanced users
Stars: ✭ 37 (-94.14%)
Mutual labels:  discord-api
async retrial
Python package for retrial of asyncio based coroutines
Stars: ✭ 14 (-97.78%)
Mutual labels:  asyncio
yutto
🧊 一个可爱且任性的 B 站视频下载器(bilili V2)
Stars: ✭ 383 (-39.3%)
Mutual labels:  asyncio

hikari

PyPI version Supported python versions
CI status Mypy badge Black badge Test coverage
Discord invite Documentation status

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

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 and 3.10 are currently supported.

Installation

Install Hikari from PyPI with the following command:

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

Bots

import hikari

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

@bot.listen()
async def ping(event: hikari.GuildMessageCreateEvent) -> None:
    # If a non-bot user sends a message "hk.ping", respond with "Pong!"
    # We check there is actually content first, if no message content exists,
    # we would get `None' here.
    if event.is_bot or not event.content:
        return

    if event.content.startswith("hk.ping"):
        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.

Logging will be automatically configured for you if you do not enable it manually. This has been implemented after seeing a large number of new bot developers struggle with writing their first bot in other frameworks simply because of working blind after not understanding or knowing how to set up standard logging messages.

If you wish to customise 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:

# the default is to enable all unprivileged intents (all events that do not target the
# presence or activity of a specific member).
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). Other options also exist such as customising timeouts for requests and enabling a proxy.

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

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.

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.

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

# or

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

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:

rest = hikari.RESTApp()

async def print_my_user(token):
    # 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)

asyncio.run(print_my_user("user token here"))

Optional Features

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

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:

  • lightbulb - a simple and easy to use command framework for Hikari.
  • tanjun - a flexible command framework designed to extend Hikari.
  • crescent - a command handler for Hikari that keeps your project neat and tidy.

Making your application more efficient

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

Python optimisation flags

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

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

A minimum of first level of optimizations 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), you can install Hikari using pip install -U hikari[speedups]. This will install aiodns, cchardet, Brotli, and ciso8601 which will provide you with a small 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:

import os
import hikari

if os.name != "nt":
    import uvloop
    uvloop.install()

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

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 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.

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/nox.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

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].