Files
jackboxpartypack-gamepicker/docs/external-downstream-stickerwalls.md

101 lines
3.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Sticker Wall Images — Integration Guide
The vote-app renders per-session sticker walls as 1920×1080 PNG images with transparent backgrounds. These can be loaded directly as `<img>` sources to display a session's sticker wall.
## Endpoints
### Retrieve Sticker Wall Image
```
GET /stickerwalls/{sessionID}.png
```
**Authentication:** None (public endpoint)
**Response:**
- `200 OK` — image/png body, `Cache-Control: public, max-age=3600`
- `404 Not Found` — no render has been performed for this session yet
**Usage:** Load directly as an image source:
```html
<img src="https://vote-app.example.com/stickerwalls/42.png" />
```
### Trigger Render
```
POST /api/stickerwalls/{sessionID}/render
```
**Authentication:** Required — `X-API-Key` header with the upstream API key.
**Response:**
- `200 OK` — image/png body with the rendered sticker wall
- `403 Forbidden` — missing or invalid API key
- `404 Not Found` — session has no placed stickers
**Response Headers:**
- `X-Sticker-Wall-Rendered: true` — a fresh render was performed
- `X-Sticker-Wall-Rendered: false` — served from cache (no new stickers since last render)
## Behavior
### Active Sessions
During an active session, stickers are placed by voters and stored in the database. The sticker wall image is **not** automatically re-rendered on each sticker purchase (to avoid thrashing).
To get a fresh image during an active session:
1. Call `POST /api/stickerwalls/{sessionID}/render`
2. If new stickers were placed since the last render, a fresh image is generated
3. The response contains the image bytes directly
### Session End
When a session ends, the vote-app automatically renders the final sticker wall image. After this point:
- The image is **immutable** — it will never be re-rendered
- `GET /stickerwalls/{sessionID}.png` returns the final image directly
- `POST /api/stickerwalls/{sessionID}/render` returns the cached final image (with `X-Sticker-Wall-Rendered: false`)
### Historical Sessions
Sessions that existed before this feature was deployed will be rendered on first request (via the render endpoint). Once rendered, they are cached and served normally.
## Suggested Integration
### Post-Session Retrieval (most common)
After a session ends, load the sticker wall for display or archival:
```javascript
const sessionId = 42;
const img = new Image();
img.src = `https://vote-app.example.com/stickerwalls/${sessionId}.png`;
img.onload = () => { /* display it */ };
img.onerror = () => { /* no sticker wall for this session */ };
```
### Active Session Preview
To show a "live preview" of the current sticker wall during a session:
```javascript
async function refreshStickerWall(sessionId) {
const res = await fetch(`/api/stickerwalls/${sessionId}/render`, {
method: 'POST',
headers: { 'X-API-Key': API_KEY }
});
if (res.ok) {
const blob = await res.blob();
const url = URL.createObjectURL(blob);
document.getElementById('sticker-wall-preview').src = url;
}
}
```
## Image Format
- **Dimensions:** 1920×1080 pixels
- **Format:** PNG with alpha transparency
- **Background:** Fully transparent — overlay on any background
- **Sticker rendering:** Positioned, scaled, and rotated to match the live display