79 lines
2.4 KiB
Python
79 lines
2.4 KiB
Python
import orjson
|
||
import time
|
||
from typing import Dict, List, Optional
|
||
from pathlib import Path
|
||
|
||
from src.common.logger import get_logger
|
||
|
||
# 数据存储路径
|
||
DATA_DIR = Path("data/frequency_analyzer")
|
||
DATA_DIR.mkdir(parents=True, exist_ok=True)
|
||
TRACKER_FILE = DATA_DIR / "chat_timestamps.json"
|
||
|
||
logger = get_logger("ChatFrequencyTracker")
|
||
|
||
|
||
class ChatFrequencyTracker:
|
||
"""
|
||
负责跟踪和存储用户聊天启动时间戳。
|
||
"""
|
||
|
||
def __init__(self):
|
||
self._timestamps: Dict[str, List[float]] = self._load_timestamps()
|
||
|
||
@staticmethod
|
||
def _load_timestamps() -> Dict[str, List[float]]:
|
||
"""从本地文件加载时间戳数据。"""
|
||
if not TRACKER_FILE.exists():
|
||
return {}
|
||
try:
|
||
with open(TRACKER_FILE, "rb") as f:
|
||
data = orjson.loads(f.read())
|
||
logger.info(f"成功从 {TRACKER_FILE} 加载了聊天时间戳数据。")
|
||
return data
|
||
except orjson.JSONDecodeError:
|
||
logger.warning(f"无法解析 {TRACKER_FILE},将创建一个新的空数据文件。")
|
||
return {}
|
||
except Exception as e:
|
||
logger.error(f"加载聊天时间戳数据时发生未知错误: {e}")
|
||
return {}
|
||
|
||
def _save_timestamps(self):
|
||
"""将当前的时间戳数据保存到本地文件。"""
|
||
try:
|
||
with open(TRACKER_FILE, "wb") as f:
|
||
f.write(orjson.dumps(self._timestamps))
|
||
except Exception as e:
|
||
logger.error(f"保存聊天时间戳数据到 {TRACKER_FILE} 时失败: {e}")
|
||
|
||
def record_chat_start(self, chat_id: str):
|
||
"""
|
||
记录一次聊天会话的开始。
|
||
|
||
Args:
|
||
chat_id (str): 唯一的聊天标识符 (例如,用户ID)。
|
||
"""
|
||
now = time.time()
|
||
if chat_id not in self._timestamps:
|
||
self._timestamps[chat_id] = []
|
||
|
||
self._timestamps[chat_id].append(now)
|
||
logger.debug(f"为 chat_id '{chat_id}' 记录了新的聊天时间: {now}")
|
||
self._save_timestamps()
|
||
|
||
def get_timestamps_for_chat(self, chat_id: str) -> Optional[List[float]]:
|
||
"""
|
||
获取指定聊天的所有时间戳记录。
|
||
|
||
Args:
|
||
chat_id (str): 聊天标识符。
|
||
|
||
Returns:
|
||
Optional[List[float]]: 时间戳列表,如果不存在则返回 None。
|
||
"""
|
||
return self._timestamps.get(chat_id)
|
||
|
||
|
||
# 创建一个全局单例
|
||
chat_frequency_tracker = ChatFrequencyTracker()
|