Skip to main content

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() and fetch_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=True is 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_verified and interaction.sender_verified say 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).value is 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; AutoShardedBot is Bot.
  • 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)

Source distribution for illest.py 2.1.0
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)

Table of built distributions (wheels) for illest.py 2.1.0
File Interpreter ABI Platform Actions
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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page