Presence API
Usa la API de Presence de Nowly para actualizar Discord Rich Presence desde una integración web.
Crear una presencia
Presence es un global inyectado por el runtime de Nowly - no necesitas importarlo.
Toda presencia empieza con una instancia de Presence:
const presence = new Presence()Evento UpdateData
Usa UpdateData para actualizar la actividad:
presence.on("UpdateData", async () => {
await presence.setActivity({
details: "Viendo un video",
})
})setActivity
setActivity envía la actividad actual de Discord. Los campos comunes incluyen:
| Campo | Tipo | Descripción | Predeterminado |
|---|---|---|---|
detailsUrl | string | Enlace HTTPS público opcional para details (SDK 1.7.0+). | - |
stateUrl | string | Enlace HTTPS público opcional para state (SDK 1.7.0+). | - |
name | string | Nombre de actividad opcional. Por defecto, usa el nombre de la presencia. | - |
statusDisplayType | 0 | 1 | 2 | Campo del estado compacto de Discord: 0 = name (predeterminado), 1 = state, 2 = details. | - |
details | string | Línea de actividad principal mostrada en Discord. | - |
state | string | Línea de actividad secundaria mostrada debajo de details. | - |
startTimestamp | number | Marca de tiempo Unix para el progreso de actividad transcurrido. | - |
endTimestamp | number | Marca de tiempo Unix para el progreso de actividad restante. | - |
largeImageKey | string | Clave de imagen principal, normalmente Assets.Logo o Assets.Thumbnail (globales que proporciona el runtime). | - |
largeImageText | string | Descripción emergente de la imagen grande. | - |
smallImageKey | string | Clave de imagen pequeña opcional. | - |
smallImageText | string | Descripción emergente de la imagen pequeña. | - |
type | number | Tipo de actividad de Discord desde PresenceType. | - |
buttons | array | Botones de actividad de Discord opcionales. | - |
Discord rechaza los payloads de Rich Presence cuando largeImageText o smallImageText contiene menos de dos caracteres. Nowly limpia estos tooltips opcionales y los omite cuando el resultado tiene menos de dos caracteres; la imagen sigue disponible.
detailsUrl / stateUrl
El SDK 1.7.0+ añade los campos de texto opcionales detailsUrl y stateUrl para enlazar sus líneas correspondientes, independientemente de los botones. La extensión y el host nativo deben admitirlos; las versiones anteriores los ignoran. El nombre de la actividad no cambia.
Usa URL HTTPS públicas verificadas, sin credenciales y de hasta 2048 caracteres. Se omiten los enlaces sin texto correspondiente o con URL no válidas. Conserva los identificadores de contenido, como el parámetro v de YouTube, pero nunca compartas tokens de acceso, conversaciones privadas, enlaces secretos ni información oculta por los ajustes de privacidad. Omite los destinos desconocidos.
await presence.setActivity({
details: "Título del vídeo",
detailsUrl: "https://www.youtube.com/watch?v=VIDEO_ID",
state: "Nombre del canal",
stateUrl: "https://www.youtube.com/@channel",
})statusDisplayType
statusDisplayType elige el texto del estado compacto de Discord. No cambia el nombre, los detalles ni el estado de la tarjeta de actividad.
0(predeterminado):name1:state2:details
Por ejemplo, mostrar el título del vídeo en el estado compacto y conservar el nombre de la actividad y el canal en la tarjeta:
await presence.setActivity({
name: "Servicio de vídeo",
details: "Título del vídeo",
state: "Nombre del canal",
statusDisplayType: 2,
})Usa una versión del SDK que incluya este campo y actualiza la extensión Nowly y el host nativo. Las versiones anteriores del runtime ignoran el campo y mantienen el estado predeterminado.
clearActivity
Llama a clearActivity cuando no haya nada que mostrar:
presence.clearActivity()PresenceType
PresenceType es una exportación con nombre de @nowly/sdk:
import { PresenceType } from "@nowly/sdk"Se corresponde con los tipos de actividad de Discord: Playing, Streaming, Listening, Watching y Competing.
getSetting
Lee un ajuste tipado después de Presence.Settings. El valor es el ajuste guardado del usuario, o el valor por defecto de la definición:
const showButtons = await presence.getSetting<boolean>("showButtons")UpdateData también recibe ctx.settings con el mismo mapa. Ambos se actualizan cuando el usuario cambia ajustes en el panel.
Registro
Usa presence.info y presence.error para mensajes de depuración durante el desarrollo.