New features

This commit is contained in:
2022-06-16 00:32:17 +03:00
parent 63afce795e
commit 2b69567cc9
31 changed files with 318 additions and 77 deletions

View File

@@ -1,4 +1,5 @@
from . import panel
from . import add_post
from . import delete_post
from . import user_control
from . import admin_control
from . import operator_control

View File

@@ -18,6 +18,14 @@ async def cmd_add_post(message: types.Message):
@dp.message_handler(is_admin=True, state=Post.name)
async def admin_form_name(message: types.Message, state: FSMContext):
if len(message.text) > 50:
await bot.send_message(
message.chat.id,
("Имя не может быть больше 50 символов!\n"
"Повторите попытку")
)
await Post.name.set()
return
await state.update_data(name=message.text)
await bot.send_message(message.chat.id, "Укажите описание товара", reply_markup=base_menu(skip=True))
await Post.description.set()
@@ -25,6 +33,15 @@ async def admin_form_name(message: types.Message, state: FSMContext):
@dp.message_handler(is_admin=True, state=Post.description)
async def admin_form_desk(message: types.Message, state: FSMContext):
if len(message.text) > 1000:
await bot.send_message(
message.chat.id,
("Описание не может быть больше 1000 символов!\n"
"Повторите попытку")
)
await Post.description.set()
return
if message.text == messages.skip_message:
await state.update_data(description="")
else:
@@ -35,6 +52,15 @@ async def admin_form_desk(message: types.Message, state: FSMContext):
@dp.message_handler(is_admin=True, state=Post.price)
async def admin_form_price(message: types.message, state: FSMContext):
if len(message.text) > 30:
await bot.send_message(
message.chat.id,
("Цена не может быть больше 30 символов!\n"
"Повторите попытку")
)
await Post.price.set()
return
if not message.text.replace('.', '').replace(',', '').isdigit():
await Post.price.set()
await state.update_data(price=float(message.text.replace(",", ".")))

View File

@@ -1,25 +1,25 @@
from aiogram import types
from aiogram.dispatcher import FSMContext
from load import dp, bot, messages
from state.state import AddUser
from utils.database.user import Register, User
from keyboard.default.admin.main_menu import base_menu
from keyboard.default.main_menu import back_to_main_menu
@dp.message_handler(lambda x: x.text == messages.add_admin, is_admin=True)
async def add_admin(message: types.Message):
async def add_admin(message: types.Message, state: FSMContext):
await bot.send_message(
message.chat.id,
("Отправьте user_id пользователя\n"
"Его можно узнать зайдя в информацию о пользователе"),
reply_markup=base_menu()
)
await AddUser.user_id.set()
await state.set_state("get_user_id_add_admin")
@dp.message_handler(state=AddUser.user_id)
async def add_admin1(message: types.Message, state):
@dp.message_handler(state="get_user_id_add_admin")
async def add_admin1(message: types.Message, state: FSMContext):
await state.finish()
user_id = message.text
if not user_id.isdigit() or "-100" in user_id:

View File

@@ -0,0 +1,2 @@
from . import adding
from . import delete

View File

@@ -0,0 +1,35 @@
from aiogram import types
from aiogram.dispatcher import FSMContext
from load import dp, bot, messages
from utils.database.user import Register, User
from keyboard.default.admin.main_menu import base_menu
from keyboard.default.main_menu import back_to_main_menu
@dp.message_handler(lambda x: x.text == messages.add_operator, is_admin=True)
async def add_operator(message: types.Message, state: FSMContext):
await bot.send_message(
message.chat.id,
("Отправьте user_id пользователя\n"
"Его можно узнать зайдя в информацию о пользователе"),
reply_markup=base_menu()
)
await state.set_state("get_user_id_add_operator")
@dp.message_handler(is_admin=True, state="get_user_id_add_operator")
async def add_operator1(message: types.Message, state: FSMContext):
await state.finish()
user_id = message.text
if not user_id.isdigit() or "-100" in user_id:
await bot.send_message(message.chat.id, "Данные не правильные!", reply_markup=back_to_main_menu)
return
user_id = int(user_id)
user = User.get_user(user_id)
if not user:
await bot.send_message(message.chat.id, "Пользователь не существует!", reply_markup=back_to_main_menu)
return
Register.register_operator(user)
await bot.send_message(message.chat.id, "Оператор добавлен!", reply_markup=back_to_main_menu)

View File

@@ -0,0 +1,18 @@
from aiogram import types
from load import dp, bot, messages
from keyboard.inline.operator.user import item_list
from utils.database.base import get_full_operator
@dp.message_handler(lambda x: x.text == messages.del_operator, is_admin=True)
async def del_admin(message: types.Message):
users = get_full_operator()
user = users[0]
result = messages.admin_user.format(**user)
await bot.send_message(
message.chat.id,
result,
parse_mode="Markdown",
reply_markup=item_list(items=len(users) - 1)
)

0
handlers/admin/start.py Normal file
View File

View File

@@ -1 +1,2 @@
from . import support
from . import support
from . import user

View File

@@ -0,0 +1,35 @@
from aiogram import types
from load import dp, messages
from keyboard.inline.admin.user import item_list
from utils.database.base import get_full_operator, del_operator
@dp.callback_query_handler(lambda c: c.data.split("|")[0] in ["operator_prev", "operator_next"], is_admin=True)
async def next_item_adm(callback: types.CallbackQuery):
data = callback.data.split("|")
count = int(data[1])
items = get_full_operator()
user = items[count]
await callback.message.edit_text(
messages.admin_user.format(**user),
reply_markup=item_list(count, len(items)-1, int(data[2])),
parse_mode="Markdown"
)
await callback.answer()
@dp.callback_query_handler(lambda x: x.data.split("|")[0] == "delete_operator")
async def delete_admin(callback: types.CallbackQuery):
data = callback.data.split("|")
count = int(data[1])
items = get_full_operator()
user = items[count]
if user["user_id"] == callback.from_user.id:
await dp.bot.send_message(callback.message.chat.id, "Вы не можете удалить сами себя")
await callback.answer()
return
del_operator(user["user_id"])
await dp.bot.send_message(callback.message.chat.id, f"Оператор {user['first_name']} удалён!")
await callback.answer()

View File

@@ -12,13 +12,13 @@ async def cmd_menu(message: types.Message):
await bot.send_message(message.chat.id, "Operator panel", reply_markup=main_menu(active))
@dp.message_handler(lambda x: x.text == messages.leave_work)
@dp.message_handler(lambda x: x.text == messages.leave_work, is_operator=True)
async def leave_work(message: types.Message):
User.set_state(message.from_user.id)
await bot.send_message(message.chat.id, "Режим тех. поддержки отключён!", reply_markup=back_to_main_menu)
@dp.message_handler(lambda x: x.text == messages.on_work)
@dp.message_handler(lambda x: x.text == messages.on_work, is_operator=True)
async def on_work(message: types.Message):
User.set_state(message.from_user.id, True)
await bot.send_message(message.chat.id, "Режим тех. поддержки включён!", reply_markup=back_to_main_menu)

View File

@@ -1,35 +1,95 @@
from aiogram import types
from aiogram.dispatcher import FSMContext
import config
from load import dp, bot, messages
from utils.database.cart import get_user_cart
from utils.database.market import Catalog
from utils.database.ordering import save_info
from keyboard.default.main_menu import back_to_main_menu
from keyboard.default.checkout import checkout_btn
from state.state import UserState
@dp.message_handler(lambda x: x.text == messages.checkout)
async def checkout(message: types.Message):
async def checkout(message: types.Message, state: FSMContext):
items = get_user_cart(message.from_user.id)
output: str = ""
output: list[str] = [""]
cost = 0
for index, count in items:
i = Catalog.get_catalog(index)
output += f'Имя: {i["name"]} цена: {i["price"]} - {count}шт.\n'
product_info = (
f'Имя: {i["name"]} '
f'цена: {i["price"]} - {count}шт.\n'
)
if (len(output[-1]) + len(product_info)) >= 4095:
output.append("")
output[-1] += product_info
cost += i["price"] * count
output += f"Общая сумма: {cost}\nВсё верно? Следующий этап: заполнение заявки"
await bot.send_message(message.chat.id, output, reply_markup=checkout_btn())
await UserState.confirm.set()
total_amount = (
f"Общая сумма: {cost}\n"
"Всё верно? Следующий этап: заполнение заявки"
)
if (len(output[-1]) + len(total_amount)) >= 4095:
output.append("")
output[-1] += total_amount
for msg in output:
await bot.send_message(message.chat.id, msg, reply_markup=checkout_btn())
await state.set_state("load_or_create_profile")
@dp.message_handler(lambda x: x.text == messages.all_right_message, state="save_or_continue")
async def continue_user_form():
pass
async def continue_user_form(message: types.Message, state: FSMContext):
chat_id = config.service_chat
items = get_user_cart(message.from_user.id)
data = await state.get_data()
output: list[str] = [
(f"Имя: {data['first_name']}\n"
f"Фамилия: {data['last_name']}\n"
f"Номер телефона: {data['phone_number']}\n"
f"Адрес: {data['address']}\n\n"
)
]
cost = 0
for index, count in items:
i = Catalog.get_catalog(index)
product_info = (
f'ID: {i["id"]} '
f'Имя: {i["name"]} '
f'цена: {i["price"]} - {count}шт.\n'
)
if (len(output[-1]) + len(product_info)) >= 4095:
output.append("")
output[-1] += product_info
cost += i["price"] * count
total_amount = (
f"\nИтоговая сумма: {cost}"
)
if (len(output[-1]) + len(total_amount)) >= 4095:
output.append("")
output[-1] += total_amount
await bot.send_message(message.chat.id, messages.order, reply_markup=back_to_main_menu)
for msg in output:
await bot.send_message(
chat_id,
msg,
parse_mode='Markdown'
)
await state.finish()
@dp.message_handler(lambda x: x.text == messages.save_and_continue, state="save_or_continue")
async def save_user_info(message: types.Message):
state = dp.current_state(chat=message.chat.id, user=message.from_user.id)
async def save_user_info(message: types.Message, state: FSMContext):
info = await state.get_data()
save_info(user_id=message.from_user.id, **info)
await continue_user_form()
await continue_user_form(message, state)

View File

@@ -5,12 +5,11 @@ from load import dp, bot, messages
from keyboard.default.checkout import confirm_all_info
from keyboard.default.main_menu import cancel_btn, get_phone_number, continue_btn
from keyboard.default.ordering import load_info
from state.state import UserState
from state.checkout import Checkout
from utils.database.ordering import get_info
@dp.message_handler(lambda x: x.text == messages.all_right_message, state=UserState.confirm)
@dp.message_handler(lambda x: x.text == messages.all_right_message, state="load_or_create_profile")
async def confirm(message: types.Message, state: FSMContext):
await state.finish()
info = get_info(message.from_user.id)
@@ -30,15 +29,15 @@ async def load_form(message: types.message, state: FSMContext):
first_name=info["first_name"],
last_name=info["last_name"],
phone_number=info["phone_number"],
address=info["address"]
address=info["address"],
load=True
)
await bot.send_message(message.chat.id, "Ваши данные загружены!", reply_markup=continue_btn)
await state.set_state("finish_send_form")
@dp.message_handler(lambda x: x.text == messages.rewrite_data, state="load_data")
async def new_form(message: types.Message, state: FSMContext = None):
await state.update_data(loaded=False)
async def new_form(message: types.Message):
await bot.send_message(
message.chat.id,
"Напишите вашу фамилию",
@@ -100,11 +99,10 @@ async def finish_form(message: types.Message, state: FSMContext):
text = (f"Имя: {data['first_name']}\n"
f"Фамилия: {data['last_name']}\n"
f"Номер телефона: {data['phone_number']}\n"
f"Адрес: {data['address']}\n"
)
f"Адрес: {data['address']}\n")
await bot.send_message(
message.chat.id,
text,
reply_markup=confirm_all_info()
reply_markup=confirm_all_info(load=data.pop("load", False))
)
await state.set_state("save_or_continue")

View File

@@ -1,10 +1,11 @@
from aiogram import types
from aiogram.dispatcher.filters import CommandStart
from aiogram.dispatcher.filters import CommandStart, CommandHelp
from load import dp, bot, messages
from keyboard.default.main_menu import main_menu
from utils.database.base import get_admins, get_operator
from utils.database.user import Register
from utils.database.market import Catalog
@dp.message_handler(CommandStart())
@@ -30,6 +31,38 @@ async def back_to_menu(message: types.Message):
)
@dp.message_handler(commands='get')
async def get_item(message: types.Message):
args = message.get_args()
if not args and not args.isdigit():
await bot.send_message(message.chat.id, "Неверные данные")
return
item = Catalog.get_catalog(args)
if not item:
await bot.send_message(message.chat.id, "Товар не найден!")
return
await bot.send_photo(
chat_id=message.chat.id,
photo=item["image"],
caption=messages.product_message.format(
name=item["name"],
description=item["description"],
price=item['price']
),
parse_mode="Markdown",
)
@dp.message_handler(CommandHelp())
async def help_cmd(message: types.Message):
await bot.send_message(
message.chat.id,
("/sos - попросить помощь в оператора\n"
"/get <ID> - получить товар по ID")
)
@dp.message_handler(lambda x: x.text == messages.cancel_message, state="*")
async def cancel(message: types.Message):
state = dp.current_state(chat=message.chat.id, user=message.from_user.id)
@@ -44,8 +77,3 @@ async def userinfo(message: types.Message):
"User_id: <code>{user_id}</code>".format(user_id=message.from_user.id),
parse_mode="HTML"
)
@dp.message_handler(commands=['test'])
async def test(message: types.Message):
Register.register_admin(message.from_user)