You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
7.2 KiB
Markdown
240 lines
7.2 KiB
Markdown
# Know Foolery 🎯
|
|
|
|
A web-based quiz game inspired by the French game "Déconnaissance" where players test their knowledge across various themes and compete for the highest score.
|
|
|
|
## 🎮 Game Features
|
|
|
|
- **Multi-themed Questions**: Questions across Geography, Science, History, Literature, Movies, Sports, Music, and Art
|
|
- **Scoring System**: 2 points for correct answers without hints, 1 point with hints
|
|
- **Attempts**: Up to 3 attempts per question
|
|
- **Time Limit**: 30-minute game sessions
|
|
- **Leaderboard**: Top 10 players displayed
|
|
- **Admin Panel**: Secure question management with OAuth
|
|
|
|
## 🏗 Architecture
|
|
|
|
### Frontend (React + TypeScript)
|
|
- **React 18** with TypeScript
|
|
- **Material-UI (MUI)** for components
|
|
- **Vite** for build tooling
|
|
- **Zustand** for state management
|
|
- **React Query** for server state
|
|
|
|
### Backend (Python Microservices)
|
|
- **FastAPI** microservices architecture
|
|
- **SQLAlchemy** ORM with SQLite database
|
|
- **JWT** authentication for admin
|
|
- **Docker** containerization
|
|
- **Nginx** reverse proxy
|
|
|
|
### Services
|
|
- `api-gateway` - Main API gateway (Port 8000)
|
|
- `game-service` - Game logic and scoring (Port 8001)
|
|
- `question-service` - Question management (Port 8002)
|
|
- `player-service` - Player management (Port 8003)
|
|
- `admin-service` - Administration panel (Port 8004)
|
|
|
|
## 🚀 Quick Start
|
|
|
|
### Prerequisites
|
|
- Docker and Docker Compose
|
|
- Node.js 18+ (for local development)
|
|
- Python 3.11+ (for local development)
|
|
|
|
### Development Setup
|
|
|
|
1. **Clone and setup**:
|
|
```bash
|
|
git clone <repository-url>
|
|
cd know_foolery
|
|
cp .env.example .env
|
|
```
|
|
|
|
2. **Start with Docker**:
|
|
```bash
|
|
docker compose up --build
|
|
```
|
|
|
|
3. **Initialize database**:
|
|
```bash
|
|
docker compose exec game-service python /app/shared/database/init_db.py
|
|
```
|
|
|
|
4. **Access the application**:
|
|
- Frontend: http://localhost:3000
|
|
- API Gateway: http://localhost:8000
|
|
- API Docs: http://localhost:8000/docs
|
|
|
|
### Local Development
|
|
|
|
**Frontend**:
|
|
```bash
|
|
cd frontend
|
|
npm install
|
|
npm run dev
|
|
```
|
|
|
|
**Backend Services**:
|
|
```bash
|
|
cd backend
|
|
pip install -r requirements.txt
|
|
|
|
# Run individual services
|
|
cd services/api-gateway
|
|
uvicorn app.main:app --reload --port 8000
|
|
|
|
cd services/game-service
|
|
uvicorn app.main:app --reload --port 8001
|
|
# ... repeat for other services
|
|
```
|
|
|
|
## 📊 Database Schema
|
|
|
|
### Tables
|
|
- `themes` - Question categories
|
|
- `questions` - Quiz questions with hints and answers
|
|
- `players` - Player information
|
|
- `game_sessions` - Individual game sessions
|
|
- `game_answers` - Player answers and attempts
|
|
|
|
### Sample Data
|
|
The database comes pre-loaded with:
|
|
- 8 themes (Geography, Science, History, etc.)
|
|
- 40+ sample questions across all themes
|
|
- Varying difficulty levels (1-4)
|
|
|
|
## 🎯 Game Flow
|
|
|
|
1. Player enters name on home page
|
|
2. Game session starts (30-minute timer)
|
|
3. Random question presented with theme
|
|
4. Player can submit answer (up to 3 attempts) or use hint
|
|
5. Scoring applied based on correctness and hint usage
|
|
6. Next question or game end
|
|
7. Final score saved to leaderboard
|
|
|
|
## 🔒 Admin Features
|
|
|
|
- **Authentication**: OAuth integration (Auth0/Firebase)
|
|
- **Question Management**: Add, edit, delete questions
|
|
- **Theme Management**: Manage question categories
|
|
- **Analytics**: Player performance and question difficulty analysis
|
|
- **Bulk Import**: CSV/JSON question import capability
|
|
|
|
## 🛠 Development Commands
|
|
|
|
### Frontend
|
|
```bash
|
|
npm run dev # Start development server
|
|
npm run build # Build for production
|
|
npm run lint # Run ESLint
|
|
npm run preview # Preview production build
|
|
```
|
|
|
|
### Backend
|
|
```bash
|
|
# Database operations
|
|
python backend/shared/database/init_db.py # Initialize database
|
|
|
|
# Testing
|
|
pytest backend/ # Run tests
|
|
|
|
# Code formatting
|
|
black backend/ # Format Python code
|
|
isort backend/ # Sort imports
|
|
flake8 backend/ # Lint Python code
|
|
```
|
|
|
|
### Docker
|
|
```bash
|
|
docker compose up --build # Build and start all services
|
|
docker compose up -d # Start in background
|
|
docker compose down # Stop all services
|
|
docker compose logs -f [service-name] # View logs
|
|
```
|
|
|
|
## 📁 Project Structure
|
|
|
|
```
|
|
know_foolery/
|
|
├── frontend/ # React TypeScript app
|
|
│ ├── src/
|
|
│ │ ├── components/ # React components
|
|
│ │ ├── pages/ # Page components
|
|
│ │ ├── types/ # TypeScript types
|
|
│ │ └── services/ # API services
|
|
│ └── package.json
|
|
├── backend/
|
|
│ ├── shared/ # Common utilities
|
|
│ │ ├── database/ # Database models & connection
|
|
│ │ ├── auth/ # Authentication utilities
|
|
│ │ └── utils/ # Shared utilities
|
|
│ ├── services/ # Microservices
|
|
│ │ ├── api-gateway/ # Main API gateway
|
|
│ │ ├── game-service/ # Game logic
|
|
│ │ ├── question-service/ # Question management
|
|
│ │ ├── player-service/ # Player management
|
|
│ │ └── admin-service/ # Admin operations
|
|
│ └── database/
|
|
│ ├── schema.sql # Database schema
|
|
│ └── seeds/ # Sample data
|
|
├── docker compose.yml # Container orchestration
|
|
├── nginx.conf # Reverse proxy config
|
|
└── README.md
|
|
```
|
|
|
|
## 🔧 Configuration
|
|
|
|
### Environment Variables
|
|
Copy `.env.example` to `.env` and configure:
|
|
|
|
- `DATABASE_URL` - Database connection string
|
|
- `JWT_SECRET_KEY` - JWT signing key (change in production!)
|
|
- `OAUTH_*` - OAuth provider configuration
|
|
- Service URLs and ports
|
|
- Game configuration (timeouts, scoring)
|
|
|
|
### Game Configuration
|
|
- **Max session duration**: 30 minutes (1800 seconds)
|
|
- **Question timeout**: 2 minutes (120 seconds)
|
|
- **Max attempts per question**: 3
|
|
- **Base scoring**: 2 points (no hint), 1 point (with hint)
|
|
- **Consecutive bonus**: 1.1x multiplier per consecutive correct answer
|
|
|
|
## 🚀 Deployment
|
|
|
|
### Production Deployment
|
|
1. Set environment variables for production
|
|
2. Change `JWT_SECRET_KEY` to a secure value
|
|
3. Configure OAuth provider
|
|
4. Use production Docker Compose profile:
|
|
```bash
|
|
docker compose --profile production up -d
|
|
```
|
|
|
|
### Scaling Considerations
|
|
- Use PostgreSQL instead of SQLite for production
|
|
- Add Redis for caching and sessions
|
|
- Configure load balancing with multiple service instances
|
|
- Use external OAuth provider (Auth0, Firebase Auth)
|
|
- Implement logging and monitoring
|
|
|
|
## 🤝 Contributing
|
|
|
|
1. Fork the repository
|
|
2. Create a feature branch: `git checkout -b feature/amazing-feature`
|
|
3. Make your changes
|
|
4. Run tests: `pytest backend/ && npm test --prefix frontend`
|
|
5. Commit changes: `git commit -m 'Add amazing feature'`
|
|
6. Push to branch: `git push origin feature/amazing-feature`
|
|
7. Open a Pull Request
|
|
|
|
## 📝 License
|
|
|
|
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
|
|
## 🙏 Acknowledgments
|
|
|
|
- Inspired by the French game "Déconnaissance"
|
|
- Built with modern web technologies and best practices
|
|
- Sample questions curated for educational entertainment |