feat: Add an alert framework
All checks were successful
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 3m6s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 3m9s
Tests and Linting / Tests-Linting (3.10) (push) Successful in 3m18s
Tests and Linting / Tests-Linting (3.13) (push) Successful in 3m17s
Tests and Linting / Tests-Linting (3.11) (push) Successful in 3m25s
All checks were successful
Build Docker / Build Images (map[dockerfile:Dockerfile tag_suffix: target:default]) (push) Successful in 3m6s
Build Docker / Build Images (map[dockerfile:Dockerfile.hsd tag_suffix:-hsd target:hsd]) (push) Successful in 3m9s
Tests and Linting / Tests-Linting (3.10) (push) Successful in 3m18s
Tests and Linting / Tests-Linting (3.13) (push) Successful in 3m17s
Tests and Linting / Tests-Linting (3.11) (push) Successful in 3m25s
This commit is contained in:
99
main.py
99
main.py
@@ -1,6 +1,7 @@
|
|||||||
import io
|
import io
|
||||||
import json
|
import json
|
||||||
import random
|
import random
|
||||||
|
import sqlite3
|
||||||
import sys
|
import sys
|
||||||
from flask import Flask, make_response, redirect, request, jsonify, render_template, send_from_directory,send_file
|
from flask import Flask, make_response, redirect, request, jsonify, render_template, send_from_directory,send_file
|
||||||
import os
|
import os
|
||||||
@@ -84,6 +85,13 @@ def index():
|
|||||||
print("New version available",flush=True)
|
print("New version available",flush=True)
|
||||||
plugins += render_template('components/dashboard-alert.html', name='Update', output='A new version of FireWallet is available')
|
plugins += render_template('components/dashboard-alert.html', name='Update', output='A new version of FireWallet is available')
|
||||||
|
|
||||||
|
alerts = get_alerts(account)
|
||||||
|
for alert in alerts:
|
||||||
|
output_html = alert['output']
|
||||||
|
# Add a dismiss button
|
||||||
|
output_html += f" <a href='/dismiss/{alert['id']}' class='btn btn-secondary btn-sm' style='margin:none;'>Dismiss</a>"
|
||||||
|
plugins += render_template('components/dashboard-alert.html', name=alert['name'], output=output_html)
|
||||||
|
|
||||||
return render_template("index.html", account=account, plugins=plugins)
|
return render_template("index.html", account=account, plugins=plugins)
|
||||||
|
|
||||||
def reverseDirection(direction: str):
|
def reverseDirection(direction: str):
|
||||||
@@ -1430,7 +1438,7 @@ def import_wallet():
|
|||||||
name=account,password=password,password_repeat=repeatPassword,
|
name=account,password=password,password_repeat=repeatPassword,
|
||||||
seed=seed)
|
seed=seed)
|
||||||
|
|
||||||
|
add_alert("Rescan needed", "Please rescan the wallet after importing to see all transactions", account)
|
||||||
# Set the cookie
|
# Set the cookie
|
||||||
response = make_response(redirect("/"))
|
response = make_response(redirect("/"))
|
||||||
response.set_cookie("account", account+":"+password)
|
response.set_cookie("account", account+":"+password)
|
||||||
@@ -1873,6 +1881,95 @@ def renderDomain(name: str) -> str:
|
|||||||
except Exception:
|
except Exception:
|
||||||
return f"{name}/"
|
return f"{name}/"
|
||||||
|
|
||||||
|
def get_alerts(account:str) -> list:
|
||||||
|
"""
|
||||||
|
Get alerts to show on the dashboard.
|
||||||
|
"""
|
||||||
|
|
||||||
|
alerts = []
|
||||||
|
|
||||||
|
# Check if the node is connected
|
||||||
|
if not account_module.hsdConnected():
|
||||||
|
alerts.append({
|
||||||
|
"name": "Node",
|
||||||
|
"output": "HSD node is not connected. Please check your settings."
|
||||||
|
})
|
||||||
|
return alerts
|
||||||
|
|
||||||
|
# Check if the wallet is synced
|
||||||
|
wallet_status = account_module.getWalletStatus()
|
||||||
|
if wallet_status != "Ready":
|
||||||
|
alerts.append({
|
||||||
|
"name": "Wallet",
|
||||||
|
"output": f"The wallet is not synced ({wallet_status}). Please wait for it to sync."
|
||||||
|
})
|
||||||
|
print(account)
|
||||||
|
# Try to read from notifications sqlite database
|
||||||
|
if os.path.exists("user_data/notifications.db"):
|
||||||
|
try:
|
||||||
|
conn = sqlite3.connect("user_data/notifications.db")
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute("SELECT id, name, message FROM notifications WHERE read=0 AND (account=? OR account='all')", (account,))
|
||||||
|
rows = c.fetchall()
|
||||||
|
for row in rows:
|
||||||
|
alerts.append({
|
||||||
|
"id": row[0],
|
||||||
|
"name": row[1],
|
||||||
|
"output": row[2]
|
||||||
|
})
|
||||||
|
conn.close()
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error reading notifications: {e}",flush=True)
|
||||||
|
pass
|
||||||
|
|
||||||
|
return alerts
|
||||||
|
|
||||||
|
def add_alert(name:str,output:str,account:str="all"):
|
||||||
|
"""
|
||||||
|
Add an alert to the notifications database.
|
||||||
|
"""
|
||||||
|
if not os.path.exists("user_data/notifications.db"):
|
||||||
|
conn = sqlite3.connect("user_data/notifications.db")
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute("CREATE TABLE notifications (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, message TEXT, account TEXT, read INTEGER DEFAULT 0)")
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
try:
|
||||||
|
conn = sqlite3.connect("user_data/notifications.db")
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute("INSERT INTO notifications (name, message, account) VALUES (?, ?, ?)", (name, output, account))
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error adding notification: {e}",flush=True)
|
||||||
|
pass
|
||||||
|
|
||||||
|
@app.route('/dismiss/<int:alert_id>')
|
||||||
|
def dismiss_alert(alert_id):
|
||||||
|
# Check if the user is logged in
|
||||||
|
if request.cookies.get("account") is None:
|
||||||
|
return redirect("/login")
|
||||||
|
|
||||||
|
account = account_module.check_account(request.cookies.get("account"))
|
||||||
|
if not account:
|
||||||
|
return redirect("/logout")
|
||||||
|
|
||||||
|
if not os.path.exists("user_data/notifications.db"):
|
||||||
|
return redirect("/")
|
||||||
|
|
||||||
|
try:
|
||||||
|
conn = sqlite3.connect("user_data/notifications.db")
|
||||||
|
c = conn.cursor()
|
||||||
|
c.execute("UPDATE notifications SET read=1 WHERE id=? AND (account=? OR account='all')", (alert_id,account))
|
||||||
|
conn.commit()
|
||||||
|
conn.close()
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error dismissing notification: {e}",flush=True)
|
||||||
|
pass
|
||||||
|
|
||||||
|
return redirect("/")
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user