Spaces:
Sleeping
Sleeping
| from typing import Dict, List | |
| class RewardSystem: | |
| def __init__(self, config, db_manager): | |
| self.config = config | |
| self.db = db_manager | |
| self.task_rewards = config.TASK_REWARDS | |
| def calculate_task_reward(self, task_type: str, difficulty: str, completion_data: Dict = None) -> int: | |
| """Calculate coins for completed task""" | |
| base_reward = self.task_rewards.get(task_type, 10) | |
| # Difficulty multiplier | |
| difficulty_multipliers = { | |
| "easy": 1.0, | |
| "medium": 1.3, | |
| "hard": 1.6 | |
| } | |
| multiplier = difficulty_multipliers.get(difficulty, 1.0) | |
| # Quality bonus based on completion data | |
| quality_bonus = 0 | |
| if completion_data: | |
| if completion_data.get('quality_rating', 0) >= 4: | |
| quality_bonus = 5 | |
| if completion_data.get('exceeded_expectations', False): | |
| quality_bonus += 3 | |
| total_reward = int(base_reward * multiplier) + quality_bonus | |
| return total_reward | |
| def award_task_completion(self, user_id: str, task_id: str, completion_data: Dict = None) -> int: | |
| """Award coins for completing a task""" | |
| # Get task details | |
| task = self.db.db[self.config.TASKS_COLLECTION].find_one({"task_id": task_id}) | |
| if not task or task['status'] == 'completed': | |
| return 0 | |
| # Calculate reward | |
| coins = self.calculate_task_reward( | |
| task['task_type'], | |
| task.get('difficulty', 'medium'), | |
| completion_data | |
| ) | |
| # Update task as completed | |
| self.db.complete_task(task_id, completion_data) | |
| # Award coins | |
| reward_type = f"task_completion_{task['task_type']}" | |
| if self.db.update_user_coins(user_id, coins, reward_type): | |
| return coins | |
| return 0 | |
| def get_reward_summary(self, user_id: str) -> Dict: | |
| """Get user's reward summary""" | |
| user = self.db.get_user_profile(user_id) | |
| completed_tasks = self.db.get_user_tasks(user_id, "completed") | |
| return { | |
| "total_coins": user.get('coins', 0) if user else 0, | |
| "total_earned": user.get('total_coins_earned', 0) if user else 0, | |
| "completed_tasks": len(completed_tasks), | |
| "pending_tasks": len(self.db.get_user_tasks(user_id, "pending")) | |
| } |