diff --git a/server/fishtest/actiondb.py b/server/fishtest/actiondb.py index 125459930..ad033f505 100644 --- a/server/fishtest/actiondb.py +++ b/server/fishtest/actiondb.py @@ -267,7 +267,7 @@ def insert_action(self, **action): action["run_id"] = str(action["run_id"]) ret = validate(schema, action, "action", strict=True) if ret == "": - action["time"] = datetime.utcnow().replace(tzinfo=timezone.utc).timestamp() + action["time"] = datetime.now(timezone.utc).timestamp() self.actions.insert_one(action) else: raise Exception("Validation failed with error '{}'".format(ret)) diff --git a/server/fishtest/api.py b/server/fishtest/api.py index 8d2f1e4de..e7e518094 100644 --- a/server/fishtest/api.py +++ b/server/fishtest/api.py @@ -1,6 +1,6 @@ import base64 import copy -from datetime import datetime +from datetime import datetime, timezone from fishtest.stats.stat_util import SPRT_elo from fishtest.util import optional_key, union, validate, worker_name @@ -25,7 +25,7 @@ on how frequently the main instance flushes its run cache. """ -WORKER_VERSION = 212 +WORKER_VERSION = 213 def validate_request(request): @@ -126,7 +126,7 @@ def handle_error(self, error, exception=HTTPBadRequest): raise exception(self.add_time({"error": error})) def validate_username_password(self, api): - self.__t0 = datetime.utcnow() + self.__t0 = datetime.now(timezone.utc) self.__api = api # is the request valid json? try: @@ -191,7 +191,7 @@ def validate_request(self, api): self.__task = task def add_time(self, result): - result["duration"] = (datetime.utcnow() - self.__t0).total_seconds() + result["duration"] = (datetime.now(timezone.utc) - self.__t0).total_seconds() return result def get_username(self): @@ -349,7 +349,7 @@ def get_elo(self): @view_config(route_name="api_calc_elo") def calc_elo(self): - self.__t0 = datetime.utcnow() + self.__t0 = datetime.now(timezone.utc) self.__api = "/api/calc_elo" W = self.request.params.get("W") @@ -553,7 +553,7 @@ def beat(self): self.validate_request("/api/beat") run = self.run() task = self.task() - task["last_updated"] = datetime.utcnow() + task["last_updated"] = datetime.now(timezone.utc) self.request.rundb.buffer(run, False) return self.add_time({}) diff --git a/server/fishtest/rundb.py b/server/fishtest/rundb.py index 4a0ea3158..a0eb724fc 100644 --- a/server/fishtest/rundb.py +++ b/server/fishtest/rundb.py @@ -9,7 +9,7 @@ import threading import time import zlib -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone import fishtest.stats.stat_util from bson.binary import Binary @@ -35,7 +35,7 @@ DEBUG = False -boot_time = datetime.utcnow() +boot_time = datetime.now(timezone.utc) last_rundb = None @@ -140,7 +140,9 @@ def new_run( adjudication=True, ): if start_time is None: - start_time = datetime.utcnow() + start_time = datetime.now(timezone.utc) + else: + start_time = start_time.replace(tzinfo=timezone.utc) run_args = { "base_tag": base_tag, @@ -421,15 +423,18 @@ def flush_buffers(self): self.start_timer() def scavenge(self, run): - if datetime.utcnow() < boot_time + timedelta(seconds=300): + if datetime.now(timezone.utc) < boot_time + timedelta(seconds=300): return False # print("scavenge ", run["_id"]) dead_task = False - old = datetime.utcnow() - timedelta(minutes=6) + old = datetime.now(timezone.utc) - timedelta(minutes=6) task_id = -1 for task in run["tasks"]: task_id += 1 - if task["active"] and task["last_updated"] < old: + if ( + task["active"] + and task["last_updated"].replace(tzinfo=timezone.utc) < old + ): task["active"] = False dead_task = True print( @@ -468,7 +473,9 @@ def get_machines(self): machines = ( task["worker_info"] | { - "last_updated": task.get("last_updated", None), + "last_updated": task["last_updated"].replace(tzinfo=timezone.utc) + if task.get("last_updated") + else None, "run": run, "task_id": task_id, } @@ -779,11 +786,13 @@ def priority(run): # lower is better # name is already connected. my_name = "-".join(worker_name(worker_info).split("-")[0:3]) - now = datetime.utcnow() + now = datetime.now(timezone.utc) for task in active_tasks: task_name = "-".join(worker_name(task["worker_info"]).split("-")[0:3]) if my_name == task_name: - last_update = (now - task["last_updated"]).seconds + last_update = ( + now - task["last_updated"].replace(tzinfo=timezone.utc) + ).seconds # 120 = period of heartbeat in worker. if last_update <= 120: error = 'Request_task: There is already a worker running with name "{}" which sent an update {} seconds ago'.format( @@ -931,7 +940,7 @@ def priority(run): # lower is better "num_games": task_size, "active": True, "worker_info": worker_info, - "last_updated": datetime.utcnow(), + "last_updated": datetime.now(timezone.utc), "start": opening_offset, "stats": { "wins": 0, @@ -986,7 +995,9 @@ def active_run_lock(self, id): if self.purge_count > 100000: old = time.time() - 10000 self.active_runs = dict( - (k, v) for k, v in self.active_runs.items() if v["time"] >= old + (k, v) + for k, v in self.active_runs.items() + if v["time"].replace(tzinfo=timezone.utc) >= old ) self.purge_count = 0 if id in self.active_runs: @@ -1074,7 +1085,7 @@ def update_task(self, worker_info, run_id, task_id, stats, spsa): def sync_update_task(self, worker_info, run_id, task_id, stats, spsa): run = self.get_run(run_id) task = run["tasks"][task_id] - update_time = datetime.utcnow() + update_time = datetime.now(timezone.utc) error = "" @@ -1356,8 +1367,11 @@ def approve_run(self, run_id, approver): def purge_run(self, run, p=0.001, res=7.0, iters=1): # Only purge finished runs assert run["finished"] - now = datetime.utcnow() - if "start_time" not in run or (now - run["start_time"]).days > 30: + now = datetime.now(timezone.utc) + if ( + "start_time" not in run + or (now - run["start_time"].replace(tzinfo=timezone.utc)).days > 30 + ): return "Run too old to be purged" # Do not revive failed runs if run.get("failed", False): diff --git a/server/fishtest/userdb.py b/server/fishtest/userdb.py index 8638c302b..d29a66549 100644 --- a/server/fishtest/userdb.py +++ b/server/fishtest/userdb.py @@ -1,7 +1,7 @@ import sys import threading import time -from datetime import datetime +from datetime import datetime, timezone from pymongo import ASCENDING @@ -85,7 +85,7 @@ def create_user(self, username, password, email): { "username": username, "password": password, - "registration_time": datetime.utcnow(), + "registration_time": datetime.now(timezone.utc), "blocked": True, "email": email, "groups": [], diff --git a/server/fishtest/util.py b/server/fishtest/util.py index fb4159525..8679bb0f6 100644 --- a/server/fishtest/util.py +++ b/server/fishtest/util.py @@ -2,7 +2,7 @@ import math import re import smtplib -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from email.mime.text import MIMEText from functools import cache @@ -425,8 +425,9 @@ def post_in_fishcooking_results(run): def diff_date(date): - if date != datetime.min: - diff = datetime.utcnow() - date + utc_date = date.replace(tzinfo=timezone.utc) + if utc_date != datetime.min.replace(tzinfo=timezone.utc): + diff = datetime.now(timezone.utc) - utc_date else: diff = timedelta.max return diff diff --git a/server/fishtest/views.py b/server/fishtest/views.py index 4e9080254..5a0a4dc56 100644 --- a/server/fishtest/views.py +++ b/server/fishtest/views.py @@ -1,11 +1,11 @@ import copy -import datetime import hashlib import html import os import re import threading import time +from datetime import datetime, timezone import fishtest.stats.stat_util import requests @@ -543,7 +543,7 @@ def get_master_info(url): if idx == 0: message = message_lines[0].strip() date_str = commit["commit"]["committer"]["date"] - date = datetime.datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%SZ") + date = datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%SZ") if bench: return { "bench": bench.group(2), @@ -868,8 +868,8 @@ def update_nets(request, run): if not net: return if "first_test" not in net: - net["first_test"] = {"id": run_id, "date": datetime.datetime.utcnow()} - net["last_test"] = {"id": run_id, "date": datetime.datetime.utcnow()} + net["first_test"] = {"id": run_id, "date": datetime.now(timezone.utc)} + net["last_test"] = {"id": run_id, "date": datetime.now(timezone.utc)} request.rundb.update_nn(net) @@ -969,8 +969,11 @@ def tests_modify(request): run = request.rundb.get_run(request.POST["run"]) before = del_tasks(run) - now = datetime.datetime.utcnow() - if "start_time" not in run or (now - run["start_time"]).days > 30: + now = datetime.now(timezone.utc) + if ( + "start_time" not in run + or (now - run["start_time"].replace(tzinfo=timezone.utc)).days > 30 + ): request.session.flash("Run too old to be modified", "error") return HTTPFound(location=request.route_url("tests")) @@ -1325,7 +1328,9 @@ def tests_view(request): if task["active"]: active += 1 cores += task["worker_info"]["concurrency"] - last_updated = task.get("last_updated", datetime.datetime.min) + last_updated = task.get("last_updated", datetime.min).replace( + tzinfo=timezone.utc + ) task["last_updated"] = last_updated chi2 = get_chi2(run["tasks"]) diff --git a/server/tests/test_api.py b/server/tests/test_api.py index 3ac2e6775..a48ac083a 100644 --- a/server/tests/test_api.py +++ b/server/tests/test_api.py @@ -1,8 +1,8 @@ import base64 -import datetime import sys import unittest import zlib +from datetime import datetime, timezone from fishtest.api import WORKER_VERSION, ApiView from pyramid.httpexceptions import HTTPUnauthorized @@ -26,7 +26,7 @@ def new_run(self, add_tasks=0): "", username="travis", tests_repo="travis", - start_time=datetime.datetime.utcnow(), + start_time=datetime.now(timezone.utc), ) run = self.rundb.get_run(run_id) run["approved"] = True diff --git a/server/tests/test_rundb.py b/server/tests/test_rundb.py index f1cc48571..db50f4307 100644 --- a/server/tests/test_rundb.py +++ b/server/tests/test_rundb.py @@ -1,6 +1,6 @@ -import datetime import sys import unittest +from datetime import datetime, timezone import util from fishtest.api import WORKER_VERSION @@ -64,7 +64,7 @@ def test_10_create_run(self): "", username="travis", tests_repo="travis", - start_time=datetime.datetime.utcnow(), + start_time=datetime.now(timezone.utc), ) run = self.rundb.get_run(run_id_stc) run["finished"] = True @@ -92,7 +92,7 @@ def test_10_create_run(self): "", username="travis", tests_repo="travis", - start_time=datetime.datetime.utcnow(), + start_time=datetime.now(timezone.utc), ) print(" ") print(run_id) diff --git a/server/tests/test_users.py b/server/tests/test_users.py index e1f2f5265..4e039d9ac 100644 --- a/server/tests/test_users.py +++ b/server/tests/test_users.py @@ -1,5 +1,5 @@ -import datetime import unittest +from datetime import datetime, timezone import util from fishtest.views import login, signup @@ -91,7 +91,7 @@ def setUp(self): "", username="travis", tests_repo="travis", - start_time=datetime.datetime.utcnow(), + start_time=datetime.now(timezone.utc), ) self.rundb.userdb.user_cache.insert_one( {"username": "JoeUser", "cpu_hours": 12345} diff --git a/server/utils/convert_actions.py b/server/utils/convert_actions.py index f814aa1ae..2907851af 100644 --- a/server/utils/convert_actions.py +++ b/server/utils/convert_actions.py @@ -1,4 +1,4 @@ -import datetime +from datetime import datetime, timezone import pymongo from bson.objectid import ObjectId @@ -10,19 +10,17 @@ actions = actions_collection.find({}).sort("_id", 1) count = 0 print("Starting conversion...") - t0 = datetime.datetime.utcnow() + t0 = datetime.now(timezone.utc) for action in actions: count += 1 action_id = action["_id"] - if "time" in action and isinstance(action["time"], datetime.datetime): - action["time"] = ( - action["time"].replace(tzinfo=datetime.timezone.utc).timestamp() - ) + if "time" in action and isinstance(action["time"], datetime): + action["time"] = action["time"].replace(tzinfo=timezone.utc).timestamp() if "run_id" in action and isinstance(action["run_id"], ObjectId): action["run_id"] = str(action["run_id"]) actions_collection.replace_one({"_id": action_id}, action) print("Actions converted: {}.".format(count), end="\r") - t1 = datetime.datetime.utcnow() + t1 = datetime.now(timezone.utc) duration = (t1 - t0).total_seconds() time_per_run = duration / count print("") diff --git a/server/utils/delta_update_users.py b/server/utils/delta_update_users.py index 5d496741e..15bcc0e6a 100644 --- a/server/utils/delta_update_users.py +++ b/server/utils/delta_update_users.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import sys -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from fishtest.rundb import RunDb from fishtest.util import delta_date, diff_date, estimate_game_duration @@ -9,10 +9,11 @@ def initialize_info(rundb, clear_stats): + utc_datetime_min = datetime.min.replace(tzinfo=timezone.utc) info_total = {} info_top_month = {} - diff_ini = diff_date(datetime.min).total_seconds() - last_ini = delta_date(diff_date(datetime.min)) + diff_ini = diff_date(utc_datetime_min).total_seconds() + last_ini = delta_date(diff_date(utc_datetime_min)) for u in rundb.userdb.get_users(): username = u["username"] @@ -24,7 +25,7 @@ def initialize_info(rundb, clear_stats): "games_per_hour": 0.0, "tests": 0, "tests_repo": u.get("tests_repo", ""), - "last_updated": datetime.min, + "last_updated": utc_datetime_min, "diff": diff_ini, "str_last_updated": last_ini, } @@ -86,7 +87,8 @@ def process_run(run, info): info_user = info[t_username] info_user["last_updated"] = max( - info_user["last_updated"], task.get("last_updated", datetime.min) + info_user["last_updated"].replace(tzinfo=timezone.utc), + task.get("last_updated", datetime.min).replace(tzinfo=timezone.utc), ) info_user["cpu_hours"] += float( num_games * int(run["args"].get("threads", 1)) * tc / (60 * 60) @@ -102,7 +104,7 @@ def update_info(rundb, clear_stats, deltas, info_total, info_top_month): except Exception as e: print(f"Exception on unfinished run {run['_id']=} for info_top_month:\n{e}") - now = datetime.utcnow() + now = datetime.now(timezone.utc) skip = False skip_count = 0 new_deltas = {} @@ -129,7 +131,7 @@ def update_info(rundb, clear_stats, deltas, info_total, info_top_month): skip_count += 1 # Update info_top_month with finished runs having start_time in the last 30 days - if (now - run["start_time"]).days < 30: + if (now - run["start_time"].replace(tzinfo=timezone.utc)).days < 30: try: process_run(run, info_top_month) except Exception as e: @@ -145,7 +147,7 @@ def update_info(rundb, clear_stats, deltas, info_total, info_top_month): def build_users(info): users = [] - # diff_date(given_date) = datetime.utcnow() - given_date + # diff_date(given_date) = datetime.now(timezone.utc) - given_date # delta_date(diff: timedelta) -> str: for username, info_user in info.items(): try: @@ -198,18 +200,18 @@ def cleanup_users(rundb): update = True if update: rundb.userdb.save_user(u) - if "registration_time" not in u or u[ - "registration_time" - ] < datetime.utcnow() - timedelta(days=28): + if "registration_time" not in u or u["registration_time"].replace( + tzinfo=timezone.utc + ) < datetime.now(timezone.utc) - timedelta(days=28): idle[u["username"]] = u for u in rundb.userdb.user_cache.find(): if u["username"] in idle: del idle[u["username"]] for u in idle.values(): # A safe guard against deleting long time users - if "registration_time" not in u or u[ - "registration_time" - ] < datetime.utcnow() - timedelta(days=38): + if "registration_time" not in u or u["registration_time"].replace( + tzinfo=timezone.utc + ) < datetime.now(timezone.utc) - timedelta(days=38): print("Warning: Found old user to delete:", str(u["_id"])) else: print("Delete:", str(u["_id"])) @@ -238,9 +240,9 @@ def main(): # "games_per_hour": 0.0, # "tests": 0, # "tests_repo": u.get("tests_repo", ""), - # "last_updated": datetime.min, # latest datetime of all user's tasks - # "diff": diff_date(datetime.min), # used to sort in the users table - # "str_last_updated": delta_date(diff_date(datetime.min)), # e.g. "Never", "12 days ago" + # "last_updated": utc_datetime_min, # latest datetime of all user's tasks + # "diff": diff_date(utc_datetime_min), # used to sort in the users table + # "str_last_updated": delta_date(diff_date(utc_datetime_min)), # e.g. "Never", "12 days ago" # "new_deltas": dictionary with keys representing the IDs of newly finished runs # since the previous script execution. It is used to update the "deltas" collection. diff --git a/server/utils/purge_pgn.py b/server/utils/purge_pgn.py index 1a4298e99..d7d1a2146 100644 --- a/server/utils/purge_pgn.py +++ b/server/utils/purge_pgn.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 import re -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from fishtest.rundb import RunDb from pymongo import DESCENDING @@ -9,7 +9,7 @@ def purge_pgn(rundb, finished, deleted, days): kept_runs, kept_tasks, kept_pgns = 0, 0, 0 purged_runs, purged_tasks, purged_pgns = 0, 0, 0 - now = datetime.utcnow() + now = datetime.now(timezone.utc) cutoff_date_ltc = now - timedelta(days=5 * days) cutoff_date = now - timedelta(days=days) tc_regex = re.compile("^([2-9][0-9])|([1-9][0-9][0-9])") @@ -23,8 +23,8 @@ def purge_pgn(rundb, finished, deleted, days): not deleted and finished and tc_regex.match(run["args"]["tc"]) - and run["last_updated"] > cutoff_date_ltc - ) or run["last_updated"] > cutoff_date + and run["last_updated"].replace(tzinfo=timezone.utc) > cutoff_date_ltc + ) or run["last_updated"].replace(tzinfo=timezone.utc) > cutoff_date if keep: kept_runs += 1 diff --git a/server/utils/upgrade.py b/server/utils/upgrade.py index 4c2cb3141..86c8f838f 100644 --- a/server/utils/upgrade.py +++ b/server/utils/upgrade.py @@ -1,6 +1,6 @@ -import datetime import pprint import uuid +from datetime import datetime, timezone import pymongo from fishtest.util import worker_name @@ -40,8 +40,8 @@ def show(p): "priority": 0, "adjudication": True, }, - "start_time": datetime.datetime.min, - "last_updated": datetime.datetime.min, + "start_time": datetime.min, + "last_updated": datetime.min, "tc_base": -1.0, "base_same_as_master": True, "results_stale": False, @@ -105,7 +105,7 @@ def convert_run(run): runs = runs_collection.find({}).sort("_id", 1) count = 0 print("Starting conversion...") - t0 = datetime.datetime.utcnow() + t0 = datetime.now(timezone.utc) for r in runs: count += 1 r_id = r["_id"] @@ -113,7 +113,7 @@ def convert_run(run): convert_task_list(r["tasks"]) runs_collection.replace_one({"_id": r_id}, r) print("Runs converted: {}.".format(count), end="\r") - t1 = datetime.datetime.utcnow() + t1 = datetime.now(timezone.utc) duration = (t1 - t0).total_seconds() time_per_run = duration / count print("") diff --git a/worker/games.py b/worker/games.py index f52d9693e..f18533cba 100644 --- a/worker/games.py +++ b/worker/games.py @@ -1,6 +1,5 @@ import copy import ctypes -import datetime import hashlib import io import json @@ -19,6 +18,7 @@ import time from base64 import b64decode from contextlib import ExitStack +from datetime import datetime, timedelta, timezone from pathlib import Path from queue import Empty, Queue from zipfile import ZipFile @@ -79,7 +79,7 @@ def log(s): logfile = Path(__file__).resolve().parent / LOGFILE with LOG_LOCK: with open(logfile, "a") as f: - f.write("{} : {}\n".format(datetime.datetime.utcnow(), s)) + f.write("{} : {}\n".format(datetime.now(timezone.utc), s)) def backup_log(): @@ -174,7 +174,7 @@ def requests_post(remote, *args, **kw): def send_api_post_request(api_url, payload, quiet=False): - t0 = datetime.datetime.utcnow() + t0 = datetime.now(timezone.utc) response = requests_post( api_url, data=json.dumps(payload), @@ -204,7 +204,7 @@ def send_api_post_request(api_url, payload, quiet=False): if "error" in response: print("Error from remote: {}".format(response["error"])) - t1 = datetime.datetime.utcnow() + t1 = datetime.now(timezone.utc) w = 1000 * (t1 - t0).total_seconds() s = 1000 * response["duration"] log( @@ -843,11 +843,11 @@ def parse_cutechess_output( t.daemon = True t.start() - end_time = datetime.datetime.utcnow() + datetime.timedelta(seconds=tc_limit) + end_time = datetime.now(timezone.utc) + timedelta(seconds=tc_limit) print("TC limit {} End time: {}".format(tc_limit, end_time)) num_games_updated = 0 - while datetime.datetime.utcnow() < end_time: + while datetime.now(timezone.utc) < end_time: try: line = q.get_nowait().strip() except Empty: @@ -977,7 +977,7 @@ def parse_cutechess_output( update_pentanomial(line, rounds) else: raise WorkerException( - "{} is past end time {}".format(datetime.datetime.utcnow(), end_time) + "{} is past end time {}".format(datetime.now(timezone.utc), end_time) ) return True diff --git a/worker/sri.txt b/worker/sri.txt index 448fffec9..8216bb242 100644 --- a/worker/sri.txt +++ b/worker/sri.txt @@ -1 +1 @@ -{"__version": 212, "updater.py": "JOyZ0qPEXaL82QdgajUzcNfhBbusBn8Fwcp3eGqeXfW1HpDWRD1jXDsrzVUaZeCd", "worker.py": "JNiGRpnjVNuplGzER45R9j24vlh1tugy+KV7ZFfrVEv5C9HT/RSTyZ0ocRrrNMyW", "games.py": "au3WiGyUAb26mcz5C2MhnU7rhe8X3JMEgnyUlo4aAH+dPjxnXCZrWh9xFjdNQoFZ"} +{"__version": 213, "updater.py": "GEDqwD5F16roa/hRFbTNbbUqW/smvbe/4Rcf09O5BIJOAI63wsAVgLEnMtQp1naZ", "worker.py": "dT4tz1DqISrMUZhqlQNV94nvpf6EPVg0ebs118cSJ8gC7C22PetaQjQgA1Ciupm4", "games.py": "LyUiwCAMXllQWLIHsWGZpQpziYGO6dK3jDXzimEFd2ehLLrp5nsSGbl7+AUQTnAa"} diff --git a/worker/updater.py b/worker/updater.py index 8bd31ce16..ebed0ec9e 100644 --- a/worker/updater.py +++ b/worker/updater.py @@ -1,7 +1,7 @@ -import datetime import os import shutil import sys +from datetime import datetime, timezone from distutils.dir_util import copy_tree from pathlib import Path from zipfile import ZipFile @@ -68,7 +68,7 @@ def update(restart=True, test=False): os.chdir(worker_dir) testing_dir = worker_dir / "testing" if testing_dir.exists(): - time_stamp = str(datetime.datetime.timestamp(datetime.datetime.utcnow())) + time_stamp = str(datetime.now(timezone.utc).timestamp()) bkp_testing_dir = worker_dir / ("_testing_" + time_stamp) testing_dir.replace(bkp_testing_dir) testing_dir.mkdir() diff --git a/worker/worker.py b/worker/worker.py index 9b2bc8249..9ffcb3081 100644 --- a/worker/worker.py +++ b/worker/worker.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import atexit import base64 -import datetime import getpass import hashlib import json @@ -23,6 +22,7 @@ from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser from configparser import ConfigParser from contextlib import ExitStack +from datetime import datetime, timezone from functools import partial from pathlib import Path @@ -54,7 +54,7 @@ # Several packages are called "expression". # So we make sure to use the locally installed one. -WORKER_VERSION = 212 +WORKER_VERSION = 213 FILE_LIST = ["updater.py", "worker.py", "games.py"] HTTP_TIMEOUT = 30.0 INITIAL_RETRY_TIME = 15.0 @@ -1329,7 +1329,7 @@ def fetch_and_handle_task( # Print the current time for log purposes print( "Current time is {} UTC (local offset: {}) ".format( - datetime.datetime.utcnow(), utcoffset() + datetime.now(timezone.utc), utcoffset() ) )