init commit
This commit is contained in:
47
app/bots/editor/session.py
Normal file
47
app/bots/editor/session.py
Normal file
@@ -0,0 +1,47 @@
|
||||
from __future__ import annotations
|
||||
import time
|
||||
from dataclasses import dataclass, field
|
||||
from typing import Any, Dict, Optional
|
||||
|
||||
|
||||
DEFAULT_TTL = 60 * 60 # 1 час
|
||||
|
||||
|
||||
@dataclass
|
||||
class UserSession:
|
||||
channel_id: Optional[int] = None
|
||||
type: Optional[str] = None # text/photo/video/animation
|
||||
parse_mode: Optional[str] = None # HTML/MarkdownV2
|
||||
text: Optional[str] = None
|
||||
media_file_id: Optional[str] = None
|
||||
keyboard: Optional[dict] = None # {"rows": [[{"text","url"}], ...]}
|
||||
last_activity: float = field(default_factory=time.time)
|
||||
|
||||
def touch(self) -> None:
|
||||
self.last_activity = time.time()
|
||||
|
||||
|
||||
class SessionStore:
|
||||
"""Простое и быстрое in-memory хранилище с авто-очисткой."""
|
||||
|
||||
def __init__(self, ttl: int = DEFAULT_TTL) -> None:
|
||||
self._data: Dict[int, UserSession] = {}
|
||||
self._ttl = ttl
|
||||
|
||||
def get(self, uid: int) -> UserSession:
|
||||
s = self._data.get(uid)
|
||||
if not s:
|
||||
s = UserSession()
|
||||
self._data[uid] = s
|
||||
s.touch()
|
||||
self._cleanup()
|
||||
return s
|
||||
|
||||
def drop(self, uid: int) -> None:
|
||||
self._data.pop(uid, None)
|
||||
|
||||
def _cleanup(self) -> None:
|
||||
now = time.time()
|
||||
for uid in list(self._data.keys()):
|
||||
if now - self._data[uid].last_activity > self._ttl:
|
||||
del self._data[uid]
|
||||
Reference in New Issue
Block a user