def _progressive_cmd_run(cmd, generator, response=None): """ Progressively call the command that was given in argument. Used when `yield` is present in the Command's `func()` method. Args: cmd (Command): the command itself. generator (GeneratorType): the generator describing the processing. reponse (str, optional): the response to send to the generator. Raises: ValueError: If the func call yields something not identifiable as a time-delay or a string prompt. Note: This function is responsible for executing the command, if the func() method contains 'yield' instructions. The yielded value will be accessible at each step and will affect the process. If the value is a number, just delay the execution of the command. If it's a string, wait for the user input. """ global _GET_INPUT if not _GET_INPUT: from evennia.utils.evmenu import get_input as _GET_INPUT try: if response is None: value = next(generator) else: value = generator.send(response) except StopIteration: # duplicated from cmdhandler._run_command, to have these # run in the right order while staying inside the deferred cmd.at_post_cmd() if cmd.save_for_next: # store a reference to this command, possibly # accessible by the next command. cmd.caller.ndb.last_cmd = copy(cmd) else: cmd.caller.ndb.last_cmd = None else: if isinstance(value, (int, float)): utils.delay(value, _progressive_cmd_run, cmd, generator) elif isinstance(value, str): _GET_INPUT(cmd.caller, value, _process_input, cmd=cmd, generator=generator) else: raise ValueError( "unknown type for a yielded value in command: {}".format( type(value)))
def _progressive_cmd_run(cmd, generator, response=None): """ Progressively call the command that was given in argument. Used when `yield` is present in the Command's `func()` method. Args: cmd (Command): the command itself. generator (GeneratorType): the generator describing the processing. reponse (str, optional): the response to send to the generator. Raises: ValueError: If the func call yields something not identifiable as a time-delay or a string prompt. Note: This function is responsible for executing the command, if the func() method contains 'yield' instructions. The yielded value will be accessible at each step and will affect the process. If the value is a number, just delay the execution of the command. If it's a string, wait for the user input. """ global _GET_INPUT if not _GET_INPUT: from evennia.utils.evmenu import get_input as _GET_INPUT try: if response is None: value = generator.next() else: value = generator.send(response) except StopIteration: pass else: if isinstance(value, (int, float)): utils.delay(value, _progressive_cmd_run, cmd, generator) elif isinstance(value, basestring): _GET_INPUT(cmd.caller, value, _process_input, cmd=cmd, generator=generator) else: raise ValueError("unknown type for a yielded value in command: {}".format(type(value)))