def main(argv=sys.argv, in_stream=sys.stdin, out_stream=sys.stdout): "Set up a session and run Curveship's main loop." return_code = 0 try: out_streams = Multistream([out_stream]) opts, args = parse_command_line(argv) out_streams = start_log(out_streams) world, discourse = initialize(args[0], args[1:], out_streams) discourse.debug = opts.debug if opts.autofile is not None: auto = open(opts.autofile, "r+") discourse.initial_inputs = auto.readlines() auto.close() if len(world.act) > 0: _, id_list, world = simulator(None, world, discourse.spin["commanded"], world.act.values()) focal_concept = world.concept[discourse.spin["focalizer"]] reply_text, discourse = teller(id_list, focal_concept, discourse) presenter.present(reply_text, out_streams) while world.running: previous_time = time.time() world, discourse = each_turn(world, discourse, in_stream, out_streams) out_streams.log.write("#" + str(time.time() - previous_time)) except joker.StartupError, err: presenter.present(err.msg, Multistream([sys.stderr])) return_code = 2
def handle_input(user_input, world, discourse, in_stream, out_streams): """Deal with input obtained, sending it to the appropriate module. The commanded character's concept is used when trying to recognize commands.""" c_concept = world.concept[discourse.spin["commanded"]] user_input = recognizer.recognize(user_input, discourse, c_concept) if user_input.unrecognized: user_input = clarifier.clarify(user_input, c_concept, discourse, in_stream, out_streams) if user_input.command: user_input, id_list, world = simulator(user_input, world, discourse.spin["commanded"]) if hasattr(world.item["@cosmos"], "update_spin"): discourse.spin = world.item["@cosmos"].update_spin(world, discourse) spin = discourse.spin if hasattr(world.item["@cosmos"], "use_spin"): spin = world.item["@cosmos"].use_spin(world, discourse.spin) f_concept = world.concept[spin["focalizer"]] tale, discourse = teller(id_list, f_concept, discourse) presenter.present(tale, out_streams) elif user_input.directive: texts, world, discourse = joker.joke(user_input.normal, world, discourse) for text in texts: if text is not None: presenter.present(text, out_streams) discourse.input_list.update(user_input) return (user_input, world, discourse)
def handle_input(user_input, world, discourse, in_stream, out_streams): """Deal with input obtained, sending it to the appropriate module. The commanded character's concept is used when trying to recognize commands.""" c_concept = world.concept[discourse.spin['commanded']] user_input = recognizer.recognize(user_input, discourse, c_concept) if user_input.unrecognized: user_input = clarifier.clarify(user_input, c_concept, discourse, in_stream, out_streams) if user_input.command: user_input, id_list, world = simulator(user_input, world, discourse.spin['commanded']) if hasattr(world.item['@cosmos'], 'update_spin'): discourse.spin = world.item['@cosmos'].update_spin( world, discourse) spin = discourse.spin if hasattr(world.item['@cosmos'], 'use_spin'): spin = world.item['@cosmos'].use_spin(world, discourse.spin) f_concept = world.concept[spin['focalizer']] tale, discourse = teller(id_list, f_concept, discourse) presenter.present(tale, out_streams) elif user_input.directive: texts, world, discourse = joker.joke(user_input.normal, world, discourse) for text in texts: if text is not None: presenter.present(text, out_streams) discourse.input_list.update(user_input) return (user_input, world, discourse)
def main(argv=sys.argv, in_stream=sys.stdin, out_stream=sys.stdout): "Set up a session and run Curveship's main loop." return_code = 0 try: out_streams = Multistream([out_stream]) opts, args = parse_command_line(argv) out_streams = start_log(out_streams) world, discourse = initialize(args[0], args[1:], out_streams) discourse.debug = opts.debug if opts.autofile is not None: auto = open(opts.autofile, 'r+') discourse.initial_inputs = auto.readlines() auto.close() if len(world.act) > 0: _, id_list, world = simulator(None, world, discourse.spin['commanded'], world.act.values()) focal_concept = world.concept[discourse.spin['focalizer']] reply_text, discourse = teller(id_list, focal_concept, discourse) presenter.present(reply_text, out_streams) while world.running: previous_time = time.time() world, discourse = each_turn(world, discourse, in_stream, out_streams) out_streams.log.write('#' + str(time.time() - previous_time)) except joker.StartupError, err: presenter.present(err.msg, Multistream([sys.stderr])) return_code = 2
def each_turn(world, discourse, in_stream, out_streams): 'Obtain and processes input, if the session is interactive.' if discourse.spin['commanded'] is None: if hasattr(world.item['@cosmos'], 'interval'): world.item['@cosmos'].interval() _, id_list, world = simulator(None, world, discourse.spin['commanded']) focal_concept = world.concept[discourse.spin['focalizer']] reply_text, discourse = teller(id_list, focal_concept, discourse) presenter.present(reply_text, out_streams) else: if (hasattr(discourse, 'initial_inputs') and len(discourse.initial_inputs) > 0): input_string = discourse.initial_inputs.pop(0) user_input = preparer.tokenize(input_string, discourse.separator) presenter.present('[> ' + input_string, out_streams, '', '') else: user_input = preparer.prepare(discourse.separator, discourse.typo.prompt, in_stream, out_streams) # After each input, present a newline all by itself. presenter.present('\n', out_streams, '', '') while len(user_input.tokens) > 0 and world.running: (user_input, world, discourse) = handle_input(user_input, world, discourse, in_stream, out_streams) presenter.present(discourse.input_list.show(1), out_streams.log) return (world, discourse)
def initialize(if_file, spin_files, out_streams): "Load all files and present the header and prologue." for startup_string in joker.session_startup(__version__): presenter.center(startup_string, out_streams) fiction = joker.load_fiction(if_file, ["discourse", "items"], discourse_model.FICTION_DEFAULTS) presenter.center("fiction: " + if_file, out_streams) world = world_model.World(fiction) world.set_concepts(fiction.concepts) for i in dir(fiction): if i[:8] == "COMMAND_": setattr(command_map, i.partition("_")[2], getattr(fiction, i)) delattr(fiction, i) for (key, value) in discourse_model.SPIN_DEFAULTS.items(): if key not in fiction.discourse["spin"]: fiction.discourse["spin"][key] = value while len(spin_files) > 0: next_file = spin_files.pop(0) new_spin = joker.load_spin(fiction.discourse["spin"], next_file) fiction.discourse["spin"].update(new_spin) presenter.center("spin: " + next_file, out_streams) presenter.present("\n", out_streams) presenter.present("", out_streams) discourse = discourse_model.Discourse(fiction.discourse) reply = joker.show_frontmatter(discourse) if "prologue" in discourse.metadata: reply += "\n\n" + joker.show_prologue(discourse.metadata) presenter.present(reply, out_streams) return (world, discourse)
def initialize(if_file, spin_files, out_streams): 'Load all files and present the header and prologue.' for startup_string in joker.session_startup(__version__): presenter.center(startup_string, out_streams) fiction = joker.load_fiction(if_file, ['discourse', 'items'], discourse_model.FICTION_DEFAULTS) presenter.center('fiction: ' + if_file, out_streams) world = world_model.World(fiction) world.set_concepts(fiction.concepts) for i in dir(fiction): if i[:8] == 'COMMAND_': setattr(command_map, i.partition('_')[2], getattr(fiction, i)) delattr(fiction, i) for (key, value) in discourse_model.SPIN_DEFAULTS.items(): if key not in fiction.discourse['spin']: fiction.discourse['spin'][key] = value while len(spin_files) > 0: next_file = spin_files.pop(0) new_spin = joker.load_spin(fiction.discourse['spin'], next_file) fiction.discourse['spin'].update(new_spin) presenter.center('spin: ' + next_file, out_streams) presenter.present('\n', out_streams) presenter.present('', out_streams) discourse = discourse_model.Discourse(fiction.discourse) reply = joker.show_frontmatter(discourse) if 'prologue' in discourse.metadata: reply += '\n\n' + joker.show_prologue(discourse.metadata) presenter.present(reply, out_streams) return (world, discourse)
def each_turn(world, discourse, in_stream, out_streams): "Obtain and processes input, if the session is interactive." if discourse.spin["commanded"] is None: if hasattr(world.item["@cosmos"], "interval"): world.item["@cosmos"].interval() _, id_list, world = simulator(None, world, discourse.spin["commanded"]) focal_concept = world.concept[discourse.spin["focalizer"]] reply_text, discourse = teller(id_list, focal_concept, discourse) presenter.present(reply_text, out_streams) else: if hasattr(discourse, "initial_inputs") and len(discourse.initial_inputs) > 0: input_string = discourse.initial_inputs.pop(0) user_input = preparer.tokenize(input_string, discourse.separator) presenter.present("[> " + input_string, out_streams, "", "") else: user_input = preparer.prepare(discourse.separator, discourse.typo.prompt, in_stream, out_streams) # After each input, present a newline all by itself. presenter.present("\n", out_streams, "", "") while len(user_input.tokens) > 0 and world.running: (user_input, world, discourse) = handle_input(user_input, world, discourse, in_stream, out_streams) presenter.present(discourse.input_list.show(1), out_streams.log) return (world, discourse)
if len(log_files) == 0: latest = 0 else: latest = max([int(log_file) for log_file in log_files]) log_file = "logs/" + str(latest + 1) + ".log" try: log = file(log_file, "w") except IOError, err: msg = 'Unable to open log file "' + log_file + '" for ' + "writing due to this error: " + str(err) raise joker.StartupError(msg) # So that we output to the screen and the log file: out_streams.streams.append(log) # And indicate that this stream is the log file: out_streams.log = log presenter.present( "\nLogged to: " + log_file + "\nSession started " + time.strftime("%Y-%m-%d %H:%M:%S"), out_streams ) return out_streams def initialize(if_file, spin_files, out_streams): "Load all files and present the header and prologue." for startup_string in joker.session_startup(__version__): presenter.center(startup_string, out_streams) fiction = joker.load_fiction(if_file, ["discourse", "items"], discourse_model.FICTION_DEFAULTS) presenter.center("fiction: " + if_file, out_streams) world = world_model.World(fiction) world.set_concepts(fiction.concepts) for i in dir(fiction): if i[:8] == "COMMAND_": setattr(command_map, i.partition("_")[2], getattr(fiction, i))
latest = 0 else: latest = max([int(log_file) for log_file in log_files]) log_file = 'logs/' + str(latest + 1) + '.log' try: log = file(log_file, 'w') except IOError, err: msg = ('Unable to open log file "' + log_file + '" for ' + 'writing due to this error: ' + str(err)) raise joker.StartupError(msg) # So that we output to the screen and the log file: out_streams.streams.append(log) # And indicate that this stream is the log file: out_streams.log = log presenter.present( '\nLogged to: ' + log_file + '\nSession started ' + time.strftime("%Y-%m-%d %H:%M:%S"), out_streams) return out_streams def initialize(if_file, spin_files, out_streams): 'Load all files and present the header and prologue.' for startup_string in joker.session_startup(__version__): presenter.center(startup_string, out_streams) fiction = joker.load_fiction(if_file, ['discourse', 'items'], discourse_model.FICTION_DEFAULTS) presenter.center('fiction: ' + if_file, out_streams) world = world_model.World(fiction) world.set_concepts(fiction.concepts) for i in dir(fiction): if i[:8] == 'COMMAND_':
if len(log_files) == 0: latest = 0 else: latest = max([int(log_file) for log_file in log_files]) log_file = 'logs/' + str(latest + 1) + '.log' try: log = file(log_file, 'w') except IOError, err: msg = ('Unable to open log file "' + log_file + '" for ' + 'writing due to this error: ' + str(err)) raise joker.StartupError(msg) # So that we output to the screen and the log file: out_streams.streams.append(log) # And indicate that this stream is the log file: out_streams.log = log presenter.present('\nLogged to: ' + log_file + '\nSession started ' + time.strftime("%Y-%m-%d %H:%M:%S"), out_streams) return out_streams def initialize(if_file, spin_files, out_streams): 'Load all files and present the header and prologue.' for startup_string in joker.session_startup(__version__): presenter.center(startup_string, out_streams) fiction = joker.load_fiction(if_file, ['discourse', 'items'], discourse_model.FICTION_DEFAULTS) presenter.center('fiction: ' + if_file, out_streams) world = world_model.World(fiction) world.set_concepts(fiction.concepts) for i in dir(fiction): if i[:8] == 'COMMAND_': setattr(command_map, i.partition('_')[2], getattr(fiction, i))