Initial local state

This commit is contained in:
2026-07-15 07:17:25 +05:00
commit 68221821a5
78 changed files with 10318 additions and 0 deletions
+327
View File
@@ -0,0 +1,327 @@
# - *- 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("<b>🔍 Отправьте айди/логин пользователя или номер чека</b>")
# Рассылка
@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(
"<b>📢 Отправьте пост для рассылки пользователям</b>\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"<b>📢 Отправить <code>{len(get_users)}</code> юзерам данный пост?</b>",
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"<b>📢 Рассылка началась... (0/{len(get_users)})</b>")
await asyncio.create_task(functions_mail_make(bot, send_message, call))
else:
await call.message.edit_text("<b>📢 Вы отменили отправку рассылки ✅</b>")
################################################################################
##################################### ПОИСК ####################################
# Принятие айди/логина пользователя или чека для поиска
@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(
"<b>❌ Вы не указали поисковые данные</b>\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(
"<b>❌ Данные не были найдены</b>\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"""
<b>🧾 Чек: <code>#{purchase.purchase_receipt}</code></b>
🎁 Товар: <code>{purchase.purchase_position_name} | {purchase.purchase_count}шт | {purchase.purchase_price}₽</code>
🕰 Дата покупки: <code>{convert_date(purchase.purchase_unix)}</code>
🔗 Товары: <a href='{link_items}'>кликабельно</a>
"""),
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(
"<b>💰 Введите сумму для выдачи баланса</b>",
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(
"<b>❌ Данные были введены неверно</b>\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(
"<b>❌ Сумма выдачи не может быть меньше 1 и больше 1 000 000 000</b>\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"<b>💰 Вам было выдано <code>{message.text}₽</code></b>",
)
except Exception:
bot_logger.debug("Не удалось уведомить пользователя %s о выдаче баланса", user_id, exc_info=True)
await message.answer(
f"👤 Пользователь: <a href='tg://user?id={get_user.user_id}'>{get_user.user_name}</a>\n"
f"💰 Выдача баланса: <code>{message.text}₽</code> | <code>{get_user.user_balance}₽</code> -> <code>{round(get_user.user_balance + get_amount, 2)}₽</code>"
)
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(
"<b>💰 Введите сумму для изменения баланса</b>",
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(
"<b>❌ Данные были введены неверно</b>\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(
"<b>❌ Сумма изменения не может быть больше или меньше (-)1 000 000 000</b>\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"👤 Пользователь: <a href='tg://user?id={get_user.user_id}'>{get_user.user_name}</a>\n"
f"💰 Установка баланса: <code>{message.text}₽</code> | <code>{get_user.user_balance}₽</code> -> <code>{get_amount}₽</code>"
)
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(
"<b>💌 Введите сообщение для отправки</b>\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 = "<b>💌 Сообщение от администратора:</b>\n" + f"<code>{clear_html(message.text)}</code>"
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("<b>❌ Не удалось отправить сообщение</b>")
else:
await message.reply("<b>✅ Сообщение было успешно доставлено</b>")
await open_profile_admin(bot, message.from_user.id, get_user)