Ryujin은 Clairemont 봇의 외교 연락 모듈입니다. 시스템의 다른 모듈이 보안과 관리를 담당하는 반면, Ryujin은 동맹 관계 구축, 공동 이니셔티브 조정, 길드 간 채널의 평온 유지에 중점을 둡니다. Elixir와 Nostrum으로 구축되었으며, 고성능 작업을 위해 Rust 기반 기능으로 확장 가능합니다.
◆ 기능
- 동맹 중심 자동화: 인텐트는 다이렉트 메시지 및 길드 수준의 관계 관리를 위해 사전 구성됩니다.
- 음성 지원: FFmpeg, Streamlink 및 yt-dlp 지원이 번들로 제공되어 오디오 전송이 가능합니다.
- Rust 가속화: 계산 집약적 작업을 처리하기 위한 Rustler NIF용
native/ryujin크레이트를 포함합니다. - 스크립트 기반 설정: 로컬
install.sh및run.sh스크립트가 반복 가능한 설정을 위해 툴체인과 환경을 관리합니다.
◆ 사전 요구사항
- Elixir ≥ 1.18 (일치하는 Erlang/OTP 릴리스 포함)
- PostgreSQL (기본값:
localhost의postgres/postgres) - Python 3 (가상환경 내 Streamlink + yt-dlp용)
curl및tar(FFmpeg 다운로드용)- Rust 툴체인 (네이티브 확장 수정 시)
시작하기 전에 도우미 스크립트가 실행 가능한지 확인하세요:
chmod +x install.sh run.sh

◆ 설정
설정은 envs/에서 로드됩니다. 런타임은 envs/.env(공유 기본값)와 envs/dev.env 같은 환경별 파일을 병합합니다.
최소한 envs/.env에 Discord 토큰을 정의해야 합니다:
DISCORD_TOKEN=YOUR_DISCORD_TOKEN
런타임 스크립트는 자동으로 로컬 vendor/bin과 Python 가상환경을 PATH에 추가합니다.
◆ 설치
설치 프로그램은 Mix 종속성을 가져오고 필요한 미디어 바이너리를 로컬 vendor/ 디렉토리에 준비합니다:
./install.sh
이 스크립트는 다음을 수행합니다:
- Mix 종속성을 가져와 컴파일합니다.
- 정적 FFmpeg 빌드를 다운로드합니다.
- 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()
