mirror of
https://github.com/nexus-stc/hyperboria
synced 2024-12-12 04:37:50 +01:00
83 lines
2.7 KiB
Python
83 lines
2.7 KiB
Python
|
import asyncio
|
||
|
|
||
|
from aioipfs import AsyncIPFS
|
||
|
from library.aiogrpctools.base import BaseService
|
||
|
from nexus.views.telegram.common import vote_button
|
||
|
from telethon.errors import rpcerrorlist
|
||
|
from telethon.tl.types import DocumentAttributeFilename
|
||
|
from tenacity import (
|
||
|
retry,
|
||
|
retry_if_exception_type,
|
||
|
stop_after_attempt,
|
||
|
)
|
||
|
|
||
|
|
||
|
def is_group_or_channel(chat_id: int):
|
||
|
return chat_id < 0
|
||
|
|
||
|
|
||
|
class BaseHubService(BaseService):
|
||
|
def __init__(self, service_name: str, bot_external_name: str, ipfs_config: dict, telegram_client):
|
||
|
super().__init__(service_name=service_name)
|
||
|
self.bot_external_name = bot_external_name
|
||
|
self.ipfs_client = AsyncIPFS(host=ipfs_config['address'], port=ipfs_config['port'])
|
||
|
self.telegram_client = telegram_client
|
||
|
|
||
|
async def get_ipfs_hashes(self, file):
|
||
|
return list(map(
|
||
|
lambda x: x['Hash'],
|
||
|
await asyncio.gather(
|
||
|
self.ipfs_client.add_bytes(file, cid_version=1, hash='blake2b-256', only_hash=True),
|
||
|
self.ipfs_client.add_bytes(file, cid_version=0, hash='sha2-256', only_hash=True),
|
||
|
)
|
||
|
))
|
||
|
|
||
|
@retry(
|
||
|
reraise=True,
|
||
|
stop=stop_after_attempt(3),
|
||
|
retry=retry_if_exception_type((rpcerrorlist.TimeoutError, ValueError)),
|
||
|
)
|
||
|
async def send_file(
|
||
|
self,
|
||
|
document_view,
|
||
|
file,
|
||
|
request_context,
|
||
|
session_id,
|
||
|
document_id=None,
|
||
|
voting=True,
|
||
|
progress_callback=None,
|
||
|
):
|
||
|
if document_id is None:
|
||
|
document_id = document_view.id
|
||
|
buttons = None
|
||
|
if voting:
|
||
|
buttons = [
|
||
|
vote_button(
|
||
|
case='broken',
|
||
|
document_id=document_id,
|
||
|
language=request_context.chat.language,
|
||
|
session_id=session_id,
|
||
|
),
|
||
|
vote_button(
|
||
|
case='ok',
|
||
|
document_id=document_id,
|
||
|
language=request_context.chat.language,
|
||
|
session_id=session_id,
|
||
|
),
|
||
|
]
|
||
|
message = await self.telegram_client.send_file(
|
||
|
attributes=[DocumentAttributeFilename(document_view.get_filename())],
|
||
|
buttons=buttons,
|
||
|
caption=f"{document_view.generate_body(language=request_context.chat.language, limit=512)}\n"
|
||
|
f"@{self.bot_external_name}",
|
||
|
entity=request_context.chat.id,
|
||
|
file=file,
|
||
|
progress_callback=progress_callback
|
||
|
)
|
||
|
request_context.statbox(
|
||
|
action='sent',
|
||
|
document_id=document_id,
|
||
|
voting=voting,
|
||
|
)
|
||
|
return message
|