Source code for core.command
# ../core/command/__init__.py
"""Registers the "sp" server command and all of its sub-commands."""
# =============================================================================
# >> IMPORTS
# =============================================================================
# Python Imports
# Datetime
from datetime import datetime
# Platform
import platform
# Site-Package Imports
# Configobj
from configobj import ConfigObj
# Source.Python Imports
# Commands
from commands.typed import TypedServerCommand
# Core
from core import create_checksum
from core import SOURCE_ENGINE_BRANCH
from core.logger import core_logger
from core.update import do_full_update
from core.version import get_last_successful_build_number
from core.version import is_unversioned
from core.version import VERSION
from core.version import GIT_COMMIT
# Engines
from engines.server import execute_server_command
from engines.server import queue_command_string
# Paths
from paths import SP_DATA_PATH
# Plugins
from plugins import _plugin_strings
from plugins.command import SubCommandManager
from plugins.manager import plugin_manager
from plugins.manager import server_plugin_manager
# Tick
from listeners.tick import Delay
# =============================================================================
# >> ALL DECLARATION
# =============================================================================
__all__ = ('CoreCommandManager',
'core_command',
)
# =============================================================================
# >> GLOBAL VARIABLES
# =============================================================================
# Get the sp.core.command logger
core_command_logger = core_logger.command
# =============================================================================
# >> CLASSES
# =============================================================================
[docs]class CoreCommandManager(SubCommandManager):
"""Class used for executing "sp" sub-command functionality."""
[docs] def print_credits(self):
"""List all credits for Source.Python."""
# Get header messages
message = _plugin_strings[
'Credits'].get_string() + '\n' + '=' * 61 + '\n\n'
# Get the credits information
groups = ConfigObj(
SP_DATA_PATH / 'credits.ini', encoding='unicode_escape')
# Loop through all groups in the credits
for group in groups:
# Add the current group's name
message += '\t' + group + ':\n'
# Loop through all names in the current group
for name in groups[group]:
# Add the current name
message += '\t\t' + name + ' ' * (
20 - len(name)) + groups[group][name] + '\n'
# Add 1 blank line between groups
message += '\n'
# Print the message
self.log_message(message + '=' * 61 + '\n\n')
core_command = CoreCommandManager(
plugin_manager, 'sp', logger=core_command_logger)
# =============================================================================
# >> sp
# =============================================================================
@core_command.server_sub_command(['delay'])
def _sp_delay(command_info, delay:float, command, *args):
"""Execute a command after a given delay."""
Delay(delay, queue_command_string, (command + ' ' + ' '.join(args), ))
@core_command.server_sub_command(['credits'])
def _sp_credits(command_info):
"""List all credits for Source.Python."""
core_command.print_credits()
@core_command.server_sub_command(['help'])
def _sp_help(command_info, command=None, *server_sub_commands):
"""Print all sp sub-commands or help for a specific command."""
if command is None:
execute_server_command('sp')
return
commands = (command,) + server_sub_commands
try:
node = TypedServerCommand.parser.get_node(commands)
except ValueError:
core_command_logger.log_message(
'Command "{}" does not exist.'.format(' '.join(commands)))
return
core_command_logger.log_message(node.signature)
if node.description is not None:
core_command_logger.log_message(' ' + node.description)
@core_command.server_sub_command(['info'])
def print_info(info):
"""Print information about OS, SP and installed plugins."""
result = '\nDate : {}'.format(datetime.utcnow())
result += '\nOS : {}'.format(platform.platform())
result += '\nGame : {}'.format(SOURCE_ENGINE_BRANCH)
result += '\nSP version : {}'.format(VERSION)
result += '\nGithub commit : {}'.format(GIT_COMMIT)
result += '\nServer plugins:'
for index, plugin in enumerate(server_plugin_manager.loaded_plugins):
result += '\n {:02d}: {}'.format(index, plugin.name)
result += '\nSP plugins:'
for index, plugin in enumerate(plugin_manager.loaded_plugins):
result += '\n {:02d}: {}'.format(index, plugin.name)
info = plugin.info
if info.version != 'unversioned':
result += ', {}'.format(info.version)
if info.url is not None:
result += ', {}'.format(info.url)
# Create a checksum for all the the essential information (from 'Date' to
# the last SP plugin)
checksum = create_checksum(result)
sep = '-' * 56
core_command_logger.log_message(
f'\nIMPORTANT: Please copy the full output.\n{sep}\n'
f'Checksum : {checksum}{result}\n{sep}\n')
@core_command.server_sub_command(['update'])
def update_sp(info):
"""Update Source.Python to the latest version. A restart of the server is
required.
"""
if not is_unversioned() and VERSION >= get_last_successful_build_number():
core_command_logger.log_message('No new version available.')
return
do_full_update()
# =============================================================================
# >> DESCRIPTION
# =============================================================================
TypedServerCommand.parser.set_node_description(
'sp', 'Source.Python main command.')