import abc from .errors import VMCMDErrors from .meta import action_prop class ICommand(abc.ABC): """ Command Base Class """ def __init__(self, remote): self._remote = remote def setter(self, param, val): """ Sends a string request RT packet. """ self._remote.set_rt(f'{self.identifier}', param, val) @abc.abstractmethod def identifier(self): pass class Command(ICommand): """ Command Concrete Class """ @classmethod def make(cls, remote): """ Factory function for command class. Returns a Command class of a kind. """ CMD_cls = type(f'Command{remote.kind.name}', (cls,), { **{param: action_prop(param) for param in ['show', 'shutdown', 'restart']}, 'hide': action_prop('show', val=0), }) return CMD_cls(remote) @property def identifier(self) -> str: return 'Command' def set_showvbanchat(self, val: bool): if not isinstance(val, bool) and val not in (0,1): raise VMCMDErrors('showvbanchat is a boolean parameter') self.setter('DialogShow.VBANCHAT', 1 if val else 0) showvbanchat = property(fset=set_showvbanchat) def set_lock(self, val: bool): if not isinstance(val, bool) and val not in (0,1): raise VMCMDErrors('lock is a boolean parameter') self.setter('lock', 1 if val else 0) lock = property(fset=set_lock)