2023-11-08 20:56:03 +11:00
from flask import Flask , make_response , redirect , render_template_string , request , jsonify , render_template , send_from_directory
2023-11-08 22:51:39 +11:00
from bs4 import BeautifulSoup
2023-11-09 12:51:35 +11:00
import os
import dotenv
main_domain = " cities.hnshosting.au "
if os . getenv ( ' MAIN_DOMAIN ' ) != None :
main_domain = os . getenv ( ' MAIN_DOMAIN ' )
2023-11-08 20:56:03 +11:00
2023-11-15 18:03:43 +11:00
def render ( data , db_object ) :
2023-11-08 22:32:00 +11:00
if data == " " :
2023-11-09 12:51:35 +11:00
return redirect ( " https:// " + main_domain + ' /claim?domain= ' + request . host . split ( ' . ' ) [ 0 ] )
2023-11-08 22:32:00 +11:00
2023-11-15 18:03:43 +11:00
# Render as HTML
html = " "
2023-11-08 22:51:39 +11:00
try :
soup = BeautifulSoup ( data , ' html.parser ' )
for script in soup . find_all ( ' script ' ) :
script . extract ( )
2023-11-08 23:25:01 +11:00
2023-11-15 18:03:43 +11:00
html = str ( soup )
except Exception as e :
return " <h1>Invalid HTML</h1><br> " + str ( e )
try :
avatar = db_object [ ' avatar ' ]
hnschat = db_object [ ' hnschat ' ]
location = db_object [ ' location ' ]
hns = db_object [ ' HNS ' ]
btc = db_object [ ' BTC ' ]
eth = db_object [ ' ETH ' ]
2023-11-15 21:27:03 +11:00
if hns != " " :
hns = " HNS: " + hns
if btc != " " :
btc = " BTC: " + btc
if eth != " " :
eth = " ETH: " + eth
2023-11-15 18:28:40 +11:00
bg_colour = db_object [ ' bg_colour ' ]
fg_colour = db_object [ ' fg_colour ' ]
text_colour = db_object [ ' text_colour ' ]
2023-11-15 18:24:11 +11:00
if ( rgb_to_hex ( generate_foreground_color ( fg_colour ) ) == " " ) :
hns_icon = " assets/img/HNSW.png "
else :
hns_icon = " assets/img/HNS.png "
2023-11-08 22:51:39 +11:00
except Exception as e :
2023-11-15 21:32:10 +11:00
return " <h1>Invalid data</h1><br><h2>Please contact support</h2><br><p>This can often be fixed by saving your site again in the editor</p><br> " + " <script>console.log( ' " + str ( e ) + " ' );</script> "
2023-11-15 18:03:43 +11:00
return render_template ( ' city.html ' , html = html , bg_colour = bg_colour , text_colour = text_colour ,
2023-11-15 18:24:11 +11:00
fg_colour = fg_colour , avatar = avatar , main_domain = main_domain ,
2023-11-15 18:03:43 +11:00
hnschat = hnschat , location = location , hns_icon = hns_icon ,
hns = hns , btc = btc , eth = eth , data = html )
def calculate_contrast_ratio ( color1 , color2 ) :
def calculate_luminance ( color ) :
def adjust_color_value ( value ) :
value / = 255.0
if value < = 0.03928 :
return value / 12.92
return ( ( value + 0.055 ) / 1.055 ) * * 2.4
r , g , b = color
r = adjust_color_value ( r )
g = adjust_color_value ( g )
b = adjust_color_value ( b )
return 0.2126 * r + 0.7152 * g + 0.0722 * b
luminance1 = calculate_luminance ( color1 )
luminance2 = calculate_luminance ( color2 )
brighter = max ( luminance1 , luminance2 )
darker = min ( luminance1 , luminance2 )
contrast_ratio = ( brighter + 0.05 ) / ( darker + 0.05 )
return contrast_ratio
def generate_foreground_color ( background_color ) :
2023-11-15 18:24:11 +11:00
# Convert to RGB tuple
background_color = background_color . lstrip ( ' # ' )
background_color = tuple ( int ( background_color [ i : i + 2 ] , 16 ) for i in ( 0 , 2 , 4 ) )
2023-11-15 18:03:43 +11:00
2023-11-15 18:24:11 +11:00
contrast_color = ( 255 , 255 , 255 ) # White
2023-11-15 18:03:43 +11:00
ratio = calculate_contrast_ratio ( background_color , contrast_color )
if ratio < 4.5 :
return ( 0 , 0 , 0 ) # Black
else :
return contrast_color
def rgb_to_hex ( rgb_color ) :
return " # {:02x} {:02x} {:02x} " . format ( * rgb_color )