async def content_photo_handler(message: types.Message, state: FSMContext): file = await bot.get_file(message.photo[-1].file_id) await state.update_data(content_file_id=file.file_id) await BotStates.DEFAULT.set() user_data = await state.get_data() answer = 'Задано новое фото для обработки.\nВо время обработки фото будет обрезано до квадратного.' await message.answer(answer, reply_markup=init_main_keyboard(user_data))
async def help_handler(message: types.Message, state: FSMContext): user_data = await state.get_data() await BotStates.DEFAULT.set() await message.answer(help_str, parse_mode=types.ParseMode.HTML, disable_web_page_preview=True, reply_markup=init_main_keyboard(user_data))
async def readme_handler(message: types.Message, state: FSMContext): user_data = await state.get_data() await message.answer( 'Я могу обработать фото таким образом, ' 'чтобы стилистически оно стало похоже на другое изображение (стиль).', reply_markup=ReplyKeyboardRemove()) await types.ChatActions.upload_photo() flower_id = 4 if flower_id in examples[0]: media = types.MediaGroup() media.attach_photo( types.InputFile(examples[0][flower_id][ImageTypes.CONTENT]), caption='Например, в качестве фото можно использовать цветы.') media.attach_photo( types.InputFile(examples[0][flower_id][ImageTypes.STYLE]), caption='А в качестве стиля акварельный рисунок цветов.') media.attach_photo( types.InputFile(examples[0][flower_id][ImageTypes.RESULT]), caption='В результате получатся цветы с исходного фото, ' 'но как буд-то нарисованные акварелью.') await message.answer_media_group(media) await message.answer( 'Обычно в качестве стиля используют ' 'либо картинку с содержанием похожим на исходное фото, но оформленным иначе, ' 'либо красивую текстуру.\n\n' 'Подробную информацию о моей реализации смотрите на ' f'{md.hlink("github", "https://github.com/ChumankinYuriy/heroku_chust_bot")}.', reply_markup=init_main_keyboard(user_data), disable_web_page_preview=True, parse_mode=types.ParseMode.HTML)
async def show_styles_handler(message: types.Message, state: FSMContext): user_data = await state.get_data() await types.ChatActions.upload_photo() media = types.MediaGroup() # Флаг указывающий, следует ли расставить картинки стилей в определённом здесь порядке. CUSTOM_ORDER = True if CUSTOM_ORDER: def attach(indexes): for idx in indexes: media.attach_photo(types.InputFile( default_styles[idx]['file']), caption=default_styles[idx]['name']) attach([2, 3]) await message.answer_media_group(media) media = types.MediaGroup() attach([13, 4, 1, 7, 8, 10, 12, 9, 11]) await message.answer_media_group(media) else: counter = 0 for style_id, style in default_styles.items(): # 9 картинок красиво собираются в квадрат. if counter == 9: await message.answer_media_group(media) media = types.MediaGroup() counter = 0 media.attach_photo(types.InputFile(style['file']), caption=style['name']) counter += 1 await message.answer_media_group(media) await message.answer( 'Это только список стандартных стилей. ' 'Перед обработкой вы можете выбрать в качестве стиля любое понравившееся изображение в вашем телефоне.', reply_markup=init_main_keyboard(user_data))
async def run_processing(message: types.Message, user_data: dict): if DataKeys.CONTENT_FILE_ID not in user_data: await message.answer("Сначала необходимо выбрать фото для обработки.", reply_markup=init_main_keyboard(user_data)) return if DataKeys.STYLE_FILE_ID not in user_data: await message.answer("Сначала необходимо выбрать стиль.", reply_markup=init_main_keyboard(user_data)) return await BotStates.PROCESSING.set() content_file = await bot.get_file(user_data[DataKeys.CONTENT_FILE_ID]) content_filename = 'tmp/' + user_data[DataKeys.CONTENT_FILE_ID] + '.png' await content_file.download(content_filename) style_filename = None if user_data[DataKeys.STYLE_FILE_ID] in default_styles: style_filename = default_styles[user_data[ DataKeys.STYLE_FILE_ID]]['file'] else: style_file = await bot.get_file(user_data[DataKeys.STYLE_FILE_ID]) style_filename = 'tmp/' + user_data[DataKeys.STYLE_FILE_ID] + '.png' await style_file.download(style_filename) time_str = '' waiting_time = WAITING_TIME * (on_processing[0] + 1) if waiting_time == 0: time_str = 'менее минуты' elif waiting_time % 10 == 1: time_str = 'около ' + str(waiting_time) + ' минуты' else: time_str = 'около ' + str(waiting_time) + ' минут' info = 'Обрабатываю фото, это займёт ' + time_str + '. Пришлю результат как только всё будет готово.' await message.answer(info, reply_markup=init_main_keyboard(user_data)) loop = asyncio.get_running_loop() future = loop.create_future() task = core(content_filename, style_filename, PRETRAINED_FILENAME) task_queue.put((future, task)) result_filename = await future os.remove(content_filename) if user_data[DataKeys.STYLE_FILE_ID] not in default_styles: os.remove(style_filename) await types.ChatActions.upload_photo() user_data[DataKeys.ON_PROCESSING] = False await message.answer_photo( open(result_filename, 'rb'), 'Обработка завершена. Если хотите, то следующим сообщением можете оставить отзыв 🙂', reply_markup=init_main_keyboard(user_data)) await BotStates.WAIT_FEEDBACK.set() os.remove(result_filename)
async def set_content_handler(message: types.Message, state: FSMContext): user_data = await state.get_data() if DataKeys.CONTENT_FILE_ID not in user_data: await message.answer("Сначала необходимо выбрать фото для обработки.", reply_markup=init_main_keyboard(user_data)) return await BotStates.WAIT_STYLE.set() await message.answer('Выберите стиль из представленных.', reply_markup=style_kb)
async def show_example_handler(message: types.Message, state: FSMContext): user_data = await state.get_data() if len(examples[0]) == 0: await message.answer('Извиняюсь, на сервере нет доступных примеров.', reply_markup=init_main_keyboard(user_data)) else: example = random.choice(list(examples[0].values())) await types.ChatActions.upload_photo() media = types.MediaGroup() media.attach_photo(types.InputFile(example[ImageTypes.RESULT]), caption='Результат') media.attach_photo(types.InputFile(example[ImageTypes.CONTENT]), caption='Фото') media.attach_photo(types.InputFile(example[ImageTypes.STYLE]), caption='Стиль') await message.answer_media_group(media) await message.answer('Вот такой пример.', reply_markup=init_main_keyboard(user_data))
async def feedback_handler(message: types.Message, state: FSMContext): user_data = await state.get_data() await BotStates.DEFAULT.set() await bot.send_message(message.from_user.id, "Спасибо за обратную связь.", reply_markup=init_main_keyboard(user_data)) if FEEDBACK_CHAT_ID is not None: await bot.send_message( FEEDBACK_CHAT_ID, "#отзыв от @" + message.from_user.username + ":\n" + message.text)
async def statistics_handler(message: types.Message, state: FSMContext): user_data = await state.get_data() await BotStates.DEFAULT.set() stat = Statistics.get() info = 'Начиная с ' + stat['date'] + ' я обработал ' + str(stat['counter']) mod = stat['counter'] % 10 if mod == 1: info += ' изображение.' elif mod in [2, 3, 4]: info += ' изображения.' else: info += ' изображений.' info += '\nНа текущий момент длина очереди на обработку равна ' + str( on_processing[0]) + '.' await message.answer(info, reply_markup=init_main_keyboard(user_data))
async def set_style(message: types.Message, state: FSMContext): user_data = await state.get_data() if message.text == CommandText.MY_STYLE: await message.answer( 'К следующему сообщению прикрепите изображение, которое хотите использовать в качестве стиля.', reply_markup=ReplyKeyboardRemove()) return style_id = parse_style_id(message.text) if style_id is None: await message.answer('Не могу понять, какой стиль вы хотите задать.', reply_markup=init_main_keyboard(user_data)) return await state.update_data(style_file_id=style_id) await BotStates.DEFAULT.set() await state.update_data(on_processing=True) user_data = await state.get_data() answer = 'Задан стиль \'' + default_styles[style_id]['name'] + '\'.\n' await set_style_reply(message.from_user.id, user_data, answer) await run_processing(message, user_data) await state.update_data(on_processing=False)
async def random_handler(message: types.Message, state: FSMContext): user_data = await state.get_data() await message.answer("Не понял команды.", reply_markup=init_main_keyboard(user_data))
async def random_photo_handler(message: types.Message, state: FSMContext): user_data = await state.get_data() await bot.send_message(message.chat.id, 'Принял фотографию, но не понял зачем.', reply_markup=init_main_keyboard(user_data))
async def set_style_reply(chat_id: int, user_data: dict, answer: str): if DataKeys.CONTENT_FILE_ID not in user_data: answer += "Задайте фото для обработки." await bot.send_message(chat_id, answer, reply_markup=init_main_keyboard(user_data))