Metadata-Version: 2.5
Name: render-lab-tasks-discord
Version: 0.1.0
Summary: discord tasks for Render Workflows
Project-URL: Repository, https://github.com/render-lab/render-tasks-python
License-Expression: MIT
License-File: LICENSE
Requires-Python: >=3.12
Requires-Dist: httpx<0.29,>=0.28
Requires-Dist: render-lab-tasks-core<0.2,>=0.1.0
Requires-Dist: render==1.0.1
Description-Content-Type: text/markdown

# render-lab-tasks-discord

Python port of all 8 registered tasks in the pinned TypeScript pack at
`45f9c2d44bd28e01ae9813e0d2ff56ee6c533816`. Python 3.12+.

From the repository, install this pack and its supporting core together:

```sh
pip install render-lab-tasks-discord==0.1.0
```

Import task definitions from `render_lab_tasks_discord.tasks`. Combine its `app` with
other pack apps using `Workflows.from_workflows(...)` and call tasks with
`await ctx.run(task, input)`. Package roots do not register tasks. JSON fields
retain the TS spelling; Python functions use snake_case.

## Tasks

| Registered name | Python export (also exposes `_impl`) |
| --- | --- |
| `discord.addReaction` | `add_reaction` |
| `discord.awaitButton` | `await_button` |
| `discord.awaitReaction` | `await_reaction` |
| `discord.createThread` | `create_thread` |
| `discord.createWebhookMessage` | `create_webhook_message` |
| `discord.editMessage` | `edit_message` |
| `discord.listMessages` | `list_messages` |
| `discord.postMessage` | `post_message` |

## Dependencies and retries

Raw implementations accept context first and keyword-only `deps`. The `.client`
module exports typed `Port`, `Deps`, and `Client` classes (also vendor-named aliases).
Inject a fake port, or pass a caller-owned `httpx.AsyncClient` to `Client` for custom
transport/configuration. Default dependencies close their HTTP clients after the
operation. Credentials resolve at first use. HTTP and SDK retries are disabled;
`retry.py` owns durable retry settings. DTO types live in `.types`.

## Environment

| Variable | Contract |
| --- | --- |
| `DISCORD_BOT_TOKEN` | Required for bot REST tasks. Webhook URLs carry their own credentials; awaitButton uses an injected interaction store. |

## Verification and limitations

awaitButton requires Deps(interactions=...) with an async find_click(message_id, custom_id) implementation. Discord REST cannot recover past button interactions. The default wrapper fails clearly until re-registered with an interaction store. Button/reaction waits check once per durable attempt, every 10 seconds for 360 retries. Empty components clear components. Webhook calls never carry the bot token.

Shared JSON fixtures compare the Python task output with the actual pinned TS
implementation. REST fixtures also compare HTTP requests; HubSpot and Linear
fixtures compare source SDK arguments with HTTP payloads/GraphQL variables.
No live vendor calls were made for this batch. Registered-task parity does not
claim live readiness or all supporting TS exports. See the root verification
tracker and docs/porting-batches.md. Licensed under MIT.
