1414logging .basicConfig (level = logging .INFO )
1515
1616AUTOSAVE_SECONDS = 60
17+ TICK_SECONDS = 5
1718
1819
19- def autosave ( database : Database , adapter : WorldAdapter ):
20- # ponytail: a plain timer loop, so a crash loses at most AUTOSAVE_SECONDS of play. Save on each mutating
21- # command instead if that ever costs someone a real purchase .
20+ def every ( seconds : float , action , name : str ):
21+ # ponytail: a plain timer loop, so a crash loses at most AUTOSAVE_SECONDS of play, and ticks
22+ # drift by however long the action took. Both fine at these intervals .
2223 while True :
23- time .sleep (AUTOSAVE_SECONDS )
24+ time .sleep (seconds )
2425 try :
25- database . save ( adapter )
26+ action ( )
2627 except Exception :
27- LOG .exception ("Autosave failed" )
28+ LOG .exception ("%s failed" , name )
2829
2930
3031def main ():
@@ -50,7 +51,16 @@ def main():
5051 display = WindowRenderer (adapter )
5152
5253 threading .Thread (target = update_display , args = (display , args .show_window ), daemon = True ).start ()
53- threading .Thread (target = autosave , args = (database , adapter ), daemon = True ).start ()
54+ threading .Thread (
55+ target = every ,
56+ args = (AUTOSAVE_SECONDS , lambda : database .save (adapter ), "Autosave" ),
57+ daemon = True ,
58+ ).start ()
59+ threading .Thread (
60+ target = every ,
61+ args = (TICK_SECONDS , adapter .world .tick , "World tick" ),
62+ daemon = True ,
63+ ).start ()
5464 discord_interface = DiscordInterface (adapter )
5565 # discord_interface.bot.loop.create_task(update_display(display))
5666 # threading.Thread(target=discord_interface.bot.run, args=(ConfigParser.DISCORD_TOKEN,), daemon=True).start()
0 commit comments