Untitled

 avatar
unknown
plain_text
a month ago
7.2 kB
2
Indexable
    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