This commit is contained in:
minecraft1024a
2025-10-18 11:11:05 +08:00
parent 39e672a1d5
commit 8c97774465
14 changed files with 85 additions and 86 deletions

View File

@@ -3,7 +3,6 @@ import random
from typing import Any
from src.plugin_system import (
ActionActivationType,
BaseAction,
BaseEventHandler,
BasePlugin,

View File

@@ -1,9 +1,10 @@
import orjson
import os
import shutil
import sys
from pathlib import Path
import orjson
# 将脚本所在的目录添加到系统路径中,以便导入项目模块
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from src.common.logger import get_logger
@@ -14,7 +15,7 @@ def convert_and_copy_plugin(plugin_dir: Path, output_dir: Path):
"""
转换插件的 _manifest.json 文件,并将其整个目录复制到输出位置。
"""
manifest_path = plugin_dir / '_manifest.json'
manifest_path = plugin_dir / "_manifest.json"
if not manifest_path.is_file():
logger.warning(f"在目录 '{plugin_dir.name}' 中未找到 '_manifest.json',已跳过。")
return
@@ -28,16 +29,16 @@ def convert_and_copy_plugin(plugin_dir: Path, output_dir: Path):
logger.info(f"已将插件 '{plugin_dir.name}' 完整复制到 '{target_plugin_dir}'")
# 2. 读取 manifest 并生成 __init__.py 内容
with open(manifest_path, 'rb') as f:
with open(manifest_path, "rb") as f:
manifest = orjson.loads(f.read())
plugin_name = manifest.get('name', 'Unknown Plugin')
description = manifest.get('description', 'No description provided.')
version = manifest.get('version', '0.0.0')
author = manifest.get('author', {}).get('name', 'Unknown Author')
license_type = manifest.get('license', 'N/A')
plugin_name = manifest.get("name", "Unknown Plugin")
description = manifest.get("description", "No description provided.")
version = manifest.get("version", "0.0.0")
author = manifest.get("author", {}).get("name", "Unknown Author")
license_type = manifest.get("license", "N/A")
meta_template = f'''from src.plugin_system.base.plugin_metadata import PluginMetadata
meta_template = f"""from src.plugin_system.base.plugin_metadata import PluginMetadata
__plugin_meta__ = PluginMetadata(
name="{plugin_name}",
@@ -47,14 +48,14 @@ __plugin_meta__ = PluginMetadata(
author="{author}",
license="{license_type}",
)
'''
"""
# 3. 在复制后的目录中创建或覆盖 __init__.py
output_init_path = target_plugin_dir / '__init__.py'
with open(output_init_path, 'w', encoding='utf-8') as f:
output_init_path = target_plugin_dir / "__init__.py"
with open(output_init_path, "w", encoding="utf-8") as f:
f.write(meta_template)
# 4. 删除复制后的 _manifest.json
copied_manifest_path = target_plugin_dir / '_manifest.json'
copied_manifest_path = target_plugin_dir / "_manifest.json"
if copied_manifest_path.is_file():
copied_manifest_path.unlink()

View File

@@ -7,7 +7,7 @@ import asyncio
import random
import time
from collections import defaultdict, deque
from typing import TYPE_CHECKING, Any, Dict
from typing import TYPE_CHECKING, Any
from src.chat.chatter_manager import ChatterManager
from src.chat.message_receive.chat_stream import ChatStream
@@ -21,7 +21,6 @@ from src.plugin_system.apis.chat_api import get_chat_manager
from .distribution_manager import stream_loop_manager
from .sleep_system.state_manager import SleepState, sleep_state_manager
if TYPE_CHECKING:
pass
@@ -44,8 +43,8 @@ class MessageManager:
self.chatter_manager = ChatterManager(self.action_manager)
# 消息缓存系统 - 直接集成到消息管理器
self.message_caches: Dict[str, deque] = defaultdict(deque) # 每个流的消息缓存
self.stream_processing_status: Dict[str, bool] = defaultdict(bool) # 流的处理状态
self.message_caches: dict[str, deque] = defaultdict(deque) # 每个流的消息缓存
self.stream_processing_status: dict[str, bool] = defaultdict(bool) # 流的处理状态
self.cache_stats = {
"total_cached_messages": 0,
"total_flushed_messages": 0,

View File

@@ -1,10 +1,10 @@
from datetime import datetime, time, timedelta
import random
from typing import Optional, Tuple
from datetime import datetime, timedelta
from src.common.logger import get_logger
from src.config.config import global_config
from src.schedule.schedule_manager import schedule_manager
from .state_manager import SleepState, sleep_state_manager
logger = get_logger("sleep_logic")
@@ -77,7 +77,7 @@ class SleepLogic:
logger.info(f"当前时间 {now.strftime('%H:%M')} 已到达或超过预定起床时间 {wake_up_time.strftime('%H:%M')}")
sleep_state_manager.set_state(SleepState.AWAKE)
def _should_be_sleeping(self, now: datetime) -> Tuple[bool, Optional[datetime]]:
def _should_be_sleeping(self, now: datetime) -> tuple[bool, datetime | None]:
"""
判断在当前时刻,是否应该处于睡眠时间。
@@ -111,7 +111,7 @@ class SleepLogic:
return False, None
def _get_fixed_sleep_times(self, now: datetime) -> Tuple[Optional[datetime], Optional[datetime]]:
def _get_fixed_sleep_times(self, now: datetime) -> tuple[datetime | None, datetime | None]:
"""
当使用“固定时间”模式时,从此方法计算睡眠和起床时间。
会加入配置中的随机偏移量,让作息更自然。
@@ -139,7 +139,7 @@ class SleepLogic:
logger.error(f"解析固定睡眠时间失败: {e}")
return None, None
def _get_sleep_times_from_schedule(self, now: datetime) -> Tuple[Optional[datetime], Optional[datetime]]:
def _get_sleep_times_from_schedule(self, now: datetime) -> tuple[datetime | None, datetime | None]:
"""
当使用“日程表”模式时,从此方法获取睡眠时间。
实现了核心逻辑:
@@ -165,7 +165,7 @@ class SleepLogic:
return sleep_time, wake_up_time
def _get_wakeup_times_from_schedule(self, now: datetime) -> Tuple[Optional[datetime], Optional[datetime]]:
def _get_wakeup_times_from_schedule(self, now: datetime) -> tuple[datetime | None, datetime | None]:
"""
当使用“日程表”模式时,从此方法获取睡眠时间。
实现了核心逻辑:

View File

@@ -1,6 +1,6 @@
import enum
from datetime import datetime, timedelta
from typing import Any, Dict, Optional
from typing import Any
from src.common.logger import get_logger
from src.manager.local_store_manager import local_storage
@@ -43,7 +43,7 @@ class SleepStateManager:
"""
初始化状态管理器,定义状态数据结构并从本地加载历史状态。
"""
self.state: Dict[str, Any] = {}
self.state: dict[str, Any] = {}
self._default_state()
self.load_state()
@@ -115,9 +115,9 @@ class SleepStateManager:
def set_state(
self,
new_state: SleepState,
duration_seconds: Optional[float] = None,
sleep_start: Optional[datetime] = None,
wake_up: Optional[datetime] = None,
duration_seconds: float | None = None,
sleep_start: datetime | None = None,
wake_up: datetime | None = None,
):
"""
核心函数:切换到新的睡眠状态,并更新相关的状态数据。
@@ -153,7 +153,7 @@ class SleepStateManager:
self.state["last_checked"] = datetime.now().isoformat()
self.save_state()
def get_wake_up_time(self) -> Optional[datetime]:
def get_wake_up_time(self) -> datetime | None:
"""获取预定的起床时间,如果已设置的话。"""
wake_up_str = self.state.get("wake_up_time")
if wake_up_str:
@@ -163,7 +163,7 @@ class SleepStateManager:
return None
return None
def get_sleep_start_time(self) -> Optional[datetime]:
def get_sleep_start_time(self) -> datetime | None:
"""获取本次睡眠的开始时间,如果已设置的话。"""
sleep_start_str = self.state.get("sleep_start_time")
if sleep_start_str:

View File

@@ -1,5 +1,6 @@
from src.common.logger import get_logger
from src.manager.async_task_manager import AsyncTask, async_task_manager
from .sleep_logic import sleep_logic
logger = get_logger("sleep_tasks")

View File

@@ -11,7 +11,7 @@ from src.common.data_models.message_manager_data_model import StreamContext
from src.common.logger import get_logger
from src.config.config import global_config, model_config
from src.llm_models.utils_model import LLMRequest
from src.plugin_system.base.component_types import ActionActivationType, ActionInfo
from src.plugin_system.base.component_types import ActionInfo
from src.plugin_system.core.global_announcement_manager import global_announcement_manager
if TYPE_CHECKING:
@@ -209,8 +209,8 @@ class ActionModifier:
deactivated_actions = []
# 获取 Action 类注册表
from src.plugin_system.core.component_registry import component_registry
from src.plugin_system.base.component_types import ComponentType
from src.plugin_system.core.component_registry import component_registry
actions_to_check = list(actions_with_info.items())
random.shuffle(actions_to_check)

View File

@@ -302,8 +302,8 @@ def protect_special_blocks(text: str) -> tuple[str, dict[str, str]]:
# 第一层防护优先保护标准Markdown格式
# 使用 re.S 来让 . 匹配换行符
markdown_patterns = {
'code': r"```.*?```",
'math': r"\$\$.*?\$\$",
"code": r"```.*?```",
"math": r"\$\$.*?\$\$",
}
placeholder_idx = 0
@@ -472,7 +472,7 @@ def process_llm_response(text: str, enable_splitter: bool = True, enable_chinese
break
# 寻找最短的相邻句子对
min_len = float('inf')
min_len = float("inf")
merge_idx = -1
for i in range(len(sentences) - 1):
combined_len = len(sentences[i]) + len(sentences[i+1])

View File

@@ -13,6 +13,7 @@ from rich.traceback import install
from src.chat.emoji_system.emoji_manager import get_emoji_manager
from src.chat.memory_system.memory_manager import memory_manager
from src.chat.message_manager.sleep_system.tasks import start_sleep_system_tasks
from src.chat.message_receive.bot import chat_bot
from src.chat.message_receive.chat_stream import get_chat_manager
from src.chat.utils.statistic import OnlineTimeRecordTask, StatisticOutputTask
@@ -29,7 +30,6 @@ from src.plugin_system.core.event_manager import event_manager
from src.plugin_system.core.plugin_manager import plugin_manager
from src.schedule.monthly_plan_manager import monthly_plan_manager
from src.schedule.schedule_manager import schedule_manager
from src.chat.message_manager.sleep_system.tasks import start_sleep_system_tasks
# 插件系统现在使用统一的插件加载器
install(extra_lines=3)

View File

@@ -617,12 +617,12 @@ class BaseAction(ABC):
# 优先级_activation_chat_content > action_data['chat_content'] > ""
# 1. 如果有专门设置的激活用聊天内容(由 ActionModifier 设置)
if hasattr(self, '_activation_chat_content'):
return getattr(self, '_activation_chat_content', "")
if hasattr(self, "_activation_chat_content"):
return getattr(self, "_activation_chat_content", "")
# 2. 尝试从 action_data 中获取
if hasattr(self, 'action_data') and isinstance(self.action_data, dict):
return self.action_data.get('chat_content', "")
if hasattr(self, "action_data") and isinstance(self.action_data, dict):
return self.action_data.get("chat_content", "")
# 3. 默认返回空字符串
return ""

View File

@@ -156,7 +156,6 @@ class ChatterPlanFilter:
schedule_block = ""
# 优先检查是否被吵醒
from src.chat.message_manager.message_manager import message_manager
angry_prompt_addition = ""
try:

View File

@@ -6,6 +6,7 @@ from datetime import datetime
from maim_message import UserInfo
from src.chat.message_manager.sleep_system.state_manager import SleepState, sleep_state_manager
from src.chat.message_receive.chat_stream import get_chat_manager
from src.common.logger import get_logger
from src.config.config import global_config
@@ -13,7 +14,6 @@ from src.manager.async_task_manager import AsyncTask, async_task_manager
from src.plugin_system import BaseEventHandler, EventType
from src.plugin_system.apis import chat_api, message_api, person_api
from src.plugin_system.base.base_event import HandlerResult
from src.chat.message_manager.sleep_system.state_manager import SleepState, sleep_state_manager
from .proactive_thinker_executor import ProactiveThinkerExecutor

View File

@@ -107,7 +107,7 @@ class UILogHandler(logging.Handler):
# if not success:
# print(f"[UI日志适配器] 日志发送失败: {ui_level} - {formatted_msg[:50]}...")
except Exception as e:
except Exception:
# 静默失败,不影响主程序
pass