uploader-bot/app/bot/routers/content.py

80 lines
2.8 KiB
Python

import base58
from aiogram import types, Router, F
from app.core._config import WEB_APP_URLS
from app.core._keyboards import get_inline_keyboard
from app.core._utils.tg_process_template import tg_process_template
from app.core.logger import make_log
from app.core.models.node_storage import StoredContent
from sqlalchemy import select, and_
import json
router = Router()
def chunks(lst, n):
"""Yield successive n-sized chunks from lst."""
for i in range(0, len(lst), n):
yield lst[i:i + n]
async def t_callback_owned_content(query: types.CallbackQuery, memory=None, user=None, db_session=None, chat_wrap=None, **extra):
message_text = user.translated("ownedContent_menu")
content_list = []
user_addr = await user.wallet_address_async(db_session)
result = await db_session.execute(select(StoredContent).where(
and_(StoredContent.owner_address == user_addr, StoredContent.type == 'onchain/content')
))
for content in result.scalars().all():
try:
metadata_content = await StoredContent.from_cid_async(db_session, content.json_format()['metadata_cid'])
with open(metadata_content.filepath, 'r') as f:
metadata_content_json = json.loads(f.read())
except BaseException as e:
make_log("OwnedContent", f"Can't get metadata content: {e}", level='warning')
continue
content_list.append([
{
'text': metadata_content_json['name'],
'callback_data': f'NC_{content.id}'
}
])
return await tg_process_template(
chat_wrap, message_text,
keyboard=get_inline_keyboard([
*content_list,
[{
'text': user.translated('webApp_uploadContent_button'),
'web_app': types.WebAppInfo(
url=WEB_APP_URLS['uploadContent']
)
}],
[{
'text': user.translated('back_button'),
'callback_data': 'home'
}]
]), message_id=query.message.message_id
)
async def t_callback_node_content(query: types.CallbackQuery, memory=None, user=None, db_session=None, chat_wrap=None, **extra):
content_oid = int(query.data.split('_')[1])
row = (await db_session.execute(select(StoredContent).where(StoredContent.id == content_oid))).scalars().first()
return await chat_wrap.send_content(
db_session, row,
extra_buttons=[
[{
'text': user.translated('back_button'),
'callback_data': 'ownedContent'
}]
],
message_id=query.message.message_id
)
router.callback_query.register(t_callback_owned_content, F.data == 'ownedContent')
router.callback_query.register(t_callback_node_content, F.data.startswith('NC_'))