222 lines
6.4 KiB
Python
222 lines
6.4 KiB
Python
|
|
# Aiogram
|
|||
|
|
import aiogram.types as types
|
|||
|
|
from aiogram.fsm.context import FSMContext
|
|||
|
|
from aiogram.filters import StateFilter
|
|||
|
|
from aiogram import Router, F
|
|||
|
|
from aiogram.exceptions import TelegramBadRequest
|
|||
|
|
|
|||
|
|
# Const
|
|||
|
|
from create_bot import orm
|
|||
|
|
|
|||
|
|
# Keyboards
|
|||
|
|
from keyboards.admin.main_kbs import *
|
|||
|
|
|
|||
|
|
# States
|
|||
|
|
from states.admin_states import AdminStates, AdminBlacklistStates
|
|||
|
|
|
|||
|
|
# Another
|
|||
|
|
from contextlib import suppress
|
|||
|
|
|
|||
|
|
|
|||
|
|
# Init
|
|||
|
|
admin_blacklist_router = Router()
|
|||
|
|
|
|||
|
|
|
|||
|
|
@admin_blacklist_router.message(
|
|||
|
|
F.text == "🚫 Черный список", StateFilter(AdminStates.main)
|
|||
|
|
)
|
|||
|
|
@admin_blacklist_router.message(F.text == "↩️ Назад", StateFilter(AdminBlacklistStates))
|
|||
|
|
async def cmd_blacklist(message: types.Message, state: FSMContext):
|
|||
|
|
|
|||
|
|
msg_text = "🚫 Выберите действие:"
|
|||
|
|
|
|||
|
|
await message.answer(text=msg_text, reply_markup=get_blacklist_kb())
|
|||
|
|
|
|||
|
|
await state.set_state(AdminBlacklistStates.main)
|
|||
|
|
|
|||
|
|
|
|||
|
|
# *############################
|
|||
|
|
# *# ADD #
|
|||
|
|
# *############################
|
|||
|
|
|
|||
|
|
|
|||
|
|
@admin_blacklist_router.message(
|
|||
|
|
F.text == "➕ Добавить", StateFilter(AdminBlacklistStates.main)
|
|||
|
|
)
|
|||
|
|
async def cmd_blacklist_add(message: types.Message, state: FSMContext):
|
|||
|
|
|
|||
|
|
msg_text = f"➕ Введите User ID:"
|
|||
|
|
|
|||
|
|
await message.answer(text=msg_text, reply_markup=get_back_kb())
|
|||
|
|
|
|||
|
|
await state.set_state(AdminBlacklistStates.add_blacklist)
|
|||
|
|
|
|||
|
|
|
|||
|
|
@admin_blacklist_router.message(F.text, StateFilter(AdminBlacklistStates.add_blacklist))
|
|||
|
|
async def cmd_blacklist_add_finish(message: types.Message, state: FSMContext):
|
|||
|
|
|
|||
|
|
# validation
|
|||
|
|
if not message.text.isdigit():
|
|||
|
|
await message.answer(
|
|||
|
|
text="⛔️ Только цифры! Повторите попытку:", reply_markup=get_back_kb()
|
|||
|
|
)
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
user_id = int(message.text)
|
|||
|
|
|
|||
|
|
if not await orm.is_user_exists(user_id):
|
|||
|
|
await message.answer(
|
|||
|
|
text="⛔️ Пользователь не существует в БД! Повторите попытку:",
|
|||
|
|
reply_markup=get_back_kb(),
|
|||
|
|
)
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
await orm.create_blacklist(user_id=user_id)
|
|||
|
|
|
|||
|
|
await message.answer(text=f"✅ Черный список обновлен!")
|
|||
|
|
await cmd_blacklist(message, state)
|
|||
|
|
|
|||
|
|
|
|||
|
|
# *############################
|
|||
|
|
# *# DEL #
|
|||
|
|
# *############################
|
|||
|
|
|
|||
|
|
|
|||
|
|
@admin_blacklist_router.message(
|
|||
|
|
F.text == "➖ Удалить", StateFilter(AdminBlacklistStates.main)
|
|||
|
|
)
|
|||
|
|
async def cmd_blacklist_delete(message: types.Message, state: FSMContext):
|
|||
|
|
|
|||
|
|
msg_text = "➖ Введите User ID:"
|
|||
|
|
|
|||
|
|
await message.answer(text=msg_text, reply_markup=get_back_kb())
|
|||
|
|
|
|||
|
|
await state.set_state(AdminBlacklistStates.del_blacklist)
|
|||
|
|
|
|||
|
|
|
|||
|
|
@admin_blacklist_router.message(F.text, StateFilter(AdminBlacklistStates.del_blacklist))
|
|||
|
|
async def cmd_blacklist_delete_finish(message: types.Message, state: FSMContext):
|
|||
|
|
|
|||
|
|
# validation
|
|||
|
|
if not message.text.isdigit():
|
|||
|
|
await message.answer(
|
|||
|
|
text="⛔️ Только цифры! Повторите попытку:", reply_markup=get_back_kb()
|
|||
|
|
)
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
user_id = int(message.text)
|
|||
|
|
|
|||
|
|
if not await orm.is_blacklisted(user_id):
|
|||
|
|
await message.answer(
|
|||
|
|
text="⛔️ Пользователь не найден в ЧС! Повторите попытку:",
|
|||
|
|
reply_markup=get_back_kb(),
|
|||
|
|
)
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
await orm.delete_blacklist(user_id=user_id)
|
|||
|
|
|
|||
|
|
await message.answer(text=f"✅ Черный список обновлен!")
|
|||
|
|
|
|||
|
|
await cmd_blacklist(message, state)
|
|||
|
|
|
|||
|
|
|
|||
|
|
# *############################
|
|||
|
|
# *# LIST #
|
|||
|
|
# *############################
|
|||
|
|
|
|||
|
|
|
|||
|
|
@admin_blacklist_router.message(
|
|||
|
|
F.text == "👁 Открыть список", StateFilter(AdminBlacklistStates.main)
|
|||
|
|
)
|
|||
|
|
async def cmd_blacklist_list(message: types.Message, state: FSMContext):
|
|||
|
|
|
|||
|
|
await state.update_data(blacklist_offset=0)
|
|||
|
|
items = await orm.get_all_blacklist()
|
|||
|
|
|
|||
|
|
if not items:
|
|||
|
|
await message.answer(text="💭 Список пуст.")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
offset = 0
|
|||
|
|
max_offset = len(items) // 10 + (1 if len(items) % 10 != 0 else 0)
|
|||
|
|
|
|||
|
|
msg_text = f"<b>🚫 Черный список {offset + 1}/{max_offset}</b>\n\n"
|
|||
|
|
|
|||
|
|
for item in items[offset * 10 : (offset + 1) * 10]:
|
|||
|
|
msg_text += f"✦ <code>{item}</code>\n"
|
|||
|
|
|
|||
|
|
await message.answer(
|
|||
|
|
text=msg_text,
|
|||
|
|
reply_markup=get_bookList_ikb(
|
|||
|
|
prefix="admin_blacklist",
|
|||
|
|
offset=0,
|
|||
|
|
max_offset=max_offset,
|
|||
|
|
items=[],
|
|||
|
|
element_col=10,
|
|||
|
|
),
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
|
|||
|
|
async def cmd_blacklist_list_query(query: types.CallbackQuery, state: FSMContext):
|
|||
|
|
|
|||
|
|
data = await state.get_data()
|
|||
|
|
offset = data.get("blacklist_offset")
|
|||
|
|
items = await orm.get_all_blacklist()
|
|||
|
|
|
|||
|
|
if not items:
|
|||
|
|
await query.answer(text="💭 Список пуст.")
|
|||
|
|
return
|
|||
|
|
|
|||
|
|
max_offset = len(items) // 10 + (1 if len(items) % 10 != 0 else 0)
|
|||
|
|
|
|||
|
|
if offset < 0:
|
|||
|
|
offset = max_offset - 1
|
|||
|
|
await state.update_data(blacklist_offset=offset)
|
|||
|
|
elif offset >= max_offset:
|
|||
|
|
offset = 0
|
|||
|
|
await state.update_data(blacklist_offset=offset)
|
|||
|
|
|
|||
|
|
msg_text = f"<b>🚫 Черный список {offset + 1}/{max_offset}</b>\n\n"
|
|||
|
|
|
|||
|
|
for item in items[offset * 10 : (offset + 1) * 10]:
|
|||
|
|
msg_text += f"✦ <code>{item}</code>\n"
|
|||
|
|
|
|||
|
|
with suppress(TelegramBadRequest):
|
|||
|
|
await query.message.edit_text(
|
|||
|
|
text=msg_text,
|
|||
|
|
reply_markup=get_bookList_ikb(
|
|||
|
|
prefix="admin_blacklist",
|
|||
|
|
offset=offset,
|
|||
|
|
max_offset=max_offset,
|
|||
|
|
items=[],
|
|||
|
|
element_col=10,
|
|||
|
|
),
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
await query.answer()
|
|||
|
|
|
|||
|
|
|
|||
|
|
@admin_blacklist_router.callback_query(
|
|||
|
|
F.data == "admin_blacklist_next", StateFilter(AdminBlacklistStates.main)
|
|||
|
|
)
|
|||
|
|
@admin_blacklist_router.callback_query(
|
|||
|
|
F.data == "admin_blacklist_prev", StateFilter(AdminBlacklistStates.main)
|
|||
|
|
)
|
|||
|
|
@admin_blacklist_router.callback_query(
|
|||
|
|
F.data == "admin_blacklist_status", StateFilter(AdminBlacklistStates.main)
|
|||
|
|
)
|
|||
|
|
async def cmd_blacklist_list_actions(query: types.CallbackQuery, state: FSMContext):
|
|||
|
|
|
|||
|
|
state_data = await state.get_data()
|
|||
|
|
|
|||
|
|
if query.data.endswith("next"):
|
|||
|
|
await state.update_data(
|
|||
|
|
blacklist_offset=state_data.get("blacklist_offset", 0) + 1
|
|||
|
|
)
|
|||
|
|
elif query.data.endswith("prev"):
|
|||
|
|
await state.update_data(
|
|||
|
|
blacklist_offset=state_data.get("blacklist_offset", 0) - 1
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
await cmd_blacklist_list_query(query, state)
|