def execute_command(self, command: str, source: CommandSource): first_literal_element = utils.get_element(command) plugin_root_nodes = self.root_nodes[first_literal_element] if isinstance(source, InfoCommandSource): if len(plugin_root_nodes) > 0 and source.is_console: # If this is a command, don't send it towards the server if it's from console input source.get_info().cancel_send_to_server() for plugin_root_node in plugin_root_nodes: plugin = plugin_root_node.plugin node = plugin_root_node.node with self.mcdr_server.plugin_manager.with_plugin_context(plugin): try: node.execute(source, command) except CommandError as error: if not error.is_handled(): translation_key = 'command_exception.{}'.format( string_util.hump_to_underline( type(error).__name__)) try: error.set_message( self.__translate_command_error_header( translation_key, error)) except KeyError: self.logger.debug( 'Fail to translated command error with key {}'. format(translation_key), option=DebugOption.COMMAND) source.reply(error.to_mc_color_text()) except: self.logger.exception( 'Error when executing command "{}" with command source "{}" on {} registered by {}' .format(command, source, node, plugin))
def _print_plugin_operation_result_if_no_error(self, source: CommandSource, ret: FunctionCallResult): if ret.no_error: source.reply( self.mcdr_server.plugin_manager.last_operation_result.to_rtext( show_path=source.has_permission( PermissionLevel.PHYSICAL_SERVER_CONTROL_LEVEL)))
def on_mcdr_command_unknown_argument(self, source: CommandSource, error: CommandError): command = error.get_parsed_command().rstrip(' ') source.reply( RText(self.tr('mcdr_command.command_not_found', command)).h( self.tr('mcdr_command.command_not_found_suggest', command)).c(RAction.run_command, command))
def reload_all_plugin(self, source: CommandSource): ret = self.function_call( source, self.mcdr_server.plugin_manager.refresh_all_plugins, 'reload_all_plugin', log_success=False) if ret.no_error: source.reply(self.mcdr_server.plugin_manager.last_operation_result. to_rtext())
def on_mcdr_command_unknown_argument(self, source: CommandSource, error: CommandError): if source.has_permission(PermissionLevel.MCDR_CONTROL_LEVEL): command = error.get_parsed_command().rstrip(' ') source.reply( RText(self.tr('mcdr_command.command_not_found', command)).h( self.tr('mcdr_command.command_not_found_suggest', command)).c(RAction.run_command, command)) else: self.on_mcdr_command_permission_denied(source, error)
def reload_all_plugin(self, source: CommandSource): ret = self.function_call( source, self.mcdr_server.plugin_manager.refresh_all_plugins, 'reload_all_plugin', log_success=False) if ret.no_error: source.reply( self.mcdr_server.plugin_manager.last_operation_result.to_rtext( show_path=source.has_permission( PermissionLevel.PHYSICAL_SERVER_CONTROL_LEVEL)))
def show_preference_list(self, source: CommandSource): pref = self.pref_mgr.get_preference(source, auto_add=True) source.reply(self.tr('mcdr_command.preference.list.title')) for pref_name in pref.get_annotations_fields().keys(): value = getattr(pref, pref_name, RText('N/A', RColor.gray)) source.reply( self.__detail_hint( RTextList(RText('- ', RColor.gray), RText(pref_name, PREF_COLOR), RText(': ', RColor.gray), RText(value, VALUE_COLOR)), pref_name))
def set_language(self, source: CommandSource, new_lang: Optional[str]): if new_lang is None: # reset new_lang = self.pref_mgr.get_default_preference().language if new_lang not in self.available_languages: source.reply( self.tr('mcdr_command.preference.unknown_language', new_lang)) return pref = self.pref_mgr.get_preference(source, auto_add=True) pref.language = new_lang self.pref_mgr.save_preferences() source.reply( self.tr('mcdr_command.preference.set.done', RText('language', RColor.yellow), RText(new_lang, RColor.gold)))
def function_call(self, source: CommandSource, func: Callable[[], Any], name: str, log_success=True, log_fail=True, msg_args=()) -> FunctionCallResult: try: ret = self.FunctionCallResult(func(), True) if log_success: source.reply( self.tr('mcdr_command.{}.success'.format(name), *msg_args)) return ret except: if log_fail: source.reply( self.tr('mcdr_command.{}.fail'.format(name), *msg_args)) self.mcdr_server.logger.error(traceback.format_exc()) return self.FunctionCallResult(None, False)
def show_plugin_info(self, source: CommandSource, plugin_id: str): plugin = self.mcdr_server.plugin_manager.get_plugin_from_id(plugin_id) if plugin is None: source.reply(self.tr('mcdr_command.invalid_plugin_id', plugin_id)) else: meta = plugin.get_metadata() source.reply( RTextList( RText(meta.name, styles=RStyle.bold).h(plugin), ' ', RText('v{}'.format(meta.version), color=RColor.gray))) if meta.author is not None: source.reply( RText('Authors: {}'.format(', '.join(meta.author)))) if meta.link is not None: source.reply( RTextList( 'Link: ', RText(meta.link, color=RColor.blue, styles=RStyle.underlined))) if meta.description is not None: source.reply(meta.description)
def _traverse(self, command: str, source: CommandSource, purpose: TraversePurpose) -> None or List[CommandSuggestion]: first_literal_element = utils.get_element(command) plugin_root_nodes = self.root_nodes.get(first_literal_element, []) suggestions = CommandSuggestions() if purpose == TraversePurpose.EXECUTE and isinstance(source, InfoCommandSource): if len(plugin_root_nodes) > 0 and source.is_console: # If this is a command, don't send it towards the server if it's from console input source.get_info().cancel_send_to_server() if purpose == TraversePurpose.SUGGEST and len(plugin_root_nodes) == 0: return CommandSuggestions([CommandSuggestion('', literal) for literal in self.root_nodes.keys()]) for plugin_root_node in plugin_root_nodes: plugin = plugin_root_node.plugin node = plugin_root_node.node try: with self.mcdr_server.plugin_manager.with_plugin_context(plugin): if purpose == TraversePurpose.EXECUTE: node.execute(source, command) elif purpose == TraversePurpose.SUGGEST: suggestions.extend(node.generate_suggestions(source, command)) except CommandError as error: if not error.is_handled(): translation_key = 'command_exception.{}'.format(string_util.hump_to_underline(type(error).__name__)) try: error.set_message(self.__translate_command_error_header(translation_key, error)) except KeyError: self.logger.debug('Fail to translated command error with key {}'.format(translation_key), option=DebugOption.COMMAND) source.reply(error.to_mc_color_text()) except: self.logger.exception('Error when executing command "{}" with command source "{}" on {} registered by {}'.format(command, source, node, plugin)) if purpose == TraversePurpose.SUGGEST: return suggestions
def execute_command(self, source: CommandSource, command: str): first_literal_element = utils.get_element(command) root_nodes = self.root_nodes.get(first_literal_element, []) if len(root_nodes ) > 0 and source.source_type == CommandSourceType.CONSOLE: # If this is a command, don't send it towards the server if it's from console input source.get_info().cancel_send_to_server() command_errors = [] general_exc_info = [] for node in root_nodes: try: node.execute(source, command) except CommandError as e: command_errors.append(e) except: general_exc_info.append(sys.exc_info()) for exc_info in general_exc_info: self.logger.error( 'Error when executing command "{}" with command source "{}"'. format(command, source), exc_info=exc_info) for error in command_errors: if not error.is_handled(): translation_key = 'command_exception.{}'.format( string_util.hump_to_underline(type(error).__name__)) try: error.set_translated_message( translation_key, lambda key, args: self.mcdr_server.tr( key, *args, allow_failure=False)) except KeyError: self.logger.debug( 'Fail to translated command error with key {}'.format( translation_key), option=DebugOption.COMMAND) source.reply(error.to_mc_color_text())
def __existed_regular_plugin_manipulate(self, source: CommandSource, plugin_id: str, operation_name: str, func: Callable[[RegularPlugin], Any]): plugin = self.mcdr_server.plugin_manager.get_regular_plugin_from_id(plugin_id) if plugin is None or not plugin.is_regular(): source.reply(self.tr('mcdr_command.invalid_plugin_id', plugin_id)) else: result = self.function_call(source, lambda: func(plugin), operation_name, log_success=False, msg_args=(plugin.get_name(),)) if result.return_value is True: source.reply(self.tr('mcdr_command.{}.success'.format(operation_name), plugin.get_name())) else: source.reply(self.tr('mcdr_command.{}.fail'.format(operation_name), plugin.get_name())) self._print_plugin_operation_result_if_no_error(source, result)
def __not_loaded_plugin_file_manipulate(self, source: CommandSource, file_name: str, operation_name: str, func: Callable[[str], Any], possible_plugin_path: List[str]): plugin_paths = list(filter(lambda fp: fp == file_name, possible_plugin_path)) if len(plugin_paths) == 0: plugin_paths = list(filter(lambda fp: os.path.basename(fp) == file_name, possible_plugin_path)) if len(plugin_paths) == 0: source.reply(self.tr('mcdr_command.invalid_plugin_file_name', file_name)) else: result = self.function_call(source, lambda: func(plugin_paths[0]), operation_name, log_success=False, msg_args=(file_name,)) if result.return_value is True: source.reply(self.tr('mcdr_command.{}.success'.format(operation_name), file_name)) else: source.reply(self.tr('mcdr_command.{}.fail'.format(operation_name), file_name)) self._print_plugin_operation_result_if_no_error(source, result)
def show_preference_item(self, source: CommandSource, pref_name: str): entry: PrefCommandEntry = self.preferences.get(pref_name) pref: PreferenceItem = self.pref_mgr.get_preference(source, auto_add=True) current_value = getattr(pref, pref_name, None) default_value = getattr(self.pref_mgr.get_default_preference(), pref_name, None) if entry is None or current_value is None: # should never come here raise KeyError('Unknown preference {}'.format(pref_name)) def get_suggestion_text(value: str): text = RText(value, VALUE_COLOR).c( RAction.suggest_command, '{} preference {} set {}'.format(self.control_command_prefix, pref_name, value)) hover_text = RTextList( self.tr('mcdr_command.preference.item.set_suggestion_hint', RText(pref_name, PREF_COLOR), RText(value, VALUE_COLOR))) styles: List[RStyle] = [] extra_descriptions: List[RTextBase] = [] if value == current_value: styles.append(RStyle.underlined) extra_descriptions.append( self.tr('mcdr_command.preference.item.current').set_color( RColor.gray)) if value == default_value: styles.append(RStyle.bold) extra_descriptions.append( self.tr('mcdr_command.preference.item.default').set_color( RColor.gray)) if len(extra_descriptions) > 0: hover_text.append( RTextList( '\n', RText.join(RText(', ', RColor.dark_gray), extra_descriptions))) text.set_styles(styles) return text.h(hover_text) source.reply( self.tr( 'mcdr_command.preference.item.name', self.__detail_hint(RText(pref_name, PREF_COLOR), pref_name))) source.reply( self.tr('mcdr_command.preference.item.value', RText(current_value, VALUE_COLOR))) source.reply( self.tr( 'mcdr_command.preference.item.suggestions', RText.join(', ', map(get_suggestion_text, entry.suggester()))))
def set_player_permission(self, source: CommandSource, player, value): permission_level = PermissionLevel.get_level(value) if permission_level is None: source.reply(self.tr('mcdr_command.invalid_permission_level')) elif not Validator.player_name(player): source.reply(self.tr('mcdr_command.invalid_player_name')) else: # Source with permission level x is allowed manipulate players/level in permission level range [0, x] if not source.has_permission( max( permission_level.level, self.mcdr_server.permission_manager. get_player_permission_level(player))): source.reply(self.tr('mcdr_command.permission_not_enough')) else: self.mcdr_server.permission_manager.set_permission_level( player, permission_level) if source.is_player: source.reply( self.tr('permission_manager.set_permission_level.done', player, permission_level.name))
def remove_player_permission(self, source: CommandSource, player: str): if not Validator.player_name(player): source.reply(self.tr('mcdr_command.invalid_player_name')) else: if not source.has_permission( self.mcdr_server.permission_manager. get_player_permission_level(player)): source.reply(self.tr('mcdr_command.permission_not_enough')) else: self.mcdr_server.permission_manager.remove_player(player) source.reply( self.tr( 'mcdr_command.remove_player_permission.player_removed', player))
def set_default_permission(self, source: CommandSource, value: str): permission_level = PermissionLevel.get_level(value) if permission_level is None: source.reply(self.tr('mcdr_command.invalid_permission_level')) elif not source.has_permission(permission_level.level): source.reply(self.tr('mcdr_command.permission_not_enough')) else: self.mcdr_server.permission_manager.set_default_permission_level( permission_level) if source.is_player: source.reply( self.tr( 'permission_manager.set_default_permission_level.done', permission_level.name))
def list_permission(self, source: CommandSource, target_value: Optional[str]): specified_level = PermissionLevel.get_level(target_value) if specified_level is None: # show default level information if target permission not specified source.reply( RText( self.tr( 'mcdr_command.list_permission.show_default', self.mcdr_server.permission_manager. get_default_permission_level())).c( RAction.suggest_command, '{} permission setdefault '.format( self.control_command_prefix)). h(self.tr('mcdr_command.list_permission.suggest_setdefault'))) for permission_level in PermissionLevel.INSTANCES: if specified_level is None or permission_level == specified_level: source.reply( RText('§7[§e{}§7]§r'.format(permission_level.name)).c( RAction.run_command, '{} permission list {}'.format( self.control_command_prefix, permission_level.name) ).h( self.tr('mcdr_command.list_permission.suggest_list', permission_level.name))) for player in self.mcdr_server.permission_manager.get_permission_group_list( permission_level.name): texts = RText('§7-§r {}'.format(player)) if self.can_see_rtext(source): texts += RTextList( RText(' [✎]', color=RColor.gray).c( RAction.suggest_command, '{} permission set {} '.format( self.control_command_prefix, string_util.auto_quotes(player))). h( self.tr( 'mcdr_command.list_permission.suggest_set', player)), RText(' [×]', color=RColor.gray).c( RAction.suggest_command, '{} permission remove {}'.format( self.control_command_prefix, string_util.auto_quotes(player))). h( self.tr( 'mcdr_command.list_permission.suggest_disable', player)), ) source.reply(texts)
def process_help_command(self, source: CommandSource, context: CommandContext): page = context.get('page') source.reply(self.tr('mcdr_command.help_message.title')) matched = [] # type: List[HelpMessage] for msg in self.mcdr_server.plugin_manager.registry_storage.help_messages: # type: HelpMessage if source.has_permission(msg.permission): matched.append(msg) matched_count = len(matched) if page is not None: left, right = ( page - 1) * HELP_MESSAGE_PER_PAGE, page * HELP_MESSAGE_PER_PAGE else: left, right = 0, matched_count for i in range(left, right): if 0 <= i < matched_count: msg = matched[i] source.reply( RTextList( RText(msg.prefix, color=RColor.gray).c(RAction.suggest_command, msg.prefix), ': ', translation_util.translate_from_dict( msg.message, self.server_interface.get_mcdr_language(), default=''))) if page is not None: has_prev = 0 < left < matched_count has_next = 0 < right < matched_count color = {False: RColor.dark_gray, True: RColor.gray} prev_page = RText('<-', color=color[has_prev]) if has_prev: prev_page.c(RAction.run_command, '{} {}'.format( self.help_command_prefix, page - 1)).h( self.tr( 'mcdr_command.help_message.previous_page_hover')) next_page = RText('->', color=color[has_next]) if has_next: next_page.c(RAction.run_command, '{} {}'.format( self.help_command_prefix, page + 1)).h( self.tr('mcdr_command.help_message.next_page_hover')) source.reply( RTextList( prev_page, ' {} '.format( self.tr('mcdr_command.help_message.page_number', page)), next_page))
def query_player_permission(self, source: CommandSource, player: str): if not Validator.player_name(player): source.reply(self.tr('mcdr_command.invalid_player_name')) return else: level = self.mcdr_server.permission_manager.get_player_permission_level( player, auto_add=False) if level is not None: source.reply( self.tr('mcdr_command.query_player_permission.player', player, PermissionLevel.from_value(level))) else: source.reply( self.tr( 'mcdr_command.query_player_permission.player_unknown', player))
def list_permission(self, source: CommandSource, target_value): specified_level = PermissionLevel.get_level(target_value) if specified_level is None: # show default level information if target permission not specified source.reply( RText( self.tr( 'mcdr_command.list_permission.show_default', self.mcdr_server.permission_manager. get_default_permission_level())).c( RAction.suggest_command, '!!MCDR permission setdefault '). h(self.tr('mcdr_command.list_permission.suggest_setdefault'))) for permission_level in PermissionLevel.INSTANCES: if specified_level is None or permission_level == specified_level: source.reply( RText('§7[§e{}§7]§r'.format(permission_level.name)).c( RAction.run_command, '!!MCDR permission list {}'. format(permission_level.name)).h( self.tr( 'mcdr_command.list_permission.suggest_list', permission_level.name))) for player in self.mcdr_server.permission_manager.get_permission_group_list( permission_level.name): texts = RText('§7-§r {}'.format(player)) if self.should_display_buttons(source): texts += RTextList( RText(' [✎]', color=RColor.gray).c( RAction.suggest_command, '!!MCDR permission set {} '.format(player)). h( self.tr( 'mcdr_command.list_permission.suggest_set', player)), RText(' [×]', color=RColor.gray).c( RAction.suggest_command, '!!MCDR permission remove {}'.format(player)). h( self.tr( 'mcdr_command.list_permission.suggest_disable', player)), ) source.reply(texts)
def set_language(self, source: CommandSource, language: str): available_languages = self.mcdr_server.translation_manager.available_languages if language not in available_languages: source.reply( self.tr('mcdr_command.set_language.not_available', language)) lang_texts = [] for lang in available_languages: lang_texts.append( RText(lang, color=RColor.yellow).c( RAction.run_command, '{} setlang {}'.format(self.control_command_prefix, lang))) source.reply( self.tr('mcdr_command.set_language.language_list', RText.join(', ', lang_texts))) else: self.mcdr_server.config.set_value('language', language) self.mcdr_server.translation_manager.set_language(language) source.reply(self.tr('mcdr_command.set_language.success', language))
def __not_loaded_plugin_file_manipulate(self, source: CommandSource, file_name: str, operation_name: str, func: Callable[[str], Any]): plugin_paths = self.get_files_in_plugin_directories( lambda fp: os.path.basename(fp) == file_name) if len(plugin_paths) == 0: source.reply( self.tr('mcdr_command.invalid_plugin_file_name', file_name)) else: result = self.function_call(source, lambda: func(plugin_paths[0]), operation_name, log_success=False, msg_args=(file_name, )) if result.return_value is True: source.reply( self.tr('mcdr_command.{}.success'.format(operation_name), file_name)) else: source.reply( self.tr('mcdr_command.{}.fail'.format(operation_name), file_name))
def query_self_permission(self, source: CommandSource): source.reply( self.tr('mcdr_command.query_player_permission.self', PermissionLevel.from_value(source.get_permission_level())))
def list_plugin(self, source: CommandSource): not_loaded_plugin_list = self.get_files_in_plugin_directories( lambda fp: fp.endswith(plugin_constant.SOLO_PLUGIN_FILE_SUFFIX) and not self.mcdr_server.plugin_manager.contains_plugin_file( fp)) # type: List[str] disabled_plugin_list = self.get_files_in_plugin_directories( lambda fp: fp.endswith(plugin_constant.DISABLED_PLUGIN_FILE_SUFFIX) ) # type: List[str] current_plugins = list(self.mcdr_server.plugin_manager.get_all_plugins( )) # type: List[AbstractPlugin] source.reply( self.tr('mcdr_command.list_plugin.info_loaded_plugin', len(current_plugins))) for plugin in current_plugins: meta = plugin.get_metadata() displayed_name = RText(meta.name) if not self.can_see_rtext(source): displayed_name += RText(' ({})'.format( plugin.get_identifier()), color=RColor.gray) texts = RTextList( '§7-§r ', displayed_name.c( RAction.run_command, '{} plugin info {}'.format( self.control_command_prefix, meta.id)).h( self.tr('mcdr_command.list_plugin.suggest_info', plugin.get_identifier()))) if self.can_see_rtext(source) and not plugin.is_permanent(): texts.append( ' ', RText('[↻]', color=RColor.gray).c( RAction.run_command, '{} plugin reload {}'.format( self.control_command_prefix, meta.id)).h( self.tr( 'mcdr_command.list_plugin.suggest_reload', meta.id)), ' ', RText('[↓]', color=RColor.gray).c( RAction.run_command, '{} plugin unload {}'.format( self.control_command_prefix, meta.id)).h( self.tr( 'mcdr_command.list_plugin.suggest_unload', meta.id)), ' ', RText('[×]', color=RColor.gray).c( RAction.run_command, '{} plugin disable {}'.format( self.control_command_prefix, meta.id)).h( self.tr( 'mcdr_command.list_plugin.suggest_disable', meta.id))) source.reply(texts) def get_file_name(fp) -> Tuple[str, RText]: name = os.path.basename(fp) name_text = RText(name) if source.has_permission( PermissionLevel.PHYSICAL_SERVER_CONTROL_LEVEL): name_text.h(fp) return name, name_text source.reply( self.tr('mcdr_command.list_plugin.info_disabled_plugin', len(disabled_plugin_list))) for file_path in disabled_plugin_list: file_name, file_name_text = get_file_name(file_path) texts = RTextList(RText('- ', color=RColor.gray), file_name_text) if self.can_see_rtext(source): texts.append( ' ', RText('[✔]', color=RColor.gray).c( RAction.run_command, '{} plugin enable {}'.format( self.control_command_prefix, file_name)).h( self.tr( 'mcdr_command.list_plugin.suggest_enable', file_name))) source.reply(texts) source.reply( self.tr('mcdr_command.list_plugin.info_not_loaded_plugin', len(not_loaded_plugin_list))) for file_path in not_loaded_plugin_list: file_name, file_name_text = get_file_name(file_path) texts = RTextList(RText('- ', color=RColor.gray), file_name_text) if self.can_see_rtext(source): texts.append( ' ', RText('[↑]', color=RColor.gray).c( RAction.run_command, '{} plugin load {}'.format( self.control_command_prefix, file_name)).h( self.tr( 'mcdr_command.list_plugin.suggest_load', file_name))) source.reply(texts)
def on_mcdr_command_permission_denied(self, source: CommandSource, error: CommandError): source.reply( RText(self.mcdr_server.tr('mcdr_command.permission_denied'), color=RColor.red))
def print_mcdr_status(self, source: CommandSource): def bool_formatter(bl): return '{}{}§r'.format('§a' if bl else '§7', bl) rcon_status_dict = { True: self.tr('mcdr_command.print_mcdr_status.online'), False: self.tr('mcdr_command.print_mcdr_status.offline') } source.reply( RTextList( RText( self.tr('mcdr_command.print_mcdr_status.line1', core_constant.NAME, core_constant.VERSION)).c( RAction.open_url, core_constant.GITHUB_URL).h( RText(core_constant.GITHUB_URL, styles=RStyle.underlined, color=RColor.blue)), '\n', RText( self.tr('mcdr_command.print_mcdr_status.line2', self.tr(self.mcdr_server.mcdr_state.value))), '\n', RText( self.tr('mcdr_command.print_mcdr_status.line3', self.tr(self.mcdr_server.server_state.value))), '\n', RText( self.tr( 'mcdr_command.print_mcdr_status.line4', bool_formatter(self.mcdr_server.is_server_startup()))), '\n', RText( self.tr( 'mcdr_command.print_mcdr_status.line5', bool_formatter( self.mcdr_server.should_exit_after_stop()))), '\n', RText( self.tr( 'mcdr_command.print_mcdr_status.line6', rcon_status_dict[ self.server_interface.is_rcon_running()])), '\n', RText( self. tr('mcdr_command.print_mcdr_status.line7', self.mcdr_server.plugin_manager.get_plugin_amount())).c( RAction.suggest_command, '!!MCDR plugin list'))) if source.has_permission( PermissionLevel.PHYSICAL_SERVER_CONTROL_LEVEL): source.reply( RTextList( self.tr( 'mcdr_command.print_mcdr_status.extra_line1', self.mcdr_server.process.pid if self.mcdr_server.process is not None else '§rN/A§r'), '\n', self.tr('mcdr_command.print_mcdr_status.extra_line2', self.mcdr_server.task_executor.task_queue.qsize(), core_constant.MAX_TASK_QUEUE_SIZE), '\n', self.tr('mcdr_command.print_mcdr_status.extra_line3', threading.active_count()))) for thread in threading.enumerate(): source.reply(' §r-§r {}'.format(thread.getName()))
def print_mcdr_status(self, source: CommandSource): def bool_formatter(bl: bool) -> RText: return RText(bl, RColor.green if bl else RColor.red) rcon_status_dict = { True: self.tr('mcdr_command.print_mcdr_status.online'), False: self.tr('mcdr_command.print_mcdr_status.offline') } source.reply( RText( self.tr('mcdr_command.print_mcdr_status.line1', core_constant.NAME, core_constant.VERSION)).c( RAction.open_url, core_constant.GITHUB_URL).h( RText(core_constant.GITHUB_URL, styles=RStyle.underlined, color=RColor.blue))) if not source.has_permission(PermissionLevel.MCDR_CONTROL_LEVEL): return source.reply( RText.join('\n', [ RText( self.tr('mcdr_command.print_mcdr_status.line2', self.tr(self.mcdr_server.mcdr_state.value))), RText( self.tr('mcdr_command.print_mcdr_status.line3', self.tr(self.mcdr_server.server_state.value))), RText( self.tr( 'mcdr_command.print_mcdr_status.line4', bool_formatter(self.mcdr_server.is_server_startup()))), RText( self.tr( 'mcdr_command.print_mcdr_status.line5', bool_formatter( self.mcdr_server.should_exit_after_stop()))), RText( self.tr( 'mcdr_command.print_mcdr_status.line6', rcon_status_dict[ self.server_interface.is_rcon_running()])), RText( self. tr('mcdr_command.print_mcdr_status.line7', self.mcdr_server.plugin_manager.get_plugin_amount())).c( RAction.suggest_command, '!!MCDR plugin list') ])) if not source.has_permission( PermissionLevel.PHYSICAL_SERVER_CONTROL_LEVEL): return source.reply( RText.join('\n', [ self.tr( 'mcdr_command.print_mcdr_status.extra_line1', self.mcdr_server.process.pid if self.mcdr_server.process is not None else '§rN/A§r'), self.tr('mcdr_command.print_mcdr_status.extra_line2', self.mcdr_server.task_executor.task_queue.qsize(), core_constant.MAX_TASK_QUEUE_SIZE), self.tr('mcdr_command.print_mcdr_status.extra_line3', threading.active_count()) ])) thread_pool_counts = 0 for thread in threading.enumerate(): name = thread.getName() if not name.startswith('ThreadPoolExecutor-'): source.reply(' §7-§r {}'.format(name)) else: thread_pool_counts += 1 if thread_pool_counts > 0: source.reply(' §7-§r ThreadPoolExecutor thread x{}'.format( thread_pool_counts))
def process_mcdr_command(self, source: CommandSource): if source.has_permission(PermissionLevel.MCDR_CONTROL_LEVEL): source.reply( self.get_help_message(source, 'mcdr_command.help_message')) else: self.command_status.print_mcdr_status(source)