| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- import operator
- from asyncio import sleep, create_task, gather, get_event_loop, Queue, current_task
- from typing import Any, List
- from aiogram.dispatcher.filters.state import StatesGroup, State
- from aiogram.types import Message, CallbackQuery
- from aiogram_dialog import Window, Dialog, DialogManager, StartMode, Data
- from aiogram_dialog.widgets.kbd import Radio
- from aiogram_dialog.widgets.text import Format
- from aiogram.types import ParseMode
- from summarize import get_summary
- from progress import Bg, background
- warn = "***Note, that it is an AI generated summary, and it may contain complete bullshit***"
- class CrossData():
- queue: Queue = Queue()
- intent_queue: dict = {}
- context: dict = {}
- class MySG(StatesGroup):
- main = State()
- cross_data = CrossData()
- buttons = [
- ("Abstract", '1'),
- ("Summary", '2'),
- ("Highlights", '3'),
- ("Findings", '4')
- ]
- async def get_data(dialog_manager: DialogManager, **kwargs):
- text_message = {"text": "OOOPS!"}
- if data := dialog_manager.current_context():
- if cr_data:=cross_data.context.get(data.id):
- data.dialog_data.update(cr_data.dialog_data)
- del cross_data.context[data.id]
- else:
- cross_data.context[data.id] = None
- item_id = data.widget_data.get('radio_buttons') #type: ignore
- title = data.start_data["title"] #type: ignore
- url = data.start_data["url"] #type: ignore
- if data.dialog_data.get('abs'): #type: ignore
- abstract = data.dialog_data.get('abs') #type: ignore
- else:
- data.dialog_data["abs"] = data.start_data["reply_message"] #type: ignore
- abstract = data.dialog_data.get('abs') #type: ignore
- if item_id == "2":
- if summary:=data.dialog_data.get("summary"):
- if isinstance(summary, list):
- while sum(len(sentence) for sentence in summary) > 3700:
- summary = summary[:-1]
- summary = " ".join(summary)
- text_message = {"text": f"{url}\n\n***{title}***\n\n{summary}\n\n{warn}"}
- elif item_id == "3":
- if highlights:=data.dialog_data.get("highlights"):
- if isinstance(highlights, list):
- highlights = "\n\n- ".join(highlights)
- text_message = {"text": f"{url}\n\n***{title}***\n\n- {highlights}\n\n{warn}"}
- elif item_id == "4":
- if findings:=data.dialog_data.get("findings"):
- if isinstance(findings, list):
- findings = "\n\n- ".join(findings)
- text_message = {"text": f"{url}\n\n***{title}***\n\n- {findings}\n\n{warn}"}
- else:
- text_message = {"text": abstract}
- return text_message
- else:
- return text_message
- async def on_button_selected(c: CallbackQuery, widget: Any, manager: DialogManager, item_id: str):
- if context := manager.current_context():
- id_, url = context.start_data["id"], context.start_data["url"] # type: ignore
- context.widget_data["radio_buttons"] = item_id
- cross_data.intent_queue[context.id] = None
- cross_data.context[context.id] = context
- if item_id == "2":
- if context.dialog_data.get('summary'):
- pass
- else:
- await c.answer("Getting summary, please wait")
- await manager.start(Bg.progress)
- gather(
- background(c, manager.bg(), cross_data, context.id),
- get_summary(cross_data=cross_data, paper_id=id_, paper_url=url, context_id=context.id),
- )
- elif item_id == "3":
- if context.dialog_data.get("highlights"):
- pass
- else:
- await c.answer("Getting highlights, please wait")
- await manager.start(Bg.progress)
- gather(
- background(c, manager.bg(), cross_data, context.id),
- get_summary(cross_data=cross_data, paper_id=id_, paper_url=url, context_id=context.id)
- )
- elif item_id == "4":
- if context.dialog_data.get("findings"):
- pass
- else:
- await c.answer("Getting findings, please wait")
- await manager.start(Bg.progress)
- gather(
- background(c, manager.bg(), cross_data, context.id),
- get_summary(cross_data=cross_data, paper_id=id_, paper_url=url, context_id=context.id)
- )
- else:
- pass
- else:
- return {"text": 1}
-
- return {"text": item_id}
- buttons_kbd = Radio(
- Format("✓ {item[0]}"),
- Format("{item[0]}"),
- id="radio_buttons",
- item_id_getter=operator.itemgetter(1),
- items=buttons,
- on_click=on_button_selected,
- )
- dialog = Dialog(
- Window(
- Format("{text}"),
- buttons_kbd,
- state=MySG.main,
- getter=get_data,
- parse_mode=ParseMode.MARKDOWN, # type: ignore
- # preview_data={"button": "1"}
- )
- )
|