Ryujinni
Elixir

Ryujinni

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

image

Ryujin es el módulo de enlace diplomático para el bot Clairemont. Mientras que otros módulos del sistema manejan la seguridad y la administración, Ryujin se enfoca en cultivar relaciones aliadas, coordinar iniciativas conjuntas y mantener la calma en los canales entre gremios. Está construido en Elixir con Nostrum y diseñado para extenderse a funciones basadas en Rust para tareas de alto rendimiento.

◆ Características

  • Automatización Centrada en Alianzas: Los intents están preconfigurados para la gestión de relaciones a nivel de mensajes directos y gremios.
  • Capacidad de Voz: Incluye soporte para FFmpeg, Streamlink y yt-dlp para la reproducción de audio.
  • Acelerado con Rust: Incluye un crate native/ryujin para NIFs de Rustler que manejan tareas computacionalmente intensivas.
  • Configuración Scripteada: Los scripts locales install.sh y run.sh gestionan el toolchain 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 virtualenv)
  • curl y tar (para la descarga de FFmpeg)
  • Toolchain 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

Repository Chart Report

◆ Configuración

La configuración se carga desde envs/. El runtime combina 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 de runtime añaden automáticamente el directorio local vendor/bin y el virtualenv de Python a tu PATH.

◆ Instalación

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

./install.sh

Este script:

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

◆ Ejecución en Desarrollo

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

./run.sh

El script verifica 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 con PostgreSQL AGE

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

Luego puedes realizar consultas Cypher a través de Ecto.Repo.query/2:

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

◆ Extensión Nativa en Rust

El crate native/ryujin está integrado con Rustler. El código de Elixir y Rust se compila junto con mix compile. Agrega nuevos NIFs en src/lib.rs y exponlos a Elixir a través del módulo lib/ryujin.ex.

◆ Solución de Problemas

  • "command not found": 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 nombrado. Abre una nueva terminal y ejecuta:
iex --sname observer --cookie ryujin_cookie
:observer.start()