From 5a8db02c6034f3656484c5993b7a51772f827930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dni=20=E2=9A=A1?= Date: Mon, 20 Feb 2023 11:06:59 +0100 Subject: [PATCH] remove tipjar (#1522) --- lnbits/extensions/tipjar/README.md | 15 - lnbits/extensions/tipjar/__init__.py | 25 - lnbits/extensions/tipjar/config.json | 6 - lnbits/extensions/tipjar/crud.py | 123 ----- lnbits/extensions/tipjar/migrations.py | 27 -- lnbits/extensions/tipjar/models.py | 56 --- .../extensions/tipjar/static/image/tipjar.png | Bin 20331 -> 0 bytes .../tipjar/templates/tipjar/_api_docs.html | 19 - .../tipjar/templates/tipjar/display.html | 94 ---- .../tipjar/templates/tipjar/index.html | 443 ------------------ lnbits/extensions/tipjar/views.py | 35 -- lnbits/extensions/tipjar/views_api.py | 220 --------- 12 files changed, 1063 deletions(-) delete mode 100644 lnbits/extensions/tipjar/README.md delete mode 100644 lnbits/extensions/tipjar/__init__.py delete mode 100644 lnbits/extensions/tipjar/config.json delete mode 100644 lnbits/extensions/tipjar/crud.py delete mode 100644 lnbits/extensions/tipjar/migrations.py delete mode 100644 lnbits/extensions/tipjar/models.py delete mode 100644 lnbits/extensions/tipjar/static/image/tipjar.png delete mode 100644 lnbits/extensions/tipjar/templates/tipjar/_api_docs.html delete mode 100644 lnbits/extensions/tipjar/templates/tipjar/display.html delete mode 100644 lnbits/extensions/tipjar/templates/tipjar/index.html delete mode 100644 lnbits/extensions/tipjar/views.py delete mode 100644 lnbits/extensions/tipjar/views_api.py diff --git a/lnbits/extensions/tipjar/README.md b/lnbits/extensions/tipjar/README.md deleted file mode 100644 index 4965ec936..000000000 --- a/lnbits/extensions/tipjar/README.md +++ /dev/null @@ -1,15 +0,0 @@ -

Tip Jars

-

Accept tips in Bitcoin, with small messages attached!

-The TipJar extension allows you to integrate Bitcoin Lightning (and on-chain) tips into your website or social media! - -![image](https://user-images.githubusercontent.com/28876473/134997129-c2f3f13c-a65d-42ed-a9c4-8a1da569d74f.png) - -

How to set it up

- -1. Simply create a new Tip Jar with the desired details (onchain optional): -![image](https://user-images.githubusercontent.com/28876473/134996842-ec2f2783-2eef-4671-8eaf-023713865512.png) -1. Share the URL you get from this little button: -![image](https://user-images.githubusercontent.com/28876473/134996973-f8ed4632-ea2f-4b62-83f1-1e4c6b6c91fa.png) - - -

And that's it already! Let the sats flow!

diff --git a/lnbits/extensions/tipjar/__init__.py b/lnbits/extensions/tipjar/__init__.py deleted file mode 100644 index b7e2b9678..000000000 --- a/lnbits/extensions/tipjar/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from fastapi import APIRouter -from fastapi.staticfiles import StaticFiles - -from lnbits.db import Database -from lnbits.helpers import template_renderer - -db = Database("ext_tipjar") - -tipjar_ext: APIRouter = APIRouter(prefix="/tipjar", tags=["tipjar"]) - -tipjar_static_files = [ - { - "path": "/tipjar/static", - "app": StaticFiles(directory="lnbits/extensions/tipjar/static"), - "name": "tipjar_static", - } -] - - -def tipjar_renderer(): - return template_renderer(["lnbits/extensions/tipjar/templates"]) - - -from .views import * # noqa: F401,F403 -from .views_api import * # noqa: F401,F403 diff --git a/lnbits/extensions/tipjar/config.json b/lnbits/extensions/tipjar/config.json deleted file mode 100644 index 90f634ed6..000000000 --- a/lnbits/extensions/tipjar/config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "Tip Jar", - "short_description": "Accept Bitcoin donations, with messages attached!", - "tile": "/tipjar/static/image/tipjar.png", - "contributors": ["Fittiboy"] -} diff --git a/lnbits/extensions/tipjar/crud.py b/lnbits/extensions/tipjar/crud.py deleted file mode 100644 index 3ea45d0d2..000000000 --- a/lnbits/extensions/tipjar/crud.py +++ /dev/null @@ -1,123 +0,0 @@ -from typing import Optional - -from lnbits.db import SQLITE - -# todo: use the API, not direct import -from ..satspay.crud import delete_charge # type: ignore -from . import db -from .models import Tip, TipJar, createTipJar - - -async def create_tip( - id: str, wallet: str, message: str, name: str, sats: int, tipjar: str -) -> Tip: - """Create a new Tip""" - await db.execute( - """ - INSERT INTO tipjar.Tips ( - id, - wallet, - name, - message, - sats, - tipjar - ) - VALUES (?, ?, ?, ?, ?, ?) - """, - (id, wallet, name, message, sats, tipjar), - ) - - tip = await get_tip(id) - assert tip, "Newly created tip couldn't be retrieved" - return tip - - -async def create_tipjar(data: createTipJar) -> TipJar: - """Create a new TipJar""" - - returning = "" if db.type == SQLITE else "RETURNING ID" - method = db.execute if db.type == SQLITE else db.fetchone - - result = await (method)( - f""" - INSERT INTO tipjar.TipJars ( - name, - wallet, - webhook, - onchain - ) - VALUES (?, ?, ?, ?) - {returning} - """, - (data.name, data.wallet, data.webhook, data.onchain), - ) - if db.type == SQLITE: - tipjar_id = result._result_proxy.lastrowid - else: - tipjar_id = result[0] - - tipjar = await get_tipjar(tipjar_id) - assert tipjar - return tipjar - - -async def get_tipjar(tipjar_id: int) -> Optional[TipJar]: - """Return a tipjar by ID""" - row = await db.fetchone("SELECT * FROM tipjar.TipJars WHERE id = ?", (tipjar_id,)) - return TipJar(**row) if row else None - - -async def get_tipjars(wallet_id: str) -> Optional[list]: - """Return all TipJars belonging assigned to the wallet_id""" - rows = await db.fetchall( - "SELECT * FROM tipjar.TipJars WHERE wallet = ?", (wallet_id,) - ) - return [TipJar(**row) for row in rows] if rows else None - - -async def delete_tipjar(tipjar_id: int) -> None: - """Delete a TipJar and all corresponding Tips""" - rows = await db.fetchall("SELECT * FROM tipjar.Tips WHERE tipjar = ?", (tipjar_id,)) - for row in rows: - await delete_tip(row["id"]) - await db.execute("DELETE FROM tipjar.TipJars WHERE id = ?", (tipjar_id,)) - - -async def get_tip(tip_id: str) -> Optional[Tip]: - """Return a Tip""" - row = await db.fetchone("SELECT * FROM tipjar.Tips WHERE id = ?", (tip_id,)) - return Tip(**row) if row else None - - -async def get_tips(wallet_id: str) -> Optional[list]: - """Return all Tips assigned to wallet_id""" - rows = await db.fetchall("SELECT * FROM tipjar.Tips WHERE wallet = ?", (wallet_id,)) - return [Tip(**row) for row in rows] if rows else None - - -async def delete_tip(tip_id: str) -> None: - """Delete a Tip and its corresponding statspay charge""" - await db.execute("DELETE FROM tipjar.Tips WHERE id = ?", (tip_id,)) - await delete_charge(tip_id) - - -async def update_tip(tip_id: str, **kwargs) -> Tip: - """Update a Tip""" - q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()]) - await db.execute( - f"UPDATE tipjar.Tips SET {q} WHERE id = ?", (*kwargs.values(), tip_id) - ) - row = await db.fetchone("SELECT * FROM tipjar.Tips WHERE id = ?", (tip_id,)) - assert row, "Newly updated tip couldn't be retrieved" - return Tip(**row) - - -async def update_tipjar(tipjar_id: str, **kwargs) -> TipJar: - """Update a tipjar""" - q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()]) - await db.execute( - f"UPDATE tipjar.TipJars SET {q} WHERE id = ?", (*kwargs.values(), tipjar_id) - ) - row = await db.fetchone("SELECT * FROM tipjar.TipJars WHERE id = ?", (tipjar_id,)) - assert row, "Newly updated tipjar couldn't be retrieved" - return TipJar(**row) diff --git a/lnbits/extensions/tipjar/migrations.py b/lnbits/extensions/tipjar/migrations.py deleted file mode 100644 index d8f6da3f0..000000000 --- a/lnbits/extensions/tipjar/migrations.py +++ /dev/null @@ -1,27 +0,0 @@ -async def m001_initial(db): - - await db.execute( - f""" - CREATE TABLE IF NOT EXISTS tipjar.TipJars ( - id {db.serial_primary_key}, - name TEXT NOT NULL, - wallet TEXT NOT NULL, - onchain TEXT, - webhook TEXT - ); - """ - ) - - await db.execute( - f""" - CREATE TABLE IF NOT EXISTS tipjar.Tips ( - id TEXT PRIMARY KEY, - wallet TEXT NOT NULL, - name TEXT NOT NULL, - message TEXT NOT NULL, - sats {db.big_int} NOT NULL, - tipjar {db.big_int} NOT NULL, - FOREIGN KEY(tipjar) REFERENCES {db.references_schema}TipJars(id) - ); - """ - ) diff --git a/lnbits/extensions/tipjar/models.py b/lnbits/extensions/tipjar/models.py deleted file mode 100644 index 655888da6..000000000 --- a/lnbits/extensions/tipjar/models.py +++ /dev/null @@ -1,56 +0,0 @@ -from sqlite3 import Row -from typing import Optional - -from pydantic import BaseModel - - -class createTip(BaseModel): - id: str - wallet: str - sats: int - tipjar: int - name: str = "Anonymous" - message: str = "" - - -class Tip(BaseModel): - """A Tip represents a single donation""" - - id: str # This ID always corresponds to a satspay charge ID - wallet: str - name: str # Name of the donor - message: str # Donation message - sats: int - tipjar: int # The ID of the corresponding tip jar - - @classmethod - def from_row(cls, row: Row) -> "Tip": - return cls(**dict(row)) - - -class createTipJar(BaseModel): - name: str - wallet: str - webhook: Optional[str] - onchain: Optional[str] - - -class createTips(BaseModel): - name: str - sats: str - tipjar: str - message: str - - -class TipJar(BaseModel): - """A TipJar represents a user's tip jar""" - - id: int - name: str # The name of the donatee - wallet: str # Lightning wallet - onchain: Optional[str] # Watchonly wallet - webhook: Optional[str] # URL to POST tips to - - @classmethod - def from_row(cls, row: Row) -> "TipJar": - return cls(**dict(row)) diff --git a/lnbits/extensions/tipjar/static/image/tipjar.png b/lnbits/extensions/tipjar/static/image/tipjar.png deleted file mode 100644 index 6f0d69b75785b1171e129d68f1fce6e2794b048d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20331 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 - -

- Tip Jar: Receive tips with messages! -

-

- Your personal Bitcoin tip page, which supports lightning and on-chain - payments. Notifications, including a donation message, can be sent via - webhook. - - Created by, - Fitti -

-
- - diff --git a/lnbits/extensions/tipjar/templates/tipjar/display.html b/lnbits/extensions/tipjar/templates/tipjar/display.html deleted file mode 100644 index 80e5c6fe3..000000000 --- a/lnbits/extensions/tipjar/templates/tipjar/display.html +++ /dev/null @@ -1,94 +0,0 @@ -{% extends "public.html" %} {% block page %} -
-
- - -
Tip {{ donatee }} some sats!
-
- - - - -
- Submit -
-
-
-
-
-
- -{% endblock %} {% block scripts %} - -{% endblock %} diff --git a/lnbits/extensions/tipjar/templates/tipjar/index.html b/lnbits/extensions/tipjar/templates/tipjar/index.html deleted file mode 100644 index 19fca6e47..000000000 --- a/lnbits/extensions/tipjar/templates/tipjar/index.html +++ /dev/null @@ -1,443 +0,0 @@ -{% extends "base.html" %} {% from "macros.jinja" import window_vars with context -%} {% block page %} -
-
- - - New TipJar - - - - - -
-
-
TipJars
-
-
- Export to CSV -
-
- - {% raw %} - - - {% endraw %} - -
-
- - - -
-
-
Tips
-
-
- Export to CSV -
-
- - {% raw %} - - - {% endraw %} - -
-
-
-
- - -
- {{SITE_TITLE}} TipJar extension -
-
- - - {% include "tipjar/_api_docs.html" %} - -
-
- - - - - - -
-
-
- -
-
- - - Watch-Only extension MUST be activated and have a wallet - - -
-
-
-
- -
- - -
- Update TipJar - - Create TipJar - Cancel -
-
-
-
-
-{% endblock %} {% block scripts %} {{ window_vars(user) }} - -{% endblock %} diff --git a/lnbits/extensions/tipjar/views.py b/lnbits/extensions/tipjar/views.py deleted file mode 100644 index ddb1b63c0..000000000 --- a/lnbits/extensions/tipjar/views.py +++ /dev/null @@ -1,35 +0,0 @@ -from http import HTTPStatus - -from fastapi import Depends, Query, Request -from fastapi.templating import Jinja2Templates -from starlette.exceptions import HTTPException - -from lnbits.core.models import User -from lnbits.decorators import check_user_exists - -from . import tipjar_ext, tipjar_renderer -from .crud import get_tipjar - -templates = Jinja2Templates(directory="templates") - - -@tipjar_ext.get("/") -async def index(request: Request, user: User = Depends(check_user_exists)): - return tipjar_renderer().TemplateResponse( - "tipjar/index.html", {"request": request, "user": user.dict()} - ) - - -@tipjar_ext.get("/{tipjar_id}") -async def tip(request: Request, tipjar_id: int = Query(None)): - """Return the donation form for the Tipjar corresponding to id""" - tipjar = await get_tipjar(tipjar_id) - if not tipjar: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="TipJar does not exist." - ) - - return tipjar_renderer().TemplateResponse( - "tipjar/display.html", - {"request": request, "donatee": tipjar.name, "tipjar": tipjar.id}, - ) diff --git a/lnbits/extensions/tipjar/views_api.py b/lnbits/extensions/tipjar/views_api.py deleted file mode 100644 index 7d420fae8..000000000 --- a/lnbits/extensions/tipjar/views_api.py +++ /dev/null @@ -1,220 +0,0 @@ -from http import HTTPStatus - -from fastapi import Depends, Query -from starlette.exceptions import HTTPException - -from lnbits.core.crud import get_user, get_wallet -from lnbits.decorators import WalletTypeInfo, get_key_type - -# todo: use the API, not direct import -from ..satspay.crud import create_charge # type: ignore -from ..satspay.models import CreateCharge # type: ignore -from . import tipjar_ext -from .crud import ( - create_tip, - create_tipjar, - delete_tip, - delete_tipjar, - get_tip, - get_tipjar, - get_tipjars, - get_tips, - update_tip, - update_tipjar, -) -from .models import createTip, createTipJar, createTips - - -@tipjar_ext.post("/api/v1/tipjars") -async def api_create_tipjar(data: createTipJar): - """Create a tipjar, which holds data about how/where to post tips""" - try: - tipjar = await create_tipjar(data) - except Exception as e: - raise HTTPException(status_code=HTTPStatus.INTERNAL_SERVER_ERROR, detail=str(e)) - - return tipjar.dict() - - -async def user_from_wallet(wallet: WalletTypeInfo = Depends(get_key_type)): - return wallet.wallet.user - - -@tipjar_ext.post("/api/v1/tips") -async def api_create_tip(data: createTips): - """Take data from tip form and return satspay charge""" - sats = int(data.sats) - message = data.message - if not message: - message = "No message" - tipjar_id = int(data.tipjar) - tipjar = await get_tipjar(tipjar_id) - if not tipjar: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Tipjar does not exist." - ) - - wallet_id = tipjar.wallet - wallet = await get_wallet(wallet_id) - if not wallet: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Tipjar wallet does not exist." - ) - - name = data.name - - # Ensure that description string can be split reliably - name = name.replace('"', "''") - if not name: - name = "Anonymous" - - description = f"{name}: {message}" - charge = await create_charge( - user=wallet.user, - data=CreateCharge( - amount=sats, - webhook=tipjar.webhook or "", - description=description, - onchainwallet=tipjar.onchain or "", - lnbitswallet=tipjar.wallet, - completelink="/tipjar/" + str(tipjar_id), - completelinktext="Thanks for the tip!", - time=1440, - custom_css="", - ), - ) - - await create_tip( - id=charge.id, - wallet=tipjar.wallet, - message=message, - name=name, - sats=int(data.sats), - tipjar=data.tipjar, - ) - - return {"redirect_url": f"/satspay/{charge.id}"} - - -@tipjar_ext.get("/api/v1/tipjars") -async def api_get_tipjars(wallet: WalletTypeInfo = Depends(get_key_type)): - """Return list of all tipjars assigned to wallet with given invoice key""" - user = await get_user(wallet.wallet.user) - if not user: - return [] - tipjars = [] - for wallet_id in user.wallet_ids: - new_tipjars = await get_tipjars(wallet_id) - tipjars += new_tipjars if new_tipjars else [] - return [tipjar.dict() for tipjar in tipjars] - - -@tipjar_ext.get("/api/v1/tips") -async def api_get_tips(wallet: WalletTypeInfo = Depends(get_key_type)): - """Return list of all tips assigned to wallet with given invoice key""" - user = await get_user(wallet.wallet.user) - if not user: - return [] - tips = [] - for wallet_id in user.wallet_ids: - new_tips = await get_tips(wallet_id) - tips += new_tips if new_tips else [] - return [tip.dict() for tip in tips] - - -@tipjar_ext.put("/api/v1/tips/{tip_id}") -async def api_update_tip( - data: createTip, - wallet: WalletTypeInfo = Depends(get_key_type), - tip_id: str = Query(None), -): - """Update a tip with the data given in the request""" - if tip_id: - tip = await get_tip(tip_id) - - if not tip: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="Tip does not exist." - ) - - if tip.wallet != wallet.wallet.id: - - raise HTTPException( - status_code=HTTPStatus.FORBIDDEN, detail="Not your tip." - ) - - tip = await update_tip(tip_id, **data.dict()) - else: - raise HTTPException( - status_code=HTTPStatus.BAD_REQUEST, detail="No tip ID specified" - ) - return tip.dict() - - -@tipjar_ext.put("/api/v1/tipjars/{tipjar_id}") -async def api_update_tipjar( - data: createTipJar, - wallet: WalletTypeInfo = Depends(get_key_type), - tipjar_id: int = Query(None), -): - """Update a tipjar with the data given in the request""" - if tipjar_id: - tipjar = await get_tipjar(tipjar_id) - - if not tipjar: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="TipJar does not exist." - ) - - if tipjar.wallet != wallet.wallet.id: - raise HTTPException( - status_code=HTTPStatus.FORBIDDEN, detail="Not your tipjar." - ) - - tipjar = await update_tipjar(str(tipjar_id), **data.dict()) - else: - raise HTTPException( - status_code=HTTPStatus.BAD_REQUEST, detail="No tipjar ID specified" - ) - return tipjar.dict() - - -@tipjar_ext.delete("/api/v1/tips/{tip_id}") -async def api_delete_tip( - wallet: WalletTypeInfo = Depends(get_key_type), tip_id: str = Query(None) -): - """Delete the tip with the given tip_id""" - tip = await get_tip(tip_id) - if not tip: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="No tip with this ID!" - ) - if tip.wallet != wallet.wallet.id: - raise HTTPException( - status_code=HTTPStatus.FORBIDDEN, - detail="Not authorized to delete this tip!", - ) - await delete_tip(tip_id) - - return "", HTTPStatus.NO_CONTENT - - -@tipjar_ext.delete("/api/v1/tipjars/{tipjar_id}") -async def api_delete_tipjar( - wallet: WalletTypeInfo = Depends(get_key_type), tipjar_id: int = Query(None) -): - """Delete the tipjar with the given tipjar_id""" - tipjar = await get_tipjar(tipjar_id) - if not tipjar: - raise HTTPException( - status_code=HTTPStatus.NOT_FOUND, detail="No tipjar with this ID!" - ) - if tipjar.wallet != wallet.wallet.id: - - raise HTTPException( - status_code=HTTPStatus.FORBIDDEN, - detail="Not authorized to delete this tipjar!", - ) - await delete_tipjar(tipjar_id) - - return "", HTTPStatus.NO_CONTENT