Security
Restraint where it is invisible: checks and gates.
Owner checks on immutable ids, explicit confirmation for destructive actions, a scoped archive, an output filter and no shell.
-
The owner is an id, not a name
Owner checks rely on immutable Discord ids, never on display names or nicknames that can be imitated.
-
Explicit confirmation for destructive actions
BAN, KICK, PURGE and DELETE_CHANNEL are queued, and each requires the person who requested it to type “confirm” within 60 seconds. A cancel word clears it; anything else leaves it pending until the timeout, and permission is re-checked on confirmation.
-
Archive scope
Archive recall is limited to channels the asker can read, and direct messages are excluded from the server archive.
-
Direct messages are disclosed
Direct messages are logged for the owner — sender name, text, attachment links and Angel’s reply in the dm_logs table — and forwarded to the owner’s DMs. Members should be told before messaging the bot.
-
Output filter
It removes @everyone, token-like strings and leftover tags, and corrects a reply that claims an action still in the queue was executed.
-
No shell on the runtime paths
The static gate rejects create_subprocess_shell, os.system, os.popen and shell=True on runtime paths.
Reporting a vulnerability
Do not open a public issue. Use GitHub’s private vulnerability reporting from the Security tab. If the button is unavailable, open an issue that says only that you have a security report, with no details.