Python SDK for building bots on Banter (banterchat.org) — discord.py-style.
Project description
banterbotapi
Python SDK for building bots on Banter.
pip install banterbotapi
Install name is banterbotapi, import name is banterapi (same pattern as Pillow/PIL).
Quick start
from banterapi import Bot, Intents
bot = Bot(intents=Intents.default() | Intents.MESSAGE_CONTENT)
@bot.event
async def on_ready():
print(f"logged in as {bot.user.username}")
@bot.event
async def on_message(message):
if message.content == "!ping":
await message.reply("pong")
bot.run("YOUR_TOKEN")
Slash commands
from banterapi import SlashOption, Optional, OPTION_STRING, OPTION_INTEGER
@bot.slash_command(
name="roll",
description="Roll an N-sided die",
options=[Optional("sides", type=OPTION_INTEGER, description="default 6")],
)
async def roll(interaction):
sides = interaction.options.get("sides", 6)
await interaction.respond(f"🎲 {sides}-sided die")
Optional(name, ...) is a shorthand for SlashOption(name, ..., required=False).
Response methods on interaction:
| Method | Use for |
|---|---|
respond(content, embed=, ephemeral=, components=) |
The visible reply. Once per interaction. |
defer(ephemeral=) |
Ack now, reply within 15 minutes. Shows a thinking indicator. |
followup(content, embed=, ...) |
Additional messages after respond. Repeatable. |
update(content, embed=, components=) |
Button only. Edits the source message in place. |
ephemeral=True makes the message visible only to the invoker.
Buttons
Attach buttons to any embed and handle clicks with @bot.on_button.
from banterapi import Embed
@bot.slash_command(name="confirm", description="Confirm or cancel")
async def confirm(interaction):
embed = Embed(title="Are you sure?")
embed.add_button("Yes", style="success", custom_id="confirm_yes")
embed.add_button("No", style="danger", custom_id="confirm_no")
await interaction.respond(embed=embed, ephemeral=True)
@bot.on_button("confirm_yes")
async def yes(interaction):
await interaction.update(content="Confirmed.", components=[])
@bot.on_button("confirm_no")
async def no(interaction):
await interaction.update(content="Cancelled.", components=[])
Glob match a family of buttons with a trailing * — useful for pagination where the page number rides in the id:
@bot.on_button("page_*")
async def page(interaction):
n = int(interaction.custom_id.removeprefix("page_"))
await interaction.update(embed=build_page(n))
add_button(label, style=, custom_id=, url=, emoji=, disabled=) — styles are primary, secondary, success, danger, link. link requires url; everything else needs custom_id to fire a handler. Up to 5 buttons per row, up to 5 rows per message.
Buttons work everywhere a message goes: bot.send_message(...), message.reply(...), interaction.respond(...), interaction.followup(...), interaction.update(...).
Embeds
embed = Embed(title="Status", description="All systems nominal.", color=0x57F287)
embed.add_field("Uptime", "12d 4h", inline=True)
embed.add_field("Users", "1,204", inline=True)
embed.set_footer("Last checked just now")
embed.set_thumbnail("https://example.com/icon.png")
await message.channel.send(embed=embed)
Color accepts an int (0x5865F2) or a CSS hex string ("#5865f2").
Events
@bot.event
async def on_ready(): ...
@bot.event
async def on_message(message): ...
@bot.event
async def on_message_edit(before, after): ...
@bot.event
async def on_member_join(member): ...
@bot.event
async def on_reaction_add(reaction, user): ...
The full event list lives in client.py. Names follow discord.py conventions where they overlap.
Permissions
from banterapi import Permissions, has_permissions
@bot.slash_command(name="ban", description="Ban a user")
@has_permissions(Permissions.BAN_MEMBERS)
async def ban(interaction): ...
Permissions is a flag enum. Combine with |, check with &. Decorators raise MissingPermissions which the bot can catch in an on_error handler.
Intents
intents = Intents.default() | Intents.MESSAGE_CONTENT
bot = Bot(intents=intents)
Intents.default() covers the common cases (guilds, members, messages without content, reactions). Add MESSAGE_CONTENT to receive message text in on_message.
Sending files
from banterapi import File
await message.channel.send(content="Here's the report.", file=File("report.pdf"))
await message.channel.send(files=[File("a.png"), File("b.png")])
Error handling
from banterapi import Forbidden, NotFound, RateLimited
try:
await message.channel.send("hi")
except Forbidden:
pass # bot lacks permission
except RateLimited as e:
await asyncio.sleep(e.retry_after)
Base class is BanterError; HTTP-specific errors inherit from HTTPException.
pip install banterbotapi
```python
from banterapi import Bot, Intents
bot = Bot(intents=Intents.default() | Intents.MESSAGE_CONTENT)
bot.run("YOUR_TOKEN")
Install name is banterbotapi, import name is banterapi (same pattern as Pillow/PIL).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file banterbotapi-1.0.20.tar.gz.
File metadata
- Download URL: banterbotapi-1.0.20.tar.gz
- Upload date:
- Size: 45.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
04607fe0b34f5f8f17eb152b51c8b6d7e78c4212b295a6af50935108abc35589
|
|
| MD5 |
0850be8cf831916f6aa134b6f4d42ee1
|
|
| BLAKE2b-256 |
93b4a9b841182381c04b622d8bf21483811a1b6db682e705c2b2d82265705420
|
File details
Details for the file banterbotapi-1.0.20-py3-none-any.whl.
File metadata
- Download URL: banterbotapi-1.0.20-py3-none-any.whl
- Upload date:
- Size: 49.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ba3c6a00a92e78b062c05f39d2452dedf3342ca50513cb56d9e1261e765e932
|
|
| MD5 |
43241108980c4eaf31a78d3e7e33b8c6
|
|
| BLAKE2b-256 |
c7cfce33d03ec2a8ffaa4564412f5392b0320e0ee784d8143251d91fe8425365
|