Scripting

API de scripting estilo cb0t/Ares para personalizar el comportamiento de cada sala. Los scripts viven en scripts/{roomId}/{nombre}/{nombre}.js y se ejecutan en un contexto aislado sin acceso a módulos del sistema.

Restricciones técnicas
  • Código asincrónico prohibido: async, await, Promise, setImmediate, queueMicrotask.
  • Máximo 20 timers activos por script.
  • Máximo 5 solicitudes HTTP concurrentes por script · timeout 10 s · límite 1 MB por respuesta.
  • Timeout de ejecución de 500 ms por evento; 3 s al cargar el script.
  • Archivos de datos en scripts/{roomId}/{nombre}/data/.
  • No están disponibles: require, process, global, fetch, XMLHttpRequest, WebSocket.

Global

include

Carga un subscript en el contexto del script actual. El archivo debe estar en la misma carpeta del script.

print("cargando helpers.js...");
include("helpers.js");
includeAll

Incluye todos los archivos .js presentes en la carpeta del script.

print("cargando todos los subscripts...");
includeAll();
print

Envía texto de anuncio a todos, a un vroom o a un usuario específico. No renderiza HTML. Acepta códigos de color: \x03 para color de fuente, \x05 para fondo, seguidos de dos dígitos (00=blanco … 15=gris claro). Formatos: \x06 negrita · \x07 subrayado · \x09 cursiva.

// a todos los usuarios
print("hola");

// solo al vroom 0
print(0, "hola");

// a un usuario específico
print(user(0), "hola");

// con color (rojo=04, verde=03, azul=02, negrita=\x06)
print("\x0304texto en rojo");
print("\x06texto en negrita\x06");
scriptName

Devuelve el nombre de la carpeta del script en ejecución.

print("este script se llama " + scriptName());
sendEmote

Envía un mensaje de emote público. Si target es un usuario válido, solo él lo recibe; si es null o no se resuelve, se hace broadcast.

// a un usuario específico
sendEmote(user(0), Room.botName, "hola");

// broadcast
sendEmote(null, Room.botName, "aparece misteriosamente");
sendPM

Envía un mensaje privado a un usuario específico.

sendPM(user(0), Room.botName, "mensaje privado");
sendText

Envía un mensaje público. Si target no se resuelve, se hace broadcast.

// a un usuario
sendText(user(0), Room.botName, "hola");

// broadcast
sendText(null, Room.botName, "hola sala");
tickCount

Devuelve el timestamp Unix en milisegundos (equivalente a Date.now()).

var ticks = tickCount();
user

Busca un usuario por ID numérico, nombre exacto o subcadena de nombre. Devuelve null si no se encuentra.

var u = user(0);         // por ID
var u = user("anon");    // por nombre o subcadena

Base64

Base64.encode

Codifica texto a Base64.

var encoded = Base64.encode("hola mundo");
Base64.decode

Decodifica una cadena Base64 a texto UTF-8.

var decoded = Base64.decode(encoded);

Channels

Channels.available

Indica si hay una base de datos de canales disponible. Siempre devuelve false en este servidor.

Channels.enabled

Indica si la búsqueda de salas está activada. Siempre devuelve false en este servidor.

File

Los archivos se guardan en scripts/{roomId}/{nombre}/data/. Las rutas se validan; no se puede salir de esa carpeta.

File.save

Guarda el contenido de una cadena en un archivo (sobreescribe si ya existe). Crea la carpeta data/ si no existe.

File.save("config.txt", "valor=123");
File.load

Carga el contenido de un archivo como cadena. Devuelve null si el archivo no existe.

var str = File.load("config.txt");
if (str != null) print(str);
File.exists

Indica si un archivo de datos existe.

if (!File.exists("config.txt"))
    print("archivo no encontrado");
File.kill

Elimina un archivo de datos.

File.kill("temporal.txt");
File.append

Agrega texto al final de un archivo (lo crea si no existe).

File.append("log.txt", "nueva entrada\n");

Registry

Almacena pares clave/valor como strings, persistidos en registry.json dentro de la carpeta del script. Los valores siempre se convierten a string al guardar.

Registry.getValue

Obtiene el valor de una clave. Devuelve null si no existe.

var valor = Registry.getValue("puntos");
print(valor);
Registry.setValue

Establece el valor de una clave. El valor se convierte a string automáticamente.

Registry.setValue("puntos", "100");
Registry.deleteValue

Elimina una clave del registro.

Registry.deleteValue("puntos");
Registry.exists

Indica si una clave existe en el registro.

if (Registry.exists("puntos"))
    print("la clave existe");
Registry.getKeys

Devuelve un array con todas las claves del registro del script.

var keys = Registry.getKeys();
for (var i = 0; i < keys.length; i++)
    print(keys[i] + " = " + Registry.getValue(keys[i]));
Registry.clear

Elimina todas las entradas del registro.

Registry.clear();

Room

Room.botName

Nombre de la sala, usado como nombre del bot.

print("el bot se llama " + Room.botName);
Room.name

Nombre de la sala. Equivale a Room.botName.

Room.topic

Tema principal de la sala. Al asignarlo se notifica a todos los usuarios.

Room.topic = "bienvenidos";
print("tema actual: " + Room.topic);
Room.startTime

Timestamp Unix en segundos del momento en que se cargó el script.

print("iniciado: " + new Date(Room.startTime * 1000));
Room.version

Versión del modelo de objetos del servidor. Devuelve 1.

Room.externalIp  ·  Room.hashlink  ·  Room.port

No disponibles en este servidor. externalIp y hashlink devuelven cadena vacía; port devuelve 0.

Room.customNames

Obtiene o establece si los usuarios pueden tener nombres personalizados. Leer siempre devuelve true.

Room.customNames = true;
Room.setUrl

Agrega una entrada de URL al tag de la sala.

Room.setUrl("https://ejemplo.com", "mi sitio");
Room.clearUrl

Limpia el tag de URL de la sala.

Room.clearUrl();
Room.scribble

Envía una imagen scribble a todos los usuarios del vroom 0.

var img = new Scribble().load("imagen.jpg");
Room.scribble(img);
Room.audio

Envía un audio a todos los usuarios del vroom 0.

var audio = new Audio().load("sonido.mp3");
Room.audio(audio);

Spelling

Spelling.available

Indica si el corrector ortográfico está disponible. Siempre devuelve false en este servidor.

Stats

Todas las propiedades son de solo lectura y devuelven double.

Stats.userCount

Usuarios actualmente conectados.

Stats.messageCount

Total de mensajes públicos recibidos.

Stats.joinCount

Total de usuarios que se han conectado.

Stats.partCount

Total de usuarios que se han desconectado.

Stats.peakUserCount

Pico máximo de usuarios conectados simultáneamente.

Stats.dataSent

Bytes totales enviados por el servidor.

Stats.dataReceived

Bytes totales recibidos por el servidor.

Stats.floodCount

Cantidad de usuarios expulsados por flood.

Stats.pmCount

Cantidad de mensajes privados recibidos.

Stats.rejectionCount

Cantidad de usuarios rechazados al intentar unirse.

Stats.invalidLoginCount

Cantidad de intentos de login fallidos.

print("usuarios: " + Stats.userCount + " / pico: " + Stats.peakUserCount);

Users

Users.local

Ejecuta una función para cada usuario local conectado.

Users.local(function (u) {
    u.sendText("hola " + u.name);
});
Users.banned

Ejecuta una función para cada usuario en la lista de baneados.

Users.banned(function (u) {
    if (u.name.indexOf("anon") == 0)
        u.unban();
});
Users.records

Ejecuta una función para cada cuenta registrada en la sala.

Users.records(function (u) {
    print(u.guid);
});
Users.linked

Itera sobre usuarios enlazados. No disponible (stub) en este servidor.

Zip

Zip.compress

Comprime una cadena usando deflate y devuelve el resultado en Base64.

var c = Zip.compress("texto largo...");
Zip.uncompress

Descomprime una cadena Base64 comprimida con deflate.

var original = Zip.uncompress(c);

Entities

Entities.encode

Convierte &, <, >, " a entidades HTML.

var safe = Entities.encode("<script>alert(1)</script>");
Entities.decode

Convierte entidades HTML de vuelta a caracteres (&amp;&, &lt;<, &gt;>, &quot;").

var text = Entities.decode("&lt;b&gt;hola&lt;/b&gt;");

Crypto

Crypto.md5hash

Calcula el hash MD5 de una cadena. Devuelve un CryptoResult.

var hash = Crypto.md5hash("hola mundo");
print(hash.toHex);
Crypto.sha1hash

Calcula el hash SHA-1 de una cadena. Devuelve un CryptoResult.

var hash = Crypto.sha1hash("hola mundo");
print(hash.toBase64);

AvatarImage

Obtenido mediante userobj.avatar.

exists

Devuelve true si el objeto contiene un avatar válido.

if (userobj.avatar.exists)
    print(userobj.name + " tiene avatar");
save(filename)

Guarda el avatar del usuario como archivo binario en la carpeta data/ del script. Devuelve false si el usuario no tiene avatar.

function onJoin(userobj) {
    if (userobj.avatar.exists)
        userobj.avatar.save("avatar_" + userobj.name + ".bin");
}
toScribble()

Convierte el avatar en un objeto { __data, exists } compatible con Room.scribble() y userobj.scribble(). Devuelve { __data: null, exists: false } si el usuario no tiene avatar.

function onJoin(userobj) {
    if (userobj.avatar.exists)
        Room.scribble(userobj.avatar.toScribble());
}

BannedUser

Obtenido mediante Users.banned(fn).

name

Nombre del usuario baneado.

guid

GUID del usuario baneado.

externalIp  ·  localIp

IP del usuario baneado. Ambas devuelven el mismo valor en este servidor.

port

Puerto. Devuelve 0 en este servidor.

version

Versión del cliente. Devuelve cadena vacía en este servidor.

unban

Desbanea al usuario.

Users.banned(function (u) { u.unban(); }); // desbanear todos

CryptoResult

Devuelto por Crypto.md5hash() y Crypto.sha1hash().

toHex

Hash como cadena hexadecimal.

toBase64

Hash como cadena Base64.

toArray

Hash como array de bytes.

var h = Crypto.sha1hash("clave");
print(h.toHex);
print(h.toBase64);
print(h.toArray.join(","));

HttpRequestResult

Objeto recibido en el callback oncomplete de HttpRequest cuando la descarga tiene éxito. Si hay error, el callback recibe false.

page

El contenido descargado de la URL.

arg

El argumento pasado a download(arg).

IgnoreCollection

Obtenido mediante userobj.ignores. Cada elemento tiene una propiedad name y un método toString().

length

Número de usuarios ignorados.

var ig = userobj.ignores;
for (var i = 0; i < ig.length; i++)
    print("ignorando a " + ig[i].name);

Record

Cuentas registradas en la sala. Se itera con Users.records(fn).

guid

GUID del usuario registrado. Los demás campos dependen de los datos almacenados en la cuenta.

RegistryKeyCollection

Array de strings devuelto por Registry.getKeys().

length
var keys = Registry.getKeys();
for (var i = 0; i < keys.length; i++)
    print(keys[i] + " = " + Registry.getValue(keys[i]));

User

Obtenido mediante user(), Users.local() o desde eventos. Todos los usuarios son clientes web en este servidor — webClient siempre devuelve true y externalIp/localIp devuelven el mismo valor.

name

Nombre del usuario. Al asignarlo se notifica el cambio a todos los usuarios de la sala.

user(0).name = "nuevonombre";
id

ID numérico único de la sesión actual.

guid

Identificador único persistente del usuario.

level

Nivel de administrador (0=invitado, 1=moderador, 2=admin, 3+=owner). Al asignarlo se notifica a todos.

user(0).level = 1; // dar moderador
vroom

Sala virtual actual del usuario.

idle

true si el usuario está en estado inactivo.

externalIp  ·  localIp

Dirección IP del usuario. Ambas devuelven el mismo valor en este servidor.

joinTime

Timestamp Unix (ms) del momento en que el usuario se conectó. Devuelve 0 si no está disponible.

personalMessage

Mensaje personal del usuario. Al asignarlo se notifica a todos.

customName

Nombre personalizado del usuario.

owner

true si el usuario tiene level ≥ 3.

registered

true si el usuario tiene cuenta registrada en esta sala.

ignores

Colección de nombres ignorados por este usuario.

avatar

Avatar del usuario. Asignar null restaura el avatar por defecto de la sala.

user(0).avatar = null;
orgName

Nombre original del usuario. Igual a name en este servidor.

webClient

Siempre true — todos los usuarios son clientes web en este servidor.

version · country · region · font · dns · captcha

Siempre devuelven cadena vacía en este servidor.

gender · age · fileCount · port

Siempre devuelven 0 en este servidor.

linked · browsable · fastPing · ghost · customClient · visible

linked, browsable, fastPing, ghost, customClient siempre devuelven false. visible siempre devuelve true.

muzzled

Indica si el usuario está silenciado. Sus mensajes llegan solo a usuarios con nivel > 0; los demás no los ven. Al enviar un mensaje, el usuario silenciado recibe una notificación de bloqueo.

user(0).muzzled = true;   // silenciar
user(0).muzzled = false;  // desilenciar
cloaked

Stub — siempre devuelve false; asignar no tiene efecto en este servidor.

ban()

Banea al usuario y lo desconecta.

user(0).ban();
disconnect()

Desconecta al usuario.

user(0).disconnect();
sendText(text)

Envía un anuncio de sistema (texto de servidor) visible solo para este usuario. A diferencia del sendText global, aquí no se especifica remitente.

user(0).sendText("solo tú ves este mensaje");
sendEmote(text)

Envía un emote privado a este usuario, con el nombre de la sala como remitente.

user(0).sendEmote("hola mundo");
sendPM(text)

Envía un mensaje privado desde la sala (bot) a este usuario.

user(0).sendPM("mensaje privado desde el bot");
setTopic(text)

Establece el tema de la sala y lo notifica a todos los usuarios.

user(0).setTopic("nuevo tema");
setUrl(addr, text)

Agrega una URL a la lista de URLs de la sala.

user(0).setUrl("https://ejemplo.com", "enlace");
scribble(s)

Envía un scribble privado a este usuario. El remitente es el nombre de la sala.

var img = new Scribble().load("imagen.jpg");
user(0).scribble(img);
audio(s)

Envía audio a todos los usuarios del mismo vroom que este usuario. El remitente es el nombre de la sala.

var audio = new Audio().load("sonido.mp3");
user(0).audio(audio);
nudge() · redirect() · restoreAvatar()

Stubs — no tienen efecto en este servidor.

Audio

Carga un archivo de audio desde la carpeta data/ del script o lo descarga desde una URL. Usar con Room.audio() o userobj.audio().

load(filename)

Carga un archivo desde la carpeta data/. Devuelve la misma instancia para encadenar.

function onJoin(userobj) {
    var audio = new Audio().load("bienvenida.mp3");
    Room.audio(audio);
}
src

URL del audio a descargar. Se usa junto con download().

oncomplete

Callback ejecutado al terminar la descarga. Si fue exitosa, this.__data contiene los datos en Base64. Si falló, this.__data es null.

download()

Descarga el audio desde la URL en src. Sujeto a los mismos límites que HttpRequest (máx 5 concurrentes, 10 s timeout, 1 MB). Devuelve false si se alcanzó el límite de concurrencia.

var snd = new Audio();
snd.src = "https://ejemplo.com/sonido.mp3";
snd.oncomplete = function () {
    if (this.__data) Room.audio(this);
};
snd.download();

HttpRequest

Máximo 5 solicitudes concurrentes por script · timeout 10 s · límite 1 MB por respuesta. Soporta HTTP y HTTPS.

Ejemplo
var http = new HttpRequest();
http.src = "https://api.ejemplo.com/datos";
http.oncomplete = function (e) {
    if (e)
        print(e.page);
    else
        print("error en la solicitud");
};
http.download();
src

URL de la solicitud.

method

Método HTTP: "GET" (por defecto) o "POST".

params

Cuerpo de la solicitud para POST.

accept

Encabezado Accept.

userAgent

Encabezado User-Agent.

host

Encabezado Host.

utf

Codificación de la respuesta: true para UTF-8 (por defecto), false para Latin-1.

oncomplete

Callback ejecutado al terminar. Recibe false en error, o un objeto { page, arg } en éxito.

header(key, value)

Agrega un encabezado HTTP personalizado.

http.header("Authorization", "Bearer mi_token");
download(arg?)

Inicia la descarga. El argumento opcional se pasa de vuelta en e.arg del callback.

http.download();           // sin arg
http.download("dato");     // con arg

List

Colección dinámica de elementos mixtos con acceso por índice numérico (list[0]).

Ejemplo
var lista = new List();
lista.addRange(1, 2, 3, 4, 5);
lista.removeAll(function (q) { return q > 3; });
print(lista.join(", ")); // "1, 2, 3"
add(item)

Agrega un elemento al final. Devuelve el nuevo tamaño.

addRange(...items)

Agrega múltiples elementos al final.

clear()

Elimina todos los elementos.

count  ·  length

Número de elementos en la lista.

find(fn)

Primer elemento que cumple la condición, o null.

findAll(fn)

Nueva List con todos los elementos que cumplen la condición.

findIndex(fn)

Índice del primer elemento que cumple la condición (-1 si no se encuentra).

findLastIndex(fn)

Índice del último elemento que cumple la condición.

getRange(start, count)

Sublista desde start de longitud count.

indexOf(item)

Índice de la primera ocurrencia del elemento.

lastIndexOf(item)

Índice de la última ocurrencia del elemento.

insert(index, item)

Inserta un elemento en la posición indicada.

insertRange(index, ...items)

Inserta múltiples elementos a partir de la posición indicada.

remove(item)

Elimina la primera ocurrencia del elemento.

removeAll(fn)

Elimina todos los elementos que cumplen la condición.

removeAt(index)

Elimina el elemento en la posición indicada.

removeRange(start, count)

Elimina count elementos a partir de start.

reverse()

Invierte el orden de la lista en su lugar.

sort(fn)

Ordena la lista según una función de comparación.

lista.sort(function (x, y) { return x > y ? 1 : x < y ? -1 : 0; });
join(sep?)

Une todos los elementos con un separador. Por defecto usa coma.

print(lista.join(":")); // "1:2:3"
toArray()

Devuelve una copia de los elementos como array nativo de JavaScript.

Scribble

Carga una imagen desde la carpeta data/ del script o la descarga desde una URL. Usar con Room.scribble() o userobj.scribble().

load(filename)

Carga un archivo de imagen desde la carpeta data/. Devuelve la misma instancia para encadenar.

function onJoin(userobj) {
    var img = new Scribble().load("bienvenida.jpg");
    Room.scribble(img);
}
src

URL de la imagen a descargar. Se usa junto con download().

oncomplete

Callback ejecutado al terminar la descarga. Si la descarga fue exitosa, this.__data contiene los datos en Base64. Si falló, this.__data es null.

download()

Descarga la imagen desde la URL en src. Sujeto a los mismos límites que HttpRequest (máx 5 concurrentes, 10 s timeout, 1 MB). Devuelve false si se alcanzó el límite de concurrencia.

var img = new Scribble();
img.src = "https://ejemplo.com/imagen.png";
img.oncomplete = function () {
    if (this.__data) Room.scribble(this);
};
img.download();

Timer

Máximo 20 timers activos por script. Los timers se detienen automáticamente cuando el script se descarga.

Ejemplo
var ciclos = 0;
var timer = new Timer();
timer.interval = 2000;
timer.oncomplete = function () {
    print("tick " + (++ciclos));
    if (ciclos >= 10)
        timer.stop();
    else
        timer.start();
};
timer.start();
interval

Intervalo en milisegundos. Por defecto: 1000.

oncomplete

Función ejecutada en cada intervalo.

start()

Inicia el timer. Si ya estaba activo, lo reinicia.

stop()

Detiene el timer y lo elimina de la cuenta de timers activos.

Lista de eventos

Define estas funciones en tu script para reaccionar a eventos de la sala. Los eventos booleanos devuelven true para permitir y false para cancelar. Los eventos de transformación de texto devuelven un string modificado, false para cancelar, o nada para pasar el texto sin cambios.

// ── Ciclo de vida del script ──────────────────────────────────────────────

// Se ejecuta cuando el script termina de cargarse
function onLoad() { }

// Se ejecuta cada 1 segundo en todos los scripts
function onTimer() { }


// ── Usuarios: entrada y salida ────────────────────────────────────────────

// Antes de permitir que un usuario se una. Retornar false para rechazarlo.
function onJoinCheck(userobj) { return true; }

// Después de que un usuario se une
function onJoin(userobj) { }

// Cuando un usuario es rechazado al intentar unirse
function onRejected(userobj) { }

// Antes de que un usuario se desconecte
function onPartBefore(userobj) { }

// Después de que un usuario se desconecta
function onPart(userobj) { }


// ── Mensajes de texto público ─────────────────────────────────────────────

// Cuando se recibe texto público (sin alterar)
function onTextReceived(userobj, text) { }

// Antes de mostrar texto público.
// Retornar string para modificarlo, false para cancelarlo, o nada para dejarlo pasar.
function onTextBefore(userobj, text) { return text; }

// Después de mostrar texto público
function onTextAfter(userobj, text) { }


// ── Mensajes de emote ─────────────────────────────────────────────────────

// Cuando se recibe un emote (sin alterar)
function onEmoteReceived(userobj, text) { }

// Antes de mostrar un emote. Mismo comportamiento que onTextBefore.
function onEmoteBefore(userobj, text) { return text; }

// Después de mostrar un emote
function onEmoteAfter(userobj, text) { }


// ── Mensajes privados ─────────────────────────────────────────────────────

// Antes de enviar un PM. pm es un objeto modificable:
//   pm.contains(str)   → bool
//   pm.remove(str)     → elimina todas las ocurrencias de str
//   pm.replace(a, b)   → reemplaza todas las ocurrencias de a por b
// Retornar false para cancelarlo.
function onPMBefore(userobj, targetName, pm) { return true; }

// Cuando el bot (la sala) recibe un PM directamente. Retornar false para cancelar.
function onBotPM(userobj, text) { return true; }

// Después de que se muestra un PM
function onPM(userobj, targetName) { }


// ── Comandos ─────────────────────────────────────────────────────────────

// Cuando un usuario usa un comando (/ o #).
// command: nombre en minúsculas (ej. "paint")
// target: segunda palabra del comando
// args: resto del texto
function onCommand(userobj, command, target, args) { }

// Cuando un usuario usa #help
function onHelp(userobj) { }


// ── Perfil de usuario ─────────────────────────────────────────────────────

// Cuando un usuario sube un mensaje personal. Retornar false para cancelarlo.
function onPersonalMessage(userobj, msg) { return true; }

// Cuando un usuario sube un avatar. Retornar false para rechazarlo.
function onAvatar(userobj) { return true; }


// ── Flood ─────────────────────────────────────────────────────────────────

// Antes de expulsar a un usuario por flood. Retornar false para cancelarlo.
function onFloodBefore(userobj, msg) { return true; }

// Después de que un usuario es expulsado por flood
function onFlood(userobj) { }


// ── Ignorar ──────────────────────────────────────────────────────────────

// Antes de que un usuario ignore a alguien. Retornar false para cancelarlo.
function onIgnoring(userobj, targetName) { return true; }

// Después de que cambia el estado de ignorar/designorar.
// ignored=true: ignoró, ignored=false: designoró.
function onIgnoredStateChanged(userobj, targetName, ignored) { }


// ── Login y administración ────────────────────────────────────────────────

// Después de un login exitoso
function onLoginGranted(userobj) { }

// Después de un intento de login fallido
function onInvalidLoginAttempt(userobj) { }

// Después de un logout
function onLogout(userobj) { }

// Cuando cambia el nivel de administrador de un usuario
function onAdminLevelChanged(userobj) { }


// ── Vrooms ───────────────────────────────────────────────────────────────

// Antes de que un usuario cambie de vroom. Retornar false para cancelarlo.
function onVroomJoinCheck(userobj, vroom) { return true; }

// Después de que un usuario cambia de vroom
function onVroomJoin(userobj) { }


// ── Actividad ────────────────────────────────────────────────────────────

// Cuando un usuario pasa a estado inactivo (idle)
function onIdled(userobj) { }

// Cuando un usuario vuelve del estado inactivo.
// seconds = segundos que estuvo inactivo.
function onUnidled(userobj, seconds) { }


// ── Multimedia ───────────────────────────────────────────────────────────

// Cuando un usuario envía un buzz/nudge a otro
function onBuzz(userobj, targetName) { }

// Cuando un usuario envía un scribble a la sala
function onScribble(userobj) { }

// Cuando un usuario envía un audio a la sala
function onAudio(userobj) { }

// Cuando un usuario envía un scribble privado a otro
function onPMScribble(userobj, targetName) { }

// Cuando un usuario envía un audio privado a otro
function onPMAudio(userobj, targetName) { }

Compatibilidad

Diferencias respecto a la API de referencia cb0t/Ares.

Característica Estado Notas
Channels.search()No disponibleavailable y enabled devuelven false
Link (connect, disconnect, leaf…)No disponibleavailable y linked devuelven false
Spelling (check, confirm, suggest)No disponibleavailable devuelve false
Hashlink (encode, decode)StubSolo expone available: false
Query · Sql · XmlParserNo disponibleNo implementados
Constructor AvatarNo disponibleUsar Scribble o Audio en su lugar
User.nudge() · User.redirect() · User.restoreAvatar() · User.sendHTML()StubNo tienen efecto
User.cloakedStubSiempre false; asignar no tiene efecto
User.muzzledDisponibleLectura/escritura funcional
AvatarImage.save() · .toScribble()DisponibleAmbos implementados; devuelven false/{ exists:false } si no hay avatar
onPMBefore — parámetro pmExtensiónObjeto con .contains(), .remove(), .replace() (modifica el texto antes de enviarlo)
Room.audio() · User.audio()ExtensiónEnvío de audio, no existe en cb0t
Scribble.download() · Audio.download()ExtensiónDescarga de imagen/audio desde URL, no existe en cb0t
onBuzz · onScribble · onAudio · onPMScribble · onPMAudioExtensiónEventos propios de este servidor
User.webClientSiempre trueTodos los usuarios son clientes web
User.externalIp / localIpMismo valorNo se distinguen en este servidor
Constructor AudioDisponibleSimilar a Scribble
onLoad · onTimer · onJoin · onPart · onCommandDisponibleFuncionan igual que en cb0t
File · Registry · Base64 · Zip · Entities · CryptoDisponibleAPI completa disponible
Timer · List · HttpRequest · ScribbleDisponibleAPI completa disponible