Untitled
ACHIEVEMENTS = { 'first_sort': { 'id': 'first_sort', 'name': 'First Steps', 'description': 'Sort your first item', 'condition': lambda metrics: metrics['basic_metrics']['total_items_sorted'] >= 1, 'progress': lambda metrics: min(1, metrics['basic_metrics']['total_items_sorted']), 'target': 1 }, 'perfect_balance': { 'id': 'perfect_balance', 'name': 'Perfect Balance', 'description': 'Keep all bins within 20% fill level of each other for 7 days', 'condition': lambda metrics: metrics.get('balance_tracking', {}).get('days_within_threshold', 0) >= 7, 'progress': lambda metrics: metrics.get('balance_tracking', {}).get('days_within_threshold', 0), 'target': 7 }, 'efficient_manager': { 'id': 'efficient_manager', 'name': 'Efficient Manager', 'description': 'Maintain average fill rate below 80% for all bins for a month', 'condition': lambda metrics: all(bin_data.get('avg_fill_rate', 100) < 80 for bin_data in metrics['bin_specialization'].values()), 'progress': lambda metrics: sum(1 for bin_data in metrics['bin_specialization'].values() if bin_data.get('avg_fill_rate', 100) < 80), 'target': 4 # Assuming 4 bins total }, 'time_lord': { 'id': 'time_lord', 'name': 'Time Lord', 'description': 'Sort items in every hour of the day', 'condition': lambda metrics: len(set(metrics['hour_coverage']['hours_sorted'])) == 24, 'progress': lambda metrics: len(set(metrics['hour_coverage']['hours_sorted'])), 'target': 24 }, 'early_bird': { 'id': 'early_bird', 'name': 'Early Bird', 'description': 'Sort items before 9 AM', 'condition': lambda metrics: any(hour < 9 for hour in metrics['hour_coverage']['hours_sorted']), 'progress': lambda metrics: 1 if any(hour < 9 for hour in metrics['hour_coverage']['hours_sorted']) else 0, 'target': 1 }, 'night_owl': { 'id': 'night_owl', 'name': 'Night Owl', 'description': 'Sort items after 8 PM', 'condition': lambda metrics: any(hour >= 20 for hour in metrics['hour_coverage']['hours_sorted']), 'progress': lambda metrics: 1 if any(hour >= 20 for hour in metrics['hour_coverage']['hours_sorted']) else 0, 'target': 1 }, 'weekend_warrior': { 'id': 'weekend_warrior', 'name': 'Weekend Warrior', 'description': 'Sort items on 4 consecutive weekends', 'condition': lambda metrics: metrics['hour_coverage']['weekend_streak']['count'] >= 3, 'progress': lambda metrics: metrics['hour_coverage']['weekend_streak']['count'], 'target': 3 }, 'quick_draw': { 'id': 'quick_draw', 'name': 'Quick Draw', 'description': 'Sort 3 items within 5 minutes', 'condition': lambda metrics: metrics['short_term_tracking']['items_last_5_minutes']['count'] >= 3, 'progress': lambda metrics: metrics['short_term_tracking']['items_last_5_minutes']['count'], 'target': 3 }, 'seasonal_master': { 'id': 'seasonal_master', 'name': 'Seasonal Master', 'description': 'Sort items in both summer and winter', 'condition': lambda metrics: all(metrics['seasonal_tracking']['seasonal_counts'][season] > 0 for season in ['summer', 'winter']), 'progress': lambda metrics: sum(1 for season in ['summer', 'winter'] if metrics['seasonal_tracking']['seasonal_counts'][season] > 0), 'target': 2 }, 'summer_sorter': { 'id': 'summer_sorter', 'name': 'Summer Sorter', 'description': 'Sort 500 items during summer months', 'condition': lambda metrics: metrics['seasonal_tracking']['seasonal_counts']['summer'] >= 500, 'progress': lambda metrics: metrics['seasonal_tracking']['seasonal_counts']['summer'], 'target': 500 }, 'daily_dedication': { 'id': 'daily_dedication', 'name': 'Daily Dedication', 'description': 'Sort items 7 days in a row', 'condition': lambda metrics: metrics['short_term_tracking']['current_sorting_streak']['days'] >= 7, 'progress': lambda metrics: metrics['short_term_tracking']['current_sorting_streak']['days'], 'target': 7 }, 'monthly_master': { 'id': 'monthly_master', 'name': 'Monthly Master', 'description': 'Use system every day for a month', 'condition': lambda metrics: metrics['short_term_tracking']['current_sorting_streak']['days'] >= 30, 'progress': lambda metrics: metrics['short_term_tracking']['current_sorting_streak']['days'], 'target': 30 }, 'eco_warrior': { 'id': 'eco_warrior', 'tiers': ['bronze', 'silver', 'gold'], 'name': 'Earth Saver', 'description': 'Save CO2 through proper recycling', 'thresholds': [10, 50, 100], # kg CO2 'condition': lambda metrics, tier_idx: metrics['environmental_impact']['co2_saved'] >= [10, 50, 100][tier_idx], 'progress': lambda metrics, tier_idx: min(metrics['environmental_impact']['co2_saved'], [10, 50, 100][tier_idx]), 'target': lambda tier_idx: [10, 50, 100][tier_idx] }, 'tree_hero': { 'id': 'tree_hero', 'name': 'Tree Hero', 'description': 'Save equivalent of 10 trees through paper recycling', 'condition': lambda metrics: metrics['environmental_impact']['trees_saved'] >= 10, 'progress': lambda metrics: metrics['environmental_impact']['trees_saved'], 'target': 10 } } # Add bin specialization achievements for bin_type in ['Paper', 'Organic', 'Recycling', 'Residual']: achievement_id = f'{bin_type.lower()}_specialist' ACHIEVEMENTS[achievement_id] = { 'id': achievement_id, 'name': f'{bin_type} Specialist', 'description': f'Sort 100 {bin_type} items', 'condition': lambda metrics, bt=bin_type: sum(1 for result in metrics['basic_metrics']['classification_results'] if result['classification_result'] == bt) >= 100, 'progress': lambda metrics, bt=bin_type: sum(1 for result in metrics['basic_metrics']['classification_results'] if result['classification_result'] == bt), 'target': 100 }
Leave a Comment