diff --git a/Chats.md b/Chats.md new file mode 100644 index 0000000..627bfc6 --- /dev/null +++ b/Chats.md @@ -0,0 +1,64 @@ +# Chats + +> ⚠ Rama experimental, no oficial. El Oasis oficial es +> https://github.com/epsylon/oasis · [Volver a la portada](Home) + +Los chats de Oasis son **salas cifradas que sí se guardan**: cada mensaje se publica +firmado en tu registro SSB y se replica a quien te siga. Son lo contrario de +[Karvan](Karvan), que no guarda nada. + +Esta rama no cambia cómo funcionan. Le añade una cosa: **responder citando** un +mensaje anterior. + +--- + +## La pantalla + +![Chat en el escritorio](img/04-chat.png) + +En escritorio el chat se abre en dos columnas: a la izquierda la ficha de la sala +—imagen, estado **OPEN**, etiqueta **E2E**, participantes, etiquetas—, y a la derecha +el hilo de mensajes con el formulario debajo. + +Arriba, los filtros de siempre: ALL, MINE, RECENT, FAVORITES, OPEN, CLOSED y +**Create Chat**. + +--- + +## Responder citando + +![Respuesta con cita](img/05-chat-respuesta.png) + +Cada burbuja tiene una **flecha ↩**. Al pulsarla, el formulario de abajo se prepara +para responder a ese mensaje: aparece una cita con el autor y el principio del texto, +y una **✕** para cancelar. + +Al enviar, la respuesta sale con la cita dentro —la barra amarilla de la última +burbuja de la captura—, así que se ve a qué contesta sin tener que buscarlo. + +### Cómo está hecho + +Sin JavaScript en el cliente, como el resto de Oasis: + +1. El botón ↩ es un enlace a `?replyTo=#chat-compose`. +2. El backend lee ese parámetro y se lo pasa a la vista. +3. La vista pinta la cita sobre el formulario y añade un campo oculto `replyTo`. +4. Al enviar, el identificador viaja con el mensaje y **se guarda dentro de él**. +5. Al pintar el hilo, la vista arma un índice de mensajes por identificador y resuelve + cada cita contra él. + +Si el mensaje citado ya no está —se borró, o es más viejo que lo que se carga—, la +burbuja sale sin cita en lugar de romperse. + +--- + +## Cuándo usar cada cosa + +| | Chats | [Karvan](Karvan) | +|---|---|---| +| Dónde viven los mensajes | En tu registro SSB, en disco | Solo en memoria | +| Cuánto duran | Para siempre | Hasta que vence la sala | +| Se replican a la red | Sí | No | +| Quién puede entrar | Miembros del chat | Quien tenga el enlace | +| Llamadas | No | Sí | +| Sirve para | Lo que quieres conservar | Lo que no | diff --git a/Diferencias.md b/Diferencias.md new file mode 100644 index 0000000..bec819a --- /dev/null +++ b/Diferencias.md @@ -0,0 +1,65 @@ +# Diferencias con la versión de móvil + +> ⚠ Rama experimental, no oficial. El Oasis oficial es +> https://github.com/epsylon/oasis · [Volver a la portada](Home) + +Hay dos repositorios hermanos: + +| | | +|---|---| +| **OASIS_LINUX** (este) | Oasis de escritorio + Karvan + respuesta citada | +| **[OASIS_MOBILE](https://gitea.laenre.net/hacklab/OASIS_MOBILE)** | Lo mismo, más una interfaz propia para Android y su envoltorio | + +Las funciones son las mismas. Lo que cambia es cómo se llega a ellas. + +--- + +## La navegación + +| | Escritorio | Móvil | +|---|---|---| +| Menú | Dos columnas laterales, agrupadas por temas | Panal de hexágonos en el inicio | +| Acceso rápido | No hay | Barra inferior con cuatro módulos a elegir | +| Filtros | No hay | Personal / Community, reducen el panal a la mitad | +| Nombres de las categorías | Los de epsylon: Community, Library, Multiverse | Los de la rama: Network, Media, Fediverse | + +Esa última fila es una decisión, no un descuido. La versión de móvil viene de antes y +sus nombres estaban ya en uso; la de escritorio se mantiene pegada a upstream para que +cada versión nueva de epsylon se integre sin conflictos. + +## Las llamadas + +En el escritorio **los permisos los pide el navegador**, que es como funciona la web +desde siempre: pulsas Call y Firefox o Chromium preguntan por la cámara. + +En Android hace falta que la aplicación declare los permisos al compilar **y** que su +envoltorio implemente `WebChromeClient.onPermissionRequest`. La APK oficial no hace +ninguna de las dos cosas, y por eso la rama de móvil trae su propio proyecto Gradle. +Está contado en +[su wiki](https://gitea.laenre.net/hacklab/OASIS_MOBILE/wiki/Llamadas). + +En resumen: **en escritorio las llamadas no necesitaban desbloquear nada**. + +## El código + +El módulo Karvan es **el mismo fichero por fichero** en los dos repositorios: modelo, +vista, rutas, cliente WebRTC y estilos. Se decidió duplicar y adaptar en vez de +extraer un paquete común, porque un paquete compartido obligaría a versionar y +publicar por separado algo que todavía cambia cada semana. + +Lo que sí difiere: + +- `src/views/fork/hive_nav.js` —el panal, la topbar y la barra inferior— existe en los + dos, pero sus funciones empiezan con `if (process.env.OASIS_MOBILE !== '1') return "";`, + así que en escritorio no dibujan nada. Está en ambos para que `main_views.js` sea + idéntico y las actualizaciones de upstream se apliquen una sola vez. +- El fichero de traducciones de la rama, `i18n_fork.js`, tiene en móvil las claves de + la interfaz propia; en escritorio solo las del módulo Karvan. +- `android/` solo existe en el repositorio de móvil. + +## Qué se comparte de verdad + +Una sala de Karvan creada en el móvil **se puede abrir en el ordenador** si los dos +nodos se replican: la invitación viaja como mensaje privado de SSB y el nodo que la +recibe adopta la sala. Ese es el puente entre los dos, y es también la parte que deja +de ser efímera —el mensaje privado queda en el registro para siempre—. diff --git a/Home.md b/Home.md index 2e4c666..1d7c252 100644 --- a/Home.md +++ b/Home.md @@ -19,44 +19,51 @@ Versión base: **Oasis 0.9.5**. Rama: `PRUEBAS`. ## Qué añade respecto al oficial -Una sola cosa, pero grande: **Karvan**, un módulo de salas efímeras con llamadas. +Dos cosas, y ninguna cambia la interfaz que ya conoces: -![Oasis de escritorio con el menú lateral](img/01-escritorio-menu.png) +- **[Karvan](Karvan)**, un módulo de salas efímeras con llamadas de audio y vídeo. +- **Responder citando** en los [chats](Chats) de Oasis. -El resto es Oasis 0.9.5 tal cual. La interfaz es la del proyecto original: el menú -lateral por grupos, no la rejilla de hexágonos, que es de la versión para móvil. +El resto es Oasis 0.9.5 tal cual: el menú lateral por grupos del proyecto original, no +la rejilla de hexágonos, que es de la versión para móvil. -| | | +![Oasis de escritorio](img/08-portada.png) + +| Página | De qué va | |---|---| -| **[Karvan](Karvan)** | Salas que viven solo en memoria y se autodestruyen | -| **[Llamadas](Llamadas)** | Audio y vídeo sobre WebRTC, sin servidores de terceros | -| **[Instalar](Instalar)** | Igual que el oficial | +| **[Instalar](Instalar)** | Puesta en marcha, TURN y avisos antes de tocar tu `~/.ssb` | +| **[Karvan](Karvan)** | Salas efímeras: crearlas, entrar, invitar, qué protege y qué no | +| **[Llamadas](Llamadas)** | WebRTC sin servidores de terceros, y cómo montar un TURN propio | +| **[Chats](Chats)** | Los chats cifrados, con respuesta citada | +| **[Temas](Temas)** | Cómo se ve el módulo con los cuatro temas | +| **[Diferencias con la versión de móvil](Diferencias)** | Qué cambia y por qué | | **[Estado](Roadmap)** | Qué funciona y qué no | +Todas las capturas de esta wiki están tomadas de esta rama funcionando en un navegador +real. Lo que se ve es lo que sale. + --- -## Instalación +## Karvan, de un vistazo -Exactamente igual que el Oasis oficial: +![Sala de Karvan](img/02-karvan-sala.png) -```sh -cd src/server && npm install -cd ../.. && ./oasis.sh -``` - -Karvan aparece en el menú lateral, en el grupo de comunicación, junto a los chats. Se -puede apagar desde `/modules` como cualquier otro módulo. +Una sala efímera: el tiempo que le queda arriba a la derecha, los botones de llamada, +y los mensajes, que **solo viven en la memoria del proceso**. Al vencer el plazo +desaparece todo. Explicado en detalle en **[Karvan](Karvan)**. --- ## Relación con la versión para móvil -Hay un repositorio hermano, **OASIS_MOBILE**, con la versión de Android: misma base y -mismo módulo Karvan, pero con una interfaz distinta pensada para el pulgar. +Hay un repositorio hermano, +**[OASIS_MOBILE](https://gitea.laenre.net/hacklab/OASIS_MOBILE)**, con la versión de +Android: misma base y mismo módulo Karvan, pero con una interfaz distinta pensada para +el pulgar. El código de Karvan es el mismo en ambos. Lo que cambia es el enganche: aquí un enlace en el menú lateral siguiendo el patrón del proyecto original, allí una rejilla de -hexágonos. +hexágonos. Está desarrollado en **[Diferencias](Diferencias)**. --- diff --git a/Instalar.md b/Instalar.md index caf845c..42ae8c7 100644 --- a/Instalar.md +++ b/Instalar.md @@ -13,9 +13,49 @@ cd ../.. && ./oasis.sh Abre `http://localhost:3000`. +Al arrancar verás en el terminal el resumen de siempre y, al final, +`Modules loaded: [ 999 ]`. Eso significa que el backend está en pie. + ## Activar Karvan -Viene activado. Si no lo ves en el menú lateral, míralo en `/modules`. +Viene activado. Si no lo ves en el menú lateral, míralo en `/modules`: aparece entre +Jobs y L.A.R.P. + +![Karvan en la pantalla de módulos](img/07-modules.png) + +## Varias identidades en el mismo equipo + +Esta rama admite más de una cuenta. La variable `OASIS_ACCOUNT` decide **dónde vive +todo**: el `secret`, la base de datos y los blobs. + +```sh +./oasis.sh # la de siempre, en ~/.ssb +OASIS_ACCOUNT=pruebas ./oasis.sh # otra identidad, en ~/.pruebas +``` + +El nombre se valida (letras, números, guion y guion bajo, hasta 32 caracteres) porque +acaba formando rutas de fichero y hay operaciones destructivas —el modo pánico borra +el directorio de la cuenta— que no deben poder apuntar fuera de sitio. + +Sirve para probar esta rama **sin tocar tu identidad real**, que es lo recomendable: + +```sh +OASIS_ACCOUNT=pruebas ./oasis.sh gui --host=127.0.0.1 --port=3010 +``` + +> Todavía **no hay selector en la interfaz**: se elige al arrancar. Ver +> [Estado](Roadmap). + +## Si los iconos se ven como cuadros + +Oasis usa caracteres Unicode poco comunes para los iconos del menú. Si te salen como +□, tu sistema no tiene una fuente que los cubra: + +```sh +sudo apt install fonts-noto-core # Debian, Ubuntu y derivadas +``` + +No es un fallo de Oasis y no afecta a nada más que a cómo se ve. ## Configurar un TURN diff --git a/Karvan.md b/Karvan.md index 62d7983..44ca576 100644 --- a/Karvan.md +++ b/Karvan.md @@ -6,16 +6,74 @@ Salas de chat que **viven solo en memoria** y se destruyen solas. Nada se escribe en disco ni en el registro de SSB. +--- -## Cómo funciona +## Recorrido completo, paso a paso -Al crear una sala eliges cuánto vive. A partir de ahí: +### 1. Encontrar Karvan -- **Se autodestruye por inactividad** (30 minutos por defecto) y **por tiempo - absoluto** (2 horas), lo que ocurra antes. El plazo absoluto no se renueva con la - actividad: la sala muere igual. -- Al vencer, **se borra todo**: mensajes, señales y la lista de miembros. -- Si reinicias Oasis, las salas desaparecen. Es lo correcto: solo existían en memoria. +![Menú lateral con Karvan](img/03-menu-lateral.png) + +Karvan está en el menú lateral derecho, dentro de **Community**, al final de la lista, +detrás de Chats. Es un enlace normal del menú, hecho con el mismo patrón que los +demás. + +> Si los iconos del menú se ven como cuadros vacíos (□), no es un fallo de Oasis: le +> falta a tu sistema una fuente con cobertura Unicode amplia. En Debian y derivadas se +> arregla con `apt install fonts-noto-core`. + +### 2. Crear una sala + +![Karvan · Ephemeral rooms](img/01-karvan-lista.png) + +La pantalla tiene dos partes. Arriba el formulario: un **nombre opcional** y **cuánto +vive** —30 minutos, 2 horas u 8 horas—, con el botón **Create ephemeral room**. + +Debajo, **Active rooms**: las salas que existen ahora mismo en este nodo, con su +número de mensajes y lo que les queda de vida. + +Sin nombre, la sala se llama por su identificador. El nombre no es una credencial: no +sirve para entrar, solo para reconocerla en la lista. + +### 3. Dentro de la sala + +![Sala con mensajes](img/02-karvan-sala.png) + +De arriba abajo: + +- **‹ Rooms** vuelve a la lista, el nombre de la sala en el centro, y a la derecha el + tiempo que le queda. Ese contador baja siempre; no se renueva porque haya + conversación. +- **server relay** con un punto gris: por dónde van los mensajes ahora mismo. Gris es + a través del servidor; se pone verde cuando hay canal directo entre navegadores. +- Los **botones de llamada**: 📞 Call, micrófono, cámara y colgar. Ver + **[Llamadas](Llamadas)**. +- Los **mensajes**, y más abajo el campo para escribir y el de invitar por `@feed-id`. + +### 4. Invitar a alguien + +Dos formas: + +**Pasar el enlace** — el identificador de la sala son 72 bits al azar y es la única +credencial que existe. + +**Invitar por identidad** — se pega el `@feed-id` de un contacto y Oasis le manda un +**mensaje privado de SSB** con el enlace dentro, sin publicarlo en ningún sitio. + +--- + +## Cuánto vive una sala + +Dos relojes corren a la vez, y se destruye con el que llegue antes: + +| | | +|---|---| +| **Por inactividad** | 30 minutos sin actividad. Este sí se reinicia con cada mensaje | +| **Por tiempo absoluto** | El que elegiste al crearla. **No** se reinicia nunca | +| **Tope duro** | 24 horas, aunque se pida más | + +Al vencer, **se borra todo**: mensajes, señales y la lista de miembros. Si reinicias +Oasis, las salas desaparecen: es lo correcto, solo existían en memoria. ## Quién puede entrar diff --git a/Llamadas.md b/Llamadas.md index b574a14..6d6ec5a 100644 --- a/Llamadas.md +++ b/Llamadas.md @@ -7,13 +7,35 @@ Dentro de una sala de [Karvan](Karvan) hay un botón de llamada. El audio y el v van **directamente entre los participantes** por WebRTC, cifrados de extremo a extremo por el propio protocolo. +## Los botones + +![Panel de llamada dentro de una sala](img/02-karvan-sala.png) + +Están dentro de la sala, encima de los mensajes, y son cuatro: + +| | | +|---|---| +| **📞 Call** | Inicia la llamada. Es el que dispara la petición de permisos | +| **🎤** | Silencia y devuelve el micrófono sin colgar | +| **🎥** | Apaga y enciende la cámara sin colgar | +| **⛔** | Cuelga y devuelve la sala a su estado inicial | + +Mientras hay llamada, los tres primeros se ponen encendidos y debajo aparece el estado +(`mic ON · cam ON`). El vídeo propio y el de los demás salen encima de la barra, en +una rejilla que se adapta al número de participantes. + +Los mensajes de la sala siguen funcionando durante la llamada: no hay que elegir entre +hablar y escribir. + ## Permisos de cámara y micrófono En escritorio los pide el navegador directamente, la primera vez que inicias una llamada. No hay nada especial que configurar. -En la versión de Android hizo falta un envoltorio propio para poder concederlos; aquí -no aplica. +En la versión de Android hizo falta un envoltorio propio para poder concederlos, +porque la APK oficial ni declara los permisos ni implementa el método que se los +concede al contenido web. Aquí no aplica: eso lo resuelve el navegador. Ver +[Diferencias](Diferencias). ## Sin servidores de terceros diff --git a/Roadmap.md b/Roadmap.md index cfa5155..fa09639 100644 --- a/Roadmap.md +++ b/Roadmap.md @@ -3,22 +3,41 @@ > ⚠ Rama experimental, no oficial. El Oasis oficial es > https://github.com/epsylon/oasis · [Volver a la portada](Home) +Sin fechas: esto se hace cuando se puede. + ## Hecho - Base **Oasis 0.9.5**, al día con el proyecto oficial. - **[Karvan](Karvan)** con su enlace en el menú lateral, siguiendo el mismo patrón que - el resto de módulos. -- Estilos del módulo en su propia hoja, para que se vea igual con cualquier tema. + el resto de módulos, y su fila en `/modules` en orden alfabético. +- Estilos del módulo en su propia hoja, cargada después del tema, **probada con los + cuatro temas**. Ver [Temas](Temas). +- **Responder citando** en los [chats](Chats), sin JavaScript en el cliente. - **Sin STUN de terceros**, con configuración para TURN propio. +- **Multicuenta en el arranque**: `OASIS_ACCOUNT=` levanta una identidad + separada en `~/.`, con su propio `secret`, su base de datos y sus blobs. + +## En curso + +- **Selector de identidad en la interfaz.** La base está —el arranque ya soporta + varias cuentas— pero falta la pantalla para cambiar de una a otra, que además tiene + que reiniciar el proceso. +- Poner en marcha un TURN en un pub, para las llamadas fuera de la red local. ## Sin empezar -- Poner en marcha un TURN en un pub. -- Varias identidades en el mismo equipo con cambio desde la interfaz. - Empaquetado `.deb` de esta rama. +- Automatizar la construcción cuando el proyecto oficial publica una versión. + +## Probado y no probado + +**Probado**: arranque con cuenta aislada, crear salas, mensajes, respuesta citada, +`/modules`, los cuatro temas, y el panel de llamada en su sitio. + +**No probado**: una llamada real entre dos equipos distintos con TURN de por medio. +Lo que está verificado es que el panel se dibuja bien y que el navegador pide los +permisos; la negociación entre dos nodos separados por NAT está pendiente. ## Diferencias con la versión para móvil -La versión de Android lleva además una interfaz propia (hexágonos, barra de accesos -rápidos) y algunos módulos recortados por peso. Aquí no: la interfaz es la del -proyecto original y están todos los módulos. +Están en su propia página: **[Diferencias](Diferencias)**. diff --git a/Temas.md b/Temas.md new file mode 100644 index 0000000..5bf4e62 --- /dev/null +++ b/Temas.md @@ -0,0 +1,55 @@ +# Temas + +> ⚠ Rama experimental, no oficial. El Oasis oficial es +> https://github.com/epsylon/oasis · [Volver a la portada](Home) + +Oasis trae cuatro temas y se cambian en **Settings**. Karvan funciona con los cuatro. + +![Karvan con los cuatro temas](img/06-temas.png) + +De izquierda a derecha y de arriba abajo: **Dark-SNH** (el de fábrica), **Clear-SNH**, +**Matrix-SNH** y **Purple-SNH**. La misma sala, el mismo módulo. + +--- + +## Por qué Karvan tiene su propia hoja de estilos + +El módulo trae `karvan.css`, aparte de los temas. Es el mismo patrón que usa +`highlight.css` en el proyecto original: una hoja que no pertenece a ningún tema +concreto porque define **la forma** —las burbujas, los botones redondos de llamada, la +rejilla de vídeo— y no los colores de la interfaz. + +Se carga después del tema, así que la forma del módulo se mantiene con cualquiera de +los cuatro. + +## La excepción: el tema claro + +**Clear-SNH** usa `!important` en casi todas sus reglas, así que gana siempre sobre +cualquier hoja posterior. Es una decisión del tema, no un fallo, y no tiene sentido +pelearse con ella a base de más `!important`. + +La solución es la que ya usa Oasis: **que el tema pinte el módulo**. Clear-SNH lleva +al final un bloque que traduce Karvan a su paleta clara —burbujas color crema, texto +oscuro, títulos naranja—, igual que hace con el resto de la interfaz. + +Sin ese bloque, las burbujas salían negras sobre fondo blanco y el texto secundario en +amarillo pálido, ilegible. Se ve la diferencia comparando la captura de arriba a la +derecha con cualquier versión anterior. + +--- + +## Si añades un tema + +Basta con copiar uno de los cuatro y cambiarle los colores: Karvan no necesita nada +más, porque su forma viene de `karvan.css`. + +Solo si tu tema usa `!important` —como Clear-SNH— tendrás que añadirle un bloque +propio para el módulo. La lista de clases que conviene cubrir: + +``` +.karvan-back .karvan-room-title .kr-title títulos y navegación +.karvan-sub .karvan-expire .karvan-live .kr-meta textos secundarios +.karvan-room-item cada sala de la lista +.karvan-msg .karvan-msg-self las burbujas +.km-from .km-text autor y texto del mensaje +``` diff --git a/_Sidebar.md b/_Sidebar.md new file mode 100644 index 0000000..07bd827 --- /dev/null +++ b/_Sidebar.md @@ -0,0 +1,22 @@ +### Oasis Linux · rama `PRUEBAS` + +**⚠ No es Oasis oficial** +[El oficial es este](https://github.com/epsylon/oasis) + +--- + +- [Portada](Home) +- [Instalar](Instalar) +- [Karvan · salas efímeras](Karvan) +- [Llamadas](Llamadas) +- [Chats](Chats) +- [Temas](Temas) + +--- + +- [Diferencias con móvil](Diferencias) +- [Estado](Roadmap) + +--- + +[Versión de Android](https://gitea.laenre.net/hacklab/OASIS_MOBILE) diff --git a/img/01-escritorio-menu.png b/img/01-escritorio-menu.png deleted file mode 100644 index 98f3bcb..0000000 Binary files a/img/01-escritorio-menu.png and /dev/null differ diff --git a/img/01-karvan-lista.png b/img/01-karvan-lista.png new file mode 100644 index 0000000..bc4d027 Binary files /dev/null and b/img/01-karvan-lista.png differ diff --git a/img/02-karvan-sala.png b/img/02-karvan-sala.png new file mode 100644 index 0000000..2d98f90 Binary files /dev/null and b/img/02-karvan-sala.png differ diff --git a/img/03-menu-lateral.png b/img/03-menu-lateral.png new file mode 100644 index 0000000..119b308 Binary files /dev/null and b/img/03-menu-lateral.png differ diff --git a/img/04-chat.png b/img/04-chat.png new file mode 100644 index 0000000..917b2ae Binary files /dev/null and b/img/04-chat.png differ diff --git a/img/05-chat-respuesta.png b/img/05-chat-respuesta.png new file mode 100644 index 0000000..ecc173b Binary files /dev/null and b/img/05-chat-respuesta.png differ diff --git a/img/06-temas.png b/img/06-temas.png new file mode 100644 index 0000000..93077d6 Binary files /dev/null and b/img/06-temas.png differ diff --git a/img/07-modules.png b/img/07-modules.png new file mode 100644 index 0000000..b0557ca Binary files /dev/null and b/img/07-modules.png differ diff --git a/img/08-portada.png b/img/08-portada.png new file mode 100644 index 0000000..dac876c Binary files /dev/null and b/img/08-portada.png differ