Compare commits

...

3 Commits

Author SHA1 Message Date
ccc3122f3c wip: 2024-01-13 04:25:48 +01:00
8433e0f47e wip: 2024-01-13 04:08:18 +01:00
a2ee6065c1 wip: notifications 2024-01-12 07:44:39 +01:00
2 changed files with 62 additions and 1 deletions

24
notifications.py Normal file
View File

@@ -0,0 +1,24 @@
import sys
import requests
def send_notification(app, target_user, mapname, old_replay, new_replay):
'''Build notification and handoff to dispatcher'''
url = app.config["DISPATCH_SERVER"]
if not url:
return
# send to event dispatcher #
message = "Trackmania: Record broken on {}".format(mapname)
message += "Old time: {}".format(old_replay.get_human_readable_time())
message += "New time: {}".format(new_replay.get_human_readable_time())
message += "by {}".format(new_replay.clean_login())
payload = { "users": [user], "msg" : message }
r = requests.post(app.config["DISPATCH_SERVER"] + "/smart-send",
json=payload, auth=app.config["DISPATCH_AUTH"])
if not r.ok:
print("Error handing off notification to dispatch ({})".format(r.status_code), file=sys.stderr)

View File

@@ -77,6 +77,19 @@ class Map(db.Model):
delta = datetime.datetime.now() - parsed
return delta.days
class UserSettings(db.Model):
__tablename__ = "user_settings"
user = Column(String, primary_key=True)
show_tm_2020 = Column(Boolean)
show_tmnf = Column(Boolean)
show_tm_2020_current = Column(Boolean)
notifcations_all = Column(Boolean)
notifcations_self = Column(Boolean)
class ParsedReplay(db.Model):
__tablename__ = "replays"
@@ -103,7 +116,7 @@ class ParsedReplay(db.Model):
else:
return self.login
def get_human_readable_time(self):
def get_human_readable_time(self, thousands=False):
t = datetime.timedelta(microseconds=self.race_time*1000)
t_string = str(t)
if t.seconds < 60*60:
@@ -390,6 +403,7 @@ def upload():
replay = replay_from_path(fullpath, uploader=uploader)
db.session.add(replay)
db.session.commit()
check_replay_trigger(replay)
except ValueError as e:
results += [(fname, str(e))]
continue
@@ -405,9 +419,32 @@ def upload():
else:
return flask.render_template("upload.html")
def check_replay_trigger(replay):
map_obj = db.session.get(Map).filter(Map.map_uid == replay.map_uid).first()
assert(map_uid)
best = map_obj.get_best_replay()
second = map_obj.get_second_best_replay()
if replay.filehash != best.filehash:
return
if second.uploader == replay.uploader:
return
settings = db.session.query(UserSettings).filter(UserSettings.user == second.uploader).first()
if settings and settings.notifcations_self:
notifications.send_notification(app, settings.user, map_obj.map_uid, second, replay)
def create_app():
db.create_all()
app.config["DISPATCH_SERVER"] = os.environ.get("DISPATCH_SERVER")
if app.config["DISPATCH_SERVER"]:
app.config["DISPATCH_AUTH"] = (os.environ["DISPATCH_AUTH_USER"], os.environ["DISPATCH_AUTH_PASSWORD"])
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='TM Replay Server',