illest.py
Write bots for ILLEST the way you write them for discord. illest.py has discord.py's shape: the same
classes, decorators, events and arguments. Code written for discord.py 2.x usually runs once its import is changed.
pip install illest.py
Python 3.10 or newer. The encryption engine, illest-crypto, comes with it as a compiled wheel for Windows and Linux (x86-64
and ARM64).
A bot in twenty lines
import illest
from illest import app_commands
from illest.ext import commands
bot = commands.Bot(command_prefix="!", intents=illest.Intents.default())
@bot.event
async def setup_hook():
await bot.tree.sync() # registers the slash commands below
@bot.event
async def on_ready():
print(f"signed in as {bot.user}")
@bot.command()
async def ping(ctx: commands.Context):
await ctx.reply("pong")
@bot.tree.command(description="Roll a die")
@app_commands.describe(sides="How many sides it has")
async def roll(interaction: illest.Interaction, sides: app_commands.Range[int, 2, 100] = 6):
import random
await interaction.response.send_message(f"{random.randint(1, sides)}")
bot.run("illb_...")
Make the bot and its token in ILLEST under Settings → Developers. Open the bot there, copy its invite link from Installation, and add it to a server you manage.
To run against your own server instead of chat.illest.world, set ILLEST_GATEWAY_URL (for example
ws://localhost:8766/gateway) or pass server_url= to the client.
What you get
| discord.py | illest.py |
|---|---|
Client, commands.Bot, Intents, @bot.event, wait_for, setup_hook |
the same |
ext.commands: commands, groups, cogs, extensions, checks, cooldowns, converters, Greedy, Range, flags, the help command, hybrid commands |
the same |
app_commands: CommandTree, @tree.command, Group, describe, choices, autocomplete, rename, Range, Transform, context menus, default_permissions, guild_only, checks and cooldowns, tree.sync(guild=...) |
the same |
Interaction: response.send_message, defer (with "thinking"), edit_message, send_modal, followup, original_response |
the same |
ui: View, Button, Select, UserSelect, RoleSelect, ChannelSelect, MentionableSelect, Modal, TextInput, persistent views (timeout=None and custom_id, bot.add_view) |
the same |
ext.tasks.loop with before_loop, after_loop, change_interval, times of day |
the same |
Embed, File, AllowedMentions, Colour, Permissions, PermissionOverwrite, utils.get/find/format_dt/oauth_url |
the same |
Moderation: Member.ban/kick/timeout/add_roles/remove_roles/edit, Guild.unban/bans/audit_logs, TextChannel.purge, creating and editing channels, categories, roles and invites |
the same, behind the bot's scopes and the server's roles |
Rate limits, reconnects, run()'s logging set-up |
handled for you, as discord.py does |
Where it differs, and why
ILLEST is end-to-end encrypted: the server stores ciphertext and holds no keys. Most differences follow from that, and each is deliberate. The full list, with what to write instead, is in the documentation.
- A bot is a device. Its token enrols a device the first time it runs; the device key is kept under
~/.illest/bots/. Keep that folder: losing it is losing the device. - A bot reads from when it joined.
channel.history()andfetch_message()return the messages this bot holds, from when it was let into the channel's group. There is nothing older to fetch: the server cannot read it either. - Commands, presses, picks and forms travel sealed, as messages in the conversation that only the bot opens. The server never sees which command was used or with what.
ephemeral=Trueis a rendering rule. Every honest client shows the message to its one reader only; inside an encrypted group nothing stronger exists, and the library does not pretend otherwise.- Who sent it is what their device proves.
message.author_verifiedandinteraction.sender_verifiedsay whether the sender's own device vouched for the account. Authorise nothing on a sender that is not verified. - Permissions have discord's names and ILLEST's bits.
illest.Permissions(ban_members=True).valueis the number to use in an ILLEST invite link; a number from a discord permissions calculator means something else here. - Intents filter, scopes grant. An intent decides which events reach your handlers; the bot's scopes (set by its owner under
Developers → Bot) decide what it may read and do.
Intents.default()includes members and message content. - No voice. A bot cannot join a call: calls are encrypted from each person's device.
VoiceChannel.connect()raises. - No sharding. One connection serves any number of servers;
AutoShardedBotisBot. tree.sync()takes effect at once, global commands included.
Examples
examples/ holds runnable bots: basic (events and prefix commands), slash commands
(groups, choices, autocomplete, context menus), views (buttons, select menus, a persistent view, a modal),
moderation and tasks and cogs. Each reads its token from ILLEST_TOKEN.
Documentation
The API reference is built with MkDocs: pip install "illest.py[docs]", then mkdocs serve in this folder.
Licence
MIT. illest-crypto, the compiled encryption engine it installs, is free to use and redistribute unmodified; see its own licence.
Metadata
Release files for illest.py 2.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| illest_py-2.1.0.tar.gz | 227.2 kB | Without provenance | Details for illest_py-2.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| illest_py-2.1.0-py3-none-any.whl | Python 3 | none | any | Details for illest_py-2.1.0-py3-none-any.whl |
Total release size: 429.2 kB
Release files / illest_py-2.1.0.tar.gz
| Download URL | illest_py-2.1.0.tar.gz |
|---|---|
| Size | 227.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
304ce5907886f52ec42c1846fa30412b4a2f7b640d3b004a5a56f3a010dbd3b0
|
|
BLAKE2b-256 checksum How to use checksums |
9e4a7bdc5dd85ef461ded8dd9fe42018dc4e60553e9797b43daf348bdfdb79d1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.3
|
Release files / illest_py-2.1.0-py3-none-any.whl
| Download URL | illest_py-2.1.0-py3-none-any.whl |
|---|---|
| Size | 202.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
19cd4b3feb3fb83a8968d8909973df3297f6a8e7c2a579e2b821289f9bdd447c
|
|
BLAKE2b-256 checksum How to use checksums |
5060cce38787205575a6364a3dacb003aa92c52080d48d290230c55f75e8abb8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.3
|
Security for illest.py 2.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.