From 4e8ca03aed12272de740778103ea6b774d557934 Mon Sep 17 00:00:00 2001 From: Nathan Woodburn Date: Tue, 23 Jul 2024 10:03:30 +1000 Subject: [PATCH] fix: Only update address every 24 hrs and increase the receiveWindow --- main.py | 202 ++++++++++++++++++++++++++++++------------------------ server.py | 2 +- 2 files changed, 112 insertions(+), 92 deletions(-) diff --git a/main.py b/main.py index 8927513..f57fc20 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,12 @@ -from flask import Flask, make_response, redirect, request, jsonify, render_template, send_from_directory +from flask import ( + Flask, + make_response, + redirect, + request, + jsonify, + render_template, + send_from_directory, +) import os import dotenv import requests @@ -11,173 +19,186 @@ from email_validator import validate_email, EmailNotValidError app = Flask(__name__) dotenv.load_dotenv() -address = 'hs1qr7d0xqsyatls47jf28gvm97twe8k606gspfpsz' +address = "hs1qr7d0xqsyatls47jf28gvm97twe8k606gspfpsz" -if os.getenv('address') != None: - address = os.getenv('address') +if os.getenv("address") != None: + address = os.getenv("address") -#Assets routes -@app.route('/assets/') + +# Assets routes +@app.route("/assets/") def send_report(path): - return send_from_directory('templates/assets', path) + return send_from_directory("templates/assets", path) - -@app.route('/') +@app.route("/") def index(): params = request.args - if 'r' in request.cookies: - print("Referer: " + request.cookies['r']) - return render_template('index.html', hidden=request.cookies['r'],address=address) + if "r" in request.cookies: + print("Referer: " + request.cookies["r"]) + return render_template( + "index.html", hidden=request.cookies["r"], address=address + ) - - if 'r' in params: - print("Referer: " + params['r']) + if "r" in params: + print("Referer: " + params["r"]) # Set cookie - resp = make_response(render_template('index.html', hidden=params['r'],address=address)) - resp.set_cookie('r', params['r'], max_age=60*60*24) + resp = make_response( + render_template("index.html", hidden=params["r"], address=address) + ) + resp.set_cookie("r", params["r"], max_age=60 * 60 * 24) return resp - return render_template('index.html',address=address) + return render_template("index.html", address=address) -@app.route('/', methods=['POST']) +@app.route("/", methods=["POST"]) def submit(): - name = request.form['name'] - email = request.form['email'] - hidden = request.form['hi'] + name = request.form["name"] + email = request.form["email"] + hidden = request.form["hi"] ip = request.remote_addr - if 'X-REAL-IP' in request.headers: - ip = request.headers['X-REAL-IP'] + if "X-REAL-IP" in request.headers: + ip = request.headers["X-REAL-IP"] - if 'X-Real-Ip' in request.headers: - ip = request.headers['X-Real-Ip'] + if "X-Real-Ip" in request.headers: + ip = request.headers["X-Real-Ip"] - if hidden == '': - hidden = 'None' + if hidden == "": + hidden = "None" - if 'r' in request.cookies: - hidden = request.cookies['r'] + if "r" in request.cookies: + hidden = request.cookies["r"] # Validate email try: emailinfo = validate_email(email, check_deliverability=False) email = emailinfo.normalized except EmailNotValidError as e: - return render_template('error.html',error='Invalid email address',address=address) - + return render_template( + "error.html", error="Invalid email address", address=address + ) status = gift.gift(name, email, hidden, ip) - print(status,flush=True) + print(status, flush=True) if status == True: - return render_template('success.html',address=address) + return render_template("success.html", address=address) else: - return render_template('error.html',error=status,address=address) + return render_template("error.html", error=status, address=address) -@app.route('/api', methods=['POST']) + +@app.route("/api", methods=["POST"]) def api(): # Get from params params = request.args - name = params['name'] - email = params['email'] - key = params['key'] + name = params["name"] + email = params["email"] + key = params["key"] - if key != os.getenv('api_key'): - return jsonify({'error': 'Invalid API key', 'success': False}) + if key != os.getenv("api_key"): + return jsonify({"error": "Invalid API key", "success": False}) - if 'X-REAL-IP' in request.headers: - ip = request.headers['X-REAL-IP'] + if "X-REAL-IP" in request.headers: + ip = request.headers["X-REAL-IP"] - if 'X-Real-Ip' in request.headers: - ip = request.headers['X-Real-Ip'] + if "X-Real-Ip" in request.headers: + ip = request.headers["X-Real-Ip"] # Validate email try: emailinfo = validate_email(email, check_deliverability=False) email = emailinfo.normalized except EmailNotValidError as e: - return jsonify({'error': 'Invalid email address', 'success': False}) + return jsonify({"error": "Invalid email address", "success": False}) - - status = gift.gift(name, email, "api", ip,True) - print(status,flush=True) + status = gift.gift(name, email, "api", ip, True) + print(status, flush=True) if status == True: - return jsonify({'success': True}) + return jsonify({"success": True}) else: - return jsonify({'error': status, 'success': False}) + return jsonify({"error": status, "success": False}) # Special routes -@app.route('/.well-known/wallets/') +@app.route("/.well-known/wallets/") def send_wallet(token): - address = requests.get('https://nathan.woodburn.au/.well-known/wallets/'+token).text - return make_response(address, 200, {'Content-Type': 'text/plain'}) + address = requests.get( + "https://nathan.woodburn.au/.well-known/wallets/" + token + ).text + return make_response(address, 200, {"Content-Type": "text/plain"}) -@app.route('/stats') + +@app.route("/stats") def stats(): # Read the file - path = '/data/gifts.json' - if os.getenv('local') == 'true': - path = './gifts.json' + path = "/data/gifts.json" + if os.getenv("local") == "true": + path = "./gifts.json" # Load file gifts = [] if os.path.isfile(path): - with open(path, 'r') as f: - gifts = json.load(f) + with open(path, "r") as f: + gifts = json.load(f) # Loop through gifts referals = {} for gift_item in gifts: - if gift_item['referer'] not in referals: - referals[gift_item['referer']] = 1 + if gift_item["referer"] not in referals: + referals[gift_item["referer"]] = 1 else: - referals[gift_item['referer']] += 1 - - statsHTML = 'Total gifts: ' + str(len(gifts)) + '

' - statsHTML += 'Referals:
' + referals[gift_item["referer"]] += 1 + + statsHTML = "Total gifts: " + str(len(gifts)) + "

" + statsHTML += "Referals:
" for referal in referals: - statsHTML += referal + ': ' + str(referals[referal]) + '
' + statsHTML += referal + ": " + str(referals[referal]) + "
" + + statsHTML += "
Remaining balance: " + str(gift.balance()) + " HNS
" + + return render_template("stats.html", address=address, stats=statsHTML) - statsHTML += '
Remaining balance: ' + str(gift.balance()) + ' HNS
' - - return render_template('stats.html',address=address,stats=statsHTML) - -@app.route('/') +@app.route("/") def catch_all(path): - return redirect('/?r='+path) + return redirect("/?r=" + path) + # 404 catch all @app.errorhandler(404) def not_found(e): - return redirect('/') + return redirect("/") + def update_address(): global address payload = { "asset": "HNS", - # "timestamp": 1699411892673, "timestamp": int(round(time.time() * 1000)), - "receiveWindow": 10000 + "receiveWindow": 20000, } - nbcookie = os.getenv('cookie') + nbcookie = os.getenv("cookie") cookies = {"namebase-main": nbcookie} headers = {"Accept": "application/json", "Content-Type": "application/json"} - r = requests.post('https://www.namebase.io/api/v0/deposit/address', data=json.dumps(payload), headers=headers, cookies=cookies) - if 'address' not in r.json(): - print("Error: " + r.text,flush=True) + r = requests.post( + "https://www.namebase.io/api/v0/deposit/address", + data=json.dumps(payload), + headers=headers, + cookies=cookies, + ) + if "address" not in r.json(): + print("Error: " + r.text, flush=True) # Send alert via discord - url = os.getenv('discord_webhook') + url = os.getenv("discord_webhook") if url == None: return "No webhook set" - - payload = { - "content": "NB cookie has expired\n@everyone" - } - response = requests.post(url, data=json.dumps(payload), headers={'Content-Type': 'application/json'}) + + payload = {"content": "NB cookie has expired\n@everyone"} + response = requests.post( + url, data=json.dumps(payload), headers={"Content-Type": "application/json"} + ) # Check if the message was sent successfully if response.status_code == 204: @@ -187,13 +208,12 @@ def update_address(): print(response.text) return - address = r.json()['address'] - print("Address updated: " + address,flush=True) + address = r.json()["address"] + print("Address updated: " + address, flush=True) update_address() - -if __name__ == '__main__': - app.run(debug=False, port=5000, host='0.0.0.0') \ No newline at end of file +if __name__ == "__main__": + app.run(debug=False, port=5000, host="0.0.0.0") diff --git a/server.py b/server.py index d8de7e7..fbeef86 100644 --- a/server.py +++ b/server.py @@ -27,7 +27,7 @@ class GunicornApp(BaseApplication): if __name__ == '__main__': # Every hour scheduler = BackgroundScheduler() - scheduler.add_job(main.update_address, 'cron', hour='*') + scheduler.add_job(main.update_address, 'cron', hour='0') scheduler.start()