This commit is contained in:
djimbo
2022-08-13 09:18:51 +03:00
commit 562d7f1acf
34 changed files with 1236 additions and 0 deletions
+12
View File
@@ -0,0 +1,12 @@
# - *- coding: utf- 8 - *-
from aiogram import Dispatcher
from tgbot.middlewares.exists_user import ExistsUserMiddleware
from tgbot.middlewares.throttling import ThrottlingMiddleware
def register_all_middlwares(dp: Dispatcher):
dp.callback_query.outer_middleware(ExistsUserMiddleware())
dp.message.outer_middleware(ExistsUserMiddleware())
dp.message.middleware(ThrottlingMiddleware())
+48
View File
@@ -0,0 +1,48 @@
# - *- coding: utf- 8 - *-
from aiogram import BaseMiddleware
from tgbot.services.api_sqlite import get_userx, add_userx, update_userx
from tgbot.utils.const_functions import clear_html
# Проверка юзера в БД и его добавление
class ExistsUserMiddleware(BaseMiddleware):
async def __call__(self, handler, event, data):
this_user = data.get("event_from_user")
if not this_user.is_bot:
get_user = get_userx(user_id=this_user.id)
user_id = this_user.id
user_login = this_user.username
user_name = clear_html(this_user.first_name)
user_fullname = clear_html(this_user.first_name)
user_surname = clear_html(this_user.last_name)
user_language = this_user.language_code
if user_language != "ru": user_language = "en"
if user_login is None: user_login = ""
if user_name is None: user_name = ""
if user_fullname is None: user_fullname = ""
if user_surname is None: user_surname = ""
if len(user_surname) >= 1: user_fullname += f" {user_surname}"
if get_user is None:
add_userx(user_id, user_login.lower(), user_name, user_surname, user_fullname)
else:
if user_name != get_user['user_name']:
update_userx(get_user['user_id'], user_name=user_name)
if user_surname != get_user['user_surname']:
update_userx(get_user['user_id'], user_surname=user_surname)
if user_fullname != get_user['user_fullname']:
update_userx(get_user['user_id'], user_fullname=user_fullname)
if user_login.lower() != get_user['user_login']:
update_userx(get_user['user_id'], user_login=user_login.lower())
data['my_user'] = get_userx(user_id=user_id)
return await handler(event, data)
+59
View File
@@ -0,0 +1,59 @@
# - *- coding: utf- 8 - *-
import time
from typing import Any, Awaitable, Callable, Dict
from aiogram import BaseMiddleware
from aiogram.dispatcher.event.handler import HandlerObject
from aiogram.types import Message
from tgbot.services.api_sqlite import get_userx
# Антиспам
class ThrottlingMiddleware(BaseMiddleware):
def __init__(self, default_rate: int = 0.6) -> None:
self.default_rate = default_rate
self.now_rate = default_rate
self.last_throttled = int(time.time())
self.count_throttled = 0
async def __call__(self, handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]], event: Message, data):
real_handler: HandlerObject = data['handler']
skip_pass = True
this_user = data.get("event_from_user")
if not this_user.is_bot:
data['get_user'] = get_userx(user_id=this_user.id)
if real_handler.flags.get("skip_pass") is not None:
skip_pass = real_handler.flags.get("skip_pass")
if skip_pass:
if int(time.time()) - self.last_throttled >= self.now_rate:
self.last_throttled = int(time.time())
self.now_rate = self.default_rate
self.count_throttled = 0
return await handler(event, data)
else:
if self.count_throttled == 0:
self.count_throttled += 1
self.now_rate = self.default_rate * 2
return await handler(event, data)
elif self.count_throttled == 1:
self.count_throttled += 1
self.now_rate = self.default_rate * 2
await event.reply("<b>❗ Пожалуйста, не спамьте.</b>")
else:
self.now_rate = 3
if self.count_throttled == 2:
self.count_throttled = 3
await event.reply("<b>❗ Бот не будет отвечать до прекращения спама.</b>")
self.last_throttled = int(time.time())
else:
return await handler(event, data)