Веб-разработка. Доработка существующего продукта. Есть бот@vtb_priz_bot для проведения розыгрышей в TG-канале. Задача: разработать админ-панель для автоматизации проведения розыгрышей. Как сейчас работает бот В БД есть таблица giveaways, в которой хранятся все розыгрыши: code (уникальный идентификатор розыгрыша, который устанавливается в метку ?start= для запуска бота) hello_text - текст в формате html, который приходит пользователям при входе в розыгрыш hello_image - путь к файлу изображения, которое приходит вместе с текстом при входе в розыгрыш hello_image_fileid - заполняется автоматически при первой отправке изображения, представляет собой ID файла в Telegram participant_text - текст, который отправляется пользователю при успешном выполнении критериев участия (добавился в список) is_enabled - статус конкурса (активен / не активен) В таблице channels хранятся каналы, подключенные к боту для розыгрышей В таблице giveaway_channels хранится связка каналов и гивов Для текущих задач достаточно будет к созданному гиву подвязывать дефолтный канал с ID №1. В будущем может понадобится интерфейс для администрирования и добавления дополнительных каналов к розыгрышу. В таблице giveaway_participants хранятся участники всех розыгрышей: giveaway_id - ID розыгрыша bot_user_id - ID пользователя is_winner - флаг выигрыша Нужно создать админку, в которой можно: Посмотреть список всех розыгрышей Добавить новый розыгрыш (прикрепить к нему картинку, текст с HTML форматированием, текст для успешного участия) Посмотреть статистику по розыгрышу (сколько участников и тд) Подвести итоги розыгрыша (сгенерировать список победителей и разослать рассылку, об этом ниже) Есть ряд стандартных текстов в боте, которые хочется редактировать в админке Помимо текстов, привязанных к конкретному гиву (стартовое сообщение и сообщение об успешном участии), есть ряд стандартных текстов, например: 'Розыгрыш завершён. Поздравляем победителей.' '🔵 Участвовать' 'Произошла ошибка. Кажется, сейчас большая нагрузка. Пожалуйста, попробуйте позже.' 'Похоже, что вы еще не подписались на наш канал. Подпишитесь, чтобы принять участие в розыгрыше! %s' '🔵 Проверить снова' 'Вы уже участвуете в этом розыгрыше. Дождитесь подведения итогов.' 'Розыгрыш не найден. Возможно он закончился.' Эти стандартные тексты раскиданы по 2 файлам: Telegram/Commands/StartCommand.php, Telegram/Commands/ParticipateCommand.php. Эти тексты хочется также вынести в админку, чтобы из отдельной страницы можно было их отредактировать. Как сейчас работает подведение итогов Для подведения итогов реализованы 2 команды artisan: php artisan giveaway:get_winners и php artisan giveaway:send_winners Подведение итогов устроено следующим образом: Вручную запускается команда get_winners, в которой указывается: ID розыгрыша, кол-во победителей. Команда в случайном порядке перемешивает участников, и набирает из них N победителей. Для выбранных победителей устанавливается пометка “is_winner = 1” Далее вручную в обязательном порядке проверяется сгенерированный список победителей - мы отсматриваем чтобы у них были логины и нормальные имена, вручную открываем их в ТГ смотрим аватарки. Если кто-то из победителей выглядит как бот, мы меняем его в ручном режиме (убираем ему is_winner = 1, запускаем повторно get_winners на недостающее число участников) После того как все победители выбраны и список согласован, мы готовим рассылку Для этого мы прописываем ее в коде команды send_winners - прописываем туда текст сообщения и картинку сообщения. Далее запускаем рассылку через консоль - рассылка уходит только тем пользователям, которые что-то выиграли. Подведение итогов в админке: К карточке конкретного розыгрыша вывести таблицу “Список победителей” Вывести кнопку “Выбрать победителей”, указывается сколько победителей выбрать, и система рандомно их выбирает. Напротив каждого победителя предусмотреть кнопку “Выбрать другого” - система рандомно заменяет именно этого победителя по клику на кнопку, других не трогает. Для списка победителей нужно выводить: id, telegram_id, telegram_username, telegram_first_name, telegram_last_name Ниже нужно вывести кнопку “Разослать сообщение по победителям”, которая ведет на страницу рассылки, где можно указать текст+изображение. Далее рассылка планируется и запускается по всем победителям. Результат задачи Админка, в которой есть ключевые разделы: Список розыгрышей, Рассылка В список розыгрышей можно добавить розыгрыш Можно редактировать уже идущий розыгрыш или вкл/выкл его Можно подвести итоги из админки, выбрать победителей, заменить конкретного победителя на другого По итоговым победителям можно разослать рассылку Также по всем пользователям в системе можно разослать рассылку —---------- Код который можно взять за основу Конкретно в этом боте у нас не реализована админ-панель вообще. Нужно будет развернуть дефолтную систему авторизации Laravel, закрыть доступ к регистрации и восстановлению пароля. В коде других приложений у нас есть реализованная система рассылки (на скрине), туда уже интегрирован html редактор с поддержкой всех тегов telegram, валидацией длины текста, загрузкой картинок. И также уже есть реализация для cron, которая из БД отправляет всех пользователей которым эта рассылка была запланирована. Мы расшарим код этого приложения, фактически рассылку можно будет перенести из него, т.е. не кодить с 0. К рассылке только нужно будет подключить поддержку отправки по конкретной группе пользователей. Также в другом приложении есть примеры дефолтных таблиц/форм для добавления редактирования элементов. Можно будет также взять их за основу и переделать под механику розыгрышей.