Add modular Roblox buyer bot and documentation
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
from aiogram import F, Router
|
||||
from aiogram.filters import CommandStart
|
||||
from aiogram.fsm.context import FSMContext
|
||||
from aiogram.types import CallbackQuery, Message
|
||||
|
||||
from config import ADMIN_ID, BOT_USERNAME, SHOP_NAME
|
||||
from db.storage import load_config
|
||||
from db.users import get, register
|
||||
from keyboards.user import main_menu_kb
|
||||
from services.admin import is_admin
|
||||
from runtime import get_bot, get_log_bot
|
||||
from utils.logging import log_admin
|
||||
|
||||
router = Router(name="start")
|
||||
|
||||
|
||||
def _welcome_text(cfg) -> str:
|
||||
text = (
|
||||
f"Welcome to <b>{SHOP_NAME}</b>!\n\n"
|
||||
"You can sell cookies at these rates:\n"
|
||||
)
|
||||
for rate in cfg.rates.values():
|
||||
text += f"- {rate.name}: {rate.price:.2f} RUB\n"
|
||||
return text + (
|
||||
f"\nAVG pricing applies to {cfg.avg_min_cookies}+ cookies with donations.\n"
|
||||
f"The AVG price is capped at {cfg.avg_min_price:.2f}-{cfg.avg_max_price:.2f} RUB per cookie.\n\n"
|
||||
"Send a .txt file or paste your cookie text."
|
||||
)
|
||||
|
||||
|
||||
async def _show_start(
|
||||
message: Message,
|
||||
state: FSMContext,
|
||||
user_id: int,
|
||||
username: str | None,
|
||||
referrer: int | None = None,
|
||||
) -> None:
|
||||
await state.clear()
|
||||
is_new = register(user_id, username, referrer)
|
||||
profile = get(user_id)
|
||||
cfg = load_config()
|
||||
if profile and profile.is_banned:
|
||||
await message.answer(f"You are banned. Reason: {profile.ban_reason or '-'}")
|
||||
return
|
||||
if not cfg.bot_enabled and user_id != ADMIN_ID:
|
||||
await message.answer("The bot is temporarily disabled by an administrator.")
|
||||
return
|
||||
if is_new:
|
||||
bot = get_bot() or message.bot
|
||||
await log_admin(
|
||||
bot,
|
||||
ADMIN_ID,
|
||||
f"<b>New user</b>\nID: <code>{user_id}</code>\n"
|
||||
f"@{username or '-'}\nReferrer: {referrer or '-'}",
|
||||
get_log_bot(),
|
||||
)
|
||||
|
||||
text = _welcome_text(cfg)
|
||||
if is_admin(user_id):
|
||||
text += "\n\n<b>Admin accounts cannot sell cookies. Use /admin.</b>"
|
||||
await message.answer(text, parse_mode="HTML", reply_markup=main_menu_kb())
|
||||
|
||||
|
||||
@router.message(CommandStart())
|
||||
async def cmd_start(message: Message, state: FSMContext):
|
||||
argument = (message.text or "").split(maxsplit=1)
|
||||
referrer = None
|
||||
if len(argument) > 1 and argument[1].startswith("ref_"):
|
||||
try:
|
||||
referrer = int(argument[1][4:])
|
||||
except ValueError:
|
||||
referrer = None
|
||||
await _show_start(
|
||||
message,
|
||||
state,
|
||||
message.from_user.id,
|
||||
message.from_user.username,
|
||||
referrer,
|
||||
)
|
||||
|
||||
|
||||
@router.callback_query(F.data == "back_main")
|
||||
async def cb_back_main(callback: CallbackQuery, state: FSMContext):
|
||||
await state.clear()
|
||||
try:
|
||||
await callback.message.delete()
|
||||
except Exception:
|
||||
pass
|
||||
await _show_start(
|
||||
callback.message,
|
||||
state,
|
||||
callback.from_user.id,
|
||||
callback.from_user.username,
|
||||
)
|
||||
await callback.answer()
|
||||
Reference in New Issue
Block a user