diff --git a/core/managers/1.py b/core/managers/1.py new file mode 100644 index 0000000..aa631a7 --- /dev/null +++ b/core/managers/1.py @@ -0,0 +1,32 @@ + +class 真鸭子: + def 叫(self): + print("嘎嘎嘎") + + def 跑(self): + print("鸭子摇摇摆摆跑") + +class 玩具鸭子: + def 叫(self): + print("玩具鸭发出嘎嘎声") + + def 跑(self): + print("玩具鸭轮子咕噜噜跑") + +class 小猫: + def 叫(self): + print("喵喵喵") + def 跑(self): + print("猫咪跑跑") + +def 逗鸭子(鸭子一样的东西): + 鸭子一样的东西.叫() + 鸭子一样的东西.跑() + +逗鸭子(真鸭子()) + +逗鸭子(玩具鸭子()) + +逗鸭子(小猫()) + +鸭子 = 1 \ No newline at end of file diff --git a/core/managers/image_manager.py b/core/managers/image_manager.py index 6305cf3..b757ca2 100644 --- a/core/managers/image_manager.py +++ b/core/managers/image_manager.py @@ -71,15 +71,21 @@ class ImageManager: return None try: - # 设置视口 - await page.set_viewport_size({"width": 650, "height": 100}) + width = 1920 + height = 1080 + await page.set_viewport_size({"width": width, "height": height}) # 加载内容 await page.set_content(html_content) await page.wait_for_selector("body") - # 截图 - screenshot_args = {'full_page': True, 'type': image_type} + + screenshot_args = { + 'full_page': True, + 'type': image_type, + 'omit_background': False, + 'scale': 'css' + } if image_type == 'jpeg': screenshot_args['quality'] = quality diff --git a/core/managers/permission_manager.py b/core/managers/permission_manager.py index fa5f4ce..7fa2910 100644 --- a/core/managers/permission_manager.py +++ b/core/managers/permission_manager.py @@ -152,6 +152,12 @@ class PermissionManager(Singleton): 检查用户是否具有指定权限级别 """ user_permission = await self.get_user_permission(user_id) + + # 增强类型检查,防止将property对象等错误类型传递进来 + if not isinstance(required_permission, Permission): + logger.error(f"权限检查失败:required_permission 不是 Permission 枚举类型,而是 {type(required_permission).__name__}") + return False + return user_permission >= required_permission async def get_all_user_permissions(self) -> Dict[str, str]: diff --git a/core/managers/redis_manager.py b/core/managers/redis_manager.py index 7685bc2..afad47d 100644 --- a/core/managers/redis_manager.py +++ b/core/managers/redis_manager.py @@ -33,7 +33,8 @@ class RedisManager: port=port, db=db, password=password, - decode_responses=True + decode_responses=True, + ssl=False ) if await self._redis.ping(): logger.success("Redis 连接成功!") diff --git a/core/utils/__init__.py b/core/utils/__init__.py index d48c3be..6d8b745 100644 --- a/core/utils/__init__.py +++ b/core/utils/__init__.py @@ -4,7 +4,7 @@ """ # 导出核心工具 -from .logger import logger, ModuleLogger, log_exception +from .logger import logger from .exceptions import * from .json_utils import * from .singleton import singleton @@ -20,12 +20,9 @@ from .performance import ( performance_stats, global_stats ) -from .error_codes import ErrorCode, get_error_message, create_error_response, exception_to_error_response __all__ = [ 'logger', - 'ModuleLogger', - 'log_exception', 'timeit', 'profile', 'aprofile', @@ -37,9 +34,5 @@ __all__ = [ 'global_stats', 'run_in_thread_pool', 'initialize_executor', - 'singleton', - 'ErrorCode', - 'get_error_message', - 'create_error_response', - 'exception_to_error_response' + 'singleton' ] diff --git a/models/events/message.py b/models/events/message.py index e84381a..b458f08 100644 --- a/models/events/message.py +++ b/models/events/message.py @@ -72,20 +72,7 @@ class MessageEvent(OneBotEvent): def post_type(self) -> str: return EventType.MESSAGE - @property - def ADMIN(self) -> Permission: - """权限级别常量,用于装饰器参数""" - return MESSAGE_EVENT_ADMIN - @property - def OP(self) -> Permission: - """权限级别常量,用于装饰器参数""" - return MESSAGE_EVENT_OP - - @property - def USER(self) -> Permission: - """权限级别常量,用于装饰器参数""" - return MESSAGE_EVENT_USER async def reply(self, message: Union[str, "MessageSegment", List["MessageSegment"]], auto_escape: bool = False): """ @@ -97,6 +84,12 @@ class MessageEvent(OneBotEvent): raise NotImplementedError("reply method must be implemented by subclasses") +# 在类定义之后添加权限常量作为类变量 +MessageEvent.ADMIN = MESSAGE_EVENT_ADMIN +MessageEvent.OP = MESSAGE_EVENT_OP +MessageEvent.USER = MESSAGE_EVENT_USER + + @dataclass(slots=True) class PrivateMessageEvent(MessageEvent): """ diff --git a/plugins/echo.py b/plugins/echo.py index 6acbc11..d017712 100644 --- a/plugins/echo.py +++ b/plugins/echo.py @@ -6,6 +6,7 @@ Echo 与交互插件 from core.managers.command_manager import matcher from core.bot import Bot from models.events.message import MessageEvent +from core.permission import Permission __plugin_meta__ = { "name": "echo", @@ -13,7 +14,7 @@ __plugin_meta__ = { "usage": "/echo [内容] - 复读内容\n/赞我 - 让机器人给你点赞", } -@matcher.command("echo",permission=MessageEvent.ADMIN) +@matcher.command("echo", permission=Permission.ADMIN) async def handle_echo(bot: Bot, event: MessageEvent, args: list[str]): """ 处理 echo 指令,原样回复用户输入的内容 diff --git a/plugins/github_parser.py b/plugins/github_parser.py new file mode 100644 index 0000000..36e6378 --- /dev/null +++ b/plugins/github_parser.py @@ -0,0 +1,228 @@ +# -*- coding: utf-8 -*- +import re +import json +import aiohttp +from typing import Optional, Dict, Any, Union +from cachetools import TTLCache + +from core.utils.logger import logger +from core.managers.command_manager import matcher +from core.managers.image_manager import image_manager +from models import MessageEvent, MessageSegment + +# 插件元数据 +__plugin_meta__ = { + "name": "github_parser", + "description": "自动解析GitHub仓库链接,或通过命令查询仓库信息。", + "usage": "(自动触发)当检测到GitHub仓库链接时,自动发送仓库信息。\n(命令触发)/查仓库 作者/仓库名", +} + +# 常量定义 +GITHUB_NICKNAME = "GitHub仓库信息" + +HEADERS = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' +} + +# 全局共享的 ClientSession +_session: Optional[aiohttp.ClientSession] = None + +# 缓存GitHub API响应,避免频繁请求 +api_cache = TTLCache(maxsize=100, ttl=3600) # 100个缓存项,1小时过期 + + +def get_session() -> aiohttp.ClientSession: + """ + 获取或创建全局的aiohttp ClientSession + + Returns: + aiohttp.ClientSession: 客户端会话对象 + """ + global _session + if _session is None or _session.closed: + _session = aiohttp.ClientSession(headers=HEADERS) + return _session + + +async def get_github_repo_info(owner: str, repo: str) -> Optional[Dict[str, Any]]: + """ + 通过GitHub API获取仓库信息 + + Args: + owner (str): 仓库所有者用户名 + repo (str): 仓库名称 + + Returns: + Optional[Dict[str, Any]]: 仓库信息字典,如果失败则返回None + """ + cache_key = f"{owner}/{repo}" + if cache_key in api_cache: + logger.info(f"[github_parser] 使用缓存的仓库信息: {cache_key}") + return api_cache[cache_key] + + api_url = f"https://api.github.com/repos/{owner}/{repo}" + try: + session = get_session() + async with session.get(api_url, timeout=10) as response: + response.raise_for_status() + repo_data = await response.json() + + # 将数据存入缓存 + api_cache[cache_key] = repo_data + logger.info(f"[github_parser] 成功获取仓库信息并缓存: {cache_key}") + return repo_data + + except aiohttp.ClientError as e: + logger.error(f"[github_parser] GitHub API请求失败: {e}") + except json.JSONDecodeError as e: + logger.error(f"[github_parser] 解析GitHub API响应失败: {e}") + except Exception as e: + logger.error(f"[github_parser] 获取仓库信息时发生未知错误: {e}") + + return None + + +async def generate_repo_image(repo_data: Dict[str, Any]) -> Optional[str]: + """ + 使用Jinja2模板渲染仓库信息为图片 + + Args: + repo_data (Dict[str, Any]): 仓库信息字典 + + Returns: + Optional[str]: 生成的图片Base64编码,如果失败则返回None + """ + try: + # 准备模板数据 + template_data = { + "full_name": repo_data.get("full_name", ""), + "description": repo_data.get("description", "暂无描述"), + "owner_avatar": repo_data.get("owner", {}).get("avatar_url", ""), + "stargazers_count": repo_data.get("stargazers_count", 0), + "forks_count": repo_data.get("forks_count", 0), + "open_issues_count": repo_data.get("open_issues_count", 0), + "watchers_count": repo_data.get("watchers_count", 0), + } + + # 渲染模板为图片,使用高质量设置 + base64_image = await image_manager.render_template_to_base64( + template_name="github_repo.html", + data=template_data, + output_name=f"github_{repo_data.get('name', 'repo')}.png", + quality=100, # 使用最高质量 + image_type="png" # PNG格式为无损压缩 + ) + + return base64_image + + except Exception as e: + logger.error(f"[github_parser] 生成仓库信息图片失败: {e}") + return None + + +async def process_github_repo(event: MessageEvent, owner: str, repo: str): + """ + 处理GitHub仓库信息查询,获取信息并回复 + + Args: + event (MessageEvent): 消息事件对象 + owner (str): 仓库所有者用户名 + repo (str): 仓库名称 + """ + try: + # 获取仓库信息 + repo_data = await get_github_repo_info(owner, repo) + if not repo_data: + logger.error(f"[github_parser] 无法获取仓库信息: {owner}/{repo}") + await event.reply("无法获取仓库信息,可能是仓库不存在或网络问题。") + return + + # 生成图片 + image_base64 = await generate_repo_image(repo_data) + if image_base64: + # 发送图片 + await event.reply(MessageSegment.image(image_base64)) + else: + # 如果图片生成失败,发送文本信息 + text_message = ( + f"GitHub 仓库信息\n" + f"--------------------\n" + f"仓库: {repo_data.get('full_name', '')}\n" + f"描述: {repo_data.get('description', '暂无描述')}\n" + f"--------------------\n" + f"数据:\n" + f" 星标: {repo_data.get('stargazers_count', 0)}\n" + f" Fork: {repo_data.get('forks_count', 0)}\n" + f" Issues: {repo_data.get('open_issues_count', 0)}\n" + f" 关注: {repo_data.get('watchers_count', 0)}\n" + ) + await event.reply(text_message) + + except Exception as e: + logger.error(f"[github_parser] 处理仓库信息时发生错误: {e}") + await event.reply("处理仓库信息时发生错误,请稍后再试。") + + +# GitHub仓库链接正则表达式 +GITHUB_URL_PATTERN = re.compile(r"https?://(?:www\.)?github\.com/([\w\-]+)/([\w\-\.]+)(?:/[^\s]*)?") + + +# 注册命令处理器 +@matcher.command("查仓库", "github", "github_repo") +async def handle_github_command(bot, event: MessageEvent): + """ + 处理命令调用:/查仓库 作者/仓库名 + + Args: + bot: 机器人对象 + event (MessageEvent): 消息事件对象 + """ + # 提取命令参数 + command_text = event.raw_message + # 移除命令前缀和命令名 + prefix = command_text.split()[0] if command_text.split() else "" + params = command_text[len(prefix):].strip() + + if not params: + await event.reply("请输入仓库地址,格式:/查仓库 作者/仓库名") + return + + # 解析参数格式 + if "/" in params: + owner, repo = params.split("/", 1) + # 移除可能的.git后缀 + repo = repo.replace(".git", "") + await process_github_repo(event, owner, repo) + else: + await event.reply("参数格式错误,请输入:/查仓库 作者/仓库名") + + +# 注册消息处理器 +@matcher.on_message() +async def handle_github_link(event: MessageEvent): + """ + 处理消息,检测GitHub仓库链接并自动解析 + + Args: + event (MessageEvent): 消息事件对象 + """ + # 忽略机器人自己发送的消息,防止无限循环 + if hasattr(event, "user_id") and hasattr(event, "self_id") and event.user_id == event.self_id: + return + + # 提取消息文本 + message_text = "" + for segment in event.message: + if segment.type == "text": + message_text += segment.data.get("text", "") + + # 查找GitHub仓库链接 + match = GITHUB_URL_PATTERN.search(message_text) + if match: + owner = match.group(1) + repo = match.group(2) + # 移除可能的.git后缀 + repo = repo.replace(".git", "") + + logger.info(f"[github_parser] 检测到GitHub仓库链接: {owner}/{repo}") + await process_github_repo(event, owner, repo) diff --git a/scripts/compile_machine_code.py b/scripts/compile_machine_code.py index 8ec3aed..3a4b020 100644 --- a/scripts/compile_machine_code.py +++ b/scripts/compile_machine_code.py @@ -97,6 +97,346 @@ MODULES = [ # - API 基础类(由于多重继承问题) ] +def list_compiled_modules(): + """列出已编译的模块""" + print(f"\n已编译的 {PLATFORM} 模块:") + print("=" * 50) + + # 查找所有编译后的文件 + compiled_files = [] + for ext in [EXTENSION, f'__mypyc{EXTENSION}']: + compiled_files.extend(glob.glob(f'**/*{ext}', recursive=True)) + + # 过滤掉虚拟环境中的文件 + compiled_files = [f for f in compiled_files if 'venv' not in f and '.venv' not in f] + + if compiled_files: + for f in sorted(compiled_files): + size = os.path.getsize(f) // 1024 # KB + print(f"{f} ({size} KB)") + else: + print(f"未找到已编译的 {EXTENSION} 文件") + + print(f"\n总计: {len(compiled_files)} 个文件") + +def clean_compiled_files(): + """清理编译生成的文件""" + print(f"\n清理编译生成的 {EXTENSION} 文件...") + + # 查找所有编译后的文件 + compiled_files = [] + for ext in [EXTENSION, f'__mypyc{EXTENSION}']: + compiled_files.extend(glob.glob(f'**/*{ext}', recursive=True)) + + # 过滤掉虚拟环境中的文件 + compiled_files = [f for f in compiled_files if 'venv' not in f and '.venv' not in f] + + if compiled_files: + for f in sorted(compiled_files): + try: + os.remove(f) + print(f"已删除: {f}") + except Exception as e: + print(f"删除失败 {f}: {e}") + + # 清理 build 目录 + if os.path.exists('build'): + try: + shutil.rmtree('build') + print("已删除 build 目录") + except Exception as e: + print(f"删除 build 目录失败: {e}") + else: + print(f"没有可清理的 {EXTENSION} 文件") + +def get_platform_specific_module_name(module_path): + """获取平台特定的模块文件名""" + module_name = module_path.replace('.py', '') + return f"{module_name}.{BUILD_PREFIX}{EXTENSION}" + +def compile_module(module_path): + """编译单个模块""" + print(f"\n编译: {module_path}") + + try: + # 直接调用 mypyc 命令行工具 + # 使用二进制模式捕获输出以避免编码问题 + result = subprocess.run( + [sys.executable, '-m', 'mypyc', module_path], + capture_output=True, + check=True + ) + + # 解码输出时处理可能的编码错误 + try: + stdout_text = result.stdout.decode('utf-8', errors='replace') + stderr_text = result.stderr.decode('utf-8', errors='replace') + except AttributeError: + # 如果已经是字符串(Python 3.7+),则直接使用 + stdout_text = result.stdout + stderr_text = result.stderr + + # 获取平台特定的模块名 + platform_module = get_platform_specific_module_name(module_path) + mypyc_platform_module = platform_module.replace(EXTENSION, f'__mypyc{EXTENSION}') + + # 检查编译产物是否在当前目录 + if os.path.exists(platform_module): + print(f" ✓ 编译成功: {platform_module}") + return True + else: + # 检查 build 目录中是否有编译产物 + build_module_path = os.path.join(BUILD_PATH, platform_module) + build_mypyc_path = os.path.join(BUILD_PATH, mypyc_platform_module) + + if os.path.exists(build_module_path): + # 如果在 build 目录中,复制到正确位置 + os.makedirs(os.path.dirname(platform_module), exist_ok=True) + shutil.copy2(build_module_path, platform_module) + if os.path.exists(build_mypyc_path): + shutil.copy2(build_mypyc_path, mypyc_platform_module) + print(f" ✓ 编译成功(已从 build 目录复制): {platform_module}") + return True + else: + print(" ✗ 编译失败:找不到编译产物") + if result.stdout: + print(f" 编译输出:{stdout_text[:500]}...") + if result.stderr: + print(f" 错误信息:{stderr_text[:500]}...") + return False + + except subprocess.CalledProcessError as e: + print(f" ✗ 编译失败,退出码: {e.returncode}") + if hasattr(e, 'stdout') and e.stdout: + try: + stdout_text = e.stdout.decode('utf-8', errors='replace') if isinstance(e.stdout, bytes) else e.stdout + print(f" 编译输出:{stdout_text[:500]}...") + except Exception: + print(f" 编译输出:{str(e.stdout)[:500]}...") + if hasattr(e, 'stderr') and e.stderr: + try: + stderr_text = e.stderr.decode('utf-8', errors='replace') if isinstance(e.stderr, bytes) else e.stderr + print(f" 错误信息:{stderr_text[:500]}...") + except Exception: + print(f" 错误信息:{str(e.stderr)[:500]}...") + return False + except Exception as e: + print(f" ✗ 编译失败,意外错误: {e}") + import traceback + traceback.print_exc() + return False + +def should_skip_module(module_path): + """检查模块是否应该被跳过编译""" + try: + with open(module_path, 'r', encoding='utf-8') as f: + content = f.read() + + # 检查是否包含抽象基类相关代码 + if 'from abc import ABC' in content or 'from abc import abstractmethod' in content: + return True, "包含抽象基类,不适合编译" + + # 检查是否包含危险的动态特性 + # 注意:我们允许基本的动态特性,如getattr,但对于eval、exec等危险操作仍然阻止 + if ('eval(' in content or 'exec(' in content or + 'compile(' in content): + return True, "包含危险动态特性,不适合编译" + + # 检查是否包含复杂的动态属性访问 + if ('__dict__' in content or '__class__' in content or + '__module__' in content or '__bases__' in content): + return True, "包含复杂动态特性,不适合编译" + + # 检查是否包含复杂的动态属性访问 + if '.__dict__' in content or '.__class__' in content: + return True, "包含复杂动态特性,不适合编译" + + return False, "" + except Exception as e: + return True, f"读取文件时出错: {e}" + +def compile_all_modules(): + """编译所有指定的模块""" + print(f"\n开始编译 {len(MODULES)} 个模块 (平台: {PLATFORM})") + print("=" * 60) + + # 验证模块文件是否存在并检查是否适合编译 + valid_modules = [] + skipped_modules = [] + + for module_path in MODULES: + if os.path.exists(module_path): + should_skip, reason = should_skip_module(module_path) + if should_skip: + print(f"跳过: {module_path} ({reason})") + skipped_modules.append((module_path, reason)) + else: + valid_modules.append(module_path) + else: + print(f"警告: 模块 {module_path} 不存在,将被跳过") + + print(f"\n有效模块: {len(valid_modules)}, 跳过模块: {len(skipped_modules)}") + + if not valid_modules: + print("错误: 没有有效的模块可编译") + return False + + # 编译模块 + success_count = 0 + failed_modules = [] + + for module_path in valid_modules: + if compile_module(module_path): + success_count += 1 + else: + failed_modules.append(module_path) + + print("\n" + "=" * 60) + print(f"编译完成: {success_count}/{len(valid_modules)} 个模块成功") + + if failed_modules: + print(f"失败模块: {failed_modules}") + + if success_count == len(valid_modules): + print("✓ 所有模块编译成功") + return True + else: + print("✗ 部分模块编译失败") + return False + +def main(): + """主函数""" + # 检查 Python 版本 + if not (sys.version_info.major == 3 and sys.version_info.minor >= 8): + print("警告: 推荐使用 Python 3.8+ 以获得最佳性能") + print(f"当前版本: {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}") + print("继续编译可能导致兼容性问题") + print() + + parser = argparse.ArgumentParser(description='优化版跨平台 Python 模块编译脚本') + + group = parser.add_mutually_exclusive_group() + group.add_argument('--compile', '-c', action='store_true', default=True, + help='编译指定的模块 (默认)') + group.add_argument('--list', '-l', action='store_true', + help='列出已编译的模块') + group.add_argument('--clean', '-k', action='store_true', + help='清理编译生成的文件') + + args = parser.parse_args() + + # 检查是否安装了 mypyc + try: + import mypyc + except ImportError: + print("错误: 未安装 mypyc,请先安装: pip install mypyc") + sys.exit(1) + + if args.list: + list_compiled_modules() + elif args.clean: + clean_compiled_files() + else: + compile_all_modules() + print("\n使用 --list 选项查看已编译的模块") + print("使用 --clean 选项清理编译文件") + +if __name__ == '__main__': + main()#!/usr/bin/env python3 +""" +跨平台 Python 模块编译脚本 + +将核心 Python 模块编译为机器码(.pyd 或 .so)以提升性能。 + +支持的平台: +- Windows: 生成 .pyd 文件 +- Linux: 生成 .so 文件 + +使用方法: + python compile_machine_code.py [options] + +选项: + --compile, -c 编译指定的模块(默认) + --list, -l 列出已编译的模块 + --clean, -k 清理编译生成的文件 + --help, -h 显示帮助信息 + +注意: + 1. 需要安装 C 编译器 (Windows 上需要 Visual Studio Build Tools, Linux 上需要 GCC) + 2. 需要安装 mypyc: pip install mypyc + 3. 编译后的文件是平台相关的,不能跨平台复制 + 4. 建议在部署的目标环境上运行此脚本 +""" +import os +import sys +import glob +import subprocess +import shutil +import argparse + +# 检测当前平台 +PLATFORM = sys.platform +if PLATFORM.startswith('win'): + EXTENSION = '.pyd' + BUILD_PREFIX = 'cp314-win_amd64' + BUILD_PATH = os.path.join('build', f'lib.win-amd64-cpython-314') +elif PLATFORM.startswith('linux'): + EXTENSION = '.so' + BUILD_PREFIX = 'cp314-x86_64-linux-gnu' + BUILD_PATH = os.path.join('build', f'lib.linux-x86_64-cpython-314') +else: + print(f"不支持的平台: {PLATFORM}") + sys.exit(1) + +# 要编译的模块列表 +# 注意:Mypyc 对动态特性支持有限,只选择计算密集或类型明确的模块 +MODULES = [ + # 工具模块 - 高频使用 + 'core/utils/json_utils.py', # JSON 处理 - 高频使用 + 'core/utils/executor.py', # 代码执行引擎 - 高频使用 + 'core/utils/exceptions.py', # 自定义异常 - 基础组件 + 'core/utils/performance.py', # 性能监控工具 - 重要组件 + 'core/utils/logger.py', # 日志模块 - 高频使用 + 'core/utils/singleton.py', # 单例模式 - 基础组件 + + # 核心管理模块 - 高频使用 + # 'core/managers/command_manager.py', # 指令匹配和分发 - 包含动态特性,不适合编译 + # 'core/managers/admin_manager.py', # 管理员管理 - 包含动态特性,不适合编译 + # 'core/managers/permission_manager.py', # 权限管理 - 包含动态特性,不适合编译 + # 'core/managers/plugin_manager.py', # 插件管理器 - 包含动态特性,不适合编译 + # 'core/managers/redis_manager.py', # Redis 管理器 - 包含动态特性,不适合编译 + # 'core/managers/image_manager.py', # 图片管理器 - 包含动态特性,不适合编译 + + # 核心基础模块 - 高频使用 + 'core/ws.py', # WebSocket 核心 - 核心通信,被10个文件引用 + # 'core/bot.py', # Bot 核心抽象 - 使用多重继承,不适合编译 + 'core/config_loader.py', # 配置加载 - 启动必需,被7个文件引用 + # 'core/config_models.py', # 配置模型 - 包含复杂类型定义,不适合编译 + # 'core/permission.py', # 权限枚举 - 包含动态属性,不适合编译 + + # 数据模型 - 高频使用 + 'models/message.py', # 消息段模型 - 高频消息处理 + 'models/sender.py', # 发送者模型 - 高频消息处理 + 'models/objects.py', # API 响应数据模型 - 高频数据处理 + + # 事件处理相关 - 高频使用 + 'core/handlers/event_handler.py', # 事件处理器 - 核心事件处理 + + # 事件模型 - 高频使用,但包含dataclass,可能有编译问题,暂时排除 + # 'models/events/message.py', # 消息事件 - 最高频事件类型 + # 'models/events/notice.py', # 通知事件 - 高频事件类型 + # 'models/events/request.py', # 请求事件 - 高频事件类型 + # 'models/events/meta.py', # 元事件 - 高频事件类型 + + # 注意:以下文件不适合编译 + # - 主程序文件(main.py) + # - 测试文件(tests/目录) + # - 插件文件(plugins/目录) + # - 编译(脚本compile_machine_code.py等) + # - 包含复杂动态特性的文件 + # - API 基础类(由于多重继承问题) +] + def list_compiled_modules(): """列出已编译的模块""" print(f"\n已编译的 {PLATFORM} 模块:") @@ -316,14 +656,7 @@ def compile_all_modules(): def main(): """主函数""" - # 检查 Python 版本 - if not (sys.version_info.major == 3 and sys.version_info.minor >= 8): - print("警告: 推荐使用 Python 3.8+ 以获得最佳性能") - print(f"当前版本: {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}") - print("继续编译可能导致兼容性问题") - print() - - parser = argparse.ArgumentParser(description='优化版跨平台 Python 模块编译脚本') + parser = argparse.ArgumentParser(description='跨平台 Python 模块编译脚本') group = parser.add_mutually_exclusive_group() group.add_argument('--compile', '-c', action='store_true', default=True, diff --git a/templates/github_repo.html b/templates/github_repo.html new file mode 100644 index 0000000..328da70 --- /dev/null +++ b/templates/github_repo.html @@ -0,0 +1,200 @@ + + +
+ + +{{ description }}
+Dashboard & Command List · {{ plugins|length }} Modules Loaded
- + +