diff --git a/lnbits/extensions/lnticket/README.md b/lnbits/extensions/lnticket/README.md new file mode 100644 index 0000000..2772945 --- /dev/null +++ b/lnbits/extensions/lnticket/README.md @@ -0,0 +1,11 @@ +
curl -H "Content-type: application/json" -X POST https://YOUR-LNBITS/YOUR-EXTENSION/api/v1/EXAMPLE -d '{"amount":"100","memo":"example"}' -H "X-Api-Key: YOUR_WALLET-ADMIN/INVOICE-KEY"
diff --git a/lnbits/extensions/lnticket/__init__.py b/lnbits/extensions/lnticket/__init__.py
new file mode 100644
index 0000000..08ca29c
--- /dev/null
+++ b/lnbits/extensions/lnticket/__init__.py
@@ -0,0 +1,8 @@
+from flask import Blueprint
+
+
+lnticket_ext: Blueprint = Blueprint("lnticket", __name__, static_folder="static", template_folder="templates")
+
+
+from .views_api import * # noqa
+from .views import * # noqa
diff --git a/lnbits/extensions/lnticket/config.json.example b/lnbits/extensions/lnticket/config.json.example
new file mode 100644
index 0000000..8207de1
--- /dev/null
+++ b/lnbits/extensions/lnticket/config.json.example
@@ -0,0 +1,6 @@
+{
+ "name": "LNTicket",
+ "short_description": "Pay-per-word LN ticket system",
+ "icon": "contact_support",
+ "contributors": ["benarc"]
+}
diff --git a/lnbits/extensions/lnticket/crud.py b/lnbits/extensions/lnticket/crud.py
new file mode 100644
index 0000000..7b50bf2
--- /dev/null
+++ b/lnbits/extensions/lnticket/crud.py
@@ -0,0 +1,107 @@
+from typing import List, Optional, Union
+
+from lnbits.db import open_ext_db
+from lnbits.helpers import urlsafe_short_hash
+
+from .models import Tickets, Forms
+
+
+
+
+#######TICKETS########
+
+
+def create_ticket(wallet: str, form: str, name: str, email: str, ltext: str, sats: int) -> Tickets:
+ formdata = get_form(form)
+ amount = formdata.amountmade + sats
+ with open_ext_db("lnticket") as db:
+ ticket_id = urlsafe_short_hash()
+ db.execute(
+ """
+ INSERT INTO tickets (id, form, email, ltext, name, wallet, sats)
+ VALUES (?, ?, ?, ?, ?, ?, ?)
+ """,
+ (ticket_id, form, email, ltext, name, wallet, sats),
+ )
+ db.execute(
+ """
+ UPDATE forms
+ SET amountmade = ?
+ WHERE id = ?
+ """,
+ (amount, form),
+ )
+ return get_ticket(ticket_id)
+
+
+def get_ticket(ticket_id: str) -> Optional[Tickets]:
+ with open_ext_db("lnticket") as db:
+ row = db.fetchone("SELECT * FROM tickets WHERE id = ?", (ticket_id,))
+
+ return Tickets(**row) if row else None
+
+
+def get_tickets(wallet_ids: Union[str, List[str]]) -> List[Tickets]:
+ if isinstance(wallet_ids, str):
+ wallet_ids = [wallet_ids]
+
+ with open_ext_db("lnticket") as db:
+ q = ",".join(["?"] * len(wallet_ids))
+ rows = db.fetchall(f"SELECT * FROM tickets WHERE wallet IN ({q})", (*wallet_ids,))
+
+ return [Tickets(**row) for row in rows]
+
+
+def delete_ticket(ticket_id: str) -> None:
+ with open_ext_db("lnticket") as db:
+ db.execute("DELETE FROM tickets WHERE id = ?", (ticket_id,))
+
+
+
+
+########FORMS#########
+
+
+def create_form(*, wallet: str, name: str, description: str, costpword: int) -> Forms:
+ with open_ext_db("lnticket") as db:
+ form_id = urlsafe_short_hash()
+ db.execute(
+ """
+ INSERT INTO forms (id, wallet, name, description, costpword, amountmade)
+ VALUES (?, ?, ?, ?, ?, ?)
+ """,
+ (form_id, wallet, name, description, costpword, 0 ),
+ )
+
+ return get_form(form_id)
+
+def update_form(form_id: str, **kwargs) -> Forms:
+ q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()])
+ with open_ext_db("lnticket") as db:
+ db.execute(f"UPDATE forms SET {q} WHERE id = ?", (*kwargs.values(), form_id))
+ row = db.fetchone("SELECT * FROM forms WHERE id = ?", (form_id,))
+
+ return Forms(**row) if row else None
+
+
+def get_form(form_id: str) -> Optional[Forms]:
+ with open_ext_db("lnticket") as db:
+ row = db.fetchone("SELECT * FROM forms WHERE id = ?", (form_id,))
+
+ return Forms(**row) if row else None
+
+
+def get_forms(wallet_ids: Union[str, List[str]]) -> List[Forms]:
+ if isinstance(wallet_ids, str):
+ wallet_ids = [wallet_ids]
+
+ with open_ext_db("lnticket") as db:
+ q = ",".join(["?"] * len(wallet_ids))
+ rows = db.fetchall(f"SELECT * FROM forms WHERE wallet IN ({q})", (*wallet_ids,))
+
+ return [Forms(**row) for row in rows]
+
+
+def delete_form(form_id: str) -> None:
+ with open_ext_db("lnticket") as db:
+ db.execute("DELETE FROM forms WHERE id = ?", (form_id,))
\ No newline at end of file
diff --git a/lnbits/extensions/lnticket/migrations.py b/lnbits/extensions/lnticket/migrations.py
new file mode 100644
index 0000000..e296b93
--- /dev/null
+++ b/lnbits/extensions/lnticket/migrations.py
@@ -0,0 +1,36 @@
+from lnbits.db import open_ext_db
+
+def m001_initial(db):
+
+ db.execute(
+ """
+ CREATE TABLE IF NOT EXISTS forms (
+ id TEXT PRIMARY KEY,
+ wallet TEXT NOT NULL,
+ name TEXT NOT NULL,
+ description TEXT NOT NULL,
+ costpword INTEGER NOT NULL,
+ amountmade INTEGER NOT NULL,
+ time TIMESTAMP NOT NULL DEFAULT (strftime('%s', 'now'))
+ );
+ """
+ )
+
+ db.execute(
+ """
+ CREATE TABLE IF NOT EXISTS tickets (
+ id TEXT PRIMARY KEY,
+ form TEXT NOT NULL,
+ email TEXT NOT NULL,
+ ltext TEXT NOT NULL,
+ name TEXT NOT NULL,
+ wallet TEXT NOT NULL,
+ sats INTEGER NOT NULL,
+ time TIMESTAMP NOT NULL DEFAULT (strftime('%s', 'now'))
+ );
+ """
+ )
+
+def migrate():
+ with open_ext_db("lnticket") as db:
+ m001_initial(db)
\ No newline at end of file
diff --git a/lnbits/extensions/lnticket/models.py b/lnbits/extensions/lnticket/models.py
new file mode 100644
index 0000000..7da84a6
--- /dev/null
+++ b/lnbits/extensions/lnticket/models.py
@@ -0,0 +1,23 @@
+from typing import NamedTuple
+
+
+class Forms(NamedTuple):
+ id: str
+ wallet: str
+ name: str
+ description: str
+ costpword: int
+ amountmade: int
+ time: int
+
+
+class Tickets(NamedTuple):
+ id: str
+ form: str
+ email: str
+ ltext: str
+ name: str
+ wallet: str
+ sats: int
+ time: int
+
diff --git a/lnbits/extensions/lnticket/templates/lnticket/_api_docs.html b/lnbits/extensions/lnticket/templates/lnticket/_api_docs.html
new file mode 100644
index 0000000..59bd1b3
--- /dev/null
+++ b/lnbits/extensions/lnticket/templates/lnticket/_api_docs.html
@@ -0,0 +1,27 @@
+
+ LNTickets allow you to charge people per word for contacting you. Applications incude, paid support ticketting, PAYG language services, such as translation, spam protection (people have to pay to contact you).
+ Created by, Ben Arc
{% raw %}{{amountWords}}{% endraw %}
+