feat(sleep): 引入休眠阶段消息唤醒机制与愤怒情绪模式

- 扩展日程休眠逻辑,支持在睡眠时段通过@/私聊唤醒
- 新增 WakeUpManager 持续追踪唤醒阈值并触发愤怒状态
- MoodManager 中追加“被吵醒”情绪标识与愤怒提示模板
- HeartFChat 主循环集成唤醒处理管线,兼容原逻辑
- 配置中心开放阈值、衰减、持续时间等可调参数

此举允许机器人即便在“睡觉”时也能被重要消息强行“闹醒”,并以生气口吻做出回应,提升拟人化交互体验。
This commit is contained in:
minecraft1024a
2025-08-21 16:19:34 +08:00
parent 74ec33580a
commit 4f7836ae0c
9 changed files with 609 additions and 11 deletions

View File

@@ -312,8 +312,16 @@ class ScheduleManager:
continue
return None
def is_sleeping(self) -> bool:
"""检查当前是否处于休眠时间(日程表的第一项或最后一项)"""
def is_sleeping(self, wakeup_manager=None) -> bool:
"""
检查当前是否处于休眠时间(日程表的第一项或最后一项)
Args:
wakeup_manager: 可选的唤醒度管理器,用于检查是否被唤醒
Returns:
bool: 是否处于休眠状态
"""
if not global_config.schedule.enable_is_sleep:
return False
if not self.today_schedule:
@@ -325,6 +333,7 @@ class ScheduleManager:
first_item = self.today_schedule[0]
last_item = self.today_schedule[-1]
is_in_sleep_time = False
for item in [first_item, last_item]:
try:
time_range = item.get("time_range")
@@ -338,16 +347,27 @@ class ScheduleManager:
if start_time <= end_time:
# 同一天内的时间段
if start_time <= now < end_time:
return True
is_in_sleep_time = True
break
else:
# 跨天的时间段
if now >= start_time or now < end_time:
return True
is_in_sleep_time = True
break
except (ValueError, KeyError, AttributeError) as e:
logger.warning(f"解析休眠日程事件失败: {item}, 错误: {e}")
continue
return False
# 如果不在休眠时间,直接返回False
if not is_in_sleep_time:
return False
# 如果在休眠时间,检查是否被唤醒度管理器唤醒
if wakeup_manager and wakeup_manager.is_in_angry_state():
logger.debug("虽然在休眠时间,但已被唤醒度管理器唤醒")
return False
return True
def _validate_schedule_with_pydantic(self, schedule_data) -> bool:
"""使用Pydantic验证日程数据格式和完整性"""