2021-04-09 14:27:58 +02:00
|
|
|
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',
|
2021-04-13 09:39:00 +02:00
|
|
|
schema=document_view.schema,
|
2021-04-09 14:27:58 +02:00
|
|
|
document_id=document_id,
|
|
|
|
language=request_context.chat.language,
|
|
|
|
session_id=session_id,
|
|
|
|
),
|
|
|
|
vote_button(
|
|
|
|
case='ok',
|
2021-04-13 09:39:00 +02:00
|
|
|
schema=document_view.schema,
|
2021-04-09 14:27:58 +02:00
|
|
|
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}",
|
2021-04-12 19:47:21 +02:00
|
|
|
entity=request_context.chat.chat_id,
|
2021-04-09 14:27:58 +02:00
|
|
|
file=file,
|
|
|
|
progress_callback=progress_callback
|
|
|
|
)
|
|
|
|
request_context.statbox(
|
|
|
|
action='sent',
|
|
|
|
document_id=document_id,
|
2021-04-13 09:39:00 +02:00
|
|
|
schema=document_view.schema,
|
2021-04-09 14:27:58 +02:00
|
|
|
voting=voting,
|
|
|
|
)
|
|
|
|
return message
|