# ai.bot 開発ガイド

## プロジェクト概要

ai.botは、Rust製のBluesky(AT Protocol)ボットです。メンション応答、コマンド実行、OpenAI統合などの機能を提供します。

**重要**: 2025年6月6日より、パッケージ名とCLI名が統一されました:
- **新CLI名**: `aibot` (推奨)
- **旧CLI名**: `ai` (互換性維持)
- **設定ディレクトリ**: `~/.config/syui/ai/bot/` (旧: `~/.config/ai/`)

詳細は[移行ガイド](./migration-guide.md)を参照してください。

## アーキテクチャ

### 主要コンポーネント

1. **HTTPクライアント** (`src/http_client.rs`)
   - AT Protocol API呼び出しの統一インターフェース
   - 認証処理の自動化
   - エラーハンドリングの標準化

2. **コマンドシステム** (`src/main.rs`)
   - Seahorseを使用したCLIインターフェース
   - 各機能への振り分け

3. **AT Protocolモジュール**
   - 投稿、フォロー、いいね等の基本機能
   - 認証・セッション管理
   - フィード・通知処理

4. **ゲームシステム** (`src/game/`)
   - カードゲーム機能
   - ユーザー管理
   - ゲームデータ処理

5. **外部連携**
   - OpenAI API統合 (`src/openai.rs`)
   - 画像処理機能

## 開発環境セットアップ

### 必要なツール
```bash
# Rust(最新安定版)
rustup update stable

# Cargo make(タスクランナー)
cargo install cargo-make

# 開発用依存関係は自動インストール
```

**注意**: 初回は`cargo install cargo-make`でcargo-makeのインストールが必要です。

### 設定ファイル
```
~/.config/syui/ai/bot/config.toml  # 基本設定
~/.config/syui/ai/bot/refresh      # リフレッシュトークン  
~/.config/syui/ai/bot/access      # アクセストークン
```

**注意**: 旧設定ディレクトリ(`~/.config/ai/`)も自動的に参照・移行されます。

## 開発ワークフロー

### 1. コード変更
```bash
# フォーマット
cargo fmt

# コンパイル確認
cargo check

# テスト実行
cargo test
```

### 2. 統合ワークフロー
```bash
# 全体フロー(フォーマット→ビルド→テスト)
cargo make my-flow
```

### 3. 個別テスト
```bash
cargo make test-quick      # 素早いテスト
cargo make test-verbose    # 詳細出力テスト
```

## API呼び出しパターン

### HttpClientの使用方法

#### 基本的なGETリクエスト
```rust
use crate::http_client::HttpClient;

pub async fn get_user_profile(handle: String) -> String {
    let client = HttpClient::new();
    let url = format!("https://bsky.social/xrpc/app.bsky.actor.getProfile?actor={}", handle);
    
    match client.get_with_auth(&url).await {
        Ok(response) => response,
        Err(e) => {
            eprintln!("Error getting profile: {}", e);
            "err".to_string()
        }
    }
}
```

#### JSONを送信するPOSTリクエスト
```rust
use crate::http_client::HttpClient;
use serde_json::json;

pub async fn create_post(text: String) -> String {
    let client = HttpClient::new();
    let url = "https://bsky.social/xrpc/com.atproto.repo.createRecord";
    
    let payload = json!({
        "repo": "user.handle",
        "collection": "app.bsky.feed.post",
        "record": {
            "text": text,
            "createdAt": chrono::Utc::now().to_rfc3339()
        }
    });
    
    match client.post_json_with_auth(&url, &payload).await {
        Ok(response) => response,
        Err(e) => {
            eprintln!("Error creating post: {}", e);
            "err".to_string()
        }
    }
}
```

## テストの書き方

### ユニットテスト
```rust
#[cfg(test)]
mod tests {
    use super::*;
    
    #[tokio::test]
    async fn test_http_client_creation() {
        let client = HttpClient::new();
        // テストロジック
    }
    
    #[test]
    fn test_data_parsing() {
        // 同期テスト
    }
}
```

### 統合テスト
```rust
#[tokio::test]
#[ignore] // 通常は無視、環境変数設定時のみ実行
async fn test_real_api() {
    if std::env::var("RUN_INTEGRATION_TESTS").is_ok() {
        // 実際のAPI呼び出しテスト
    }
}
```

## エラーハンドリングガイドライン

### 推奨パターン
```rust
// Good: 適切なエラーハンドリング
match api_call().await {
    Ok(response) => response,
    Err(e) => {
        eprintln!("Error in operation: {}", e);
        "err".to_string()
    }
}

// Bad: unwrapの使用
api_call().await.unwrap()
```

### エラーレスポンス
- API呼び出し失敗時は`"err"`文字列を返す
- ログにエラー詳細を出力
- 上位レイヤーでエラー処理を継続

## 新機能追加の手順

### 1. AT Protocol関連機能
```bash
# 1. モジュールファイルを作成
touch src/new_feature.rs

# 2. main.rsに追加
# pub mod new_feature;

# 3. HttpClientを使用して実装
# 4. テストを追加
# 5. main.rsのコマンドに追加
```

### 2. 基本的なテンプレート
```rust
use crate::http_client::HttpClient;
use crate::{data_toml, url};
use serde_json::json;

pub async fn new_feature_request(param: String) -> String {
    let client = HttpClient::new();
    let endpoint_url = url(&"endpoint_name");
    
    let payload = json!({
        "param": param
    });
    
    match client.post_json_with_auth(&endpoint_url, &payload).await {
        Ok(response) => response,
        Err(e) => {
            eprintln!("Error in new_feature: {}", e);
            "err".to_string()
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    
    #[tokio::test]
    async fn test_new_feature() {
        // テスト実装
    }
}
```

## デバッグ方法

### 1. ログ出力
```rust
eprintln!("Debug: {}", variable);
println!("Info: {}", message);
```

### 2. テスト実行
```bash
# 特定のテストのみ
cargo test test_name

# 詳細出力
cargo test -- --nocapture

# 特定モジュール
cargo test module_name
```

### 3. HTTPリクエストのデバッグ
HttpClientモジュール内でリクエスト/レスポンスをログ出力することで、API呼び出しの詳細を確認できます。

## パフォーマンス考慮事項

### HttpClientの再利用
```rust
// Good: 一度作成して再利用
let client = HttpClient::new();
for item in items {
    client.get_with_auth(&url).await;
}

// Bad: 毎回新規作成
for item in items {
    let client = HttpClient::new();
    client.get_with_auth(&url).await;
}
```

### 非同期処理
- 可能な限り並列処理を活用
- await呼び出しを最小限に
- tokio::joinやfutures::join_allの活用

## トラブルシューティング

### よくある問題

1. **認証エラー**
   - トークンの有効期限切れ
   - 設定ファイルの不備

2. **コンパイルエラー**
   - 型不整合(特にライフタイム)
   - 未使用のimport

3. **実行時エラー**
   - ネットワーク接続問題
   - API仕様変更

### 解決方法
```bash
# 設定確認(新ディレクトリ)
ls -la ~/.config/syui/ai/bot/
# 旧ディレクトリも確認
ls -la ~/.config/ai/

# トークンリフレッシュ
./target/debug/aibot refresh
# または互換性コマンド
./target/debug/ai refresh

# 詳細ログ
RUST_LOG=debug ./target/debug/aibot [command]
```

## コントリビューション

1. コードフォーマット必須: `cargo fmt`
2. テスト追加必須: 新機能には対応テスト
3. エラーハンドリング必須: `.unwrap()`の使用禁止
4. ドキュメント更新: 重要な変更は本ドキュメントも更新

## 関連ドキュメント

- [リファクタリングサマリー](./refactoring-summary.md)
- [AT Protocol仕様](https://atproto.com/)
- [Rust公式ドキュメント](https://doc.rust-lang.org/)