diff --git a/main.py b/main.py index e63d4b8..030f0e4 100644 --- a/main.py +++ b/main.py @@ -5,6 +5,7 @@ from __future__ import annotations import argparse import json import os +import random import sys import time from pathlib import Path diff --git a/openai_pool_orchestrator/mail_providers.py b/openai_pool_orchestrator/mail_providers.py index 25f4971..4a892a1 100755 --- a/openai_pool_orchestrator/mail_providers.py +++ b/openai_pool_orchestrator/mail_providers.py @@ -5,7 +5,9 @@ MailProvider 抽象层 from __future__ import annotations +import datetime import itertools +import email.utils import logging import random import re @@ -113,6 +115,34 @@ def _extract_code(content: str) -> Optional[str]: return None +def _message_timestamp(msg: Dict[str, Any]) -> float: + candidates = [ + msg.get("createdAt"), + msg.get("created_at"), + msg.get("receivedAt"), + msg.get("received_at"), + msg.get("updatedAt"), + msg.get("updated_at"), + msg.get("date"), + ] + for raw in candidates: + text = str(raw or "").strip() + if not text: + continue + try: + normalized = text.replace("Z", "+00:00") + return datetime.datetime.fromisoformat(normalized).timestamp() + except Exception: + pass + try: + parsed = email.utils.parsedate_to_datetime(text) + if parsed is not None: + return parsed.timestamp() + except Exception: + pass + return 0.0 + + # ==================== 抽象基类 ==================== class MailProvider(ABC): @@ -254,6 +284,8 @@ class MailTmProvider(MailProvider): messages = data if isinstance(data, list) else ( data.get("hydra:member") or data.get("messages") or [] ) + if isinstance(messages, list): + messages = sorted(messages, key=_message_timestamp, reverse=True) for msg in messages: if not isinstance(msg, dict): @@ -497,6 +529,8 @@ class DuckMailProvider(MailProvider): if resp.status_code == 200: data = resp.json() messages = data.get("hydra:member") or data.get("member") or data.get("data") or [] + if isinstance(messages, list): + messages = sorted(messages, key=_message_timestamp, reverse=True) for msg in (messages if isinstance(messages, list) else []): if not isinstance(msg, dict): continue