+ return opts
+
+
+def server_test():
+ """Ensure valid server out file belonging to current process.
+
+ On failure, set io_db["kicked_by_rival"] and raise SystemExit.
+ """
+ if not os.access(io_db["path_out"], os.F_OK):
+ raise SystemExit("Server output file has disappeared.")
+ file = open(io_db["path_out"], "r")
+ test = file.readline().rstrip("\n")
+ file.close()
+ if test != io_db["teststring"]:
+ io_db["kicked_by_rival"] = True
+ msg = "Server test string in server output file does not match. This" \
+ " indicates that the current server process has been " \
+ "superseded by another one."
+ raise SystemExit(msg)
+
+
+def read_command():
+ """Return next newline-delimited command from server in file.
+
+ Keep building return string until a newline is encountered. Pause between
+ unsuccessful reads, and after too much waiting, run server_test().
+ """
+ wait_on_fail = 1
+ max_wait = 5
+ now = time.time()
+ command = ""
+ while 1:
+ add = io_db["file_in"].readline()
+ if len(add) > 0:
+ command = command + add
+ if len(command) > 0 and "\n" == command[-1]:
+ command = command[:-1]
+ break
+ else:
+ time.sleep(wait_on_fail)
+ if now + max_wait < time.time():
+ server_test()
+ now = time.time()
+ return command
+
+
+def command_makeworld():
+ """Mere dummy so far."""
+ print("I would build a whole world now if only I knew how.")
+
+
+def command_ping():
+ """Send PONG line to server output file."""
+ io_db["file_out"].write("PONG\n")
+ io_db["file_out"].flush()
+
+
+def command_quit():
+ """Abort server process."""
+ raise SystemExit("received QUIT command")
+
+
+"""Commands database.
+
+Map command start tokens to ([0]) minimum number of expected command arguments,
+([1]) the command's meta-ness (i.e. is it to be written to the record file, is
+it to be ignored in replay mode if read from server input file), and ([2]) a
+function to be called on it.
+"""
+commands_db = {
+ "QUIT": (0, True, command_quit),
+ "PING": (0, True, command_ping),
+ "MAKE_WORLD": (1, False, command_makeworld)
+}
+
+io_db = {}
+world_db = {}
+try:
+ opts = parse_command_line_arguments()
+ setup_server_io()