# - *- coding: utf- 8 - *-
import asyncio
from aiogram import Router, Bot, F
from aiogram.filters import StateFilter
from aiogram.types import CallbackQuery, Message
from tgbot.database import Purchasesx, Refillx, Userx
from tgbot.keyboards.inline_admin import profile_edit_return_finl, mail_confirm_finl
from tgbot.services.api_hosting_text import HostingAPI
from tgbot.utils.const_functions import is_number, to_number, del_message, ded, clear_html, convert_date
from tgbot.utils.misc.bot_logging import bot_logger
from tgbot.utils.misc.bot_models import FSM, ARS
from tgbot.utils.misc_functions import functions_mail_make
from tgbot.utils.text_functions import open_profile_admin, refill_open_admin, purchase_open_admin
router = Router(name=__name__)
# Поиск чеков и профилей
@router.message(F.text == "🔍 Поиск")
async def functions_find(message: Message, bot: Bot, state: FSM, arSession: ARS):
await state.clear()
await state.set_state("here_find")
await message.answer("🔍 Отправьте айди/логин пользователя или номер чека")
# Рассылка
@router.message(F.text == "📢 Рассылка")
async def functions_mail(message: Message, bot: Bot, state: FSM, arSession: ARS):
await state.clear()
await state.set_state("here_mail_message")
await message.answer(
"📢 Отправьте пост для рассылки пользователям\n"
"❕ Поддерживаются посты с любыми медиафайлами",
)
################################################################################
################################### РАССЫЛКА ###################################
# Принятие текста для рассылки
@router.message(StateFilter("here_mail_message"))
async def functions_mail_get(message: Message, bot: Bot, state: FSM, arSession: ARS):
await state.update_data(here_mail_message=message)
await state.set_state("here_mail_confirm")
get_users = await Userx().get_all()
await message.reply(
f"📢 Отправить {len(get_users)} юзерам данный пост?",
reply_markup=mail_confirm_finl(),
)
# Подтверждение отправки рассылки
@router.callback_query(F.data.startswith("mail_confirm:"), StateFilter("here_mail_confirm"))
async def functions_mail_confirm(call: CallbackQuery, bot: Bot, state: FSM, arSession: ARS):
get_status = call.data.split(":")[1]
send_message = (await state.get_data())['here_mail_message']
await state.clear()
if get_status == "Yes":
get_users = await Userx().get_all()
await call.message.edit_text(f"📢 Рассылка началась... (0/{len(get_users)})")
await asyncio.create_task(functions_mail_make(bot, send_message, call))
else:
await call.message.edit_text("📢 Вы отменили отправку рассылки ✅")
################################################################################
##################################### ПОИСК ####################################
# Принятие айди/логина пользователя или чека для поиска
@router.message(F.text, StateFilter("here_find"))
@router.message(F.text.lower().startswith(('.find', 'find')))
async def functions_find_get(message: Message, bot: Bot, state: FSM, arSession: ARS):
find_data = message.text.lower()
if ".find" in find_data or "find" in find_data:
if len(find_data.split(" ")) >= 2:
if ".find" in find_data or "find" in find_data:
find_data = message.text.split(" ")[1]
else:
return await message.answer(
"❌ Вы не указали поисковые данные\n"
"🔍 Отправьте айди/логин пользователя или номер чека",
)
if find_data.startswith("@") or find_data.startswith("#"):
find_data = find_data[1:]
if find_data.isdigit():
get_user = await Userx().get(user_id=find_data)
else:
get_user = await Userx().get(user_login=find_data.lower())
get_refill = await Refillx().get(refill_receipt=find_data)
get_purchase = await Purchasesx().get(purchase_receipt=find_data)
if get_user is None and get_refill is None and get_purchase is None:
return await message.answer(
"❌ Данные не были найдены\n"
"🔍 Отправьте айди/логин пользователя или номер чека",
)
await state.clear()
if get_user is not None:
return await open_profile_admin(bot, message.from_user.id, get_user)
if get_refill is not None:
return await refill_open_admin(bot, message.from_user.id, get_refill)
if get_purchase is not None:
return await purchase_open_admin(bot, arSession, message.from_user.id, get_purchase)
################################################################################
############################## УПРАВЛЕНИЕ ПРОФИЛЕМ #############################
# Обновление профиля пользователя
@router.callback_query(F.data.startswith("admin_user_refresh:"))
async def functions_user_refresh(call: CallbackQuery, bot: Bot, state: FSM, arSession: ARS):
user_id = int(call.data.split(":")[1])
get_user = await Userx().get_required(user_id=user_id)
await state.clear()
await del_message(call.message)
await open_profile_admin(bot, call.from_user.id, get_user)
# Покупки пользователя
@router.callback_query(F.data.startswith("admin_user_purchases:"))
async def functions_user_purchases(call: CallbackQuery, bot: Bot, state: FSM, arSession: ARS):
user_id = int(call.data.split(":")[1])
get_user = await Userx().get_required(user_id=user_id)
get_purchases = await Purchasesx().gets(user_id=user_id)
get_purchases = get_purchases[-10:]
if len(get_purchases) < 1:
return await call.answer("❗ У пользователя отсутствуют покупки", True)
await call.answer("🎁 Последние 10 покупок")
await del_message(call.message)
for purchase in get_purchases:
link_items = await (
await HostingAPI.connect(
bot=bot,
arSession=arSession,
)
).upload_text(purchase.purchase_data)
await call.message.answer(
ded(f"""
🧾 Чек: #{purchase.purchase_receipt}
🎁 Товар: {purchase.purchase_position_name} | {purchase.purchase_count}шт | {purchase.purchase_price}₽
🕰 Дата покупки: {convert_date(purchase.purchase_unix)}
🔗 Товары: кликабельно
"""),
disable_web_page_preview=True,
)
await asyncio.sleep(0.2)
await open_profile_admin(bot, call.from_user.id, get_user)
# Выдача баланса пользователю
@router.callback_query(F.data.startswith("admin_user_balance_add:"))
async def functions_user_balance_add(call: CallbackQuery, bot: Bot, state: FSM, arSession: ARS):
user_id = int(call.data.split(":")[1])
await state.update_data(here_user=user_id)
await state.set_state("here_user_add")
await call.message.edit_text(
"💰 Введите сумму для выдачи баланса",
reply_markup=profile_edit_return_finl(user_id),
)
# Принятие суммы для выдачи баланса пользователю
@router.message(F.text, StateFilter("here_user_add"))
async def functions_user_balance_add_get(message: Message, bot: Bot, state: FSM, arSession: ARS):
user_id = (await state.get_data())['here_user']
if not is_number(message.text):
return await message.answer(
"❌ Данные были введены неверно\n"
"💰 Введите сумму для выдачи баланса",
reply_markup=profile_edit_return_finl(user_id),
)
get_amount = to_number(message.text)
if get_amount <= 0 or get_amount > 1_000_000_000:
return await message.answer(
"❌ Сумма выдачи не может быть меньше 1 и больше 1 000 000 000\n"
"💰 Введите сумму для выдачи баланса",
reply_markup=profile_edit_return_finl(user_id),
)
await state.clear()
get_user = await Userx().get_required(user_id=user_id)
await Userx().update(
user_id,
user_balance=round(get_user.user_balance + get_amount, 2),
user_give=round(get_user.user_give + get_amount, 2),
)
try:
await bot.send_message(
user_id,
f"💰 Вам было выдано {message.text}₽",
)
except Exception:
bot_logger.debug("Не удалось уведомить пользователя %s о выдаче баланса", user_id, exc_info=True)
await message.answer(
f"👤 Пользователь: {get_user.user_name}\n"
f"💰 Выдача баланса: {message.text}₽ | {get_user.user_balance}₽ -> {round(get_user.user_balance + get_amount, 2)}₽"
)
get_user = await Userx().get_required(user_id=user_id)
await open_profile_admin(bot, message.from_user.id, get_user)
# Изменение баланса пользователю
@router.callback_query(F.data.startswith("admin_user_balance_set:"))
async def functions_user_balance_set(call: CallbackQuery, bot: Bot, state: FSM, arSession: ARS):
user_id = int(call.data.split(":")[1])
await state.update_data(here_user=user_id)
await state.set_state("here_user_set")
await call.message.edit_text(
"💰 Введите сумму для изменения баланса",
reply_markup=profile_edit_return_finl(user_id),
)
# Принятие суммы для изменения баланса пользователя
@router.message(F.text, StateFilter("here_user_set"))
async def functions_user_balance_set_get(message: Message, bot: Bot, state: FSM, arSession: ARS):
user_id = (await state.get_data())['here_user']
if not is_number(message.text):
return await message.answer(
"❌ Данные были введены неверно\n"
"💰 Введите сумму для изменения баланса",
reply_markup=profile_edit_return_finl(user_id),
)
get_amount = to_number(message.text)
if get_amount < -1_000_000_000 or get_amount > 1_000_000_000:
return await message.answer(
"❌ Сумма изменения не может быть больше или меньше (-)1 000 000 000\n"
"💰 Введите сумму для изменения баланса",
reply_markup=profile_edit_return_finl(user_id),
)
await state.clear()
get_user = await Userx().get_required(user_id=user_id)
if get_amount > get_user.user_balance:
user_give = get_amount - get_user.user_give
else:
user_give = 0
await Userx().update(
user_id,
user_balance=get_amount,
user_give=round(get_user.user_give + user_give, 2),
)
await message.answer(
f"👤 Пользователь: {get_user.user_name}\n"
f"💰 Установка баланса: {message.text}₽ | {get_user.user_balance}₽ -> {get_amount}₽"
)
get_user = await Userx().get_required(user_id=user_id)
await open_profile_admin(bot, message.from_user.id, get_user)
# Отправка сообщения пользователю
@router.callback_query(F.data.startswith("admin_user_message:"))
async def functions_user_user_message(call: CallbackQuery, bot: Bot, state: FSM, arSession: ARS):
user_id = int(call.data.split(":")[1])
await state.update_data(here_user_id=user_id)
await state.set_state("here_user_message")
await call.message.edit_text(
"💌 Введите сообщение для отправки\n"
"⚠️ Сообщение будет сразу отправлено пользователю.",
reply_markup=profile_edit_return_finl(user_id),
)
# Принятие сообщения для отправки пользователю
@router.message(F.text, StateFilter("here_user_message"))
async def functions_user_user_message_get(message: Message, bot: Bot, state: FSM, arSession: ARS):
user_id = (await state.get_data())['here_user_id']
await state.clear()
get_message = "💌 Сообщение от администратора:\n" + f"{clear_html(message.text)}"
get_user = await Userx().get_required(user_id=user_id)
try:
await bot.send_message(user_id, get_message)
except Exception:
bot_logger.debug("Не удалось отправить сообщение пользователю %s", user_id, exc_info=True)
await message.reply("❌ Не удалось отправить сообщение")
else:
await message.reply("✅ Сообщение было успешно доставлено")
await open_profile_admin(bot, message.from_user.id, get_user)