Изменения шаблона:
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:
parent
2f0f400cd5
commit
1bbe12e9c1
|
@ -1,3 +1,5 @@
|
||||||
ADMIN_ID=12345678
|
# ЭТО ПРИМЕР ФАЙЛА .env !! ВАМ НАДО ЭТОТ ФАЙЛ ПЕРЕИМЕНОВАТЬ И ВСТАВИТЬ ТУДА ЗНАЧЕНИЯ
|
||||||
|
|
||||||
|
ADMINS=12345678,12345677,12345676
|
||||||
BOT_TOKEN=123452345243:Asdfasdfasf
|
BOT_TOKEN=123452345243:Asdfasdfasf
|
||||||
ip=localhost
|
ip=localhost
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -128,3 +128,4 @@ dmypy.json
|
||||||
# Pyre type checker
|
# Pyre type checker
|
||||||
.pyre/
|
.pyre/
|
||||||
.idea/*
|
.idea/*
|
||||||
|
.env
|
18
app.py
18
app.py
|
@ -1,15 +1,19 @@
|
||||||
async def on_startup(dp):
|
from aiogram import executor
|
||||||
import filters
|
|
||||||
import middlewares
|
|
||||||
filters.setup(dp)
|
|
||||||
middlewares.setup(dp)
|
|
||||||
|
|
||||||
from utils.notify_admins import on_startup_notify
|
from utils.notify_admins import on_startup_notify
|
||||||
await on_startup_notify(dp)
|
|
||||||
|
|
||||||
|
async def on_startup(dispatcher):
|
||||||
|
import filters
|
||||||
|
import middlewares
|
||||||
|
|
||||||
|
filters.setup(dispatcher)
|
||||||
|
middlewares.setup(dispatcher)
|
||||||
|
|
||||||
|
await on_startup_notify(dispatcher)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
from aiogram import executor
|
|
||||||
from handlers import dp
|
from handlers import dp
|
||||||
|
|
||||||
executor.start_polling(dp, on_startup=on_startup)
|
executor.start_polling(dp, on_startup=on_startup)
|
||||||
|
|
|
@ -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 = env.str("BOT_TOKEN") # Забираем значение типа str
|
||||||
|
ADMINS = env.list("ADMINS") # Тут у нас будет список из админов
|
||||||
BOT_TOKEN = os.getenv("BOT_TOKEN")
|
IP = env.str("ip") # Тоже str, но для айпи адреса хоста
|
||||||
|
|
||||||
admins = [
|
|
||||||
os.getenv("ADMIN_ID"),
|
|
||||||
]
|
|
||||||
|
|
||||||
ip = os.getenv("ip")
|
|
||||||
|
|
|
@ -1,7 +1,21 @@
|
||||||
from aiogram import types
|
from aiogram import types
|
||||||
|
from aiogram.dispatcher import FSMContext
|
||||||
|
|
||||||
from loader import dp
|
from loader import dp
|
||||||
|
|
||||||
|
|
||||||
@dp.message_handler()
|
# Эхо хендлер, куда летят текстовые сообщения без указанного состояния
|
||||||
|
@dp.message_handler(state=None)
|
||||||
async def bot_echo(message: types.Message):
|
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>")
|
||||||
|
|
|
@ -2,10 +2,8 @@ from aiogram import types
|
||||||
from aiogram.dispatcher.filters.builtin import CommandHelp
|
from aiogram.dispatcher.filters.builtin import CommandHelp
|
||||||
|
|
||||||
from loader import dp
|
from loader import dp
|
||||||
from utils.misc import rate_limit
|
|
||||||
|
|
||||||
|
|
||||||
@rate_limit(5, 'help')
|
|
||||||
@dp.message_handler(CommandHelp())
|
@dp.message_handler(CommandHelp())
|
||||||
async def bot_help(message: types.Message):
|
async def bot_help(message: types.Message):
|
||||||
text = [
|
text = [
|
||||||
|
|
|
@ -33,16 +33,5 @@ class ThrottlingMiddleware(BaseMiddleware):
|
||||||
raise CancelHandler()
|
raise CancelHandler()
|
||||||
|
|
||||||
async def message_throttled(self, message: types.Message, throttled: Throttled):
|
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:
|
if throttled.exceeded_count <= 2:
|
||||||
await message.reply('Too many requests! ')
|
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.')
|
|
||||||
|
|
|
@ -1,4 +1,2 @@
|
||||||
aiogram==2.11.2
|
aiogram>=2.11.2,<3.0
|
||||||
aiohttp>=3.6.2
|
environs~=8.0.0
|
||||||
aioredis==1.3.1
|
|
||||||
python-dotenv
|
|
|
@ -2,5 +2,5 @@ import logging
|
||||||
|
|
||||||
logging.basicConfig(format=u'%(filename)s [LINE:%(lineno)d] #%(levelname)-8s [%(asctime)s] %(message)s',
|
logging.basicConfig(format=u'%(filename)s [LINE:%(lineno)d] #%(levelname)-8s [%(asctime)s] %(message)s',
|
||||||
level=logging.INFO,
|
level=logging.INFO,
|
||||||
# level=logging.DEBUG,
|
# level=logging.DEBUG, # Можно заменить на другой уровень логгирования.
|
||||||
)
|
)
|
||||||
|
|
|
@ -2,11 +2,11 @@ import logging
|
||||||
|
|
||||||
from aiogram import Dispatcher
|
from aiogram import Dispatcher
|
||||||
|
|
||||||
from data.config import admins
|
from data.config import ADMINS
|
||||||
|
|
||||||
|
|
||||||
async def on_startup_notify(dp: Dispatcher):
|
async def on_startup_notify(dp: Dispatcher):
|
||||||
for admin in admins:
|
for admin in ADMINS:
|
||||||
try:
|
try:
|
||||||
await dp.bot.send_message(admin, "Бот Запущен")
|
await dp.bot.send_message(admin, "Бот Запущен")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user