mirror of
https://github.com/lnbits/lnbits.git
synced 2025-03-28 18:52:00 +01:00
Merge pull request #11 from arcbtc/extensions
refactor: remove databases from code an use schemas instead
This commit is contained in:
commit
e92b49487a
3
.gitignore
vendored
3
.gitignore
vendored
@ -22,6 +22,5 @@ Pipfile.lock
|
|||||||
.env
|
.env
|
||||||
venv
|
venv
|
||||||
|
|
||||||
database.sqlite3
|
*.sqlite3
|
||||||
database.sqlite3*
|
|
||||||
.pyre*
|
.pyre*
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import json
|
import json
|
||||||
import os
|
|
||||||
import requests
|
import requests
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
@ -9,26 +8,29 @@ from lnurl import Lnurl, LnurlWithdrawResponse
|
|||||||
|
|
||||||
from . import bolt11
|
from . import bolt11
|
||||||
from .core import core_app
|
from .core import core_app
|
||||||
from .db import open_db, open_ext_db
|
from .db import init_databases, open_db
|
||||||
from .extensions.withdraw import withdraw_ext
|
from .extensions.withdraw import withdraw_ext
|
||||||
from .helpers import megajson
|
from .helpers import megajson
|
||||||
from .settings import LNBITS_PATH, WALLET, DEFAULT_USER_WALLET_NAME, FEE_RESERVE
|
from .settings import WALLET, DEFAULT_USER_WALLET_NAME, FEE_RESERVE
|
||||||
|
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
Talisman(app, content_security_policy={
|
Talisman(
|
||||||
"default-src": [
|
app,
|
||||||
"'self'",
|
content_security_policy={
|
||||||
"'unsafe-eval'",
|
"default-src": [
|
||||||
"'unsafe-inline'",
|
"'self'",
|
||||||
"cdnjs.cloudflare.com",
|
"'unsafe-eval'",
|
||||||
"code.ionicframework.com",
|
"'unsafe-inline'",
|
||||||
"code.jquery.com",
|
"cdnjs.cloudflare.com",
|
||||||
"fonts.googleapis.com",
|
"code.ionicframework.com",
|
||||||
"fonts.gstatic.com",
|
"code.jquery.com",
|
||||||
"maxcdn.bootstrapcdn.com",
|
"fonts.googleapis.com",
|
||||||
]
|
"fonts.gstatic.com",
|
||||||
})
|
"maxcdn.bootstrapcdn.com",
|
||||||
|
]
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
# filters
|
# filters
|
||||||
app.jinja_env.filters["megajson"] = megajson
|
app.jinja_env.filters["megajson"] = megajson
|
||||||
@ -40,10 +42,7 @@ app.register_blueprint(withdraw_ext, url_prefix="/withdraw")
|
|||||||
|
|
||||||
@app.before_first_request
|
@app.before_first_request
|
||||||
def init():
|
def init():
|
||||||
with open_db() as db:
|
init_databases()
|
||||||
with open(os.path.join(LNBITS_PATH, "data", "schema.sql")) as schemafile:
|
|
||||||
for stmt in schemafile.read().split(";\n\n"):
|
|
||||||
db.execute(stmt, [])
|
|
||||||
|
|
||||||
|
|
||||||
@app.route("/deletewallet")
|
@app.route("/deletewallet")
|
||||||
@ -447,38 +446,35 @@ def api_checkpending():
|
|||||||
@app.route("/extensions")
|
@app.route("/extensions")
|
||||||
def extensions():
|
def extensions():
|
||||||
usr = request.args.get("usr")
|
usr = request.args.get("usr")
|
||||||
lnevents = request.args.get("lnevents")
|
enable = request.args.get("enable")
|
||||||
lnjoust = request.args.get("lnjoust")
|
disable = request.args.get("disable")
|
||||||
withdraw = request.args.get("withdraw")
|
ext = None
|
||||||
if usr:
|
|
||||||
if not len(usr) > 20:
|
if usr and not len(usr) > 20:
|
||||||
return redirect(url_for("home"))
|
return redirect(url_for("home"))
|
||||||
|
|
||||||
|
if enable and disable:
|
||||||
|
# TODO: show some kind of error
|
||||||
|
return redirect(url_for("extensions"))
|
||||||
|
|
||||||
with open_db() as db:
|
with open_db() as db:
|
||||||
user_wallets = db.fetchall("SELECT * FROM wallets WHERE user = ?", (usr,))
|
user_wallets = db.fetchall("SELECT * FROM wallets WHERE user = ?", (usr,))
|
||||||
|
|
||||||
with open_ext_db() as ext_db:
|
if enable:
|
||||||
user_ext = ext_db.fetchall("SELECT * FROM overview WHERE user = ?", (usr,))
|
ext, value = enable, 1
|
||||||
if not user_ext:
|
if disable:
|
||||||
ext_db.execute(
|
ext, value = disable, 0
|
||||||
"""
|
|
||||||
INSERT OR IGNORE INTO overview (user) VALUES (?)
|
|
||||||
""",
|
|
||||||
(usr,),
|
|
||||||
)
|
|
||||||
return redirect(url_for("extensions", usr=usr))
|
|
||||||
|
|
||||||
if lnevents:
|
if ext:
|
||||||
if int(lnevents) != user_ext[0][1] and int(lnevents) < 2:
|
db.execute(
|
||||||
ext_db.execute("UPDATE overview SET lnevents = ? WHERE user = ?", (int(lnevents), usr,))
|
"""
|
||||||
user_ext = ext_db.fetchall("SELECT * FROM overview WHERE user = ?", (usr,))
|
INSERT OR REPLACE INTO extensions (user, extension, active)
|
||||||
if lnjoust:
|
VALUES (?, ?, ?)
|
||||||
if int(lnjoust) != user_ext[0][2] and int(lnjoust) < 2:
|
""",
|
||||||
ext_db.execute("UPDATE overview SET lnjoust = ? WHERE user = ?", (int(lnjoust), usr,))
|
(usr, ext, value),
|
||||||
user_ext = ext_db.fetchall("SELECT * FROM overview WHERE user = ?", (usr,))
|
)
|
||||||
if withdraw:
|
|
||||||
if int(withdraw) != user_ext[0][3] and int(withdraw) < 2:
|
user_ext = db.fetchall("SELECT extension FROM extensions WHERE user = ? AND active = 1", (usr,))
|
||||||
ext_db.execute("UPDATE overview SET withdraw = ? WHERE user = ?", (int(withdraw), usr,))
|
user_ext = [v[0] for v in user_ext]
|
||||||
user_ext = ext_db.fetchall("SELECT * FROM overview WHERE user = ?", (usr,))
|
|
||||||
|
|
||||||
return render_template("extensions.html", user_wallets=user_wallets, user=usr, user_ext=user_ext)
|
return render_template("extensions.html", user_wallets=user_wallets, user=usr, user_ext=user_ext)
|
||||||
|
@ -1,39 +1,47 @@
|
|||||||
CREATE TABLE IF NOT EXISTS accounts (
|
CREATE TABLE IF NOT EXISTS accounts (
|
||||||
id text PRIMARY KEY,
|
id TEXT PRIMARY KEY,
|
||||||
email text,
|
email TEXT,
|
||||||
pass text
|
pass TEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS extensions (
|
||||||
|
user TEXT NOT NULL,
|
||||||
|
extension TEXT NOT NULL,
|
||||||
|
active BOOLEAN DEFAULT 0,
|
||||||
|
|
||||||
|
UNIQUE (user, extension)
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS wallets (
|
CREATE TABLE IF NOT EXISTS wallets (
|
||||||
id text PRIMARY KEY,
|
id TEXT PRIMARY KEY,
|
||||||
name text NOT NULL,
|
name TEXT NOT NULL,
|
||||||
user text NOT NULL,
|
user TEXT NOT NULL,
|
||||||
adminkey text NOT NULL,
|
adminkey TEXT NOT NULL,
|
||||||
inkey text
|
inkey TEXT
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS apipayments (
|
CREATE TABLE IF NOT EXISTS apipayments (
|
||||||
payhash text NOT NULL,
|
payhash TEXT NOT NULL,
|
||||||
amount integer NOT NULL,
|
amount INTEGER NOT NULL,
|
||||||
fee integer NOT NULL DEFAULT 0,
|
fee INTEGER NOT NULL DEFAULT 0,
|
||||||
wallet text NOT NULL,
|
wallet TEXT NOT NULL,
|
||||||
pending boolean NOT NULL,
|
pending BOOLEAN NOT NULL,
|
||||||
memo text,
|
memo TEXT,
|
||||||
time timestamp NOT NULL DEFAULT (strftime('%s', 'now')),
|
time TIMESTAMP NOT NULL DEFAULT (strftime('%s', 'now')),
|
||||||
|
|
||||||
UNIQUE (wallet, payhash)
|
UNIQUE (wallet, payhash)
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE VIEW IF NOT EXISTS balances AS
|
CREATE VIEW IF NOT EXISTS balances AS
|
||||||
SELECT wallet, coalesce(sum(s), 0) AS balance FROM (
|
SELECT wallet, COALESCE(SUM(s), 0) AS balance FROM (
|
||||||
SELECT wallet, sum(amount) AS s -- incoming
|
SELECT wallet, SUM(amount) AS s -- incoming
|
||||||
FROM apipayments
|
FROM apipayments
|
||||||
WHERE amount > 0 AND pending = 0 -- don't sum pending
|
WHERE amount > 0 AND pending = 0 -- don't sum pending
|
||||||
GROUP BY wallet
|
GROUP BY wallet
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT wallet, sum(amount + fee) AS s -- outgoing, sum fees
|
SELECT wallet, SUM(amount + fee) AS s -- outgoing, sum fees
|
||||||
FROM apipayments
|
FROM apipayments
|
||||||
WHERE amount < 0 -- do sum pending
|
WHERE amount < 0 -- do sum pending
|
||||||
GROUP BY wallet
|
GROUP BY wallet
|
||||||
)
|
)
|
||||||
GROUP BY wallet;
|
GROUP BY wallet;
|
||||||
|
31
lnbits/db.py
31
lnbits/db.py
@ -1,9 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
import sqlite3
|
import sqlite3
|
||||||
|
|
||||||
from typing import Optional
|
from .settings import LNBITS_PATH, LNBITS_DATA_FOLDER
|
||||||
|
|
||||||
from .settings import DATABASE_PATH, LNBITS_PATH
|
|
||||||
|
|
||||||
|
|
||||||
class Database:
|
class Database:
|
||||||
@ -35,11 +33,28 @@ class Database:
|
|||||||
self.connection.commit()
|
self.connection.commit()
|
||||||
|
|
||||||
|
|
||||||
def open_db(db_path: str = DATABASE_PATH) -> Database:
|
def open_db(db_name: str = "database") -> Database:
|
||||||
|
db_path = os.path.join(LNBITS_DATA_FOLDER, f"{db_name}.sqlite3")
|
||||||
return Database(db_path=db_path)
|
return Database(db_path=db_path)
|
||||||
|
|
||||||
|
|
||||||
def open_ext_db(extension: Optional[str] = None) -> Database:
|
def open_ext_db(extension_name: str) -> Database:
|
||||||
if extension:
|
return open_db(f"ext_{extension_name}")
|
||||||
return open_db(os.path.join(LNBITS_PATH, "extensions", extension, "database.sqlite3"))
|
|
||||||
return open_db(os.path.join(LNBITS_PATH, "extensions", "overview.sqlite3"))
|
|
||||||
|
def init_databases() -> None:
|
||||||
|
"""Creates the necessary databases if they don't exist already."""
|
||||||
|
"""TODO: see how we can deal with migrations."""
|
||||||
|
|
||||||
|
schemas = [
|
||||||
|
("database", os.path.join(LNBITS_PATH, "data", "schema.sql")),
|
||||||
|
]
|
||||||
|
|
||||||
|
for extension in [x[1] for x in os.walk(os.path.join(LNBITS_PATH, "extensions"))][0]:
|
||||||
|
schemas.append((f"ext_{extension}", os.path.join(LNBITS_PATH, "extensions", extension, "schema.sql")))
|
||||||
|
|
||||||
|
for schema in [s for s in schemas if os.path.exists(s[1])]:
|
||||||
|
with open_db(schema[0]) as db:
|
||||||
|
with open(schema[1]) as schemafile:
|
||||||
|
for stmt in schemafile.read().split(";\n\n"):
|
||||||
|
db.execute(stmt, [])
|
||||||
|
Binary file not shown.
Binary file not shown.
18
lnbits/extensions/withdraw/schema.sql
Normal file
18
lnbits/extensions/withdraw/schema.sql
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
CREATE TABLE IF NOT EXISTS withdraws (
|
||||||
|
key INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
usr TEXT,
|
||||||
|
wal TEXT,
|
||||||
|
walnme TEXT,
|
||||||
|
adm INTEGER,
|
||||||
|
uni TEXT,
|
||||||
|
tit TEXT,
|
||||||
|
maxamt INTEGER,
|
||||||
|
minamt INTEGER,
|
||||||
|
spent INTEGER,
|
||||||
|
inc INTEGER,
|
||||||
|
tme INTEGER,
|
||||||
|
uniq INTEGER DEFAULT 0,
|
||||||
|
withdrawals TEXT,
|
||||||
|
tmestmp INTEGER,
|
||||||
|
rand TEXT
|
||||||
|
);
|
@ -34,9 +34,9 @@
|
|||||||
<i class="fa fa-angle-left pull-right"></i>
|
<i class="fa fa-angle-left pull-right"></i>
|
||||||
</a>
|
</a>
|
||||||
<ul class="treeview-menu">
|
<ul class="treeview-menu">
|
||||||
{% if user_ext[0][3] %}
|
{% if "withdraw" in user_ext %}
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ url_for('withdraw.index') }}?usr={{ user_ext[0][0]}}"
|
<a href="{{ url_for('withdraw.index') }}?usr={{ user }}"
|
||||||
><i class="fa fa-plus"></i> LNURLw</a>
|
><i class="fa fa-plus"></i> LNURLw</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -21,9 +21,8 @@ def index():
|
|||||||
# Get all the data
|
# Get all the data
|
||||||
with open_db() as db:
|
with open_db() as db:
|
||||||
user_wallets = db.fetchall("SELECT * FROM wallets WHERE user = ?", (usr,))
|
user_wallets = db.fetchall("SELECT * FROM wallets WHERE user = ?", (usr,))
|
||||||
|
user_ext = db.fetchall("SELECT * FROM extensions WHERE user = ?", (usr,))
|
||||||
with open_ext_db() as ext_db:
|
user_ext = [v[0] for v in user_ext]
|
||||||
user_ext = ext_db.fetchall("SELECT * FROM overview WHERE user = ?", (usr,))
|
|
||||||
|
|
||||||
with open_ext_db("withdraw") as withdraw_ext_db:
|
with open_ext_db("withdraw") as withdraw_ext_db:
|
||||||
user_fau = withdraw_ext_db.fetchall("SELECT * FROM withdraws WHERE usr = ?", (usr,))
|
user_fau = withdraw_ext_db.fetchall("SELECT * FROM withdraws WHERE usr = ?", (usr,))
|
||||||
@ -92,10 +91,18 @@ def create():
|
|||||||
dt = datetime.now()
|
dt = datetime.now()
|
||||||
seconds = dt.timestamp()
|
seconds = dt.timestamp()
|
||||||
|
|
||||||
|
with open_db() as db:
|
||||||
|
user_ext = db.fetchall("SELECT * FROM extensions WHERE user = ?", (usr,))
|
||||||
|
user_ext = [v[0] for v in user_ext]
|
||||||
|
|
||||||
# Add to DB
|
# Add to DB
|
||||||
with open_ext_db("withdraw") as db:
|
with open_ext_db("withdraw") as withdraw_ext_db:
|
||||||
db.execute(
|
withdraw_ext_db.execute(
|
||||||
"INSERT OR IGNORE INTO withdraws (usr, wal, walnme, adm, uni, tit, maxamt, minamt, spent, inc, tme, uniq, withdrawals, tmestmp, rand) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
"""
|
||||||
|
INSERT OR IGNORE INTO withdraws
|
||||||
|
(usr, wal, walnme, adm, uni, tit, maxamt, minamt, spent, inc, tme, uniq, withdrawals, tmestmp, rand)
|
||||||
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
|
""",
|
||||||
(
|
(
|
||||||
usr,
|
usr,
|
||||||
wall[1],
|
wall[1],
|
||||||
@ -115,14 +122,8 @@ def create():
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
# Get updated records
|
|
||||||
with open_ext_db() as ext_db:
|
|
||||||
user_ext = ext_db.fetchall("SELECT * FROM overview WHERE user = ?", (usr,))
|
|
||||||
if not user_ext:
|
|
||||||
return jsonify({"ERROR": "NO WALLET USER"}), 401
|
|
||||||
|
|
||||||
with open_ext_db("withdraw") as withdraw_ext_db:
|
|
||||||
user_fau = withdraw_ext_db.fetchall("SELECT * FROM withdraws WHERE usr = ?", (usr,))
|
user_fau = withdraw_ext_db.fetchall("SELECT * FROM withdraws WHERE usr = ?", (usr,))
|
||||||
|
|
||||||
if not user_fau:
|
if not user_fau:
|
||||||
return jsonify({"ERROR": "NO WALLET USER"}), 401
|
return jsonify({"ERROR": "NO WALLET USER"}), 401
|
||||||
|
|
||||||
|
@ -28,7 +28,6 @@ def api_lnurlencode(urlstr, parstr):
|
|||||||
else:
|
else:
|
||||||
rand = randar[0]
|
rand = randar[0]
|
||||||
|
|
||||||
|
|
||||||
url = url_for("withdraw.api_lnurlfetch", _external=True, urlstr=urlstr, parstr=parstr, rand=rand)
|
url = url_for("withdraw.api_lnurlfetch", _external=True, urlstr=urlstr, parstr=parstr, rand=rand)
|
||||||
|
|
||||||
return jsonify({"status": "TRUE", "lnurl": lnurl_encode(url.replace("http", "https"))}), 200
|
return jsonify({"status": "TRUE", "lnurl": lnurl_encode(url.replace("http", "https"))}), 200
|
||||||
@ -42,7 +41,6 @@ def api_lnurlfetch(parstr, urlstr, rand):
|
|||||||
return jsonify({"status": "FALSE", "ERROR": "NO WALL ID"}), 200
|
return jsonify({"status": "FALSE", "ERROR": "NO WALL ID"}), 200
|
||||||
|
|
||||||
if not urlstr:
|
if not urlstr:
|
||||||
|
|
||||||
return jsonify({"status": "FALSE", "ERROR": "NO URL"}), 200
|
return jsonify({"status": "FALSE", "ERROR": "NO URL"}), 200
|
||||||
|
|
||||||
with open_ext_db("withdraw") as withdraw_ext_db:
|
with open_ext_db("withdraw") as withdraw_ext_db:
|
||||||
@ -58,7 +56,6 @@ def api_lnurlfetch(parstr, urlstr, rand):
|
|||||||
default_description="LNbits LNURL withdraw",
|
default_description="LNbits LNURL withdraw",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
return res.json(), 200
|
return res.json(), 200
|
||||||
|
|
||||||
|
|
||||||
@ -79,11 +76,9 @@ def api_lnurlwithdraw(rand):
|
|||||||
user_fau = withdraw_ext_db.fetchall("SELECT * FROM withdraws WHERE withdrawals = ?", (k1,))
|
user_fau = withdraw_ext_db.fetchall("SELECT * FROM withdraws WHERE withdrawals = ?", (k1,))
|
||||||
|
|
||||||
if not user_fau:
|
if not user_fau:
|
||||||
|
|
||||||
return jsonify({"status": "ERROR", "reason": "NO AUTH"}), 400
|
return jsonify({"status": "ERROR", "reason": "NO AUTH"}), 400
|
||||||
|
|
||||||
if user_fau[0][10] < 1:
|
if user_fau[0][10] < 1:
|
||||||
|
|
||||||
return jsonify({"status": "ERROR", "reason": "withdraw SPENT"}), 400
|
return jsonify({"status": "ERROR", "reason": "withdraw SPENT"}), 400
|
||||||
|
|
||||||
# Check withdraw time
|
# Check withdraw time
|
||||||
@ -110,8 +105,8 @@ def api_lnurlwithdraw(rand):
|
|||||||
|
|
||||||
header = {"Content-Type": "application/json", "Grpc-Metadata-macaroon": str(user_fau[0][4])}
|
header = {"Content-Type": "application/json", "Grpc-Metadata-macaroon": str(user_fau[0][4])}
|
||||||
data = {"payment_request": pr}
|
data = {"payment_request": pr}
|
||||||
#this works locally but not being served over host, bug, needs fixing
|
# this works locally but not being served over host, bug, needs fixing
|
||||||
#r = requests.post(url="https://lnbits.com/api/v1/channels/transactions", headers=header, data=json.dumps(data))
|
# r = requests.post(url="https://lnbits.com/api/v1/channels/transactions", headers=header, data=json.dumps(data))
|
||||||
r = requests.post(url=url_for("api_transactions", _external=True), headers=header, data=json.dumps(data))
|
r = requests.post(url=url_for("api_transactions", _external=True), headers=header, data=json.dumps(data))
|
||||||
r_json = r.json()
|
r_json = r.json()
|
||||||
|
|
||||||
|
@ -3,12 +3,9 @@ import sqlite3
|
|||||||
|
|
||||||
|
|
||||||
class MegaEncoder(json.JSONEncoder):
|
class MegaEncoder(json.JSONEncoder):
|
||||||
def default(self, o):
|
def default(self, obj):
|
||||||
if type(o) == sqlite3.Row:
|
if isinstance(obj, sqlite3.Row):
|
||||||
val = {}
|
return {k: obj[k] for k in obj.keys()}
|
||||||
for k in o.keys():
|
|
||||||
val[k] = o[k]
|
|
||||||
return val
|
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
from .wallets import OpenNodeWallet # OR LndWallet OR OpennodeWallet
|
from .wallets import OpenNodeWallet # OR LndWallet OR OpennodeWallet
|
||||||
|
|
||||||
WALLET = OpenNodeWallet(endpoint=os.getenv("OPENNODE_API_ENDPOINT"),admin_key=os.getenv("OPENNODE_ADMIN_KEY"),invoice_key=os.getenv("OPENNODE_INVOICE_KEY"))
|
WALLET = OpenNodeWallet(endpoint=os.getenv("OPENNODE_API_ENDPOINT"),admin_key=os.getenv("OPENNODE_ADMIN_KEY"),invoice_key=os.getenv("OPENNODE_INVOICE_KEY"))
|
||||||
#WALLET = LntxbotWallet(endpoint=os.getenv("LNTXBOT_API_ENDPOINT"),admin_key=os.getenv("LNTXBOT_ADMIN_KEY"),invoice_key=os.getenv("LNTXBOT_INVOICE_KEY"))
|
#WALLET = LntxbotWallet(endpoint=os.getenv("LNTXBOT_API_ENDPOINT"),admin_key=os.getenv("LNTXBOT_ADMIN_KEY"),invoice_key=os.getenv("LNTXBOT_INVOICE_KEY"))
|
||||||
#WALLET = LndWallet(endpoint=os.getenv("LND_API_ENDPOINT"),admin_macaroon=os.getenv("LND_ADMIN_MACAROON"),invoice_macaroon=os.getenv("LND_INVOICE_MACAROON"),read_macaroon=os.getenv("LND_READ_MACAROON"))
|
#WALLET = LndWallet(endpoint=os.getenv("LND_API_ENDPOINT"),admin_macaroon=os.getenv("LND_ADMIN_MACAROON"),invoice_macaroon=os.getenv("LND_INVOICE_MACAROON"),read_macaroon=os.getenv("LND_READ_MACAROON"))
|
||||||
@ -9,7 +9,7 @@ WALLET = OpenNodeWallet(endpoint=os.getenv("OPENNODE_API_ENDPOINT"),admin_key=os
|
|||||||
|
|
||||||
|
|
||||||
LNBITS_PATH = os.path.dirname(os.path.realpath(__file__))
|
LNBITS_PATH = os.path.dirname(os.path.realpath(__file__))
|
||||||
DATABASE_PATH = os.getenv("DATABASE_PATH", os.path.join(LNBITS_PATH, "data", "database.sqlite3"))
|
LNBITS_DATA_FOLDER = os.getenv("LNBITS_DATA_FOLDER", os.path.join(LNBITS_PATH, "data"))
|
||||||
|
|
||||||
DEFAULT_USER_WALLET_NAME = os.getenv("DEFAULT_USER_WALLET_NAME", "Bitcoin LN Wallet")
|
DEFAULT_USER_WALLET_NAME = os.getenv("DEFAULT_USER_WALLET_NAME", "Bitcoin LN Wallet")
|
||||||
FEE_RESERVE = float(os.getenv("FEE_RESERVE", 0))
|
FEE_RESERVE = float(os.getenv("FEE_RESERVE", 0))
|
||||||
|
@ -36,23 +36,23 @@
|
|||||||
<ul class="treeview-menu">
|
<ul class="treeview-menu">
|
||||||
|
|
||||||
|
|
||||||
{% if user_ext[0][1] %}
|
{% if "lnevents" in user_ext %}
|
||||||
<li>
|
<li>
|
||||||
<a href="lnevents?usr={{ user_ext[0][0]}}"
|
<a href="lnevents?usr={{ user }}"
|
||||||
><i class="fa fa-plus"></i> LNEvents</a>
|
><i class="fa fa-plus"></i> LNEvents</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if user_ext[0][2] %}
|
{% if "lnjoust" in user_ext %}
|
||||||
<li>
|
<li>
|
||||||
<a href="lnjoust?usr={{ user_ext[0][0]}}"
|
<a href="lnjoust?usr={{ user }}"
|
||||||
><i class="fa fa-plus"></i> LNJoust</a>
|
><i class="fa fa-plus"></i> LNJoust</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if user_ext[0][3] %}
|
{% if "withdraw" in user_ext %}
|
||||||
<li>
|
<li>
|
||||||
<a href="withdraw?usr={{ user_ext[0][0]}}"
|
<a href="withdraw?usr={{ user }}"
|
||||||
><i class="fa fa-plus"></i> LNURLw</a>
|
><i class="fa fa-plus"></i> LNURLw</a>
|
||||||
</li>
|
</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -97,8 +97,7 @@
|
|||||||
<!-- Small boxes (Stat box) -->
|
<!-- Small boxes (Stat box) -->
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
||||||
|
{% if "withdraw" not in user_ext %}
|
||||||
{% if not user_ext[0][3] %}
|
|
||||||
<div class="col-lg-3 col-xs-6">
|
<div class="col-lg-3 col-xs-6">
|
||||||
<!-- small box -->
|
<!-- small box -->
|
||||||
<div class="small-box bg-blue">
|
<div class="small-box bg-blue">
|
||||||
@ -113,18 +112,18 @@
|
|||||||
<div class="icon">
|
<div class="icon">
|
||||||
<i class="ion ion-beer"></i>
|
<i class="ion ion-beer"></i>
|
||||||
</div>
|
</div>
|
||||||
<a href="extensions?usr={{user}}&withdraw=1" class="small-box-footer">
|
<a href="extensions?usr={{user}}&enable=withdraw" class="small-box-footer">
|
||||||
Activate <i class="fa fa-arrow-circle-right"></i>
|
Activate <i class="fa fa-arrow-circle-right"></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div><!-- ./col -->
|
</div><!-- ./col -->
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
||||||
<div class="col-lg-3 col-xs-6">
|
<div class="col-lg-3 col-xs-6">
|
||||||
<!-- small box -->
|
<!-- small box -->
|
||||||
|
|
||||||
<div class="small-box bg-blue">
|
<div class="small-box bg-blue">
|
||||||
|
|
||||||
<div class="inner">
|
<div class="inner">
|
||||||
<a href="withdraw?usr={{user}}" style="color: inherit;">
|
<a href="withdraw?usr={{user}}" style="color: inherit;">
|
||||||
<h3>
|
<h3>
|
||||||
@ -136,17 +135,17 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
|
|
||||||
<i class="ion ion-beer"></i>
|
<i class="ion ion-beer"></i>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
<a href="extensions?usr={{user}}&withdraw=0" class="small-box-footer">
|
<a href="extensions?usr={{user}}&disable=withdraw" class="small-box-footer">
|
||||||
Deactivate <i class="fa fa-arrow-circle-right"></i>
|
Deactivate <i class="fa fa-arrow-circle-right"></i>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div><!-- ./col -->
|
</div><!-- ./col -->
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -159,7 +158,7 @@
|
|||||||
window.user = {{ user | megajson | safe }}
|
window.user = {{ user | megajson | safe }}
|
||||||
window.user_wallets = {{ user_wallets | megajson | safe }}
|
window.user_wallets = {{ user_wallets | megajson | safe }}
|
||||||
window.user_ext = {{ user_ext | megajson | safe }}
|
window.user_ext = {{ user_ext | megajson | safe }}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user