
Ryujin은 Clairemont 봇을 위한 외교 연락 모듈입니다. 시스템 내의 다른 모듈들이 보안 및 관리를 담당하는 반면, Ryujin은 동맹 관계 구축, 공동 이니셔티브 조정, 길드 간 채널의 평온 유지에 중점을 둡니다. 이 모듈은 Nostrum을 활용한 Elixir 기반으로 구축되었으며, 고성능 작업을 위해 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 스크립트를 사용하여 개발용 봇을 실행합니다:
./run.sh
이 스크립트는 모든 도구(ffmpeg, yt-dlp 등)가 설치되어 있는지 확인하고, 데이터베이스 마이그레이션을 실행한 후, iex -S mix를 통해 Phoenix 애플리케이션을 시작합니다.
◆ PostgreSQL AGE 통합
이 프로젝트에는 그래프 쿼리를 위한 Apache AGE 확장 기능을 활성화하는 마이그레이션이 포함되어 있습니다. PostgreSQL 서버에 AGE를 설치한 후, run.sh 스크립트나 mix ecto.setup을 실행하면 데이터베이스에서 AGE가 활성화됩니다.
그러면 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와 통합되어 있습니다. mix compile을 실행하면 Elixir 코드와 Rust 코드가 함께 컴파일됩니다. src/lib.rs에 새로운 NIF를 추가하고, lib/ryujin.ex 모듈을 통해 Elixir에 노출시킵니다.
◆ 문제 해결
- "command not found":
chmod +x install.sh run.sh를 실행했는지 확인하십시오. - 오래된 바이너리:
vendor/디렉터리를 삭제하고./install.sh를 다시 실행하세요. - 데이터베이스가 존재하지 않음: PostgreSQL이 실행 중인지 확인한 후,
mix ecto.create를 실행하는./run.sh를 다시 실행하세요. - Connect Observer: 봇은 이름이 지정된 노드로 실행됩니다. 새 터미널을 열고 다음 명령을 실행하세요:
iex --sname observer --cookie ryujin_cookie
:observer.start()
