Files
post_bot/main.py
Choi A.K. f35113e5c8
Some checks failed
continuous-integration/drone/push Build is failing
continuous-integration/drone/pr Build is failing
migrations + util scripts
2025-09-05 13:54:59 +09:00

110 lines
5.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import sys
import asyncio
if sys.platform.startswith('win'):
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
import logging
import os
from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Application, CommandHandler, MessageHandler, filters, CallbackQueryHandler, ConversationHandler, ContextTypes
from dotenv import load_dotenv
from db import AsyncSessionLocal, init_db
from models import Admin, Channel, Group, Button
from asyncio import run as sync_to_async
from handlers.admin_panel import admin_panel_conv
load_dotenv()
TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')
logging.basicConfig(level=logging.INFO)
logging.getLogger("httpx").setLevel(logging.WARNING)
logger = logging.getLogger(__name__)
import asyncio
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
session = AsyncSessionLocal()
user_id = update.effective_user.id if update.effective_user else None
result = await session.execute(Admin.__table__.select().where(Admin.tg_id == user_id))
admin = result.first() if user_id else None
if not admin and user_id:
await session.execute(Admin.__table__.insert().values(tg_id=user_id))
await session.commit()
if update.message:
await update.message.reply_text('Вы зарегистрированы как админ.')
else:
if update.message:
await update.message.reply_text('Вы уже зарегистрированы.')
await session.close()
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
help_text = (
"<b>Справка по командам бота:</b>\n\n"
"<b>/start</b> — регистрация пользователя как администратора.\n"
"<b>/help</b> — показать это подробное описание команд.\n\n"
"<b>/add_channel &lt;название&gt; &lt;ссылка&gt;</b> — добавить канал для публикаций. Пример: /add_channel MyChannel @my_channel\n"
"<b>/add_group &lt;название&gt; &lt;ссылка&gt;</b> — добавить группу для публикаций. Пример: /add_group MyGroup @my_group\n"
"<b>/add_button</b> — добавить кнопку к выбранному каналу или группе. Запустит диалог выбора и добавления.\n"
"<b>/edit_button &lt;название&gt; &lt;новоеазвание&gt; &lt;новая_ссылка&gt;</b> — изменить кнопку. Пример: /edit_button old new https://site.ru\n"
"<b>/del_button &lt;название&gt;</b> — удалить кнопку по названию.\n"
"<b>/new_post</b> — создать новый пост (картинка + текст + выбор канала/группы + кнопки).\n"
"<b>/group_buttons</b> — показать и настроить кнопки для группы.\n"
"<b>/channel_buttons</b> — показать и настроить кнопки для канала.\n\n"
"<b>Примеры использования:</b>\n"
"- /add_channel Новости @news_channel\n"
"- /add_group Чат @chat_group\n"
"- /edit_button Подписка Subscribe https://subscribe.ru\n"
"- /del_button Subscribe\n\n"
"<b>Порядок работы:</b>\n"
"1. Добавьте канал или группу.\n"
"2. Добавьте кнопки для них.\n"
"3. Создайте пост через /new_post и выберите, куда отправить.\n"
"4. Управляйте кнопками через /group_buttons и /channel_buttons.\n\n"
"Если возникли вопросы — используйте /help или обратитесь к администратору."
)
if update.message:
await update.message.reply_text(help_text, parse_mode='HTML')
# Импорт обработчиков
from handlers.add_channel import add_channel
from handlers.add_group import add_group
from handlers.add_button import add_button_conv
from handlers.new_post import new_post_conv
from handlers.group_buttons import group_buttons_conv
from handlers.channel_buttons import channel_buttons_conv
from handlers.edit_button import edit_button
from handlers.del_button import del_button
def main():
if not TELEGRAM_TOKEN:
print("Ошибка: TELEGRAM_TOKEN не найден в переменных окружения.")
return
sync_to_async(init_db())
application = Application.builder().token(TELEGRAM_TOKEN).build()
application.add_handler(CommandHandler('start', start))
application.add_handler(CommandHandler('help', help_command))
application.add_handler(CommandHandler('add_channel', add_channel))
application.add_handler(CommandHandler('add_group', add_group))
application.add_handler(add_button_conv)
application.add_handler(new_post_conv)
application.add_handler(group_buttons_conv)
application.add_handler(channel_buttons_conv)
application.add_handler(CommandHandler('edit_button', edit_button))
application.add_handler(CommandHandler('del_button', del_button))
application.add_handler(admin_panel_conv)
import sys
import asyncio
if sys.platform.startswith('win'):
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
try:
loop = asyncio.get_event_loop()
except RuntimeError:
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
application.run_polling()
if __name__ == "__main__":
main()