Изменения шаблона:

1. .env.dist - изменено название переменной, теперь айди админов приписываются сюда через запятую
2. Добавлен .env в .gitignore
3. Вынес пару импортов из функций, переименовал диспатчер в on_startup, чтобы не повторять значение глобальной переменной
4. В config.py теперь используем библиотеку environs. С помощью нее удобнее парсить переменные определенного типа, т.к. имеются методы str, list, dict, int. Переменные теперь upper-case, что как бы указывает, что они константы.
5. В echo.py изменил эхо хендлер, теперь тут 2 хендлера. Один, который принимает текстовые сообщения, если у пользователя не установлено состояние. Второй хендлер, больше для дебаггинга, принимает все типы сообщений (TEXT, PHOTO, DOCUMENT, ...) и в любом состоянии. Так можно отследить необработанные сообщения.
6. Из help.py убрал троттлинг
7. Обновил requirements.txt чтобы отображать только необходимые библиотеки
8. Убрал (возможно) нерабочий код из throttling.py
This commit is contained in:
latand 2021-01-07 13:58:34 +02:00
parent 2f0f400cd5
commit 1bbe12e9c1
10 changed files with 42 additions and 40 deletions

View File

@ -1,3 +1,5 @@
ADMIN_ID=12345678
# ЭТО ПРИМЕР ФАЙЛА .env !! ВАМ НАДО ЭТОТ ФАЙЛ ПЕРЕИМЕНОВАТЬ И ВСТАВИТЬ ТУДА ЗНАЧЕНИЯ
ADMINS=12345678,12345677,12345676
BOT_TOKEN=123452345243:Asdfasdfasf
ip=localhost

1
.gitignore vendored
View File

@ -128,3 +128,4 @@ dmypy.json
# Pyre type checker
.pyre/
.idea/*
.env

16
app.py
View File

@ -1,15 +1,19 @@
async def on_startup(dp):
from aiogram import executor
from utils.notify_admins import on_startup_notify
async def on_startup(dispatcher):
import filters
import middlewares
filters.setup(dp)
middlewares.setup(dp)
from utils.notify_admins import on_startup_notify
await on_startup_notify(dp)
filters.setup(dispatcher)
middlewares.setup(dispatcher)
await on_startup_notify(dispatcher)
if __name__ == '__main__':
from aiogram import executor
from handlers import dp
executor.start_polling(dp, on_startup=on_startup)

View File

@ -1,13 +1,9 @@
import os
from environs import Env
from dotenv import load_dotenv
# Теперь используем вместо библиотеки python-dotenv библиотеку environs
env = Env()
env.read_env()
load_dotenv()
BOT_TOKEN = os.getenv("BOT_TOKEN")
admins = [
os.getenv("ADMIN_ID"),
]
ip = os.getenv("ip")
BOT_TOKEN = env.str("BOT_TOKEN") # Забираем значение типа str
ADMINS = env.list("ADMINS") # Тут у нас будет список из админов
IP = env.str("ip") # Тоже str, но для айпи адреса хоста

View File

@ -1,7 +1,21 @@
from aiogram import types
from aiogram.dispatcher import FSMContext
from loader import dp
@dp.message_handler()
# Эхо хендлер, куда летят текстовые сообщения без указанного состояния
@dp.message_handler(state=None)
async def bot_echo(message: types.Message):
await message.answer(message.text)
await message.answer(f"Эхо без состояния."
f"Сообщение:\n"
f"{message.text}")
# Эхо хендлер, куда летят ВСЕ сообщения с указанным состоянием
@dp.message_handler(state="*", content_types=types.ContentTypes.ANY)
async def bot_echo_all(message: types.Message, state: FSMContext):
s = await state.get_state()
await message.answer(f"Эхо в состоянии <code>{s}</code>.\n"
f"\nСодержание сообщения:\n"
f"<code>{message}</code>")

View File

@ -2,10 +2,8 @@ from aiogram import types
from aiogram.dispatcher.filters.builtin import CommandHelp
from loader import dp
from utils.misc import rate_limit
@rate_limit(5, 'help')
@dp.message_handler(CommandHelp())
async def bot_help(message: types.Message):
text = [

View File

@ -33,16 +33,5 @@ class ThrottlingMiddleware(BaseMiddleware):
raise CancelHandler()
async def message_throttled(self, message: types.Message, throttled: Throttled):
handler = current_handler.get()
dispatcher = Dispatcher.get_current()
if handler:
key = getattr(handler, 'throttling_key', f"{self.prefix}_{handler.__name__}")
else:
key = f"{self.prefix}_message"
delta = throttled.rate - throttled.delta
if throttled.exceeded_count <= 2:
await message.reply('Too many requests! ')
await asyncio.sleep(delta)
thr = await dispatcher.check_key(key)
if thr.exceeded_count == throttled.exceeded_count:
await message.reply('Unlocked.')

View File

@ -1,4 +1,2 @@
aiogram==2.11.2
aiohttp>=3.6.2
aioredis==1.3.1
python-dotenv
aiogram>=2.11.2,<3.0
environs~=8.0.0

View File

@ -2,5 +2,5 @@ import logging
logging.basicConfig(format=u'%(filename)s [LINE:%(lineno)d] #%(levelname)-8s [%(asctime)s] %(message)s',
level=logging.INFO,
# level=logging.DEBUG,
# level=logging.DEBUG, # Можно заменить на другой уровень логгирования.
)

View File

@ -2,11 +2,11 @@ import logging
from aiogram import Dispatcher
from data.config import admins
from data.config import ADMINS
async def on_startup_notify(dp: Dispatcher):
for admin in admins:
for admin in ADMINS:
try:
await dp.bot.send_message(admin, "Бот Запущен")