teto_ai/docs/development.md
Mikolaj Wojciech Gorski 44b45b7212 Major refactor: Transform into AI-powered Kasane Teto companion bot
🎭 Core Transformation:
- Reframe project as AI companion bot with Kasane Teto personality
- Focus on natural conversation, multimodal interaction, and character roleplay
- Position video recording as one tool in AI toolkit rather than main feature

🏗️ Architecture Improvements:
- Refactor messageCreate.js into modular command system (35 lines vs 310+)
- Create dedicated videoRecording service with clean API
- Implement commandHandler for extensible command routing
- Add centralized configuration system (videoConfig.js)
- Separate concerns: events, services, config, documentation

📚 Documentation Overhaul:
- Consolidate scattered READMEs into organized docs/ directory
- Create comprehensive documentation covering:
  * AI architecture and capabilities
  * Natural interaction patterns and personality
  * Setup guides for AI services and Docker deployment
  * Commands reference focused on conversational AI
  * Troubleshooting and development guidelines
- Transform root README into compelling AI companion overview

🤖 AI-Ready Foundation:
- Document integration points for:
  * Language models (GPT-4/Claude) for conversation
  * Vision models (GPT-4V/CLIP) for image analysis
  * Voice synthesis (ElevenLabs) for speaking
  * Memory systems for conversation continuity
  * Personality engine for character consistency

🔧 Technical Updates:
- Integrate custom discord.js-selfbot-v13 submodule with enhanced functionality
- Update package.json dependencies for AI and multimedia capabilities
- Maintain Docker containerization with improved architecture
- Add development and testing infrastructure

📖 New Documentation Structure:
docs/
├── README.md (documentation hub)
├── setup.md (installation & AI configuration)
├── interactions.md (how to chat with Teto)
├── ai-architecture.md (technical AI systems overview)
├── commands.md (natural language interactions)
├── personality.md (character understanding)
├── development.md (contributing guidelines)
├── troubleshooting.md (problem solving)
└── [additional specialized guides]

 This update transforms the project from a simple recording bot into a foundation for an engaging AI companion that can naturally interact through text, voice, and visual content while maintaining authentic Kasane Teto personality traits.
2025-07-26 13:08:47 +02:00

644 lines
No EOL
15 KiB
Markdown

# Development Guide
This guide covers development workflows, coding standards, and contribution guidelines for the Discord Teto Bot project.
## 🛠️ Development Environment Setup
### Prerequisites
- **Node.js**: Version 20.0.0 or higher
- **Docker**: Version 20.10+ with Docker Compose v2+
- **Git**: For version control
- **Text Editor**: VS Code recommended with extensions:
- ES6 String HTML
- Docker
- JavaScript (ES6) code snippets
- Prettier - Code formatter
### Initial Setup
1. **Clone and Install**
```bash
git clone <repository-url>
cd discord_teto
npm install
```
2. **Environment Configuration**
```bash
# Create .env file
cp .env.example .env
# Edit with your Discord token
export USER_TOKEN="your_discord_user_token"
```
3. **Development Container**
```bash
# Start development environment
docker compose -f docker-compose.dev.yml up --build
# Or with live reload
docker compose -f docker-compose.dev.yml up --build --watch
```
## 🏗️ Project Structure
### Directory Organization
```
discord_teto/
├── src/
│ ├── config/ # Configuration files
│ │ └── videoConfig.js
│ ├── events/ # Discord event handlers
│ │ └── messageCreate.js
│ ├── services/ # Business logic services
│ │ ├── videoRecording.js
│ │ └── commandHandler.js
│ └── utils/ # Utility functions (future)
├── docs/ # Documentation
├── output/ # Recording output (gitignored)
├── test/ # Test files
└── docker-compose*.yml # Container configurations
```
### File Naming Conventions
- **Services**: camelCase (e.g., `videoRecording.js`)
- **Events**: camelCase matching Discord.js events
- **Config**: camelCase with descriptive names
- **Documentation**: kebab-case (e.g., `video-recording.md`)
## 📝 Coding Standards
### JavaScript Style Guide
**ES6+ Features**:
- Use ES6 modules (`import/export`)
- Arrow functions for short functions
- Template literals for string interpolation
- Destructuring for object/array access
- Async/await over Promises
**Code Style**:
```javascript
// Good: Consistent naming and structure
export class VideoRecordingService {
constructor() {
this.outputDir = VIDEO_CONFIG.OUTPUT_DIR;
this.activeRecordings = new Map();
}
async startRecording({ client, voiceChannel, user, textChannel }) {
try {
// Implementation here
return { success: true, message: 'Recording started' };
} catch (error) {
console.error('Recording error:', error);
return { success: false, error: error.message };
}
}
}
// Good: Consistent error handling
const result = await videoService.startRecording(options);
if (!result.success) {
return handleError(result.error);
}
```
### Configuration Management
**Centralized Configuration**:
```javascript
// In config/videoConfig.js
export const VIDEO_CONFIG = {
// Group related settings
RECORDING_SETTINGS: {
AUTO_STOP_TIMEOUT: 30_000,
MAX_DURATION: 300_000
},
// Use descriptive names
ERROR_MESSAGES: {
NO_VOICE_CHANNEL: 'You need to be in a voice channel to record!',
ALREADY_RECORDING: 'Already recording in this channel!'
}
};
// Usage in services
import { VIDEO_CONFIG } from '../config/videoConfig.js';
```
### Error Handling Patterns
**Service Layer Errors**:
```javascript
// Return structured error objects
async function serviceMethod() {
try {
const result = await dangerousOperation();
return { success: true, data: result };
} catch (error) {
console.error('Service error:', error);
return {
success: false,
error: error.message,
code: 'SERVICE_ERROR'
};
}
}
```
**Command Handler Errors**:
```javascript
// Graceful user-facing error handling
execute: async (msg, context) => {
try {
const result = await service.performAction();
if (!result.success) {
msg.channel.send(result.error || 'Something went wrong!');
return null;
}
return { action: { message: 'Success!', icon: '✅' } };
} catch (error) {
console.error('Command error:', error);
msg.channel.send('An error occurred while processing your command.');
return null;
}
}
```
## 🧩 Architecture Patterns
### Service Layer Pattern
**Services should be**:
- Stateless where possible
- Have single responsibilities
- Return consistent response formats
- Handle their own errors gracefully
```javascript
class ExampleService {
// Good: Clear method signatures
async performAction(requiredParam, options = {}) {
// Validate inputs
if (!requiredParam) {
return { success: false, error: 'Required parameter missing' };
}
// Perform action
try {
const result = await this._internalMethod(requiredParam, options);
return { success: true, data: result };
} catch (error) {
return { success: false, error: error.message };
}
}
// Good: Private methods prefixed with underscore
_internalMethod(param, options) {
// Implementation details
}
}
```
### Command Pattern
**Commands should**:
- Have clear trigger conditions
- Return standardized action objects
- Handle permissions and validation
- Provide helpful error messages
```javascript
this.commands.set('example_command', {
// Clear trigger logic
trigger: (msg) => {
return msg.content.toLowerCase().startsWith('example') &&
msg.member?.voice?.channel;
},
// Consistent execution pattern
execute: async (msg, context) => {
// Validate preconditions
if (!this._validateCommand(msg, context)) {
return null;
}
// Execute business logic
const result = await service.performAction(msg.author.id);
// Handle result
if (result.success) {
msg.channel.send('Command successful!');
return {
action: {
message: `Command executed by ${msg.author.tag}`,
channel: `#${msg.channel.name}`,
icon: '✅'
}
};
} else {
msg.channel.send(result.error);
return null;
}
}
});
```
## 🧪 Testing Strategy
### Test Structure
```
test/
├── unit/
│ ├── services/
│ │ ├── videoRecording.test.js
│ │ └── commandHandler.test.js
│ └── config/
│ └── videoConfig.test.js
├── integration/
│ └── recording.test.js
└── fixtures/
└── mockData.js
```
### Unit Testing Example
```javascript
// test/unit/services/videoRecording.test.js
import { describe, it, expect, beforeEach, afterEach } from 'node:test';
import { VideoRecordingService } from '../../../src/services/videoRecording.js';
describe('VideoRecordingService', () => {
let service;
beforeEach(() => {
service = new VideoRecordingService();
});
describe('startRecording', () => {
it('should return error when already recording', async () => {
// Setup
const mockOptions = { voiceChannel: { id: 'test-channel' } };
service.activeRecordings.set('test-channel', {});
// Execute
const result = await service.startRecording(mockOptions);
// Assert
expect(result.success).toBe(false);
expect(result.message).toContain('Already recording');
});
});
});
```
### Integration Testing
```javascript
// test/integration/recording.test.js
import { describe, it, expect } from 'node:test';
import { setupTestBot, cleanupTestBot } from '../fixtures/testBot.js';
describe('Recording Integration', () => {
let testBot;
beforeEach(async () => {
testBot = await setupTestBot();
});
afterEach(async () => {
await cleanupTestBot(testBot);
});
it('should complete full recording workflow', async () => {
// Test full workflow from command to file output
const result = await testBot.executeCommand('xbox record that');
expect(result.success).toBe(true);
// Verify file creation
const files = await testBot.getOutputFiles();
expect(files.length).toBeGreaterThan(0);
});
});
```
## 🚀 Development Workflow
### Branch Strategy
```bash
# Feature development
git checkout -b feature/new-command
git checkout -b feature/improve-recording
git checkout -b bugfix/voice-connection
# Release preparation
git checkout -b release/v2.1.0
# Hotfixes
git checkout -b hotfix/critical-bug
```
### Development Process
1. **Create Feature Branch**
```bash
git checkout -b feature/my-feature
```
2. **Develop with Hot Reload**
```bash
# Start development environment
docker compose -f docker-compose.dev.yml up --build
# Code changes automatically restart bot
```
3. **Test Changes**
```bash
# Run unit tests
npm test
# Run integration tests
npm run test:integration
# Test in Discord manually
```
4. **Code Review Preparation**
```bash
# Format code
npm run format
# Lint code
npm run lint
# Check types (if using TypeScript)
npm run type-check
```
### Adding New Commands
1. **Define Command Logic**
```javascript
// In src/services/commandHandler.js
this.commands.set('new_command', {
trigger: (msg) => msg.content.toLowerCase() === 'new command',
execute: async (msg, context) => {
// Implementation
return { action: { message: 'Command executed', icon: '🆕' } };
}
});
```
2. **Add Configuration**
```javascript
// In src/config/videoConfig.js
MESSAGES: {
NEW_COMMAND_SUCCESS: 'New command executed successfully!',
NEW_COMMAND_ERROR: 'Failed to execute new command.'
}
```
3. **Update Documentation**
```markdown
<!-- In docs/commands.md -->
### `new command`
**Description**: Description of what the command does.
**Usage**: `new command`
**Requirements**: Any special requirements.
```
4. **Add Tests**
```javascript
// In test/unit/services/commandHandler.test.js
describe('new_command', () => {
it('should execute successfully', async () => {
// Test implementation
});
});
```
### Adding New Services
1. **Create Service File**
```javascript
// src/services/newService.js
class NewService {
constructor() {
// Initialize service
}
async performAction(params) {
// Service logic
return { success: true, data: result };
}
}
export const newService = new NewService();
export default newService;
```
2. **Register with System**
```javascript
// Import in relevant files
import newService from '../services/newService.js';
```
3. **Add Configuration**
```javascript
// Add to config/videoConfig.js or create new config file
```
## 📊 Performance Considerations
### Resource Management
**Memory Management**:
```javascript
// Good: Clean up resources
class RecordingService {
async stopRecording(id) {
const recording = this.activeRecordings.get(id);
if (recording) {
// Clean up streams
recording.videoStream?.destroy();
recording.connectionStream?.destroy();
recording.connection?.disconnect();
// Remove from memory
this.activeRecordings.delete(id);
}
}
}
```
**CPU Optimization**:
```javascript
// Good: Use appropriate FFmpeg settings
const FFMPEG_SETTINGS = {
video: {
preset: 'ultrafast', // Lower CPU usage
crf: 23, // Balance quality/performance
}
};
```
### Docker Performance
**Development Optimization**:
```yaml
# docker-compose.dev.yml
services:
teto_ai:
volumes:
- ./src:/opt/bot/src:ro # Read-only mount for security
environment:
- NODE_ENV=development
deploy:
resources:
limits:
memory: 2G
cpus: '2.0'
```
## 🔍 Debugging
### Development Debugging
**Enable Debug Logging**:
```bash
# Set debug environment
export DEBUG=discord*,bot*
# Start with debug info
docker compose -f docker-compose.dev.yml up --build
```
**Console Debugging**:
```javascript
// Good: Structured logging
console.log('[VideoService] Starting recording for user:', userId);
console.error('[VideoService] Recording failed:', error.message);
// Good: Debug information
if (process.env.NODE_ENV === 'development') {
console.debug('[VideoService] Recording state:', {
activeRecordings: this.activeRecordings.size,
voiceChannelId,
timestamp: Date.now()
});
}
```
### Container Debugging
```bash
# Access running container
docker exec -it teto_ai bash
# Check processes
ps aux | grep node
# Check network connectivity
curl -s https://discord.com/api/v10/gateway
# Monitor resources
top
df -h
```
## 📚 Documentation Standards
### Code Documentation
**JSDoc Comments**:
```javascript
/**
* Start recording video in a voice channel
* @param {Object} options - Recording options
* @param {Client} options.client - Discord client instance
* @param {VoiceChannel} options.voiceChannel - Target voice channel
* @param {User} options.user - User to record
* @param {TextChannel} options.textChannel - Channel for notifications
* @returns {Promise<Object>} Recording result with success status
*/
async startRecording({ client, voiceChannel, user, textChannel }) {
// Implementation
}
```
**README Updates**:
- Update command tables when adding new commands
- Document configuration changes
- Include usage examples for new features
- Update troubleshooting section for known issues
## 🚢 Deployment Preparation
### Pre-deployment Checklist
- [ ] All tests passing
- [ ] No console errors in production mode
- [ ] Environment variables documented
- [ ] Docker containers build successfully
- [ ] Documentation updated
- [ ] Performance tested with expected load
- [ ] Security review completed
### Production Build
```bash
# Build production image
docker compose build --no-cache
# Test production image
docker compose up -d
docker compose logs -f
# Verify functionality
# Test all commands manually
```
## 🤝 Contributing Guidelines
### Pull Request Process
1. **Fork and Branch**
2. **Follow Coding Standards**
3. **Add Tests** for new functionality
4. **Update Documentation**
5. **Test Thoroughly**
6. **Submit PR** with clear description
### Code Review Checklist
**Functionality**:
- [ ] Code works as intended
- [ ] Edge cases handled
- [ ] Error handling implemented
- [ ] Performance considerations addressed
**Code Quality**:
- [ ] Follows project conventions
- [ ] Properly commented
- [ ] No console.log in production code
- [ ] Consistent naming
**Testing**:
- [ ] Unit tests added/updated
- [ ] Integration tests pass
- [ ] Manual testing completed
**Documentation**:
- [ ] README updated if needed
- [ ] API documentation updated
- [ ] Comments added for complex logic
This development guide should help you contribute effectively to the Discord Teto Bot project. For specific technical details, refer to the [architecture documentation](architecture.md).