159 lines
5.6 KiB
Python
159 lines
5.6 KiB
Python
import json
|
|
import random
|
|
from pathlib import Path
|
|
from datetime import datetime
|
|
from typing import List, Dict, Any
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class TemplateManager:
|
|
"""Manages prompt templates with placeholders and random selection."""
|
|
|
|
def __init__(self, templates_dir: str = "templates", timezone_name: str = "UTC"):
|
|
self.templates_dir = Path(templates_dir)
|
|
self.templates_dir.mkdir(exist_ok=True)
|
|
self.templates = []
|
|
self._timezone = None
|
|
self._timezone_name = timezone_name
|
|
self._init_timezone()
|
|
self._load_templates()
|
|
|
|
def _init_timezone(self):
|
|
"""Initialize timezone."""
|
|
import pytz
|
|
|
|
try:
|
|
self._timezone = pytz.timezone(self._timezone_name)
|
|
except Exception as e:
|
|
logger.warning(f"Unknown timezone '{self._timezone_name}', falling back to UTC: {e}")
|
|
self._timezone = pytz.UTC
|
|
self._timezone_name = "UTC"
|
|
|
|
def _get_current_time(self):
|
|
"""Get current time in configured timezone."""
|
|
return datetime.now(self._timezone)
|
|
|
|
def _load_templates(self):
|
|
"""Load templates from JSON files in the templates directory."""
|
|
if not self.templates_dir.exists():
|
|
self._create_default_templates()
|
|
|
|
for template_file in self.templates_dir.glob("*.json"):
|
|
try:
|
|
with open(template_file, 'r') as f:
|
|
template_data = json.load(f)
|
|
if isinstance(template_data, list):
|
|
self.templates.extend(template_data)
|
|
else:
|
|
self.templates.append(template_data)
|
|
except Exception as e:
|
|
logger.error(f"Error loading template {template_file}: {e}")
|
|
|
|
if not self.templates:
|
|
self._create_default_templates()
|
|
|
|
def _create_default_templates(self):
|
|
"""Create default templates if none exist."""
|
|
default_templates = [
|
|
{
|
|
"name": "Daily Reflection",
|
|
"title": "Daily Reflection",
|
|
"prompt": "What are your thoughts about {date} at {time}?",
|
|
"description": "A simple daily reflection prompt"
|
|
},
|
|
{
|
|
"name": "Mindfulness Check",
|
|
"title": "Mindfulness Check",
|
|
"prompt": "How are you feeling right now on this {day} at {time}?",
|
|
"description": "A mindfulness check-in prompt"
|
|
},
|
|
{
|
|
"name": "Gratitude Prompt",
|
|
"title": "Gratitude Prompt",
|
|
"prompt": "What are three things you're grateful for on {date} during this {time_of_day}?",
|
|
"description": "A gratitude reflection prompt"
|
|
}
|
|
]
|
|
|
|
template_file = self.templates_dir / "default.json"
|
|
with open(template_file, 'w') as f:
|
|
json.dump(default_templates, f, indent=2)
|
|
|
|
self.templates.extend(default_templates)
|
|
|
|
def _get_time_of_day(self, hour: int) -> str:
|
|
"""Return time of day based on hour."""
|
|
if 5 <= hour < 12:
|
|
return "morning"
|
|
elif 12 <= hour < 17:
|
|
return "afternoon"
|
|
elif 17 <= hour < 21:
|
|
return "evening"
|
|
else:
|
|
return "night"
|
|
|
|
def _fill_placeholders(self, template: str) -> str:
|
|
"""Fill placeholders in template with current values."""
|
|
now = self._get_current_time()
|
|
placeholders = {
|
|
"date": now.strftime("%Y-%m-%d"),
|
|
"time": now.strftime("%H:%M"),
|
|
"day": now.strftime("%A"),
|
|
"time_of_day": self._get_time_of_day(now.hour),
|
|
"weekday": now.strftime("%A"),
|
|
"month": now.strftime("%B"),
|
|
"day_of_month": str(now.day)
|
|
}
|
|
|
|
for placeholder, value in placeholders.items():
|
|
template = template.replace(f"{{{placeholder}}}", value)
|
|
|
|
return template
|
|
|
|
def get_random_prompt(self) -> dict:
|
|
"""Get a random prompt template with placeholders filled.
|
|
|
|
Returns:
|
|
dict: Contains 'prompt' and 'title' keys with filled placeholders
|
|
"""
|
|
if not self.templates:
|
|
logger.warning("No templates available")
|
|
return {
|
|
"prompt": "What are your thoughts right now?",
|
|
"title": "Random Thought"
|
|
}
|
|
|
|
template = random.choice(self.templates)
|
|
prompt = template.get("prompt", "")
|
|
title = template.get("title", template.get("name", "Notification"))
|
|
|
|
return {
|
|
"prompt": self._fill_placeholders(prompt),
|
|
"title": self._fill_placeholders(title)
|
|
}
|
|
|
|
def add_template(self, name: str, prompt: str, description: str = "", title: str = None):
|
|
"""Add a new template to the system."""
|
|
if title is None:
|
|
title = name
|
|
|
|
new_template = {
|
|
"name": name,
|
|
"title": title,
|
|
"prompt": prompt,
|
|
"description": description
|
|
}
|
|
self.templates.append(new_template)
|
|
|
|
# Save to file
|
|
template_file = self.templates_dir / "custom.json"
|
|
custom_templates = []
|
|
if template_file.exists():
|
|
with open(template_file, 'r') as f:
|
|
custom_templates = json.load(f)
|
|
|
|
custom_templates.append(new_template)
|
|
|
|
with open(template_file, 'w') as f:
|
|
json.dump(custom_templates, f, indent=2) |