154 lines
4.6 KiB
Python
154 lines
4.6 KiB
Python
"""CLI 入口"""
|
|
import click
|
|
import signal
|
|
import os
|
|
import sys
|
|
|
|
from oss import __version__
|
|
from oss.logger.logger import Logger
|
|
from oss.plugin.manager import PluginManager
|
|
from oss.config import init_config, get_config
|
|
|
|
|
|
# 深度隐藏的成就系统导入
|
|
try:
|
|
from oss.core.achievements import init_achievements, get_validator, _cmd_echo, _cmd_help_internal, _cmd_list_all, _cmd_stats, _cmd_reset_progress, _cmd_export, _cmd_import, _cmd_verify, _cmd_debug, _cmd_info
|
|
_ACHIEVEMENTS_ENABLED = True
|
|
except ImportError:
|
|
_ACHIEVEMENTS_ENABLED = False
|
|
|
|
|
|
@click.group()
|
|
@click.option('--config', '-c', type=str, help='配置文件路径')
|
|
@click.pass_context
|
|
def cli(ctx, config):
|
|
"""Future OSS - 一切皆为插件"""
|
|
# 初始化配置
|
|
ctx.ensure_object(dict)
|
|
ctx.obj['config'] = init_config(config)
|
|
|
|
# 初始化成就系统(如果启用)
|
|
if _ACHIEVEMENTS_ENABLED:
|
|
try:
|
|
init_achievements()
|
|
except Exception:
|
|
pass # 静默失败,不影响主功能
|
|
|
|
|
|
@cli.command()
|
|
@click.option('--host', type=str, default=None, help='监听地址')
|
|
@click.option('--port', type=int, default=None, help='HTTP API 端口')
|
|
@click.option('--tcp-port', type=int, default=None, help='HTTP TCP 端口')
|
|
@click.pass_context
|
|
def serve(ctx, host, port, tcp_port):
|
|
"""启动 Future OSS"""
|
|
config = ctx.obj.get('config', get_config())
|
|
|
|
# 命令行参数覆盖配置
|
|
if host:
|
|
config.set('HOST', host)
|
|
if port:
|
|
config.set('HTTP_API_PORT', port)
|
|
if tcp_port:
|
|
config.set('HTTP_TCP_PORT', tcp_port)
|
|
|
|
log = Logger()
|
|
log.info(f"Future OSS {__version__} 启动")
|
|
log.info(f"监听地址:{config.host}:{config.http_api_port}")
|
|
log.info(f"数据目录:{config.data_dir.absolute()}")
|
|
log.info(f"插件仓库:{config.store_dir.absolute()}")
|
|
|
|
plugin_mgr = PluginManager()
|
|
plugin_mgr.load()
|
|
plugin_mgr.start()
|
|
|
|
log.info("就绪")
|
|
|
|
def shutdown(sig, frame):
|
|
log.info("停止中...")
|
|
plugin_mgr.stop()
|
|
log.info("已停止")
|
|
raise SystemExit(0)
|
|
|
|
signal.signal(signal.SIGINT, shutdown)
|
|
signal.signal(signal.SIGTERM, shutdown)
|
|
|
|
try:
|
|
signal.pause()
|
|
except AttributeError:
|
|
import time
|
|
while True:
|
|
time.sleep(1)
|
|
|
|
|
|
@cli.command()
|
|
def version():
|
|
"""显示版本"""
|
|
click.echo(f"Future OSS {__version__}")
|
|
|
|
|
|
@cli.command()
|
|
@click.pass_context
|
|
def info(ctx):
|
|
"""显示系统信息"""
|
|
import random
|
|
|
|
config = ctx.obj.get('config', get_config())
|
|
click.echo(f"Future OSS {__version__}")
|
|
click.echo(f"配置文件:{config._config_file or '无'}")
|
|
click.echo(f"HTTP API 端口:{config.http_api_port}")
|
|
click.echo(f"HTTP TCP 端口:{config.http_tcp_port}")
|
|
click.echo(f"主机地址:{config.host}")
|
|
click.echo(f"数据目录:{config.data_dir.absolute()}")
|
|
click.echo(f"插件仓库:{config.store_dir.absolute()}")
|
|
click.echo(f"日志级别:{config.log_level}")
|
|
click.echo(f"权限检查:{'启用' if config.permission_check else '禁用'}")
|
|
|
|
# 小提示:有些功能需要特殊方式访问 (4675747572654f53)
|
|
# 随机显示隐藏提示(约 10% 概率)
|
|
click.echo("")
|
|
if random.random() < 0.1: # 10% 概率显示彩蛋提示
|
|
click.echo("✨ 奇怪的提示:试试在命令前加两个感叹号会怎样?比如 !!help")
|
|
elif random.random() < 0.05: # 额外 5% 概率显示另一种提示
|
|
click.echo("🤔 听说有人用 !! 开头的命令发现了不得了的东西...")
|
|
|
|
|
|
def main():
|
|
# 检查隐藏命令前缀
|
|
if len(sys.argv) > 1 and sys.argv[1].startswith("!!"):
|
|
if _ACHIEVEMENTS_ENABLED:
|
|
cmd = sys.argv[1][2:] # 去掉 !! 前缀
|
|
args = sys.argv[2:]
|
|
|
|
# 映射隐藏命令
|
|
cmd_map = {
|
|
"echo": _cmd_echo,
|
|
"help": _cmd_help_internal,
|
|
"list": _cmd_list_all,
|
|
"stats": _cmd_stats,
|
|
"reset": _cmd_reset_progress,
|
|
"export": _cmd_export,
|
|
"import": _cmd_import,
|
|
"verify": _cmd_verify,
|
|
"debug": _cmd_debug,
|
|
"info": _cmd_info,
|
|
}
|
|
|
|
if cmd in cmd_map:
|
|
validator = get_validator()
|
|
validator.use_hidden_command(cmd)
|
|
cmd_map[cmd](args)
|
|
return
|
|
else:
|
|
print(f"未知命令:!!{cmd}")
|
|
return
|
|
else:
|
|
print("成就系统未启用")
|
|
return
|
|
|
|
cli()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|