feat: Add initial code
Some checks failed
Build Docker / Build Docker (push) Failing after 18s

This commit is contained in:
Nathan Woodburn 2023-12-11 15:28:20 +11:00
parent 187bf0b035
commit eb4e2afc5f
Signed by: nathanwoodburn
GPG Key ID: 203B000478AD0EF1
39 changed files with 2564 additions and 1 deletions

View File

@ -0,0 +1,38 @@
name: Build Docker
run-name: Build Docker Images
on:
push:
jobs:
Build Docker:
runs-on: [ubuntu-latest, amd] # Add amd later to require amd64
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Install Docker
run : |
echo "Updating apt sources"
echo "deb http://ftp.au.debian.org/debian buster main" > /etc/apt/sources.list
apt-get update --allow-unauthenticated --allow-insecure-repositories
apt-get install docker.io -y
- name: Build Docker image
run : |
echo "${{ secrets.DOCKERGIT_TOKEN }}" | docker login git.woodburn.au -u nathanwoodburn --password-stdin
echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}"
tag=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}
tag=${tag//\//-}
tag_num=${GITHUB_RUN_NUMBER}
echo "tag_num=$tag_num"
if [[ "$tag" == "main" ]]; then
tag="latest"
else
tag_num="${tag}-${tag_num}"
fi
docker build -t hnsalert:$tag_num .
docker tag hnsalert:$tag_num git.woodburn.au/nathanwoodburn/hnsalert:$tag_num
docker push git.woodburn.au/nathanwoodburn/hnsalert:$tag_num
docker tag hnsalert:$tag_num git.woodburn.au/nathanwoodburn/hnsalert:$tag
docker push git.woodburn.au/nathanwoodburn/hnsalert:$tag

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
.env
__pycache__/

View File

@ -1 +1,34 @@
# hnsalert
# HNS Alert
## Docker compose
```yaml
version: '3'
services:
app:
image: git.woodburn.au/nathanwoodburn/hnsalert:latest # for production
# image: git.woodburn.au/nathanwoodburn/hnsalert:dev # for development
ports:
- "61495:5000"
depends_on:
- db
environment:
DB_HOST: db
DB_USER: db_user
DB_PASSWORD: db_password
DB_NAME: alert_db
WORKERS: 2 # number of workers to run (should be 2 * number of cores)
db:
image: linuxserver/mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: your-root-password
MYSQL_DATABASE: alert_db
MYSQL_USER: db_user
MYSQL_PASSWORD: db_password
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
```

302
account.py Normal file
View File

@ -0,0 +1,302 @@
import mysql.connector
from mysql.connector import Error
import dotenv
import os
import json
import time
from email_validator import validate_email, EmailNotValidError
import bcrypt
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import requests
dotenv.load_dotenv()
db_config = {
'host': os.getenv('DB_HOST'),
'database': os.getenv('DB_NAME'),
'user': os.getenv('DB_USER'),
'password': os.getenv('DB_PASSWORD')
}
def verifyUser(userToken:str):
# Get userID from userToken
if (userToken.count('$') != 1):
return False
userToken = userToken.split('$')
userID = userToken[0]
userToken = userToken[1]
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
cursor.execute("SELECT user_token FROM users WHERE id = %s", (userID,))
user = cursor.fetchall()
cursor.close()
conn.close()
# Read json token from first user
user = user[0][0]
userTokens = json.loads(user)
for token in userTokens:
if (token['token'] == userToken):
if (token['expires'] > time.time()):
return True
return False
def createUser(email:str, password:str):
# Check if email is valid
try:
valid = validate_email(email)
email = valid.email
except EmailNotValidError as e:
# email is not valid, exception message is human-readable
return False
# Check if email is already in use
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
cursor.execute("SELECT email FROM users WHERE email = %s", (email,))
user = cursor.fetchall()
cursor.close()
conn.close()
if (len(user) != 0):
return False
passwordHash = hashPassword(password)
# Create user
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
cursor.execute("INSERT INTO users (email, password, admin, notifications, user_token, domains) VALUES (%s, %s, %s, %s, %s, %s)", (email, passwordHash, False, json.dumps({}), json.dumps([]), json.dumps([])))
conn.commit()
cursor.close()
conn.close()
return True
def login(email:str, password:str):
# Check if email is valid
try:
valid = validate_email(email)
email = valid.email
except EmailNotValidError as e:
# email is not valid, exception message is human-readable
return False
# Check if email is already in use
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
cursor.execute("SELECT id, password FROM users WHERE email = %s", (email,))
user = cursor.fetchall()
cursor.close()
conn.close()
if (len(user) == 0):
return False
# Check if password is correct
userID = user[0][0]
if (checkPassword(password, user[0][1])):
# Create new user token
userToken = genToken()
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
cursor.execute("SELECT user_token FROM users WHERE id = %s", (userID,))
user = cursor.fetchall()
cursor.close()
conn.close()
# Read json token from first user
user = user[0][0]
print(user)
userTokens = json.loads(user)
userTokens.append({'token': userToken, 'expires': time.time() + 86400})
# Update user token
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
cursor.execute("UPDATE users SET user_token = %s WHERE id = %s", (json.dumps(userTokens), userID,))
conn.commit()
cursor.close()
conn.close()
return str(userID) + '$' + userToken
else:
return False
def getUser(userToken:str):
# Get userID from userToken
if (userToken.count('$') != 1):
return False
userToken = userToken.split('$')
userID = userToken[0]
userToken = userToken[1]
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
cursor.execute("SELECT id, email, admin, notifications, domains, created_at FROM users WHERE id = %s", (userID,))
user = cursor.fetchall()
cursor.close()
conn.close()
# Read json token from first user
user = user[0]
return {'id': user[0], 'email': user[1], 'admin': user[2], 'notifications': json.loads(user[3]), 'domains': json.loads(user[4]), 'created_at': user[5]}
def logoutUser(userToken:str):
pass
def hashPassword(password:str):
# Use bcrypt to hash password
password = password.encode('utf-8')
salt = bcrypt.gensalt()
passwordHash = bcrypt.hashpw(password, salt)
passwordHash = passwordHash.decode('utf-8')
return passwordHash
def checkPassword(password:str, passwordHash:str):
# Use bcrypt to check password
password = password.encode('utf-8')
passwordHash = passwordHash.encode('utf-8')
if (bcrypt.checkpw(password, passwordHash)):
return True
else:
return False
def genToken():
# Generate a random token
token = os.urandom(32)
token = token.hex()
return token
def updateNotifications(token, notifications):
# Get userID from userToken
if (token.count('$') != 1):
return False
token = token.split('$')
userID = token[0]
token = token[1]
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
cursor.execute("UPDATE users SET notifications = %s WHERE id = %s", (json.dumps(notifications), userID,))
conn.commit()
cursor.close()
conn.close()
return True
def updateNotificationProvider(token, provider,account):
# Get userID from userToken
if (token.count('$') != 1):
return False
token = token.split('$')
userID = token[0]
token = token[1]
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
cursor.execute("SELECT notifications FROM users WHERE id = %s", (userID,))
user = cursor.fetchall()
cursor.close()
conn.close()
# Read json token from first user
user = user[0][0]
user = json.loads(user)
user[provider] = account
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
cursor.execute("UPDATE users SET notifications = %s WHERE id = %s", (json.dumps(user), userID,))
conn.commit()
cursor.close()
conn.close()
return True
def sendNotification(service, service_account, title, content):
if (service == 'email'):
sendEmail(service_account, title, content)
elif (service == 'discord'):
sendDiscordWebhook(service_account, title, content)
elif (service == 'telegram'):
pass
else:
return False
return True
def sendEmail(email, title, content):
sender_email = os.getenv('EMAIL_FROM')
sender_password = os.getenv('EMAIL_PASSWORD')
recipient_email = email
# Create the MIME object
message = MIMEMultipart()
message['From'] = sender_email
message['To'] = recipient_email
message['Subject'] = title
# Add the email body
body = content
message.attach(MIMEText(body, 'plain'))
# Connect to the SMTP server
with smtplib.SMTP(os.getenv('EMAIL_HOST'), os.getenv('EMAIL_PORT')) as server:
try:
if (os.getenv('EMAIL_USE_TLS') == 'True'):
server.starttls()
server.login(sender_email, sender_password)
# Send the email
server.sendmail(sender_email, recipient_email, message.as_string())
print("Email sent successfully.")
except Exception as e:
print(e)
print("Email failed to send.")
def sendDiscordWebhook(webhook, title, content):
# Create the webhook object
headers = {
'Content-Type': 'application/json'
}
payload = {
"content": None,
"embeds": [
{
"title": title,
"description": content,
"color": 5907868,
"footer": {
"text": "Powered by Woodburn",
"icon_url": "https://woodburn.au/favicon.png"
},
# "timestamp": "2023-12-11T04:17:00.000Z"
"timestamp": time.strftime('%Y-%m-%dT%H:%M:%S.000Z', time.localtime())
}
],
"username": "HNS Alert",
"avatar_url": "https://woodburn.au/favicon.png",
"attachments": []
}
response = requests.post(webhook, data=json.dumps(payload), headers=headers)
if response.status_code == 204:
print("Message sent successfully to Discord webhook.")
else:
print(f"Failed to send message to Discord webhook. Status code: {response.status_code}")

249
main.py Normal file
View File

@ -0,0 +1,249 @@
from flask import Flask, make_response, redirect, request, jsonify, render_template, send_from_directory
import dotenv
import os
import requests
import mysql.connector
from mysql.connector import Error
import sys
import time
import json
import account
import threading
dotenv.load_dotenv()
app = Flask(__name__)
db_config = {
'host': os.getenv('DB_HOST'),
'database': os.getenv('DB_NAME'),
'user': os.getenv('DB_USER'),
'password': os.getenv('DB_PASSWORD')
}
service_prompts = {
"discord": "https://discord.com/api/webhooks/11....",
"telegram": "Telegram User ID",
"email": "example@email.com"
}
@app.route('/')
def index():
return render_template('index.html')
@app.route('/login')
def login():
# Check if user is already logged in
if 'user_token' in request.cookies:
if (account.verifyUser(request.cookies.get('user_token'))):
return redirect('/dashboard')
return render_template('login.html')
@app.route('/login', methods=['POST'])
def login_post():
email = request.form.get('email')
password = request.form.get('password')
# Check if user is already logged in
if 'user_token' in request.cookies:
if (account.verifyUser(request.cookies.get('user_token'))):
return redirect('/dashboard')
# Check if user exists
token = account.login(email, password)
if (token):
resp = make_response(redirect('/dashboard'))
resp.set_cookie('user_token', token)
return resp
else:
return render_template('login.html', error='Invalid email or password')
@app.route('/signup')
def signup():
# Check if user is already logged in
if 'user_token' in request.cookies:
if (account.verifyUser(request.cookies.get('user_token'))):
return redirect('/dashboard')
return render_template('signup.html')
@app.route('/signup', methods=['POST'])
def signup_post():
email = request.form.get('email')
password = request.form.get('password')
# Check if user is already logged in
if 'user_token' in request.cookies:
if (account.verifyUser(request.cookies.get('user_token'))):
return redirect('/dashboard')
# Create user
if (account.createUser(email, password)):
resp = make_response(redirect('/dashboard'))
resp.set_cookie('user_token', account.login(email, password))
return resp
else:
return render_template('signup.html', error='Invalid email or password')
@app.route('/logout')
def logout():
# Check if user is logged in
if 'user_token' in request.cookies:
if (account.verifyUser(request.cookies.get('user_token'))):
resp = make_response(redirect('/'))
resp.set_cookie('user_token', '', expires=0)
return resp
return redirect('/')
@app.route('/dashboard')
def dashboard():
# Check if user is logged in
if 'user_token' in request.cookies:
if (account.verifyUser(request.cookies.get('user_token'))):
# Get user data
user = account.getUser(request.cookies.get('user_token'))
domains = user['domains']
notifications = user['notifications']
email = user['email'] + ' <a href="/test?service=email">Test</a>'
if ('discord' in user['notifications']):
discord = 'Linked (<a href="/link?service=discord">Change</a>) <a href="/test?service=discord">Test</a>'
else:
discord = "<a href='/link?service=discord'>Connect Discord</a>"
if ('telegram' in user['notifications']):
telegram = user['notifications']['telegram'] + ' (<a href="/link?service=telegram">Change</a>) <a href="/test?service=telegram">Test</a>'
else:
# telegram = "<a href='/link?service=telegram'>Connect Telegram</a>"
telegram = "coming soon"
expiry_week = {
"email": True,
"discord": False,
"telegram": False
}
if ('expiry_week' in user['notifications']):
expiry_week = user['notifications']['expiry_week']
expiry_month = {
"email": True,
"discord": False,
"telegram": False
}
if ('expiry_month' in user['notifications']):
expiry_month = user['notifications']['expiry_month']
return render_template('dashboard.html', domains=domains, notifications=notifications,
email=email, discord=discord, telegram=telegram,
expiry_week=expiry_week,expiry_month=expiry_month)
return redirect('/login')
@app.route('/link')
def link_service():
# Check if user is logged in
if 'user_token' in request.cookies:
if (account.verifyUser(request.cookies.get('user_token'))):
# Get user data
user = account.getUser(request.cookies.get('user_token'))
service = request.args.get('service')
service_prompt = service_prompts[service]
if (service in user['notifications']):
return render_template('link.html', service=service, account=user['notifications'][service],
service_prompt=service_prompt)
return render_template('link.html', service=service)
return redirect('/login')
@app.route('/link', methods=['POST'])
def link_service_post():
# Check if user is logged in
if 'user_token' in request.cookies:
if (account.verifyUser(request.cookies.get('user_token'))):
# Get user data
user = account.getUser(request.cookies.get('user_token'))
service = request.args.get('service')
account.updateNotificationProvider(request.cookies.get('user_token'), service, request.form.get('account'))
return redirect('/dashboard')
return redirect('/login')
@app.route('/test')
def test_service():
# Check if user is logged in
if 'user_token' in request.cookies:
if (account.verifyUser(request.cookies.get('user_token'))):
# Get user data
user = account.getUser(request.cookies.get('user_token'))
service = request.args.get('service')
if (service in user['notifications']):
notification_thread = threading.Thread(target=account.sendNotification, args=(service, user['notifications'][service], 'Test Notification','Test notification from HNS Alert'))
notification_thread.start()
elif (service == 'email'):
notification_thread = threading.Thread(target=account.sendNotification, args=(service, user['email'], 'Test Notification','Test notification from HNS Alert'))
notification_thread.start()
return redirect('/dashboard')
@app.route('/notification-options', methods=['POST'])
def notification_options():
# Check if user is logged in
if 'user_token' in request.cookies:
if (account.verifyUser(request.cookies.get('user_token'))):
# Get user data
user = account.getUser(request.cookies.get('user_token'))
notifications = user['notifications']
expiry_week = {
"email": False,
"discord": False,
"telegram": False
}
expiry_month = {
"email": False,
"discord": False,
"telegram": False
}
for key in request.form:
if (key.endswith('_week')):
key = key[:-5]
expiry_week[key] = True
elif (key.endswith('_month')):
key = key[:-6]
expiry_month[key] = True
notifications['expiry_week'] = expiry_week
notifications['expiry_month'] = expiry_month
account.updateNotifications(request.cookies.get('user_token'), notifications)
return redirect('/dashboard')
@app.route('/assets/<path:path>')
def send_assets(path):
return send_from_directory('templates/assets', path)
# region Application
def db_init():
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(255), password VARCHAR(255), admin BOOLEAN, notifications JSON, user_token JSON, domains JSON, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)")
conn.commit()
cursor.close()
conn.close()
print('Database initialized', flush=True)
if __name__ == '__main__':
db_init()
app.run(host='0.0.0.0', port=5000, debug=True)
# endregion

10
requirements.txt Normal file
View File

@ -0,0 +1,10 @@
python-dotenv
requests
flask
jsonify
mysql-connector-python
email-validator
bcrypt
gunicorn
Jinja2
apscheduler

78
server.py Normal file
View File

@ -0,0 +1,78 @@
import time
import mysql.connector
from flask import Flask
from main import app
from main import db_init
import main
from gunicorn.app.base import BaseApplication
import os
import dotenv
from apscheduler.schedulers.background import BackgroundScheduler
import hvac
import sys
import json
dotenv.load_dotenv()
db_config = {
'host': os.getenv('DB_HOST'),
'database': os.getenv('DB_NAME'),
'user': os.getenv('DB_USER'),
'password': os.getenv('DB_PASSWORD')
}
class GunicornApp(BaseApplication):
def __init__(self, app, options=None):
self.options = options or {}
self.application = app
super().__init__()
def load_config(self):
for key, value in self.options.items():
if key in self.cfg.settings and value is not None:
self.cfg.set(key.lower(), value)
def load(self):
return self.application
def establish_database_connection():
while True:
try:
conn = mysql.connector.connect(**db_config)
if conn.is_connected():
print('Connected to database')
break
except mysql.connector.Error as e:
print('Connecting to database...', e)
time.sleep(1)
conn.close()
if __name__ == '__main__':
# scheduler = BackgroundScheduler()
# Run main.update_events every hour
# scheduler.add_job(update_events, 'cron', hour='*')
# Run main.reset_worship_chat every monday at 12am
# scheduler.add_job(reset_worship_chat, 'cron', day_of_week='mon', hour=0, minute=0)
# Run elvanto.refresh_all_tokens every 6 hours
# scheduler.add_job(refresh_oauth_tokens, 'interval', hours=6)
# scheduler.start()
establish_database_connection()
db_init()
workers = os.getenv('WORKERS')
threads = os.getenv('THREADS')
if workers is None:
workers = 1
if threads is None:
threads = 2
workers = int(workers)
threads = int(threads)
options = {
'bind': '0.0.0.0:5000',
'workers': workers,
'threads': threads,
}
gunicorn_app = GunicornApp(app, options)
print('Starting server with ' + str(workers) + ' workers and ' + str(threads) + ' threads', flush=True)
gunicorn_app.run()

83
templates/account.html Normal file
View File

@ -0,0 +1,83 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>Products - HNS Alert</title>
<meta name="twitter:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta property="og:description" content="Alert system for Handshake domains">
<meta property="og:type" content="website">
<meta property="og:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta name="description" content="Alert system for domains on the Handshake chain">
<meta property="og:title" content="HNSAlert">
<meta name="twitter:card" content="summary">
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="192x192" href="assets/img/android-chrome-192x192.png">
<link rel="icon" type="image/png" sizes="512x512" href="assets/img/android-chrome-512x512.png">
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.reflowhq.com/v2/toolkit.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800&amp;display=swap">
</head>
<body>
<nav class="navbar navbar-expand-md sticky-top py-3 navbar-dark" id="mainNav">
<div class="container"><a class="navbar-brand d-flex align-items-center" href="/"><img src="assets/img/server-icon.png" style="margin-right: 20px;"><span>HNS Alert</span></a><a class="btn btn-primary shadow" role="button" href="login">Account</a></div>
</nav>
<section class="py-5">
<div class="container py-5">
<div class="row mb-4 mb-lg-5">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<h2 class="fw-bold">Products</h2>
<p class="text-muted">No matter the project, our team can handle it.&nbsp;</p>
</div>
</div>
<div class="row mx-auto">
<div class="col">
<div data-reflow-type="product-list" data-reflow-layout="cards" data-reflow-order="date_desc" data-reflow-product-link="/product.html?product={id}"></div>
</div>
</div>
</div>
</section>
<footer class="bg-dark">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">Services</h3>
<ul class="list-unstyled">
<li><a href="https://hnshosting.au" target="_blank">Wordpress Hosting</a></li>
<li><a href="https://faucet.woodburn.au" target="_blank">Domain Faucet</a></li>
<li><a href="https://github.com/nathanwoodburn" style="margin-top: 0px;" target="_blank">Other Projects</a></li>
</ul>
</div>
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">About</h3>
<ul class="list-unstyled">
<li><a href="https://github.com/nathanwoodburn" target="_blank">Github</a></li>
<li><a href="https://nathan.woodburn.au" target="_blank">Nathan.Woodburn/</a></li>
<li><a href="https://l.woodburn.au/donate" target="_blank">Donate</a></li>
</ul>
</div>
<div class="col-lg-3 text-center text-lg-start d-flex flex-column align-items-center order-first align-items-lg-start order-lg-last">
<div class="fw-bold d-flex align-items-center mb-2"><img src="assets/img/favicon-32x32.png" style="margin-right: 10px;"><span>HNS Alert</span></div>
<p class="text-muted">A Woodburn/ project</p>
</div>
</div>
<hr>
<div class="text-muted d-flex justify-content-between align-items-center pt-3">
<p class="mb-0">Copyright © 2023 HNS Alert</p>
</div>
</div>
</footer>
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="https://cdn.reflowhq.com/v2/toolkit.min.js"></script>
<script src="assets/js/bs-init.js"></script>
<script src="assets/js/bold-and-dark.js"></script>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,57 @@
.bs-icon {
--bs-icon-size: .75rem;
display: flex;
flex-shrink: 0;
justify-content: center;
align-items: center;
font-size: var(--bs-icon-size);
width: calc(var(--bs-icon-size) * 2);
height: calc(var(--bs-icon-size) * 2);
color: var(--bs-primary);
}
.bs-icon-xs {
--bs-icon-size: 1rem;
width: calc(var(--bs-icon-size) * 1.5);
height: calc(var(--bs-icon-size) * 1.5);
}
.bs-icon-sm {
--bs-icon-size: 1rem;
}
.bs-icon-md {
--bs-icon-size: 1.5rem;
}
.bs-icon-lg {
--bs-icon-size: 2rem;
}
.bs-icon-xl {
--bs-icon-size: 2.5rem;
}
.bs-icon.bs-icon-primary {
color: var(--bs-white);
background: var(--bs-primary);
}
.bs-icon.bs-icon-primary-light {
color: var(--bs-primary);
background: rgba(var(--bs-primary-rgb), .2);
}
.bs-icon.bs-icon-semi-white {
color: var(--bs-primary);
background: rgba(255, 255, 255, .5);
}
.bs-icon.bs-icon-rounded {
border-radius: .5rem;
}
.bs-icon.bs-icon-circle {
border-radius: 50%;
}

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="450pt" height="450pt" viewBox="0 0 450 450" version="1.1" xmlns="http://www.w3.org/2000/svg">
<g id="#f7f7f7ff">
</g>
<g id="#333333ff">
<path fill="#333333" opacity="1.00" d=" M 83.59 105.42 C 105.77 115.60 127.31 127.07 149.26 137.73 C 153.00 139.72 151.62 144.59 152.15 148.04 C 152.20 179.30 151.87 210.58 152.20 241.84 C 174.88 219.56 196.67 196.36 220.02 174.76 C 221.25 205.17 220.19 235.62 220.66 266.05 C 220.63 270.62 221.09 275.95 217.79 279.60 C 195.53 301.09 174.13 323.44 151.92 344.98 C 132.02 335.26 112.33 325.10 92.38 315.49 C 90.05 314.23 87.56 313.21 85.41 311.64 C 82.50 309.39 83.56 305.19 83.22 301.99 C 83.60 236.47 82.86 170.94 83.59 105.42 Z" />
<path fill="#333333" opacity="1.00" d=" M 300.72 137.74 C 322.63 127.04 344.21 115.64 366.32 105.37 C 367.15 172.91 366.41 240.46 366.71 308.00 C 366.02 311.50 362.49 313.08 359.63 314.51 C 338.98 324.40 318.64 334.93 298.06 344.98 C 278.62 326.08 259.74 306.62 240.41 287.60 C 236.90 284.14 233.03 280.92 230.29 276.79 C 228.95 272.66 229.42 268.28 229.33 264.02 C 229.77 234.27 228.73 204.50 229.95 174.77 C 253.31 196.36 275.07 219.58 297.78 241.83 C 297.93 215.58 297.92 189.32 297.81 163.06 C 297.86 156.04 297.57 149.01 298.11 142.00 C 298.19 140.28 299.11 138.48 300.72 137.74 Z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 856 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@ -0,0 +1,826 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="450pt"
height="450pt"
viewBox="0 0 450 450"
version="1.1"
id="svg20"
sodipodi:docname="favicon.svg"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs24" /><sodipodi:namedview
id="namedview22"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:document-units="pt"
showgrid="false" /><image
width="450"
height="450"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfwAAAGuCAYAAAB1FLTvAAAAx3pUWHRSYXcgcHJvZmlsZSB0eXBl
IGV4aWYAAHjabVBbDsMgDPvnFDsCeZTCcWhLpd1gx58hQWq3WiJ2E2qShPZ5n+HVwaRBlzWnklIE
tGjhCpGjoY5IUUccOHdXdM+H2lwyWMBihZyMaeb9h8lUoZaLUd69sN0LRY05/xj5Q9I7YojDjYob
CVuB3KDaWDGVvF5H2Fq8I9sJPWzuOjqK/9+6YnvHgneEuQlJRBRRa0D6kSAVIiEyLqFhUWgaGZI5
EhbytKeJ8AVizVqTyq9J4QAAAYVpQ0NQSUNDIHByb2ZpbGUAAHicfZE9SMNAHMVf02qlVBwsIuKQ
oTpZBxVxLFUsgoXSVmjVweTSL2jSkKS4OAquBQc/FqsOLs66OrgKguAHiKuLk6KLlPi/pNAi1oPj
fry797h7BwiNClNNXxRQNctIxWNiNrcq+l/RiyH4EMCkxEw9kV7MoOv4uoeHr3cRntX93J+jX8mb
DPCIxFGmGxbxBvHspqVz3icOsZKkEJ8TTxh0QeJHrssuv3EuOizwzJCRSc0Th4jFYgfLHcxKhko8
QxxWVI3yhazLCuctzmqlxlr35C8M5rWVNNdpjiKOJSSQhAgZNZRRgYUIrRopJlK0H+viH3H8SXLJ
5CqDkWMBVaiQHD/4H/zu1ixMT7lJwRjQ82LbH2OAfxdo1m37+9i2myeA9xm40tr+agOY+yS93tbC
R8DANnBx3dbkPeByBxh+0iVDciQvTaFQAN7P6JtywOAtEFhze2vt4/QByFBXyzfAwSEwXqTs9S7v
7uvs7d8zrf5+AJcFcrXGVhtUAAAOVWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0
IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4
bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAtRXhpdjIiPgog
PHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50
YXgtbnMjIj4KICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgeG1sbnM6eG1wTU09
Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iCiAgICB4bWxuczpzdEV2dD0iaHR0cDov
L25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIgogICAgeG1sbnM6ZGM9
Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgeG1sbnM6R0lNUD0iaHR0cDov
L3d3dy5naW1wLm9yZy94bXAvIgogICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90
aWZmLzEuMC8iCiAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAg
IHhtcE1NOkRvY3VtZW50SUQ9ImdpbXA6ZG9jaWQ6Z2ltcDoyNmMzMWE3My0xYzYwLTQzMzMtYmMw
Ni01ZWJkZGM3YjgyYmEiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ZGI2YjNkNDgtOThl
ZS00YjdiLWJlZTgtOTViNDdkNTZjZTgyIgogICB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9Inht
cC5kaWQ6ZTllNWUzNGYtNzdiYi00YTY2LWIwNDQtYmE2OTMzMTBjMzE2IgogICBkYzpGb3JtYXQ9
ImltYWdlL3BuZyIKICAgR0lNUDpBUEk9IjIuMCIKICAgR0lNUDpQbGF0Zm9ybT0iV2luZG93cyIK
ICAgR0lNUDpUaW1lU3RhbXA9IjE2ODc0MDczNzU2OTU4MzEiCiAgIEdJTVA6VmVyc2lvbj0iMi4x
MC4zNCIKICAgdGlmZjpPcmllbnRhdGlvbj0iMSIKICAgeG1wOkNyZWF0b3JUb29sPSJHSU1QIDIu
MTAiCiAgIHhtcDpNZXRhZGF0YURhdGU9IjIwMjM6MDY6MjJUMTQ6MTY6MTMrMTA6MDAiCiAgIHht
cDpNb2RpZnlEYXRlPSIyMDIzOjA2OjIyVDE0OjE2OjEzKzEwOjAwIj4KICAgPHhtcE1NOkhpc3Rv
cnk+CiAgICA8cmRmOlNlcT4KICAgICA8cmRmOmxpCiAgICAgIHN0RXZ0OmFjdGlvbj0ic2F2ZWQi
CiAgICAgIHN0RXZ0OmNoYW5nZWQ9Ii8iCiAgICAgIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6
NWI4OWM0ZjItNDMzYS00ZmM2LTk0YTktZTAwYmI1Mjg4NzdmIgogICAgICBzdEV2dDpzb2Z0d2Fy
ZUFnZW50PSJHaW1wIDIuMTAgKFdpbmRvd3MpIgogICAgICBzdEV2dDp3aGVuPSIyMDIzLTA2LTIx
VDE3OjM2OjMwIi8+CiAgICAgPHJkZjpsaQogICAgICBzdEV2dDphY3Rpb249InNhdmVkIgogICAg
ICBzdEV2dDpjaGFuZ2VkPSIvIgogICAgICBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjM0ZDU1
ZGM1LTg1MGUtNDYzMC05MTkwLTcyMzVkNjViMDM2NSIKICAgICAgc3RFdnQ6c29mdHdhcmVBZ2Vu
dD0iR2ltcCAyLjEwIChXaW5kb3dzKSIKICAgICAgc3RFdnQ6d2hlbj0iMjAyMy0wNi0yMlQxNDox
NjoxNSIvPgogICAgPC9yZGY6U2VxPgogICA8L3htcE1NOkhpc3Rvcnk+CiAgPC9yZGY6RGVzY3Jp
cHRpb24+CiA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz5yyhP1AAAABmJL
R0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAB3RJTUUH5wYWBBAP4NPbZQAAIABJ
REFUeNrsvWd7HdeVLvjuqkIiCJLAQQaRCRIECAYAzDkpUZZly7Ll63vnud09bf8Ez0/o/gnu7/Nh
PPOxr7tlOUsixUyRCpSs2JazRNluX9stEbXmwwk4ocLOVedgv/3ALZ5Qp2qH9a619gqAg4ODg4OD
g4ODg4ODg4ODg4ODg4ODg0MTgFX/o7d3y4ULF869AApx69ZtvPveL5gbIgcHBwcHh+bA1sIwjU1N
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
UupO/j8B+sA7XKLE0AAAAABJRU5ErkJggg==
"
id="image192"
x="5.5511151e-17"
y="-1.110223e-16" /></svg>

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

@ -0,0 +1,61 @@
(function() {
"use strict"; // Start of use strict
function initParallax() {
if (!('requestAnimationFrame' in window)) return;
if (/Mobile|Android/.test(navigator.userAgent)) return;
var parallaxItems = document.querySelectorAll('[data-bss-parallax]');
if (!parallaxItems.length) return;
var defaultSpeed = 0.5;
var visible = [];
var scheduled;
window.addEventListener('scroll', scroll);
window.addEventListener('resize', scroll);
scroll();
function scroll() {
visible.length = 0;
for (var i = 0; i < parallaxItems.length; i++) {
var rect = parallaxItems[i].getBoundingClientRect();
var speed = parseFloat(parallaxItems[i].getAttribute('data-bss-parallax-speed'), 10) || defaultSpeed;
if (rect.bottom > 0 && rect.top < window.innerHeight) {
visible.push({
speed: speed,
node: parallaxItems[i]
});
}
}
cancelAnimationFrame(scheduled);
if (visible.length) {
scheduled = requestAnimationFrame(update);
}
}
function update() {
for (var i = 0; i < visible.length; i++) {
var node = visible[i].node;
var speed = visible[i].speed;
node.style.transform = 'translate3d(0, ' + (-window.scrollY * speed) + 'px, 0)';
}
}
}
initParallax();
})(); // End of use strict

View File

@ -0,0 +1,10 @@
document.addEventListener('DOMContentLoaded', function() {
var products = document.querySelectorAll('[data-bss-dynamic-product]');
for (var product of products) {
var param = product.dataset.bssDynamicProductParam;
product.dataset.reflowProduct = new URL(location.href).searchParams.get(param)
}
}, false);

118
templates/contact.html Normal file
View File

@ -0,0 +1,118 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>Contacts - HNS Alert</title>
<meta name="twitter:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta property="og:description" content="Alert system for Handshake domains">
<meta property="og:type" content="website">
<meta property="og:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta name="description" content="Alert system for domains on the Handshake chain">
<meta property="og:title" content="HNSAlert">
<meta name="twitter:card" content="summary">
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="192x192" href="assets/img/android-chrome-192x192.png">
<link rel="icon" type="image/png" sizes="512x512" href="assets/img/android-chrome-512x512.png">
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800&amp;display=swap">
</head>
<body>
<nav class="navbar navbar-expand-md sticky-top py-3 navbar-dark" id="mainNav">
<div class="container"><a class="navbar-brand d-flex align-items-center" href="/"><img src="assets/img/server-icon.png" style="margin-right: 20px;"><span>HNS Alert</span></a><a class="btn btn-primary shadow" role="button" href="login">Account</a></div>
</nav>
<section class="py-5">
<div class="container py-5">
<div class="row mb-5">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<p class="fw-bold text-success mb-2">Contacts</p>
<h2 class="fw-bold">How you can reach us</h2>
</div>
</div>
<div class="row d-flex justify-content-center">
<div class="col-md-6 col-xl-4">
<div>
<form class="p-3 p-xl-4" method="post">
<div class="mb-3"><input class="form-control" type="text" id="name-1" name="name" placeholder="Name"></div>
<div class="mb-3"><input class="form-control" type="email" id="email-1" name="email" placeholder="Email"></div>
<div class="mb-3"><textarea class="form-control" id="message-1" name="message" rows="6" placeholder="Message"></textarea></div>
<div><button class="btn btn-primary shadow d-block w-100" type="submit">Send </button></div>
</form>
</div>
</div>
<div class="col-md-4 col-xl-4 d-flex justify-content-center justify-content-xl-start">
<div class="d-flex flex-wrap flex-md-column justify-content-md-start align-items-md-start h-100">
<div class="d-flex align-items-center p-3">
<div class="bs-icon-md bs-icon-circle bs-icon-primary shadow d-flex flex-shrink-0 justify-content-center align-items-center d-inline-block bs-icon bs-icon-md"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-telephone">
<path d="M3.654 1.328a.678.678 0 0 0-1.015-.063L1.605 2.3c-.483.484-.661 1.169-.45 1.77a17.568 17.568 0 0 0 4.168 6.608 17.569 17.569 0 0 0 6.608 4.168c.601.211 1.286.033 1.77-.45l1.034-1.034a.678.678 0 0 0-.063-1.015l-2.307-1.794a.678.678 0 0 0-.58-.122l-2.19.547a1.745 1.745 0 0 1-1.657-.459L5.482 8.062a1.745 1.745 0 0 1-.46-1.657l.548-2.19a.678.678 0 0 0-.122-.58L3.654 1.328zM1.884.511a1.745 1.745 0 0 1 2.612.163L6.29 2.98c.329.423.445.974.315 1.494l-.547 2.19a.678.678 0 0 0 .178.643l2.457 2.457a.678.678 0 0 0 .644.178l2.189-.547a1.745 1.745 0 0 1 1.494.315l2.306 1.794c.829.645.905 1.87.163 2.611l-1.034 1.034c-.74.74-1.846 1.065-2.877.702a18.634 18.634 0 0 1-7.01-4.42 18.634 18.634 0 0 1-4.42-7.009c-.362-1.03-.037-2.137.703-2.877L1.885.511z"></path>
</svg></div>
<div class="px-2">
<h6 class="fw-bold mb-0">Phone</h6>
<p class="text-muted mb-0">+123456789</p>
</div>
</div>
<div class="d-flex align-items-center p-3">
<div class="bs-icon-md bs-icon-circle bs-icon-primary shadow d-flex flex-shrink-0 justify-content-center align-items-center d-inline-block bs-icon bs-icon-md"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-envelope">
<path d="M0 4a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V4Zm2-1a1 1 0 0 0-1 1v.217l7 4.2 7-4.2V4a1 1 0 0 0-1-1H2Zm13 2.383-4.708 2.825L15 11.105V5.383Zm-.034 6.876-5.64-3.471L8 9.583l-1.326-.795-5.64 3.47A1 1 0 0 0 2 13h12a1 1 0 0 0 .966-.741ZM1 11.105l4.708-2.897L1 5.383v5.722Z"></path>
</svg></div>
<div class="px-2">
<h6 class="fw-bold mb-0">Email</h6>
<p class="text-muted mb-0">info@example.com</p>
</div>
</div>
<div class="d-flex align-items-center p-3">
<div class="bs-icon-md bs-icon-circle bs-icon-primary shadow d-flex flex-shrink-0 justify-content-center align-items-center d-inline-block bs-icon bs-icon-md"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-pin">
<path d="M4.146.146A.5.5 0 0 1 4.5 0h7a.5.5 0 0 1 .5.5c0 .68-.342 1.174-.646 1.479-.126.125-.25.224-.354.298v4.431l.078.048c.203.127.476.314.751.555C12.36 7.775 13 8.527 13 9.5a.5.5 0 0 1-.5.5h-4v4.5c0 .276-.224 1.5-.5 1.5s-.5-1.224-.5-1.5V10h-4a.5.5 0 0 1-.5-.5c0-.973.64-1.725 1.17-2.189A5.921 5.921 0 0 1 5 6.708V2.277a2.77 2.77 0 0 1-.354-.298C4.342 1.674 4 1.179 4 .5a.5.5 0 0 1 .146-.354zm1.58 1.408-.002-.001.002.001zm-.002-.001.002.001A.5.5 0 0 1 6 2v5a.5.5 0 0 1-.276.447h-.002l-.012.007-.054.03a4.922 4.922 0 0 0-.827.58c-.318.278-.585.596-.725.936h7.792c-.14-.34-.407-.658-.725-.936a4.915 4.915 0 0 0-.881-.61l-.012-.006h-.002A.5.5 0 0 1 10 7V2a.5.5 0 0 1 .295-.458 1.775 1.775 0 0 0 .351-.271c.08-.08.155-.17.214-.271H5.14c.06.1.133.191.214.271a1.78 1.78 0 0 0 .37.282z"></path>
</svg></div>
<div class="px-2">
<h6 class="fw-bold mb-0">Location</h6>
<p class="text-muted mb-0">12 Example Street</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<footer class="bg-dark">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">Services</h3>
<ul class="list-unstyled">
<li><a href="https://hnshosting.au" target="_blank">Wordpress Hosting</a></li>
<li><a href="https://faucet.woodburn.au" target="_blank">Domain Faucet</a></li>
<li><a href="https://github.com/nathanwoodburn" style="margin-top: 0px;" target="_blank">Other Projects</a></li>
</ul>
</div>
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">About</h3>
<ul class="list-unstyled">
<li><a href="https://github.com/nathanwoodburn" target="_blank">Github</a></li>
<li><a href="https://nathan.woodburn.au" target="_blank">Nathan.Woodburn/</a></li>
<li><a href="https://l.woodburn.au/donate" target="_blank">Donate</a></li>
</ul>
</div>
<div class="col-lg-3 text-center text-lg-start d-flex flex-column align-items-center order-first align-items-lg-start order-lg-last">
<div class="fw-bold d-flex align-items-center mb-2"><img src="assets/img/favicon-32x32.png" style="margin-right: 10px;"><span>HNS Alert</span></div>
<p class="text-muted">A Woodburn/ project</p>
</div>
</div>
<hr>
<div class="text-muted d-flex justify-content-between align-items-center pt-3">
<p class="mb-0">Copyright © 2023 HNS Alert</p>
</div>
</div>
</footer>
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bold-and-dark.js"></script>
</body>
</html>

116
templates/dashboard.html Normal file
View File

@ -0,0 +1,116 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>Products - HNS Alert</title>
<meta name="twitter:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta property="og:description" content="Alert system for Handshake domains">
<meta property="og:type" content="website">
<meta property="og:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta name="description" content="Alert system for domains on the Handshake chain">
<meta property="og:title" content="HNSAlert">
<meta name="twitter:card" content="summary">
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="192x192" href="assets/img/android-chrome-192x192.png">
<link rel="icon" type="image/png" sizes="512x512" href="assets/img/android-chrome-512x512.png">
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800&amp;display=swap">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
</head>
<body>
<nav class="navbar navbar-expand-md sticky-top py-3 navbar-dark" id="mainNav">
<div class="container"><a class="navbar-brand d-flex align-items-center" href="/"><img src="assets/img/server-icon.png" style="margin-right: 20px;"><span>HNS Alert</span></a><a class="btn btn-primary shadow" role="button" href="logout">Logout</a></div>
</nav>
<section class="py-5">
<div class="container py-5">
<div class="row mb-4 mb-lg-5">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<h2 class="fw-bold">Dashboard</h2>
<p class="text-muted">Manage your domains, alerts and notification methods</p>
</div>
</div>
<div class="row mx-auto">
<div class="col">
<div class="card">
<div class="card-body">
<h4 class="card-title">Notification providers</h4>
<h6 class="text-muted card-subtitle mb-2">What notification providers do you want to use</h6>
<ul class="list-group">
<li class="list-group-item"><span>Email: {{email | safe}}</span></li>
<li class="list-group-item"><span>Discord: {{discord | safe}}</span></li>
<li class="list-group-item"><span>Telegram: {{telegram | safe}}</span></li>
</ul>
</div>
</div>
</div>
<div class="col">
<div class="card">
<div class="card-body">
<h4 class="card-title">Notification options</h4>
<h6 class="text-muted card-subtitle mb-2">These are global options. Options set per domain will always be higher priority.</h6>
<form method="post" action="/notification-options">
<ul class="list-group">
<li class="list-group-item"><span style="display: block;">Domain expiry 1 week notice</span>{% for platform, enabled in expiry_week.items() %}
<div class="form-check form-switch form-check-inline">
<input id="formCheck-{{ loop.index }}" class="form-check-input" type="checkbox" name="{{ platform }}_week" {% if enabled %}checked{% endif %}/>
<label class="form-check-label" for="formCheck-{{ loop.index }}">{{ platform|capitalize }}</label>
</div>
{% endfor %}</li>
<li class="list-group-item"><span style="display: block;">Domain expiry 1 month notice</span>{% for platform, enabled in expiry_month.items() %}
<div class="form-check form-switch form-check-inline">
<input id="formCheck-{{ loop.index }}" class="form-check-input" type="checkbox" name="{{ platform }}_month" {% if enabled %}checked{% endif %}/>
<label class="form-check-label" for="formCheck-{{ loop.index }}">{{ platform|capitalize }}</label>
</div>
{% endfor %}</li>
</ul>
<div style="text-align: right;"><input class="btn btn-primary" type="submit" value="Save" style="margin-top: 20px;"></div>
</form>
</div>
</div>
</div>
</div>
</div>
</section>
<footer class="bg-dark">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">Services</h3>
<ul class="list-unstyled">
<li><a href="https://hnshosting.au" target="_blank">Wordpress Hosting</a></li>
<li><a href="https://faucet.woodburn.au" target="_blank">Domain Faucet</a></li>
<li><a href="https://github.com/nathanwoodburn" style="margin-top: 0px;" target="_blank">Other Projects</a></li>
</ul>
</div>
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">About</h3>
<ul class="list-unstyled">
<li><a href="https://github.com/nathanwoodburn" target="_blank">Github</a></li>
<li><a href="https://nathan.woodburn.au" target="_blank">Nathan.Woodburn/</a></li>
<li><a href="https://l.woodburn.au/donate" target="_blank">Donate</a></li>
</ul>
</div>
<div class="col-lg-3 text-center text-lg-start d-flex flex-column align-items-center order-first align-items-lg-start order-lg-last">
<div class="fw-bold d-flex align-items-center mb-2"><img src="assets/img/favicon-32x32.png" style="margin-right: 10px;"><span>HNS Alert</span></div>
<p class="text-muted">A Woodburn/ project</p>
</div>
</div>
<hr>
<div class="text-muted d-flex justify-content-between align-items-center pt-3">
<p class="mb-0">Copyright © 2023 HNS Alert</p>
</div>
</div>
</footer>
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bold-and-dark.js"></script>
</body>
</html>

268
templates/index.html Normal file
View File

@ -0,0 +1,268 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>Home - HNS Alert</title>
<meta name="twitter:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta property="og:description" content="Alert system for Handshake domains">
<meta property="og:type" content="website">
<meta property="og:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta name="description" content="Alert system for domains on the Handshake chain">
<meta property="og:title" content="HNSAlert">
<meta name="twitter:card" content="summary">
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "WebSite",
"name": "HNSAlert",
"url": "https://alert.woodburn.au"
}
</script>
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="192x192" href="assets/img/android-chrome-192x192.png">
<link rel="icon" type="image/png" sizes="512x512" href="assets/img/android-chrome-512x512.png">
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800&amp;display=swap">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
</head>
<body>
<nav class="navbar navbar-expand-md sticky-top py-3 navbar-dark" id="mainNav">
<div class="container"><a class="navbar-brand d-flex align-items-center" href="/"><img src="assets/img/server-icon.png" style="margin-right: 20px;"><span>HNS Alert</span></a><a class="btn btn-primary shadow" role="button" href="login">Account</a></div>
</nav>
<header class="bg-dark">
<div class="container pt-4 pt-xl-5">
<div class="row pt-5">
<div class="col-md-8 col-xl-6 text-center text-md-start mx-auto">
<div class="text-center">
<p class="fw-bold text-success mb-2">HNS Alert</p>
<h1 class="fw-bold">The most customizable alert system for Handshake&nbsp;&nbsp;</h1>
</div>
</div>
<div class="col-12 col-lg-10 mx-auto">
<div class="position-relative" style="display: flex;flex-wrap: wrap;justify-content: flex-end;">
<div style="position: relative;flex: 0 0 45%;transform: translate3d(-15%, 35%, 0);"><img class="img-fluid" data-bss-parallax="" data-bss-parallax-speed="0.8" src="assets/img/products/3.jpg"></div>
<div style="position: relative;flex: 0 0 45%;transform: translate3d(-5%, 20%, 0);"><img class="img-fluid" data-bss-parallax="" data-bss-parallax-speed="0.4" src="assets/img/products/2.jpg"></div>
<div style="position: relative;flex: 0 0 60%;transform: translate3d(0, 0%, 0);"><img class="img-fluid" data-bss-parallax="" data-bss-parallax-speed="0.25" src="assets/img/products/1.jpg"></div>
</div>
</div>
</div>
</div>
</header>
<section style="width: 100%;background: rgb(39,38,46);">
<div class="container bg-dark py-5">
<div class="row">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<p class="fw-bold text-success mb-2">Functions</p>
<h3 class="fw-bold">What HNSAlert can do for you</h3>
</div>
</div>
<div class="py-5 p-lg-5">
<div class="row row-cols-1 row-cols-md-2 mx-auto" style="max-width: 900px;">
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon" style="top: 1rem;right: 1rem;position: absolute;"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-bell text-success">
<path d="M8 16a2 2 0 0 0 2-2H6a2 2 0 0 0 2 2zM8 1.918l-.797.161A4.002 4.002 0 0 0 4 6c0 .628-.134 2.197-.459 3.742-.16.767-.376 1.566-.663 2.258h10.244c-.287-.692-.502-1.49-.663-2.258C12.134 8.197 12 6.628 12 6a4.002 4.002 0 0 0-3.203-3.92L8 1.917zM14.22 12c.223.447.481.801.78 1H1c.299-.199.557-.553.78-1C2.68 10.2 3 6.88 3 6c0-2.42 1.72-4.44 4.005-4.901a1 1 0 1 1 1.99 0A5.002 5.002 0 0 1 13 6c0 .88.32 4.2 1.22 6z"></path>
</svg></div>
<h5 class="fw-bold card-title">Domain Expiry alerts</h5>
<p class="text-muted card-text mb-4">Get an notification a week or month before your domain expires.<br>Never worry about losing a domain again with our options for notifications</p>
</div>
</div>
</div>
<div class="col mb-5">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon" style="top: 1rem;right: 1rem;position: absolute;"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-cash-coin text-success">
<path fill-rule="evenodd" d="M11 15a4 4 0 1 0 0-8 4 4 0 0 0 0 8zm5-4a5 5 0 1 1-10 0 5 5 0 0 1 10 0z"></path>
<path d="M9.438 11.944c.047.596.518 1.06 1.363 1.116v.44h.375v-.443c.875-.061 1.386-.529 1.386-1.207 0-.618-.39-.936-1.09-1.1l-.296-.07v-1.2c.376.043.614.248.671.532h.658c-.047-.575-.54-1.024-1.329-1.073V8.5h-.375v.45c-.747.073-1.255.522-1.255 1.158 0 .562.378.92 1.007 1.066l.248.061v1.272c-.384-.058-.639-.27-.696-.563h-.668zm1.36-1.354c-.369-.085-.569-.26-.569-.522 0-.294.216-.514.572-.578v1.1h-.003zm.432.746c.449.104.655.272.655.569 0 .339-.257.571-.709.614v-1.195l.054.012z"></path>
<path d="M1 0a1 1 0 0 0-1 1v8a1 1 0 0 0 1 1h4.083c.058-.344.145-.678.258-1H3a2 2 0 0 0-2-2V3a2 2 0 0 0 2-2h10a2 2 0 0 0 2 2v3.528c.38.34.717.728 1 1.154V1a1 1 0 0 0-1-1H1z"></path>
<path d="M9.998 5.083 10 5a2 2 0 1 0-3.132 1.65 5.982 5.982 0 0 1 3.13-1.567z"></path>
</svg></div>
<h5 class="fw-bold card-title">Donation alerts</h5>
<p class="text-muted card-text mb-4">Get alerts when a new payment is send to your wallet address. Or import your xpub to watch all addresses for that wallet</p>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon" style="top: 1rem;right: 1rem;position: absolute;"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-pencil-square text-success">
<path d="M15.502 1.94a.5.5 0 0 1 0 .706L14.459 3.69l-2-2L13.502.646a.5.5 0 0 1 .707 0l1.293 1.293zm-1.75 2.456-2-2L4.939 9.21a.5.5 0 0 0-.121.196l-.805 2.414a.25.25 0 0 0 .316.316l2.414-.805a.5.5 0 0 0 .196-.12l6.813-6.814z"></path>
<path fill-rule="evenodd" d="M1 13.5A1.5 1.5 0 0 0 2.5 15h11a1.5 1.5 0 0 0 1.5-1.5v-6a.5.5 0 0 0-1 0v6a.5.5 0 0 1-.5.5h-11a.5.5 0 0 1-.5-.5v-11a.5.5 0 0 1 .5-.5H9a.5.5 0 0 0 0-1H2.5A1.5 1.5 0 0 0 1 2.5v11z"></path>
</svg></div>
<h5 class="fw-bold card-title">Domain update alerts</h5>
<p class="text-muted card-text mb-4">Get notified about any changes to your domain. This can be an early warning in case someone gained access to your wallet.</p>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card shadow-sm">
<div class="card-body px-4 py-5 px-md-5">
<div class="bs-icon-lg d-flex justify-content-center align-items-center mb-3 bs-icon" style="top: 1rem;right: 1rem;position: absolute;"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-chat-quote text-success">
<path d="M2.678 11.894a1 1 0 0 1 .287.801 10.97 10.97 0 0 1-.398 2c1.395-.323 2.247-.697 2.634-.893a1 1 0 0 1 .71-.074A8.06 8.06 0 0 0 8 14c3.996 0 7-2.807 7-6 0-3.192-3.004-6-7-6S1 4.808 1 8c0 1.468.617 2.83 1.678 3.894zm-.493 3.905a21.682 21.682 0 0 1-.713.129c-.2.032-.352-.176-.273-.362a9.68 9.68 0 0 0 .244-.637l.003-.01c.248-.72.45-1.548.524-2.319C.743 11.37 0 9.76 0 8c0-3.866 3.582-7 8-7s8 3.134 8 7-3.582 7-8 7a9.06 9.06 0 0 1-2.347-.306c-.52.263-1.639.742-3.468 1.105z"></path>
<path d="M7.066 6.76A1.665 1.665 0 0 0 4 7.668a1.667 1.667 0 0 0 2.561 1.406c-.131.389-.375.804-.777 1.22a.417.417 0 0 0 .6.58c1.486-1.54 1.293-3.214.682-4.112zm4 0A1.665 1.665 0 0 0 8 7.668a1.667 1.667 0 0 0 2.561 1.406c-.131.389-.375.804-.777 1.22a.417.417 0 0 0 .6.58c1.486-1.54 1.293-3.214.682-4.112z"></path>
</svg></div>
<h5 class="fw-bold card-title">Lorem ipsum dolor sit&nbsp;</h5>
<p class="text-muted card-text mb-4">Erat netus est hendrerit, nullam et quis ad cras porttitor iaculis. Bibendum vulputate cras aenean.</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section>
<div class="container py-5">
<div class="mx-auto" style="max-width: 900px;">
<div class="row row-cols-1 row-cols-md-2 d-flex justify-content-center">
<div class="col mb-4">
<div class="card bg-primary-light">
<div class="card-body text-center px-4 py-5 px-md-5">
<p class="fw-bold text-primary card-text mb-2">Open Source</p>
<h5 class="fw-bold card-title mb-3">Look at the source code of the project to verify it isn't doing anything shady</h5><button class="btn btn-primary btn-sm" type="button">View the source</button>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card bg-secondary-light">
<div class="card-body text-center px-4 py-5 px-md-5">
<p class="fw-bold text-secondary card-text mb-2">Self Hosted</p>
<h5 class="fw-bold card-title mb-3">Host your own alert system to ensure you control all the data</h5><button class="btn btn-secondary btn-sm" type="button">Learn how</button>
</div>
</div>
</div>
<div class="col mb-4">
<div class="card bg-info-light">
<div class="card-body text-center px-4 py-5 px-md-5">
<p class="fw-bold text-info card-text mb-2">Free to use</p>
<h5 class="fw-bold card-title mb-3">HNSAlert is free to use. Please consider donating to help support the development of HNSAlert and other Handshake projects</h5><a class="btn btn-info btn-sm" role="button" href="https://l.woodburn.au/donate">Donate</a>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="py-5 mt-5">
<div class="container py-5">
<div class="row mb-5">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<p class="fw-bold text-success mb-2">Testimonials</p>
<h2 class="fw-bold"><strong>What People Say About us</strong></h2>
<p class="text-muted">No matter the project, our team can handle it.&nbsp;</p>
</div>
</div>
<div class="row row-cols-1 row-cols-sm-2 row-cols-lg-3 d-sm-flex justify-content-sm-center">
<div class="col mb-4">
<div class="d-flex flex-column align-items-center align-items-sm-start">
<p class="bg-dark border rounded border-dark p-4">Nisi sit justo faucibus nec ornare amet, tortor torquent. Blandit class dapibus, aliquet morbi.</p>
<div class="d-flex"><img class="rounded-circle flex-shrink-0 me-3 fit-cover" width="50" height="50" src="assets/img/team/avatar2.jpg">
<div>
<p class="fw-bold text-primary mb-0">John Smith</p>
<p class="text-muted mb-0">Erat netus</p>
</div>
</div>
</div>
</div>
<div class="col mb-4">
<div class="d-flex flex-column align-items-center align-items-sm-start">
<p class="bg-dark border rounded border-dark p-4">Nisi sit justo faucibus nec ornare amet, tortor torquent. Blandit class dapibus, aliquet morbi.</p>
<div class="d-flex"><img class="rounded-circle flex-shrink-0 me-3 fit-cover" width="50" height="50" src="assets/img/team/avatar4.jpg">
<div>
<p class="fw-bold text-primary mb-0">John Smith</p>
<p class="text-muted mb-0">Erat netus</p>
</div>
</div>
</div>
</div>
<div class="col mb-4">
<div class="d-flex flex-column align-items-center align-items-sm-start">
<p class="bg-dark border rounded border-dark p-4">Nisi sit justo faucibus nec ornare amet, tortor torquent. Blandit class dapibus, aliquet morbi.</p>
<div class="d-flex"><img class="rounded-circle flex-shrink-0 me-3 fit-cover" width="50" height="50" src="assets/img/team/avatar5.jpg">
<div>
<p class="fw-bold text-primary mb-0">John Smith</p>
<p class="text-muted mb-0">Erat netus</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section class="py-5">
<div class="container">
<div class="row mb-5">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<p class="fw-bold text-success mb-2">Contact</p>
<h2 class="fw-bold">How you can reach us</h2>
</div>
</div>
<div class="row d-flex justify-content-center">
<div class="col-md-4 col-xl-4 d-flex justify-content-center justify-content-xl-start">
<div class="d-flex flex-wrap flex-md-column justify-content-md-start align-items-md-start h-100">
<div class="d-flex align-items-center p-3">
<div class="bs-icon-md bs-icon-circle bs-icon-primary shadow d-flex flex-shrink-0 justify-content-center align-items-center d-inline-block bs-icon bs-icon-md"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-discord">
<path d="M13.545 2.907a13.227 13.227 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.19 12.19 0 0 0-3.658 0 8.258 8.258 0 0 0-.412-.833.051.051 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.041.041 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032c.001.014.01.028.021.037a13.276 13.276 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019c.308-.42.582-.863.818-1.329a.05.05 0 0 0-.01-.059.051.051 0 0 0-.018-.011 8.875 8.875 0 0 1-1.248-.595.05.05 0 0 1-.02-.066.051.051 0 0 1 .015-.019c.084-.063.168-.129.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.052.052 0 0 1 .053.007c.08.066.164.132.248.195a.051.051 0 0 1-.004.085 8.254 8.254 0 0 1-1.249.594.05.05 0 0 0-.03.03.052.052 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.235 13.235 0 0 0 4.001-2.02.049.049 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.034.034 0 0 0-.02-.019Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612Zm5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612Z"></path>
</svg></div>
<div class="px-2">
<h6 class="fw-bold mb-0">Discord</h6>
<p class="text-muted mb-0">@nathanwoodburn</p>
</div>
</div>
<div class="d-flex align-items-center p-3">
<div class="bs-icon-md bs-icon-circle bs-icon-primary shadow d-flex flex-shrink-0 justify-content-center align-items-center d-inline-block bs-icon bs-icon-md"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-envelope">
<path d="M0 4a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V4Zm2-1a1 1 0 0 0-1 1v.217l7 4.2 7-4.2V4a1 1 0 0 0-1-1H2Zm13 2.383-4.708 2.825L15 11.105V5.383Zm-.034 6.876-5.64-3.471L8 9.583l-1.326-.795-5.64 3.47A1 1 0 0 0 2 13h12a1 1 0 0 0 .966-.741ZM1 11.105l4.708-2.897L1 5.383v5.722Z"></path>
</svg></div>
<div class="px-2">
<h6 class="fw-bold mb-0">Email</h6>
<p class="text-muted mb-0"><a href="mailto:support@hnshosting.au">support@hnshosting.au</a></p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<footer class="bg-dark">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">Services</h3>
<ul class="list-unstyled">
<li><a href="https://hnshosting.au" target="_blank">Wordpress Hosting</a></li>
<li><a href="https://faucet.woodburn.au" target="_blank">Domain Faucet</a></li>
<li><a href="https://github.com/nathanwoodburn" style="margin-top: 0px;" target="_blank">Other Projects</a></li>
</ul>
</div>
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">About</h3>
<ul class="list-unstyled">
<li><a href="https://github.com/nathanwoodburn" target="_blank">Github</a></li>
<li><a href="https://nathan.woodburn.au" target="_blank">Nathan.Woodburn/</a></li>
<li><a href="https://l.woodburn.au/donate" target="_blank">Donate</a></li>
</ul>
</div>
<div class="col-lg-3 text-center text-lg-start d-flex flex-column align-items-center order-first align-items-lg-start order-lg-last">
<div class="fw-bold d-flex align-items-center mb-2"><img src="assets/img/favicon-32x32.png" style="margin-right: 10px;"><span>HNS Alert</span></div>
<p class="text-muted">A Woodburn/ project</p>
</div>
</div>
<hr>
<div class="text-muted d-flex justify-content-between align-items-center pt-3">
<p class="mb-0">Copyright © 2023 HNS Alert</p>
</div>
</div>
</footer>
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bold-and-dark.js"></script>
</body>
</html>

100
templates/link.html Normal file
View File

@ -0,0 +1,100 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>Products - HNS Alert</title>
<meta name="twitter:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta property="og:description" content="Alert system for Handshake domains">
<meta property="og:type" content="website">
<meta property="og:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta name="description" content="Alert system for domains on the Handshake chain">
<meta property="og:title" content="HNSAlert">
<meta name="twitter:card" content="summary">
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="192x192" href="assets/img/android-chrome-192x192.png">
<link rel="icon" type="image/png" sizes="512x512" href="assets/img/android-chrome-512x512.png">
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800&amp;display=swap">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
</head>
<body>
<nav class="navbar navbar-expand-md sticky-top py-3 navbar-dark" id="mainNav">
<div class="container"><a class="navbar-brand d-flex align-items-center" href="/"><img src="assets/img/server-icon.png" style="margin-right: 20px;"><span>HNS Alert</span></a><a class="btn btn-primary shadow" role="button" href="logout">Logout</a></div>
</nav>
<section class="py-5">
<div class="container py-5">
<div class="row mx-auto">
<div class="col">
<div class="card">
<div class="card-body">
<section class="position-relative py-4 py-xl-5">
<div class="container">
<div class="row mb-5">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<h2>Link {{service}}</h2>
<p class="w-lg-50">Link {{service}} to allow sending notifications via {{service}}</p>
</div>
</div>
<div class="row d-flex justify-content-center">
<div class="col-md-6 col-xl-4">
<div class="card mb-5">
<div class="card-body d-flex flex-column align-items-center">
<form class="text-center" method="post">
<div class="mb-3"><input class="form-control" type="text" name="account" placeholder="{{service_prompt}}" value="{{account}}"></div>
<div class="mb-3"><button class="btn btn-primary d-block w-100" type="submit">Link</button></div><input class="form-control" type="hidden" name="service" value="{{service}}">
</form>
</div>
</div>
</div>
</div>
</div>
</section>
</div>
</div>
</div>
</div>
</div>
</section>
<footer class="bg-dark">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">Services</h3>
<ul class="list-unstyled">
<li><a href="https://hnshosting.au" target="_blank">Wordpress Hosting</a></li>
<li><a href="https://faucet.woodburn.au" target="_blank">Domain Faucet</a></li>
<li><a href="https://github.com/nathanwoodburn" style="margin-top: 0px;" target="_blank">Other Projects</a></li>
</ul>
</div>
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">About</h3>
<ul class="list-unstyled">
<li><a href="https://github.com/nathanwoodburn" target="_blank">Github</a></li>
<li><a href="https://nathan.woodburn.au" target="_blank">Nathan.Woodburn/</a></li>
<li><a href="https://l.woodburn.au/donate" target="_blank">Donate</a></li>
</ul>
</div>
<div class="col-lg-3 text-center text-lg-start d-flex flex-column align-items-center order-first align-items-lg-start order-lg-last">
<div class="fw-bold d-flex align-items-center mb-2"><img src="assets/img/favicon-32x32.png" style="margin-right: 10px;"><span>HNS Alert</span></div>
<p class="text-muted">A Woodburn/ project</p>
</div>
</div>
<hr>
<div class="text-muted d-flex justify-content-between align-items-center pt-3">
<p class="mb-0">Copyright © 2023 HNS Alert</p>
</div>
</div>
</footer>
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bold-and-dark.js"></script>
</body>
</html>

94
templates/login.html Normal file
View File

@ -0,0 +1,94 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>Log in - HNS Alert</title>
<meta name="twitter:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta property="og:description" content="Alert system for Handshake domains">
<meta property="og:type" content="website">
<meta property="og:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta name="description" content="Alert system for domains on the Handshake chain">
<meta property="og:title" content="HNSAlert">
<meta name="twitter:card" content="summary">
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="192x192" href="assets/img/android-chrome-192x192.png">
<link rel="icon" type="image/png" sizes="512x512" href="assets/img/android-chrome-512x512.png">
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800&amp;display=swap">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
</head>
<body>
<nav class="navbar navbar-expand-md sticky-top py-3 navbar-dark" id="mainNav">
<div class="container"><a class="navbar-brand d-flex align-items-center" href="/"><img src="assets/img/server-icon.png" style="margin-right: 20px;"><span>HNS Alert</span></a><a class="btn btn-primary shadow" role="button" href="login">Account</a></div>
</nav>
<section class="py-5">
<div class="container py-5">
<div class="row mb-4 mb-lg-5">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<p class="fw-bold text-success mb-2">Login</p>
<h2 class="fw-bold">Welcome back</h2>
</div>
</div>
<h3 class="text-center" style="color: rgb(255,0,0);">{{error}}</h3>
<div class="row d-flex justify-content-center">
<div class="col-md-6 col-xl-4">
<div class="card">
<div class="card-body text-center d-flex flex-column align-items-center">
<div class="bs-icon-xl bs-icon-circle bs-icon-primary shadow bs-icon my-4"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-person">
<path d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4Zm-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10c-2.29 0-3.516.68-4.168 1.332-.678.678-.83 1.418-.832 1.664h10Z"></path>
</svg></div>
<form method="post">
<div class="mb-3"><input class="form-control" type="email" name="email" placeholder="Email"></div>
<div class="mb-3"><input class="form-control" type="password" name="password" placeholder="Password"></div>
<div class="mb-3"><button class="btn btn-primary shadow d-block w-100" type="submit">Log in</button></div>
<p class="text-muted"><a href="/signup">Don't have an account?</a></p>
</form>
</div>
</div>
</div>
</div>
</div>
</section>
<footer class="bg-dark">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">Services</h3>
<ul class="list-unstyled">
<li><a href="https://hnshosting.au" target="_blank">Wordpress Hosting</a></li>
<li><a href="https://faucet.woodburn.au" target="_blank">Domain Faucet</a></li>
<li><a href="https://github.com/nathanwoodburn" style="margin-top: 0px;" target="_blank">Other Projects</a></li>
</ul>
</div>
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">About</h3>
<ul class="list-unstyled">
<li><a href="https://github.com/nathanwoodburn" target="_blank">Github</a></li>
<li><a href="https://nathan.woodburn.au" target="_blank">Nathan.Woodburn/</a></li>
<li><a href="https://l.woodburn.au/donate" target="_blank">Donate</a></li>
</ul>
</div>
<div class="col-lg-3 text-center text-lg-start d-flex flex-column align-items-center order-first align-items-lg-start order-lg-last">
<div class="fw-bold d-flex align-items-center mb-2"><img src="assets/img/favicon-32x32.png" style="margin-right: 10px;"><span>HNS Alert</span></div>
<p class="text-muted">A Woodburn/ project</p>
</div>
</div>
<hr>
<div class="text-muted d-flex justify-content-between align-items-center pt-3">
<p class="mb-0">Copyright © 2023 HNS Alert</p>
</div>
</div>
</footer>
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bold-and-dark.js"></script>
</body>
</html>

94
templates/signup.html Normal file
View File

@ -0,0 +1,94 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>Sign up - HNS Alert</title>
<meta name="twitter:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta property="og:description" content="Alert system for Handshake domains">
<meta property="og:type" content="website">
<meta property="og:image" content="https://alert.woodburn.au/assets/img/favicon.png">
<meta name="description" content="Alert system for domains on the Handshake chain">
<meta property="og:title" content="HNSAlert">
<meta name="twitter:card" content="summary">
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="16x16" href="assets/img/favicon-16x16.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="32x32" href="assets/img/favicon-32x32.png" media="(prefers-color-scheme: dark)">
<link rel="icon" type="image/png" sizes="180x180" href="assets/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="192x192" href="assets/img/android-chrome-192x192.png">
<link rel="icon" type="image/png" sizes="512x512" href="assets/img/android-chrome-512x512.png">
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inter:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800&amp;display=swap">
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
</head>
<body>
<nav class="navbar navbar-expand-md sticky-top py-3 navbar-dark" id="mainNav">
<div class="container"><a class="navbar-brand d-flex align-items-center" href="/"><img src="assets/img/server-icon.png" style="margin-right: 20px;"><span>HNS Alert</span></a><a class="btn btn-primary shadow" role="button" href="login">Account</a></div>
</nav>
<section class="py-5">
<div class="container py-5">
<div class="row mb-4 mb-lg-5">
<div class="col-md-8 col-xl-6 text-center mx-auto">
<p class="fw-bold text-success mb-2">Sign up</p>
<h2 class="fw-bold">Welcome</h2>
</div>
</div>
<h3 class="text-center" style="color: rgb(255,0,0);">{{error}}</h3>
<div class="row d-flex justify-content-center">
<div class="col-md-6 col-xl-4">
<div class="card">
<div class="card-body text-center d-flex flex-column align-items-center">
<div class="bs-icon-xl bs-icon-circle bs-icon-primary shadow bs-icon my-4"><svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" fill="currentColor" viewBox="0 0 16 16" class="bi bi-person">
<path d="M8 8a3 3 0 1 0 0-6 3 3 0 0 0 0 6Zm2-3a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm4 8c0 1-1 1-1 1H3s-1 0-1-1 1-4 6-4 6 3 6 4Zm-1-.004c-.001-.246-.154-.986-.832-1.664C11.516 10.68 10.289 10 8 10c-2.29 0-3.516.68-4.168 1.332-.678.678-.83 1.418-.832 1.664h10Z"></path>
</svg></div>
<form method="post">
<div class="mb-3"><input class="form-control" type="email" name="email" placeholder="Email"></div>
<div class="mb-3"><input class="form-control" type="password" name="password" placeholder="Password"></div>
<div class="mb-3"><button class="btn btn-primary shadow d-block w-100" type="submit">Sign up</button></div>
<p class="text-muted">Already have an account?&nbsp;<a href="login.html">Log in</a></p>
</form>
</div>
</div>
</div>
</div>
</div>
</section>
<footer class="bg-dark">
<div class="container py-4 py-lg-5">
<div class="row justify-content-center">
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">Services</h3>
<ul class="list-unstyled">
<li><a href="https://hnshosting.au" target="_blank">Wordpress Hosting</a></li>
<li><a href="https://faucet.woodburn.au" target="_blank">Domain Faucet</a></li>
<li><a href="https://github.com/nathanwoodburn" style="margin-top: 0px;" target="_blank">Other Projects</a></li>
</ul>
</div>
<div class="col-sm-4 col-md-3 text-center text-lg-start d-flex flex-column">
<h3 class="fs-6 fw-bold">About</h3>
<ul class="list-unstyled">
<li><a href="https://github.com/nathanwoodburn" target="_blank">Github</a></li>
<li><a href="https://nathan.woodburn.au" target="_blank">Nathan.Woodburn/</a></li>
<li><a href="https://l.woodburn.au/donate" target="_blank">Donate</a></li>
</ul>
</div>
<div class="col-lg-3 text-center text-lg-start d-flex flex-column align-items-center order-first align-items-lg-start order-lg-last">
<div class="fw-bold d-flex align-items-center mb-2"><img src="assets/img/favicon-32x32.png" style="margin-right: 10px;"><span>HNS Alert</span></div>
<p class="text-muted">A Woodburn/ project</p>
</div>
</div>
<hr>
<div class="text-muted d-flex justify-content-between align-items-center pt-3">
<p class="mb-0">Copyright © 2023 HNS Alert</p>
</div>
</div>
</footer>
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
<script src="assets/js/bold-and-dark.js"></script>
</body>
</html>