246 lines
6.2 KiB
Markdown
246 lines
6.2 KiB
Markdown
|
|
# Miku UNO Bot Integration - Setup Guide
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
Miku can now play UNO using a combination of:
|
||
|
|
- **Playwright**: Headless browser automation to join and play the game
|
||
|
|
- **LLM Integration**: Strategic decision-making with Miku's personality
|
||
|
|
- **Discord Commands**: Easy interface for starting/joining games
|
||
|
|
|
||
|
|
## Files Created
|
||
|
|
1. `bot/commands/uno.py` - Discord command handler
|
||
|
|
2. `bot/utils/uno_game.py` - Core game automation (MikuUnoPlayer class)
|
||
|
|
3. `bot/bot.py` - Updated to route !uno commands
|
||
|
|
|
||
|
|
## Prerequisites
|
||
|
|
|
||
|
|
### 1. Install Playwright Browsers
|
||
|
|
Playwright requires browser binaries to be installed:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Inside the bot container or virtual environment
|
||
|
|
python -m playwright install chromium
|
||
|
|
```
|
||
|
|
|
||
|
|
Or if you need all browsers:
|
||
|
|
```bash
|
||
|
|
python -m playwright install
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Verify UNO Server is Running
|
||
|
|
Make sure both UNO game servers are running:
|
||
|
|
```bash
|
||
|
|
# Terminal 1 - Backend (port 5000)
|
||
|
|
cd /home/koko210Serve/docker/uno-online
|
||
|
|
node server.js
|
||
|
|
|
||
|
|
# Terminal 2 - Frontend (port 3002)
|
||
|
|
cd /home/koko210Serve/docker/uno-online/client
|
||
|
|
npm start
|
||
|
|
```
|
||
|
|
|
||
|
|
## Discord Commands
|
||
|
|
|
||
|
|
### Create a New Game
|
||
|
|
```
|
||
|
|
!uno create
|
||
|
|
```
|
||
|
|
- Miku creates a new UNO room and joins as Player 2
|
||
|
|
- Returns room code for you to join
|
||
|
|
- Automatically starts playing when you join
|
||
|
|
|
||
|
|
### Join an Existing Game
|
||
|
|
```
|
||
|
|
!uno join ABC123
|
||
|
|
```
|
||
|
|
- Miku joins room ABC123 as Player 2
|
||
|
|
- Starts playing automatically
|
||
|
|
|
||
|
|
### List Active Games
|
||
|
|
```
|
||
|
|
!uno list
|
||
|
|
```
|
||
|
|
- Shows all active UNO games Miku is currently playing
|
||
|
|
|
||
|
|
### Quit a Game
|
||
|
|
```
|
||
|
|
!uno quit ABC123
|
||
|
|
```
|
||
|
|
- Makes Miku leave the specified game
|
||
|
|
|
||
|
|
### Help
|
||
|
|
```
|
||
|
|
!uno help
|
||
|
|
```
|
||
|
|
- Shows all available UNO commands
|
||
|
|
|
||
|
|
## How It Works
|
||
|
|
|
||
|
|
### Game Flow
|
||
|
|
1. **User sends command**: `!uno create` or `!uno join <code>`
|
||
|
|
2. **Playwright launches**: Headless Chromium browser opens
|
||
|
|
3. **Navigation**: Bot navigates to game URL (http://192.168.1.2:3002)
|
||
|
|
4. **Join room**: Enters room code and joins as Player 2
|
||
|
|
5. **Game loop starts**: Polls game state every 2 seconds
|
||
|
|
6. **Turn detection**: Checks if it's Miku's turn
|
||
|
|
7. **LLM decision**: Prompts Miku's LLM with game state for strategy
|
||
|
|
8. **Action execution**: Sends JSON action to game via HTTP API
|
||
|
|
9. **Trash talk**: Sends personality-driven message to Discord
|
||
|
|
10. **Repeat**: Loop continues until game ends
|
||
|
|
|
||
|
|
### LLM Strategy System
|
||
|
|
When it's Miku's turn, the bot:
|
||
|
|
1. Gets current game state (hand, top card, opponent cards)
|
||
|
|
2. Builds a strategic prompt with:
|
||
|
|
- Current game situation
|
||
|
|
- Available cards in hand
|
||
|
|
- Strategic advice (color matching, special cards, etc.)
|
||
|
|
- JSON format requirements
|
||
|
|
3. Gets Miku's decision from LLM
|
||
|
|
4. Validates and executes the action
|
||
|
|
|
||
|
|
### Personality Integration
|
||
|
|
Miku trash talks based on card type:
|
||
|
|
- **Draw 4**: "Take four cards! 💙✨ I hope you're ready for a comeback~"
|
||
|
|
- **Draw 2**: "Draw two cards! Don't worry, I still believe in you~ ✨"
|
||
|
|
- **Skip**: "Sorry~ Skipping your turn! Maybe next time? 🎶"
|
||
|
|
- **Wild**: "I'm changing the color! Let's see how you handle this~ 💫"
|
||
|
|
- **Regular cards**: "Playing my card~ Let's keep this fun! 🎵"
|
||
|
|
|
||
|
|
## Configuration
|
||
|
|
|
||
|
|
### Server URLs
|
||
|
|
Located in `bot/utils/uno_game.py`:
|
||
|
|
```python
|
||
|
|
UNO_SERVER_URL = "http://localhost:5000" # Backend API
|
||
|
|
UNO_CLIENT_URL = "http://192.168.1.2:3002" # Frontend URL
|
||
|
|
```
|
||
|
|
|
||
|
|
Adjust these if your setup is different.
|
||
|
|
|
||
|
|
### Polling Interval
|
||
|
|
Game state is checked every 2 seconds:
|
||
|
|
```python
|
||
|
|
POLL_INTERVAL = 2 # seconds
|
||
|
|
```
|
||
|
|
|
||
|
|
You can adjust this in `uno_game.py` if needed.
|
||
|
|
|
||
|
|
## Testing
|
||
|
|
|
||
|
|
### 1. Quick Test
|
||
|
|
```bash
|
||
|
|
# Start both UNO servers first
|
||
|
|
|
||
|
|
# In Discord, type:
|
||
|
|
!uno create
|
||
|
|
|
||
|
|
# You'll get a response like:
|
||
|
|
# "🎮 Created UNO room: ABC123
|
||
|
|
# Join at: http://192.168.1.2:3002
|
||
|
|
# I'm joining now as Player 2! ✨"
|
||
|
|
|
||
|
|
# Open that URL in your browser and join
|
||
|
|
# Miku will start playing automatically
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Check Logs
|
||
|
|
Watch bot logs for:
|
||
|
|
- `[UNO]` - Game actions and status
|
||
|
|
- `[MikuUnoPlayer]` - Detailed game loop info
|
||
|
|
- LLM prompts and responses
|
||
|
|
- Trash talk messages
|
||
|
|
|
||
|
|
### 3. Manual Testing
|
||
|
|
You can still test the JSON action API directly:
|
||
|
|
```bash
|
||
|
|
# Get game state
|
||
|
|
curl http://localhost:5000/api/game/ABC123/state | jq
|
||
|
|
|
||
|
|
# Send bot action
|
||
|
|
node test-bot-action.js ABC123 '{"action":"draw"}'
|
||
|
|
```
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Browser Not Found
|
||
|
|
**Error**: `playwright._impl._api_types.Error: Executable doesn't exist`
|
||
|
|
|
||
|
|
**Solution**:
|
||
|
|
```bash
|
||
|
|
python -m playwright install chromium
|
||
|
|
```
|
||
|
|
|
||
|
|
### Bot Not Responding to Commands
|
||
|
|
**Check**:
|
||
|
|
1. Is bot.py running?
|
||
|
|
2. Check bot logs for errors
|
||
|
|
3. Try `!uno help` to verify command is loaded
|
||
|
|
|
||
|
|
### Game Not Starting
|
||
|
|
**Check**:
|
||
|
|
1. Are both UNO servers running? (ports 5000 and 3002)
|
||
|
|
2. Can you access http://192.168.1.2:3002 in browser?
|
||
|
|
3. Check server logs for errors
|
||
|
|
|
||
|
|
### Miku Not Making Moves
|
||
|
|
**Check**:
|
||
|
|
1. Is it actually Miku's turn? (Player 2)
|
||
|
|
2. Check bot logs for LLM errors
|
||
|
|
3. Verify game state is being fetched correctly
|
||
|
|
4. Check if LLM is returning valid JSON
|
||
|
|
|
||
|
|
### Invalid JSON from LLM
|
||
|
|
The bot validates LLM output. If invalid:
|
||
|
|
- Bot will log the error
|
||
|
|
- May attempt to draw a card as fallback
|
||
|
|
- Check LLM prompt in `build_strategy_prompt()`
|
||
|
|
|
||
|
|
## Architecture
|
||
|
|
|
||
|
|
### HTTP API (Game Server)
|
||
|
|
- `GET /api/game/:roomCode/state` - Get game state
|
||
|
|
- `POST /api/game/:roomCode/action` - Send bot action
|
||
|
|
|
||
|
|
### WebSocket Events (Optional)
|
||
|
|
- `botActionReceived` - Triggers action execution in client
|
||
|
|
- Not currently used by Playwright approach
|
||
|
|
|
||
|
|
### Playwright Automation
|
||
|
|
- Headless Chromium browser
|
||
|
|
- Navigates to game URL
|
||
|
|
- No actual UI interaction needed (uses HTTP API)
|
||
|
|
- Browser is just for joining the room
|
||
|
|
|
||
|
|
## Future Enhancements
|
||
|
|
|
||
|
|
### Discord Activity Integration (Phase 2)
|
||
|
|
After testing is complete, we can convert this to a proper Discord Activity:
|
||
|
|
1. Package as Discord Activity
|
||
|
|
2. Use Discord's activity APIs
|
||
|
|
3. Embed directly in Discord
|
||
|
|
4. No external browser needed
|
||
|
|
|
||
|
|
### Improvements
|
||
|
|
- [ ] Better error recovery
|
||
|
|
- [ ] Multiple concurrent games
|
||
|
|
- [ ] Difficulty levels (aggressive vs casual play)
|
||
|
|
- [ ] Statistics tracking
|
||
|
|
- [ ] Tournament mode
|
||
|
|
|
||
|
|
## Documentation References
|
||
|
|
- `BOT_ACTION_SPEC.md` - JSON action format specification
|
||
|
|
- `QUICK_START_BOT.md` - Quick start for manual testing
|
||
|
|
- `BOT_INTEGRATION_COMPLETE.md` - Full integration details
|
||
|
|
|
||
|
|
## Need Help?
|
||
|
|
Check the logs first:
|
||
|
|
```bash
|
||
|
|
# Bot logs
|
||
|
|
tail -f bot.log
|
||
|
|
|
||
|
|
# UNO server logs
|
||
|
|
# (in terminal where server.js is running)
|
||
|
|
```
|
||
|
|
|
||
|
|
Look for `[UNO]` or `[MikuUnoPlayer]` tags for game-specific logs.
|