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()