Stanzas – Generadores de XML

El módulo stanzas contiene generadores de XML para todas las interacciones con el servidor XMPP de ToDus. Estos generadores son utilizados internamente por los mixins del cliente, pero también pueden ser usados directamente para personalizar comportamientos.

Estructura del Módulo

stanzas/
├── private.py      # Mensajes privados (texto, archivos, etc.)
├── group.py        # Mensajes de grupo
├── presence.py     # Presencia (online, offline, MUC)
├── utils.py        # Utilidades XMPP (IQ, ping, auth, MAM, upload)
├── channels.py     # Canales (crear, publicar, suscribir)
├── status.py       # Estados/Historias
├── privacy.py      # Privacidad
├── block.py        # Bloqueos
├── last.py         # Última conexión
├── location.py     # Ubicación (Near)
├── call.py         # Llamadas (TURN)
└── profile.py      # Cambio de @username

Uso Básico

Cada función retorna una cadena XML lista para enviar por el socket XMPP.

from todus.stanzas import private, group, presence, utils

# Mensaje privado
xml = private.message("5351111111@im.todus.cu", "Hola")
sock.send(xml.encode())

# Mensaje de grupo
xml = group.group_message("grupo@muclight.im.todus.cu", "Hola grupo")

# Presencia
xml = presence.presence("Online", priority=5)

Módulos Destacados

private.py – Mensajes Privados

FunciónDescripción
message(to, body, msg_id, msg_type, reply_to_id)Texto.
edit_message(to, new_body, original_msg_id, edit_id, reply_to_id)Edición.
file_message(to, url, file_type, caption, msg_id, file_name, file_size, reply_to_id)Archivo.
image_message(...)Imagen.
image_message_simple(...)Imagen simple.
button_message(to, text, buttons, msg_id, reply_to_id)Botones.
contact_message(...)Contacto.
sticker_message(...)Sticker.
video_message(...)Video.
delete_message(...)Eliminación.
location_message(...)Ubicación.
event_message(...)Evento.

Estructura de un botón:

button = {
    "text": "Enviar",
    "command": "cmd_type_send",
    "data": "Hola",
    "size": "0.82",        # FULL
    "color": "primary",    # opcional
    "row": True            # opcional
}

group.py – Mensajes de Grupo

Similar a private.py pero con t='gc' y destinados a JID de grupo.

Además incluye funciones para administración:

FunciónDescripción
group_update_name(to, name, msg_id)Cambiar nombre.
group_update_subject(to, subject, msg_id)Cambiar asunto.
group_update_avatar(to, avatar_url, msg_id)Cambiar avatar.
group_update_avatar_thumbnail(to, thumbnail_url, msg_id)Cambiar miniatura.
group_leave_iq(to, msg_id)Salir.
group_get_link_iq(to, msg_id)Obtener enlace.
group_set_link_iq(to, msg_id)Revocar enlace.
group_get_members_iq(to, msg_id)Lista miembros.
group_set_members_iq(to, affiliations, msg_id)Modificar roles.

presence.py

FunciónDescripción
presence(status, priority, show, caps)Presencia estándar.
muc_presence(group_jid, nickname)Unirse a grupo.
muc_unavailable(group_jid)Salir de grupo.

utils.py

FunciónDescripción
iq(type_, iq_id, payload, to)IQ genérico.
build_iq(type_, to, query)IQ con ID autogenerado.
ping(ping_id)Ping XMPP.
chat_state(to, state, msg_id, msg_type)Estado de escritura.
receipt(to, msg_id, receipt_id, msg_type)ACK de entrega.
read_receipt(to, msg_id, receipt_id, msg_type)ACK de lectura.
ack(msg_id, to)TDACK.
keepalive()Espacio en blanco.
stream_open(host)Inicio de stream.
stream_restart(host)Reinicio de stream.
stream_close()Cierre de stream.
sasl_auth(authstr)Autenticación SASL PLAIN.
bind(iq_id)Resource bind.
mam_query(query_id, since, before, limit)MAM (archivo de mensajes).
upload_query(iq_id, size, file_type, persistent, file_name)Reserva de subida.
download_query(iq_id, url)Resolución de descarga.

Canales, Estados, Privacidad, etc.

Estos módulos generan stanzas IQ para sus respectivos dominios. Todas las funciones reciben parámetros específicos y retornan XML con msg_id autogenerado.

Ejemplo con canales:

from todus.stanzas import channels

xml = channels.create_channel_iq(
    name="Mi Canal",
    link="micanal",
    public=1,
    desc="Descripción",
    picture="https://...",
    subs=["5351111111", "5352222222"]
)

Uso Avanzado: Envío Directo

Puedes enviar stanzas manualmente si necesitas un control total:

with client._xmpp_session(client.token) as sock:
    sock.send(xml.encode())