Break timer update function into three functions to reduce load

By breaking up the timers into their own functions they are now capable of
running more intelligently using the difference between the current time
and expiration time for API polling rates. Polling attempts are skewed by
two minutes to attempt to prevent negative timedeltas. These are handled
on the off chance they are negative but it would be best to avoid negative
timedeltas in general.

Additional changes include more documentation, todos, and the removal/
addition of debug text.
This commit is contained in:
雲華
2021-05-02 02:41:43 -04:00
parent c3a5f10b82
commit 0040b508f1

View File

@@ -5,6 +5,8 @@ import warframe_api as warpy
import win32gui
import win32api
import win32con
import math
from datetime import datetime
from ctypes import windll
GWL_EXSTYLE = -20
@@ -85,43 +87,85 @@ else:
root.geometry('%dx%d+%d+%d' % (width, height, x_pos + X_POS_WIN_OFFSET, y_pos + Y_POS_WIN_OFFSET))
print("Windowed")
timers = tk.Frame(master=root, bg="#FFFFFF", width=340, height=160, cursor="none")
timers = tk.Frame(master=root, width=340, height=160, cursor="none")
loop = asyncio.get_event_loop()
warframe = warpy.WarframeAPI("pc", loop=loop)
# TIMERS
timers.grid(row=0, column=0)
tk.Label(timers, text="Cetus", fg="#FFFFFF").grid(row=0, column=0)
tk.Label(timers, text="Deimos", fg="#FFFFFF").grid(row=0, column=2)
tk.Label(timers, text="Vallis", fg="#FFFFFF").grid(row=0, column=4)
cetus_timer = tk.Label(timers)
vallis_timer = tk.Label(timers)
cambion_timer = tk.Label(timers)
cetus_timer.grid(row=0, column=1)
cambion_timer.grid(row=0, column=3)
vallis_timer.grid(row=0, column=5)
cetus_timer_svar = tk.StringVar(timers)
vallis_timer_svar = tk.StringVar(timers)
cambion_timer_svar = tk.StringVar(timers)
cetus_timer_label = tk.Label(timers, textvariable=cetus_timer_svar)
vallis_timer_label = tk.Label(timers, textvariable=vallis_timer_svar)
cambion_timer_label = tk.Label(timers, textvariable=cambion_timer_svar)
cetus_timer_label.grid(row=0, column=1)
cambion_timer_label.grid(row=0, column=3)
vallis_timer_label.grid(row=0, column=5)
async def current_cycles():
print("Running...")
# Asynchronous functions
# TODO: See if there is a way to decorate these methods and reduce some duplicate code
# Timers
# Following methods are using an additional 120000 ms (2m) to attempt to avoid polling the API before expiration
# update which would result in a negative timedelta
async def get_cetus_cycle():
cetus_status = await warframe.cetus_status()
vallis_status = await warframe.vallis_status()
cambion_status = await warframe.cambion_status()
expiration = datetime.strptime(cetus_status["expiry"], "%Y-%m-%dT%H:%M:%S.%fZ")
if cetus_status["isDay"]:
cetus_timer.config(text="Day")
cetus_timer_svar.set("Day")
else:
cetus_timer.config(text="Night")
cetus_timer_svar.set("Night")
remaining_time = expiration - datetime.utcnow()
if remaining_time.total_seconds() < 0:
retry = 120000
else:
retry = remaining_time.total_seconds() * 1000.0 + 120000
print("Next Cetus cycle retry in: " + str(remaining_time))
root.after(math.ceil(retry), lambda: loop.run_until_complete(get_cetus_cycle()))
async def get_vallis_cycle():
vallis_status = await warframe.vallis_status()
expiration = datetime.strptime(vallis_status["expiry"], "%Y-%m-%dT%H:%M:%S.%fZ")
if vallis_status["isWarm"]:
vallis_timer.config(text="Warm")
vallis_timer_svar.set("Warm")
else:
vallis_timer.config(text="Cold")
cambion_timer.config(text=cambion_status["active"].capitalize())
root.after(300000, current_cycles)
vallis_timer_svar.set("Cold")
remaining_time = expiration - datetime.utcnow()
if remaining_time.total_seconds() < 0:
retry = 120000
else:
retry = remaining_time.total_seconds() * 1000.0 + 120000
print("Next Vallis cycle retry in: " + str(remaining_time))
root.after(math.ceil(retry), lambda: loop.run_until_complete(get_vallis_cycle()))
loop.run_until_complete(current_cycles())
async def get_cambion_cycle():
cambion_status = await warframe.cambion_status()
expiration = datetime.strptime(cambion_status["expiry"], "%Y-%m-%dT%H:%M:%S.%fZ")
cambion_timer_svar.set(cambion_status["active"].capitalize())
remaining_time = expiration - datetime.utcnow()
if remaining_time.total_seconds() < 0:
retry = 120000
else:
retry = remaining_time.total_seconds() * 1000.0 + 120000
print("Next Cambion cycle retry in: " + str(remaining_time))
root.after(math.ceil(retry), lambda: loop.run_until_complete(get_cambion_cycle()))
loop.run_until_complete(get_cetus_cycle())
loop.run_until_complete(get_vallis_cycle())
loop.run_until_complete(get_cambion_cycle())
root.mainloop()