Implemented post preview and confirmation system before scheduling - users can now preview posts, edit text, add images, or confirm scheduling

This commit is contained in:
2025-10-15 16:52:38 +03:00
parent 34698c7fe1
commit ae7e87d463
+143 -17
View File
@@ -304,6 +304,14 @@ ID: {user_info['ID']}
await self.handle_tic_tac_toe_move(query, context) await self.handle_tic_tac_toe_move(query, context)
elif query.data.startswith('quiz_'): elif query.data.startswith('quiz_'):
await self.handle_quiz_answer(query, context) await self.handle_quiz_answer(query, context)
elif query.data.startswith('confirm_schedule_'):
await self.confirm_schedule_post(query, context)
elif query.data == 'edit_text':
await self.edit_schedule_text(query, context)
elif query.data == 'add_image':
await self.add_schedule_image(query, context)
elif query.data == 'cancel_schedule':
await self.cancel_schedule_post(query, context)
async def start_rps_game(self, query, context): async def start_rps_game(self, query, context):
@@ -972,24 +980,36 @@ ID: {user_info['ID']}
await update.message.reply_text(SCHEDULER_MESSAGES['time_in_past']) await update.message.reply_text(SCHEDULER_MESSAGES['time_in_past'])
return return
# Добавление поста в базу данных # Показываем предварительный просмотр поста
post_id = db.add_scheduled_post( preview_text = f"""
chat_id=update.effective_chat.id, 📝 <b>Предварительный просмотр поста:</b>
text=text,
schedule_time=schedule_time.strftime('%Y-%m-%d %H:%M:%S'),
created_by=user.id
)
if post_id: 📅 <b>Время публикации:</b> {schedule_time.strftime('%Y-%m-%d %H:%M:%S')}
await update.message.reply_text(
SCHEDULER_MESSAGES['post_scheduled'].format( 📋 <b>Текст поста:</b>
time=schedule_time.strftime('%Y-%m-%d %H:%M:%S'), {text}
text=text[:50] + ('...' if len(text) > 50 else ''),
post_id=post_id ❓ Что вы хотите сделать?
) """
)
else: keyboard = [
await update.message.reply_text(SCHEDULER_MESSAGES['save_error']) [InlineKeyboardButton("✅ Опубликовать сейчас", callback_data=f'confirm_schedule_{schedule_time.strftime("%Y%m%d_%H%M%S")}_{len(text)}')],
[InlineKeyboardButton("📝 Изменить текст", callback_data='edit_text')],
[InlineKeyboardButton("🖼 Добавить картинку", callback_data='add_image')],
[InlineKeyboardButton("❌ Отменить", callback_data='cancel_schedule')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
# Сохраняем данные для подтверждения в user_data
context.user_data['schedule_draft'] = {
'time_str': time_str,
'text': text,
'schedule_time': schedule_time,
'chat_id': update.effective_chat.id,
'created_by': user.id
}
await update.message.reply_text(preview_text, parse_mode='HTML', reply_markup=reply_markup)
async def list_posts(self, update: Update, context: ContextTypes.DEFAULT_TYPE): async def list_posts(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Показать список запланированных постов""" """Показать список запланированных постов"""
@@ -1149,6 +1169,12 @@ ID: {user_info['ID']}
async def handle_message(self, update: Update, context: ContextTypes.DEFAULT_TYPE): async def handle_message(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Обработка текстовых сообщений""" """Обработка текстовых сообщений"""
user = update.effective_user user = update.effective_user
# Проверяем, ждет ли пользователь редактирования текста поста
if context.user_data.get('waiting_for_text_edit'):
await self.handle_text_edit(update, context)
return
message_text = update.message.text.lower() message_text = update.message.text.lower()
# Добавление пользователя в базу данных # Добавление пользователя в базу данных
@@ -1201,6 +1227,39 @@ ID: {user_info['ID']}
db.update_score(user.id, bonus_points) db.update_score(user.id, bonus_points)
await update.message.reply_text(USER_MESSAGES['bonus_points'].format(points=bonus_points)) await update.message.reply_text(USER_MESSAGES['bonus_points'].format(points=bonus_points))
async def handle_text_edit(self, update, context):
"""Обработка редактирования текста поста"""
new_text = update.message.text
draft = context.user_data.get('schedule_draft')
if draft:
draft['text'] = new_text
context.user_data['schedule_draft'] = draft
# Показываем обновленный предварительный просмотр
preview_text = f"""
📝 <b>Текст обновлен! Предварительный просмотр:</b>
📅 <b>Время публикации:</b> {draft['schedule_time'].strftime('%Y-%m-%d %H:%M:%S')}
📋 <b>Новый текст поста:</b>
{new_text}
❓ Что вы хотите сделать?
"""
keyboard = [
[InlineKeyboardButton("✅ Опубликовать сейчас", callback_data=f'confirm_schedule_{draft["schedule_time"].strftime("%Y%m%d_%H%M%S")}_{len(new_text)}')],
[InlineKeyboardButton("📝 Изменить текст еще раз", callback_data='edit_text')],
[InlineKeyboardButton("🖼 Добавить картинку", callback_data='add_image')],
[InlineKeyboardButton("❌ Отменить", callback_data='cancel_schedule')]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await update.message.reply_text(preview_text, parse_mode='HTML', reply_markup=reply_markup)
context.user_data.pop('waiting_for_text_edit', None)
async def handle_new_chat_members(self, update: Update, context: ContextTypes.DEFAULT_TYPE): async def handle_new_chat_members(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Обработка новых участников чата""" """Обработка новых участников чата"""
for member in update.chat_member.new_chat_members: for member in update.chat_member.new_chat_members:
@@ -1303,6 +1362,73 @@ ID: {user_info['ID']}
await query.edit_message_text(GAME_MESSAGES['select_game'], reply_markup=reply_markup) await query.edit_message_text(GAME_MESSAGES['select_game'], reply_markup=reply_markup)
async def confirm_schedule_post(self, query, context):
"""Подтверждение и добавление поста в расписание"""
try:
draft = context.user_data.get('schedule_draft')
if not draft:
await query.edit_message_text("❌ Данные поста не найдены. Попробуйте создать пост заново.")
return
# Добавление поста в базу данных
post_id = db.add_scheduled_post(
chat_id=draft['chat_id'],
text=draft['text'],
schedule_time=draft['schedule_time'].strftime('%Y-%m-%d %H:%M:%S'),
created_by=draft['created_by']
)
if post_id:
await query.edit_message_text(
f"✅ Пост успешно запланирован!\n\n📅 Время публикации: {draft['schedule_time'].strftime('%Y-%m-%d %H:%M:%S')}\n📝 Текст: {draft['text'][:50]}{'...' if len(draft['text']) > 50 else ''}\n🆔 ID поста: {post_id}"
)
else:
await query.edit_message_text("❌ Ошибка при сохранении поста в базу данных.")
# Очищаем черновик
context.user_data.pop('schedule_draft', None)
except Exception as e:
await query.edit_message_text(f"❌ Ошибка при планировании поста: {str(e)}")
async def edit_schedule_text(self, query, context):
"""Редактирование текста поста"""
draft = context.user_data.get('schedule_draft')
if not draft:
await query.edit_message_text("❌ Данные поста не найдены.")
return
await query.edit_message_text(
"📝 Отправьте новый текст для поста в ответ на это сообщение.\n\nТекущий текст:\n" + draft['text'],
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("❌ Отменить", callback_data='cancel_schedule')]])
)
# Устанавливаем флаг ожидания нового текста
context.user_data['waiting_for_text_edit'] = True
async def add_schedule_image(self, query, context):
"""Добавление картинки к посту"""
draft = context.user_data.get('schedule_draft')
if not draft:
await query.edit_message_text("❌ Данные поста не найдены.")
return
await query.edit_message_text(
"🖼 Отправьте картинку для поста в ответ на это сообщение.\n\nТекущий текст:\n" + draft['text'],
reply_markup=InlineKeyboardMarkup([[InlineKeyboardButton("❌ Отменить", callback_data='cancel_schedule')]])
)
# Устанавливаем флаг ожидания картинки
context.user_data['waiting_for_image'] = True
async def cancel_schedule_post(self, query, context):
"""Отмена планирования поста"""
context.user_data.pop('schedule_draft', None)
context.user_data.pop('waiting_for_text_edit', None)
context.user_data.pop('waiting_for_image', None)
await query.edit_message_text("❌ Планирование поста отменено.")
def run(self): def run(self):
"""Запуск бота""" """Запуск бота"""
print("Bot started!") print("Bot started!")