#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
from typing import Dict, List, Any
from datetime import datetime
from .events import Event
[docs]
class ProfileData:
"""Container for profile data with events organized by category"""
def __init__(self):
self.events: Dict[str, List[Event]] = {}
self.metadata = {
'created_at': datetime.now().isoformat(),
'version': '2.0',
'total_events': 0
}
[docs]
def add_event(self, category: str, event: Event):
"""Add an event to the specified category"""
if category not in self.events:
self.events[category] = []
self.events[category].append(event)
self.metadata['total_events'] += 1
[docs]
def get_events(self, category: str) -> List[Event]:
"""Get all events for a category"""
return self.events.get(category, [])
[docs]
def get_categories(self) -> List[str]:
"""Get all available categories"""
return list(self.events.keys())
[docs]
def get_event_count(self, category: str = None) -> int:
"""Get event count for a category or total"""
if category:
return len(self.events.get(category, []))
return self.metadata['total_events']
[docs]
def remove_empty_categories(self):
"""Remove categories with no events"""
self.events = {k: v for k, v in self.events.items() if v}
self.metadata['total_events'] = sum(len(events) for events in self.events.values())
[docs]
def to_dict(self) -> Dict[str, Any]:
"""Convert profile data to dictionary for serialization"""
result = {}
# Convert events to dictionaries
for category, events in self.events.items():
result[category] = [event.to_dict() for event in events]
# Add metadata
result['_metadata'] = self.metadata
return result
[docs]
def to_json(self, indent: int = 4) -> str:
"""Convert profile data to JSON string"""
self.remove_empty_categories()
return json.dumps(self.to_dict(), indent=indent, default=self._json_serializer)
[docs]
def write_to_file(self, filename: str):
"""Write profile data to JSON file"""
try:
current_time = datetime.now()
timestamp = current_time.strftime("%Y-%m-%d_%H-%M-%S")
# Ensure filename is safe
base_filename = filename.replace(" ", "_") # Replace spaces with underscores
# Remove .json extension if present, we'll add it back at the end
if base_filename.endswith('.json'):
base_filename = base_filename[:-5] # Remove '.json'
safe_filename = f"profile_{base_filename}_{timestamp}.json"
with open(safe_filename, "w") as file:
file.write(self.to_json())
return safe_filename
except Exception as e:
print(f"[-] Error writing profile to file: {e}")
# Write debug file
debug_file = f"{filename}_debug.txt"
with open(debug_file, "w") as file:
file.write(str(self.to_dict()))
return debug_file
def _json_serializer(self, obj):
"""Custom JSON serializer for special objects"""
if isinstance(obj, Exception):
return str(obj)
if hasattr(obj, 'isoformat'): # datetime objects
return obj.isoformat()
raise TypeError(f"Object of type {obj.__class__.__name__} is not JSON serializable")
[docs]
def get_summary(self) -> Dict[str, Any]:
"""Get a summary of the profile data"""
summary = {
'total_events': self.metadata['total_events'],
'categories': len(self.events),
'created_at': self.metadata['created_at'],
'category_breakdown': {}
}
for category, events in self.events.items():
summary['category_breakdown'][category] = len(events)
return summary