2021-07-11 12:53:33 +03:00
|
|
|
|
"""
|
|
|
|
|
Здесь работа с ботами на первом уровне вложенности: список ботов, добавление ботов
|
|
|
|
|
"""
|
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
|
2021-07-01 19:51:59 +03:00
|
|
|
|
from tortoise.exceptions import IntegrityError
|
2021-06-11 23:46:37 +03:00
|
|
|
|
import re
|
|
|
|
|
from textwrap import dedent
|
2021-06-11 21:56:03 +03:00
|
|
|
|
|
2021-06-29 15:29:41 +03:00
|
|
|
|
from olgram.models.models import Bot, User
|
2022-06-24 23:33:01 +03:00
|
|
|
|
from olgram.settings import OlgramSettings, BotSettings
|
2021-09-06 02:03:04 +03:00
|
|
|
|
from olgram.commands.menu import send_bots_menu
|
2021-09-09 20:38:33 +03:00
|
|
|
|
from server.server import register_token
|
2022-03-22 05:43:10 +03:00
|
|
|
|
from locales.locale import _
|
2021-06-11 21:56:03 +03:00
|
|
|
|
|
2021-09-06 00:36:03 +03:00
|
|
|
|
from olgram.router import dp
|
|
|
|
|
|
2021-09-10 01:30:17 +03:00
|
|
|
|
import logging
|
|
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
|
|
|
|
|
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-09-06 00:36:03 +03:00
|
|
|
|
@dp.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-09-06 02:03:04 +03:00
|
|
|
|
return await send_bots_menu(message.chat.id, message.from_user.id)
|
2021-06-11 21:56:03 +03:00
|
|
|
|
|
|
|
|
|
|
2021-09-06 00:36:03 +03:00
|
|
|
|
@dp.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 (добавить бота)
|
|
|
|
|
"""
|
2022-06-16 03:22:15 +03:00
|
|
|
|
user = await User.get_or_none(telegram_id=message.from_user.id)
|
|
|
|
|
max_bot_count = OlgramSettings.max_bots_per_user()
|
|
|
|
|
if user and await user.is_promo():
|
|
|
|
|
max_bot_count = OlgramSettings.max_bots_per_user_promo()
|
2021-07-01 19:51:59 +03:00
|
|
|
|
bot_count = await Bot.filter(owner__telegram_id=message.from_user.id).count()
|
2022-06-16 03:22:15 +03:00
|
|
|
|
if bot_count >= max_bot_count:
|
2022-04-02 00:54:27 +03:00
|
|
|
|
await message.answer(_("У вас уже слишком много ботов. Удалите какой-нибудь свой бот из Olgram"
|
|
|
|
|
"(/mybots -> (Выбрать бота) -> Удалить бот)"))
|
2021-06-29 15:29:41 +03:00
|
|
|
|
return
|
|
|
|
|
|
2022-03-22 05:43:10 +03:00
|
|
|
|
await message.answer(dedent(_("""
|
2021-06-29 15:29:41 +03:00
|
|
|
|
Чтобы подключить бот, вам нужно выполнить три действия:
|
|
|
|
|
|
|
|
|
|
1. Перейдите в бот @BotFather, нажмите START и отправьте команду /newbot
|
|
|
|
|
2. Введите название бота, а потом username бота.
|
|
|
|
|
3. После создания бота перешлите ответное сообщение в этот бот или скопируйте и пришлите token бота.
|
2021-09-09 10:58:33 +03:00
|
|
|
|
|
2021-06-29 15:29:41 +03:00
|
|
|
|
Важно: не подключайте боты, которые используются в других сервисах (Manybot, Chatfuel, Livegram и других).
|
2022-03-22 05:43:10 +03:00
|
|
|
|
""")))
|
2021-06-11 23:46:37 +03:00
|
|
|
|
await state.set_state("add_bot")
|
|
|
|
|
|
|
|
|
|
|
2021-09-06 00:36:03 +03:00
|
|
|
|
@dp.message_handler(state="add_bot", content_types="text", regexp="^[^/].+") # Not command
|
2021-06-11 23:46:37 +03:00
|
|
|
|
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():
|
2022-03-22 05:43:10 +03:00
|
|
|
|
await message.answer(dedent(_("""
|
2021-09-09 10:58:33 +03:00
|
|
|
|
Это не токен бота.
|
2021-06-11 23:46:37 +03:00
|
|
|
|
|
|
|
|
|
Токен выглядит вот так: 123456789:AAAA-abc123_AbcdEFghijKLMnopqrstu12
|
2022-03-22 05:43:10 +03:00
|
|
|
|
""")))
|
2021-06-11 23:46:37 +03:00
|
|
|
|
|
|
|
|
|
async def on_dummy_token():
|
2022-03-22 05:43:10 +03:00
|
|
|
|
await message.answer(dedent(_("""
|
2021-06-11 23:46:37 +03:00
|
|
|
|
Не удалось запустить этого бота: неверный токен
|
2022-03-22 05:43:10 +03:00
|
|
|
|
""")))
|
2021-06-11 23:46:37 +03:00
|
|
|
|
|
|
|
|
|
async def on_unknown_error():
|
2022-03-22 05:43:10 +03:00
|
|
|
|
await message.answer(dedent(_("""
|
2021-06-11 23:46:37 +03:00
|
|
|
|
Не удалось запустить этого бота: непредвиденная ошибка
|
2022-03-22 05:43:10 +03:00
|
|
|
|
""")))
|
2021-06-11 23:46:37 +03:00
|
|
|
|
|
2021-07-01 19:51:59 +03:00
|
|
|
|
async def on_duplication_bot():
|
2022-03-22 05:43:10 +03:00
|
|
|
|
await message.answer(dedent(_("""
|
2021-07-01 19:51:59 +03:00
|
|
|
|
Такой бот уже есть в базе данных
|
2022-03-22 05:43:10 +03:00
|
|
|
|
""")))
|
2021-07-01 19:51:59 +03:00
|
|
|
|
|
2021-06-11 23:46:37 +03:00
|
|
|
|
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()
|
|
|
|
|
|
2022-06-24 23:33:01 +03:00
|
|
|
|
if token == BotSettings.token():
|
|
|
|
|
return await on_duplication_bot()
|
|
|
|
|
|
2022-03-22 05:43:10 +03:00
|
|
|
|
user, created = await User.get_or_create(telegram_id=message.from_user.id)
|
2021-09-26 20:37:51 +03:00
|
|
|
|
bot = Bot(token=Bot.encrypted_token(token), owner=user, name=test_bot_info.username,
|
|
|
|
|
super_chat_id=message.from_user.id)
|
2021-07-01 19:51:59 +03:00
|
|
|
|
try:
|
|
|
|
|
await bot.save()
|
|
|
|
|
except IntegrityError:
|
|
|
|
|
return await on_duplication_bot()
|
2021-06-11 23:46:37 +03:00
|
|
|
|
|
2021-09-10 01:37:02 +03:00
|
|
|
|
if not await register_token(bot):
|
2021-09-10 01:30:17 +03:00
|
|
|
|
await bot.delete()
|
|
|
|
|
return await on_unknown_error()
|
|
|
|
|
|
2022-03-22 05:43:10 +03:00
|
|
|
|
await message.answer(_("Бот добавлен! Список ваших ботов: /mybots"))
|
2021-07-01 19:51:59 +03:00
|
|
|
|
await state.reset_state()
|