illest.py
The Python library for ILLEST: bots with prefix commands, slash commands, buttons, menus and forms, all end-to-end encrypted, and Rich Presence for games and tools that show what their player is doing.
pip install illest
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
- The client:
Client,commands.Bot,Intents,@bot.event,wait_for,setup_hook. - Prefix commands (
ext.commands): commands, groups, cogs, extensions, checks, cooldowns, converters,Greedy,Range, flags, the help command, and hybrid commands that are slash commands too. - Slash commands (
app_commands):CommandTree,@tree.command,Group,describe,choices,autocomplete,rename,Range,Transform, context menus,default_permissions,guild_only, checks and cooldowns,tree.sync(guild=...). - Interactions:
response.send_message,defer(with "thinking"),edit_message,send_modal,followup,original_response. - Components (
ui):View,Button,Select,UserSelect,RoleSelect,ChannelSelect,MentionableSelect,Modal,TextInput, and persistent views (timeout=Noneandcustom_id,bot.add_view). - Background tasks (
ext.tasks.loop) withbefore_loop,after_loop,change_intervaland times of day. - Messages:
Embed,File,AllowedMentions,Colour,Permissions,PermissionOverwrite,utils.get/find/format_dt/oauth_url. - Moderation:
Member.ban/kick/timeout/add_roles/remove_roles/edit,Guild.unban/bans/audit_logs,TextChannel.purge, and creating and editing channels, categories, roles and invites, behind the bot's scopes and the server's roles. - Rich Presence (
illest.rpc):PresenceandAsyncPresencetell the person's friends what they are doing in your game or tool, through the ILLEST desktop app. - Rate limits, reconnects and
run()'s logging set-up, handled for you.
What end-to-end encryption changes
ILLEST is end-to-end encrypted: the server stores ciphertext and holds no keys. A bot is built for that, and each of these is deliberate. Moving a bot from discord.py? The migration guide has the full list, with what to write instead.
- 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 are ILLEST's bits.
illest.Permissions(ban_members=True).valueis the number to use in an ILLEST invite link; build it withillest.Permissionsor the bot's Installation page rather than copying a number from elsewhere. - 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, tasks and cogs, and a test bot that
touches every part once. Each reads its token from ILLEST_TOKEN. Rich Presence reads an application
id from ILLEST_APP_ID instead.
Documentation
The documentation is at developer.illest.world. To build it here with
MkDocs: pip install "illest[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 2.3.1
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-2.3.1.tar.gz | 262.6 kB | Without provenance | Details for illest-2.3.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| illest-2.3.1-py3-none-any.whl | Python 3 | none | any | Details for illest-2.3.1-py3-none-any.whl |
Total release size: 492.1 kB
Release files / illest-2.3.1.tar.gz
| Download URL | illest-2.3.1.tar.gz |
|---|---|
| Size | 262.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
904af7651e1f6bf05e1fe9252c298b33685b1bd7548eee8945869b8f19611f54
|
|
BLAKE2b-256 checksum How to use checksums |
c9f601c831d936fea2158e633f1709c300cc3a27e683fe4705af6c172908cf8d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.3
|
Release files / illest-2.3.1-py3-none-any.whl
| Download URL | illest-2.3.1-py3-none-any.whl |
|---|---|
| Size | 229.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2b8512d912897b0896eb7613552c709ee66b874826c608c895d4efb1ecc3c95e
|
|
BLAKE2b-256 checksum How to use checksums |
a7bcd669e52eff7f0ae2e89e6a688707baedd8af0157c09ff6973a64121db270
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.3
|
Security for illest 2.3.1
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.