Исходный код commands

# -*- coding: utf-8 -*-
# @Author: Max ST
# @Date:   2019-04-04 22:05:30
# @Last Modified by:   MaxST
# @Last Modified time: 2019-08-08 23:23:54
import logging
import time
from collections import OrderedDict

from tabulate import tabulate

from jim_mes import Message

logger = logging.getLogger('commands')


[документация]class Comander(object): """Основной командир, распределяет команды. Attributes: commands: Хранилище команд """ def __init__(self, *args, **kwargs): """Инициализация.""" super().__init__() self.commands = {}
[документация] def run(self, name_cmd, *args, **kwargs): """Основной цикл запуска команд. Args: serv: экземпляр класса :py:class:`~core.Server` request: экземпляр класса :py:class:`~jim_mes.Message` *args: дополнительные параметры для команды **kwargs: дополнительные параметры для команды Returns: Возвращаем ответ команды bool """ response = None cmd = self.commands.get(name_cmd, None) if cmd: logger.debug(f'I found command {cmd}') response = cmd(*args, **kwargs).execute(*args, **kwargs) elif name_cmd == 'help': response = self.print_help() return response
[документация] def reg_cmd(self, command, name=None): """Регистрация команды. Регистрирует команду по переданному имени или атрибуту name Args: command: класс команды унаследованный от :py:class:`~AbstractCommand` name: имя для регистрации (default: {None}) Raises: ValueError: Если имя для регистрации уже занято """ name = getattr(command, 'name', None) if not name else name if name in self.commands: raise ValueError(f'Name exists {name}') self.commands[name] = command
[документация] def unreg_cmd(self, command): """Отмена регистрации команды. Args: command: имя команды для удаления """ if command in self.commands: del self.commands[command]
[документация] def print_help(self): """Функция выводящия справку по использованию.""" print('Поддерживаемые команды:') sort_dict = OrderedDict(sorted(self.commands.items())) print(tabulate(((k, v.__doc__) for k, v in sort_dict.items()))) print('help - Вывести подсказки по командам') return True
[документация]class AbstractCommand(object): """Абстрактный класс команды.""" def __init__(self, *args, **kwargs): """Инициализация.""" super().__init__()
[документация] def execute(self, message, **kwargs): """Выполнение.""" pass
[документация]class ExitCommand(AbstractCommand): """Выход пользователя. Attributes: name: имя команды """ name = 'exit'
[документация] def execute(self, client, *args, **kwargs): """Выполнение.""" client.send_message(Message.exit_request()) print('Завершение соединения.') logger.info('Завершение работы по команде пользователя.') # Задержка неоходима, чтобы успело уйти сообщение о выходе time.sleep(0.5) exit(0)
main_commands = Comander() main_commands.reg_cmd(ExitCommand)