securityChatbot / app /routers /webhook.py
AI Assistant
feat: add support for Gemini API and implement state management for quiz turns and answers
b85377a
Raw History Blame Contribute Delete
3.65 kB
from fastapi import APIRouter
from app.models.schemas import MessagePayload
from app.services.state_manager import *
from app.services.llm_service import *
router = APIRouter()
@router.post("/webhook")
async def handle_webhook(payload: MessagePayload):
try:
user_id = payload.user_id
message = payload.message.strip()
current_state = get_state(user_id)
if message == "/train":
set_state(user_id, "CHOOSING_MODE")
return {"response": "يا هندسة اختار عايز إيه:\n1- محاكاة اختراق (Simulation)\n2- اختبار معلومات (Quiz)"}
if current_state == "CHOOSING_MODE":
if message == "1":
set_state(user_id, "CHOOSING_SCENARIO")
return {"response": "اختار السيناريو:\n1- بنك\n2- شحن\n3- دعم فني\n4- واتساب\n5- مسابقة"}
elif message == "2":
set_state(user_id, "QUIZ_ACTIVE")
quiz_data = get_quiz_llm()
lines = quiz_data.split("\n")
question_text = "\n".join([line for line in lines if "Correct Answer" not in line and "Explain" not in line])
correct_answer = [line for line in lines if "Correct Answer" in line][0].split(":")[1].strip()
explanation = [line for line in lines if "Explain" in line][0].split(":")[1].strip()
set_quiz_answer(user_id, f"{correct_answer}|{explanation}")
return {"response": f"يلا بينا يا بطل، ده السؤال:\n\n{question_text}"}
if current_state == "QUIZ_ACTIVE":
stored_data = get_quiz_answer(user_id).split("|")
correct = stored_data[0].lower()
explanation = stored_data[1]
user_ans = message.lower().replace(")", "").strip()
set_state(user_id, "NORMAL")
if user_ans == correct:
return {"response": f"الله ينور! إجابة صح.\n\nالمعلومة: {explanation}"}
else:
return {"response": f"للأسف غلط.. الإجابة الصح كانت ({correct.upper()}).\n\nالمعلومة: {explanation}"}
if current_state == "CHOOSING_SCENARIO":
if message in SCENARIOS:
set_scenario(user_id, message)
set_state(user_id, "CHOOSING_LEVEL")
return {"response": "اختار المستوى:\n1- سهل\n2- متوسط\n3- صعب"}
return {"response": "اختار رقم من 1 لـ 5 يا غالي."}
if current_state == "CHOOSING_LEVEL":
if message in DIFFICULTY_LEVELS:
set_level(user_id, message)
set_state(user_id, "SIMULATION")
reset_turns(user_id)
return {"response": attacker_llm(user_id, "ابدأ المحادثة")}
return {"response": "اختار ليفل من 1 لـ 3."}
if current_state == "SIMULATION":
if evaluator_llm(user_id, message) == "FAILED":
set_state(user_id, "NORMAL")
return {"response": "وقعت في الفخ! البنك مش بيطلب OTP أبداً."}
increment_turn(user_id)
if get_turn(user_id) >= 4:
set_state(user_id, "NORMAL")
return {"response": "عاش! قدرت تصد المهاجم بنجاح."}
return {"response": attacker_llm(user_id, message)}
return {"response": normal_chat_llm(message)}
except Exception as e:
return {"response": f"حصل عطل فني: {str(e)}"}