Advertisement
Guest User

Untitled

a guest
Feb 16th, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.08 KB | None | 0 0
  1. import asyncio
  2. import datetime
  3. import logging
  4. import os
  5. import re
  6. import time
  7. from os.path import dirname, join
  8.  
  9. import aiogram
  10. from aiogram import Bot, Dispatcher, executor, filters, types
  11. from aiogram.contrib.fsm_storage.memory import MemoryStorage
  12. from aiogram.contrib.middlewares.logging import LoggingMiddleware
  13. from aiogram.dispatcher.filters import BoundFilter
  14. from aiogram.dispatcher.filters.state import State, StatesGroup
  15. from aiogram.utils.exceptions import Throttled
  16. from dotenv import load_dotenv
  17.  
  18. import api
  19. import buttons
  20. import utils
  21.  
  22. logging.basicConfig(level=logging.INFO)
  23. loop = asyncio.get_event_loop()
  24.  
  25. dotenv_path = join(dirname(__file__), '.env')
  26. load_dotenv(dotenv_path)
  27.  
  28. storage = MemoryStorage()
  29.  
  30. bot = Bot(token=os.getenv('TOKEN'), parse_mode=types.ParseMode.HTML)
  31. dp = Dispatcher(bot, storage=storage)
  32. dp.middleware.setup(LoggingMiddleware())
  33.  
  34. class MyFilter(BoundFilter):
  35.     key = 'is_admin'
  36.  
  37.     def __init__(self, is_admin):
  38.         self.is_admin = is_admin
  39.  
  40.     async def check(self, c: types.CallbackQuery):
  41.         print(c.data)
  42.         return c.data.startswith('bot')
  43.  
  44. dp.filters_factory.bind(MyFilter)
  45.  
  46. class User(StatesGroup):
  47.     main = State()  # Will be represented in storage as 'Form:name'
  48.     token = State()  # Will be represented in storage as 'Form:age'
  49.  
  50. @dp.callback_query_handler(state='*', is_admin=True)
  51. async def get_stats(c):
  52.     print(1)
  53.     parts = buttons.bot_btn.parse(c.data)
  54.     print(parts)
  55.     tmp_token = parts['token']
  56.     try:
  57.         tmp_bot = Bot(token=tmp_token)
  58.         webhook_info = await tmp_bot.get_webhook_info()
  59.         bot_info = await tmp_bot.get_me()
  60.         db_info = await api.Users.get_bot_info(c.from_user.id, tmp_token)
  61.         if db_info:
  62.             await bot.edit_message_text(
  63.                 chat_id=c.message.chat.id,
  64.                 message_id=c.message.message_id,
  65.                 text=f'Информация о боте @{bot_info.username} (#ID{bot_info.id})\nСообщений в очереди: <b>{webhook_info.pending_update_count}</b>\nУстановленный предел: <b>{db_info["requests_limit"]}</b>'
  66.             )
  67.         else:
  68.             await api.Service.del_bot(tmp_token)
  69.             await bot.edit_message_reply_markup(
  70.                 chat_id=c.message.chat.id,
  71.                 message_id=c.message.message_id,
  72.                 reply_markup=buttons.Menu.bots_list(c.from_user.id)
  73.             )
  74.     except aiogram.exceptions.Unauthorized:
  75.         await api.Service.del_bot(tmp_token)
  76.         await bot.edit_message_reply_markup(
  77.             chat_id=c.message.chat.id,
  78.             message_id=c.message.message_id,
  79.             reply_markup=buttons.Menu.bots_list(c.from_user.id)
  80.         )
  81.     except Exception as e:
  82.         logging.error(e)
  83.     finally:
  84.         await tmp_bot.close()
  85.  
  86.  
  87. @dp.message_handler(lambda msg: msg.text.lower() == '❌в начало❌', state=User.token)
  88. @dp.message_handler(commands=['cancel'], state=User.token)
  89. @dp.message_handler(commands=['start'])
  90. async def start(msg):
  91.     try:
  92.         await dp.throttle('{}:{}'.format(msg.chat.id, msg.text), rate=1)
  93.     except Throttled:
  94.         pass
  95.     else:
  96.         if not await api.Users.is_new(msg.from_user.id):
  97.             try:
  98.                 await api.Users.register(msg.from_user.id, msg.from_user.first_name)
  99.             except Exception as e:
  100.                 print(e)
  101.         await bot.send_message(
  102.             msg.chat.id,
  103.             'Главное меню',
  104.             reply_markup=await buttons.Menu.main()
  105.         )
  106.         await User.main.set()
  107.  
  108.  
  109. @dp.message_handler(lambda msg: msg.text.lower() == '❓помощь❓', state=User.main)
  110. async def help(msg):
  111.     try:
  112.         await dp.throttle('{}:{}'.format(msg.chat.id, msg.text), rate=1)
  113.     except Throttled:
  114.         pass
  115.     else:
  116.         await bot.send_message(
  117.             msg.chat.id,
  118.             'Используйте кнопку <b>📌Добавить нового бота📌</b>, чтобы добавить бота в мониторинг. Сразу после этого начнется ежеминутная проверка состояния вашего бота. \nВ случае превышения установленного лимита запросов в очереди (по умолчанию 100), ваш бот напишет вам в личные сообщения об этом.'
  119.         )
  120.  
  121.  
  122. @dp.message_handler(lambda msg: msg.text.lower() == '📌добавить нового бота📌', state=User.main)
  123. async def bot_cmd_new(msg):
  124.     try:
  125.         await dp.throttle('{}:{}'.format(msg.chat.id, msg.text), rate=1)
  126.     except Throttled:
  127.         pass
  128.     else:
  129.         await bot.send_message(
  130.             msg.chat.id,
  131.             'Введите токен бота или перешлите сообщение от @BotFather с токеном.',
  132.             reply_markup=await buttons.Menu.cancel()
  133.         )
  134.         await User.token.set()
  135.  
  136.  
  137. @dp.message_handler(lambda msg: msg.text.lower() == '🤖мои боты🤖', state=User.main)
  138. async def my_bots(msg):
  139.     try:
  140.         await dp.throttle('{}:{}'.format(msg.chat.id, msg.text), rate=1)
  141.     except Throttled:
  142.         pass
  143.     else:
  144.         if await api.Users.count_bots(msg.from_user.id) != 0:
  145.             await bot.send_message(
  146.                 msg.chat.id,
  147.                 'Список ваших ботов',
  148.                 reply_markup=await buttons.Menu.bots_list(msg.from_user.id)
  149.             )
  150.         else:
  151.             await bot.send_message(
  152.                 msg.chat.id,
  153.                 'Вы не добавили ни одного бота. \nИспользуйте кнопку <i>📌Добавить нового бота📌</i>'
  154.             )
  155.  
  156.  
  157. @dp.message_handler(state=User.token)
  158. async def check_token(msg):
  159.     try:
  160.         await dp.throttle('{}:{}'.format(msg.chat.id, msg.text), rate=1)
  161.     except Throttled:
  162.         pass
  163.     else:
  164.         token_raw = re.search('(\d{0,9}\:[a-zA-Z0-9_\-]{35})', msg.text)
  165.         if token_raw:
  166.             token = token_raw.group(0)
  167.             checking_result = await utils.get_info(token=token, method='getMe')
  168.         else:
  169.             checking_result = False
  170.         if checking_result:
  171.             await bot.send_message(
  172.                 msg.chat.id,
  173.                 f'Бот @{checking_result["username"]} прошел проверку и был добавлен в ваш список',
  174.                 reply_markup=await buttons.Menu.main()
  175.             )
  176.             await api.Users.new_bot(msg.from_user.id, token, checking_result)
  177.             await User.main.set()
  178.         else:
  179.             await bot.send_message(
  180.                 msg.chat.id,
  181.                 f'Токен не прошел проверку или не был найден. Введите правильный токен или перешлите сообщение от @BotFather с токеном.',
  182.                 reply_markup=await buttons.Menu.cancel()
  183.             )
  184.  
  185.  
  186.  
  187.  
  188. if __name__ == '__main__':
  189.     executor.start_polling(dp, loop=loop, skip_updates=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement