Ryujinni
Elixir

Ryujinni

Discord의 Clairemont 봇의 Elixir 버전으로, Providence Network(Providentia)에서 구동됩니다.

image

Ryujin은 Clairemont 봇의 외교 연락 모듈입니다. 시스템의 다른 모듈이 보안과 관리를 담당하는 반면, Ryujin은 동맹 관계 구축, 공동 이니셔티브 조정, 길드 간 채널의 평온 유지에 중점을 둡니다. Elixir와 Nostrum으로 구축되었으며, 고성능 작업을 위해 Rust 기반 기능으로 확장 가능합니다.

◆ 기능

  • 동맹 중심 자동화: 인텐트는 다이렉트 메시지 및 길드 수준의 관계 관리를 위해 사전 구성됩니다.
  • 음성 지원: FFmpeg, Streamlink 및 yt-dlp 지원이 번들로 제공되어 오디오 전송이 가능합니다.
  • Rust 가속화: 계산 집약적 작업을 처리하기 위한 Rustler NIF용 native/ryujin 크레이트를 포함합니다.
  • 스크립트 기반 설정: 로컬 install.shrun.sh 스크립트가 반복 가능한 설정을 위해 툴체인과 환경을 관리합니다.

◆ 사전 요구사항

  • Elixir ≥ 1.18 (일치하는 Erlang/OTP 릴리스 포함)
  • PostgreSQL (기본값: localhostpostgres/postgres)
  • Python 3 (가상환경 내 Streamlink + yt-dlp용)
  • curltar (FFmpeg 다운로드용)
  • Rust 툴체인 (네이티브 확장 수정 시)

시작하기 전에 도우미 스크립트가 실행 가능한지 확인하세요:

chmod +x install.sh run.sh

Repository Chart Report

◆ 설정

설정은 envs/에서 로드됩니다. 런타임은 envs/.env(공유 기본값)와 envs/dev.env 같은 환경별 파일을 병합합니다.

최소한 envs/.env에 Discord 토큰을 정의해야 합니다:

DISCORD_TOKEN=YOUR_DISCORD_TOKEN

런타임 스크립트는 자동으로 로컬 vendor/bin과 Python 가상환경을 PATH에 추가합니다.

◆ 설치

설치 프로그램은 Mix 종속성을 가져오고 필요한 미디어 바이너리를 로컬 vendor/ 디렉토리에 준비합니다:

./install.sh

이 스크립트는 다음을 수행합니다:

  1. Mix 종속성을 가져와 컴파일합니다.
  2. 정적 FFmpeg 빌드를 다운로드합니다.
  3. Streamlink와 yt-dlp용 Python 가상환경을 생성합니다.

◆ 개발 모드 실행

실행 스크립트를 사용하여 개발용 봇을 실행하세요:

./run.sh

이 스크립트는 모든 도구(ffmpeg, yt-dlp 등)가 있는지 확인하고, 데이터베이스 마이그레이션을 실행하며, iex -S mix를 통해 Phoenix 애플리케이션을 시작합니다.

◆ PostgreSQL AGE 통합

이 프로젝트에는 그래프 쿼리를 위한 Apache AGE 확장을 활성화하는 마이그레이션이 포함되어 있습니다. PostgreSQL 서버에 AGE를 설치한 후, run.sh 스크립트나 mix ecto.setup이 데이터베이스에서 이를 활성화합니다.

그런 다음 Ecto.Repo.query/2를 통해 Cypher 쿼리를 실행할 수 있습니다:

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

◆ 네이티브 Rust 확장

native/ryujin 크레이트는 Rustler와 통합되어 있습니다. Elixir와 Rust 코드는 mix compile로 함께 컴파일됩니다. src/lib.rs에 새 NIF를 추가하고 lib/ryujin.ex 모듈을 통해 Elixir에 노출하세요.

◆ 문제 해결

  • "command not found": chmod +x install.sh run.sh를 실행했는지 확인하세요.
  • 오래된 바이너리: vendor/ 디렉토리를 제거하고 ./install.sh를 다시 실행하세요.
  • 데이터베이스가 존재하지 않음: PostgreSQL이 실행 중인지 확인하고 ./run.sh를 다시 실행하세요. 이 스크립트는 mix ecto.create를 실행합니다.
  • Observer 연결: 봇은 명명된 노드로 실행됩니다. 새 터미널을 열고 다음을 실행하세요:
iex --sname observer --cookie ryujin_cookie
:observer.start()