refactor(sleep): 解耦SleepManagerScheduleManager的依赖关系

将日程表获取的逻辑从`SleepManager`转移到`TimeChecker`中,并使其直接从全局的`schedule_manager`实例获取日程,消除了`SleepManager`对日程表的直接管理责任。

这一重构简化了`SleepManager`的职责,使其更专注于睡眠状态的管理,同时提高了模块间的独立性。

- `SleepManager`不再持有`today_schedule`状态。
- `TimeChecker`现在直接从`schedule_manager`获取日程,不再依赖于`SleepManager`传递。
- 移除了`ScheduleManager`中对`sleep_manager`的引用和更新操作。
This commit is contained in:
minecraft1024a
2025-09-07 12:28:15 +08:00
parent d2e48e5b17
commit 1e2eb977bb
3 changed files with 12 additions and 21 deletions

View File

@@ -25,8 +25,7 @@ class SleepManager:
"""
初始化睡眠管理器。
"""
self.time_checker = TimeChecker(self) # 时间检查器,用于判断当前是否处于理论睡眠时间
self.today_schedule: Optional[List[Dict[str, Any]]] = None # 当天的日程安排
self.time_checker = TimeChecker() # 时间检查器,用于判断当前是否处于理论睡眠时间
self.last_sleep_log_time = 0 # 上次记录睡眠日志的时间戳
self.sleep_log_interval = 35 # 睡眠日志记录间隔(秒)
@@ -284,14 +283,6 @@ class SleepManager:
logger.info(f"将在 {re_sleep_delay_minutes} 分钟后尝试重新入睡。")
self._save_sleep_state()
def get_today_schedule(self) -> Optional[List[Dict[str, Any]]]:
"""获取今天的日程安排。"""
return self.today_schedule
def update_today_schedule(self, schedule: Optional[List[Dict[str, Any]]]):
"""更新今天的日程安排。"""
self.today_schedule = schedule
def _save_sleep_state(self):
"""将当前所有睡眠相关的状态打包并保存到本地存储。"""
state_data = {

View File

@@ -1,19 +1,19 @@
from datetime import datetime, time, timedelta
from typing import Optional
from typing import Optional, List, Dict, Any
import random
from src.common.logger import get_logger
from src.config.config import global_config
from src.schedule.schedule_manager import schedule_manager
logger = get_logger("time_checker")
class TimeChecker:
def __init__(self, schedule_source):
self.schedule_source = schedule_source
def __init__(self):
# 缓存当天的偏移量,确保一天内使用相同的偏移量
self._daily_sleep_offset = None
self._daily_wake_offset = None
self._daily_sleep_offset: int = 0
self._daily_wake_offset: int = 0
self._offset_date = None
def _get_daily_offsets(self):
@@ -34,9 +34,13 @@ class TimeChecker:
return self._daily_sleep_offset, self._daily_wake_offset
def get_today_schedule(self) -> Optional[List[Dict[str, Any]]]:
"""从全局 ScheduleManager 获取今天的日程安排。"""
return schedule_manager.today_schedule
def is_in_theoretical_sleep_time(self, now_time: time) -> tuple[bool, Optional[str]]:
if global_config.sleep_system.sleep_by_schedule:
if self.schedule_source.get_today_schedule():
if self.get_today_schedule():
return self._is_in_schedule_sleep_time(now_time)
else:
return self._is_in_sleep_time(now_time)
@@ -46,7 +50,7 @@ class TimeChecker:
def _is_in_schedule_sleep_time(self, now_time: time) -> tuple[bool, Optional[str]]:
"""检查当前时间是否落在日程表的任何一个睡眠活动中"""
sleep_keywords = ["休眠", "睡觉", "梦乡"]
today_schedule = self.schedule_source.get_today_schedule()
today_schedule = self.get_today_schedule()
if today_schedule:
for event in today_schedule:
try:

View File

@@ -7,7 +7,6 @@ from src.common.database.sqlalchemy_models import Schedule, get_db_session
from src.config.config import global_config
from src.common.logger import get_logger
from src.manager.async_task_manager import AsyncTask, async_task_manager
from ..chat.chat_loop.sleep_manager.sleep_manager import SleepManager
from .database import update_plan_usage
from .llm_generator import ScheduleLLMGenerator
from .plan_manager import PlanManager
@@ -23,7 +22,6 @@ class ScheduleManager:
self.plan_manager = PlanManager()
self.daily_task_started = False
self.schedule_generation_running = False
self.sleep_manager = SleepManager()
async def start_daily_schedule_generation(self):
if not self.daily_task_started:
@@ -45,7 +43,6 @@ class ScheduleManager:
schedule_data = self._load_schedule_from_db(today_str)
if schedule_data:
self.today_schedule = schedule_data
self.sleep_manager.update_today_schedule(self.today_schedule)
self._log_loaded_schedule(today_str)
return
@@ -100,7 +97,6 @@ class ScheduleManager:
if schedule_data:
self._save_schedule_to_db(today_str, schedule_data)
self.today_schedule = schedule_data
self.sleep_manager.update_today_schedule(self.today_schedule)
self._log_generated_schedule(today_str, schedule_data)
if sampled_plans: