示例#1
0
 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))
示例#3
0
    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))
示例#4
0
 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())
示例#5
0
 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 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 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 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)
示例#10
0
 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)
示例#11
0
 def get_help_message(self, source: CommandSource, translation_key: str):
     lst = RTextList()
     with source.preferred_language_context():
         for line in self.tr(translation_key).to_plain_text().splitlines(
                 keepends=True):
             prefix = re.search(
                 r'(?<=§7)' + self.control_command_prefix + r'[\w ]*(?=§)',
                 line)
             if prefix is not None:
                 lst.append(
                     RText(line).c(RAction.suggest_command, prefix.group()))
             else:
                 lst.append(line)
     return lst
示例#12
0
	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
示例#13
0
    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())
示例#14
0
 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 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 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))
示例#17
0
	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 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: Optional[str]):
     if player is None:
         level = source.get_permission_level()
         source.reply(
             self.tr('mcdr_command.query_player_permission.self',
                     PermissionLevel.from_value(level)))
     else:
         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))
示例#20
0
	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 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)
示例#23
0
 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))
示例#25
0
 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))
示例#26
0
    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 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 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)