This commit is contained in:
tt-P607
2025-09-07 12:13:56 +08:00
10 changed files with 63 additions and 18 deletions

1
.gitignore vendored
View File

@@ -337,3 +337,4 @@ MaiBot.code-workspace
/tests /tests
.kilocode/rules/MoFox.md .kilocode/rules/MoFox.md
src/chat/planner_actions/planner (2).py src/chat/planner_actions/planner (2).py
rust_video/Cargo.lock

View File

@@ -219,8 +219,8 @@ class ProactiveThinker:
) )
if response_text: if response_text:
# 将纯文本包装成 ResponseSet 格式 # 不要将纯文本包装成 ResponseSet 格式
response_set = [{"type": "text", "data": {"text": response_text}}] response_set = [response_text]
await self.cycle_processor.response_handler.send_response( await self.cycle_processor.response_handler.send_response(
response_set, time.time(), action_result.get("action_message") response_set, time.time(), action_result.get("action_message")
) )

View File

@@ -1,4 +1,5 @@
import time import time
import orjson
import random import random
from typing import Dict, Any, Tuple from typing import Dict, Any, Tuple

View File

@@ -1,5 +1,6 @@
from datetime import datetime, time from datetime import datetime, time, timedelta
from typing import Optional from typing import Optional
import random
from src.common.logger import get_logger from src.common.logger import get_logger
from src.config.config import global_config from src.config.config import global_config
@@ -10,15 +11,37 @@ logger = get_logger("time_checker")
class TimeChecker: class TimeChecker:
def __init__(self, schedule_source): def __init__(self, schedule_source):
self.schedule_source = schedule_source self.schedule_source = schedule_source
# 缓存当天的偏移量,确保一天内使用相同的偏移量
self._daily_sleep_offset = None
self._daily_wake_offset = None
self._offset_date = None
def _get_daily_offsets(self):
"""获取当天的睡眠和起床时间偏移量,每天生成一次"""
today = datetime.now().date()
# 如果是新的一天,重新生成偏移量
if self._offset_date != today:
sleep_offset_range = global_config.sleep_system.sleep_time_offset_minutes
wake_offset_range = global_config.sleep_system.wake_up_time_offset_minutes
# 生成 ±offset_range 范围内的随机偏移量
self._daily_sleep_offset = random.randint(-sleep_offset_range, sleep_offset_range)
self._daily_wake_offset = random.randint(-wake_offset_range, wake_offset_range)
self._offset_date = today
logger.debug(f"生成新的每日偏移量 - 睡觉时间偏移: {self._daily_sleep_offset}分钟, 起床时间偏移: {self._daily_wake_offset}分钟")
return self._daily_sleep_offset, self._daily_wake_offset
def is_in_theoretical_sleep_time(self, now_time: time) -> tuple[bool, Optional[str]]: def is_in_theoretical_sleep_time(self, now_time: time) -> tuple[bool, Optional[str]]:
if global_config.sleep_system.sleep_by_schedule: if global_config.sleep_system.sleep_by_schedule:
if self.schedule_source.get_today_schedule(): if self.schedule_source.get_today_schedule():
return self._is_in_schedule_sleep_time(now_time) return self._is_in_schedule_sleep_time(now_time)
else: else:
return self._is_in_fixed_sleep_time(now_time) return self._is_in_sleep_time(now_time)
else: else:
return self._is_in_fixed_sleep_time(now_time) return self._is_in_sleep_time(now_time)
def _is_in_schedule_sleep_time(self, now_time: time) -> tuple[bool, Optional[str]]: def _is_in_schedule_sleep_time(self, now_time: time) -> tuple[bool, Optional[str]]:
"""检查当前时间是否落在日程表的任何一个睡眠活动中""" """检查当前时间是否落在日程表的任何一个睡眠活动中"""
@@ -49,20 +72,33 @@ class TimeChecker:
continue continue
return False, None return False, None
def _is_in_fixed_sleep_time(self, now_time: time) -> tuple[bool, Optional[str]]: def _is_in_sleep_time(self, now_time: time) -> tuple[bool, Optional[str]]:
"""检查当前时间是否在固定的睡眠时间内""" """检查当前时间是否在固定的睡眠时间内(应用偏移量)"""
try: try:
start_time_str = global_config.sleep_system.fixed_sleep_time start_time_str = global_config.sleep_system.fixed_sleep_time
end_time_str = global_config.sleep_system.fixed_wake_up_time end_time_str = global_config.sleep_system.fixed_wake_up_time
start_time = datetime.strptime(start_time_str, "%H:%M").time()
end_time = datetime.strptime(end_time_str, "%H:%M").time()
if start_time <= end_time: # 获取当天的偏移量
if start_time <= now_time < end_time: sleep_offset, wake_offset = self._get_daily_offsets()
return True, "固定睡眠时间"
# 解析基础时间
base_start_time = datetime.strptime(start_time_str, "%H:%M")
base_end_time = datetime.strptime(end_time_str, "%H:%M")
# 应用偏移量
actual_start_time = (base_start_time + timedelta(minutes=sleep_offset)).time()
actual_end_time = (base_end_time + timedelta(minutes=wake_offset)).time()
logger.debug(f"固定睡眠时间检查 - 基础时间: {start_time_str}-{end_time_str}, "
f"偏移后时间: {actual_start_time.strftime('%H:%M')}-{actual_end_time.strftime('%H:%M')}, "
f"当前时间: {now_time.strftime('%H:%M')}")
if actual_start_time <= actual_end_time:
if actual_start_time <= now_time < actual_end_time:
return True, f"固定睡眠时间(偏移后: {actual_start_time.strftime('%H:%M')}-{actual_end_time.strftime('%H:%M')})"
else: else:
if now_time >= start_time or now_time < end_time: if now_time >= actual_start_time or now_time < actual_end_time:
return True, "固定睡眠时间" return True, f"固定睡眠时间(偏移后: {actual_start_time.strftime('%H:%M')}-{actual_end_time.strftime('%H:%M')})"
except ValueError as e: except ValueError as e:
logger.error(f"固定的睡眠时间格式不正确,请使用 HH:MM 格式: {e}") logger.error(f"固定的睡眠时间格式不正确,请使用 HH:MM 格式: {e}")
return False, None return False, None

View File

@@ -283,6 +283,7 @@ class DefaultReplyer:
return False, None, None return False, None, None
from src.plugin_system.core.event_manager import event_manager from src.plugin_system.core.event_manager import event_manager
# 触发 POST_LLM 事件(请求 LLM 之前)
if not from_plugin: if not from_plugin:
result = await event_manager.trigger_event( result = await event_manager.trigger_event(
EventType.POST_LLM, plugin_name="SYSTEM", prompt=prompt, stream_id=stream_id EventType.POST_LLM, plugin_name="SYSTEM", prompt=prompt, stream_id=stream_id
@@ -304,6 +305,7 @@ class DefaultReplyer:
"model": model_name, "model": model_name,
"tool_calls": tool_call, "tool_calls": tool_call,
} }
# 触发 AFTER_LLM 事件 # 触发 AFTER_LLM 事件
if not from_plugin: if not from_plugin:
result = await event_manager.trigger_event( result = await event_manager.trigger_event(

View File

@@ -613,6 +613,8 @@ class SleepSystemConfig(ValidatedConfigBase):
sleep_by_schedule: bool = Field(default=True, description="是否根据日程表进行睡觉") sleep_by_schedule: bool = Field(default=True, description="是否根据日程表进行睡觉")
fixed_sleep_time: str = Field(default="23:00", description="固定的睡觉时间") fixed_sleep_time: str = Field(default="23:00", description="固定的睡觉时间")
fixed_wake_up_time: str = Field(default="07:00", description="固定的起床时间") fixed_wake_up_time: str = Field(default="07:00", description="固定的起床时间")
sleep_time_offset_minutes: int = Field(default=15, ge=0, le=60, description="睡觉时间随机偏移量范围(分钟),实际睡觉时间会在±该值范围内随机")
wake_up_time_offset_minutes: int = Field(default=15, ge=0, le=60, description="起床时间随机偏移量范围(分钟),实际起床时间会在±该值范围内随机")
wakeup_threshold: float = Field(default=15.0, ge=1.0, description="唤醒阈值,达到此值时会被唤醒") wakeup_threshold: float = Field(default=15.0, ge=1.0, description="唤醒阈值,达到此值时会被唤醒")
private_message_increment: float = Field(default=3.0, ge=0.1, description="私聊消息增加的唤醒度") private_message_increment: float = Field(default=3.0, ge=0.1, description="私聊消息增加的唤醒度")
group_mention_increment: float = Field(default=2.0, ge=0.1, description="群聊艾特增加的唤醒度") group_mention_increment: float = Field(default=2.0, ge=0.1, description="群聊艾特增加的唤醒度")

View File

@@ -116,7 +116,7 @@ class NoticeHandler:
sub_type = raw_message.get("sub_type") sub_type = raw_message.get("sub_type")
match sub_type: match sub_type:
case NoticeType.Notify.poke: case NoticeType.Notify.poke:
if config_api.get_plugin_config(self.plugin_config, "features.poke_enabled", True) and await message_handler.check_allow_to_chat( if config_api.get_plugin_config(self.plugin_config, "features.enable_poke", True) and await message_handler.check_allow_to_chat(
user_id, group_id, False, False user_id, group_id, False, False
): ):
logger.debug("处理戳一戳消息") logger.debug("处理戳一戳消息")
@@ -247,7 +247,7 @@ class NoticeHandler:
else: else:
# 如果配置为忽略不是针对自己的戳一戳则直接返回None # 如果配置为忽略不是针对自己的戳一戳则直接返回None
if config_api.get_plugin_config(self.plugin_config, "features.non_self_poke_ignored", False): if config_api.get_plugin_config(self.plugin_config, "features.ignore_non_self_poke", False):
logger.debug("忽略不是针对自己的戳一戳消息") logger.debug("忽略不是针对自己的戳一戳消息")
return None, None return None, None

View File

@@ -1,4 +1,6 @@
{ {
"manifest_version": 1,
"name": "Set Typing Status", "name": "Set Typing Status",
"description": "一个在LLM生成回复时设置私聊输入状态的插件。", "description": "一个在LLM生成回复时设置私聊输入状态的插件。",
"version": "1.0.0", "version": "1.0.0",

View File

@@ -29,7 +29,6 @@ class SetTypingStatusHandler(BaseEventHandler):
user_id = message.message_info.user_info.user_id user_id = message.message_info.user_info.user_id
if not user_id: if not user_id:
return HandlerResult(success=False, continue_process=True, message="无法获取用户ID") return HandlerResult(success=False, continue_process=True, message="无法获取用户ID")
try: try:
params = {"user_id": user_id, "event_type": 1} params = {"user_id": user_id, "event_type": 1}
await send_api.adapter_command_to_stream( await send_api.adapter_command_to_stream(

View File

@@ -1,5 +1,5 @@
[inner] [inner]
version = "6.7.6" version = "6.7.7"
#----以下是给开发人员阅读的如果你只是部署了MoFox-Bot不需要阅读---- #----以下是给开发人员阅读的如果你只是部署了MoFox-Bot不需要阅读----
#如果你想要修改配置文件请递增version的值 #如果你想要修改配置文件请递增version的值
@@ -430,6 +430,8 @@ enable = false #"是否启用睡眠系统"
sleep_by_schedule = true #"是否根据日程表进行睡觉" sleep_by_schedule = true #"是否根据日程表进行睡觉"
fixed_sleep_time = "23:00" #"固定的睡觉时间" fixed_sleep_time = "23:00" #"固定的睡觉时间"
fixed_wake_up_time = "07:00" #"固定的起床时间" fixed_wake_up_time = "07:00" #"固定的起床时间"
sleep_time_offset_minutes = 15 #"睡觉时间随机偏移量范围(分钟),实际睡觉时间会在±该值范围内随机"
wake_up_time_offset_minutes = 15 #"起床时间随机偏移量范围(分钟),实际起床时间会在±该值范围内随机"
wakeup_threshold = 15.0 #唤醒阈值,达到此值时会被唤醒" wakeup_threshold = 15.0 #唤醒阈值,达到此值时会被唤醒"
private_message_increment = 3.0 #"私聊消息增加的唤醒度" private_message_increment = 3.0 #"私聊消息增加的唤醒度"
group_mention_increment = 2.0 #"群聊艾特增加的唤醒度" group_mention_increment = 2.0 #"群聊艾特增加的唤醒度"