From cdab4d39cd71cc057f648d239efff35fc0626a8e Mon Sep 17 00:00:00 2001 From: Yannik Schmidt Date: Sun, 18 Feb 2024 17:55:45 +0100 Subject: [PATCH] feat: basic method=any & prio support --- server/interface.py | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/server/interface.py b/server/interface.py index 2f4dcff..612d9a2 100755 --- a/server/interface.py +++ b/server/interface.py @@ -25,6 +25,25 @@ app = flask.Flask("Signal Notification Gateway") app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///sqlite.db" db = SQLAlchemy(app) +class UserSettings(db.Model): + + __tablename__ = "user_settings" + + username = Column(String, primary_key=True) + signal_priority = Column(Integer) + email_priority = Column(Integer) + ntfy_priority = Column(Integer) + + def get_highest_prio_method(self): + + if self.signal_priority >= max(self.email_priority, self.ntfy_priority): + return "signal" + elif self.email_priority >= max(self.signal_priority, self.ntfy_priority): + return "email" + else: + return "ntfy" + + class DispatchObject(db.Model): __tablename__ = "dispatch_queue" @@ -42,6 +61,7 @@ class DispatchObject(db.Model): dispatch_error = Column(String) def serialize(self): + ret = { "person" : self.username, # legacy field TODO remove at some point "username" : self.username, @@ -54,12 +74,25 @@ class DispatchObject(db.Model): "method" : self.method, "error" : self.dispatch_error, } - + # fix bytes => string from LDAP # for key, value in ret.items(): if type(value) == bytes: ret[key] = value.decode("utf-8") + if ret["method"] == "any": + user_settings = db.session.query(UserSettings).filter( + UserSettings.username == ret["username"]).first() + + if not user_settings and self.phone: + ret["method"] = "signal" + elif not user_settings and self.email: + ret["method"] = "email" + elif user_settings: + ret["method"] = user_settings.get_highest_prio_method() + else: + ret["method"] = "ntfy" + return ret @app.route('/get-dispatch-status') @@ -83,7 +116,7 @@ def get_dispatch(): timeout = int(timeout) if not method: - return (500, "Missing Dispatch Target (signal|email|phone|ntfy|all)") + return (500, "Missing Dispatch Target (signal|email|phone|ntfy|all|any)") # prevent message floods # timeout_cutoff = datetime.datetime.now() - datetime.timedelta(seconds=timeout)