Pular para o conteúdo principal

Módulo de eventos de RTM

El Módulo de Eventos de RTM proporciona funcionalidad para suscribirse y manejar eventos en tiempo real en el SDK de Gamanza Engage Web Client. Permite a los desarrolladores suscribirse a varios eventos, darse de baja de eventos y emitir datos a la conexión WebSocket.

Accediendo al módulo

El Módulo de Eventos de RTM se puede acceder a través de la instancia del SDK de Gamanza Engage:

const Events = sdk.Events;

Métodos públicos

suscribirse

Se suscribe para recibir eventos en tiempo real en función de la API de comunicación en tiempo real proporcionada por Gamanza Engage.

Firma:

suscribirse(evento, devolución de llamada, opciones)

Definición de tipo:

function suscribirse<T extends keyof EventTypeMap>(
evento: T,
devolución de llamada: SDKEventListener<T>,
opciones?: SubscriptionOptions
): string;

Parámetros:

NombreTipoDescripción
eventokeyof EventTypeMapEl nombre del evento al que suscribirse
devolución de llamadaSDKEventListener<T>La función de devolución de llamada que se llamará cuando se active el evento
opcionesSubscriptionOptions (opcional)Opciones adicionales para la suscripción

Devuelve:

TipoDescripción
stringUn ID de suscripción único que se puede usar para darse de baja del evento

Ejemplo:

// Suscribirse a eventos de subida de XP
const idDeSuscripción = rtmEvents.suscribirse('ranks:on:xpUp', (data, rawEvent) => {
console.log('El XP del jugador aumentó:', data.xpBalance);
console.log('Evento sin procesar:', rawEvent);
});

// Suscribirse con opciones
const idDeSuscripciónConOpciones = rtmEvents.suscribirse('ranks:on:levelUp',
(data, rawEvent) => {
console.log('El jugador subió de nivel a:', data.level.levelNumber);
},
{
once: true, // Solo activar una vez
timeout: 60000, // Tiempo de espera de 60 segundos
filter: (data) => data.level.levelNumber > 5 // Solo activar para niveles superiores a 5
}
);

anular suscripción

Elimina una suscripción individual por su identificador.

Firma:

anular suscripción(idDeSuscripción)

Definición de tipo:

function anular suscripción(idDeSuscripción: string): boolean;

Parámetros:

NombreTipoDescripción
idDeSuscripciónstringEl ID de suscripción único devuelto por el método de suscribir

Devuelve:

TipoDescripción
booleantrue si se eliminó correctamente la suscripción, false de lo contrario

Ejemplo:

// Cancelar la suscripción a un evento
const subscriptionId = rtmEvents.subscribe('ranks:on:xpUp', callback);
const unsubscribed = rtmEvents.unsubscribe(subscriptionId);

if (unsubscribed) {
console.log('Se canceló la suscripción al evento con éxito');
} else {
console.log('No se pudo cancelar la suscripción o no se encontró la suscripción');
}

unsubscribeFromEvent

Elimina todas las suscripciones activas para un evento específico.

Firma:

unsubscribeFromEvent(event)

Definición de tipo:

function unsubscribeFromEvent<T extends keyof EventTypeMap>(event: T): number;

Parámetros:

NombreTipoDescripción
eventkeyof EventTypeMapEl nombre del evento del que se va a cancelar la suscripción

Devuelve:

TipoDescripción
numberEl número de suscripciones que se eliminaron

Ejemplo:

// Cancelar todas las suscripciones a eventos de aumento de XP
const removedCount = rtmEvents.unsubscribeFromEvent('ranks:on:xpUp');
console.log(`Se eliminaron ${removedCount} suscripciones`);

getEventsStats

Devuelve estadísticas sobre las suscripciones a eventos actuales.

Firma:

getEventsStats()

Definición de tipo:

function getEventsStats(): Record<string, any>;

Parámetros:

Ninguno

Devuelve:

TipoDescripción
Record<string, any>Un objeto que contiene estadísticas sobre las suscripciones a eventos actuales

Ejemplo:

// Obtener estadísticas de suscripción
const stats = rtmEvents.getEventsStats();
console.log('Suscripciones actuales:', stats);

emitToWebSocket

Envía datos utilizando el Servicio de mensajería Gamanza Engage (WebSockets).

Firma:

emitToWebSocket(event, data)

Definición de tipo:

function emitToWebSocket<T extends keyof EmitterTypeMap>(event: T, data: EmitterTypeMap[T]): void;

Parámetros:

NombreTipoDescripción
eventkeyof EmitterTypeMapEl nombre del evento a emitir
dataEmitterTypeMap[T]Los datos a enviar con el evento

Retorna:

TipoDescripción
voidEste método no devuelve ningún valor

Ejemplo:

// Enviar un mensaje de reconocimiento
rtmEvents.emitToWebSocket('send:ack', { messageId: 'message-123' });

// Enviar un evento de seguimiento de análisis
rtmEvents.emitToWebSocket('send:analytics:event', {
eventName: 'button_click',
properties: {
buttonId: 'login-button',
timestamp: Date.now()
}
});

Eventos

El Módulo de Eventos RTM proporciona acceso a varios eventos en tiempo real a los que se puede suscribir. Estos eventos se agrupan en diferentes categorías en función de su funcionalidad.

Constantes de eventos

Para un mejor mantenimiento y para evitar errores tipográficos, se recomienda utilizar la constante exportada EVENTS. Estas constantes se organizan por espacio de nombres, coincidiendo con las categorías de las tablas a continuación.

Ejemplo de uso:

import { EVENTS } from '@gamanza/engage-web-client-sdk';

// Suscribirse utilizando la constante
sdk.Events.subscribe(EVENTS.RANKS.ON_XP_UP, (data) => {
console.log('XP actualizado:', data.xpBalance);
});

// O utilizando la constante de espacio de nombres para eventos de jugador
sdk.Events.subscribe(EVENTS.PLAYER.ON_GAMIFICATION_OPT_IN, (data) => {
console.log('El jugador se ha suscrito');
});

Eventos del sistema

ConstanteNombre del eventoDescripciónTipoTipo de garantíaPropiedades
SYSTEM.ON_ERRORon:errorEventos de error del sistemaDirectoFIRE_FORGETpropiedades de error adicionales

Estructura de datos del evento de error

interface ErrorEventData extends BaseEventData {
[key: string]: unknown; // Propiedades de error adicionales
}

Eventos de rango

ConstanteNombre del eventoDescripciónTipoTipo de garantíaPropiedades
RANKS.ON_XP_UPranks:on:xpUpEventos de aumento de XPDirectoFIRE_FORGETplayerId: string, level: Level, nextLevel?: Level, nextRank?: Rank, pointsUntilNextLevel: number, pointsUntilNextRank: number, rank: Rank, xpBalance: number, rewardsGroupId: string
RANKS.ON_LEVEL_UPranks:on:levelUpEventos de subida de nivelDirectoFIRE_FORGETplayerId: string, level: Level, nextLevel?: Level, nextRank?: Rank, pointsUntilNextLevel: number, pointsUntilNextRank: number, rank: Rank, xpBalance: number, claimReward: true, rewards: LoyaltyRewards[], rewardsGroupId: string
RANKS.ON_RANK_UPranks:on:rankUpEventos de ascenso de rangoDirectoFIRE_FORGETplayerId: string, level: Level, nextLevel?: Level, nextRank?: Rank, pointsUntilNextLevel: number, pointsUntilNextRank: number, rank: Rank, xpBalance: number, claimReward: boolean, rewards: Reward[], rewardsGroupId: string
RANKS.ON_MAX_CAP_REACHEDcapsMultipliers:on:capReachedEventos de alcance del límite máximoDirectoFIRE_FORGETplayerId: string, type: string, limit: number, period: string, reached: boolean
RANKS.ON_LEVEL_BOOSTER_ACTIVATEDranks:on:levelBoosterActivatedEventos de activación del potenciador de nivelDirectoFIRE_FORGET_id: string, playerId: string, rewardId: string, boosterRate: number, timeStart: string, timeEnd: string, status: string, type: string, boosterType?: RewardTypeEnum, countDown?: ActiveCountdownBoosterType, metadata?: ActiveMetadataBoosterType, isNew?: boolean, isRecentBooster?: boolean, createAt?: string
RANKS.ON_LEVEL_BOOSTER_ENDranks:on:levelBoosterEndEventos de finalización del potenciador de nivelDirectoFIRE_FORGET_id: string, playerId: string, rewardId: string, boosterRate: number, timeStart: string, timeEnd: string, status: string, type: string, boosterType?: RewardTypeEnum, countDown?: ActiveCountdownBoosterType, metadata?: ActiveMetadataBoosterType, isNew?: boolean, isRecentBooster?: boolean, createAt?: string
PLAYER.ON_GAMIFICATION_OPT_INranks:on:optInEventos de aceptación de la ludificaciónDirectoFIRE_FORGETplayerId: string, status: string
PLAYER.ON_GAMIFICATION_OPT_OUTranks:on:optOutEventos de exclusión de gamificaciónDirectoFIRE_FORGETplayerId: string, status: string

Estructura de datos de eventos de aumento de XP

interface XpUpEventData extends BaseEventData {
playerId: string;
level: {
_id: string;
levelNumber: number;
};
nextLevel?: {
_id: string;
levelNumber: number;
};
nextRank?: {
_id: string;
name: string;
imageUrl: string;
translations: {
language: string;
name: string;
description: string;
}[];
};
pointsUntilNextLevel: number;
pointsUntilNextRank: number;
rank: {
_id: string;
name: string;
imageUrl: string;
translations: {
language: string;
name: string;
description: string;
}[];
};
xpBalance: number;
rewardsGroupId: string;
}

Estructura de datos de eventos de aumento de nivel

interface LevelUpEventData extends BaseEventData {
playerId: string;
level: {
_id: string;
levelNumber: number;
};
nextLevel?: {
_id: string;
levelNumber: number;
};
nextRank?: {
_id: string;
name: string;
imageUrl: string;
translations: {
language: string;
name: string;
description: string;
}[];
};
pointsUntilNextLevel: number;
pointsUntilNextRank: number;
rank: {
_id: string;
name: string;
imageUrl: string;
translations: {
language: string;
name: string;
description: string;
}[];
};
xpBalance: number;
claimReward: true;
rewards: LoyaltyRewards[];
rewardsGroupId: string;
}

Estructura de datos de eventos de aumento de rango

interface RankUpEventData extends BaseEventData {
playerId: string;
level: {
_id: string;
levelNumber: number;
};
nextLevel?: {
_id: string;
levelNumber: number;
};
nextRank?: {
_id: string;
name: string;
imageUrl: string;
translations: {
language: string;
name: string;
description: string;
}[];
};
pointsUntilNextLevel: number;
pointsUntilNextRank: number;
rank: {
_id: string;
name: string;
imageUrl: string;
translations: {
language: string;
name: string;
description: string;
}[];
};
xpBalance: number;
claimReward: boolean;
rewards: LoyaltyRewards[];
rewardsGroupId: string;
}

Tipo de recompensas de lealtad

LoyaltyRewards es una forma de recompensa especializada utilizada por los eventos de Lealtad (Rangos/Niveles).

export type LoyaltyRewards = Omit<Reward, 'rewardType'> & { type: RewardTypeEnum };

Estructura de datos de eventos de límite máximo de rangos alcanzado

interface RanksMaxCapReachedEventData extends BaseEventData {
playerId: string;
type: string;
limit: number;
period: string;
reached: boolean;
}

Estructura de datos de eventos de potenciador activo

interface ActiveBoosterEventData extends BaseEventData {
_id: string;
playerId: string;
rewardId: string;
boosterRate: number;
timeStart: string;
timeEnd: string;
status: string;
type: string;
boosterType?: RewardTypeEnum;
countDown?: {
days: number;
hours: number;
minutes: number;
seconds: number;
totalSeconds: number;
};
metadata?: {
[key: string]: unknown;
};
isNew?: boolean;
isRecentBooster?: boolean;
createAt?: string;
}

Estructura de datos de eventos de exclusión de gamificación

interface GamificationOptEventData extends BaseEventData {
playerId: string;
status: string;
}

Eventos de moneda virtual

ConstanteNombre del eventoDescripciónTipoTipo de garantíaPropiedades
VIRTUAL_CURRENCY.ON_WALLET_UPDATEvirtualCurrency:on:walletUpdateEventos de actualización del saldo de la billeteraDirectoFIRE_FORGETbalance: number, playerId: string
VIRTUAL_CURRENCY.ON_TOKEN_BOOSTER_ACTIVATEDvirtualCurrency:on:tokenBoosterActivatedEventos de activación del impulsor de tokensDirectoFIRE_FORGET_id: string, playerId: string, rewardId: string, boosterRate: number, timeStart: string, timeEnd: string, status: string, type: string, boosterType?: RewardTypeEnum, countDown?: ActiveCountdownBoosterType, metadata?: ActiveMetadataBoosterType, isNew?: boolean, isRecentBooster?: boolean, createAt?: string
VIRTUAL_CURRENCY.ON_TOKEN_BOOSTER_ENDvirtualCurrency:on:tokenBoosterEndEventos de finalización del impulsor de tokensDirectoFIRE_FORGET_id: string, playerId: string, rewardId: string, boosterRate: number, timeStart: string, timeEnd: string, status: string, type: string, boosterType?: RewardTypeEnum, countDown?: ActiveCountdownBoosterType, metadata?: ActiveMetadataBoosterType, isNew?: boolean, isRecentBooster?: boolean, createAt?: string

Estructura de datos del evento de actualización de la billetera

interface WalletUpdateEventData extends BaseEventData {
balance: number;
playerId: string;
}

Eventos de misiones

ConstanteNombre del eventoDescripciónTipoTipo de garantíaPropiedades
MISSIONS.ON_MISSION_BOOSTER_ACTIVATEDmissions:on:missionsBoosterActivatedEventos de activación del impulsor de misionesDirectoFIRE_FORGET_id: string, playerId: string, rewardId: string, boosterRate: number, timeStart: string, timeEnd: string, status: string, type: string, boosterType?: RewardTypeEnum, countDown?: ActiveCountdownBoosterType, metadata?: MissionBoosterMetadataType, isNew?: boolean, isRecentBooster?: boolean, createAt?: string
MISSIONS.ON_MISSION_BOOSTER_ENDmissions:on:missionsBoosterEndEventos de finalización del impulsor de misionesDirectoFIRE_FORGET_id: string, playerId: string, rewardId: string, boosterRate: number, timeStart: string, timeEnd: string, status: string, type: string, boosterType?: RewardTypeEnum, countDown?: ActiveCountdownBoosterType, metadata?: MissionBoosterMetadataType, isNew?: boolean, isRecentBooster?: boolean, createAt?: string
MISSIONS.ON_MISSION_OBJECTIVE_UPDATEmissions:on:objectiveUpdateActualización de objetivos de la misiónDirectoFIRE_FORGETplayerId: string, bundleId: string, bundleStateId: string, missionId: string, missionStateId: string, objectiveId: string, objectiveStateId: string, objectiveSummary: any, date: string
MISSIONS.ON_MISSION_OBJECTIVE_COMPLETEmissions:on:objectiveCompleteEventos de finalización de objetivos de la misiónDirectoplayerId: string, bundleId: string, bundleStateId: string, missionId: string, missionStateId: string, objectiveId: string, objectiveStateId: string, objectiveSummary: any, date: stringplayerId: cadena de texto, bundleId: cadena de texto, bundleStateId: cadena de texto, missionId: cadena de texto, missionStateId: cadena de texto, objectiveId: cadena de texto, objectiveStateId: cadena de texto, objectiveSummary: cualquiera, date: cadena de texto
MISSIONS.ON_MISSION_UPDATEmissions:on:missionUpdateEventos de actualización de la misiónDirectoFIRE_FORGETplayerId: string, easterEggs: any, _id: string, name: string, description: string, tags: string[], objectives: any[], validityTime: any, status: string, rewardCategories: any[], rewardClaimStatus: string, missionBundleState: any, bundleInternalDetails: any, bundleExternalDetails: any, enabled: boolean, version: number, state: string, missionBundleId: string, bundleStateId: string, missionId: string, endDate: string, startDate: string
MISSIONS.ON_MISSION_COMPLETEmissions:on:missionCompleteEventos de finalización de la misiónDirectoFIRE_FORGETplayerId: string, easterEggs: any, _id: string, name: string, description: string, tags: string[], objectives: any[], validityTime: any, status: string, rewardCategories: any[], rewardClaimStatus: string, missionBundleState: any, bundleInternalDetails: any, bundleExternalDetails: any, enabled: boolean, version: number, state: string, missionBundleId: string, bundleStateId: string, missionId: string, endDate: string, startDate: string
MISSIONS.ON_MISSION_BUNDLE_COMPLETEmissions:on:missionBundleCompleteEventos de finalización del paquete de misionesDirectoFIRE_FORGETplayerId: string, bundleId: string, status: string, bundleSummary: any, date: string
MISSIONS.ON_MISSION_BUNDLE_ASSIGNEDmisiones:activadas:asignarPaqueteMisiónEventos de asignación del paquete de misionesDirectoOLVIDAR_INCENDIOplayerId: cadena, missionBundleExternalDescription: any, date: cadena
MISIONES.CUANDO_TERMINA_MISIONmisiones:cuando:finalizaMisionEvento desencadenado cuando un operador finaliza manualmente una misión desde el panel de administración.DirectoOLVIDAR_INCENDIObundleId: cadena, missionId: cadena
MISIONES.CUANDO_TERMINA_PAQUETE_MISIONmisiones:cuando:finalizaPaqueteEvento desencadenado cuando un operador finaliza manualmente un paquete desde el panel de administración.Directo y DifusiónOLVIDAR_INCENDIObundleId: cadena
MISIONES.CUANDO_RECLAMADA_RECOMPENSAmisiones:cuando:reclamadaRecompensaEvento desencadenado cuando el jugador reclama una recompensa del paquete de misiones.DirectoOLVIDAR_INCENDIOplayerId: cadena, rewardId: cadena, status: RewardStatusEnum, missBundleStateId: cadena, missionStateId: cadena, timestamp: número

Tipo de Estructura de Metadatos del Potenciador de Misiones

interfaz MissionBoosterMetadataType {
missionId: cadena;
bundleId: cadena;
missionDescription: cadena;
missionBundleExternalDetails: {
language: cadena;
name: cadena;
description: cadena;
};
rewardId: cadena;
bundleStateId: cadena;
missionStateId: cadena;
[key: cadena]: unknown;
}

Estructura de Datos de Eventos de Objetivo de Misión

interfaz MissionObjectiveEventData extends BaseEventData {
playerId: cadena;
bundleId: cadena;
bundleStateId: cadena;
missionId: cadena;
missionStateId: cadena;
objectiveId: cadena;
objectiveStateId: cadena;
objectiveSummary: {
_id: cadena;
conditionValue: cadena;
conditionType: cadena;
translations: Pick<TranslationType, 'language' | 'name' | 'description'>[];
missionEventType: cadena;
value: número;
completed: booleano;
state: MissionProgressType;
};
date: cadena;
}

Estructura de Datos de Eventos de Actualización de Misión

interfaz MissionUpdateEventData extends BaseEventData {
_id: cadena;
name: cadena;
description: cadena;
tags: SlimTagType[];
objectives: ObjectiveMissionTypes[];
validityTime: ValidityTimeType | ValidityTimePeriodType | ValidityTimeSpecificDateType;
status: MissionStatusEnum;
rewardCategories: MissionRewardCategoryType[];
rewardClaimStatus?: MissionClaimStatusType;
missionBundleState?: MissionProgressType;
bundleInternalDetails: InternalDetailType;
bundleExternalDetails: TranslationType[];
enabled: booleano;
version: número;
state?: MissionProgressType;
missionBundleId?: cadena;
bundleStateId?: cadena;
missionId?: cadena;
endDate?: cadena;
startDate?: cadena;
originalMissionBundleId: cadena;
playerId: cadena;
repetitionCount?: número;
repetitionEnabled: booleano;
playerId: cadena;
easterEggs?: EasterEggsType[];
}

Estructura de Datos de Eventos de Paquete de Misión

interfaz MissionBundleEventData extends BaseEventData {
playerId: cadena;
bundleId: cadena;
status: cadena;
bundleSummary: {
_id: cadena;
missionBundleExternalDescription: TranslationType;
state: MissionProgressType;
};
date: cadena;
}

Estructura de Datos de Eventos de Asignación de Paquete de Misión

interfaz MissionBundleAssignEventData extends BaseEventData {
playerId: cadena;
missionBundleExternalDescription: TranslationType[];
date: cadena;
}

Estructura de Datos de Eventos de Finalización de Misión

interfaz MissionEndedEventData extends BaseEventData {
/**
* El identificador único del paquete en el paquete asignado debe ser originalId
*/
bundleId: cadena;
/**
* Identificador único de la misión en el estado del paquete del jugador.
*/
missionId: cadena;
}

Estructura de Datos de Eventos de Finalización de Paquete de Misión

interfaz MissionBundleEndedEventData extiende BaseEventData {
/**
* El identificador único del paquete en el paquete asignado debe ser originalId
*/
bundleId: string;
}

Estructura de datos del evento de reclamación de recompensa de misión

interfaz MissionRewardClaimedEventData extiende BaseEventData {
playerId: string;
rewardId: string;
status: RewardStatusEnum;
missBundleStateId: string;
missionStateId: string;
timestamp: number;
}
Ejemplo
// Suscribirse a eventos de reclamación de recompensa de misión
sdk.Events.subscribe(EVENTS.MISSIONS.ON_MISSION_REWARD_CLAIMED, (data) => {
console.log(`Recompensa ${data.rewardId} reclamada con éxito!`);
console.log(`Estado: ${data.status}`);
});

Eventos de torneos

ConstanteNombre del eventoDescripciónTipoTipo de garantíaPropiedades
TORNEOS.ANTES_DEL_COMIENZO_DEL_TORNEOtorneos:antes:comienzaEventos a punto de comenzar el torneoDirectoFIRE_FORGETplayerId: string, tournamentId?: string, tournamentName: string, tournamentDescription: string, tournamentType: TournamentTypeEnum, optIn: boolean, maxNumberOfBets: number, timePeriod?: TimePeriodType, externalDetails: ExternalDetailsEntity[], industry: TournamentIndustryTypeEnum, leaderboardRewards: LeaderboardReward[]
TORNEOS.CUANDO_COMIENZA_EL_TORNEOtorneos:cuando:comienzaEventos de inicio de torneoDirectoFIRE_FORGETplayerId: string, tournamentId?: string, tournamentName: string, tournamentDescription: string, tournamentType: TournamentTypeEnum, optIn: boolean, maxNumberOfBets: number, timePeriod?: TimePeriodType, externalDetails: ExternalDetailsEntity[], industry: TournamentIndustryTypeEnum, leaderboardRewards: LeaderboardReward[]
TORNEOS.CUANDO_TERMINA_EL_TORNEOtorneos:cuando:terminóEventos de fin de torneoDirectoFIRE_FORGETexternalDetails: ExternalDetailsEntity[], industry: TournamentIndustryTypeEnum, maxNumberOfBets: number, optIn: boolean, timePeriod?: TimePeriodType, tournamentDescription: string, tournamentId: string, tournamentName: string, tournamentType: TournamentTypeEnum, leaderboardRewards: LeaderboardReward[]
TORNEOS.CUANDO_SE_CANCELA_EL_TORNEOtorneos:cuando:canceladoTorneo cancelado por un administradorDifusiónFIRE_FORGETtournamentId?: string, externalDetails: ExternalDetailsEntity[]
TORNEOS.CUANDO_EL_JUGADOR_GANA_RECOMPENSAStorneos:cuando:elJugadorGanóRecompensasEventos de recompensas ganadas por el jugador del torneoDirectoFUEGO_OLVIDARindustria: TournamentIndustryTypeEnum, maxNumberOfBets: number, optIn: boolean, timePeriod?: TimePeriodType, tournamentDescription: string, tournamentId: string, tournamentName: string, tournamentType: TournamentTypeEnum, leaderboard: { position: number }, leaderboardRewards: LeaderboardReward[], earnedRewards?: { [key: string]: Reward }
TORNEOS.EN_ACTUALIZACIÓN_DE_CLASIFICACIÓNtorneos:en:clasificaciónActualizadaEventos de actualización de la clasificación de torneosTransmisiónFUEGO_OLVIDARtorneo: Omit<TournamentEventData, 'tournamentId'>[], clasificación: Omit<PlayerLeaderboard & { rankId: string }, 'leaderboardRewards'>[], marca_temporal: number
TORNEOS.EN_ACTUALIZACIÓN_DE_CLASIFICACIÓN_DE_JUGADOR_DE_TORNEOtorneos:en:clasificaciónDeJugadorActualizadaEventos de actualización de la clasificación de jugadoresDirectoFUEGO_OLVIDARtorneos: { tournamentId: string, position: number, score: number, spinsLeft: number, type: TournamentTypeEnum, round?: RoundInfo }[], marca_temporal: number
TORNEOS.EN_SIN_GIROS_RESTANTEStorneos:en:sinGirosRestantesEventos sin giros restantesDirectoFUEGO_OLVIDARplayerId: string, torneo: { _id: string } & Omit<TournamentEventData, 'tournamentId'>
TORNEOS.EN_CLASIFICACIÓN_LISTAtorneos:en:clasificaciónListaEventos de clasificación listaTransmisiónFUEGO_OLVIDARtournamentId: string, detallesExternos: ({ elegibilidadDisplayName?: string } & TranslationType)[], recompensasDeClasificación: LeaderboardReward[], elegibilidad: TournamentEligibilityType

Estructura de datos del evento de notificaciones de torneos

// Equivalente a Omit<TournamentEventData, 'player' | 'earnedRewards' | 'internalDetails' | 'rewardsGroupId' | 'leaderboard' | 'eligibility' | 'objectives' | 'status' | '_id'>
interface TournamentNotificationsEventData extends BaseEventData {
playerId: string;
tournamentId?: string;
tournamentName: string;
tournamentDescription: string;
tournamentType: TournamentTypeEnum;
optIn: boolean;
maxNumberOfBets: number;
timePeriod?: TimePeriodType;
detallesExternos: ExternalDetailsEntity[];
industria: TournamentIndustryTypeEnum;
recompensasDeClasificación: LeaderboardReward[];
}

Estructura de datos del evento de torneo finalizado

interface TournamentEndedEventData extends BaseEventData {
detallesExternos: ExternalDetailsEntity[];
industria: TournamentIndustryTypeEnum;
recompensasDeClasificación: LeaderboardReward[];
maxNumberOfBets: number;
optIn: boolean;
timePeriod?: TimePeriodType;
tournamentDescription: string;
tournamentId: string;
tournamentName: string;
tournamentType: TournamentTypeEnum;
}

Estructura de datos del evento de torneo cancelado

// Equivalente a Pick<TournamentEventData, 'tournamentId' | 'externalDetails'>
interface TournamentCanceledEventData extends BaseEventData {
/**
* El identificador único del torneo. Opcional porque en algunas notificaciones de torneo es opcional en el tipo base.
*/
tournamentId?: string;
/**
* Información pública localizada sobre el torneo visible para el jugador.
*/
detallesExternos: ExternalDetailsEntity[];
}

Ejemplo de suscripción

// Escuchar cancelaciones de torneos (difusión)
const subId = sdk.Events.subscribe('torneos:cuando:cancelado', (data, raw) => {
console.log('Torneo cancelado:', data.tournamentId);
// Puede usar externalDetails para representar una copia localizada en la interfaz de usuario
};

Estructura de datos del evento de un jugador de torneo que ganó

interface TournamentPlayerWonEventData extends BaseEventData {
earnedRewards?: { [key: string]: Reward };
externalDetails: ExternalDetailsEntity[];
industry: TournamentIndustryTypeEnum;
leaderboardRewards: LeaderboardReward[];
maxNumberOfBets: number;
optIn: boolean;
timePeriod?: TimePeriodType;
tournamentDescription: string;
tournamentId: string;
tournamentName: string;
tournamentType: TournamentTypeEnum;
leaderboard: {
position: number;
};
}

Estructura de datos del evento de torneos actualizados

interface TournamentsUpdatedEventData extends BaseEventData {
tournament: Omit<TournamentEventData, 'tournamentId'>[];
leaderboard: Omit<PlayerLeaderboard & { rankId: string }, 'leaderboardRewards'>[];
timestamp: number;
}

Estructura de datos del evento de la actualización del tablero de clasificación del jugador

interface PlayerLeaderboardUpdatedEventData extends BaseEventData {
tournaments: {
tournamentId: string;
position: number;
score: number;
spinsLeft: number;
type: TournamentTypeEnum;
/**
* Round only exists for tournaments of type TournamentTypeEnum.HIGHEST_WIN but can be undefined
* under certain conditions.
* 1- If type is TournamentTypeEnum.MOST_POINTS
* 2- If type is TournamentTypeEnum.HIGHEST_WIN, and the player does not have any winning rounds
*/
round?: RoundInfo;
}[];
timestamp: number;
}

Estructura de datos del evento de giros restantes vacíos

interface SpinsLeftEmptyEventData extends BaseEventData {
playerId: string;
tournament: { _id: string } & Omit<TournamentEventData, 'tournamentId'>;
}

Estructura del tablero de clasificación del torneo listo

type TournamentLeaderboardReady = {
tournamentId: string;
externalDetails: ({ elegibilityDisplayName?: string } & TranslationType)[];
leaderboardRewards: LeaderboardReward[];
eligibility: TournamentEligibilityType;
};

Eventos CRM

ConstanteNombre del eventoDescripciónTipoTipo de garantíaPropiedades
CRM.CUANDO_LLEGA_LA_NOTIFICACIÓN_EN_SITIOmessageGateway:cuando:enviarNotificaciónEnSitioEventos de notificación in situDirectoBEST_EFFORTmsg: { type: string, contentHtml: string, language: string }, playerId: string
CRM.CUANDO_NOTIFICACIÓN_DE_BUZÓN_RICOmessageGateway:cuando:enviarNotificaciónDeBuzónRicoNotificar al jugador sobre un mensaje de Rich Inbox que ha llegado.DirectoBEST_EFFORTmessage: RichInboxMessage, playerId: string, timestamp: number

Estructura de datos del evento de notificación in situ

interface OnSiteNotificationEventData extends BaseEventData {
msg: {
type: string;
contentHtml: string;
language: string;
};
playerId: string;
}

Estructura de datos del evento de notificación de Rich Inbox

interface RichInboxMessage {
id: string;
title: string;
content: string;
createdAt: Date;
}

interface RichInboxMessageEventData extends BaseEventData {
message: RichInboxMessage;
playerId: string;
timestamp: number;
}
Ejemplo
// Suscribir a eventos de notificación de buzón enriquecido
sdk.Events.subscribe(EVENTS.CRM.ON_RICH_INBOX_NOTIFICATION, (data) => {
console.log('Nuevo mensaje de buzón enriquecido recibido:');
console.log('Título:', data.message.title);
console.log('Contenido:', data.message.content);
});

Eventos del Procesador de Recompensas

ConstanteNombre del eventoDescripciónTipoTipo de garantíaPropiedades
REWARD_PROCESSOR.ON_MANUAL_REWARD_AWARDEDrewardProcessor:on:manualRewardAwardedRecompensa manual otorgada al jugador desde el Panel de AdministraciónDirectoFIRE_FORGETplayerId: string, rewardType: RewardTypeEnum, earnedReward: Reward (by type), rewardId: string, `source: 'manual''automatic', timestamp: number, groupId?: string`
REWARD_PROCESSOR.ON_REWARD_CLAIMED_BY_ADMINrewardProcessor:on:claimRewardAdminRecompensa reclamada por un operador administradorDirectoFIRE_FORGETplayerId: string, rewardType: RewardTypeEnum, rewardId: string, `source: 'manual''automatic', timestamp: number, groupId?: string`
REWARD_PROCESSOR.ON_REWARD_CANCELLEDrewardProcessor:on:rewardCancelledRecompensa cancelada por un operador administradorDirectoFIRE_FORGETplayerId: string, rewardType: RewardTypeEnum, rewardId: string, `source: 'manual''automatic', timestamp: number, groupId?: string`
REWARD_PROCESSOR.ON_BONUS_REWARD_GRANTEDrewardProcessor:on:bonusRewardGrantedEvento despachado cuando se otorga un bono y está vinculado a una recompensaDirectoFIRE_FORGETplayerId: string, rewardId: string, rewardType: RewardTypeEnum.BONUS_OFFER, groupId: string, bonusOfferId: string, currency?: string

Estructura de datos del evento de recompensa manual otorgada

// Discriminated union por tipo de recompensa
// Datos de eventos
interface ManualRewardAwardedEventData_Tokens {
playerId: string;
rewardType: RewardTypeEnum.TOKENS; // 'tokens'
earnedReward: TokensReward;
rewardId: string;
source: 'manual' | 'automatic';
timestamp: number;
groupId?: string;
}

interface ManualRewardAwardedEventData_BonusOffer {
playerId: string;
rewardType: RewardTypeEnum.BONUS_OFFER; // 'bonus_offer'
earnedReward: BonusOfferReward;
rewardId: string;
source: 'manual' | 'automatic';
timestamp: number;
groupId?: string;
}

interface ManualRewardAwardedEventData_LevelBooster {
playerId: string;
rewardType: RewardTypeEnum.LEVEL_BOOSTER; // 'level_booster'
earnedReward: LevelBoosterReward;
rewardId: string;
source: 'manual' | 'automatic';
timestamp: number;
groupId?: string;
}

interface ManualRewardAwardedEventData_MissionBooster {
playerId: string;
rewardType: RewardTypeEnum.MISSION_BOOSTER; // 'mission_booster'
earnedReward: MissionBoosterReward;
rewardId: string;
source: 'manual' | 'automatic';
timestamp: number;
groupId?: string;
}

interface ManualRewardAwardedEventData_TokenBooster {
playerId: string;
rewardType: RewardTypeEnum.TOKEN_BOOSTER; // 'token_booster'
earnedReward: TokenBoosterReward;
rewardId: string;
source: 'manual' | 'automatic';
timestamp: number;
groupId?: string;
}

interface ManualRewardAwardedEventData_External {
playerId: string;
rewardType: RewardTypeEnum.EXTERNAL; // 'external'
earnedReward: ExternalReward;
rewardId: string;
source: 'manual' | 'automatic';
timestamp: number;
groupId?: string;
}

// Unión utilizada por el evento
// type ManualRewardAwardedEventData =
// | ManualRewardAwardedEventData_Tokens
// | ManualRewardAwardedEventData_BonusOffer
// | ManualRewardAwardedEventData_LevelBooster
// | ManualRewardAwardedEventData_MissionBooster
// | ManualRewardAwardedEventData_TokenBooster
// | ManualRewardAwardedEventData_External;

Estructura de datos de eventos de recompensa de bonificación

interface BonusRewardGranted extends BaseEventData {
playerId: string;
rewardId: string;
rewardType: RewardTypeEnum.BONUS_OFFER;
groupId: string;
/**
* Identificador de oferta de bonificación, devuelto en el evento de bonificación otorgada
* propagado por el operador cuando se confirma la bonificación otorgada.
*/
bonusOfferId: string;
currency?: string;
}
Enumeración de tipo de recompensa
enum RewardTypeEnum {
TOKENS = 'tokens',
BONUS_OFFER = 'bonus_offer',
LEVEL_BOOSTER = 'level_booster',
MISSION_BOOSTER = 'mission_booster',
TOKEN_BOOSTER = 'token_booster',
EXTERNAL = 'external',
MINI_GAME = 'mini_game',
}
Estructuras de recompensa ganada
// Campos base compartidos para recompensas de refuerzo
interface BaseReward {
type: RewardTypeEnum;
translations?: { language: string; description: string }[];
level: number;
activation: string;
boosterRate: number;
expirationValidityTime?: { timeType: string };
timeFrame: string; // Duración ISO8601
termsAndConditions?: { language: string; description: string };
}

interface TokensReward extends Pick<BaseReward, 'type'> {
type: RewardTypeEnum.TOKENS;
amount: number;
}

interface BonusOfferReward extends Pick<BaseReward, 'type'> {
type: RewardTypeEnum.BONUS_OFFER;
bonusByCurrency: {
[currency: string]: {
name: string;
bonusOfferId: string;
};
};
}

interface LevelBoosterReward extends BaseReward {
type: RewardTypeEnum.LEVEL_BOOSTER;
}

interface MissionBoosterReward extends BaseReward {
type: RewardTypeEnum.MISSION_BOOSTER;
}

interface TokenBoosterReward extends BaseReward {
type: RewardTypeEnum.TOKEN_BOOSTER;
}

interface ExternalReward extends Pick<BaseReward, 'type'> {
type: RewardTypeEnum.EXTERNAL;
imageUrl: string;
description: string;
}
Ejemplo
// Suscribirse a eventos de otorgamiento de recompensa manual
const subId = rtmEvents.subscribe('rewardProcessor:on:manualRewardAwarded', (data, raw) => {
// Campos comunes
console.log(data.playerId, data.rewardType, data.rewardId, data.source, data.timestamp, data.groupId);

// Filtrar por tipo de recompensa
switch (data.rewardType) {
case 'tokens':
console.log('Tokens otorgados:', data.earnedReward.amount);
break;
case 'bonus_offer':
console.log('Monedas de oferta de bonificación:', Object.keys(data.earnedReward.bonusByCurrency));
break;
case 'level_booster':
case 'mission_booster':
case 'token_booster':
console.log('Tasa de refuerzo:', data.earnedReward.boosterRate);
break;
case 'external':
console.log('Descripción de recompensa externa:', data.earnedReward.description);
break;
}
});

Interfaces relacionadas

SubscriptionOptions

Interfaz para configurar suscripciones a eventos.

interface SubscriptionOptions {
once?: boolean;
timeout?: number;
filter?: (data: any) => boolean;
maxRetries?: number;
autoAck?: boolean;
}
PropiedadTipoDescripción
onceboolean (opcional)Si es true, la suscripción se eliminará automáticamente después de recibir el primer evento
timeoutnúmero (opcional)Tiempo en milisegundos después del cual se eliminará automáticamente la suscripción si no se recibe ningún evento
filtroFunción (opcional)Una función que recibe los datos del evento y devuelve un valor booleano que indica si el evento debe procesarse
maxRetriesnúmero (opcional)Número máximo de reintentos para el procesamiento de eventos fallidos
autoAckbooleano (opcional)Si es true, los eventos se reconocerán automáticamente. El valor predeterminado es false

SDKEventListener

Definición de tipo para las devoluciones de llamada del escuchador de eventos.

type SDKEventListener<T extends keyof EventTypeMap> = (
data: EventTypeMap[T],
internalRawEvent: InternalRawEvent<T>
) => void;
ParámetroTipoDescripción
dataEventTypeMap[T]Los datos del evento específicos para el tipo de evento
internalRawEventInternalRawEvent<T>Los datos de evento sin procesar recibidos del servidor

InternalRawEvent

Interfaz que representa los datos de evento sin procesar recibidos del servidor.

interface InternalRawEvent<T extends keyof EventTypeMap> {
id: string;
event: T;
data: EventTypeMap[T];
timestamp: number;
guaranteeType: MessagingServiceGuaranteeType;
}
PropiedadTipoDescripción
idstringEl identificador único del evento
eventTEl nombre del evento
dataEventTypeMap[T]Los datos del evento
timestampnumberLa marca de tiempo cuando se generó el evento
garantíaTipoTipoGarantíaServicioMensajeríaEl tipo de garantía del evento

TipoGarantíaServicioMensajería

Un enumerado que define diferentes niveles de garantía para la entrega de mensajes.

enum TipoGarantíaServicioMensajería {
FIRE_FORGET = 'FIRE_FORGET',
BEST_EFFORT = 'BEST_EFFORT',
RELIABLE_DELIVERY = 'RELIABLE_DELIVERY',
RELIABLE_RECEIPT = 'RELIABLE_RECEIPT',
}
Tipo de garantíaDescripción
FIRE_FORGETEl mensaje se entrega al jugador solo si está conectado. Si está desconectado, el mensaje se descarta.
BEST_EFFORTEl mensaje se entrega si está conectado. Si está desconectado, el mensaje se almacena y se entrega en la siguiente conexión.
RELIABLE_DELIVERYIgual que BEST_EFFORT, pero espera la notificación de ACK antes de marcar como entregado.
RELIABLE_RECEIPTIgual que BEST_EFFORT, pero el microservicio de origen se notifica cuando se entrega el mensaje.

EmitterTypeMap

Un mapeo de los nombres de eventos de emisor a sus tipos de datos correspondientes.

interface EmitterTypeMap {
'send:ack': AckMessageEmitter;
'send:analytics:event': AnalyticsTrackingEventEmitter;
}
Nombre del eventoTipo de datosDescripción
send:ackAckMessageEmitterEmisor de mensajes de acuse de recibo para confirmar la recepción de eventos
send:analytics:eventAnalyticsTrackingEventEmitterEmisor de eventos de seguimiento de análisis

AckMessageEmitter

Interfaz para mensajes de acuse de recibo.

interface AckMessageEmitter {
messageId: string;
}
PropiedadTipoDescripción
messageIdstringEl ID del mensaje que se está acusando de recibo

AnalyticsTrackingEventEmitter

Interfaz para eventos de seguimiento de análisis.

interface AnalyticsTrackingEventEmitter {
properties: Record<string, any>;
}
PropiedadTipoDescripción
eventNamestringEl nombre del evento de análisis
propertiesRecord<string, any>Propiedades adicionales para el evento de análisis