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.
7.2 KiB
7.2 KiB
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
-
Clone and setup:
git clone <repository-url> cd know_foolery cp .env.example .env -
Start with Docker:
docker compose up --build -
Initialize database:
docker compose exec game-service python /app/shared/database/init_db.py -
Access the application:
- Frontend: http://localhost:3000
- API Gateway: http://localhost:8000
- API Docs: http://localhost:8000/docs
Local Development
Frontend:
cd frontend
npm install
npm run dev
Backend Services:
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 categoriesquestions- Quiz questions with hints and answersplayers- Player informationgame_sessions- Individual game sessionsgame_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
- Player enters name on home page
- Game session starts (30-minute timer)
- Random question presented with theme
- Player can submit answer (up to 3 attempts) or use hint
- Scoring applied based on correctness and hint usage
- Next question or game end
- 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
npm run dev # Start development server
npm run build # Build for production
npm run lint # Run ESLint
npm run preview # Preview production build
Backend
# 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
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 stringJWT_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
- Set environment variables for production
- Change
JWT_SECRET_KEYto a secure value - Configure OAuth provider
- Use production Docker Compose profile:
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
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Run tests:
pytest backend/ && npm test --prefix frontend - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
📝 License
This project is licensed under the MIT License - see the 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