feat: Add more donation options

This commit is contained in:
Nathan Woodburn 2024-04-15 21:01:28 +10:00
parent ad95fe796b
commit 3f1225a03a
Signed by: nathanwoodburn
GPG Key ID: 203B000478AD0EF1
53 changed files with 449 additions and 251 deletions

View File

@ -0,0 +1,20 @@
{
"ADA": "Cardano (ADA)",
"ATOM": "Cosmos (ATOM)",
"AVAX": "Avalanche (AVAX)",
"BNB": "Binance Coin (BNB)",
"BTC": "Bitcoin (BTC)",
"CRO": "Crypto.com Coin (CRO)",
"DOT": "Polkadot (DOT)",
"ETH": "Ethereum (ETH)",
"HNS": "Handshake (HNS)",
"MATIC": "Polygon (MATIC)",
"SOL": "Solana (SOL)",
"XMR": "Monero (XMR)",
"XRP": "Ripple (XRP)",
"OSMO": "Osmosis (OSMO)",
"STARS": "Stargaze (STARS)",
"INJ": "Injective (INJ)",
"LIKE": "LikeCoin (LIKE)",
"SCRT": "Secret Network (SCRT)"
}

View File

@ -0,0 +1,31 @@
{
"ETH":"woodburn.au",
"HNS":"woodburn",
"SOL":"woodburn.sol",
"ADA": "$nathanwoodburn",
"MATIC": "woodburn.au",
"BNB": "woodburn.au",
"INJ": "woodburn.sol",
"ATOM": "woodburn_nathan.cosmos",
"OSMO": "woodburn_nathan.osmo",
"SCRT": "woodburn_nathan.secret",
"AKASH": "woodburn_nathan.akash",
"SIF": "woodburn_nathan.sif",
"SHENTU": "woodburn_nathan.shentu",
"IAA": "woodburn_nathan.iaa",
"REGEN": "woodburn_nathan.regen",
"PERSISTENCE": "woodburn_nathan.persistence",
"BOSTROM": "woodburn_nathan.bostrom",
"JUNO": "woodburn_nathan.juno",
"AXELAR": "woodburn_nathan.axelar",
"SOMM": "woodburn_nathan.somm",
"UMEE": "woodburn_nathan.umee",
"GRAVITY": "woodburn_nathan.gravity",
"STRIDE": "woodburn_nathan.stride",
"KAVA": "woodburn_nathan.kava",
"QUICK": "woodburn_nathan.quick",
"TERRA": "woodburn_nathan.terra",
"OMNIFLIX": "woodburn_nathan.omniflix",
"LIKE": "woodburn_nathan.like",
"CHIHUAHUA": "woodburn_nathan.chihuahua"
}

View File

@ -0,0 +1,37 @@
[
{
"symbol": "USDT",
"name": "USDT",
"chain": "ETH"
},
{
"symbol": "USDT",
"name": "USDT",
"chain": "SOL"
},
{
"symbol": "USDC",
"name": "USDC",
"chain": "ETH"
},
{
"symbol": "USDC",
"name": "USDC",
"chain": "SOL"
},
{
"symbol": "WDBRN",
"name": "Woodburn",
"chain": "SOL"
},
{
"symbol": "DAI",
"name": "DAI Stablecoin",
"chain": "ETH"
},
{
"symbol": "RAY",
"name": "Raydium",
"chain": "SOL"
}
]

1
.well-known/wallets/ADA Normal file
View File

@ -0,0 +1 @@
addr1qyudjff2lfuxjjjfz0y542drw4srxq2xxtgrq22vm8ymvwwagq028esaz4rsexct8zzsuds29e03eaykahlvhdx0k9es4gnk27

View File

@ -0,0 +1 @@
akash1ugraczuyfmxy8k38nps4fu7e5derryzxpk2n77

1
.well-known/wallets/ATOM Normal file
View File

@ -0,0 +1 @@
cosmos1ugraczuyfmxy8k38nps4fu7e5derryzxvd858y

1
.well-known/wallets/AVAX Normal file
View File

@ -0,0 +1 @@
0x6cB4B39bEc23a921C9a20D061Bf17d4640B0d39e

View File

@ -0,0 +1 @@
axelar1ugraczuyfmxy8k38nps4fu7e5derryzxgr3uv9

1
.well-known/wallets/BNB Normal file
View File

@ -0,0 +1 @@
0x6cB4B39bEc23a921C9a20D061Bf17d4640B0d39e

View File

@ -0,0 +1 @@
bostrom1ugraczuyfmxy8k38nps4fu7e5derryzx07n8er

View File

@ -0,0 +1 @@
chihuahua1ugraczuyfmxy8k38nps4fu7e5derryzx0c26xx

1
.well-known/wallets/DOT Normal file
View File

@ -0,0 +1 @@
13KSjM7rxFu7SxAuqcNZ76wyjhfuV4Kx8pWfqpFAykSQeEn3

View File

@ -0,0 +1 @@
gravity1ugraczuyfmxy8k38nps4fu7e5derryzxga4vzv

1
.well-known/wallets/IAA Normal file
View File

@ -0,0 +1 @@
iaa1ugraczuyfmxy8k38nps4fu7e5derryzxe08994

1
.well-known/wallets/INJ Normal file
View File

@ -0,0 +1 @@
inj1dj6t8xlvyw5jrjdzp5rphutageqtp5u7wflgv9

1
.well-known/wallets/JUNO Normal file
View File

@ -0,0 +1 @@
juno1ugraczuyfmxy8k38nps4fu7e5derryzx6ly0qc

1
.well-known/wallets/KAVA Normal file
View File

@ -0,0 +1 @@
kava1ugraczuyfmxy8k38nps4fu7e5derryzxscnf3r

1
.well-known/wallets/LIKE Normal file
View File

@ -0,0 +1 @@
like1ugraczuyfmxy8k38nps4fu7e5derryzxl3mkyl

1
.well-known/wallets/LTC Normal file
View File

@ -0,0 +1 @@
ltc1qx79yxm2gwnsrch925343hg3zt3r085x725a0tw

1
.well-known/wallets/NEAR Normal file
View File

@ -0,0 +1 @@
3b06b5e91361739aed92707e888fbbd33f97b24a8a3f8fdd54a2c7e7fd7082a3

View File

@ -0,0 +1 @@
omniflix1ugraczuyfmxy8k38nps4fu7e5derryzx3nkds6

1
.well-known/wallets/OSMO Normal file
View File

@ -0,0 +1 @@
osmo1ugraczuyfmxy8k38nps4fu7e5derryzxyk5y3k

View File

@ -0,0 +1 @@
persistence1ugraczuyfmxy8k38nps4fu7e5derryzxzpp8fq

View File

@ -0,0 +1 @@
quick1ugraczuyfmxy8k38nps4fu7e5derryzx8fhx7k

View File

@ -0,0 +1 @@
regen1ugraczuyfmxy8k38nps4fu7e5derryzxn0vg3q

1
.well-known/wallets/SCRT Normal file
View File

@ -0,0 +1 @@
secret1ugraczuyfmxy8k38nps4fu7e5derryzxwgna6c

1
.well-known/wallets/SENT Normal file
View File

@ -0,0 +1 @@
sent1ugraczuyfmxy8k38nps4fu7e5derryzxhk3drt

View File

@ -0,0 +1 @@
shentu1ugraczuyfmxy8k38nps4fu7e5derryzxyerd4e

1
.well-known/wallets/SIF Normal file
View File

@ -0,0 +1 @@
sif1ugraczuyfmxy8k38nps4fu7e5derryzxfsgzg0

1
.well-known/wallets/SOMM Normal file
View File

@ -0,0 +1 @@
somm1ugraczuyfmxy8k38nps4fu7e5derryzxq3gckw

View File

@ -0,0 +1 @@
stars1ugraczuyfmxy8k38nps4fu7e5derryzxc3sfv4

View File

@ -0,0 +1 @@
stride1ugraczuyfmxy8k38nps4fu7e5derryzx0x8gng

View File

@ -0,0 +1 @@
terra1ugraczuyfmxy8k38nps4fu7e5derryzx2fa59y

1
.well-known/wallets/UMEE Normal file
View File

@ -0,0 +1 @@
umee1ugraczuyfmxy8k38nps4fu7e5derryzx7m6trk

1
.well-known/wallets/XRP Normal file
View File

@ -0,0 +1 @@
rKzdnYvwDyeki5VCgMwjuofjBjAbg3DJnB

110
server.py
View File

@ -1,3 +1,4 @@
import json
from flask import Flask, make_response, redirect, request, jsonify, render_template, send_from_directory
from flask_cors import CORS
import os
@ -83,8 +84,17 @@ def wallet(path):
# Cookie should last 1 week
resp.set_cookie('HNS', address, max_age=604800)
return resp
if path == ".domains":
return send_from_directory('.well-known/wallets', path, mimetype='application/json')
elif os.path.isfile('.well-known/wallets/' + path):
address = ''
with open('.well-known/wallets/' + path) as file:
address = file.read()
address = address.strip()
return make_response(address, 200, {'Content-Type': 'text/plain'})
return send_from_directory('.well-known/wallets', path, mimetype='text/plain')
return render_template('404.html'), 404
@ -93,12 +103,17 @@ def wallet(path):
def index():
global address
global handshake_scripts
git=requests.get('https://git.woodburn.au/api/v1/users/nathanwoodburn/activities/feeds?only-performed-by=true&limit=1&token=' + os.getenv('git_token'))
git = git.json()
git = git[0]
repo_name=git['repo']['name']
repo_name=repo_name.lower()
repo_description=git['repo']['description']
try:
git=requests.get('https://git.woodburn.au/api/v1/users/nathanwoodburn/activities/feeds?only-performed-by=true&limit=1&token=' + os.getenv('git_token'))
git = git.json()
git = git[0]
repo_name=git['repo']['name']
repo_name=repo_name.lower()
repo_description=git['repo']['description']
except:
repo_name = "nathanwoodburn.github.io"
repo_description = "Personal website"
git = {'repo': {'html_url': 'https://example.com', 'name': 'nathanwoodburn.github.io', 'description': 'Personal website'}}
custom = ""
# Check for downtime
@ -201,6 +216,87 @@ def now_old():
return render_template('now/old.html', handshake_scripts=handshake_scripts,now_pages=html)
@app.route('/donate')
def donate():
global handshake_scripts
# If localhost, don't load handshake
if request.host == "localhost:5000" or request.host == "127.0.0.1:5000" or os.getenv('dev') == "true" or request.host == "test.nathan.woodburn.au":
handshake_scripts = ""
coinList = os.listdir('.well-known/wallets')
coinList = [file for file in coinList if file[0] != '.']
coinList.sort()
tokenList = []
with open('.well-known/wallets/.tokens') as file:
tokenList = file.read()
tokenList = json.loads(tokenList)
coinNames = {}
with open('.well-known/wallets/.coins') as file:
coinNames = file.read()
coinNames = json.loads(coinNames)
coins = ''
default_coins = ['btc', 'eth', 'hns','sol','bnb','xrp','ada']
for file in coinList:
if file in coinNames:
coins += f'<a class="dropdown-item" style="{"display:none;" if file.lower() not in default_coins else ""}" href="?c={file.lower()}">{coinNames[file]}</a>'
else:
coins += f'<a class="dropdown-item" style="{"display:none;" if file.lower() not in default_coins else ""}" href="?c={file.lower()}">{file}</a>'
for token in tokenList:
coins += f'<a class="dropdown-item" style="display:none;" href="?t={token["symbol"].lower()}&c={token["chain"].lower()}">{token["name"]} ({token["symbol"] + " on " if token["symbol"] != token["name"] else ""}{token["chain"]})</a>'
crypto = request.args.get('c')
if not crypto:
instructions = '<br>Donate with cryptocurrency:<br>Select a coin from the dropdown above.'
return render_template('donate.html', handshake_scripts=handshake_scripts, coins=coins,default_coins=default_coins, crypto=instructions)
crypto = crypto.upper()
token = request.args.get('t')
if token:
token = token.upper()
for t in tokenList:
if t['symbol'].upper() == token and t['chain'].upper() == crypto:
token = t
break
address = ''
domain = ''
cryptoHTML = ''
if os.path.isfile(f'.well-known/wallets/{crypto}'):
with open(f'.well-known/wallets/{crypto}') as file:
address = file.read()
if not token:
cryptoHTML += f'<br>Donate with {coinNames[crypto] if crypto in coinNames else crypto}:'
else:
cryptoHTML += f'<br>Donate with {token["name"]} {"("+token["symbol"]+") " if token["symbol"] != token["name"] else ""}on {crypto}:'
cryptoHTML += f'<code data-bs-toggle="tooltip" data-bss-tooltip="" id="crypto-address" class="address" style="color: rgb(242,90,5);display: block;" data-bs-original-title="Click to copy">{address}</code>'
else:
cryptoHTML += f'<br>Invalid coin: {crypto}<br>'
if os.path.isfile(f'.well-known/wallets/.domains'):
# Get json of all domains
with open(f'.well-known/wallets/.domains') as file:
domains = file.read()
domains = json.loads(domains)
if crypto in domains:
domain = domains[crypto]
cryptoHTML += '<br>Or send to this domain on compatible wallets:<br>'
cryptoHTML += f'<code data-bs-toggle="tooltip" data-bss-tooltip="" id="crypto-domain" class="address" style="color: rgb(242,90,5);display: block;" data-bs-original-title="Click to copy">{domain}</code>'
copyScript = '<script>document.getElementById("crypto-address").addEventListener("click", function() {navigator.clipboard.writeText(this.innerText);this.setAttribute("data-bs-original-title", "Copied!");});document.getElementById("crypto-domain").addEventListener("click", function() {navigator.clipboard.writeText(this.innerText);this.setAttribute("data-bs-original-title", "Copied!");});</script>'
cryptoHTML += copyScript
return render_template('donate.html', handshake_scripts=handshake_scripts, crypto=cryptoHTML, coins=coins,default_coins=default_coins)
@app.route('/<path:path>')
def catch_all(path):
global handshake_scripts

View File

@ -36,23 +36,6 @@
<link rel="stylesheet" href="/assets/css/fixes.min.css">
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>

View File

@ -33,23 +33,6 @@
<link rel="stylesheet" href="/assets/css/styles.min.css">
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>

1
templates/assets/css/now.min.css vendored Normal file
View File

@ -0,0 +1 @@
body{background-color:#000!important}

192
templates/donate.html Normal file
View File

@ -0,0 +1,192 @@
<!DOCTYPE html>
<html data-bs-theme="light" lang="en-au">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, shrink-to-fit=no">
<title>Nathan.Woodburn/</title>
<meta name="theme-color" content="#97009a">
<link rel="canonical" href="https://nathan.woodburn.au/donate">
<meta property="og:url" content="https://nathan.woodburn.au/donate">
<meta http-equiv="onion-location" content="http://wdbrncwefot4hd7bdrz5rzb74mefay7zvrjn2vmkpdm44l7fwnih5ryd.onion">
<meta name="twitter:description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
<meta name="description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
<meta property="og:title" content="Nathan.Woodburn/">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://nathan.woodburn.au/assets/img/profile.jpg">
<meta property="og:image" content="https://nathan.woodburn.au/assets/img/profile.jpg">
<meta property="og:type" content="website">
<meta name="twitter:title" content="Nathan.Woodburn/">
<meta property="og:description" content="G'day, this is my personal website. You can find out about me or check out some of my projects.">
<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="32x32" href="/assets/img/favicon-32x32.png">
<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="manifest" href="/manifest.json" crossorigin="use-credentials">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic&amp;display=swap">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Cabin:700&amp;display=swap">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Anonymous+Pro&amp;display=swap">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700">
<link rel="stylesheet" href="/assets/fonts/fontawesome-all.min.css">
<link rel="stylesheet" href="/assets/fonts/font-awesome.min.css">
<link rel="stylesheet" href="/assets/fonts/fontawesome5-overrides.min.css">
<link rel="stylesheet" href="/assets/css/styles.min.css">
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>
<body id="page-top" data-bs-spy="scroll" data-bs-target="#mainNav" data-bs-offset="77">{{handshake_scripts | safe}}
<nav class="navbar navbar-expand-md fixed-top navbar-light" id="mainNav" style="background: var(--bs-navbar-hover-color);">
<div class="container-fluid"><a class="navbar-brand nathanwoodburn" href="/#">Nathan.Woodburn/</a><button data-bs-toggle="collapse" class="navbar-toggler navbar-toggler-right" data-bs-target="#navbarResponsive" type="button" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation" value="Menu"><i class="fa fa-bars"></i></button>
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ms-auto">
<li class="nav-item nav-link"><a class="nav-link" href="/">Home</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="/projects">Projects</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="/now">Now</a></li>
</ul>
</div>
</div>
</nav>
<section class="text-center content-section" id="donate" style="background: #110033;">
<div class="container">
<div class="row">
<div class="col-lg-8 mx-auto">
<h2>Donate</h2>
<p style="margin-bottom: 10px;">Feel free to support me by donating</p>
<ul class="list-inline banner-social-buttons">
<li class="list-inline-item" style="margin-top: 15px;">&nbsp;<a class="btn btn-primary btn-lg btn-default" role="button" href="https://paypal.me/nathanwoodburn" target="_blank" style="width: auto;"><i class="fab fa-paypal fa-fw"></i><span class="network-name">&nbsp; Paypal</span></a></li>
<li class="list-inline-item" style="margin-top: 15px;">&nbsp;<a class="btn btn-primary btn-lg btn-default" role="button" href="https://github.com/sponsors/Nathanwoodburn" target="_blank" style="width: auto;"><i class="fab fa-github fa-fw"></i><span class="network-name">&nbsp; Github</span></a></li>
<li class="list-inline-item" style="margin-top: 15px;">&nbsp;<a class="btn btn-primary btn-lg btn-default" role="button" href="https://donate.stripe.com/8wM6pv0VD08Xe408ww" target="_blank" style="width: auto;"><i class="fab fa-stripe-s fa-fw"></i><span class="network-name">&nbsp;Stripe</span></a></li>
<li class="list-inline-item" style="margin-top: 15px;">&nbsp;<a class="btn btn-primary btn-lg btn-default" role="button" href="https://revolut.me/nwoodburn" target="_blank" style="width: auto;"><span class="network-name">&nbsp;Revolut</span></a></li>
</ul>
<h4>Crypto Options</h4><div class="dropdown">
<button class="btn btn-primary" aria-expanded="false" data-bs-toggle="dropdown" type="button" id="dropdownButton">Select Crypto</button>
<div class="dropdown-menu dropdown-menu-dark">
<input type="text" id="cryptoSearch" class="form-control" placeholder="Search for more cryptos..." autocomplete="off">
<div id="cryptoList">
{{coins|safe}}
</div>
</div>
</div>
<script>
const dropdownButton = document.getElementById('dropdownButton');
const cryptoSearch = document.getElementById('cryptoSearch');
dropdownButton.addEventListener('click', function() {
setTimeout(() => cryptoSearch.focus(), 0);
});
document.getElementById('cryptoSearch').addEventListener('input', function() {
const searchValue = this.value.toLowerCase();
const cryptoList = document.getElementById('cryptoList').getElementsByTagName('a');
if (searchValue === '') {
// Show default coins
const defaultCoins = {{default_coins|tojson}};
for (let i = 0; i < cryptoList.length; i++) {
const cryptoName = cryptoList[i].getAttribute('href').split('=')[1];
if (defaultCoins.includes(cryptoName)) {
cryptoList[i].style.display = '';
} else {
cryptoList[i].style.display = 'none';
}
}
} else {
// Filter based on search input
for (let i = 0; i < cryptoList.length; i++) {
const cryptoName = cryptoList[i].textContent.toLowerCase();
if (cryptoName.indexOf(searchValue) > -1) {
cryptoList[i].style.display = '';
} else {
cryptoList[i].style.display = 'none';
}
}
}
});
document.getElementById('cryptoSearch').addEventListener('keydown', function(event) {
if (event.key === 'Enter') {
event.preventDefault(); // Prevent form submission
// Get the first visible crypto and redirect to it
const cryptoList = document.getElementById('cryptoList').getElementsByTagName('a');
for (let i = 0; i < cryptoList.length; i++) {
if (cryptoList[i].style.display === '') {
window.location.href = cryptoList[i].getAttribute('href');
break;
}
}
}
});
</script>
<p>{{crypto|safe}}</p>
</div>
</div>
</div>
</section>
<footer style="background: #110033;">
<div class="container text-center">
<div class="row">
<div class="col">
<p>Verify me with this <a href="pgp" target="_blank">long lifetime Public Key</a> or this <a href="gitpgp" target="_blank">short term one for Github commits</a></p>
</div>
</div>
<div class="row">
<div class="col">
<p class="d-none d-print-inline-block d-sm-inline-block d-md-inline-block d-lg-inline-block d-xl-inline-block d-xxl-inline-block">This site is also available on<br><a href="https://learn.namebase.io/" target="_blank">Handshake</a>&nbsp;at <a href="https://nathan.woodburn">https://nathan.woodburn/</a><br><a href="https://www.torproject.org/" target="_blank">Tor</a> at <a href="http://wdbrncwefot4hd7bdrz5rzb74mefay7zvrjn2vmkpdm44l7fwnih5ryd.onion/">http://wdbrncwefot4hd7bdrz5rzb74mefay7zvrjn2vmkpdm44l7fwnih5ryd.onion/</a></p>
<p class="copyright">Copyright ©&nbsp;Nathan.Woodburn/ 2024</p>
</div>
</div>
</div>
</footer><script>
function copyToClipboard(element) {
const textToCopy = element.textContent;
const textArea = document.createElement('textarea');
textArea.value = textToCopy;
document.body.appendChild(textArea);
textArea.select();
document.execCommand('copy');
document.body.removeChild(textArea);
}
const btc = document.getElementById('btc');
const eth = document.getElementById('eth');
const hns = document.getElementById('hns');
const sol = document.getElementById('sol');
const hnsdomain = document.getElementById('hns-domain');
const soldomain = document.getElementById('sol-domain');
const ethdomain = document.getElementById('eth-domain');
btc.addEventListener('click', () => {
copyToClipboard(btc);
});
eth.addEventListener('click', () => {
copyToClipboard(eth);
});
hns.addEventListener('click', () => {
copyToClipboard(hns);
});
sol.addEventListener('click', () => {
copyToClipboard(sol);
});
hnsdomain.addEventListener('click', () => {
copyToClipboard(hnsdomain);
});
soldomain.addEventListener('click', () => {
copyToClipboard(soldomain);
});
ethdomain.addEventListener('click', () => {
copyToClipboard(ethdomain);
});
</script>{{custom | safe}}
<script src="/assets/bootstrap/js/bootstrap.min.js"></script>
<script src="/assets/js/script.min.js"></script>
<script src="/assets/js/hacker.min.js"></script>
</body>
</html>

View File

@ -33,23 +33,6 @@
<link rel="stylesheet" href="/assets/css/styles.min.css">
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>

View File

@ -47,23 +47,6 @@
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="stylesheet" href="/assets/css/swiper.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>
@ -73,7 +56,7 @@
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ms-auto">
<li class="nav-item nav-link"><a class="nav-link" href="/">Home</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="projects">Projects</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="/projects">Projects</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="/now">Now</a></li>
</ul>
</div>
@ -231,7 +214,7 @@ Check them out here!</blockquote><img class="img-fluid" src="/assets/img/pfront.
<li class="list-inline-item">&nbsp;<a class="btn btn-primary btn-lg btn-default" role="button" href="https://github.com/sponsors/Nathanwoodburn" style="width: 170px;" target="_blank"><i class="fab fa-github fa-fw"></i><span class="network-name">&nbsp; Github</span></a></li>
<li class="list-inline-item">&nbsp;<a class="btn btn-primary btn-lg btn-default" role="button" href="https://donate.stripe.com/8wM6pv0VD08Xe408ww" style="width: 170px;" target="_blank"><i class="fab fa-stripe-s fa-fw"></i><span class="network-name">&nbsp;Stripe</span></a></li>
</ul>
<p>HNS:<br><code data-bs-toggle="tooltip" data-bss-tooltip="" id="hns" class="hns" style="color: rgb(242,90,5);" title="Click to copy">{{HNS}}</code><br>BTC:<br><code data-bs-toggle="tooltip" data-bss-tooltip="" id="btc" class="btc" style="color: rgb(242,90,5);" title="Click to copy">bc1qhs94zzcw64qnwq4hvk056rwxwvgrkd7tq7d4xw</code><br>ETH:<br><code data-bs-toggle="tooltip" data-bss-tooltip="" id="eth" class="eth" style="color: rgb(242,90,5);" title="Click to copy">0x6cB4B39bEc23a921C9a20D061Bf17d4640B0d39e</code></p>
<p>HNS:<br><code data-bs-toggle="tooltip" data-bss-tooltip="" id="hns-domain" class="hns" style="color: rgb(242,90,5);display: block;" title="Click to copy">nathan.woodburn</code><code data-bs-toggle="tooltip" data-bss-tooltip="" id="hns" class="hns" style="color: rgb(242,90,5);display: block;" title="Click to copy">{{HNS}}</code><br>BTC:<br><code data-bs-toggle="tooltip" data-bss-tooltip="" id="btc" class="btc" style="color: rgb(242,90,5);display: block;" title="Click to copy">bc1qhs94zzcw64qnwq4hvk056rwxwvgrkd7tq7d4xw</code><br>SOL:<br><code data-bs-toggle="tooltip" data-bss-tooltip="" id="sol-domain" class="sol" style="color: rgb(242,90,5);display: block;" title="Click to copy">woodburn.sol</code><code data-bs-toggle="tooltip" data-bss-tooltip="" id="sol" class="sol" style="color: rgb(242,90,5);display: block;" title="Click to copy">AJsPEEe6S7XSiVcdZKbeV8GRp1QuhFUsG8mLrqL4XgiU</code><br>ETH:<br><code data-bs-toggle="tooltip" data-bss-tooltip="" id="eth-domain" class="eth" style="color: rgb(242,90,5);display: block;" title="Click to copy">woodburn.au</code><code data-bs-toggle="tooltip" data-bss-tooltip="" id="eth" class="eth" style="color: rgb(242,90,5);display: block;" title="Click to copy">0x6cB4B39bEc23a921C9a20D061Bf17d4640B0d39e</code><a class="btn btn-primary btn-default" role="button" href="/donate" style="width: 170px;">OTHER OPTIONS</a></p>
</div>
</div>
</div>
@ -264,6 +247,10 @@ Check them out here!</blockquote><img class="img-fluid" src="/assets/img/pfront.
const btc = document.getElementById('btc');
const eth = document.getElementById('eth');
const hns = document.getElementById('hns');
const sol = document.getElementById('sol');
const hnsdomain = document.getElementById('hns-domain');
const soldomain = document.getElementById('sol-domain');
const ethdomain = document.getElementById('eth-domain');
btc.addEventListener('click', () => {
copyToClipboard(btc);
@ -274,6 +261,19 @@ Check them out here!</blockquote><img class="img-fluid" src="/assets/img/pfront.
hns.addEventListener('click', () => {
copyToClipboard(hns);
});
sol.addEventListener('click', () => {
copyToClipboard(sol);
});
hnsdomain.addEventListener('click', () => {
copyToClipboard(hnsdomain);
});
soldomain.addEventListener('click', () => {
copyToClipboard(soldomain);
});
ethdomain.addEventListener('click', () => {
copyToClipboard(ethdomain);
});
</script>{{custom | safe}}
<script src="/assets/bootstrap/js/bootstrap.min.js"></script>
<script src="/assets/js/script.min.js"></script>

View File

@ -37,23 +37,6 @@
<link rel="stylesheet" href="/assets/css/GridSystem-1.min.css">
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>

View File

@ -36,25 +36,9 @@ Find out what I've been up to in the last week">
<link rel="stylesheet" href="/assets/fonts/font-awesome.min.css">
<link rel="stylesheet" href="/assets/fonts/ionicons.min.css">
<link rel="stylesheet" href="/assets/css/styles.min.css">
<link rel="stylesheet" href="/assets/css/now.min.css">
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>
@ -64,7 +48,7 @@ Find out what I've been up to in the last week">
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ms-auto">
<li class="nav-item nav-link"><a class="nav-link" href="/">Home</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="projects">Projects</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="/projects">Projects</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="/now">Now</a></li>
</ul>
</div>

View File

@ -36,25 +36,9 @@ Find out what I've been up to in the last week">
<link rel="stylesheet" href="/assets/fonts/font-awesome.min.css">
<link rel="stylesheet" href="/assets/fonts/ionicons.min.css">
<link rel="stylesheet" href="/assets/css/styles.min.css">
<link rel="stylesheet" href="/assets/css/now.min.css">
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>
@ -64,7 +48,7 @@ Find out what I've been up to in the last week">
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ms-auto">
<li class="nav-item nav-link"><a class="nav-link" href="/">Home</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="projects">Projects</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="/projects">Projects</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="/now">Now</a></li>
</ul>
</div>

View File

@ -36,25 +36,9 @@ Find out what I've been up to in the last week">
<link rel="stylesheet" href="/assets/fonts/font-awesome.min.css">
<link rel="stylesheet" href="/assets/fonts/ionicons.min.css">
<link rel="stylesheet" href="/assets/css/styles.min.css">
<link rel="stylesheet" href="/assets/css/now.min.css">
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>
@ -64,7 +48,7 @@ Find out what I've been up to in the last week">
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ms-auto">
<li class="nav-item nav-link"><a class="nav-link" href="/">Home</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="projects">Projects</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="/projects">Projects</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="/now">Now</a></li>
</ul>
</div>

View File

@ -36,25 +36,9 @@ Find out what I've been up to in the last week">
<link rel="stylesheet" href="/assets/fonts/font-awesome.min.css">
<link rel="stylesheet" href="/assets/fonts/ionicons.min.css">
<link rel="stylesheet" href="/assets/css/styles.min.css">
<link rel="stylesheet" href="/assets/css/now.min.css">
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>
@ -64,7 +48,7 @@ Find out what I've been up to in the last week">
<div class="collapse navbar-collapse" id="navbarResponsive">
<ul class="navbar-nav ms-auto">
<li class="nav-item nav-link"><a class="nav-link" href="/">Home</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="projects">Projects</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="/projects">Projects</a></li>
<li class="nav-item nav-link"><a class="nav-link" href="/now">Now</a></li>
</ul>
</div>

View File

@ -33,23 +33,6 @@
<link rel="stylesheet" href="/assets/css/styles.min.css">
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>

View File

@ -34,23 +34,6 @@
<link rel="stylesheet" href="/assets/css/podcast.min.css">
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>

View File

@ -34,23 +34,6 @@
<link rel="stylesheet" href="/assets/css/styles.min.css">
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>

View File

@ -34,23 +34,6 @@
<link rel="stylesheet" href="/assets/css/Footer-Dark-icons.min.css">
<link rel="stylesheet" href="/assets/css/resume.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>

View File

@ -34,23 +34,6 @@
<link rel="stylesheet" href="/assets/css/styles.min.css">
<link rel="stylesheet" href="/assets/css/profile.min.css">
<link rel="me" href="https://mastodon.woodburn.au/@nathanwoodburn" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.woodburn.au/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<script async src="https://umami.woodburn.au/script.js" data-website-id="6a55028e-aad3-481c-9a37-3e096ff75589"></script>
</head>

View File

@ -6,6 +6,9 @@
<url>
<loc>https://nathan.woodburn.au/now/24_02_25</loc>
</url>
<url>
<loc>https://nathan.woodburn.au/now/24_04_14</loc>
</url>
<url>
<loc>https://nathan.woodburn.au/now/old</loc>
</url>
@ -18,6 +21,9 @@
<url>
<loc>https://nathan.woodburn.au/ascii</loc>
</url>
<url>
<loc>https://nathan.woodburn.au/donate</loc>
</url>
<url>
<loc>https://nathan.woodburn.au/gitpgp</loc>
</url>