from flask import ( Flask, make_response, render_template, send_from_directory, send_file, jsonify, ) import os import requests from datetime import datetime import dotenv from tools import hip2, wallet_txt dotenv.load_dotenv() app = Flask(__name__) def find(name, path): for root, dirs, files in os.walk(path): if name in files: return os.path.join(root, name) # Assets routes @app.route("/assets/") def send_assets(path): if path.endswith(".json"): return send_from_directory( "templates/assets", path, mimetype="application/json" ) if os.path.isfile("templates/assets/" + path): return send_from_directory("templates/assets", path) # Try looking in one of the directories filename: str = path.split("/")[-1] if ( filename.endswith(".png") or filename.endswith(".jpg") or filename.endswith(".jpeg") or filename.endswith(".svg") ): if os.path.isfile("templates/assets/img/" + filename): return send_from_directory("templates/assets/img", filename) if os.path.isfile("templates/assets/img/favicon/" + filename): return send_from_directory("templates/assets/img/favicon", filename) return render_template("404.html"), 404 # region Special routes @app.route("/favicon.png") def faviconPNG(): return send_from_directory("templates/assets/img", "favicon.png") @app.route("/.well-known/") def wellknown(path): # Try to proxy to https://nathan.woodburn.au/.well-known/ req = requests.get(f"https://nathan.woodburn.au/.well-known/{path}") return make_response( req.content, 200, {"Content-Type": req.headers["Content-Type"]} ) # endregion # region Main routes @app.route("/") def index(): current_datetime = datetime.now().strftime("%d %b %Y %I:%M %p") return render_template("index.html", datetime=current_datetime) @app.route("/tx/") def tx_route(tx_hash): current_datetime = datetime.now().strftime("%d %b %Y %I:%M %p") return render_template("index.html", datetime=current_datetime) @app.route("/block/") def block_route(block_id): current_datetime = datetime.now().strftime("%d %b %Y %I:%M %p") return render_template("index.html", datetime=current_datetime) @app.route("/header/") def header_route(block_id): current_datetime = datetime.now().strftime("%d %b %Y %I:%M %p") return render_template("index.html", datetime=current_datetime) @app.route("/address/") def address_route(address): current_datetime = datetime.now().strftime("%d %b %Y %I:%M %p") return render_template("index.html", datetime=current_datetime) @app.route("/name/") def name_route(name): current_datetime = datetime.now().strftime("%d %b %Y %I:%M %p") return render_template("index.html", datetime=current_datetime) @app.route("/coin//") def coin_route(coin_hash, index): current_datetime = datetime.now().strftime("%d %b %Y %I:%M %p") return render_template("index.html", datetime=current_datetime) @app.route("/") def catch_all(path: str): if os.path.isfile("templates/" + path): return render_template(path) # Try with .html if os.path.isfile("templates/" + path + ".html"): return render_template(path + ".html") if os.path.isfile("templates/" + path.strip("/") + ".html"): return render_template(path.strip("/") + ".html") # Try to find a file matching if path.count("/") < 1: # Try to find a file matching filename = find(path, "templates") if filename: return send_file(filename) return render_template("404.html"), 404 @app.route("/api/v1/status") def api_status(): return jsonify( { "status": "ok", "service": "FireExplorer", "version": "1.0.0", } ) @app.route("/api/v1/hip02/") def hip02(domain: str): hip2_record = hip2(domain) if hip2_record: return jsonify( { "success": True, "address": hip2_record, "method": "hip02", } ) wallet_record = wallet_txt(domain) if wallet_record: return jsonify( { "success": True, "address": wallet_record, "method": "wallet_txt", } ) return jsonify( { "success": False, "error": "No HIP02 or WALLET record found for this domain", } ) # endregion # region Error Catching # 404 catch all @app.errorhandler(404) def not_found(e): return render_template("404.html"), 404 # endregion if __name__ == "__main__": app.run(debug=True, port=5000, host="127.0.0.1")