from aiogram_dialog.widgets.kbd import Button, Row, Group, Radio, ManagedRadio
from aiogram_dialog.widgets.input import TextInput, ManagedTextInput, MessageInput
from aiogram_dialog import Dialog, Window, ChatEvent, DialogManager
from aiogram_dialog.widgets.text import Format
from aiogram_dialog.widgets.kbd import Cancel
from aiogram_dialog.widgets.kbd import SwitchTo
from aiogram.types import CallbackQuery, Message
from aiogram.enums import ContentType
from fluentogram import TranslatorHub
from bot.dialogs.i18n_widget import I18NFormat
from bot.states.states import Knowledge, Input
from database.repositories.utils import UtilsRepository
from bot.utils.funcs_gpt import file_to_context, delete_knowledge_base
DICT_FORMATS = {
"doc": "application/msword",
"docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"md": "text/markdown",
"pdf": "application/pdf",
"pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
'txt': 'text/plain',
'py': 'text/x-python'
}
async def on_cancel_knowledge(callback: ChatEvent, widget: Button, manager: DialogManager):
state = manager.middleware_data.get('state')
await state.clear()
await callback.message.delete()
async def to_add_file(callback: ChatEvent, widget: Button, manager: DialogManager):
state = manager.middleware_data.get('state')
await state.set_state(Input.main)
await manager.switch_to(state=Knowledge.add)
async def on_input_file(message: Message, widget: MessageInput, manager: DialogManager):
utils_repo: UtilsRepository = manager.middleware_data['utils_repo']
if not message.document:
if manager.current_context().state == Knowledge.add_not_format:
pass
await manager.switch_to(state=Knowledge.add_not_format)
return
format_doc = message.document.file_name.split('.')[-1]
if format_doc not in DICT_FORMATS:
if manager.current_context().state == Knowledge.add_not_format:
pass
await manager.switch_to(state=Knowledge.add_not_format)
return
file_path = (await message.bot.get_file(file_id=message.document.file_id)).file_path
file_bytes = (await message.bot.download_file(file_path=file_path)).read()
answer = await file_to_context(utils_repo, message.document.file_name, file_bytes, mem_type=DICT_FORMATS.get(format_doc))
if answer:
state = manager.middleware_data.get('state')
await state.clear()
await manager.switch_to(state=Knowledge.add_approve)
else:
if manager.current_context().state == Knowledge.add_not_format:
pass
await manager.switch_to(state=Knowledge.add_not_format)
return
async def on_delete_knowledge_base(callback: ChatEvent, widget: Button, manager: DialogManager):
utils_repo: UtilsRepository = manager.middleware_data['utils_repo']
await delete_knowledge_base(utils_repo)
await manager.switch_to(state=Knowledge.delete_approve)
dialog = Dialog(
# / knowledge main
Window(
I18NFormat('command_knowledge_text'),
Group(
Button(
I18NFormat('command_knowledge_add_kb'),
id='knowledge_add',
on_click=to_add_file
),
SwitchTo(
I18NFormat('command_knowledge_delete_kb'),
id='knowledge_delete',
state=Knowledge.delete
),
width=2,
),
Cancel(I18NFormat('close_kb'), id='cancel_knowledge', on_click=on_cancel_knowledge),
state=Knowledge.main
),
# knowledge add
Window(
I18NFormat('command_knowledge_add_text'),
Group(
SwitchTo(
I18NFormat('back_kb'),
id='back_knowledge_add',
state=Knowledge.main
),
Cancel(I18NFormat('close_kb'), id='cancel_knowledge', on_click=on_cancel_knowledge),
width=2
),
MessageInput(
content_types=[ContentType.ANY],
func=on_input_file
),
state=Knowledge.add
),
Window(
I18NFormat('text_not_format_file'),
Cancel(I18NFormat('close_kb'), id='cancel_knowledge', on_click=on_cancel_knowledge),
MessageInput(
content_types=[ContentType.ANY],
func=on_input_file
),
state=Knowledge.add_not_format
),
Window(
I18NFormat('text_approve_file'),
Button(I18NFormat('command_knowledge_add_kb'), id='knowledge_add', on_click=to_add_file),
Cancel(I18NFormat('close_kb'), id='cancel_knowledge', on_click=on_cancel_knowledge),
state=Knowledge.add_approve
),
Window(
I18NFormat('command_knowledge_delete_text'),
Button(
I18NFormat('command_new_approve_kb'),
id='approve_delete',
on_click=on_delete_knowledge_base
),
Group(
SwitchTo(
I18NFormat('back_kb'),
id='back_knowledge_delete',
state=Knowledge.main
),
Cancel(I18NFormat('close_kb'), id='cancel_knowledge', on_click=on_cancel_knowledge),
width=2
),
state=Knowledge.delete
),
Window(
I18NFormat('text_approve_delete'),
Button(I18NFormat('command_knowledge_add_kb'), id='knowledge_add', on_click=to_add_file),
Cancel(I18NFormat('close_kb'), id='cancel_knowledge', on_click=on_cancel_knowledge),
state=Knowledge.delete_approve
)
)