import time
+def strong_write(file, string):
+ """Apply write(string), flush() and os.fsync() to file."""
+ file.write(string)
+ file.flush()
+ os.fsync(file)
+
+
def setup_server_io():
"""Fill IO files DB with proper file( path)s. Write process IO test string.
io_db["teststring"] = str(os.getpid()) + " " + str(time.time())
os.makedirs(io_db["path_server"], exist_ok=True)
io_db["file_out"] = open(io_db["path_out"], "w")
- io_db["file_out"].write(io_db["teststring"] + "\n")
- io_db["file_out"].flush()
+ strong_write(io_db["file_out"], io_db["teststring"] + "\n")
if os.access(io_db["path_in"], os.F_OK):
os.remove(io_db["path_in"])
io_db["file_in"] = open(io_db["path_in"], "w")
if len(tokens) > 0 and tokens[0] in commands_db \
and len(tokens) == commands_db[tokens[0]][0] + 1:
if commands_db[tokens[0]][1]:
- commands_db[tokens[0]][2]()
+ commands_db[tokens[0]][2](*tokens[1:])
elif replay:
print("Due to replay mode, reading command as 'go on in record'.")
line = io_db["file_record"].readline()
if os.access(path, os.F_OK):
shutil.copyfile(path, path_tmp)
file = open(path_tmp, mode)
- file.write(text)
- file.flush()
- os.fsync(file.fileno())
+ strong_write(file, text)
file.close()
if os.access(path, os.F_OK):
os.remove(path)
string = string + line + "\n"
# TODO: no proper user-subjective map
atomic_write(io_db["path_worldstate"], string)
- atomic_write(io_db["path_out"], "WORLD_UPDATED\n", do_append=True)
+ strong_write(io_db["file_out"], "WORLD_UPDATED\n")
io_db["worldstate_updateable"] = False
def command_ping():
"""Send PONG line to server output file."""
- io_db["file_out"].write("PONG\n")
- io_db["file_out"].flush()
+ strong_write(io_db["file_out"], "PONG\n")
def command_quit():
raise SystemExit("received QUIT command")
+def command_thingshere(y, x):
+ # DUMMY
+ print("Ignoring not-yet implemented THINGS_HERE command.")
+
+
def command_seedmap(seed_string):
"""Set world_db["SEED_MAP"] to int(seed_string), then (re-)make map."""
setter(None, "SEED_MAP", 0, 4294967295)(seed_string)
}
# generate fov map?
# TODO: Generate things (player first, with updated memory)
- atomic_write(io_db["path_out"], "NEW_WORLD\n", do_append=True)
+ strong_write(io_db["file_out"], "NEW_WORLD\n")
def command_maplength(maplength_string):
commands_db = {
"QUIT": (0, True, command_quit),
"PING": (0, True, command_ping),
+ "THINGS_HERE": (2, True, command_thingshere),
"MAKE_WORLD": (1, False, command_makeworld),
"SEED_MAP": (1, False, command_seedmap),
"SEED_RANDOMNESS": (1, False, setter(None, "SEED_RANDOMNESS",