Permite obtener los cambios en el chat que ocurrieron desde la última vez que se llamó a esta función, o desde que se suscribió.
La lista de cambios deberá ser procesada secuencialmente.
El formato de cada cambio es TYPE=data.
Lista de tipo de eventos que avisan sobre cambios en el chat:
Nota: La plataforma MasterControl, no lleva una lista individual de nicks por cada canal de chat, eso sería ineficiente, lo que hace, es tener una lista GLOBAL sincrónica de nicks, y en cada registro de nick hay un campo que indica en qué canales está metido. Al enviar los updates ADDNICK (JOIN), se indica siempre todos los canales en donde está metido. Es responsabilidad del frontend llevar una copia del listado global, y en cada canal mostrar solo los nicks verificando que el nombre del canal esté presente en el campo mencionado.
Luego de usar la API CHATSUBSCRIBE, procesar los eventos DROP, DROPCYBERNAME, REMNICK, ADDNICK para mantener la lista de nicks que llevarás internamente sincronizada con la plataforma.
Es responsabilidad de la plataforma y no del frontend mostrar los mensajes tipo: “El usuario ha entrado/salido/caido al/del canal” (suelen estar desactivados para no generar mucho spam). El frontend solo debe limitarse a mantener actualizada visualmente la lista de nicks en cada canal para crear la separación de canales.
DROP=MyCyberName ; Debes remover todos los nicks ajenos al servidor de donde te encuentras, es decir todos los que no terminen en @MyCyberName, sucede cuando el Master Control Server en donde estás se desconectó de la comunidad del MasterControl.
DROPCYBERNAME=CyberName ; Debes remover todos los nicks pertenecientes a dicho establecimiento, sucede cuando otro Master Control se desconecta de la comunidad del MasterControl.
REMNICK=Nick,ChannelName ; Debes remover un nick del listado, el nick tiene el calificativo staff y todo, tal como normalmente aparece en la lista. Si se especifica un canal, se debe remover el nick solo en ese canal, si no se especifica un canal, es un DROP, se debe quitar de todos los canales e incluso eliminar el nick de la administración interna que lleves. Si se indica remover al nick de un canal en donde vos no estás presente, simplemente ignora el aviso, o puedes llevar un registro interno, por si en el futuro vos entras a dicho canal, entonces tendrías ya actualizado siempre quienes están en dicho canal.
ADDNICK=Nick,CurrentlyChannelsJoined ; Debes agregar este nick en la lista, el nick tiene el calificativo staff y todo tal como debe aparecer en el chat. CurrentlyChannelsJoined es una lista de ChannelName separado por comas. Ej. ADDNICK=Juan@UnCyber,Publico,Staff,Fortnite, simplemente procesa cada nombre de canal individualmente, verifica que el nick aún no está presente en dicho canal (para evitar duplicados en la lista), y lo agregas, si ya estaba presente en un canal dado, no hacer nada en ese canal. Se informará que están presentes en canales donde vos puedes no estar, si vos no tienes una ventana abierta de un canal dado, ignora las indicaciones de que están en canales donde vos no estás.
PUB=ChannelName,SentByNick,Message ; Recibe un mensaje para un chat público, el nombre del canal puede ser "Staff" o "Public" por ahora.
PRIV=FromNick,Message ; Recibe un mensaje de chat privado. Si no tienes esta ventana de chat privado abierta, debes abrirla, y avisar con un zumbido o algo similar, de que te han escrito en un nuevo chat privado.
ECO=ToNick,Message ; Recibes el ECO de lo que acabas de escribir/enviar en un chat privado, e indica que tu mensaje está siendo procesado y ya lo puedes incorporar el mensaje en el historial de charla como lo que acabas de escribir vos. Si no tienes esa ventana de chat privado abierta, significa que es una charla privada pero usando el Master Client o el CCC, si no tienes la ventana, ignora este ECO.
NOREACH=ToNick,Message ; Recibe información de que un mensaje que acabas de escribir, definitivamente no pudo llegar a destino, porque no se encontró el destino, como por ej., el cliente cerró su consola de chat, o hubo un NETSPLIT, etc. Solo si tienes la ventana de chat privado hacia este nick debes indicarlo en el historial de charla como que no llegó, si no tienes la ventana, debes ignorar este update.
Los mensajes tanto de chat públicos como privados tienen cierto formato, no es 100% texto plano, por lo tanto los mensajes deben ser parseados a TAGs HTML equivalentes.
El origen de los textos es UCS2 (UNICODE de 16bits FIJO por carácter), pero a las funciones Comm.php y CommPost.php le llega una secuencia de bytes en binario, y convierten la salida a json_encode() del lenguaje PHP, así que supongo (suponer está mal) que los códigos de caracteres llegan directos y de forma transparentes, y no interviene allí la codificación utf8 ni nada de eso cuando recibes los datos. Así que puedes tratarlos como caracteres cuyo número representativo puede ir de 0 a 65535 para cada caracter.
FORMATO:
words = 1 , (128+order) ; secuencia de 2 words/caracteres, 1, es un prefijo de emoticón, el siguiente carácter es el número de emoticón, es decir, el primer emoticón es el número 128, el segundo emoticón es el número 129 … . Cuando se envía un emoticón, el cliente de chat convierte el texto escrito por el usuario en códigos de emoticones, por ej.: “;)” se convierte en la imagen del icono “baffle.ico” (junto al Flulpy.exe existe el archivo “Emoticons.dat” que se puede ver con el notepad, ahí se enumeran todas las conversiones que se hacen en tiempo real, es decir, mientras el cliente va tipeando. Dicho archivo tiene el orden de los emoticones, donde el primero que aparece en el listado tiene el emoticón 128, el segundo tiene el 129… y así).
Es decir si miramos el archivo Emoticons.dat, el texto “:-*”, se debe convertir a la secuencia de caracteres 1 y 128, y se muestra en la pantalla con la imagen de “ChatsIcons\sweet_kiss.ico”.
words = 2 , (127 hasta 255) ; secuencia de 2 words/caracteres, determina el código de color del texto, donde 127 = color default, el original de la consola de chat, mientras que cuando el cliente le aplica otro color, se usa 128 – 255, en binario es 1bbggrrr, dichos bits se deben trasladar a los bit más significativos de los valores RGB y si el valor de intensidad de cada canal R G y B es de la mitad para arriba, el resto de los bits menos significativos se debe complementar en 1, si es de la mitad de intensidad para abajo, se los deja en 0.
Ejemplo:
If (CharNumber == 127)
{TextColor = DefaultColor}
else
{If ((CharNumber & 0x60) >= 0x40)
{ColorBlue = ((CharNumber & 0x60) << 1) | 0x3F}
else
{ColorBlue = (CharNumber & 0x60) << 1}
If ((CharNumber & 0x18) >= 0x10)
{ColorGreen = ((CharNumber & 0x18) << 3) | 0x3F}
else
{ColorGreen = (CharNumber & 0x18) << 3}
If ((CharNumber & 0x07) >= 0x04)
{ColorRed = ((CharNumber & 0x07) << 5) | 0x1F}
else
{ColorRed = (CharNumber & 0x07) << 5}
TextColor = ColorBlue << 16 + ColorGreen << 8 + ColorRed;
words = 3 , (127 hasta 255) ; secuencia de 2 words/caracteres, determina el código de color del fondo, donde 127 = color default (transparente o background), el original de la consola de chat, mientras que cuando el cliente le aplica otro color, se debe imprimir un color de resaltado sólido al texto, el color se decodifica igual que con el color de texto visto antes.
Adicionalmente si el mensaje comienza como %COM%buzzer, debe hacer sonar un llamado de atención a dicha ventana de chat.
Minimum version for the target server required: v17.5.13.
Input parameters:
- CommandClass = _CHATGETUPDATES.
- Param1 = target CyberName.
- Param2 = SessionToken.
[{“ResponseClass”: “ERROR”, “Param1”: “message”, … }]
[{“ResponseClass”: “CHANGES”, “Param1”: “change + null + change + null + …”}]
[{“ResponseClass”: “OK”}]
Example of usage: