diff --git a/dist.env b/dist.env index 826b807..789154c 100644 --- a/dist.env +++ b/dist.env @@ -3,10 +3,10 @@ token = "123:adminadmin" -skip_update = False # -use_webhook = True # +skip_update = True # +use_webhook = False # #telegram_api_server = "" # -#permission_file = "" +#permission_file = "" # app_host = "127.0.0.1" app_port = 2001 diff --git a/filters/__init__.py b/filters/__init__.py index 5c81432..8d20c19 100644 --- a/filters/__init__.py +++ b/filters/__init__.py @@ -1,6 +1,8 @@ from load import dp from .admin import IsAdmin +from .operator import IsOperator dp.filters_factory.bind(IsAdmin) +dp.filters_factory.bind(IsOperator) diff --git a/filters/admin.py b/filters/admin.py index 9a81827..e129030 100644 --- a/filters/admin.py +++ b/filters/admin.py @@ -11,4 +11,4 @@ class IsAdmin(BoundFilter): self.is_admin = is_admin async def check(self, message: Message): - return message.from_user.id in get_admins() \ No newline at end of file + return message.from_user.id in get_admins() diff --git a/handlers/__init__.py b/handlers/__init__.py index a5f3cc6..0e155e6 100644 --- a/handlers/__init__.py +++ b/handlers/__init__.py @@ -1,3 +1,4 @@ from . import user from . import admin -from . import callback \ No newline at end of file +from . import callback +from . import operator diff --git a/handlers/admin/add_post.py b/handlers/admin/add_post.py index a281ec6..ddc78d4 100644 --- a/handlers/admin/add_post.py +++ b/handlers/admin/add_post.py @@ -1,15 +1,13 @@ -import io - from aiogram import types -from aiogram.types import ContentType from aiogram.dispatcher import FSMContext +from aiogram.types import ContentType -from load import bot, dp, messages -from utils.helper import download_file from keyboard.default.admin.main_menu import base_menu, continue_btn, all_right from keyboard.default.main_menu import back_to_main_menu +from load import bot, dp, messages from state.post import Post from utils.database.market import add_item +from utils.helper import download_file @dp.message_handler(lambda x: x.text == messages.add_post, is_admin=True) @@ -37,7 +35,7 @@ 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 not message.text.replace('.','').replace(',', '').isdigit(): + if not message.text.replace('.', '').replace(',', '').isdigit(): await Post.price.set() await state.update_data(price=float(message.text.replace(",", "."))) await bot.send_message(message.chat.id, "Отправьте фото товара") @@ -45,7 +43,7 @@ async def admin_form_price(message: types.message, state: FSMContext): @dp.message_handler(is_admin=True, state=Post.image, content_types=[ContentType.PHOTO]) -async def admin_form_image(message:types.Message, state: FSMContext): +async def admin_form_image(message: types.Message, state: FSMContext): file_id = message.photo[-1].file_id file_info = await bot.get_file(file_id) photo = await download_file(file_info.file_path) @@ -55,10 +53,10 @@ async def admin_form_image(message:types.Message, state: FSMContext): "Все данные для поста были заполнены", reply_markup=continue_btn ) - await Post.finish.set() + await state.set_state("finish_post") -@dp.message_handler(lambda x:x.text == messages.continue_, state=Post.finish, is_admin=True) +@dp.message_handler(lambda x: x.text == messages.continue_, state="finish_post", is_admin=True) async def finish(message: types.Message, state: FSMContext): data = await state.get_data() await bot.send_photo( @@ -73,7 +71,8 @@ async def finish(message: types.Message, state: FSMContext): parse_mode='Markdown' ) -@dp.message_handler(lambda x: x.text == messages.all_right_message, is_admin=True, state=Post.finish) + +@dp.message_handler(lambda x: x.text == messages.all_right_message, is_admin=True, state="finish_post") async def write_on_db(message: types.Message, state: FSMContext): data = await state.get_data() add_item(**data) diff --git a/handlers/admin/panel.py b/handlers/admin/panel.py index 22d76c4..57c6476 100644 --- a/handlers/admin/panel.py +++ b/handlers/admin/panel.py @@ -7,4 +7,3 @@ from keyboard.default.admin.main_menu import main_menu @dp.message_handler(lambda x: x.text == messages.admin_panel, is_admin=True) async def cmd_menu(message: types.Message): await bot.send_message(message.chat.id, "Admin panel", reply_markup=main_menu()) - diff --git a/handlers/admin/user_control/adding.py b/handlers/admin/user_control/adding.py index 4355158..8153299 100644 --- a/handlers/admin/user_control/adding.py +++ b/handlers/admin/user_control/adding.py @@ -7,13 +7,12 @@ 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): await bot.send_message( message.chat.id, ("Отправьте user_id пользователя\n" - "Его можно узнать зайдя в информацию о пользователе"), + "Его можно узнать зайдя в информацию о пользователе"), reply_markup=base_menu() ) await AddUser.user_id.set() @@ -34,4 +33,3 @@ async def add_admin1(message: types.Message, state): return Register.register_admin(user) await bot.send_message(message.chat.id, "Администратор добавлен!", reply_markup=back_to_main_menu) - diff --git a/handlers/admin/user_control/delete.py b/handlers/admin/user_control/delete.py index 91183af..fb7138e 100644 --- a/handlers/admin/user_control/delete.py +++ b/handlers/admin/user_control/delete.py @@ -4,7 +4,8 @@ from load import dp, bot, messages from keyboard.inline.admin.user import item_list from utils.database.base import get_full_admin -@dp.message_handler(lambda x: x.text==messages.del_admin, is_admin=True) + +@dp.message_handler(lambda x: x.text == messages.del_admin, is_admin=True) async def del_admin(message: types.Message): admins = get_full_admin() admin = admins[0] @@ -13,5 +14,5 @@ async def del_admin(message: types.Message): message.chat.id, result, parse_mode="Markdown", - reply_markup=item_list(items=len(admins)-1) + reply_markup=item_list(items=len(admins) - 1) ) diff --git a/handlers/callback/__init__.py b/handlers/callback/__init__.py index 25c6b69..aaa7c1d 100644 --- a/handlers/callback/__init__.py +++ b/handlers/callback/__init__.py @@ -1,4 +1,5 @@ from . import null from . import catalog from . import cart -from . import admin \ No newline at end of file +from . import admin +from . import operator \ No newline at end of file diff --git a/handlers/callback/admin/catalog.py b/handlers/callback/admin/catalog.py index 3f566fb..f726740 100644 --- a/handlers/callback/admin/catalog.py +++ b/handlers/callback/admin/catalog.py @@ -1,4 +1,4 @@ -import io +import io from aiogram import types @@ -25,9 +25,10 @@ async def next_item_adm(callback: types.CallbackQuery): ), parse_mode="Markdown", ), - reply_markup=item_list(count, len(items)-1, int(data[2])) + reply_markup=item_list(count, len(items) - 1, int(data[2])) ) + @dp.callback_query_handler(lambda c: c.data.split("|")[0] == 'delete_post', is_admin=True) async def delete_post_adm(callback: types.CallbackQuery): data = callback.data.split("|") @@ -47,7 +48,7 @@ async def delete_post_adm(callback: types.CallbackQuery): ), parse_mode="Markdown", ), - reply_markup=item_list(items=len(items)-1) + reply_markup=item_list(items=len(items) - 1) ) else: await callback.message.delete() @@ -57,4 +58,4 @@ async def delete_post_adm(callback: types.CallbackQuery): reply_markup=back_to_main_menu ) await callback.answer("Товар удалён!") - await callback.answer() \ No newline at end of file + await callback.answer() diff --git a/handlers/callback/admin/user.py b/handlers/callback/admin/user.py index 2237721..fa85df4 100644 --- a/handlers/callback/admin/user.py +++ b/handlers/callback/admin/user.py @@ -1,4 +1,3 @@ -from subprocess import call from aiogram import types from load import dp, messages @@ -20,6 +19,7 @@ async def next_item_adm(callback: types.CallbackQuery): ) await callback.answer() + @dp.callback_query_handler(lambda x: x.data.split("|")[0] == "delete_admin") async def delete_admin(callback: types.CallbackQuery): data = callback.data.split("|") diff --git a/handlers/callback/cart.py b/handlers/callback/cart.py index 1cd74d3..648be8b 100644 --- a/handlers/callback/cart.py +++ b/handlers/callback/cart.py @@ -1,6 +1,6 @@ import io -from aiogram import types +from aiogram import types from load import dp, messages from utils.database.cart import add_to_cart, get_user_cart, del_from_cart @@ -9,14 +9,15 @@ from keyboard.inline.cart import cart_list from keyboard.default.main_menu import back_to_main_menu -@dp.callback_query_handler(lambda c: c.data.split("|")[0]=="add_to_cart") +@dp.callback_query_handler(lambda c: c.data.split("|")[0] == "add_to_cart") async def add_cart(callback: types.CallbackQuery): - item_id = callback.data.split("|")[1] + item = int(callback.data.split("|")[1]) + item_id = Catalog.get_catalog()[item]["id"] add_to_cart(callback.from_user.id, item_id) await callback.answer("Товар добавлен!") -@dp.callback_query_handler(lambda c: c.data.split("|")[0]=="del_from_cart") +@dp.callback_query_handler(lambda c: c.data.split("|")[0] == "del_from_cart") async def del_cart(callback: types.CallbackQuery): c = callback.data.split("|")[1] item_id = get_user_cart(callback.from_user.id)[int(c)][0] @@ -26,7 +27,7 @@ async def del_cart(callback: types.CallbackQuery): items = get_user_cart(callback.from_user.id) if items: - index, count =items[0] + index, count = items[0] item = Catalog.get_catalog(index) await callback.message.edit_media( media=types.InputMediaPhoto( @@ -35,11 +36,11 @@ async def del_cart(callback: types.CallbackQuery): name=item["name"], description=item["description"], count=count, - price=item['price']*count + price=item['price'] * count ), parse_mode="Markdown", ), - reply_markup=cart_list(items=len(items)-1) + reply_markup=cart_list(items=len(items) - 1) ) else: await callback.message.delete() @@ -66,9 +67,9 @@ async def next_item(callback: types.CallbackQuery): name=item["name"], description=item["description"], count=count, - price=item['price']*count + price=item['price'] * count ), parse_mode="Markdown", ), - reply_markup=cart_list(c, len(items)-1) + reply_markup=cart_list(c, len(items) - 1) ) diff --git a/handlers/callback/catalog.py b/handlers/callback/catalog.py index 6225cc5..69712c1 100644 --- a/handlers/callback/catalog.py +++ b/handlers/callback/catalog.py @@ -26,4 +26,3 @@ async def next_item(callback: types.CallbackQuery): ), reply_markup=item_list(count, len(items)-1, int(data[2])) ) - diff --git a/handlers/callback/null.py b/handlers/callback/null.py index d076309..d73738b 100644 --- a/handlers/callback/null.py +++ b/handlers/callback/null.py @@ -2,6 +2,7 @@ from aiogram.types import CallbackQuery from load import dp + @dp.callback_query_handler(lambda c: c.data == "null") async def null(callback: CallbackQuery): await callback.answer() diff --git a/handlers/user/__init__.py b/handlers/user/__init__.py index 2022a1a..2915873 100644 --- a/handlers/user/__init__.py +++ b/handlers/user/__init__.py @@ -3,3 +3,4 @@ from . import catalog from . import cart from . import checkout from . import ordering +from . import support diff --git a/handlers/user/catalog.py b/handlers/user/catalog.py index 95314ee..7f79761 100644 --- a/handlers/user/catalog.py +++ b/handlers/user/catalog.py @@ -24,4 +24,4 @@ async def catalog(message: types.Message): ), parse_mode="Markdown", reply_markup=item_list(items=len(items)) - ) \ No newline at end of file + ) diff --git a/handlers/user/checkout.py b/handlers/user/checkout.py index 1c97ba5..c5c1088 100644 --- a/handlers/user/checkout.py +++ b/handlers/user/checkout.py @@ -9,7 +9,7 @@ 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): items = get_user_cart(message.from_user.id) output: str = "" cost = 0 @@ -22,14 +22,14 @@ async def checkout(message:types.Message): await UserState.confirm.set() -@dp.message_handler(lambda x: x.text == messages.all_right_message) -async def continue_user_form(message: types.Message): +@dp.message_handler(lambda x: x.text == messages.all_right_message, state="save_or_continue") +async def continue_user_form(): pass -@dp.message_handler(lambda x: x.text == messages.save_and_continue, state="*") +@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) info = await state.get_data() save_info(user_id=message.from_user.id, **info) - await continue_user_form(message) + await continue_user_form() diff --git a/handlers/user/ordering.py b/handlers/user/ordering.py index a7ddc1c..23f33ce 100644 --- a/handlers/user/ordering.py +++ b/handlers/user/ordering.py @@ -16,28 +16,27 @@ async def confirm(message: types.Message, state: FSMContext): info = get_info(message.from_user.id) await bot.send_message( - message.chat.id, + message.chat.id, "Может у вас есть сохраненные данные?", reply_markup=load_info(bool(info)) ) - await Checkout.loaded.set() + await state.set_state(state="load_data") -@dp.message_handler(lambda x: x.text == messages.load_data, state=Checkout.loaded) +@dp.message_handler(lambda x: x.text == messages.load_data, state="load_data") async def load_form(message: types.message, state: FSMContext): info = get_info(message.from_user.id) await state.update_data( - loaded=True, - first_name = info["first_name"], - last_name = info["last_name"], - phone_number = info["phone_number"], - address = info["address"] + first_name=info["first_name"], + last_name=info["last_name"], + phone_number=info["phone_number"], + address=info["address"] ) await bot.send_message(message.chat.id, "Ваши данные загружены!", reply_markup=continue_btn) - await Checkout.finish.set() + await state.set_state("finish_send_form") -@dp.message_handler(lambda x: x.text == messages.rewrite_data, state=Checkout.loaded) +@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) await bot.send_message( @@ -65,7 +64,7 @@ async def form_first_name(message: types.Message, state: FSMContext): await bot.send_message( message.chat.id, ("Номер телефона\n\n" - "Можете написать номер телефона вручную"), + "Можете написать номер телефона вручную"), reply_markup=get_phone_number ) await Checkout.phone_number.set() @@ -73,36 +72,39 @@ async def form_first_name(message: types.Message, state: FSMContext): @dp.message_handler(state=Checkout.phone_number, content_types=[types.ContentType.CONTACT, types.ContentType.TEXT]) async def form_phone(message: types.Message, state: FSMContext): - if message.contact is not None: - phone=message.contact.phone_number - else: phone=message.text - if len(phone) in [10,12,13]: - await state.update_data(phone_number=phone) - await bot.send_message(message.chat.id, "Отправте адрес доставки", reply_markup=cancel_btn) - await Checkout.address.set() - else: + if message.contact is not None: + phone = message.contact.phone_number + else: + phone = message.text + if len(phone) not in [10, 12, 13]: await bot.send_message(message.chat.id, "Номер телефона не правильный!") await Checkout.phone_number.set() + return + + await state.update_data(phone_number=phone) + await bot.send_message(message.chat.id, "Отправте адрес доставки", reply_markup=cancel_btn) + await Checkout.address.set() @dp.message_handler(state=Checkout.address) async def form_address(message: types.Message, state: FSMContext): await state.update_data(address=message.text) - await bot.send_message(message.chat.id, "Отлично заявка заполнена!", reply_markup=continue_btn) - await Checkout.finish.set() + await bot.send_message(message.chat.id, "Отлично, заявка заполнена!", reply_markup=continue_btn) + await state.set_state("finish_send_form") -@dp.message_handler(state=Checkout.finish) +@dp.message_handler(state="finish_send_form") async def finish_form(message: types.Message, state: FSMContext): data = await state.get_data() text = (f"Имя: {data['first_name']}\n" - f"Фамилия: {data['last_name']}\n" - f"Номер телефона: {data['phone_number']}\n" - f"Адрес: {data['address']}\n" - ) + f"Фамилия: {data['last_name']}\n" + f"Номер телефона: {data['phone_number']}\n" + f"Адрес: {data['address']}\n" + ) await bot.send_message( - message.chat.id, + message.chat.id, text, reply_markup=confirm_all_info() ) + await state.set_state("save_or_continue") diff --git a/handlers/user/start.py b/handlers/user/start.py index e10ecaa..cfc6eb1 100644 --- a/handlers/user/start.py +++ b/handlers/user/start.py @@ -1,7 +1,7 @@ from aiogram import types from aiogram.dispatcher.filters import CommandStart -from load import dp, bot, messages +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 @@ -18,6 +18,7 @@ async def start(message: types.Message): reply_markup=main_menu(admin=is_bot_admin, operator=is_operator) ) + @dp.message_handler(lambda x: x.text == messages.back) async def back_to_menu(message: types.Message): is_bot_admin = message.from_user.id in get_admins() @@ -36,11 +37,11 @@ async def cancel(message: types.Message): await back_to_menu(message) -@dp.message_handler(lambda x:x.text == messages.info) +@dp.message_handler(lambda x: x.text == messages.info) async def userinfo(message: types.Message): await bot.send_message( - message.chat.id, - ("User_id: {user_id}").format(user_id=message.from_user.id), + message.chat.id, + "User_id: {user_id}".format(user_id=message.from_user.id), parse_mode="HTML" ) diff --git a/keyboard/default/admin/main_menu.py b/keyboard/default/admin/main_menu.py index 1c9b80b..90eb2fd 100644 --- a/keyboard/default/admin/main_menu.py +++ b/keyboard/default/admin/main_menu.py @@ -31,11 +31,11 @@ def base_menu(cancel=True, skip=False): continue_btn = ReplyKeyboardMarkup( [[KeyboardButton(messages.continue_), - KeyboardButton(messages.cancel_message)]], + KeyboardButton(messages.cancel_message)]], resize_keyboard=True ) all_right = ReplyKeyboardMarkup( [[KeyboardButton(messages.all_right_message), - KeyboardButton(messages.cancel_message)]], + KeyboardButton(messages.cancel_message)]], resize_keyboard=True ) diff --git a/keyboard/default/checkout.py b/keyboard/default/checkout.py index cf2df2e..2bb41b8 100644 --- a/keyboard/default/checkout.py +++ b/keyboard/default/checkout.py @@ -2,12 +2,14 @@ from aiogram.types.reply_keyboard import ReplyKeyboardMarkup, KeyboardButton from load import messages + def checkout_btn() -> ReplyKeyboardMarkup: return ReplyKeyboardMarkup([[ KeyboardButton(messages.all_right_message), KeyboardButton(messages.cancel_message) ]], resize_keyboard=True) + def confirm_all_info(): markup = ReplyKeyboardMarkup(resize_keyboard=True) markup.add(KeyboardButton(messages.all_right_message)) diff --git a/keyboard/default/main_menu.py b/keyboard/default/main_menu.py index 8fed28f..29b3683 100644 --- a/keyboard/default/main_menu.py +++ b/keyboard/default/main_menu.py @@ -7,16 +7,17 @@ def main_menu(admin=False, operator=False): markup = ReplyKeyboardMarkup( [ [ - KeyboardButton(messages.catalog), # Go to catalog - KeyboardButton(messages.cart) # Go to cart + KeyboardButton(messages.catalog), # Go to catalog + KeyboardButton(messages.cart) # Go to cart ] ], resize_keyboard=True ).add(KeyboardButton(messages.info)) - if admin == True: + + if admin: markup.add(KeyboardButton(messages.admin_panel)) - if operator == True: + if operator: markup.add(KeyboardButton(messages.operator_panel)) return markup @@ -30,7 +31,8 @@ def cart_btn(is_empty=True): markup.add(KeyboardButton(messages.back)) return markup -back_to_main_menu = ReplyKeyboardMarkup(keyboard=[[KeyboardButton(messages.back)]],resize_keyboard=True) + +back_to_main_menu = ReplyKeyboardMarkup(keyboard=[[KeyboardButton(messages.back)]], resize_keyboard=True) cancel_btn = ReplyKeyboardMarkup([[KeyboardButton(messages.cancel_message)]], resize_keyboard=True) get_phone_number = ReplyKeyboardMarkup( keyboard=[ diff --git a/keyboard/default/ordering.py b/keyboard/default/ordering.py index c586d1e..e15ec0a 100644 --- a/keyboard/default/ordering.py +++ b/keyboard/default/ordering.py @@ -2,6 +2,7 @@ from aiogram.types.reply_keyboard import ReplyKeyboardMarkup, KeyboardButton from load import messages + def load_info(data:bool = False): markup = ReplyKeyboardMarkup(resize_keyboard=True) if data: diff --git a/keyboard/inline/admin/catalog.py b/keyboard/inline/admin/catalog.py index edd24d9..f7995e4 100644 --- a/keyboard/inline/admin/catalog.py +++ b/keyboard/inline/admin/catalog.py @@ -3,22 +3,20 @@ from aiogram.types.inline_keyboard import InlineKeyboardMarkup, InlineKeyboardBu from load import messages -def item_list(item=0, items:int=1, user_count:int=1) -> InlineKeyboardMarkup: +def item_list(item: int = 0, items: int = 1, user_count: int = 1) -> InlineKeyboardMarkup: markup = InlineKeyboardMarkup() default = [ - InlineKeyboardButton(user_count, callback_data='null') + InlineKeyboardButton(str(user_count), callback_data='null') ] back = ['⬅️', f"adm_prev|{item-1}|{user_count-1}"] next = ['➡️', f"adm_next|{item+1}|{user_count+1}"] - if items < 1 or item >= items: next = [" ", "null"] if item == 0: back = [" ", "null"] - default.append(InlineKeyboardButton(next[0], callback_data=next[1])) markup.add(InlineKeyboardButton(back[0], callback_data=back[1]), *default) diff --git a/keyboard/inline/admin/user.py b/keyboard/inline/admin/user.py index fd1724d..0659df6 100644 --- a/keyboard/inline/admin/user.py +++ b/keyboard/inline/admin/user.py @@ -1,24 +1,23 @@ from aiogram.types.inline_keyboard import InlineKeyboardButton, InlineKeyboardMarkup from load import messages -def item_list(item=0, items:int=1, user_count:int=1) -> InlineKeyboardMarkup: + +def item_list(item: int = 0, items: int = 1, user_count: int = 1) -> InlineKeyboardMarkup: markup = InlineKeyboardMarkup() default = [ - InlineKeyboardButton(user_count, callback_data='null') + InlineKeyboardButton(str(user_count), callback_data='null') ] back = ['⬅️', f"admin_prev|{item-1}|{user_count-1}"] next = ['➡️', f"admin_next|{item+1}|{user_count+1}"] - if items < 1 or item >= items: next = [" ", "null"] if item == 0: back = [" ", "null"] - default.append(InlineKeyboardButton(next[0], callback_data=next[1])) markup.add(InlineKeyboardButton(back[0], callback_data=back[1]), *default) markup.row(InlineKeyboardButton(messages.del_admin, callback_data=f"delete_admin|{item}")) - return markup \ No newline at end of file + return markup diff --git a/keyboard/inline/cart.py b/keyboard/inline/cart.py index c384011..f63d33f 100644 --- a/keyboard/inline/cart.py +++ b/keyboard/inline/cart.py @@ -2,15 +2,15 @@ from aiogram.types.inline_keyboard import InlineKeyboardMarkup, InlineKeyboardBu from load import messages -def cart_list(item=0, items:int=1) -> InlineKeyboardMarkup: + +def cart_list(item:int = 0, items: int = 1) -> InlineKeyboardMarkup: markup = InlineKeyboardMarkup() default = [ - InlineKeyboardButton(item+1, callback_data='null') + InlineKeyboardButton(str(item+1), callback_data='null') ] back = ['⬅️', f"cart_prev|{item-1}"] next = ['➡️', f"cart_next|{item+1}"] - if items < 1 or item >= items: next = [" ", "null"] diff --git a/keyboard/inline/catalog.py b/keyboard/inline/catalog.py index 2f62ea9..13a78f9 100644 --- a/keyboard/inline/catalog.py +++ b/keyboard/inline/catalog.py @@ -3,15 +3,14 @@ from aiogram.types.inline_keyboard import InlineKeyboardMarkup, InlineKeyboardBu from load import messages -def item_list(item=0, items:int=1, user_count:int=1) -> InlineKeyboardMarkup: +def item_list(item: int = 0, items: int = 1, user_count: int = 1) -> InlineKeyboardMarkup: markup = InlineKeyboardMarkup() default = [ - InlineKeyboardButton(user_count, callback_data='null') + InlineKeyboardButton(str(user_count), callback_data='null') ] back = ['⬅️', f"prev|{item-1}|{user_count-1}"] next = ['➡️', f"next|{item+1}|{user_count+1}"] - if items < 1 or item >= items: next = [" ", "null"] @@ -22,4 +21,4 @@ def item_list(item=0, items:int=1, user_count:int=1) -> InlineKeyboardMarkup: markup.add(InlineKeyboardButton(back[0], callback_data=back[1]), *default) markup.row(InlineKeyboardButton(messages.add_to_cart, callback_data=f"add_to_cart|{item}")) - return markup \ No newline at end of file + return markup diff --git a/keyboard/inline/checkout.py b/keyboard/inline/checkout.py index 90bf338..566dc21 100644 --- a/keyboard/inline/checkout.py +++ b/keyboard/inline/checkout.py @@ -1,15 +1,14 @@ from aiogram.types.inline_keyboard import InlineKeyboardMarkup, InlineKeyboardButton -def cart_list(item=0, items:int=1) -> InlineKeyboardMarkup: +def cart_list(item: int = 0, items: int = 1) -> InlineKeyboardMarkup: markup = InlineKeyboardMarkup() default = [ - InlineKeyboardButton(item+1, callback_data='null') + InlineKeyboardButton(str(item+1), callback_data='null') ] back = ['⬅️', f"cart_prev|{item-1}"] next = ['➡️', f"cart_next|{item+1}"] - if items < 1 or item >= items: next = [" ", "null"] diff --git a/load.py b/load.py index 16e4957..700c439 100644 --- a/load.py +++ b/load.py @@ -8,8 +8,7 @@ from peewee import SqliteDatabase from playhouse.db_url import connect import config -from utils import messages # used, do not delete! - +from utils import messages # used, do not delete! # Bot init bot = Bot( @@ -24,6 +23,6 @@ dp = Dispatcher( storage=storage ) -db:SqliteDatabase = connect(config.db_url) +db: SqliteDatabase = connect(config.db_url) permissions = json.load(open(config.permission_file)) diff --git a/state/checkout.py b/state/checkout.py index 3e05acb..4573f63 100644 --- a/state/checkout.py +++ b/state/checkout.py @@ -1,11 +1,8 @@ from aiogram.dispatcher.filters.state import StatesGroup, State + class Checkout(StatesGroup): first_name = State() last_name = State() phone_number = State() address = State() - - loaded = State() - finish = State() - diff --git a/state/post.py b/state/post.py index 80de28d..70d9a4c 100644 --- a/state/post.py +++ b/state/post.py @@ -1,9 +1,8 @@ from aiogram.dispatcher.filters.state import StatesGroup, State + class Post(StatesGroup): name = State() description = State() price = State() image = State() - - finish = State() diff --git a/state/state.py b/state/state.py index f5adc22..300ab36 100644 --- a/state/state.py +++ b/state/state.py @@ -1,5 +1,6 @@ from aiogram.dispatcher.filters.state import StatesGroup, State + class UserState(StatesGroup): confirm = State() diff --git a/utils/database/base.py b/utils/database/base.py index b28665f..3dbd033 100644 --- a/utils/database/base.py +++ b/utils/database/base.py @@ -14,6 +14,7 @@ def get_operator(): users.append(i.user_id) return users + def get_full_admin(): usr = [] for i in Admin.select(): @@ -28,3 +29,10 @@ def get_full_admin(): def del_admin(user_id:int): Admin.delete().where(Admin.user_id == user_id).execute() + + +def get_active_operator(): + usr = [] + for i in Operator.select().where(Operator.active==True): + usr.append(i.user_id) + return usr diff --git a/utils/database/cart.py b/utils/database/cart.py index ec46dcd..4bf6139 100644 --- a/utils/database/cart.py +++ b/utils/database/cart.py @@ -16,6 +16,7 @@ def del_from_cart(user_id: int, item_id: int): def clean_cart(user_id: int): Cart.delete().where(Cart.user_id==user_id).execute() + def get_user_cart(user_id:int): cart = [] for i in Cart.select().where(Cart.user_id == user_id): diff --git a/utils/database/market.py b/utils/database/market.py index eb568f3..51ef259 100644 --- a/utils/database/market.py +++ b/utils/database/market.py @@ -1,10 +1,9 @@ -from ast import Mod import typing as t from .model import Catalog as Model -class Catalog(): +class Catalog: @staticmethod def __get_item(item_id: int) -> dict: item = {} @@ -23,17 +22,16 @@ class Catalog(): return item @classmethod - def get_catalog(self, item_id:int = None, get_count:bool = False) -> t.Union[list, dict]: + def get_catalog(cls, item_id:int = None, get_count:bool = False) -> t.Union[list, dict]: if item_id: if get_count: - return self.__get_item(item_id), Model.select().count() - return self.__get_item(item_id) + return cls.__get_item(item_id), Model.select().count() + return cls.__get_item(item_id) items = [] for i in Model.select(): - items.append(self.__get_item(i.id)) + items.append(cls.__get_item(i.id)) return items - @staticmethod def delete_post(item_id: int): diff --git a/utils/database/model.py b/utils/database/model.py index 2129594..e32e037 100644 --- a/utils/database/model.py +++ b/utils/database/model.py @@ -1,11 +1,11 @@ from peewee import (Model, BigIntegerField, TextField, BlobField, - IntegerField, CharField, FloatField, ForeignKeyField) + IntegerField, CharField, FloatField, BooleanField) from load import db class BaseModel(Model): - '''Base model. Abstract Class''' + """Base model. Abstract Class""" class Meta: database = db @@ -22,7 +22,7 @@ class Admin(User): class Operator(User): - pass + active = BooleanField(default=False) class Catalog(BaseModel): @@ -45,4 +45,5 @@ class UserInfo(BaseModel): phone_number = CharField(15) address = TextField() + db.create_tables([Cart, Catalog, Operator, Admin, User, UserInfo]) diff --git a/utils/database/ordering.py b/utils/database/ordering.py index 1742d8a..15842e8 100644 --- a/utils/database/ordering.py +++ b/utils/database/ordering.py @@ -10,6 +10,7 @@ def save_info(user_id: int, last_name:str, first_name:str, phone_number:str, add address=address ).on_conflict_replace().execute() + def get_info(user_id: int): output = None if UserInfo.select().where(UserInfo.user_id == user_id).exists(): diff --git a/utils/database/user.py b/utils/database/user.py index f0d7d90..63aad52 100644 --- a/utils/database/user.py +++ b/utils/database/user.py @@ -9,7 +9,7 @@ from utils import types class Register: @classmethod - def __register_user(self, model: Model, user: UserType): + def __register_user(cls, model: Model, user: UserType): model.insert( user_id=user.id, first_name=user.first_name, @@ -18,16 +18,16 @@ class Register: ).on_conflict_replace().execute() @classmethod - def register_user(self, user: UserType): - return self.__register_user(UserModel, user) + def register_user(cls, user: UserType): + return cls.__register_user(UserModel, user) @classmethod - def register_admin(self, user: UserType): - return self.__register_user(Admin, user) + def register_admin(cls, user: UserType): + return cls.__register_user(Admin, user) @classmethod - def register_operator(self, user: UserType): - return self.__register_user(Operator, user) + def register_operator(cls, user: UserType): + return cls.__register_user(Operator, user) class User: @@ -43,3 +43,15 @@ class User: last_name=data.last_name, username=data.username ) + + @staticmethod + def get_state(user_id:int): + if Operator.select().where(Operator.user_id == user_id).exists(): + return Operator.get(Operator.user_id == user_id).active + return False + + @staticmethod + def set_state(user_id:int, state:bool=False): + if Operator.select().where(Operator.user_id == user_id).exists(): + Operator.update(active=state).where(Operator.user_id == user_id).execute() + return None diff --git a/utils/helper.py b/utils/helper.py index b6eacfc..06b0219 100644 --- a/utils/helper.py +++ b/utils/helper.py @@ -3,6 +3,7 @@ import typing as t from load import bot, config + async def download_file(file_path, *args, **kw) -> t.Union[io.BytesIO, t.Any]: if config.telegram_api_server == "https://api.telegram.org": return await bot.download_file(file_path, *args, **kw) diff --git a/utils/json/__init__.py b/utils/json/__init__.py index 5918338..972e2d0 100644 --- a/utils/json/__init__.py +++ b/utils/json/__init__.py @@ -2,4 +2,4 @@ from load import permissions as __permissions from .model import Permission -permission = Permission(**__permissions) \ No newline at end of file +permission = Permission(**__permissions) diff --git a/utils/json/model.py b/utils/json/model.py index d6cdac8..58a2e5a 100644 --- a/utils/json/model.py +++ b/utils/json/model.py @@ -1,5 +1,6 @@ from pydantic import BaseModel + class Permission(BaseModel): can_admin_add_admins: bool can_admin_del_admins: bool diff --git a/utils/messages.py b/utils/messages.py index 680b0b7..03406c4 100644 --- a/utils/messages.py +++ b/utils/messages.py @@ -19,6 +19,9 @@ continue_ = "Продолжить" rewrite_data = "Ввести заново" load_data = "Загрузить данные" +#Operator +on_work = "Активировать" +leave_work = "Выключить" #Admins \ Moder admin_panel = "Админ панель" diff --git a/utils/types.py b/utils/types.py index 901ec4d..dbc3007 100644 --- a/utils/types.py +++ b/utils/types.py @@ -2,22 +2,22 @@ import typing as t from abc import ABC -class BaseUserFileds(ABC): +class BaseUser(ABC): id: int first_name: str last_name: t.Union[str, None] = None username: t.Union[str, None] = None -class User(BaseUserFileds): +class User(BaseUser): - def __new__(self, **kw): + def __new__(cls, **kw): if "user_id" in kw: - self.id = kw["user_id"] + cls.id = kw["user_id"] if "first_name" in kw: - self.first_name = kw["first_name"] + cls.first_name = kw["first_name"] if "last_name" in kw: - self.last_name = kw["last_name"] + cls.last_name = kw["last_name"] if "username" in kw: - self.username = kw["username"] - return self + cls.username = kw["username"] + return cls