mirror of https://github.com/lukechilds/lnbits.git
Arc
5 years ago
committed by
GitHub
9 changed files with 1515 additions and 0 deletions
@ -0,0 +1,7 @@ |
|||
# LNEVENTS |
|||
## Create/sell tickets for an event |
|||
Events is an easy way to create/sell tickets for an event. |
|||
|
|||
It is advised to setup a specific wallet in lnbits for the event. |
|||
|
|||
![lnurl](https://i.imgur.com/qHi7ExL.png) |
@ -0,0 +1,8 @@ |
|||
from flask import Blueprint |
|||
|
|||
|
|||
events_ext = Blueprint("events", __name__, static_folder="static", template_folder="templates") |
|||
|
|||
|
|||
from .views_api import * # noqa |
|||
from .views import * # noqa |
@ -0,0 +1,5 @@ |
|||
{ |
|||
"name": "LNEVENTS", |
|||
"short_description": "Make LNURL withdraw links.", |
|||
"ion_icon": "calendar-outline" |
|||
} |
@ -0,0 +1,20 @@ |
|||
CREATE TABLE IF NOT EXISTS events ( |
|||
key INTEGER PRIMARY KEY AUTOINCREMENT, |
|||
usr TEXT, |
|||
wal TEXT, |
|||
walnme TEXT, |
|||
walinvkey INTEGER, |
|||
uni TEXT, |
|||
tit TEXT, |
|||
amt INTEGER, |
|||
sold INTEGER, |
|||
dat TEXT, |
|||
tme TEXT, |
|||
price INTEGER |
|||
); |
|||
|
|||
CREATE TABLE IF NOT EXISTS eventssold ( |
|||
key INTEGER PRIMARY KEY AUTOINCREMENT, |
|||
uni TEXT, |
|||
hash TEXT |
|||
); |
@ -0,0 +1,530 @@ |
|||
<!-- @format --> |
|||
|
|||
<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<meta charset="UTF-8" /> |
|||
<title>LNBits Wallet</title> |
|||
<meta |
|||
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" |
|||
name="viewport" |
|||
/> |
|||
<!-- Bootstrap 3.3.2 --> |
|||
<link |
|||
rel="stylesheet" |
|||
media="screen" |
|||
href="{{ url_for('static', filename='bootstrap/css/bootstrap.min.css') }}" |
|||
/> |
|||
<!-- FontAwesome 4.3.0 --> |
|||
<link |
|||
href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" |
|||
rel="stylesheet" |
|||
type="text/css" |
|||
/> |
|||
<!-- Ionicons 2.0.0 --> |
|||
<link |
|||
href="https://code.ionicframework.com/ionicons/2.0.0/css/ionicons.min.css" |
|||
rel="stylesheet" |
|||
type="text/css" |
|||
/> |
|||
|
|||
<!-- Theme style --> |
|||
<link |
|||
rel="stylesheet" |
|||
media="screen" |
|||
href="{{ url_for('static', filename='dist/css/AdminLTE.min.css') }}" |
|||
/> |
|||
<!-- AdminLTE Skins. Choose a skin from the css/skins |
|||
folder instead of downloading all of them to reduce the load. --> |
|||
|
|||
<link |
|||
rel="stylesheet" |
|||
media="screen" |
|||
href="{{ url_for('static', filename='dist/css/skins/_all-skins.min.css') }}" |
|||
/> |
|||
|
|||
<!-- Morris chart --> |
|||
<link |
|||
rel="stylesheet" |
|||
media="screen" |
|||
href="{{ url_for('static', filename='plugins/morris/morris.css') }}" |
|||
/> |
|||
|
|||
<!-- jvectormap --> |
|||
<link |
|||
rel="stylesheet" |
|||
media="screen" |
|||
href="{{ url_for('static', filename='plugins/jvectormap/jquery-jvectormap-1.2.2.css') }}" |
|||
/> |
|||
|
|||
<!-- bootstrap wysihtml5 - text editor --> |
|||
<link |
|||
rel="stylesheet" |
|||
media="screen" |
|||
href="{{ url_for('static', filename='plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css') }}" |
|||
/> |
|||
|
|||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> |
|||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// --> |
|||
<!--[if lt IE 9]> |
|||
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> |
|||
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> |
|||
<![endif]--> |
|||
|
|||
<style> |
|||
.small-box > .small-box-footer { |
|||
text-align: left; |
|||
padding-left: 10px; |
|||
} |
|||
|
|||
#loadingMessage { |
|||
text-align: center; |
|||
padding: 40px; |
|||
background-color: #eee; |
|||
} |
|||
|
|||
#canvas { |
|||
width: 100%; |
|||
} |
|||
|
|||
#output { |
|||
margin-top: 20px; |
|||
background: #eee; |
|||
padding: 10px; |
|||
padding-bottom: 0; |
|||
} |
|||
|
|||
#output div { |
|||
padding-bottom: 10px; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
#noQRFound { |
|||
text-align: center; |
|||
} |
|||
</style> |
|||
|
|||
<!-- jQuery 2.1.3 --> |
|||
<script src="{{ url_for('static', filename='plugins/jQuery/jQuery-2.1.3.min.js') }}"></script> |
|||
<!-- jQuery UI 1.11.2 --> |
|||
<script |
|||
src="https://code.jquery.com/ui/1.11.2/jquery-ui.min.js" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- Resolve conflict in jQuery UI tooltip with Bootstrap tooltip --> |
|||
<script> |
|||
$.widget.bridge('uibutton', $.ui.button) |
|||
</script> |
|||
<!-- Bootstrap 3.3.2 JS --> |
|||
<script |
|||
src="{{ url_for('static', filename='bootstrap/js/bootstrap.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- Morris.js charts --> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"></script> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/morris/morris.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- Sparkline --> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/sparkline/jquery.sparkline.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- jvectormap --> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/jvectormap/jquery-jvectormap-1.2.2.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/jvectormap/jquery-jvectormap-world-mill-en.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- jQuery Knob Chart --> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/knob/jquery.knob.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- Bootstrap WYSIHTML5 --> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- Slimscroll --> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/slimScroll/jquery.slimscroll.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- FastClick --> |
|||
<script src="{{ url_for('static', filename='plugins/fastclick/fastclick.min.js') }}"></script> |
|||
<!-- AdminLTE App --> |
|||
<script |
|||
src="{{ url_for('static', filename='dist/js/app.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
|
|||
<!-- AdminLTE dashboard demo (This is only for demo purposes) --> |
|||
<script |
|||
src="{{ url_for('static', filename='dist/js/pages/dashboard.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
|
|||
<!-- AdminLTE for demo purposes --> |
|||
<script |
|||
src="{{ url_for('static', filename='dist/js/demo.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
|
|||
<script |
|||
src="{{ url_for('static', filename='plugins/datatables/jquery.dataTables.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<link |
|||
rel="stylesheet" |
|||
href="//cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.css" |
|||
/> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"></script> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.min.js"></script> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/jscam/JS.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/jscam/qrcode.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/bolt11/decoder.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/bolt11/utils.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
|
|||
|
|||
|
|||
<style> |
|||
|
|||
//GOOFY CSS HACK TO GO DARK |
|||
|
|||
.skin-blue .wrapper { |
|||
background: |
|||
#1f2234; |
|||
} |
|||
|
|||
body { |
|||
color: #fff; |
|||
} |
|||
|
|||
.skin-blue .sidebar-menu > li.active > a { |
|||
color: #fff; |
|||
background:#1f2234; |
|||
border-left-color:#8964a9; |
|||
} |
|||
|
|||
.skin-blue .main-header .navbar { |
|||
background-color: |
|||
#2e507d; |
|||
} |
|||
|
|||
.content-wrapper, .right-side { |
|||
background-color: |
|||
#1f2234; |
|||
} |
|||
.skin-blue .main-header .logo { |
|||
background-color: |
|||
#1f2234; |
|||
color: |
|||
#fff; |
|||
} |
|||
|
|||
.skin-blue .sidebar-menu > li.header { |
|||
color: |
|||
#4b646f; |
|||
background: |
|||
#1f2234; |
|||
} |
|||
.skin-blue .wrapper, .skin-blue .main-sidebar, .skin-blue .left-side { |
|||
background: |
|||
#1f2234; |
|||
} |
|||
|
|||
.skin-blue .sidebar-menu > li > .treeview-menu { |
|||
margin: 0 1px; |
|||
background: |
|||
#1f2234; |
|||
} |
|||
|
|||
.skin-blue .sidebar-menu > li > a { |
|||
border-left: 3px solid |
|||
transparent; |
|||
margin-right: 1px; |
|||
} |
|||
.skin-blue .sidebar-menu > li > a:hover, .skin-blue .sidebar-menu > li.active > a { |
|||
|
|||
color: #fff; |
|||
background:#3e355a; |
|||
border-left-color:#8964a9; |
|||
|
|||
} |
|||
|
|||
|
|||
.skin-blue .main-header .logo:hover { |
|||
background: |
|||
#3e355a; |
|||
} |
|||
|
|||
.skin-blue .main-header .navbar .sidebar-toggle:hover { |
|||
background-color: |
|||
#3e355a; |
|||
} |
|||
.main-footer { |
|||
background-color: #1f2234; |
|||
padding: 15px; |
|||
color: #fff; |
|||
border-top: 0px; |
|||
} |
|||
|
|||
.skin-blue .main-header .navbar { |
|||
background-color: #1f2234; |
|||
} |
|||
|
|||
.bg-red, .callout.callout-danger, .alert-danger, .alert-error, .label-danger, .modal-danger .modal-body { |
|||
background-color: |
|||
#1f2234 !important; |
|||
} |
|||
.alert-danger, .alert-error { |
|||
|
|||
border-color: #fff; |
|||
border: 1px solid |
|||
|
|||
#fff; |
|||
border-radius: 7px; |
|||
|
|||
} |
|||
|
|||
.skin-blue .main-header .navbar .nav > li > a:hover, .skin-blue .main-header .navbar .nav > li > a:active, .skin-blue .main-header .navbar .nav > li > a:focus, .skin-blue .main-header .navbar .nav .open > a, .skin-blue .main-header .navbar .nav .open > a:hover, .skin-blue .main-header .navbar .nav .open > a:focus { |
|||
color: |
|||
#f6f6f6; |
|||
background-color: #3e355a; |
|||
} |
|||
.bg-aqua, .callout.callout-info, .alert-info, .label-info, .modal-info .modal-body { |
|||
background-color: |
|||
#3e355a !important; |
|||
} |
|||
|
|||
.box { |
|||
position: relative; |
|||
border-radius: 3px; |
|||
background-color: #333646; |
|||
border-top: 3px solid #8964a9; |
|||
margin-bottom: 20px; |
|||
width: 100%; |
|||
|
|||
} |
|||
.table-striped > tbody > tr:nth-of-type(2n+1) { |
|||
background-color: |
|||
#333646; |
|||
} |
|||
|
|||
.box-header { |
|||
color: #fff; |
|||
|
|||
} |
|||
|
|||
|
|||
.box.box-danger { |
|||
border-top-color: #8964a9; |
|||
} |
|||
.box.box-primary { |
|||
border-top-color: #8964a9; |
|||
} |
|||
|
|||
a { |
|||
color: #8964a9; |
|||
} |
|||
.box-header.with-border { |
|||
border-bottom: none; |
|||
} |
|||
|
|||
a:hover, a:active, a:focus { |
|||
outline: none; |
|||
text-decoration: none; |
|||
color: #fff; |
|||
} |
|||
// .modal.in .modal-dialog{ |
|||
// color:#000; |
|||
// } |
|||
|
|||
.form-control { |
|||
|
|||
background-color:#333646; |
|||
color: #fff; |
|||
|
|||
} |
|||
.box-footer { |
|||
|
|||
border-top: none; |
|||
|
|||
background-color: |
|||
#333646; |
|||
} |
|||
.modal-footer { |
|||
|
|||
border-top: none; |
|||
|
|||
} |
|||
.modal-content { |
|||
|
|||
background-color: |
|||
#333646; |
|||
} |
|||
.modal.in .modal-dialog { |
|||
|
|||
background-color: #333646; |
|||
|
|||
} |
|||
|
|||
.layout-boxed { |
|||
background: none; |
|||
background-color: rgba(0, 0, 0, 0); |
|||
background-color: |
|||
#3e355a; |
|||
} |
|||
|
|||
.skin-blue .sidebar-menu > li > a:hover, .skin-blue .sidebar-menu > li.active > a { |
|||
|
|||
background: none; |
|||
} |
|||
</style> |
|||
|
|||
|
|||
</head> |
|||
<body class="skin-blue layout-boxed sidebar-collapse sidebar-open"> |
|||
<div class="wrapper"> |
|||
<header class="main-header"> |
|||
<!-- Logo --> |
|||
<a href="{{ url_for('core.home') }}" class="logo"><b>LN</b>bits</a> |
|||
<!-- Header Navbar: style can be found in header.less --> |
|||
<nav class="navbar navbar-static-top" role="navigation"> |
|||
<!-- Sidebar toggle button--> |
|||
<a |
|||
href="#" |
|||
class="sidebar-toggle" |
|||
data-toggle="offcanvas" |
|||
role="button" |
|||
> |
|||
<span class="sr-only">Toggle navigation</span> |
|||
</a> |
|||
<div class="navbar-custom-menu"> |
|||
<ul class="nav navbar-nav"> |
|||
<!-- Messages: style can be found in dropdown.less--> |
|||
<li class="dropdown messages-menu"> |
|||
|
|||
{% block messages %}{% endblock %} |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
</nav> |
|||
</header> |
|||
|
|||
<aside class="main-sidebar"> |
|||
<!-- sidebar: style can be found in sidebar.less --> |
|||
<section class="sidebar" style="height: auto;"> |
|||
<!-- Sidebar user panel --> |
|||
|
|||
<!-- /.search form --> |
|||
<!-- sidebar menu: : style can be found in sidebar.less --> |
|||
<ul class="sidebar-menu"> |
|||
<li><br/><br/><a href="https://where39.com/"><p>Where39 anon locations</p><img src="../static/where39.png" style="width:170px"></a></li> |
|||
<li><br/><a href="https://github.com/arcbtc/Quickening"><p>The Quickening <$8 PoS</p><img src="../static/quick.gif" style="width:170px"></a></li> |
|||
<li><br/><a href="https://jigawatt.co/"><p>Buy BTC stamps + electronics</p><img src="../static/stamps.jpg" style="width:170px"></a></li> |
|||
<li><br/><a href="mailto:ben@arc.wales"><h3>Advertise here!</h3></a></li> |
|||
|
|||
</ul> |
|||
</section> |
|||
<!-- /.sidebar --> |
|||
</aside> |
|||
|
|||
<!-- Right side column. Contains the navbar and content of the page --> |
|||
<div class="content-wrapper"> |
|||
<!-- Content Header (Page header) --> |
|||
<section class="content-header"> |
|||
<h1> |
|||
LNURL Withdraw Link |
|||
<small>Use LNURL compatible bitcoin wallet</small> |
|||
</h1> |
|||
|
|||
</section> |
|||
|
|||
<!-- Main content --> |
|||
<section class="content"><br/><br/> |
|||
<center><h1 style="font-size:500%">Withdraw Link: {{ user_fau[0][6] }}</h1></center> |
|||
|
|||
<center><br/><br/> <div id="qrcode" style="width: 340px;"></div><br/><br/> |
|||
<div style="width:55%;word-wrap: break-word;" id="qrcodetxt"></div> <br/></center> |
|||
|
|||
</section><!-- /.content --> |
|||
</div><!-- /.content-wrapper --> |
|||
</div> |
|||
</body> |
|||
|
|||
<script> |
|||
function getAjax(url, thekey, success) { |
|||
var xhr = window.XMLHttpRequest |
|||
? new XMLHttpRequest() |
|||
: new ActiveXObject('Microsoft.XMLHTTP') |
|||
xhr.open('GET', url, true) |
|||
xhr.onreadystatechange = function() { |
|||
if (xhr.readyState > 3 && xhr.status == 200) { |
|||
success(xhr.responseText) |
|||
} |
|||
} |
|||
xhr.setRequestHeader('Grpc-Metadata-macaroon', thekey) |
|||
xhr.setRequestHeader('Content-Type', 'application/json') |
|||
|
|||
xhr.send() |
|||
return xhr |
|||
} |
|||
|
|||
|
|||
function drawwithdraw(data) { |
|||
|
|||
|
|||
console.log(data) |
|||
|
|||
|
|||
getAjax('/withdraw/api/v1/lnurlencode/'+ window.location.hostname + "/" + data, "filla", function(datab) { |
|||
if (JSON.parse(datab).status == 'TRUE') { |
|||
console.log(JSON.parse(datab).status) |
|||
lnurlfau = (JSON.parse(datab).lnurl) |
|||
|
|||
|
|||
new QRCode(document.getElementById('qrcode'), { |
|||
text: lnurlfau, |
|||
width: 300, |
|||
height: 300, |
|||
colorDark: '#000000', |
|||
colorLight: '#ffffff', |
|||
correctLevel: QRCode.CorrectLevel.M |
|||
}) |
|||
document.getElementById("qrcode").style.backgroundColor = "white"; |
|||
document.getElementById("qrcode").style.padding = "20px"; |
|||
|
|||
document.getElementById('qrcodetxt').innerHTML = lnurlfau + "<br/><br/>" |
|||
|
|||
} |
|||
else { |
|||
|
|||
data = "Failed to build LNURL" |
|||
} |
|||
}) |
|||
} |
|||
drawwithdraw("{{ user_fau[0][5] }}") |
|||
|
|||
|
|||
|
|||
|
|||
</script> |
|||
</html> |
@ -0,0 +1,388 @@ |
|||
<!-- @format --> |
|||
|
|||
{% extends "base.html" %} {% block messages %} |
|||
|
|||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> |
|||
<i class="fa fa-bell-o"></i> |
|||
<span class="label label-danger">!</span> |
|||
</a> |
|||
<ul class="dropdown-menu"> |
|||
<li class="header"><b>Instant wallet, bookmark to save</b></li> |
|||
<li></li> |
|||
</ul> |
|||
{% endblock %} {% block menuitems %} |
|||
<li class="treeview"> |
|||
<a href="#"> |
|||
<i class="fa fa-bitcoin"></i> <span>Wallets</span> |
|||
<i class="fa fa-angle-left pull-right"></i> |
|||
</a> |
|||
<ul class="treeview-menu"> |
|||
{% for w in user_wallets %} |
|||
<li> |
|||
<a href="{{ url_for('wallet') }}?wal={{ w.id }}&usr={{ w.user }}" |
|||
><i class="fa fa-bolt"></i> {{ w.name }}</a |
|||
> |
|||
</li> |
|||
{% endfor %} |
|||
<li><a onclick="sidebarmake()">Add a wallet +</a></li> |
|||
<div id="sidebarmake"></div> |
|||
</ul> |
|||
</li> |
|||
|
|||
<li class="active treeview"> |
|||
<a href="#"> |
|||
<i class="fa fa-th"></i> <span>Extensions</span> |
|||
<i class="fa fa-angle-left pull-right"></i> |
|||
</a> |
|||
<ul class="treeview-menu"> |
|||
{% for extension in EXTENSIONS %} |
|||
{% if extension.code in user_ext %} |
|||
<li> |
|||
<a href="{{ url_for(extension.code + '.index') }}?usr={{ user }}"><i class="fa fa-plus"></i> {{ extension.name }}</a> |
|||
</li> |
|||
{% endif %} |
|||
{% endfor %} |
|||
<li> |
|||
<a href="{{ url_for('extensions') }}?usr={{ user }}">Manager </a></li> |
|||
</ul> |
|||
</li> |
|||
|
|||
{% endblock %} {% block body %} |
|||
<!-- Right side column. Contains the navbar and content of the page --> |
|||
<div class="content-wrapper"> |
|||
<!-- Content Header (Page header) --> |
|||
<section class="content-header"> |
|||
<h1> |
|||
Withdraw link maker |
|||
<small>powered by LNURL</small> |
|||
|
|||
</h1> |
|||
<ol class="breadcrumb"> |
|||
<li> |
|||
<a href="{{ url_for('wallet') }}?usr={{ user }}"><i class="fa fa-dashboard"></i> Home</a> |
|||
</li> |
|||
<li> |
|||
<a href="{{ url_for('extensions') }}?usr={{ user }}"><li class="fa fa-dashboard">Extensions</li></a> |
|||
</li> |
|||
<li> |
|||
<i class="active" class="fa fa-dashboard">Lightning tickets</i> |
|||
</li> |
|||
</ol> |
|||
<br /><br /> |
|||
</section> |
|||
|
|||
<!-- Main content --> |
|||
<section class="content"> |
|||
<!-- Small boxes (Stat box) --> |
|||
<div class="row"> |
|||
|
|||
<div class="col-md-6"> |
|||
<!-- general form elements --> |
|||
<div class="box box-primary"> |
|||
<div class="box-header"> |
|||
<h3 class="box-title"> Make a wave</h3> |
|||
</div><!-- /.box-header --> |
|||
<!-- form start --> |
|||
<form role="form"> |
|||
<div class="box-body"> |
|||
|
|||
<div class="form-group"> |
|||
<label for="exampleInputEmail1">Ticket title</label> |
|||
<input id="tit" type="text" pattern="^[A-Za-z]+$" class="form-control" > |
|||
</div> |
|||
<!-- select --> |
|||
<div class="form-group"> |
|||
<label>Select a wallet</label> |
|||
<select id="wal" class="form-control"> |
|||
<option></option> |
|||
{% for w in user_wallets %} |
|||
<option>{{w.name}}-{{w.id}}</option> |
|||
{% endfor %} |
|||
</select> |
|||
</div> |
|||
|
|||
|
|||
<div class="form-group"> |
|||
<label for="nooftickets">No. of tickets</label> |
|||
<input id="notickets" type="number" class="form-control" placeholder="1" max="86400"></input> |
|||
</div> |
|||
|
|||
<div class="form-group"> |
|||
<label for="nooftickets">Date</label> |
|||
<input type="text" class="form-control" data-inputmask="'alias': 'dd/mm/yyyy'" data-mask/> |
|||
</div><!-- /.input group --> |
|||
|
|||
<div class="form-group"> |
|||
<label for="prpertick">Price per ticket</label> |
|||
<input id="prtickets" type="number" class="form-control" placeholder="1"></input> |
|||
</div> |
|||
|
|||
|
|||
</div><!-- /.box-body --> |
|||
|
|||
<div class="box-footer"> |
|||
|
|||
<button onclick="postwave()" type="button" class="btn btn-info">Create wave</button><p style="color:red;" id="error"></p> |
|||
</div> |
|||
</form> |
|||
</div><!-- /.box --> |
|||
</div> |
|||
|
|||
|
|||
|
|||
</div> |
|||
|
|||
<div class="row"> |
|||
<div class="col-md-6"> |
|||
<div class="box"> |
|||
<div class="box-header"> |
|||
<h3 class="box-title">Ticket waves<b id="withdraws"></b></h3> |
|||
</div> |
|||
<!-- /.box-header --> |
|||
<div class="box-body no-padding"> |
|||
<table id="pagnation" class="table table-bswearing anchorordered table-striped"> |
|||
<tr> |
|||
<th>Title</th> |
|||
<th style="width:15%">Amt</th> |
|||
<th style="width:15%">Sold</th> |
|||
<th style="width:15%">Date</th> |
|||
<th style="width:15%">Price</th> |
|||
<th style="width:15%">Wallet</th> |
|||
<th style="width:10%">Edit</th> |
|||
<th style="width:10%">Del</th> |
|||
</tr> |
|||
<tbody id="ticketwaves"></tbody> |
|||
</table> |
|||
</div> |
|||
<!-- /.box-body --> |
|||
</div> |
|||
<!-- /.box --> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
|
|||
<div id="editlink"></div> |
|||
|
|||
<!-- /.content --> |
|||
</section> |
|||
|
|||
<script> |
|||
window.user = {{ user | megajson | safe }} |
|||
window.user_wallets = {{ user_wallets | megajson | safe }} |
|||
window.user_ext = {{ user_ext | megajson | safe }} |
|||
window.user_wav = {{ user_fau | megajson | safe }} |
|||
|
|||
const user_wav = window.user_wav |
|||
console.log(user_wav) |
|||
|
|||
|
|||
function drawChart(user_wav) { |
|||
var transactionsHTML = '' |
|||
|
|||
for (var i = 0; i < user_wav.length; i++) { |
|||
var wv = user_wav[i] |
|||
|
|||
transactionsHTML = |
|||
"<tr><td style='width: 50%'>" + |
|||
wv.tit + |
|||
'</td><td>' + |
|||
wv.nosold + |
|||
'</td><td>' + |
|||
wv.noavail + |
|||
'</td><td>' + |
|||
wv.prpertick + |
|||
'</td><td>' + |
|||
"<a href='{{ url_for('wallet') }}?usr="+ user +"'>" + wv.uni.substring(0, 4) + "...</a>" + |
|||
'</td><td>' + |
|||
"<i onclick='editlink("+ i +")'' class='fa fa-edit'></i>" + |
|||
'</td><td>' + |
|||
"<b><a style='color:red;' href='" + "{{ url_for('withdraw.index') }}?del=" + wv.uni + "&usr=" + user +"'>" + "<i class='fa fa-trash'></i>" + "</a></b>" + |
|||
'</td></tr>' + |
|||
transactionsHTML |
|||
document.getElementById('ticketwaves').innerHTML = transactionsHTML |
|||
|
|||
} |
|||
} |
|||
|
|||
function postwav(){ |
|||
|
|||
wal = document.getElementById('wal').value |
|||
tit = document.getElementById('tit').value |
|||
nooftickets = document.getElementById('nooftickets').value |
|||
prtick = document.getElementById('prtick').value |
|||
|
|||
if (tit == "") { |
|||
document.getElementById("error").innerHTML = "Only use letters in title" |
|||
return amt |
|||
} |
|||
if (wal == "") { |
|||
document.getElementById("error").innerHTML = "No wallet selected" |
|||
return amt |
|||
} |
|||
|
|||
if (isNaN(notickets) || notickets < 1) { |
|||
document.getElementById("error").innerHTML = "Must be more than 1" |
|||
return amt |
|||
} |
|||
if (isNaN(prpertickets) || prpertickets < 10) { |
|||
document.getElementById("error").innerHTML = "Must be higher 10" |
|||
return amt |
|||
} |
|||
|
|||
postAjax( |
|||
"{{ url_for('wave.create') }}", |
|||
JSON.stringify({"tit": tit, "nooftickets": nooftickets, "nooftickets": nooftickets, "prtick": prtick}), |
|||
"filla", |
|||
|
|||
function(data) { location.replace("{{ url_for('wav.index') }}?usr=" + user) |
|||
}) |
|||
|
|||
} |
|||
|
|||
|
|||
function editlink(wavnum){ |
|||
|
|||
wavdetails = user_wav[wavnum] |
|||
|
|||
console.log(wavdetails) |
|||
wallpick = "" |
|||
|
|||
checkbox = "" |
|||
if (wavdetails.uniq == 1){ |
|||
checkbox = "checked"} |
|||
|
|||
document.getElementById('editlink').innerHTML = "<div class='row'>"+ |
|||
"<div class='col-md-6'>"+ |
|||
" <!-- general form elements -->"+ |
|||
"<div class='box box-primary'>"+ |
|||
"<div class='box-header'>"+ |
|||
"<h3 class='box-title'> Edit: <i id='unid'>" + wavdetails.tit + "-" + wavdetails.uni + "</i> </h3>"+ |
|||
"<div class='box-tools pull-right'>" + |
|||
"<button class='btn btn-box-tool' data-widget='remove'><i class='fa fa-times'></i></button>" + |
|||
"</div>" + |
|||
" </div><!-- /.box-header -->"+ |
|||
" <!-- form start -->"+ |
|||
"<form role='form'>"+ |
|||
"<div class='box-body'>"+ |
|||
"<div class='col-sm-3 col-md-4'>"+ |
|||
"<div class='form-group'>"+ |
|||
"<label for='exampleInputEmail1'>Link title</label>"+ |
|||
"<input id='edittit' type='text' class='form-control' value='"+ |
|||
wavdetails.tit + |
|||
"'></input> </div>"+ |
|||
" </div>"+ |
|||
" <div class='col-sm-4 col-md-4'>"+ |
|||
" <!-- select -->"+ |
|||
" <div class='form-group'>"+ |
|||
" <label>Select a wallet</label>"+ |
|||
"<select id='editwal' class='form-control'>"+ |
|||
" <option>" + wavdetails.walnme + "-" + wavdetails.wal + "</option>"+ |
|||
" {% for w in user_wallets %}"+ |
|||
|
|||
" <option>{{w.name}}-{{w.id}}</option>"+ |
|||
|
|||
" {% endfor %}"+ |
|||
" </select>"+ |
|||
" </div>"+ |
|||
" </div>"+ |
|||
" <div class='col-sm-3 col-md-4'>"+ |
|||
"<div class='form-group'>"+ |
|||
" <label for='exampleInputPassword1'>No of tickets:</label>"+ |
|||
" <input id='edittme' type='number' class='form-control' placeholder='0' max='86400' value='"+ |
|||
wavdetails.notickets + |
|||
"'></input>"+ |
|||
"</div> </div>"+ |
|||
" <div class='col-sm-3 col-md-4'>"+ |
|||
"<div class='form-group'>"+ |
|||
"<label for='exampleInputEmail1'>Price per ticket:</label>"+ |
|||
" <input id='editmaxamt' type='number' class='form-control' placeholder='1' value='"+ |
|||
wavdetails.prperticket + |
|||
"'></input>"+ |
|||
" </div></div>"+ |
|||
" <div class='col-sm-3 col-md-4'>"+ |
|||
" <div class='form-group'>"+ |
|||
" <label for='exampleInputEmail1'>Close date:</label>"+ |
|||
" <input id='editminamt' type='number' class='form-control' placeholder='1' value='"+ |
|||
wavdetails.minamt + |
|||
"'></input>"+ |
|||
" </div></div>"+ |
|||
" <div class='col-sm-3 col-md-4'>"+ |
|||
"<div class='form-group'>"+ |
|||
" <label for='exampleInputPassword1'>Amount of uses:</label>"+ |
|||
" <input id='editamt' type='number' class='form-control' placeholder='1' value='"+ |
|||
wavdetails.inc + |
|||
"'></input>"+ |
|||
" </div> </div>"+ |
|||
" <div class='col-sm-3 col-md-4'>"+ |
|||
" <div class='checkbox'>"+ |
|||
"<label data-toggle='tooltip' title='Some tooltip text!'><input id='edituniq' type='checkbox' "+ |
|||
checkbox + |
|||
">"+ |
|||
"Unique links</label>"+ |
|||
"</div></div><!-- /.box-body -->"+ |
|||
" </div><br/>"+ |
|||
" <div class='box-footer'>"+ |
|||
" <button onclick='editlinkcont()' type='button' class='btn btn-info'>Edit link(s)</button><p style='color:red;' id='error2'></p>"+ |
|||
" </div></form></div><!-- /.box --></div></div>" |
|||
|
|||
|
|||
} |
|||
|
|||
function editlinkcont(){ |
|||
|
|||
unid = document.getElementById('unid').innerHTML |
|||
wal = document.getElementById('editwal').value |
|||
tit = document.getElementById('edittit').value |
|||
amt = document.getElementById('editamt').value |
|||
maxamt = document.getElementById('editmaxamt').value |
|||
minamt = document.getElementById('editminamt').value |
|||
tme = document.getElementById('edittme').value |
|||
uniq = document.getElementById('edituniq').checked |
|||
|
|||
|
|||
|
|||
if (tit == "") { |
|||
document.getElementById("error2").innerHTML = "Only use letters in title" |
|||
return amt |
|||
} |
|||
if (wal == "") { |
|||
document.getElementById("error2").innerHTML = "No wallet selected" |
|||
return amt |
|||
} |
|||
|
|||
if (isNaN(maxamt) || maxamt < 10 || maxamt > 1000000) { |
|||
document.getElementById("error2").innerHTML = "Max 10 - 1000000 and must be higher than min" |
|||
return amt |
|||
} |
|||
if (isNaN(minamt) || minamt < 1 || minamt > 1000000 || minamt > maxamt) { |
|||
document.getElementById("error2").innerHTML = "Min 1 - 1000000 and must be lower than max" |
|||
return amt |
|||
} |
|||
|
|||
if (isNaN(amt) || amt < 1 || amt > 1000) { |
|||
document.getElementById("error2").innerHTML = "Amount of uses must be between 1 - 1000" |
|||
return amt |
|||
} |
|||
|
|||
if (isNaN(tme) || tme < 1 || tme > 86400) { |
|||
document.getElementById("error2").innerHTML = "Max waiting time 1 day (86400 secs)" |
|||
return amt |
|||
} |
|||
|
|||
|
|||
postAjax( |
|||
"{{ url_for('withdraw.create') }}", |
|||
JSON.stringify({"id": unid, "tit": tit, "amt": amt, "maxamt": maxamt, "minamt": minamt, "tme": tme, "wal": wal, "usr": user, "uniq": uniq}), |
|||
"filla", |
|||
|
|||
function(data) { location.replace("{{ url_for('withdraw.index') }}?usr=" + user) |
|||
}) |
|||
|
|||
|
|||
|
|||
} |
|||
|
|||
</script> |
|||
</div> |
|||
{% endblock %} |
@ -0,0 +1,530 @@ |
|||
<!-- @format --> |
|||
|
|||
<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<meta charset="UTF-8" /> |
|||
<title>LNBits Wallet</title> |
|||
<meta |
|||
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" |
|||
name="viewport" |
|||
/> |
|||
<!-- Bootstrap 3.3.2 --> |
|||
<link |
|||
rel="stylesheet" |
|||
media="screen" |
|||
href="{{ url_for('static', filename='bootstrap/css/bootstrap.min.css') }}" |
|||
/> |
|||
<!-- FontAwesome 4.3.0 --> |
|||
<link |
|||
href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" |
|||
rel="stylesheet" |
|||
type="text/css" |
|||
/> |
|||
<!-- Ionicons 2.0.0 --> |
|||
<link |
|||
href="https://code.ionicframework.com/ionicons/2.0.0/css/ionicons.min.css" |
|||
rel="stylesheet" |
|||
type="text/css" |
|||
/> |
|||
|
|||
<!-- Theme style --> |
|||
<link |
|||
rel="stylesheet" |
|||
media="screen" |
|||
href="{{ url_for('static', filename='dist/css/AdminLTE.min.css') }}" |
|||
/> |
|||
<!-- AdminLTE Skins. Choose a skin from the css/skins |
|||
folder instead of downloading all of them to reduce the load. --> |
|||
|
|||
<link |
|||
rel="stylesheet" |
|||
media="screen" |
|||
href="{{ url_for('static', filename='dist/css/skins/_all-skins.min.css') }}" |
|||
/> |
|||
|
|||
<!-- Morris chart --> |
|||
<link |
|||
rel="stylesheet" |
|||
media="screen" |
|||
href="{{ url_for('static', filename='plugins/morris/morris.css') }}" |
|||
/> |
|||
|
|||
<!-- jvectormap --> |
|||
<link |
|||
rel="stylesheet" |
|||
media="screen" |
|||
href="{{ url_for('static', filename='plugins/jvectormap/jquery-jvectormap-1.2.2.css') }}" |
|||
/> |
|||
|
|||
<!-- bootstrap wysihtml5 - text editor --> |
|||
<link |
|||
rel="stylesheet" |
|||
media="screen" |
|||
href="{{ url_for('static', filename='plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css') }}" |
|||
/> |
|||
|
|||
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries --> |
|||
<!-- WARNING: Respond.js doesn't work if you view the page via file:// --> |
|||
<!--[if lt IE 9]> |
|||
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script> |
|||
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script> |
|||
<![endif]--> |
|||
|
|||
<style> |
|||
.small-box > .small-box-footer { |
|||
text-align: left; |
|||
padding-left: 10px; |
|||
} |
|||
|
|||
#loadingMessage { |
|||
text-align: center; |
|||
padding: 40px; |
|||
background-color: #eee; |
|||
} |
|||
|
|||
#canvas { |
|||
width: 100%; |
|||
} |
|||
|
|||
#output { |
|||
margin-top: 20px; |
|||
background: #eee; |
|||
padding: 10px; |
|||
padding-bottom: 0; |
|||
} |
|||
|
|||
#output div { |
|||
padding-bottom: 10px; |
|||
word-wrap: break-word; |
|||
} |
|||
|
|||
#noQRFound { |
|||
text-align: center; |
|||
} |
|||
</style> |
|||
|
|||
<!-- jQuery 2.1.3 --> |
|||
<script src="{{ url_for('static', filename='plugins/jQuery/jQuery-2.1.3.min.js') }}"></script> |
|||
<!-- jQuery UI 1.11.2 --> |
|||
<script |
|||
src="https://code.jquery.com/ui/1.11.2/jquery-ui.min.js" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- Resolve conflict in jQuery UI tooltip with Bootstrap tooltip --> |
|||
<script> |
|||
$.widget.bridge('uibutton', $.ui.button) |
|||
</script> |
|||
<!-- Bootstrap 3.3.2 JS --> |
|||
<script |
|||
src="{{ url_for('static', filename='bootstrap/js/bootstrap.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- Morris.js charts --> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"></script> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/morris/morris.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- Sparkline --> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/sparkline/jquery.sparkline.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- jvectormap --> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/jvectormap/jquery-jvectormap-1.2.2.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/jvectormap/jquery-jvectormap-world-mill-en.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- jQuery Knob Chart --> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/knob/jquery.knob.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- Bootstrap WYSIHTML5 --> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- Slimscroll --> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/slimScroll/jquery.slimscroll.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<!-- FastClick --> |
|||
<script src="{{ url_for('static', filename='plugins/fastclick/fastclick.min.js') }}"></script> |
|||
<!-- AdminLTE App --> |
|||
<script |
|||
src="{{ url_for('static', filename='dist/js/app.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
|
|||
<!-- AdminLTE dashboard demo (This is only for demo purposes) --> |
|||
<script |
|||
src="{{ url_for('static', filename='dist/js/pages/dashboard.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
|
|||
<!-- AdminLTE for demo purposes --> |
|||
<script |
|||
src="{{ url_for('static', filename='dist/js/demo.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
|
|||
<script |
|||
src="{{ url_for('static', filename='plugins/datatables/jquery.dataTables.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<link |
|||
rel="stylesheet" |
|||
href="//cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.css" |
|||
/> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"></script> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/morris.js/0.5.1/morris.min.js"></script> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/jscam/JS.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/jscam/qrcode.min.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/bolt11/decoder.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
<script |
|||
src="{{ url_for('static', filename='plugins/bolt11/utils.js') }}" |
|||
type="text/javascript" |
|||
></script> |
|||
|
|||
|
|||
|
|||
<style> |
|||
|
|||
//GOOFY CSS HACK TO GO DARK |
|||
|
|||
.skin-blue .wrapper { |
|||
background: |
|||
#1f2234; |
|||
} |
|||
|
|||
body { |
|||
color: #fff; |
|||
} |
|||
|
|||
.skin-blue .sidebar-menu > li.active > a { |
|||
color: #fff; |
|||
background:#1f2234; |
|||
border-left-color:#8964a9; |
|||
} |
|||
|
|||
.skin-blue .main-header .navbar { |
|||
background-color: |
|||
#2e507d; |
|||
} |
|||
|
|||
.content-wrapper, .right-side { |
|||
background-color: |
|||
#1f2234; |
|||
} |
|||
.skin-blue .main-header .logo { |
|||
background-color: |
|||
#1f2234; |
|||
color: |
|||
#fff; |
|||
} |
|||
|
|||
.skin-blue .sidebar-menu > li.header { |
|||
color: |
|||
#4b646f; |
|||
background: |
|||
#1f2234; |
|||
} |
|||
.skin-blue .wrapper, .skin-blue .main-sidebar, .skin-blue .left-side { |
|||
background: |
|||
#1f2234; |
|||
} |
|||
|
|||
.skin-blue .sidebar-menu > li > .treeview-menu { |
|||
margin: 0 1px; |
|||
background: |
|||
#1f2234; |
|||
} |
|||
|
|||
.skin-blue .sidebar-menu > li > a { |
|||
border-left: 3px solid |
|||
transparent; |
|||
margin-right: 1px; |
|||
} |
|||
.skin-blue .sidebar-menu > li > a:hover, .skin-blue .sidebar-menu > li.active > a { |
|||
|
|||
color: #fff; |
|||
background:#3e355a; |
|||
border-left-color:#8964a9; |
|||
|
|||
} |
|||
|
|||
|
|||
.skin-blue .main-header .logo:hover { |
|||
background: |
|||
#3e355a; |
|||
} |
|||
|
|||
.skin-blue .main-header .navbar .sidebar-toggle:hover { |
|||
background-color: |
|||
#3e355a; |
|||
} |
|||
.main-footer { |
|||
background-color: #1f2234; |
|||
padding: 15px; |
|||
color: #fff; |
|||
border-top: 0px; |
|||
} |
|||
|
|||
.skin-blue .main-header .navbar { |
|||
background-color: #1f2234; |
|||
} |
|||
|
|||
.bg-red, .callout.callout-danger, .alert-danger, .alert-error, .label-danger, .modal-danger .modal-body { |
|||
background-color: |
|||
#1f2234 !important; |
|||
} |
|||
.alert-danger, .alert-error { |
|||
|
|||
border-color: #fff; |
|||
border: 1px solid |
|||
|
|||
#fff; |
|||
border-radius: 7px; |
|||
|
|||
} |
|||
|
|||
.skin-blue .main-header .navbar .nav > li > a:hover, .skin-blue .main-header .navbar .nav > li > a:active, .skin-blue .main-header .navbar .nav > li > a:focus, .skin-blue .main-header .navbar .nav .open > a, .skin-blue .main-header .navbar .nav .open > a:hover, .skin-blue .main-header .navbar .nav .open > a:focus { |
|||
color: |
|||
#f6f6f6; |
|||
background-color: #3e355a; |
|||
} |
|||
.bg-aqua, .callout.callout-info, .alert-info, .label-info, .modal-info .modal-body { |
|||
background-color: |
|||
#3e355a !important; |
|||
} |
|||
|
|||
.box { |
|||
position: relative; |
|||
border-radius: 3px; |
|||
background-color: #333646; |
|||
border-top: 3px solid #8964a9; |
|||
margin-bottom: 20px; |
|||
width: 100%; |
|||
|
|||
} |
|||
.table-striped > tbody > tr:nth-of-type(2n+1) { |
|||
background-color: |
|||
#333646; |
|||
} |
|||
|
|||
.box-header { |
|||
color: #fff; |
|||
|
|||
} |
|||
|
|||
|
|||
.box.box-danger { |
|||
border-top-color: #8964a9; |
|||
} |
|||
.box.box-primary { |
|||
border-top-color: #8964a9; |
|||
} |
|||
|
|||
a { |
|||
color: #8964a9; |
|||
} |
|||
.box-header.with-border { |
|||
border-bottom: none; |
|||
} |
|||
|
|||
a:hover, a:active, a:focus { |
|||
outline: none; |
|||
text-decoration: none; |
|||
color: #fff; |
|||
} |
|||
// .modal.in .modal-dialog{ |
|||
// color:#000; |
|||
// } |
|||
|
|||
.form-control { |
|||
|
|||
background-color:#333646; |
|||
color: #fff; |
|||
|
|||
} |
|||
.box-footer { |
|||
|
|||
border-top: none; |
|||
|
|||
background-color: |
|||
#333646; |
|||
} |
|||
.modal-footer { |
|||
|
|||
border-top: none; |
|||
|
|||
} |
|||
.modal-content { |
|||
|
|||
background-color: |
|||
#333646; |
|||
} |
|||
.modal.in .modal-dialog { |
|||
|
|||
background-color: #333646; |
|||
|
|||
} |
|||
|
|||
.layout-boxed { |
|||
background: none; |
|||
background-color: rgba(0, 0, 0, 0); |
|||
background-color: |
|||
#3e355a; |
|||
} |
|||
|
|||
.skin-blue .sidebar-menu > li > a:hover, .skin-blue .sidebar-menu > li.active > a { |
|||
|
|||
background: none; |
|||
} |
|||
</style> |
|||
|
|||
|
|||
</head> |
|||
<body class="skin-blue layout-boxed sidebar-collapse sidebar-open"> |
|||
<div class="wrapper"> |
|||
<header class="main-header"> |
|||
<!-- Logo --> |
|||
<a href="{{ url_for('core.home') }}" class="logo"><b>LN</b>bits</a> |
|||
<!-- Header Navbar: style can be found in header.less --> |
|||
<nav class="navbar navbar-static-top" role="navigation"> |
|||
<!-- Sidebar toggle button--> |
|||
<a |
|||
href="#" |
|||
class="sidebar-toggle" |
|||
data-toggle="offcanvas" |
|||
role="button" |
|||
> |
|||
<span class="sr-only">Toggle navigation</span> |
|||
</a> |
|||
<div class="navbar-custom-menu"> |
|||
<ul class="nav navbar-nav"> |
|||
<!-- Messages: style can be found in dropdown.less--> |
|||
<li class="dropdown messages-menu"> |
|||
|
|||
{% block messages %}{% endblock %} |
|||
</li> |
|||
</ul> |
|||
</div> |
|||
</nav> |
|||
</header> |
|||
|
|||
<aside class="main-sidebar"> |
|||
<!-- sidebar: style can be found in sidebar.less --> |
|||
<section class="sidebar" style="height: auto;"> |
|||
<!-- Sidebar user panel --> |
|||
|
|||
<!-- /.search form --> |
|||
<!-- sidebar menu: : style can be found in sidebar.less --> |
|||
<ul class="sidebar-menu"> |
|||
<li><br/><br/><a href="https://where39.com/"><p>Where39 anon locations</p><img src="../static/where39.png" style="width:170px"></a></li> |
|||
<li><br/><a href="https://github.com/arcbtc/Quickening"><p>The Quickening <$8 PoS</p><img src="../static/quick.gif" style="width:170px"></a></li> |
|||
<li><br/><a href="https://jigawatt.co/"><p>Buy BTC stamps + electronics</p><img src="../static/stamps.jpg" style="width:170px"></a></li> |
|||
<li><br/><a href="mailto:ben@arc.wales"><h3>Advertise here!</h3></a></li> |
|||
|
|||
</ul> |
|||
</section> |
|||
<!-- /.sidebar --> |
|||
</aside> |
|||
|
|||
<!-- Right side column. Contains the navbar and content of the page --> |
|||
<div class="content-wrapper"> |
|||
<!-- Content Header (Page header) --> |
|||
<section class="content-header"> |
|||
<h1> |
|||
LNURL Withdraw Link |
|||
<small>Use LNURL compatible bitcoin wallet</small> |
|||
</h1> |
|||
|
|||
</section> |
|||
|
|||
<!-- Main content --> |
|||
<section class="content"><br/><br/> |
|||
<center><h1 style="font-size:500%">Withdraw Link: {{ user_fau[0][6] }}</h1></center> |
|||
|
|||
<center><br/><br/> <div id="qrcode" style="width: 340px;"></div><br/><br/> |
|||
<div style="width:55%;word-wrap: break-word;" id="qrcodetxt"></div> <br/></center> |
|||
|
|||
</section><!-- /.content --> |
|||
</div><!-- /.content-wrapper --> |
|||
</div> |
|||
</body> |
|||
|
|||
<script> |
|||
function getAjax(url, thekey, success) { |
|||
var xhr = window.XMLHttpRequest |
|||
? new XMLHttpRequest() |
|||
: new ActiveXObject('Microsoft.XMLHTTP') |
|||
xhr.open('GET', url, true) |
|||
xhr.onreadystatechange = function() { |
|||
if (xhr.readyState > 3 && xhr.status == 200) { |
|||
success(xhr.responseText) |
|||
} |
|||
} |
|||
xhr.setRequestHeader('Grpc-Metadata-macaroon', thekey) |
|||
xhr.setRequestHeader('Content-Type', 'application/json') |
|||
|
|||
xhr.send() |
|||
return xhr |
|||
} |
|||
|
|||
|
|||
function drawwithdraw(data) { |
|||
|
|||
|
|||
console.log(data) |
|||
|
|||
|
|||
getAjax('/withdraw/api/v1/lnurlencode/'+ window.location.hostname + "/" + data, "filla", function(datab) { |
|||
if (JSON.parse(datab).status == 'TRUE') { |
|||
console.log(JSON.parse(datab).status) |
|||
lnurlfau = (JSON.parse(datab).lnurl) |
|||
|
|||
|
|||
new QRCode(document.getElementById('qrcode'), { |
|||
text: lnurlfau, |
|||
width: 300, |
|||
height: 300, |
|||
colorDark: '#000000', |
|||
colorLight: '#ffffff', |
|||
correctLevel: QRCode.CorrectLevel.M |
|||
}) |
|||
document.getElementById("qrcode").style.backgroundColor = "white"; |
|||
document.getElementById("qrcode").style.padding = "20px"; |
|||
|
|||
document.getElementById('qrcodetxt').innerHTML = lnurlfau + "<br/><br/>" |
|||
|
|||
} |
|||
else { |
|||
|
|||
data = "Failed to build LNURL" |
|||
} |
|||
}) |
|||
} |
|||
drawwithdraw("{{ user_fau[0][5] }}") |
|||
|
|||
|
|||
|
|||
|
|||
</script> |
|||
</html> |
@ -0,0 +1,17 @@ |
|||
import uuid |
|||
|
|||
from flask import jsonify, render_template, request, redirect, url_for |
|||
from datetime import datetime |
|||
|
|||
from lnbits.db import open_db, open_ext_db |
|||
from lnbits.extensions.events import events_ext |
|||
|
|||
|
|||
@events_ext.route("/") |
|||
def index(): |
|||
"""Main withdraw link page.""" |
|||
|
|||
return render_template( |
|||
"events/index.html" |
|||
) |
|||
|
@ -0,0 +1,10 @@ |
|||
import uuid |
|||
import json |
|||
import requests |
|||
|
|||
from flask import jsonify, request, url_for |
|||
from datetime import datetime |
|||
|
|||
from lnbits.db import open_ext_db |
|||
from lnbits.extensions.events import events_ext |
|||
|
Loading…
Reference in new issue