diff --git a/README.md b/README.md index 1811334..3a285fc 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,14 @@ the-island/ ├── backend/ # Python FastAPI 后端服务 │ └── app/ -│ ├── main.py # 应用入口 -│ ├── server.py # WebSocket 服务器 -│ ├── engine.py # 游戏引擎核心逻辑 -│ ├── models.py # SQLAlchemy 数据模型 -│ ├── schemas.py # Pydantic 消息模式 -│ ├── llm.py # LLM 集成 (对话生成) -│ └── database.py # 数据库配置 +│ ├── main.py # 应用入口 +│ ├── server.py # WebSocket 服务器 +│ ├── engine.py # 游戏引擎核心逻辑 +│ ├── models.py # SQLAlchemy 数据模型 +│ ├── schemas.py # Pydantic 消息模式 +│ ├── llm.py # LLM 集成 (对话生成) +│ ├── twitch_service.py # Twitch 聊天机器人 +│ └── database.py # 数据库配置 ├── frontend/ # Web 调试客户端 │ ├── app.js # JavaScript 客户端 │ └── debug_client.html # 调试页面 @@ -61,7 +62,8 @@ the-island/ - **WebSocket** - 实时双向通信 - **SQLAlchemy** - ORM 数据持久化 - **SQLite** - 轻量级数据库 -- **Anthropic Claude** - LLM 对话生成 +- **LiteLLM** - 多 LLM 提供商支持 +- **TwitchIO** - Twitch 聊天集成 ### Unity 客户端 - **Unity 6 LTS** (6000.3.2f1) @@ -151,13 +153,61 @@ SOCIAL_INTERACTION # 角色间社交 AUTO_REVIVE # 自动复活 (休闲模式) ``` +## Twitch 直播集成 + +游戏支持连接到 Twitch 直播聊天室,观众可以通过发送弹幕来控制游戏。 + +### 获取 Twitch Token + +**方法一:Twitch Token Generator (推荐用于测试)** +1. 访问 https://twitchtokengenerator.com/ +2. 选择 "Bot Chat Token" +3. 使用你的 Twitch 账号授权 +4. 复制 "Access Token" (以 `oauth:` 开头) + +**方法二:Twitch Developer Console (生产环境)** +1. 访问 https://dev.twitch.tv/console/apps +2. 创建新应用,类型选择 "Chat Bot" +3. 设置 OAuth 重定向 URL: `http://localhost:3000` +4. 使用 OAuth 授权码流程获取 Token +5. 需要的权限范围: `chat:read`, `chat:edit`, `bits:read` + +### Bits 打赏转换 + +观众在直播间使用 Bits 打赏时,系统会自动将 Bits 转换为游戏内金币: +- **转换比率**: 1 Bit = 1 Gold +- Unity 客户端会收到 `gift_effect` 事件用于显示特效 + ## 环境变量 -创建 `.env` 文件: +在 `backend/.env` 文件中配置: + ```env +# LLM 配置 (选择一种) ANTHROPIC_API_KEY=your_api_key_here +# 或 +OPENAI_API_KEY=your_api_key_here +LLM_MODEL=gpt-3.5-turbo + +# Twitch 配置 (可选) +TWITCH_TOKEN=oauth:your_access_token_here +TWITCH_CHANNEL_NAME=your_channel_name +TWITCH_COMMAND_PREFIX=! ``` +### 必需变量 +| 变量 | 说明 | +|------|------| +| `LLM_MODEL` | LLM 模型名称 | +| `ANTHROPIC_API_KEY` 或 `OPENAI_API_KEY` | LLM API 密钥 | + +### Twitch 变量 (可选) +| 变量 | 说明 | +|------|------| +| `TWITCH_TOKEN` | OAuth Token (必须以 `oauth:` 开头) | +| `TWITCH_CHANNEL_NAME` | 要加入的频道名称 | +| `TWITCH_COMMAND_PREFIX` | 命令前缀 (默认 `!`) | + ## 开发说明 ### 添加新命令 diff --git a/backend/app/engine.py b/backend/app/engine.py index d34b863..71399b6 100644 --- a/backend/app/engine.py +++ b/backend/app/engine.py @@ -942,3 +942,32 @@ class GameEngine: """Stop the game engine.""" self._running = False logger.info("Game engine stopping...") + + async def process_command(self, user: str, text: str) -> None: + """Process a command from Twitch chat.""" + # Use the existing process_comment method to handle commands + await self.process_comment(user, text) + + async def process_bits(self, user: str, amount: int) -> None: + """Process Twitch bits and convert to game gold.""" + # 1 Bit = 1 Gold conversion rate + gold_added = amount + + with get_db_session() as db: + user_obj = self._get_or_create_user(db, user) + user_obj.gold += gold_added + + await self._broadcast_event(EventType.USER_UPDATE, { + "user": user, + "gold": user_obj.gold, + "message": f"{user} received {gold_added} gold from {amount} bits!" + }) + + # Also broadcast a special bits event for UI effects + await self._broadcast_event("bits_received", { + "user": user, + "bits": amount, + "gold": gold_added + }) + + logger.info(f"Processed bits: {user} -> {amount} bits -> {gold_added} gold")