From c239c4f552daae53796601959dc4f96003703ba7 Mon Sep 17 00:00:00 2001 From: ben Date: Thu, 8 Dec 2022 13:45:38 +0000 Subject: [PATCH] Endpoints working --- lnbits/extensions/gerty/__init__.py | 10 ++ lnbits/extensions/gerty/crud.py | 7 +- lnbits/extensions/gerty/helpers.py | 2 +- lnbits/extensions/gerty/migrations.py | 3 +- lnbits/extensions/gerty/models.py | 2 + lnbits/extensions/gerty/static/gerty.jpg | Bin 0 -> 29664 bytes .../gerty/templates/gerty/_api_docs.html | 97 ++--------- .../gerty/templates/gerty/index.html | 150 +++++++++++++----- 8 files changed, 147 insertions(+), 124 deletions(-) create mode 100644 lnbits/extensions/gerty/static/gerty.jpg diff --git a/lnbits/extensions/gerty/__init__.py b/lnbits/extensions/gerty/__init__.py index 03fdef12b..bd353c78e 100644 --- a/lnbits/extensions/gerty/__init__.py +++ b/lnbits/extensions/gerty/__init__.py @@ -9,6 +9,16 @@ from lnbits.tasks import catch_everything_and_restart db = Database("ext_gerty") + +gerty_static_files = [ + { + "path": "/gerty/static", + "app": StaticFiles(packages=[("lnbits", "extensions/gerty/static")]), + "name": "gerty_static", + } +] + + gerty_ext: APIRouter = APIRouter(prefix="/gerty", tags=["Gerty"]) diff --git a/lnbits/extensions/gerty/crud.py b/lnbits/extensions/gerty/crud.py index e4a1713a5..c6516cf2e 100644 --- a/lnbits/extensions/gerty/crud.py +++ b/lnbits/extensions/gerty/crud.py @@ -81,6 +81,7 @@ async def delete_gerty(gerty_id: str) -> None: async def get_mempool_info(endPoint: str, gerty) -> Optional[Mempool]: + logger.debug(endPoint) endpoints = MempoolEndpoint() url = "" for endpoint in endpoints: @@ -96,17 +97,21 @@ async def get_mempool_info(endPoint: str, gerty) -> Optional[Mempool]: if not row: async with httpx.AsyncClient() as client: response = await client.get(gerty.mempool_endpoint + url) + logger.debug(gerty.mempool_endpoint + url) + mempool_id = urlsafe_short_hash() await db.execute( """ INSERT INTO gerty.mempool ( + id, data, endpoint, time, mempool_endpoint ) - VALUES (?, ?, ?, ?) + VALUES (?, ?, ?, ?, ?) """, ( + mempool_id, json.dumps(response.json()), endPoint, int(time.time()), diff --git a/lnbits/extensions/gerty/helpers.py b/lnbits/extensions/gerty/helpers.py index 1f8c1cafb..16f0c8cb9 100644 --- a/lnbits/extensions/gerty/helpers.py +++ b/lnbits/extensions/gerty/helpers.py @@ -80,7 +80,7 @@ async def get_mining_dashboard(gerty): if isinstance(gerty.mempool_endpoint, str): async with httpx.AsyncClient() as client: # current hashrate - r = await get_mempool_info("get_hashrate_1w", gerty) + r = await get_mempool_info("hashrate_1w", gerty) data = r hashrateNow = data["currentHashrate"] hashrateOneWeekAgo = data["hashrates"][6]["avgHashrate"] diff --git a/lnbits/extensions/gerty/migrations.py b/lnbits/extensions/gerty/migrations.py index 830b8cfdd..4a5910f45 100644 --- a/lnbits/extensions/gerty/migrations.py +++ b/lnbits/extensions/gerty/migrations.py @@ -42,7 +42,8 @@ async def m004_initial(db): await db.execute( """ CREATE TABLE gerty.mempool ( - mempool_endpoint TEXT PRIMARY KEY, + id TEXT PRIMARY KEY, + mempool_endpoint TEXT NOT NULL, endpoint TEXT NOT NULL, data TEXT NOT NULL, time TIMESTAMP diff --git a/lnbits/extensions/gerty/models.py b/lnbits/extensions/gerty/models.py index 4bb82d74e..11a44e6eb 100644 --- a/lnbits/extensions/gerty/models.py +++ b/lnbits/extensions/gerty/models.py @@ -10,6 +10,7 @@ class Gerty(BaseModel): name: str refresh_time: int = Query(None) utc_offset: int = Query(None) + wallet: str = Query(None) type: str lnbits_wallets: str = Query( None @@ -39,6 +40,7 @@ class MempoolEndpoint(BaseModel): class Mempool(BaseModel): + id: str = Query(None) mempool_endpoint: str = Query(None) endpoint: str = Query(None) data: str = Query(None) diff --git a/lnbits/extensions/gerty/static/gerty.jpg b/lnbits/extensions/gerty/static/gerty.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe208cdd9301375553739831eb3c6a8ab4e03825 GIT binary patch literal 29664 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
  • $|;P&UW)R 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 - - - - - GET /gerty/api/v1/gertys -
    Headers
    - {"X-Api-Key": <invoice_key>}
    -
    Body (application/json)
    -
    - Returns 200 OK (application/json) -
    - [<gerty_object>, ...] -
    Curl example
    - curl -X GET {{ request.base_url }}gerty/api/v1/gertys -H "X-Api-Key: - <invoice_key>" - -
    -
    -
    - - - - POST /gerty/api/v1/gertys -
    Headers
    - {"X-Api-Key": <invoice_key>}
    -
    Body (application/json)
    - {"name": <string>, "currency": <string*ie USD*>} -
    - Returns 201 CREATED (application/json) -
    - {"currency": <string>, "id": <string>, "name": - <string>, "wallet": <string>} -
    Curl example
    - curl -X POST {{ request.base_url }}gerty/api/v1/gertys -d '{"name": - <string>, "currency": <string>}' -H "Content-type: - application/json" -H "X-Api-Key: <admin_key>" - -
    -
    -
    - - - - - DELETE - /gerty/api/v1/gertys/<gerty_id> -
    Headers
    - {"X-Api-Key": <admin_key>}
    -
    Returns 204 NO CONTENT
    - -
    Curl example
    - curl -X DELETE {{ request.base_url - }}gerty/api/v1/gertys/<gerty_id> -H "X-Api-Key: - <admin_key>" - -
    -
    -
    - + +

    + Gerty (your bitcoin assistant): Use the software Gerty or + hardware Gerty
    + + Created by, Black Coffee, + Ben Arc +

    + +
    diff --git a/lnbits/extensions/gerty/templates/gerty/index.html b/lnbits/extensions/gerty/templates/gerty/index.html index 61a22d8ab..501708bcb 100644 --- a/lnbits/extensions/gerty/templates/gerty/index.html +++ b/lnbits/extensions/gerty/templates/gerty/index.html @@ -107,9 +107,21 @@
    -
    - {{ SITE_TITLE }} Gerty extension -
    +
    +
    +
    + {{ SITE_TITLE }} Gerty extension +
    +
    +
    + +
    +
    @@ -309,12 +321,50 @@ >The amount of time in seconds between screen updates - -

    Gerty Device Dashboards (for Gerty devices):

    - - - - + +

    + Gerty Device Dashboards (for Gerty + devices): +

    + + + +
    @@ -570,6 +620,8 @@ formDialog: { show: false, data: { + type: 'Mini Gerty', + exchange: 'USD', utc_offset: new Date().getTimezoneOffset(), display_preferences: { dashboard: false, @@ -597,41 +649,44 @@ } } }, - mounted() { - console.log('this.formDialog', this.formDialog.data.display_preferences) - }, methods: { - setAdvanced: function(){ - self = this - self.formDialog.data.mempool_endpoint = 'https://mempool.space' - self.formDialog.data.refresh_time = 300 - }, - setWallets: function() { - self = this - if(!self.formDialog.data.display_preferences.lnbits_wallets_balance){ - self.formDialog.data.lnbits_wallets = [] - } - }, - setOnchain: function() { - self = this - self.formDialog.data.display_preferences.onchain_difficulty_epoch_progress = self.toggleStates.onchain - self.formDialog.data.display_preferences.onchain_difficulty_retarget_date = self.toggleStates.onchain - self.formDialog.data.display_preferences.onchain_difficulty_blocks_remaining = !self.toggleStates.onchain - self.formDialog.data.display_preferences.onchain_difficulty_epoch_time_remaining = self.toggleStates.onchain - self.formDialog.data.display_preferences.onchain_block_height = self.toggleStates.onchain - }, - setMining: function() { - self = this - self.formDialog.data.display_preferences.mining_current_hash_rate = self.toggleStates.mining - self.formDialog.data.display_preferences.mining_current_difficulty = self.toggleStates.mining - }, + setAdvanced: function () { + self = this + self.formDialog.data.mempool_endpoint = 'https://mempool.space' + self.formDialog.data.refresh_time = 300 + }, + setWallets: function () { + self = this + if (!self.formDialog.data.display_preferences.lnbits_wallets_balance) { + self.formDialog.data.lnbits_wallets = [] + } + }, + setOnchain: function () { + self = this + self.formDialog.data.display_preferences.onchain_difficulty_epoch_progress = + self.toggleStates.onchain + self.formDialog.data.display_preferences.onchain_difficulty_retarget_date = + self.toggleStates.onchain + self.formDialog.data.display_preferences.onchain_difficulty_blocks_remaining = !self + .toggleStates.onchain + self.formDialog.data.display_preferences.onchain_difficulty_epoch_time_remaining = + self.toggleStates.onchain + self.formDialog.data.display_preferences.onchain_block_height = + self.toggleStates.onchain + }, + setMining: function () { + self = this + self.formDialog.data.display_preferences.mining_current_hash_rate = + self.toggleStates.mining + self.formDialog.data.display_preferences.mining_current_difficulty = + self.toggleStates.mining + }, closeFormDialog: function () { this.formDialog.data = { utc_offset: 0, lnbits_wallets: [], mempool_endpoint: 'https://mempool.space', refresh_time: 300, - type: 'Gerty', display_preferences: {} } }, @@ -651,7 +706,6 @@ }, updateformDialog: function (formId) { var gerty = _.findWhere(this.gertys, {id: formId}) - console.log('gerty.display_preferences', gerty.display_preferences) this.formDialog.data.id = gerty.id this.formDialog.data.name = gerty.name this.formDialog.data.type = gerty.type @@ -666,7 +720,6 @@ (this.formDialog.show = true) }, sendFormDataGerty: function () { - console.log(this.formDialog.data) if (this.formDialog.data.id) { this.updateGerty( this.g.user.wallets[0].adminkey, @@ -680,6 +733,14 @@ } }, createGerty: function () { + if ( + this.formDialog.data.display_preferences.dashboard || + this.formDialog.data.display_preferences.dashboard_onchain || + this.formDialog.data.display_preferences.dashboard_onchain || + this.formDialog.data.display_preferences.lightning_dashboard + ) { + this.formDialog.data.type = 'Gerty' + } var data = { name: this.formDialog.data.name, utc_offset: this.formDialog.data.utc_offset, @@ -693,7 +754,6 @@ ) } var self = this - console.log(data) LNbits.api .request( 'POST', @@ -711,6 +771,14 @@ }, updateGerty: function (wallet, data) { var self = this + if ( + this.formDialog.data.display_preferences.dashboard || + this.formDialog.data.display_preferences.dashboard_onchain || + this.formDialog.data.display_preferences.dashboard_onchain || + this.formDialog.data.display_preferences.lightning_dashboard + ) { + this.formDialog.data.type = 'Gerty' + } data.utc_offset = this.formDialog.data.utc_offset data.type = this.formDialog.data.type data.lnbits_wallets = JSON.stringify( @@ -734,8 +802,8 @@ }, deleteGerty: function (gertyId) { var self = this - var gerty = _.findWhere(this.gertys, {id: gertyId}) + var gerty = _.findWhere(self.gertys, {id: gertyId}) LNbits.utils .confirmDialog('Are you sure you want to delete this Gerty?') .onOk(function () {