lnbits-legend/lnbits/extensions/gerty/views_api.py

189 lines
5.7 KiB
Python
Raw Normal View History

2022-09-23 14:38:55 +01:00
import json
2022-10-20 16:31:09 +01:00
from http import HTTPStatus
2022-12-30 09:47:49 +01:00
from fastapi import Depends, Query
2022-09-23 14:38:55 +01:00
from loguru import logger
from starlette.exceptions import HTTPException
2022-12-30 09:24:31 +01:00
from lnbits.core.crud import get_user
2022-09-23 14:38:55 +01:00
from lnbits.decorators import WalletTypeInfo, get_key_type, require_admin_key
2022-09-23 14:38:55 +01:00
from . import gerty_ext
2022-12-29 19:35:58 +00:00
from .crud import (
create_gerty,
delete_gerty,
get_gerty,
get_gertys,
get_mempool_info,
update_gerty,
)
2023-01-04 17:01:02 +01:00
from .helpers import (
gerty_should_sleep,
get_next_update_time,
2023-01-04 17:09:50 +01:00
get_satoshi,
get_screen_data,
2023-01-04 17:01:02 +01:00
get_screen_slug_by_index,
)
2022-12-30 09:24:31 +01:00
from .models import Gerty
2022-09-23 14:38:55 +01:00
2022-09-23 14:38:55 +01:00
@gerty_ext.get("/api/v1/gerty", status_code=HTTPStatus.OK)
async def api_gertys(
2022-10-20 16:31:09 +01:00
all_wallets: bool = Query(False), wallet: WalletTypeInfo = Depends(get_key_type)
2022-09-23 14:38:55 +01:00
):
wallet_ids = [wallet.wallet.id]
if all_wallets:
2022-12-30 09:24:31 +01:00
user = await get_user(wallet.wallet.user)
wallet_ids = user.wallet_ids if user else []
2022-09-23 14:38:55 +01:00
return [gerty.dict() for gerty in await get_gertys(wallet_ids)]
@gerty_ext.post("/api/v1/gerty", status_code=HTTPStatus.CREATED)
@gerty_ext.put("/api/v1/gerty/{gerty_id}", status_code=HTTPStatus.OK)
async def api_link_create_or_update(
2022-10-20 16:31:09 +01:00
data: Gerty,
wallet: WalletTypeInfo = Depends(get_key_type),
gerty_id: str = Query(None),
2022-09-23 14:38:55 +01:00
):
if gerty_id:
gerty = await get_gerty(gerty_id)
if not gerty:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="Gerty does not exist"
)
if gerty.wallet != wallet.wallet.id:
raise HTTPException(
status_code=HTTPStatus.FORBIDDEN,
detail="Come on, seriously, this isn't your Gerty!",
)
data.wallet = wallet.wallet.id
gerty = await update_gerty(gerty_id, **data.dict())
2023-01-03 11:35:10 +01:00
assert gerty, HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="Gerty does not exist"
)
2022-09-23 14:38:55 +01:00
else:
gerty = await create_gerty(wallet_id=wallet.wallet.id, data=data)
return {**gerty.dict()}
2022-09-29 16:06:45 +01:00
2022-09-23 14:38:55 +01:00
@gerty_ext.delete("/api/v1/gerty/{gerty_id}")
async def api_gerty_delete(
2022-10-20 16:31:09 +01:00
gerty_id: str, wallet: WalletTypeInfo = Depends(require_admin_key)
2022-09-23 14:38:55 +01:00
):
gerty = await get_gerty(gerty_id)
if not gerty:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="Gerty does not exist."
)
if gerty.wallet != wallet.wallet.id:
raise HTTPException(status_code=HTTPStatus.FORBIDDEN, detail="Not your Gerty.")
await delete_gerty(gerty_id)
raise HTTPException(status_code=HTTPStatus.NO_CONTENT)
2023-01-03 11:37:43 +01:00
@gerty_ext.get("/api/v1/gerty/satoshiquote", status_code=HTTPStatus.OK)
async def api_gerty_satoshi():
2023-01-04 17:01:02 +01:00
return await get_satoshi()
2022-09-29 16:06:45 +01:00
2022-11-24 19:27:12 +00:00
@gerty_ext.get("/api/v1/gerty/pages/{gerty_id}/{p}")
2022-12-30 09:24:31 +01:00
async def api_gerty_json(gerty_id: str, p: int = 0): # page number
2022-09-23 14:38:55 +01:00
gerty = await get_gerty(gerty_id)
2022-09-29 16:06:45 +01:00
2022-09-23 14:38:55 +01:00
if not gerty:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="Gerty does not exist."
)
2022-09-26 18:06:09 +01:00
2022-09-29 16:06:45 +01:00
display_preferences = json.loads(gerty.display_preferences)
enabled_screen_count = 0
2022-09-26 18:06:09 +01:00
2022-09-29 16:06:45 +01:00
enabled_screens = []
for screen_slug in display_preferences:
is_screen_enabled = display_preferences[screen_slug]
if is_screen_enabled:
enabled_screen_count += 1
enabled_screens.append(screen_slug)
2022-12-30 09:24:31 +01:00
logger.debug("Screens " + str(enabled_screens))
2022-10-06 16:12:48 +01:00
data = await get_screen_data(p, enabled_screens, gerty)
2022-09-29 16:06:45 +01:00
2022-10-20 16:31:09 +01:00
next_screen_number = 0 if ((p + 1) >= enabled_screen_count) else p + 1
2022-09-29 15:08:01 +01:00
2022-10-07 10:25:54 +01:00
# get the sleep time
sleep_time = gerty.refresh_time if gerty.refresh_time else 300
2022-10-20 17:15:12 +01:00
utc_offset = gerty.utc_offset if gerty.utc_offset else 0
if gerty_should_sleep(utc_offset):
2022-10-07 22:12:48 +01:00
sleep_time_hours = 8
sleep_time = 60 * 60 * sleep_time_hours
2022-09-29 15:08:01 +01:00
2022-09-29 16:06:45 +01:00
return {
"settings": {
2022-10-07 10:25:54 +01:00
"refreshTime": sleep_time,
2022-10-20 17:15:12 +01:00
"requestTimestamp": get_next_update_time(sleep_time, utc_offset),
2022-09-29 16:06:45 +01:00
"nextScreenNumber": next_screen_number,
2022-09-30 09:17:20 +01:00
"showTextBoundRect": False,
2022-10-20 16:31:09 +01:00
"name": gerty.name,
2022-09-29 16:06:45 +01:00
},
"screen": {
"slug": get_screen_slug_by_index(p, enabled_screens),
"group": get_screen_slug_by_index(p, enabled_screens),
2022-10-20 16:31:09 +01:00
"title": data["title"],
"areas": data["areas"],
},
2022-09-29 16:06:45 +01:00
}
2022-11-24 19:27:12 +00:00
###########CACHED MEMPOOL##############
2022-11-24 19:27:12 +00:00
@gerty_ext.get("/api/v1/gerty/fees-recommended/{gerty_id}")
async def api_gerty_get_fees_recommended(gerty_id):
gerty = await get_gerty(gerty_id)
2022-11-24 23:31:22 +00:00
return await get_mempool_info("fees_recommended", gerty)
2022-11-24 19:27:12 +00:00
2022-11-24 19:27:12 +00:00
@gerty_ext.get("/api/v1/gerty/hashrate-1w/{gerty_id}")
async def api_gerty_get_hashrate_1w(gerty_id):
gerty = await get_gerty(gerty_id)
2022-11-24 23:31:22 +00:00
return await get_mempool_info("hashrate_1w", gerty)
2022-11-14 12:48:15 +00:00
2022-11-24 19:27:12 +00:00
@gerty_ext.get("/api/v1/gerty/hashrate-1m/{gerty_id}")
async def api_gerty_get_hashrate_1m(gerty_id):
gerty = await get_gerty(gerty_id)
2022-11-24 23:31:22 +00:00
return await get_mempool_info("hashrate_1m", gerty)
2022-11-24 19:27:12 +00:00
2022-11-24 19:27:12 +00:00
@gerty_ext.get("/api/v1/gerty/statistics/{gerty_id}")
async def api_gerty_get_statistics(gerty_id):
gerty = await get_gerty(gerty_id)
2022-11-24 23:31:22 +00:00
return await get_mempool_info("statistics", gerty)
2022-11-14 12:48:15 +00:00
2022-11-24 19:27:12 +00:00
@gerty_ext.get("/api/v1/gerty/difficulty-adjustment/{gerty_id}")
async def api_gerty_get_difficulty_adjustment(gerty_id):
gerty = await get_gerty(gerty_id)
2022-11-24 23:31:22 +00:00
return await get_mempool_info("difficulty_adjustment", gerty)
2022-11-24 19:27:12 +00:00
2022-11-24 19:27:12 +00:00
@gerty_ext.get("/api/v1/gerty/tip-height/{gerty_id}")
async def api_gerty_get_tip_height(gerty_id):
gerty = await get_gerty(gerty_id)
2022-11-24 23:31:22 +00:00
return await get_mempool_info("tip_height", gerty)
2022-11-24 19:27:12 +00:00
2022-11-24 19:27:12 +00:00
@gerty_ext.get("/api/v1/gerty/mempool/{gerty_id}")
async def api_gerty_get_mempool(gerty_id):
gerty = await get_gerty(gerty_id)
return await get_mempool_info("mempool", gerty)