Compare commits

..

No commits in common. "aa8a53e7b7fd9708b196a27649906c3c13423e28" and "df4105ec61be602fbd9fee8f1b6b72df65c9fca7" have entirely different histories.

12 changed files with 107 additions and 186 deletions

View File

@ -4,11 +4,13 @@
# All rights reserved # All rights reserved
# ------------------------------- # -------------------------------
import time
import logging.config
from pathlib import Path from pathlib import Path
from Difficult_Rocket.api.types import Options, Version from Difficult_Rocket.api.types import Options, Version
sdk_version = Version("0.9.0.0-alpha.0") # SDK 版本 sdk_version = Version("0.8.7.3") # SDK 版本
build_version = Version("2.2.0.0") # 编译文件版本(与游戏本体无关) build_version = Version("2.2.0.0") # 编译文件版本(与游戏本体无关)
api_version = Version("0.1.1.0") # API 版本 api_version = Version("0.1.1.0") # API 版本
__version__ = sdk_version __version__ = sdk_version
@ -19,12 +21,11 @@ __all__ = [
"DR_status", "DR_status",
# folder # folder
"api", "api",
"data",
"client", "client",
"server",
"command", "command",
"crash", "crash",
"exception", "exception",
"server",
"mod", "mod",
"utils", "utils",
# file # file
@ -36,12 +37,12 @@ __all__ = [
] ]
class _DRStatus(Options): class _DR_status(Options):
""" """
DR 的特性开关 / 基本状态 DR 的特性开关 / 基本状态
""" """
name = "DR Status" name = "DR Option"
# run status # run status
client_running: bool = False client_running: bool = False
server_running: bool = False server_running: bool = False
@ -52,6 +53,7 @@ class _DRStatus(Options):
report_translate_not_found: bool = True report_translate_not_found: bool = True
use_multiprocess: bool = False use_multiprocess: bool = False
use_cProfile: bool = False use_cProfile: bool = False
use_local_logging: bool = False
# tests # tests
playing: bool = False playing: bool = False
@ -74,41 +76,23 @@ class _DRStatus(Options):
return round(12 * self.gui_scale) return round(12 * self.gui_scale)
DR_status = _DRStatus() DR_status = _DR_status()
def load_logger(): def load_logging():
log_config_path = Path("./config/lndl-logger.toml") with open("./config/logger.toml") as f:
import rtoml
import rtoml logger_config = rtoml.load(f)
log_path = logger_config["handlers"]["file"]["filename"]
warn_config = False log_path = f"logs/{log_path.format(time.strftime('%Y-%m-%d %H-%M-%S', time.gmtime(time.time_ns() / 1000_000_000)))}"
if not log_config_path.is_file(): if not Path("logs/").is_dir():
# 生成默认配置文件 Path("logs/").mkdir()
from Difficult_Rocket.data import log_config logger_config["handlers"]["file"]["filename"] = log_path
try: logging.config.dictConfig(logger_config)
log_config_path.write_text(log_config.default_config)
except (FileNotFoundError, OSError, PermissionError):
print("\033[31mFailed to write default log config file\033[0m")
warn_config = True
logger_config = rtoml.loads(log_config.default_config)
else:
# 读取配置文件
with open(log_config_path, encoding='utf-8') as f:
logger_config = rtoml.load(f)
# 输入 lndl 进行配置
from lib_not_dr.loggers.config import read_config, get_logger
read_config(logger_config)
logger = get_logger("main")
logger.info("Logger config loaded", tag='DR-init')
logger.info(f"DR status:\n{DR_status.as_markdown()}", tag='DR-init')
if warn_config:
logger.warn("Failed to load log config file, use default config", tag='DR-init')
# 读取日志配置 load_logging()
# 也保证可以直接运行,不带日志 ( 因为有默认配置 )
load_logger()
if DR_status.playing: if DR_status.playing:

View File

@ -7,6 +7,7 @@
import os import os
import sys import sys
import time import time
import logging
import inspect import inspect
import functools import functools
import traceback import traceback
@ -42,10 +43,8 @@ from Difficult_Rocket.client.screen import DRDEBUGScreen
from Difficult_Rocket.client.fps.fps_log import FpsLogger from Difficult_Rocket.client.fps.fps_log import FpsLogger
from Difficult_Rocket.exception.language import LanguageNotFound from Difficult_Rocket.exception.language import LanguageNotFound
from lib_not_dr import loggers
logger = logging.getLogger("client")
logger = loggers.config.get_logger("client")
class ClientOption(Options): class ClientOption(Options):
@ -79,7 +78,7 @@ class Client:
def __init__(self, game: "Game", net_mode="local"): def __init__(self, game: "Game", net_mode="local"):
start_time = time.time_ns() start_time = time.time_ns()
# logging # logging
self.logger = loggers.get_logger("client") self.logger = logging.getLogger("client")
self.logger.info(tr().client.setup.start()) self.logger.info(tr().client.setup.start())
# config # config
self.config = ClientOption() self.config = ClientOption()
@ -129,7 +128,7 @@ def pyglet_load_fonts_folder(folder) -> None:
if not font_path.exists(): if not font_path.exists():
font_path.mkdir(parents=True) font_path.mkdir(parents=True)
return None return None
logger.info(tr().client.load.font.start().format(font_path), tag='font') logger.info(tr().client.load.font.start().format(font_path))
start_time = time.time_ns() start_time = time.time_ns()
for dir_path, dir_names, file_names in os.walk(font_path): for dir_path, dir_names, file_names in os.walk(font_path):
dir_path = Path(dir_path) dir_path = Path(dir_path)
@ -137,7 +136,7 @@ def pyglet_load_fonts_folder(folder) -> None:
file_name = Path(file_name) file_name = Path(file_name)
if file_name.suffix in (".ttf", ".otf"): if file_name.suffix in (".ttf", ".otf"):
logger.debug( logger.debug(
tr().client.load.font.file().format(str(dir_path / file_name)), tag='font' tr().client.load.font.file().format(str(dir_path / file_name))
) )
try: try:
pyglet.font.add_file(str(dir_path / file_name)) pyglet.font.add_file(str(dir_path / file_name))
@ -149,7 +148,7 @@ def pyglet_load_fonts_folder(folder) -> None:
) )
end_time = time.time_ns() end_time = time.time_ns()
use_time = end_time - start_time use_time = end_time - start_time
logger.info(tr().client.load.font.use_time().format(use_time / 1000000000), tag='font') logger.info(tr().client.load.font.use_time().format(use_time / 1000000000))
def _call_back(call_back: Callable) -> Callable: def _call_back(call_back: Callable) -> Callable:
@ -241,7 +240,7 @@ class ClientWindow(Window):
start_time = time.time_ns() start_time = time.time_ns()
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
# logging # logging
self.logger = loggers.get_logger("client") self.logger = logging.getLogger("client")
self.logger.info(tr().window.setup.start()) self.logger.info(tr().window.setup.start())
# value # value
self.game = game self.game = game
@ -308,10 +307,10 @@ class ClientWindow(Window):
# TODO: wait for pyglet 2.1 # TODO: wait for pyglet 2.1
pyglet.app.run(float(self.SPF)) pyglet.app.run(float(self.SPF))
except KeyboardInterrupt: except KeyboardInterrupt:
self.logger.warn("==========client stop. KeyboardInterrupt info==========", tag="starter") self.logger.warning("==========client stop. KeyboardInterrupt info==========")
traceback.print_exc() traceback.print_exc()
self.logger.warn( self.logger.warning(
"==========client stop. KeyboardInterrupt info end==========", tag="starter" "==========client stop. KeyboardInterrupt info end=========="
) )
self.dispatch_event("on_close", "input") self.dispatch_event("on_close", "input")
sys.exit(0) sys.exit(0)

View File

@ -1,86 +0,0 @@
# -------------------------------
# Difficult Rocket
# Copyright © 2020-2023 by shenjackyuanjie 3695888@qq.com
# All rights reserved
# -------------------------------
default_config = """config_version = 1
[Logger]
[Logger.client]
# 日志名称
logger_name = "client"
level_name = "debug"
# or 'DEBUG'
# or level = 10
outputs = ["std_out", "file_out"]
[Logger.server]
# 日志名称
logger_name = "server"
level_name = "debug"
# or 'DEBUG'
# or level = 10
outputs = ["std_out", "file_out"]
[Logger.main]
# 日志名称
logger_name = "main"
level_name = "debug"
# or 'DEBUG'
# or level = 10
outputs = ["std_out", "file_out"]
[Formatter]
[Formatter.main_formatter]
# 格式化器名称
class = "MainFormatter"
# 格式化器参数
time_format = "%Y-%m-%d %H:%M:%S"
msec_time_format = "{}-{:03d}"
use_absolute_path = false
[Formatter.std_formatter]
class = "StdFormatter"
sub_formatter = ["main_formatter"]
default_template = "[${log_time}][${level}]|${logger_name}:${logger_tag}|${messages}"
[Outstream]
[Outstream.std_out]
# 输出流名称
class = "StdioOutputStream"
# 输出流参数
formatter = "std_formatter"
use_stderr = false
# or true
level_name = "debug"
# or 'DEBUG'
# or level = 10
[Outstream.file_out]
class = "FileCacheOutputStream"
level = 10
# or level_name = 'DEBUG'
# or level_name = 'debug'
formatter = "std_formatter"
flush_count_limit = 10
# 5 条日志刷新一次
flush_time_limit = 5
# 5 秒刷新一次
# or flush_time_limit = 0.5
file_path = "./logs"
file_name = "dr-{time}.log"
"""
# 整的跟 export 一样
# fmt: off
__all__ = [
"default_config"
]
# fmt: on

View File

@ -11,17 +11,27 @@ github: @shenjackyuanjie
gitee: @shenjackyuanjie gitee: @shenjackyuanjie
""" """
# import time
import logging
# import traceback
import logging.config
import multiprocessing import multiprocessing
# from io import StringIO
# from pathlib import Path
from typing import List, Optional, Dict from typing import List, Optional, Dict
# from Difficult_Rocket.utils import tools
from Difficult_Rocket.api.types import Options from Difficult_Rocket.api.types import Options
# from Difficult_Rocket.utils.translate import tr
# from Difficult_Rocket.runtime import DR_runtime
from Difficult_Rocket.mod.loader import ModManager from Difficult_Rocket.mod.loader import ModManager
from Difficult_Rocket.utils.thread import new_thread from Difficult_Rocket.utils.thread import new_thread
from Difficult_Rocket import client, server, DR_status
from lib_not_dr.loggers import config # from Difficult_Rocket.crash import write_info_to_cache
from lib_not_dr.loggers.logger import Logger from Difficult_Rocket import client, server, DR_status
class Console(Options): class Console(Options):
@ -65,7 +75,7 @@ class Game(Options):
console_class: Console = Console console_class: Console = Console
main_config: Dict main_config: Dict
logger: Logger logger: logging.Logger
mod_manager: ModManager mod_manager: ModManager
@ -74,6 +84,9 @@ class Game(Options):
def init_mods(self) -> None: def init_mods(self) -> None:
"""验证/加载 mod""" """验证/加载 mod"""
from Difficult_Rocket.mod import loader as mod_loader
mod_loader.logger = logging.getLogger("mod_manager")
self.mod_manager = ModManager() self.mod_manager = ModManager()
mod_class = self.mod_manager.load_mods() mod_class = self.mod_manager.load_mods()
self.mod_manager.init_mods(mod_class) self.mod_manager.init_mods(mod_class)
@ -107,7 +120,7 @@ class Game(Options):
self.server = server.Server(net_mode="local") self.server = server.Server(net_mode="local")
def init(self, **kwargs) -> bool: def init(self, **kwargs) -> bool:
self.logger = config.get_logger("main") self.logger = logging.getLogger("main")
self.load_file() self.load_file()
self.setup() self.setup()
self.log_env() self.log_env()

View File

@ -6,6 +6,7 @@
import sys import sys
import time import time
import logging
import traceback import traceback
import importlib import importlib
from pathlib import Path from pathlib import Path
@ -15,11 +16,9 @@ from Difficult_Rocket.mod.api import ModInfo
from Difficult_Rocket.utils.translate import tr from Difficult_Rocket.utils.translate import tr
from Difficult_Rocket.api.types import Options from Difficult_Rocket.api.types import Options
from lib_not_dr.loggers import config
Game = TypeVar("Game") Game = TypeVar("Game")
logger = config.get_logger_from_old("mod_manager", "client") logger = logging.getLogger("mod_manager")
ONE_FILE_SUFFIX = (".py", ".pyc", ".pyd") ONE_FILE_SUFFIX = (".py", ".pyc", ".pyd")
PACKAGE_SUFFIX = (".pyz", ".zip", ".dr_mod") PACKAGE_SUFFIX = (".pyz", ".zip", ".dr_mod")
@ -92,14 +91,14 @@ class ModManager(Options):
if not hasattr(loading_mod, "mod_class") or not issubclass( if not hasattr(loading_mod, "mod_class") or not issubclass(
loading_mod.mod_class, ModInfo loading_mod.mod_class, ModInfo
): ):
logger.warn(tr().mod.load.faild.no_mod_class().format(mod_path)) logger.warning(tr().mod.load.faild.no_mod_class().format(mod_path))
return None return None
mod_class: type(ModInfo) = loading_mod.mod_class # 获取 mod 类 mod_class: type(ModInfo) = loading_mod.mod_class # 获取 mod 类
if mod_class.mod_id not in self.find_mod_paths: if mod_class.mod_id not in self.find_mod_paths:
self.find_mod_paths[mod_class.mod_id] = mod_path self.find_mod_paths[mod_class.mod_id] = mod_path
return mod_class return mod_class
except ImportError: except ImportError:
logger.warn( logger.warning(
tr().mod.load.faild.error().format(mod_path, traceback.format_exc()) tr().mod.load.faild.error().format(mod_path, traceback.format_exc())
) )
return None return None
@ -194,7 +193,7 @@ class ModManager(Options):
not (mod_class := self.loaded_mod_modules.get(mod_id)) not (mod_class := self.loaded_mod_modules.get(mod_id))
and (mod_class := self.get_mod_module(mod_id)) is None and (mod_class := self.get_mod_module(mod_id)) is None
): ):
logger.warn(tr().mod.unload.faild.not_find().format(mod_id)) logger.warning(tr().mod.unload.faild.not_find().format(mod_id))
return None return None
try: try:
mod_class.on_unload(game=game) mod_class.on_unload(game=game)
@ -219,7 +218,7 @@ class ModManager(Options):
return return
mod_class: Optional[ModInfo] = None mod_class: Optional[ModInfo] = None
if unload.mod_id not in self.find_mod_paths: if unload.mod_id not in self.find_mod_paths:
logger.warn(tr().mod.reload.faild.not_find().format(unload.mod_id)) logger.warning(tr().mod.reload.faild.not_find().format(unload.mod_id))
paths = self.find_mods_in_path() paths = self.find_mods_in_path()
for path in paths: for path in paths:
mod_class = self.load_mod(path) mod_class = self.load_mod(path)

View File

@ -13,12 +13,13 @@ gitee: @shenjackyuanjie
import os import os
import time import time
import logging
# import multiprocessing # import multiprocessing
from Difficult_Rocket.utils import tools from Difficult_Rocket.utils import tools
from Difficult_Rocket.utils.translate import tr from Difficult_Rocket.utils.translate import tr
# from Difficult_Rocket.api.delivery import Delivery
from lib_not_dr import loggers # from Difficult_Rocket.utils.new_thread import new_thread
# TODO 改变服务端启动逻辑 0.6.0(划掉 0.8.0)会写完的( # TODO 改变服务端启动逻辑 0.6.0(划掉 0.8.0)会写完的(
@ -28,7 +29,7 @@ class Server:
def __init__(self, net_mode="local"): def __init__(self, net_mode="local"):
start_time = time.time() start_time = time.time()
# logging # logging
self.logger = loggers.config.get_logger("server") self.logger = logging.getLogger("server")
self.logger.info(tr().server.setup.start()) self.logger.info(tr().server.setup.start())
# value # value
self.process_id = os.getpid() self.process_id = os.getpid()

View File

@ -17,6 +17,7 @@ import time
import math import math
import json import json
import rtoml import rtoml
import logging
import configparser import configparser
from pathlib import Path from pathlib import Path
@ -26,30 +27,28 @@ from defusedxml.ElementTree import parse
from Difficult_Rocket.exception.unsupport import NoMoreJson5 from Difficult_Rocket.exception.unsupport import NoMoreJson5
from lib_not_dr import loggers
# logger # logger
tools_logger = loggers.config.get_logger("tools") tools_logger = logging.getLogger("tools")
""" """
file config file config
""" """
file_error = { file_error = {
FileNotFoundError: "no {filetype} file was founded!:\n file name: {filename}\n file_type: {filetype}\n stack: {stack}", FileNotFoundError: "no {filetype} file was founded!:\n file name: {filename}\n file_type: {filetype}\n stack: {stack}",
KeyError: "no stack in {filetype} file {filename} was found! \n file type: {} \n file name: {} \n stack: {stack}", KeyError: "no stack in {filetype} file {filename} was found! \n file type: {} \n file name: {} \n stack: {stack}",
Exception: "get some {error_type} when read {filetype} file {filename}! \n file type: {} \n file name: {} \n stack: {stack}", Exception: "get some {error_type} when read {filetype} file {filename}! \n file type: {} \n file name: {} \n stack: {stack}",
} }
def load_file( def load_file(
file_name: Union[str, Path], file_name: Union[str, Path],
stack: Optional[Union[str, list, dict]] = None, stack: Optional[Union[str, list, dict]] = None,
raise_error: Optional[bool] = True, raise_error: Optional[bool] = True,
encoding: Optional[str] = "utf-8", encoding: Optional[str] = "utf-8",
) -> Union[dict, ElementTree.ElementTree]: ) -> Union[dict, ElementTree.ElementTree]:
if isinstance(file_name, Path): if isinstance(file_name, Path):
file_name = str(file_name) file_name = str(file_name)
f_type = file_name[file_name.rfind(".") + 1:] # 从最后一个.到末尾 (截取文件格式) f_type = file_name[file_name.rfind(".") + 1 :] # 从最后一个.到末尾 (截取文件格式)
get_file = NotImplementedError("解析失败,请检查文件类型/文件内容/文件是否存在!") get_file = NotImplementedError("解析失败,请检查文件类型/文件内容/文件是否存在!")
try: try:
if f_type == "xml": if f_type == "xml":
@ -96,7 +95,7 @@ def load_file(
def save_dict_file(file_name: str, data: dict, encoding: str = "utf-8") -> bool: def save_dict_file(file_name: str, data: dict, encoding: str = "utf-8") -> bool:
f_type = file_name[file_name.rfind(".") + 1:] # 从最后一个.到末尾 (截取文件格式) f_type = file_name[file_name.rfind(".") + 1 :] # 从最后一个.到末尾 (截取文件格式)
try: try:
if (f_type == "config") or (f_type == "conf") or (f_type == "ini"): if (f_type == "config") or (f_type == "conf") or (f_type == "ini"):
return False return False
@ -202,6 +201,36 @@ def format_bool(thing) -> bool:
raise TypeError("Need a 'like bool' not a {}".format(thing)) raise TypeError("Need a 'like bool' not a {}".format(thing))
level_ = [
"DEBUG",
"INFO",
"WARNING",
"ERROR",
"CRITICAL",
logging.DEBUG,
logging.INFO,
logging.WARNING,
logging.ERROR,
logging.CRITICAL,
]
def log_level(level):
if level in level_:
if (level == "DEBUG") or (level == logging.DEBUG):
return logging.DEBUG
if (level == "INFO") or (level == logging.INFO):
return logging.INFO
if (level == "WARNING") or (level == logging.WARNING):
return logging.WARNING
if (level == "ERROR") or (level == logging.ERROR):
return logging.ERROR
if (level == "CRITICAL") or (level == logging.CRITICAL):
return logging.CRITICAL
else:
raise ValueError("Need a like logging.level thing not anything else")
# linear_algebra # linear_algebra

View File

@ -34,25 +34,18 @@ config_version = 1
# 格式化器参数 # 格式化器参数
time_format = "%Y-%m-%d %H:%M:%S" time_format = "%Y-%m-%d %H:%M:%S"
msec_time_format = "{}-{:03d}" msec_time_format = "{}-{:03d}"
use_absolute_path = false use_absolut_path = false
[Formatter.std_formatter] [Formatter.std_formatter]
class = "StdFormatter" formatter_class = "StdFormatter"
enable_color = true
sub_formatter = ["main_formatter"] sub_formatter = ["main_formatter"]
default_template = "[${log_time}][${level}]|${logger_name}:${logger_tag}|${messages}" default_template = "[{log_time}][{level}]|{logger_name}:{logger_tag}|{messages}"
[Formatter.file_std_formatter]
class = "StdFormatter"
enable_color = false
sub_formatter = ["main_formatter"]
default_template = "[${log_time}][${level}]|${logger_name}:${logger_tag}|${messages}"
[Outstream] [Outstream]
[Outstream.std_out] [Outstream.std_out]
# 输出流名称 # 输出流名称
class = "StdioOutputStream" class = "StdOutputStream"
# 输出流参数 # 输出流参数
formatter = "std_formatter" formatter = "std_formatter"
use_stderr = false use_stderr = false
@ -67,11 +60,11 @@ config_version = 1
level = 10 level = 10
# or level_name = 'DEBUG' # or level_name = 'DEBUG'
# or level_name = 'debug' # or level_name = 'debug'
formatter = "file_std_formatter" formatter = "std_formatter"
flush_count_limit = 10 flush_count_limit = 10
# 5 条日志刷新一次 # 5 条日志刷新一次
flush_time_limit = 5 flush_time_limit = 5
# 5 秒刷新一次 # 5 秒刷新一次
# or flush_time_limit = 0.5 # or flush_time_limit = 0.5
file_path = "./logs" file_path = "./logs"
file_name = "dr-{time}.log" file_name = "%s-dr.log"

View File

@ -9,16 +9,6 @@
### Rename ### Rename
- `Api_version` -> `api_version` - `Api_version` -> `api_version`
- `_DR_Status` -> `_DRStatus`
- `name` = `DR Option` -> `DR Status`
- 这毛病属实是没想到, 之前一直没发现
### Rework
- 将 `logging` 的依赖改为 `lib_not_dr.loggers`
- 以后都用 `lib_not_dr` 的 logger 了
- Change the dependency of `logging` to `lib_not_dr.loggers`
- Use `lib_not_dr` logger in the future
### Add ### Add

@ -1 +1 @@
Subproject commit 91d70dd3322806d983b78ffeec8a6621504268fd Subproject commit 544c180e728d1b1f7942cb7874f6e579c1acc02b

@ -1 +1 @@
Subproject commit 7df9ee869242f482579f1aa0ed5c61e39c4a444f Subproject commit e5b5e24807687b1a12dca73ce3055a2745d38cf9

View File

@ -4,6 +4,7 @@
# All rights reserved # All rights reserved
# ------------------------------- # -------------------------------
import logging
import warnings import warnings
import traceback import traceback
@ -15,11 +16,9 @@ from Difficult_Rocket.api.mod import ModInfo
from Difficult_Rocket.client import ClientWindow from Difficult_Rocket.client import ClientWindow
from Difficult_Rocket.api.types import Options, Version from Difficult_Rocket.api.types import Options, Version
from lib_not_dr import loggers
DR_rust_version = Version("0.2.23.0") # DR_mod 的 Rust 编写部分的兼容版本 DR_rust_version = Version("0.2.23.0") # DR_mod 的 Rust 编写部分的兼容版本
logger = loggers.config.get_logger_from_old("client.dr_game", "client") logger = logging.getLogger("client.dr_game")
class _DR_mod_runtime(Options): # NOQA class _DR_mod_runtime(Options): # NOQA