68 lines
2.5 KiB
Python
68 lines
2.5 KiB
Python
import logging
|
||
from datetime import datetime
|
||
|
||
import database
|
||
import events
|
||
from bot import telegram as tg
|
||
from intradesk import formatter
|
||
|
||
log = logging.getLogger(__name__)
|
||
|
||
|
||
def handle_webhook(payload: dict):
|
||
try:
|
||
task_id = payload.get("Id")
|
||
op_type = payload.get("Event", {}).get("OperationType", "")
|
||
fields = payload.get("Fields", {})
|
||
number = fields.get("Number", "?")
|
||
|
||
if not task_id:
|
||
log.warning("Webhook payload missing Id — skipped")
|
||
return
|
||
|
||
if op_type not in ("Created", "Updated"):
|
||
log.debug(f"OperationType '{op_type}' — skipped")
|
||
return
|
||
|
||
changes, comments = formatter.parse_lifetime(fields)
|
||
base_text = formatter.format_notification(payload)
|
||
group_id = formatter.get_executor_group_id(fields)
|
||
closed = formatter.is_final(fields)
|
||
is_to_now = formatter.is_to(fields)
|
||
|
||
# Формируем плоский список новых строк событий для накопления в посте
|
||
new_event_lines = changes + [f"💬 {c}" for c in comments]
|
||
|
||
# Если заявка новая в БД — добавляем описание первым событием
|
||
is_new_task = not database.get_message_data(task_id)
|
||
if is_new_task:
|
||
desc_event = formatter.get_description_event(fields)
|
||
if desc_event:
|
||
new_event_lines = [desc_event] + new_event_lines
|
||
|
||
events.broadcast({
|
||
"type": "webhook",
|
||
"timestamp": datetime.utcnow().strftime("%d.%m.%Y %H:%M:%S"),
|
||
"task_id": task_id,
|
||
"task_number": number,
|
||
"operation": op_type,
|
||
"raw": payload,
|
||
"parsed": {
|
||
"changes": changes,
|
||
"comments": comments,
|
||
},
|
||
"formatted": base_text,
|
||
})
|
||
|
||
tg.recreate_post(
|
||
task_id, str(number), base_text, group_id,
|
||
closed=closed, new_event_lines=new_event_lines,
|
||
)
|
||
|
||
# ── Гифка для ТО ──────────────────────────────────────────────────────
|
||
# Отправляем (и удаляем предыдущую) при любом вебхуке если ТО = да
|
||
if is_to_now:
|
||
tg.send_gif_for_to(task_id)
|
||
|
||
except Exception:
|
||
log.exception("Error while handling webhook")
|