135 lines
3.4 KiB
Python
135 lines
3.4 KiB
Python
|
import logging
|
|||
|
|
|||
|
from aiogram import Router, F
|
|||
|
from aiogram.fsm.context import FSMContext
|
|||
|
from aiogram.types import CallbackQuery, FSInputFile, Message
|
|||
|
|
|||
|
from templates import ban_words as tban_words
|
|||
|
from templates import commands as tcommands
|
|||
|
from utils.defs import delete_msg, create_xlsx
|
|||
|
from utils.db import Redis, Postgres
|
|||
|
|
|||
|
router = Router()
|
|||
|
|
|||
|
|
|||
|
@router.callback_query(F.data == 'ban_words')
|
|||
|
async def ban_words_btn(call: CallbackQuery, state: FSMContext):
|
|||
|
"""
|
|||
|
Ловит кнопку 🚫 Стоп слова
|
|||
|
:param call: CallbackQuery
|
|||
|
:param state: FSMContext
|
|||
|
:return:
|
|||
|
"""
|
|||
|
state_data = await state.get_data()
|
|||
|
|
|||
|
document_path = await create_xlsx()
|
|||
|
|
|||
|
last_msg = await call.message.answer_document(
|
|||
|
document=FSInputFile(document_path),
|
|||
|
reply_markup=tban_words.actions_ikb()
|
|||
|
)
|
|||
|
|
|||
|
await delete_msg(
|
|||
|
msg=state_data.get('last_msg')
|
|||
|
)
|
|||
|
await state.update_data(
|
|||
|
last_msg=last_msg
|
|||
|
)
|
|||
|
|
|||
|
|
|||
|
@router.callback_query(F.data.startswith('ban_words_action_'))
|
|||
|
async def ban_words_action_btn(call: CallbackQuery, state: FSMContext):
|
|||
|
"""
|
|||
|
Ловит кнопки ➕ Добавить ➖ Удалить
|
|||
|
:param call: CallbackQuery
|
|||
|
:param state: FSMContext
|
|||
|
:return:
|
|||
|
"""
|
|||
|
state_data = await state.get_data()
|
|||
|
|
|||
|
last_msg = await call.message.answer(
|
|||
|
text=tban_words.send_words_text,
|
|||
|
reply_markup=tban_words.send_words_ikb()
|
|||
|
)
|
|||
|
|
|||
|
await state.update_data(
|
|||
|
last_msg=last_msg,
|
|||
|
ban_words_action=call.data[17:]
|
|||
|
)
|
|||
|
|
|||
|
await state.set_state(
|
|||
|
state=tban_words.SendState.words
|
|||
|
)
|
|||
|
|
|||
|
await delete_msg(
|
|||
|
msg=state_data.get('last_msg')
|
|||
|
)
|
|||
|
|
|||
|
|
|||
|
@router.message(tban_words.SendState.words, F.text)
|
|||
|
async def get_words(msg: Message, state: FSMContext):
|
|||
|
"""
|
|||
|
Ловит новое сообщение
|
|||
|
:param msg: Message
|
|||
|
:param state: FSMContext
|
|||
|
:return:
|
|||
|
"""
|
|||
|
state_data = await state.get_data()
|
|||
|
words = msg.text.split('\n')
|
|||
|
|
|||
|
r = Redis()
|
|||
|
p = Postgres()
|
|||
|
|
|||
|
redis_ban_words = await r.get_list(
|
|||
|
key='ban_words'
|
|||
|
)
|
|||
|
|
|||
|
if state_data['ban_words_action'] == 'add':
|
|||
|
msg_text = tban_words.success_text.format(
|
|||
|
action='добавлены'
|
|||
|
)
|
|||
|
for word in words:
|
|||
|
await p.create_row(
|
|||
|
table_name='ban_words',
|
|||
|
data_to_insert={'word': word.lower()}
|
|||
|
)
|
|||
|
redis_ban_words.append(word.lower())
|
|||
|
|
|||
|
else:
|
|||
|
msg_text = tban_words.success_text.format(
|
|||
|
action='удалены'
|
|||
|
)
|
|||
|
not_deleted = []
|
|||
|
for word in words:
|
|||
|
try:
|
|||
|
await p.query(
|
|||
|
query_text=f"DELETE FROM ban_words WHERE LOWER(word)='{word.lower()}'"
|
|||
|
)
|
|||
|
redis_ban_words.remove(word.lower())
|
|||
|
except Exception as e:
|
|||
|
logging.error(f'get_words {e}')
|
|||
|
not_deleted.append(word)
|
|||
|
|
|||
|
if not_deleted:
|
|||
|
msg_text = tban_words.not_success_remove_text.format(
|
|||
|
words='\n'.join(not_deleted)
|
|||
|
)
|
|||
|
|
|||
|
await state_data['last_msg'].edit_text(
|
|||
|
text=msg_text,
|
|||
|
reply_markup=await tcommands.start_ikb()
|
|||
|
)
|
|||
|
await msg.delete()
|
|||
|
|
|||
|
await r.delete_key(
|
|||
|
'ban_words'
|
|||
|
)
|
|||
|
await r.update_list(
|
|||
|
'ban_words',
|
|||
|
*redis_ban_words
|
|||
|
)
|
|||
|
|
|||
|
await state.set_state(
|
|||
|
state=None
|
|||
|
)
|