illest 2.3.0__tar.gz → 2.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. {illest-2.3.0 → illest-2.3.2}/LICENSE +24 -24
  2. {illest-2.3.0 → illest-2.3.2}/PKG-INFO +1 -1
  3. {illest-2.3.0 → illest-2.3.2}/README.md +112 -112
  4. {illest-2.3.0 → illest-2.3.2}/illest/_limits.py +240 -240
  5. illest-2.3.2/illest/_version.py +7 -0
  6. {illest-2.3.0 → illest-2.3.2}/illest/activity.py +100 -100
  7. {illest-2.3.0 → illest-2.3.2}/illest/app_commands/__init__.py +76 -76
  8. {illest-2.3.0 → illest-2.3.2}/illest/app_commands/checks.py +161 -161
  9. {illest-2.3.0 → illest-2.3.2}/illest/app_commands/errors.py +130 -130
  10. {illest-2.3.0 → illest-2.3.2}/illest/app_commands/namespace.py +31 -31
  11. {illest-2.3.0 → illest-2.3.2}/illest/auth.py +94 -26
  12. {illest-2.3.0 → illest-2.3.2}/illest/client.py +97 -4
  13. {illest-2.3.0 → illest-2.3.2}/illest/colour.py +156 -156
  14. {illest-2.3.0 → illest-2.3.2}/illest/enums.py +249 -249
  15. {illest-2.3.0 → illest-2.3.2}/illest/errors.py +165 -165
  16. {illest-2.3.0 → illest-2.3.2}/illest/ext/commands/__init__.py +127 -127
  17. {illest-2.3.0 → illest-2.3.2}/illest/ext/commands/errors.py +343 -343
  18. {illest-2.3.0 → illest-2.3.2}/illest/ext/commands/flags.py +156 -156
  19. {illest-2.3.0 → illest-2.3.2}/illest/ext/tasks/__init__.py +391 -391
  20. {illest-2.3.0 → illest-2.3.2}/illest/file.py +59 -59
  21. {illest-2.3.0 → illest-2.3.2}/illest/gateway.py +27 -1
  22. {illest-2.3.0 → illest-2.3.2}/illest/media.py +3 -1
  23. {illest-2.3.0 → illest-2.3.2}/illest/mentions.py +41 -41
  24. {illest-2.3.0 → illest-2.3.2}/illest/mls.py +21 -0
  25. {illest-2.3.0 → illest-2.3.2}/illest/object.py +70 -70
  26. {illest-2.3.0 → illest-2.3.2}/illest/permissions.py +317 -317
  27. {illest-2.3.0 → illest-2.3.2}/illest/ratelimit.py +113 -113
  28. {illest-2.3.0 → illest-2.3.2}/illest/rpc/__init__.py +45 -45
  29. {illest-2.3.0 → illest-2.3.2}/illest/rpc/_async.py +355 -355
  30. {illest-2.3.0 → illest-2.3.2}/illest/rpc/_sync.py +164 -164
  31. {illest-2.3.0 → illest-2.3.2}/illest/rpc/_wire.py +223 -223
  32. {illest-2.3.0 → illest-2.3.2}/illest/rpc/errors.py +66 -66
  33. {illest-2.3.0 → illest-2.3.2}/illest/ui/button.py +126 -126
  34. {illest-2.3.0 → illest-2.3.2}/illest/ui/item.py +69 -69
  35. {illest-2.3.0 → illest-2.3.2}/illest/ui/view.py +249 -249
  36. {illest-2.3.0 → illest-2.3.2}/illest/utils.py +217 -217
  37. {illest-2.3.0 → illest-2.3.2}/illest.egg-info/PKG-INFO +1 -1
  38. {illest-2.3.0 → illest-2.3.2}/illest.egg-info/SOURCES.txt +2 -0
  39. illest-2.3.2/tests/test_another_bots_device.py +288 -0
  40. {illest-2.3.0 → illest-2.3.2}/tests/test_attachment.py +28 -0
  41. {illest-2.3.0 → illest-2.3.2}/tests/test_discord_shape.py +837 -837
  42. {illest-2.3.0 → illest-2.3.2}/tests/test_gateway.py +323 -273
  43. {illest-2.3.0 → illest-2.3.2}/tests/test_group_spelling.py +49 -49
  44. illest-2.3.2/tests/test_presence.py +81 -0
  45. {illest-2.3.0 → illest-2.3.2}/tests/test_reach.py +95 -95
  46. {illest-2.3.0 → illest-2.3.2}/tests/test_rpc.py +314 -314
  47. illest-2.3.0/illest/_version.py +0 -3
  48. {illest-2.3.0 → illest-2.3.2}/illest/__init__.py +0 -0
  49. {illest-2.3.0 → illest-2.3.2}/illest/abc.py +0 -0
  50. {illest-2.3.0 → illest-2.3.2}/illest/app_commands/commands.py +0 -0
  51. {illest-2.3.0 → illest-2.3.2}/illest/app_commands/tree.py +0 -0
  52. {illest-2.3.0 → illest-2.3.2}/illest/attachment.py +0 -0
  53. {illest-2.3.0 → illest-2.3.2}/illest/buttons.py +0 -0
  54. {illest-2.3.0 → illest-2.3.2}/illest/content.py +0 -0
  55. {illest-2.3.0 → illest-2.3.2}/illest/embeds.py +0 -0
  56. {illest-2.3.0 → illest-2.3.2}/illest/envelope.py +0 -0
  57. {illest-2.3.0 → illest-2.3.2}/illest/ext/__init__.py +0 -0
  58. {illest-2.3.0 → illest-2.3.2}/illest/ext/commands/bot.py +0 -0
  59. {illest-2.3.0 → illest-2.3.2}/illest/ext/commands/cog.py +0 -0
  60. {illest-2.3.0 → illest-2.3.2}/illest/ext/commands/converter.py +0 -0
  61. {illest-2.3.0 → illest-2.3.2}/illest/ext/commands/core.py +0 -0
  62. {illest-2.3.0 → illest-2.3.2}/illest/ext/commands/help.py +0 -0
  63. {illest-2.3.0 → illest-2.3.2}/illest/ext/commands/hybrid.py +0 -0
  64. {illest-2.3.0 → illest-2.3.2}/illest/intents.py +0 -0
  65. {illest-2.3.0 → illest-2.3.2}/illest/interactions.py +0 -0
  66. {illest-2.3.0 → illest-2.3.2}/illest/models.py +0 -0
  67. {illest-2.3.0 → illest-2.3.2}/illest/pins.py +0 -0
  68. {illest-2.3.0 → illest-2.3.2}/illest/py.typed +0 -0
  69. {illest-2.3.0 → illest-2.3.2}/illest/replies.py +0 -0
  70. {illest-2.3.0 → illest-2.3.2}/illest/ui/__init__.py +0 -0
  71. {illest-2.3.0 → illest-2.3.2}/illest/ui/components.py +0 -0
  72. {illest-2.3.0 → illest-2.3.2}/illest/ui/layout.py +0 -0
  73. {illest-2.3.0 → illest-2.3.2}/illest/ui/modal.py +0 -0
  74. {illest-2.3.0 → illest-2.3.2}/illest/ui/select.py +0 -0
  75. {illest-2.3.0 → illest-2.3.2}/illest.egg-info/dependency_links.txt +0 -0
  76. {illest-2.3.0 → illest-2.3.2}/illest.egg-info/requires.txt +0 -0
  77. {illest-2.3.0 → illest-2.3.2}/illest.egg-info/top_level.txt +0 -0
  78. {illest-2.3.0 → illest-2.3.2}/pyproject.toml +0 -0
  79. {illest-2.3.0 → illest-2.3.2}/setup.cfg +0 -0
  80. {illest-2.3.0 → illest-2.3.2}/tests/test_bot_handles.py +0 -0
  81. {illest-2.3.0 → illest-2.3.2}/tests/test_buttons.py +0 -0
  82. {illest-2.3.0 → illest-2.3.2}/tests/test_catch_up_by_itself.py +0 -0
  83. {illest-2.3.0 → illest-2.3.2}/tests/test_commands.py +0 -0
  84. {illest-2.3.0 → illest-2.3.2}/tests/test_commands_framework.py +0 -0
  85. {illest-2.3.0 → illest-2.3.2}/tests/test_content.py +0 -0
  86. {illest-2.3.0 → illest-2.3.2}/tests/test_envelope.py +0 -0
  87. {illest-2.3.0 → illest-2.3.2}/tests/test_events.py +0 -0
  88. {illest-2.3.0 → illest-2.3.2}/tests/test_forms.py +0 -0
  89. {illest-2.3.0 → illest-2.3.2}/tests/test_layout.py +0 -0
  90. {illest-2.3.0 → illest-2.3.2}/tests/test_limits.py +0 -0
  91. {illest-2.3.0 → illest-2.3.2}/tests/test_listed_admission.py +0 -0
  92. {illest-2.3.0 → illest-2.3.2}/tests/test_missed_messages.py +0 -0
  93. {illest-2.3.0 → illest-2.3.2}/tests/test_pins.py +0 -0
  94. {illest-2.3.0 → illest-2.3.2}/tests/test_pins_in_use.py +0 -0
  95. {illest-2.3.0 → illest-2.3.2}/tests/test_secret_files.py +0 -0
  96. {illest-2.3.0 → illest-2.3.2}/tests/test_sender.py +0 -0
@@ -1,24 +1,24 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 VERAKS
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
22
-
23
- The ILLEST name and marks are trademarks of VERAKS and are not licensed by
24
- this notice.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 VERAKS
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ The ILLEST name and marks are trademarks of VERAKS and are not licensed by
24
+ this notice.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: illest
3
- Version: 2.3.0
3
+ Version: 2.3.2
4
4
  Summary: The Python library for ILLEST: bots with commands, slash commands and buttons, end-to-end encrypted, and Rich Presence.
5
5
  Author: VERAKS
6
6
  License-Expression: MIT
@@ -1,112 +1,112 @@
1
- # illest.py
2
-
3
- The Python library for [ILLEST](https://illest.world): bots with prefix commands, slash commands, buttons, menus and forms, all
4
- end-to-end encrypted, and Rich Presence for games and tools that show what their player is doing.
5
-
6
- ```bash
7
- pip install illest
8
- ```
9
-
10
- Python 3.10 or newer. The encryption engine, `illest-crypto`, comes with it as a compiled wheel for Windows and Linux (x86-64
11
- and ARM64).
12
-
13
- ## A bot in twenty lines
14
-
15
- ```python
16
- import illest
17
- from illest import app_commands
18
- from illest.ext import commands
19
-
20
- bot = commands.Bot(command_prefix="!", intents=illest.Intents.default())
21
-
22
-
23
- @bot.event
24
- async def setup_hook():
25
- await bot.tree.sync() # registers the slash commands below
26
-
27
-
28
- @bot.event
29
- async def on_ready():
30
- print(f"signed in as {bot.user}")
31
-
32
-
33
- @bot.command()
34
- async def ping(ctx: commands.Context):
35
- await ctx.reply("pong")
36
-
37
-
38
- @bot.tree.command(description="Roll a die")
39
- @app_commands.describe(sides="How many sides it has")
40
- async def roll(interaction: illest.Interaction, sides: app_commands.Range[int, 2, 100] = 6):
41
- import random
42
- await interaction.response.send_message(f"{random.randint(1, sides)}")
43
-
44
-
45
- bot.run("illb_...")
46
- ```
47
-
48
- Make the bot and its token in ILLEST under **Settings → Developers**. Open the bot there, copy its invite link from
49
- **Installation**, and add it to a server you manage.
50
-
51
- To run against your own server instead of `chat.illest.world`, set `ILLEST_GATEWAY_URL` (for example
52
- `ws://localhost:8766/gateway`) or pass `server_url=` to the client.
53
-
54
- ## What you get
55
-
56
- - **The client:** `Client`, `commands.Bot`, `Intents`, `@bot.event`, `wait_for`, `setup_hook`.
57
- - **Prefix commands** (`ext.commands`): commands, groups, cogs, extensions, checks, cooldowns, converters, `Greedy`, `Range`,
58
- flags, the help command, and hybrid commands that are slash commands too.
59
- - **Slash commands** (`app_commands`): `CommandTree`, `@tree.command`, `Group`, `describe`, `choices`, `autocomplete`, `rename`,
60
- `Range`, `Transform`, context menus, `default_permissions`, `guild_only`, checks and cooldowns, `tree.sync(guild=...)`.
61
- - **Interactions:** `response.send_message`, `defer` (with "thinking"), `edit_message`, `send_modal`, `followup`,
62
- `original_response`.
63
- - **Components** (`ui`): `View`, `Button`, `Select`, `UserSelect`, `RoleSelect`, `ChannelSelect`, `MentionableSelect`, `Modal`,
64
- `TextInput`, and persistent views (`timeout=None` and `custom_id`, `bot.add_view`).
65
- - **Background tasks** (`ext.tasks.loop`) with `before_loop`, `after_loop`, `change_interval` and times of day.
66
- - **Messages:** `Embed`, `File`, `AllowedMentions`, `Colour`, `Permissions`, `PermissionOverwrite`,
67
- `utils.get/find/format_dt/oauth_url`.
68
- - **Moderation:** `Member.ban/kick/timeout/add_roles/remove_roles/edit`, `Guild.unban/bans/audit_logs`, `TextChannel.purge`,
69
- and creating and editing channels, categories, roles and invites, behind the bot's scopes and the server's roles.
70
- - **Rich Presence** (`illest.rpc`): `Presence` and `AsyncPresence` tell the person's friends what they are doing in your game or
71
- tool, through the ILLEST desktop app.
72
- - Rate limits, reconnects and `run()`'s logging set-up, handled for you.
73
-
74
- ## What end-to-end encryption changes
75
-
76
- 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
77
- deliberate. Moving a bot from discord.py? [The migration guide](docs/differences.md) has the full list, with what to write instead.
78
-
79
- - **A bot is a device.** Its token enrols a device the first time it runs; the device key is kept under `~/.illest/bots/`. Keep
80
- that folder: losing it is losing the device.
81
- - **A bot reads from when it joined.** `channel.history()` and `fetch_message()` return the messages this bot holds, from when it
82
- was let into the channel's group. There is nothing older to fetch: the server cannot read it either.
83
- - **Commands, presses, picks and forms travel sealed**, as messages in the conversation that only the bot opens. The server never
84
- sees which command was used or with what.
85
- - **`ephemeral=True` is a rendering rule.** Every honest client shows the message to its one reader only; inside an encrypted
86
- group nothing stronger exists, and the library does not pretend otherwise.
87
- - **Who sent it is what their device proves.** `message.author_verified` and `interaction.sender_verified` say whether the
88
- sender's own device vouched for the account. Authorise nothing on a sender that is not verified.
89
- - **Permissions are ILLEST's bits.** `illest.Permissions(ban_members=True).value` is the number to use in an ILLEST invite
90
- link; build it with `illest.Permissions` or the bot's Installation page rather than copying a number from elsewhere.
91
- - **Intents filter, scopes grant.** An intent decides which events reach your handlers; the bot's scopes (set by its owner under
92
- Developers → Bot) decide what it may read and do. `Intents.default()` includes members and message content.
93
- - **No voice.** A bot cannot join a call: calls are encrypted from each person's device. `VoiceChannel.connect()` raises.
94
- - **No sharding.** One connection serves any number of servers; `AutoShardedBot` is `Bot`.
95
- - **`tree.sync()` takes effect at once**, global commands included.
96
-
97
- ## Examples
98
-
99
- `examples/` holds runnable bots: [basic](examples/basic_bot.py) (events and prefix commands), [slash commands](examples/slash_commands.py)
100
- (groups, choices, autocomplete, context menus), [views](examples/views.py) (buttons, select menus, a persistent view, a modal),
101
- [moderation](examples/moderation.py), [tasks and cogs](examples/tasks_and_cogs.py), and [a test bot](examples/test_bot.py) that
102
- touches every part once. Each reads its token from `ILLEST_TOKEN`. [Rich Presence](examples/rich_presence.py) reads an application
103
- id from `ILLEST_APP_ID` instead.
104
-
105
- ## Documentation
106
-
107
- The documentation is at [developer.illest.world](https://developer.illest.world/docs/introduction). To build it here with
108
- MkDocs: `pip install "illest[docs]"`, then `mkdocs serve` in this folder.
109
-
110
- ## Licence
111
-
112
- MIT. `illest-crypto`, the compiled encryption engine it installs, is free to use and redistribute unmodified; see its own licence.
1
+ # illest.py
2
+
3
+ The Python library for [ILLEST](https://illest.world): bots with prefix commands, slash commands, buttons, menus and forms, all
4
+ end-to-end encrypted, and Rich Presence for games and tools that show what their player is doing.
5
+
6
+ ```bash
7
+ pip install illest
8
+ ```
9
+
10
+ Python 3.10 or newer. The encryption engine, `illest-crypto`, comes with it as a compiled wheel for Windows and Linux (x86-64
11
+ and ARM64).
12
+
13
+ ## A bot in twenty lines
14
+
15
+ ```python
16
+ import illest
17
+ from illest import app_commands
18
+ from illest.ext import commands
19
+
20
+ bot = commands.Bot(command_prefix="!", intents=illest.Intents.default())
21
+
22
+
23
+ @bot.event
24
+ async def setup_hook():
25
+ await bot.tree.sync() # registers the slash commands below
26
+
27
+
28
+ @bot.event
29
+ async def on_ready():
30
+ print(f"signed in as {bot.user}")
31
+
32
+
33
+ @bot.command()
34
+ async def ping(ctx: commands.Context):
35
+ await ctx.reply("pong")
36
+
37
+
38
+ @bot.tree.command(description="Roll a die")
39
+ @app_commands.describe(sides="How many sides it has")
40
+ async def roll(interaction: illest.Interaction, sides: app_commands.Range[int, 2, 100] = 6):
41
+ import random
42
+ await interaction.response.send_message(f"{random.randint(1, sides)}")
43
+
44
+
45
+ bot.run("illb_...")
46
+ ```
47
+
48
+ Make the bot and its token in ILLEST under **Settings → Developers**. Open the bot there, copy its invite link from
49
+ **Installation**, and add it to a server you manage.
50
+
51
+ To run against your own server instead of `chat.illest.world`, set `ILLEST_GATEWAY_URL` (for example
52
+ `ws://localhost:8766/gateway`) or pass `server_url=` to the client.
53
+
54
+ ## What you get
55
+
56
+ - **The client:** `Client`, `commands.Bot`, `Intents`, `@bot.event`, `wait_for`, `setup_hook`.
57
+ - **Prefix commands** (`ext.commands`): commands, groups, cogs, extensions, checks, cooldowns, converters, `Greedy`, `Range`,
58
+ flags, the help command, and hybrid commands that are slash commands too.
59
+ - **Slash commands** (`app_commands`): `CommandTree`, `@tree.command`, `Group`, `describe`, `choices`, `autocomplete`, `rename`,
60
+ `Range`, `Transform`, context menus, `default_permissions`, `guild_only`, checks and cooldowns, `tree.sync(guild=...)`.
61
+ - **Interactions:** `response.send_message`, `defer` (with "thinking"), `edit_message`, `send_modal`, `followup`,
62
+ `original_response`.
63
+ - **Components** (`ui`): `View`, `Button`, `Select`, `UserSelect`, `RoleSelect`, `ChannelSelect`, `MentionableSelect`, `Modal`,
64
+ `TextInput`, and persistent views (`timeout=None` and `custom_id`, `bot.add_view`).
65
+ - **Background tasks** (`ext.tasks.loop`) with `before_loop`, `after_loop`, `change_interval` and times of day.
66
+ - **Messages:** `Embed`, `File`, `AllowedMentions`, `Colour`, `Permissions`, `PermissionOverwrite`,
67
+ `utils.get/find/format_dt/oauth_url`.
68
+ - **Moderation:** `Member.ban/kick/timeout/add_roles/remove_roles/edit`, `Guild.unban/bans/audit_logs`, `TextChannel.purge`,
69
+ and creating and editing channels, categories, roles and invites, behind the bot's scopes and the server's roles.
70
+ - **Rich Presence** (`illest.rpc`): `Presence` and `AsyncPresence` tell the person's friends what they are doing in your game or
71
+ tool, through the ILLEST desktop app.
72
+ - Rate limits, reconnects and `run()`'s logging set-up, handled for you.
73
+
74
+ ## What end-to-end encryption changes
75
+
76
+ 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
77
+ deliberate. Moving a bot from discord.py? [The migration guide](docs/differences.md) has the full list, with what to write instead.
78
+
79
+ - **A bot is a device.** Its token enrols a device the first time it runs; the device key is kept under `~/.illest/bots/`. Keep
80
+ that folder: losing it is losing the device.
81
+ - **A bot reads from when it joined.** `channel.history()` and `fetch_message()` return the messages this bot holds, from when it
82
+ was let into the channel's group. There is nothing older to fetch: the server cannot read it either.
83
+ - **Commands, presses, picks and forms travel sealed**, as messages in the conversation that only the bot opens. The server never
84
+ sees which command was used or with what.
85
+ - **`ephemeral=True` is a rendering rule.** Every honest client shows the message to its one reader only; inside an encrypted
86
+ group nothing stronger exists, and the library does not pretend otherwise.
87
+ - **Who sent it is what their device proves.** `message.author_verified` and `interaction.sender_verified` say whether the
88
+ sender's own device vouched for the account. Authorise nothing on a sender that is not verified.
89
+ - **Permissions are ILLEST's bits.** `illest.Permissions(ban_members=True).value` is the number to use in an ILLEST invite
90
+ link; build it with `illest.Permissions` or the bot's Installation page rather than copying a number from elsewhere.
91
+ - **Intents filter, scopes grant.** An intent decides which events reach your handlers; the bot's scopes (set by its owner under
92
+ Developers → Bot) decide what it may read and do. `Intents.default()` includes members and message content.
93
+ - **No voice.** A bot cannot join a call: calls are encrypted from each person's device. `VoiceChannel.connect()` raises.
94
+ - **No sharding.** One connection serves any number of servers; `AutoShardedBot` is `Bot`.
95
+ - **`tree.sync()` takes effect at once**, global commands included.
96
+
97
+ ## Examples
98
+
99
+ `examples/` holds runnable bots: [basic](examples/basic_bot.py) (events and prefix commands), [slash commands](examples/slash_commands.py)
100
+ (groups, choices, autocomplete, context menus), [views](examples/views.py) (buttons, select menus, a persistent view, a modal),
101
+ [moderation](examples/moderation.py), [tasks and cogs](examples/tasks_and_cogs.py), and [a test bot](examples/test_bot.py) that
102
+ touches every part once. Each reads its token from `ILLEST_TOKEN`. [Rich Presence](examples/rich_presence.py) reads an application
103
+ id from `ILLEST_APP_ID` instead.
104
+
105
+ ## Documentation
106
+
107
+ The documentation is at [developer.illest.world](https://developer.illest.world/docs/introduction). To build it here with
108
+ MkDocs: `pip install "illest[docs]"`, then `mkdocs serve` in this folder.
109
+
110
+ ## Licence
111
+
112
+ MIT. `illest-crypto`, the compiled encryption engine it installs, is free to use and redistribute unmodified; see its own licence.