(feat) Discord build share
This commit is contained in:
+27
-4
@@ -1920,10 +1920,33 @@ selector:
|
||||
- `PUBLIC` is accessible by direct link and included in the public archive.
|
||||
|
||||
Keep visibility adjacent to the account-save action and explain its selected
|
||||
state in plain language. Show a share-page action only after a non-private build
|
||||
has been saved. Public and unlisted build pages are read-only tactical
|
||||
summaries; owner editing returns to the builder. On narrow layouts, persistence
|
||||
controls and shared-loadout columns stack vertically.
|
||||
state in plain language. Show Build Uplink after an Agent saves a Build. Public
|
||||
and unlisted Builds expose its active controls; private Builds show the locked
|
||||
state. Public and unlisted Build pages are read-only tactical summaries; owner
|
||||
editing returns to the builder.
|
||||
|
||||
Build Uplink uses a compact tactical control surface. Use one bordered dark
|
||||
panel with a raised telemetry header, a textual `PUBLIC LINK READY` or
|
||||
`UNLISTED LINK READY` state, and a small orange signal marker. The primary
|
||||
`SHARE BUILD` action opens the native Web Share sheet when the browser supports
|
||||
it. Keep `COPY LINK` visible as a separate explicit action for every eligible
|
||||
Build. When Web Share is unavailable, promote Copy Link to the primary action
|
||||
instead of presenting a control that cannot run. Supporting copy may state that
|
||||
Discord renders the Build preview after an Agent posts the link. It must not
|
||||
imply that SHD.build posts to Discord or operates a bot.
|
||||
|
||||
Private and unsaved Builds use the locked Uplink state. Show `PRIVATE BUILD` or
|
||||
`UNSAVED BUILD`, `PUBLIC LINK UNAVAILABLE`, and a short instruction to change
|
||||
visibility or save. Render no active Share or Copy Link control in that state.
|
||||
Do not expose a crawler-preview action or suggest that owner access makes a
|
||||
private Build shareable.
|
||||
|
||||
Uplink actions retain textual pending, success, cancellation, unsupported, and
|
||||
failure feedback. They use at least 44-pixel targets, orange focus-visible
|
||||
treatment, pressed feedback, and disabled duplicate-action protection. Stack
|
||||
Share above Copy Link at phone widths and remove pressed motion under
|
||||
`prefers-reduced-motion`. On narrow layouts, persistence controls and
|
||||
shared-loadout columns also stack vertically.
|
||||
|
||||
### Tiered compatibility editors
|
||||
|
||||
|
||||
@@ -187,6 +187,40 @@ boundary. An owned Build page links to `/guides/new?build=<id>`, where the
|
||||
server verifies ownership and initializes a removable Build block in a new
|
||||
private Guide.
|
||||
|
||||
### Discord-compatible Build sharing experiment
|
||||
|
||||
Persisted public and unlisted Builds expose absolute Open Graph metadata for
|
||||
their canonical `/builds/[slug]` URL. Their `og:image` and Twitter card metadata
|
||||
reference the same-origin 1200 × 630 PNG at `/builds/[slug]/preview.png` so
|
||||
Discord and other link unfurlers can render a Build summary. Private Builds set
|
||||
`noindex,nofollow`, expose no crawler image, and provide no usable sharing
|
||||
control.
|
||||
|
||||
The preview endpoint derives its image from canonical Build facts and the
|
||||
current known-stat summary in the shared Build projection. It includes the Build
|
||||
title, author, visibility, direct URL, equipped weapon names, core totals, and
|
||||
up to three supporting Attributes. The renderer performs no external fetches. It
|
||||
normalizes and bounds every text field by grapheme count, escapes text before
|
||||
inserting it into XML, builds a text-only SVG, and rasterizes that SVG to PNG
|
||||
with Sharp. Production installs DejaVu Sans from the Debian package and the
|
||||
renderer names that fixed family explicitly.
|
||||
|
||||
The endpoint hashes a versioned serialization of the image input for its bounded
|
||||
in-process render cache and derives the HTTP ETag from the resulting PNG bytes.
|
||||
A bounded request queue limits concurrent database projections and Sharp work.
|
||||
Responses require cache revalidation so a visibility change to Private blocks
|
||||
the next request instead of leaving a stale response window. Matching
|
||||
conditional requests receive `304 Not Modified`. Private, missing, and
|
||||
inaccessible Builds receive no preview. Unlisted images send the
|
||||
`X-Robots-Tag: noindex` response header.
|
||||
|
||||
For eligible Builds, the Build Uplink invokes the native Web Share API as the
|
||||
primary action when the browser supports it. An explicit Copy Link action
|
||||
remains available for every public or unlisted persisted Build. This experiment
|
||||
does not install a Discord bot, post to Discord, extend Discord OAuth scopes, or
|
||||
store Discord tokens or webhooks. Discord receives only a link that an Agent
|
||||
chooses to share and may fetch the public metadata and same-origin preview.
|
||||
|
||||
## Public data corrections and discussion
|
||||
|
||||
Every public database card links to its canonical ISAC record with an exact
|
||||
|
||||
Reference in New Issue
Block a user