
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(virtualenv 内の 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 と統合されています。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 が実行されていることを確認し、
mix ecto.createを実行する./run.shを再実行してください。 - Connect Observer: ボットは名前付きノードとして実行されます。新しいターミナルを開き、以下を実行してください:
iex --sname observer --cookie ryujin_cookie
:observer.start()
