Ryujinni
Elixir

Ryujinni

La versión en Elixir del bot Clairemont de Discord, impulsado por Providence Network (Providentia).

GitHub|
imagen

Ryujin es el módulo de enlace diplomático del bot Clairemont. Mientras que otros módulos del sistema se encargan de la seguridad y la administración, Ryujin se centra en fomentar las relaciones con los aliados, coordinar iniciativas conjuntas y mantener la calma en los canales entre clanes. Está desarrollado en Elixir con Nostrum y diseñado para integrarse con funciones basadas en Rust para tareas de alto rendimiento.

◆ Características

  • Automatización centrada en las alianzas: Las intenciones están preconfiguradas para la gestión de mensajes directos y de las relaciones a nivel de gremio.
  • Compatible con voz: incluye soporte para FFmpeg, Streamlink y yt-dlp para la transmisión de audio.
  • Acelerado con Rust: Incluye un crate native/ryujin para que los NIF de Rustler gestionen tareas que requieren un gran esfuerzo computacional.
  • Configuración mediante scripts: Los scripts locales install.sh y run.sh gestionan la cadena de herramientas y el entorno para configuraciones repetibles.

◆ Requisitos previos

  • Elixir ≥ 1.18 (con una versión compatible de Erlang/OTP)
  • PostgreSQL (por defecto, postgres/postgres en localhost)
  • Python 3 (para Streamlink + yt-dlp en un entorno virtual)
  • curl y tar (para la descarga de FFmpeg)
  • Cadena de herramientas de Rust (si se modifica la extensión nativa)

Asegúrate de que los scripts auxiliares sean ejecutables antes de comenzar:

chmod +x install.sh run.sh

Informe del gráfico del repositorio

◆ Configuración

La configuración se carga desde envs/. El tiempo de ejecución fusiona envs/.env (valores predeterminados compartidos) y un archivo específico del entorno, como envs/dev.env.

Como mínimo, debes definir tu token de Discord en envs/.env:

DISCORD_TOKEN=TU_TOKEN_DE_DISCORD

Los scripts del entorno de ejecución añaden automáticamente el directorio local vendor/bin y el entorno virtual de Python a tu PATH.

◆ Instalación

El instalador descarga las dependencias de Mix y prepara los binarios multimedia necesarios localmente en el directorio vendor/:

./install.sh

Este script hará lo siguiente:

  1. Descargará y compilará las dependencias de Mix.
  2. Descargará una versión estática de FFmpeg.
  3. Creará un entorno virtual de Python para Streamlink y yt-dlp.

◆ Ejecución en desarrollo

Inicia el bot para el desarrollo utilizando el script de ejecución:

./run.sh

El script comprueba que todas las herramientas (ffmpeg, yt-dlp, etc.) estén presentes, ejecuta las migraciones de la base de datos e inicia la aplicación Phoenix mediante iex -S mix.

◆ Integración de PostgreSQL AGE

El proyecto incluye una migración para habilitar la extensión Apache AGE para consultas de grafos. Tras instalar AGE en tu servidor PostgreSQL, el script run.sh o mix ecto.setup lo habilitarán en la base de datos.

A continuación, puedes realizar consultas Cypher mediante Ecto.Repo.query/2:

Repo.query!("""
SELECT *
FROM cypher('ryujin_graph', $$
MATCH (n) RETURN n
$$) AS (node ag_catalog.agtype);
""")

◆ Extensión nativa de Rust

El crate native/ryujin está integrado con Rustler. El código de Elixir y Rust se compila conjuntamente con mix compile. Añade nuevas NIF en src/lib.rs y expónlas a Elixir a través del módulo lib/ryujin.ex.

◆ Solución de problemas

  • «comando no encontrado»: Asegúrate de haber ejecutado chmod +x install.sh run.sh.
  • Binarios obsoletos: Elimina el directorio vendor/ y vuelve a ejecutar ./install.sh.
  • La base de datos no existe: Asegúrate de que PostgreSQL está en ejecución y vuelve a ejecutar ./run.sh, que ejecuta mix ecto.create.
  • Conectar Observer: El bot se ejecuta como un nodo con nombre. Abre un nuevo terminal y ejecuta:
iex --sname observer --cookie ryujin_cookie
:observer.start()