Spaces:
Sleeping
Sleeping
File size: 6,667 Bytes
ffb5f88 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
"""
Post Event Feedback Scenario Handler
Collects feedback after user attends an event
"""
from typing import Dict, Any
from .base_handler import BaseScenarioHandler
class PostEventFeedbackHandler(BaseScenarioHandler):
"""
Handle post-event feedback flow
Requires initial_data: {event_name, event_date, event_id}
Steps:
1. Ask for rating (1-5 stars)
2. Ask what they liked most
3. Ask for improvement suggestions
4. Thank + ask if want similar events
5. Collect email for future events
"""
def start(self, initial_data: Dict = None) -> Dict[str, Any]:
"""Start feedback flow with event context"""
initial_data = initial_data or {}
event_name = initial_data.get('event_name', 'sự kiện')
return {
"message": f"Cảm ơn bạn đã tham dự *{event_name}* hôm qua! 🎉\n\nBạn thấy trải nghiệm như thế nào? (1-5 sao)",
"new_state": {
"active_scenario": "post_event_feedback",
"scenario_step": 1,
"scenario_data": initial_data
}
}
def next_step(self, current_step: int, user_input: str, scenario_data: Dict) -> Dict[str, Any]:
"""Process feedback and advance"""
expected_type = self._get_expected_type(current_step)
unexpected = self.handle_unexpected_input(user_input, expected_type, current_step)
if unexpected:
return unexpected
# STEP 1: Collect rating
if current_step == 1:
rating = self._extract_rating(user_input)
scenario_data['rating'] = rating
if rating >= 4:
msg = "Tuyệt vời! 🎉 Bạn thích điểm gì nhất về event?"
else:
msg = "Cảm ơn feedback! Bạn thấy event cần cải thiện điểm nào?"
return {
"message": msg,
"new_state": {
"active_scenario": "post_event_feedback",
"scenario_step": 2,
"scenario_data": scenario_data
},
"scenario_active": True
}
# STEP 2: What they liked/disliked
elif current_step == 2:
scenario_data['feedback_text'] = user_input
return {
"message": "Cảm ơn bạn nhiều! Feedback này giúp chúng mình rất nhiều 💙\n\nBạn muốn nhận thông tin về các event tương tự không?",
"new_state": {
"active_scenario": "post_event_feedback",
"scenario_step": 4,
"scenario_data": scenario_data
},
"scenario_active": True
}
# STEP 4: Want similar events?
elif current_step == 4:
choice = self._detect_yes_no(user_input)
if choice == 'yes':
return {
"message": "Tuyệt! Cho mình xin email để gửi thông tin event sắp tới nhé?",
"new_state": {
"active_scenario": "post_event_feedback",
"scenario_step": 5,
"scenario_data": scenario_data
},
"scenario_active": True
}
else:
# Save feedback without email
self._save_feedback(scenario_data)
return {
"message": "Okie! Cảm ơn bạn đã dành thời gian góp ý 🙏",
"new_state": None,
"scenario_active": False,
"end_scenario": True
}
# STEP 5: Collect email
elif current_step == 5:
email = user_input.strip()
if not self._validate_email(email):
return {
"message": "Email này có vẻ không đúng. Bạn nhập lại giúp mình nhé?",
"new_state": None,
"scenario_active": True
}
scenario_data['email'] = email
# Save feedback + email
self._save_feedback(scenario_data)
# Save lead
try:
self.lead_storage.save_lead(
event_name=scenario_data.get('event_name'),
email=email,
interests={"wants_similar_events": True},
session_id=scenario_data.get('session_id')
)
print(f"📧 Feedback + lead saved: {email}")
except Exception as e:
print(f"⚠️ Error saving lead: {e}")
return {
"message": "Cảm ơn bạn! Mình sẽ gửi thông tin event mới cho bạn sớm nhất ✨",
"new_state": None,
"scenario_active": False,
"end_scenario": True
}
# Fallback
return {
"message": "Cảm ơn bạn! Hẹn gặp lại ✨",
"new_state": None,
"scenario_active": False,
"end_scenario": True
}
def _get_expected_type(self, step: int) -> str:
"""Get expected input type"""
type_map = {
1: 'rating',
2: 'text',
4: 'choice',
5: 'email'
}
return type_map.get(step, 'text')
def _extract_rating(self, user_input: str) -> int:
"""Extract rating from user input"""
import re
# Look for numbers 1-5
match = re.search(r'[1-5]', user_input)
if match:
return int(match.group())
# Default to 3 if can't extract
return 3
def _detect_yes_no(self, user_input: str) -> str:
"""Detect yes/no"""
input_lower = user_input.lower()
return 'yes' if any(k in input_lower for k in ['có', 'yes', 'ok', 'được', 'ừ']) else 'no'
def _save_feedback(self, scenario_data: Dict):
"""Save feedback to database (placeholder)"""
# TODO: Implement actual feedback storage
print(f"💾 Feedback saved: {scenario_data.get('rating')} stars - {scenario_data.get('feedback_text', '')[:50]}")
|