| 
									
										
										
										
											2021-06-11 23:46:37 +03:00
										 |  |  |  | from aiogram import types, Bot as AioBot | 
					
						
							| 
									
										
										
										
											2021-06-11 21:56:03 +03:00
										 |  |  |  | from aiogram.dispatcher import FSMContext | 
					
						
							| 
									
										
										
										
											2021-06-11 23:46:37 +03:00
										 |  |  |  | from aiogram.utils.exceptions import Unauthorized, TelegramAPIError | 
					
						
							|  |  |  |  | import re | 
					
						
							|  |  |  |  | from textwrap import dedent | 
					
						
							| 
									
										
										
										
											2021-06-11 21:56:03 +03:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | from ..utils.router import Router | 
					
						
							| 
									
										
										
										
											2021-06-29 15:29:41 +03:00
										 |  |  |  | from .bot import select_bot | 
					
						
							|  |  |  |  | from olgram.models.models import Bot, User | 
					
						
							|  |  |  |  | from olgram.settings import OlgramSettings | 
					
						
							| 
									
										
										
										
											2021-06-11 21:56:03 +03:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | router = Router() | 
					
						
							| 
									
										
										
										
											2021-06-11 23:46:37 +03:00
										 |  |  |  | token_pattern = r'[0-9]{8,10}:[a-zA-Z0-9_-]{35}' | 
					
						
							| 
									
										
										
										
											2021-06-11 21:56:03 +03:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-29 15:29:41 +03:00
										 |  |  |  | @router.message_handler(commands=["mybots"], state="*") | 
					
						
							| 
									
										
										
										
											2021-06-11 21:56:03 +03:00
										 |  |  |  | async def my_bots(message: types.Message, state: FSMContext): | 
					
						
							| 
									
										
										
										
											2021-06-29 15:29:41 +03:00
										 |  |  |  |     """
 | 
					
						
							|  |  |  |  |     Команда /mybots (список ботов) | 
					
						
							|  |  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2021-06-11 23:46:37 +03:00
										 |  |  |  |     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("""
 | 
					
						
							|  |  |  |  |         У вас нет добавленных ботов.  | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-29 15:29:41 +03:00
										 |  |  |  |         Отправьте команду /addbot, чтобы добавить бот. | 
					
						
							| 
									
										
										
										
											2021-06-11 23:46:37 +03:00
										 |  |  |  |         """))
 | 
					
						
							|  |  |  |  |         return | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-29 15:29:41 +03:00
										 |  |  |  |     keyboard = types.InlineKeyboardMarkup(row_width=2) | 
					
						
							|  |  |  |  |     for bot in bots: | 
					
						
							|  |  |  |  |         keyboard.insert(types.InlineKeyboardButton(text="@" + bot.name, callback_data=select_bot.new(bot_id=bot.id))) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     await message.answer("Ваши боты", reply_markup=keyboard) | 
					
						
							| 
									
										
										
										
											2021-06-11 21:56:03 +03:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-29 15:29:41 +03:00
										 |  |  |  | @router.message_handler(commands=["addbot"], state="*") | 
					
						
							| 
									
										
										
										
											2021-06-11 21:56:03 +03:00
										 |  |  |  | async def add_bot(message: types.Message, state: FSMContext): | 
					
						
							| 
									
										
										
										
											2021-06-29 15:29:41 +03:00
										 |  |  |  |     """
 | 
					
						
							|  |  |  |  |     Команда /addbot (добавить бота) | 
					
						
							|  |  |  |  |     """
 | 
					
						
							|  |  |  |  |     bot_count = await Bot.filter(user__telegram_id=message.from_user.id).count() | 
					
						
							|  |  |  |  |     if bot_count > OlgramSettings.max_bots_per_user(): | 
					
						
							|  |  |  |  |         await message.answer("У вас уже слишком много ботов") | 
					
						
							|  |  |  |  |         return | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     await message.answer(dedent("""
 | 
					
						
							|  |  |  |  |     Чтобы подключить бот, вам нужно выполнить три действия: | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     1. Перейдите в бот @BotFather, нажмите START и отправьте команду /newbot | 
					
						
							|  |  |  |  |     2. Введите название бота, а потом username бота. | 
					
						
							|  |  |  |  |     3. После создания бота перешлите ответное сообщение в этот бот или скопируйте и пришлите token бота. | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     Важно: не подключайте боты, которые используются в других сервисах (Manybot, Chatfuel, Livegram и других). | 
					
						
							|  |  |  |  |      | 
					
						
							|  |  |  |  |     Подробную инструкцию по созданию бота читайте здесь /help) | 
					
						
							|  |  |  |  |     """))
 | 
					
						
							| 
									
										
										
										
											2021-06-11 23:46:37 +03:00
										 |  |  |  |     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): | 
					
						
							| 
									
										
										
										
											2021-06-29 15:29:41 +03:00
										 |  |  |  |     """
 | 
					
						
							|  |  |  |  |     Пользователь добавляет бота и мы ждём от него токен | 
					
						
							|  |  |  |  |     """
 | 
					
						
							| 
									
										
										
										
											2021-06-11 23:46:37 +03:00
										 |  |  |  |     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() | 
					
						
							| 
									
										
										
										
											2021-06-29 15:29:41 +03:00
										 |  |  |  |         await test_bot.session.close() | 
					
						
							| 
									
										
										
										
											2021-06-11 23:46:37 +03:00
										 |  |  |  |     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("Бот добавлен!") |