async refactor & docker deploy environment
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2025-09-05 12:04:58 +09:00
parent 0d3bcdfc64
commit d17f0f5507
15 changed files with 361 additions and 187 deletions

81
main.py
View File

@@ -1,32 +1,67 @@
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 SessionLocal, init_db
from db import AsyncSessionLocal, init_db
from models import Admin, Channel, Group, Button
from asyncio import run as sync_to_async
load_dotenv()
TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')
logging.basicConfig(level=logging.INFO)
logging.getLogger("httpx").setLevel(logging.WARNING)
logger = logging.getLogger(__name__)
init_db()
import asyncio
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
session = SessionLocal()
user_id = update.effective_user.id
admin = session.query(Admin).filter_by(tg_id=user_id).first()
if not admin:
admin = Admin(tg_id=user_id)
session.add(admin)
session.commit()
await update.message.reply_text('Вы зарегистрированы как админ.')
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:
await update.message.reply_text('Вы уже зарегистрированы.')
session.close()
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
@@ -38,10 +73,16 @@ from handlers.channel_buttons import channel_buttons_conv
from handlers.edit_button import edit_button
from handlers.del_button import del_button
def main():
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)
@@ -50,7 +91,17 @@ def main():
application.add_handler(channel_buttons_conv)
application.add_handler(CommandHandler('edit_button', edit_button))
application.add_handler(CommandHandler('del_button', del_button))
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__':
if __name__ == "__main__":
main()