mirror of
https://github.com/nexus-stc/hyperboria
synced 2024-09-12 17:06:19 +02:00
95 lines
3.2 KiB
Python
95 lines
3.2 KiB
Python
import re
|
|
import time
|
|
|
|
from grpc.experimental.aio import AioRpcError
|
|
from library.telegram.base import RequestContext
|
|
from nexus.bot.widgets.document_list_widget import DocumentListWidget
|
|
from nexus.translations import t
|
|
from telethon import events
|
|
|
|
from .base import BaseCallbackQueryHandler
|
|
|
|
|
|
class ReferencingToHandler(BaseCallbackQueryHandler):
|
|
filter = events.CallbackQuery(pattern=re.compile('^/r_([A-Za-z0-9]+)_([0-9]+)', re.DOTALL))
|
|
should_reset_last_widget = False
|
|
|
|
async def do_request(self, request_context: RequestContext, session_id: str, message_id: int, document_id: int, page: int):
|
|
start_time = time.time()
|
|
try:
|
|
document_list_widget = await DocumentListWidget.create(
|
|
application=self.application,
|
|
chat=request_context.chat,
|
|
session_id=session_id,
|
|
message_id=message_id,
|
|
request_id=request_context.request_id,
|
|
referencing_to=document_id,
|
|
page=page,
|
|
)
|
|
except AioRpcError as e:
|
|
raise e
|
|
|
|
action = 'referencing_to_found'
|
|
if len(document_list_widget.scored_documents) == 0:
|
|
action = 'referencing_to_not_found'
|
|
|
|
request_context.statbox(
|
|
action=action,
|
|
duration=time.time() - start_time,
|
|
query=f'{document_id}',
|
|
)
|
|
|
|
serp, buttons = await document_list_widget.render()
|
|
return await self.application.telegram_client.edit_message(
|
|
request_context.chat.id,
|
|
message_id,
|
|
serp,
|
|
buttons=buttons,
|
|
link_preview=False,
|
|
)
|
|
|
|
async def handler(self, event, request_context: RequestContext):
|
|
session_id = event.pattern_match.group(1).decode()
|
|
document_id = int(event.pattern_match.group(2).decode())
|
|
|
|
request_context.add_default_fields(
|
|
mode='referencing_to',
|
|
session_id=session_id,
|
|
)
|
|
|
|
prefetch_message = await event.respond(
|
|
t("SEARCHING", language=request_context.chat.language),
|
|
)
|
|
message_id = prefetch_message.id
|
|
|
|
return await self.do_request(
|
|
request_context=request_context,
|
|
session_id=session_id,
|
|
message_id=message_id,
|
|
document_id=document_id,
|
|
page=0,
|
|
)
|
|
|
|
|
|
class ReferencingToPagingHandler(ReferencingToHandler):
|
|
filter = events.CallbackQuery(pattern=re.compile('^/rp_([A-Za-z0-9]+)_([0-9]+)_([0-9]+)_([0-9]+)', re.DOTALL))
|
|
|
|
async def handler(self, event: events.ChatAction, request_context: RequestContext):
|
|
session_id = event.pattern_match.group(1).decode()
|
|
message_id = int(event.pattern_match.group(2).decode())
|
|
document_id = int(event.pattern_match.group(3).decode())
|
|
page = int(event.pattern_match.group(4).decode())
|
|
|
|
request_context.add_default_fields(
|
|
mode='referencing_to_paging',
|
|
session_id=session_id,
|
|
)
|
|
|
|
return await self.do_request(
|
|
request_context=request_context,
|
|
session_id=session_id,
|
|
message_id=message_id,
|
|
document_id=document_id,
|
|
page=page,
|
|
)
|