diff --git a/olgram/bot/bots.py b/olgram/bot/bots.py index d0ed1a1..0e42163 100644 --- a/olgram/bot/bots.py +++ b/olgram/bot/bots.py @@ -1,16 +1,80 @@ -from aiogram import Bot, Dispatcher, executor, types +from aiogram import types, Bot as AioBot from aiogram.dispatcher import FSMContext +from aiogram.utils.exceptions import Unauthorized, TelegramAPIError +import re +from textwrap import dedent from ..utils.router import Router +from olgram.models.bot import Bot +from olgram.models.user import User router = Router() +token_pattern = r'[0-9]{8,10}:[a-zA-Z0-9_-]{35}' @router.message_handler(commands=["my_bots"]) async def my_bots(message: types.Message, state: FSMContext): - await message.answer("У тебя много ботов )") + user = await User.get_or_none(telegram_id=message.from_user.id) + bots = await Bot.filter(owner=user) + if not bots: + await message.answer(dedent(""" + У вас нет добавленных ботов. + + Отправьте команду /add_bot, чтобы добавить бот. + """)) + return + + bots_str = "\n".join(["@" + bot.name for bot in bots]) + await message.answer(dedent(f""" + Ваши боты: + {bots_str} + """)) @router.message_handler(commands=["add_bot"]) async def add_bot(message: types.Message, state: FSMContext): - await message.answer("Добавь тогда ок") + await message.answer("Окей, пришли тогда токен plz") + await state.set_state("add_bot") + + +@router.message_handler(state="add_bot", content_types="text", regexp="^[^/].+") # Not command +async def bot_added(message: types.Message, state: FSMContext): + token = re.findall(token_pattern, message.text) + + async def on_invalid_token(): + await message.answer(dedent(""" + Это не токен бота. + + Токен выглядит вот так: 123456789:AAAA-abc123_AbcdEFghijKLMnopqrstu12 + """)) + + async def on_dummy_token(): + await message.answer(dedent(""" + Не удалось запустить этого бота: неверный токен + """)) + + async def on_unknown_error(): + await message.answer(dedent(""" + Не удалось запустить этого бота: непредвиденная ошибка + """)) + + if not token: + return await on_invalid_token() + + token = token[0] + + try: + test_bot = AioBot(token) + test_bot_info = await test_bot.get_me() + except ValueError: + return await on_invalid_token() + except Unauthorized: + return await on_dummy_token() + except TelegramAPIError: + return await on_unknown_error() + + user, _ = await User.get_or_create(telegram_id=message.from_user.id) + bot = Bot(token=token, owner=user, name=test_bot_info.username) + await bot.save() + + await message.answer("Бот добавлен!") diff --git a/olgram/bot/start.py b/olgram/bot/start.py index c4cba39..52fda17 100644 --- a/olgram/bot/start.py +++ b/olgram/bot/start.py @@ -1,17 +1,39 @@ from aiogram import Bot, Dispatcher, executor, types from aiogram.dispatcher import FSMContext - +from textwrap import dedent from ..utils.router import Router router = Router() -@router.message_handler(commands=["start"]) +@router.message_handler(commands=["start"], state="*") async def start(message: types.Message, state: FSMContext): """ Start command handler """ + await state.reset_state() - await message.answer( - "Привет. Я бот Olgram" - ) + # TODO: locale + + await message.answer(dedent(""" + Olgram Bot — это конструктор ботов обратной связи в Telegram. + + Используйте эти команды, чтобы управлять этим ботом: + + /add_bot - добавить бот + /my_bots - управление ботами + + /help - помощь + + Ссылка на репозиторий https://github.com/civsocit/olgram + """)) + + +@router.message_handler(commands=["help"], state="*") +async def help(message: types.Message, state: FSMContext): + """ + Help command handler + """ + await message.answer(dedent(""" + + """)) diff --git a/olgram/models/bot.py b/olgram/models/bot.py index f5a2753..0f85a32 100644 --- a/olgram/models/bot.py +++ b/olgram/models/bot.py @@ -6,6 +6,7 @@ class Bot(Model): id = fields.IntField(pk=True) token = fields.CharField(max_length=50, unique=True) owner = fields.ForeignKeyField("models.User", related_name="bots") + name = fields.CharField(max_length=33) class Meta: table = 'bot' diff --git a/olgram/models/user.py b/olgram/models/user.py index 16e07a1..2c7b351 100644 --- a/olgram/models/user.py +++ b/olgram/models/user.py @@ -3,7 +3,7 @@ from tortoise import Model, fields class User(Model): id = fields.IntField(pk=True) - telegram_id = fields.IntField(index=True) + telegram_id = fields.IntField(index=True, unique=True) class Meta: table = 'user'