diff --git a/README.md b/README.md index 3e22a1b..a37c7b0 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,46 @@ -# S-bot-tg +# Telegram Shop Bot +Данный репозиторий содержит Telegram-бот, который является интернет-магазином. Он создан с использованием фреймворка Aiogram и обладает следующими функциями: продажа товаров онлайн, inline-меню, поддержка пользователей, отзывы, раздел вопросы-ответы, админ-панель для настройки параметров и база данных SQLite. +## Требования +Для запуска этого бота на локальной машине необходимо установить следующие зависимости: + +- Python 3.7 или выше +- Все зависимости, перечисленные в файле requirements.txt + +Вы можете установить необходимые зависимости, выполнив следующую команду: + +```shell +pip install -r requirements.txt +``` + +## Конфигурация +Перед запуском бота вам необходимо предоставить необходимые настройки конфигурации. Файл конфигурации config.py должен быть заполнен необходимыми значениями. Обязательно обновите следующие настройки: + +- 'BOT_TOKEN': Ваш токен API для Telegram-бота. Вы можете получить его, создав нового бота с помощью BotFather. +- Другие параметры конфигурации, такие как настройки базы данных, контакты администраторов и т.д, указаны в файле config.py. + +## Использование +После установки зависимостей и заполнения настроек конфигурации вы можете запустить бота файлом main.py: + +```shell +python main.py +``` +Бот запущен. Но для бесперебойной работы лучше подойдет режим работы через демона, например, с помощью ``systemd`` на системах с ОС linux + +## Функциональность +- **Онлайн-магазин**. Бот позволяет пользователям просматривать и покупать товары онлайн. Он предоставляет интуитивно понятный интерфейс с inline-меню, что облегчает пользователям навигацию и совершение покупок. + +- **Поддержка пользователей**. Пользователи могут обратиться за поддержкой к администратору, задав вопросы + +- **Отзывы**. Пользователи имеют возможность оставлять отзывы о товарах или общем опыте работы с ботом. Эта обратная связь помогает улучшить качество обслуживания и предоставляет ценную информацию как для администратора, так и для других пользователей. + +- **Раздел вопросы-ответы**. Бот включает отдельный раздел для часто задаваемых вопросов (FAQ). Пользователи могут получить доступ к этому разделу, чтобы найти ответы на распространенные вопросы, не обращаясь в поддержку. + +- **Админ-панель**. Для управления настройками и параметрами бота доступна админ-панель. Администраторы могут настраивать различные аспекты бота, такие как список товаров, ценообразование, варианты оплаты и многое другое. + +- **База данных SQLite**. Бот использует базу данных SQLite для хранения и извлечения данных, обеспечивая целостность данных и эффективное управление ими. + +- **И другое...** + +## Лицензия +Этот проект лицензируется в соответствии с MIT License. Вы можете свободно использовать, изменять и распространять код в соответствии с условиями лицензии. diff --git a/personnel.py b/personnel.py new file mode 100644 index 0000000..1aa3bb1 --- /dev/null +++ b/personnel.py @@ -0,0 +1,6 @@ +# Персонал # + +admin_ulr = '' # Тег админа +admins = [ХУЙ] # Список ID админов +operators = [ХУЙ] # Список ID операторов +supporters = [] # Список ID саппортов diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..4f6597f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +aiohttp +aiogram +qrcode \ No newline at end of file diff --git a/review.py b/review.py new file mode 100644 index 0000000..3a078f6 --- /dev/null +++ b/review.py @@ -0,0 +1,66 @@ +from config import dp, db, bot, review_channel_id, review_channel_url +from aiogram import types +from aiogram.dispatcher import FSMContext +from states import ReviewTake +from markups import cancel_mkp, menu_mkp +from personnel import * +from essentials import * + +@dp.callback_query_handler(text_contains='reviews') +async def feedchannelmsg(call: types.CallbackQuery): + await call.message.answer('Канал с отзывами' +': '+ review_channel_url) + +@dp.callback_query_handler(text_contains='takeotziv_') +async def takeotzivcall(call: types.CallbackQuery, state: FSMContext): + await call.message.delete() + await call.message.answer('Введите оценку от 1 до 5:', reply_markup=cancel_mkp(call.from_user.id)) + await ReviewTake.OrderId.set() + async with state.proxy() as data: + data['OrderId'] = call.data.split('_')[1] + await ReviewTake.next() + +@dp.message_handler(state=ReviewTake.Stars) +async def reviewtakestartmsg(message: types.Message, state: FSMContext): + if message.text.isdigit(): + if int(message.text) > 0 and int(message.text) < 6: + async with state.proxy() as data: + data['Stars'] = message.text + await message.answer('Введите ваш отзыв текстом:', reply_markup=types.InlineKeyboardMarkup(types.InlineKeyboardButton('Отменить', callback_data='cancel'))) + await ReviewTake.next() + else: + await message.answer('Введите оценку от 1 до 5:', reply_markup=cancel_mkp(message.from_user.id)) + else: + await message.answer('Введите оценку числом!', reply_markup=cancel_mkp(message.from_user.id)) + +@dp.callback_query_handler(text='cancel', state=ReviewTake.Review) +@dp.callback_query_handler(text='cancel', state=ReviewTake.Stars) +async def reviewtakecancel(call: types.CallbackQuery, state: FSMContext): + await call.message.delete() + await call.message.answer('Отменено. Вы были возвращены в меню', reply_markup=menu_mkp()) + await state.finish() + +@dp.message_handler(state=ReviewTake.Review) +async def reviewtakereviewmsg(message: types.Message, state: FSMContext): + try: + stars_list = ['🌟', '🌟', '🌟🌟', '🌟🌟🌟', '🌟🌟🌟🌟', '🌟🌟🌟🌟🌟'] + async with state.proxy() as data: + pass + order_id = data['OrderId'] + stars = data['Stars'] + goodId = db.get_order_info(int(order_id))[1] + goodInfo = db.get_goodinfo(goodId) + text = f'Заказ №{order_id}\nТовар: {goodInfo[0]}' + if db.get_usernamerev(message.from_user.id): + a = db.get_usernamerev(message.from_user.id) + b = f'{a[:2]}***{a[-2:]}' + await bot.send_message(review_channel_id, f'{text}Пользователь: {b}\nОценка: {stars_list[int(stars)]}\nОтзыв: {message.text}') + else: + await bot.send_message(review_channel_id, f'{text}Пользователь: {message.from_user.first_name}\nОценка: {stars_list[int(stars)]}\nОтзыв: {message.text}') + except: + for admin in admins: + try: + await bot.send_message(admin, 'Произошла ошибка при отправлении отзыва в канал') + except: + pass + await message.answer('Спасибо. Вы были возвращены в меню', reply_markup=menu_mkp()) + await state.finish()