π A command handler for Hikari that keeps your project neat and tidy.
- Simple and intuitive API.
- Slash, user, and message commands.
- Supports autocomplete.
- Error handling for commands, events, and autocomplete.
- Command groups.
- Hooks to run function before or after a command (or any command from a group!)
- Plugin system to easily split bot into different modules.
- Easily use a custom context class.
- Makes typehinting easy.
Crescent is supported in python3.8+.
pip install hikari-crescent
Signature parsing can be used for simple commands.
import crescent
bot = crescent.Bot("YOUR_TOKEN")
# Include the command in your bot - don't forget this
@bot.include
# Create a slash command
@crescent.command
async def say(ctx: crescent.Context, word: str):
await ctx.respond(word)
bot.run()
Information for arguments can be provided using the Annotated
type hint.
See this example for more information.
# python 3.9 +
from typing import Annotated as Atd
# python 3.8
from typing_extensions import Annotated as Atd
@bot.include
@crescent.command
async def say(ctx: crescent.Context, word: Atd[str, "The word to say"]) -> None:
await ctx.respond(word)
Complicated commands, such as commands with many modifiers on options or autocomplete on several options, should use class commands. Class commands allow you to declare a command similar to how you declare a dataclass. The option function takes a type followed by the description, then optional information.
@bot.include
@crescent.command(name="say")
class Say:
word = crescent.option(str, "The word to say")
async def callback(self, ctx: crescent.Context) -> None:
await ctx.respond(self.word)
Type | Option Type |
---|---|
str |
Text |
int |
Integer |
bool |
Boolean |
float |
Number |
hikari.User |
User |
hikari.Role |
Role |
crescent.Mentionable |
Role or User |
Any Hikari channel type. | Channel. The options will be the channel type and its subclasses. |
Union[Channel Types] (functions only) |
Channel. ^ |
List[Channel Types] (classes only) |
Channel. ^ |
hikari.Attachment |
Attachment |
Errors that are raised by a command can be handled by crescent.catch_command
.
class MyError(Exception):
...
@bot.include
@crescent.catch_command(MyError)
async def on_err(exc: MyError, ctx: crescent.Context) -> None:
await ctx.respond("An error occurred while running the command.")
@bot.include
@crescent.command
async def my_command(ctx: crescent.Context):
raise MyError()
import hikari
@bot.include
@crescent.event
async def on_message_create(event: hikari.MessageCreateEvent):
if event.message.author.is_bot:
return
await event.message.respond("Hello!")
Using crescent's event decorator lets you use crescent's event error handling system.
Crescent has 2 builtin extensions.
- crescent-ext-cooldowns - Allows you to add sliding window rate limits to your commands.
- crescent-ext-tasks - Schedules background tasks using loops or cronjobs.
These extensions can be installed with pip.
- crescent-ext-docstrings - Lets you use docstrings to write descriptions for commands and options.
- crescent-ext-kebabify - Turns your command names into kebabs!
Contact Lunarmagpieβ€#0001
on Discord or create an issue. All questions are welcome!
Create an issue for your feature. There aren't any guidelines right now so just don't be rude.