Spaces:
Running
Running
SilverElixir commited on
Commit ·
a726d19
1
Parent(s): 8fdbe53
Retryable 503 on broken webhook body, tz-aware export timestamp
Browse files- lumen_admin.py +5 -2
lumen_admin.py
CHANGED
|
@@ -11,7 +11,7 @@ import hmac
|
|
| 11 |
import logging
|
| 12 |
import os
|
| 13 |
import time
|
| 14 |
-
from datetime import datetime
|
| 15 |
from typing import Any
|
| 16 |
|
| 17 |
import aiohttp
|
|
@@ -164,6 +164,9 @@ async def webhook_handler(request: Request) -> Any:
|
|
| 164 |
return JSONResponse(status_code=503, content={"ok": False, "retry": True})
|
| 165 |
except Exception as exc:
|
| 166 |
log.warning("[webhook] Failed to process incoming update: %s", exc)
|
|
|
|
|
|
|
|
|
|
| 167 |
return {"ok": True}
|
| 168 |
|
| 169 |
async def probe_url(session: Any, url: str, *, timeout_sec: float = 6.0, redact: str = "") -> dict[str, Any]:
|
|
@@ -251,7 +254,7 @@ async def export_state(request: Request) -> dict[str, Any]:
|
|
| 251 |
# Квота вложенная (счётчики per-model) — только deepcopy отцепляет её целиком.
|
| 252 |
quota = copy.deepcopy(dict(bot.GLOBAL_QUOTA))
|
| 253 |
return {
|
| 254 |
-
"exported_at": datetime.now().isoformat(),
|
| 255 |
"chats": chats,
|
| 256 |
"global_quota": quota,
|
| 257 |
}
|
|
|
|
| 11 |
import logging
|
| 12 |
import os
|
| 13 |
import time
|
| 14 |
+
from datetime import datetime, timezone
|
| 15 |
from typing import Any
|
| 16 |
|
| 17 |
import aiohttp
|
|
|
|
| 164 |
return JSONResponse(status_code=503, content={"ok": False, "retry": True})
|
| 165 |
except Exception as exc:
|
| 166 |
log.warning("[webhook] Failed to process incoming update: %s", exc)
|
| 167 |
+
# Битое тело — не успех: пусть Telegram повторит, а не считает дроп
|
| 168 |
+
# обработанным (аудит M2, 10.2026).
|
| 169 |
+
return JSONResponse(status_code=503, content={"ok": False, "retry": True})
|
| 170 |
return {"ok": True}
|
| 171 |
|
| 172 |
async def probe_url(session: Any, url: str, *, timeout_sec: float = 6.0, redact: str = "") -> dict[str, Any]:
|
|
|
|
| 254 |
# Квота вложенная (счётчики per-model) — только deepcopy отцепляет её целиком.
|
| 255 |
quota = copy.deepcopy(dict(bot.GLOBAL_QUOTA))
|
| 256 |
return {
|
| 257 |
+
"exported_at": datetime.now(timezone.utc).isoformat(),
|
| 258 |
"chats": chats,
|
| 259 |
"global_quota": quota,
|
| 260 |
}
|