Difficult-Rocket/Difficult_Rocket/main.py
2023-09-19 00:45:10 +08:00

128 lines
3.4 KiB
Python

# -------------------------------
# Difficult Rocket
# Copyright © 2020-2023 by shenjackyuanjie 3695888@qq.com
# All rights reserved
# -------------------------------
"""
writen by shenjackyuanjie
mail: 3695888@qq.com
github: @shenjackyuanjie
gitee: @shenjackyuanjie
"""
# import time
import logging
# import traceback
import logging.config
import multiprocessing
# from io import StringIO
# from pathlib import Path
from typing import List, Optional, Dict
# from Difficult_Rocket.utils import tools
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.utils.thread import new_thread
# from Difficult_Rocket.crash import write_info_to_cache
from Difficult_Rocket import client, server, DR_status
class Console(Options):
name = 'python stdin console'
running: bool = False
caches: List[str] = []
@new_thread('python console', daemon=True, log_thread=True)
def main(self):
while self.running:
try:
get_str = input('>>>')
except (EOFError, KeyboardInterrupt):
get_str = 'stop'
self.caches.append(get_str)
if get_str == 'stop':
self.running = False
break
def start(self):
self.running = True
self.main()
def stop(self):
self.running = False
def get_command(self) -> Optional[str]:
return self.caches.pop(0) if self.caches else None
def new_command(self) -> None:
return None
class Game(Options):
name = 'MainGame'
client: client.Client
server: server.Server
console: Console
console_class: Console = Console
main_config: Dict
logger: logging.Logger
mod_manager: ModManager
def dispatch_mod_event(self, event_name: str, *args, **kwargs) -> None:
self.mod_manager.dispatch_event(event_name, *args, **kwargs)
def init_mods(self) -> None:
"""验证/加载 mod"""
from Difficult_Rocket.mod import loader as mod_loader
mod_loader.logger = logging.getLogger('mod_manager')
self.mod_manager = ModManager()
mod_class = self.mod_manager.load_mods()
self.mod_manager.init_mods(mod_class)
self.dispatch_mod_event('on_load', game=self)
def init_console(self) -> None:
self.console = self.console_class()
self.console.start()
def start(self):
self.server.run()
if DR_status.use_multiprocess:
try:
game_process = multiprocessing.Process(target=self.client.start, name='pyglet app')
game_process.start()
game_process.join()
except Exception:
return -1
else:
return 1
else:
self.client.start()
def log_env(self) -> None:
self.logger.info(f'\n{self.as_markdown()}')
def setup(self) -> None:
self.client = client.Client(game=self, net_mode='local')
self.server = server.Server(net_mode='local')
def init(self, **kwargs) -> bool:
self.logger = logging.getLogger('main')
self.load_file()
self.setup()
self.log_env()
return True
def load_file(self) -> bool:
"""加载文件"""
self.init_mods()
self.init_console()
return True