This commit is contained in:
dj
2023-04-06 06:51:53 +03:00
parent 35bf80d783
commit fc98213031
4 changed files with 35 additions and 24 deletions
+1 -3
View File
@@ -38,6 +38,4 @@ def get_admins() -> list[int]:
while "," in admins: admins.remove(",") while "," in admins: admins.remove(",")
while "\r" in admins: admins.remove("\r") while "\r" in admins: admins.remove("\r")
admins = list(map(int, admins)) return list(map(int, admins))
return admins
+4 -6
View File
@@ -10,7 +10,7 @@ from cachetools import TTLCache
# Антиспам # Антиспам
class ThrottlingMiddleware(BaseMiddleware): class ThrottlingMiddleware(BaseMiddleware):
def __init__(self, default_rate: Union[int, float] = 0.6) -> None: def __init__(self, default_rate: Union[int, float] = 1) -> None:
self.default_rate = default_rate self.default_rate = default_rate
self.users = TTLCache(maxsize=10_000, ttl=600) self.users = TTLCache(maxsize=10_000, ttl=600)
@@ -39,20 +39,18 @@ class ThrottlingMiddleware(BaseMiddleware):
if self.users[this_user.id]['count_throttled'] == 0: if self.users[this_user.id]['count_throttled'] == 0:
self.users[this_user.id]['count_throttled'] = 1 self.users[this_user.id]['count_throttled'] = 1
self.users[this_user.id]['now_rate'] *= 2 self.users[this_user.id]['now_rate'] = self.default_rate + 2
return await handler(event, data) return await handler(event, data)
elif self.users[this_user.id]['count_throttled'] == 1: elif self.users[this_user.id]['count_throttled'] == 1:
self.users[this_user.id]['count_throttled'] = 2 self.users[this_user.id]['count_throttled'] = 2
self.users[this_user.id]['now_rate'] *= 2 self.users[this_user.id]['now_rate'] = self.default_rate + 3
await event.reply("<b>❗ Пожалуйста, не спамьте.\n" await event.reply("<b>❗ Пожалуйста, не спамьте.\n"
"❗ Please, do not spam.</b>") "❗ Please, do not spam.</b>")
elif self.users[this_user.id]['count_throttled'] == 2: elif self.users[this_user.id]['count_throttled'] == 2:
self.users[this_user.id]['count_throttled'] = 3 self.users[this_user.id]['count_throttled'] = 3
self.users[this_user.id]['now_rate'] = 3 self.users[this_user.id]['now_rate'] = self.default_rate + 5
await event.reply("<b>❗ Бот не будет отвечать до прекращения спама.\n" await event.reply("<b>❗ Бот не будет отвечать до прекращения спама.\n"
"❗ The bot will not respond until the spam stops.</b>") "❗ The bot will not respond until the spam stops.</b>")
else:
pass
+29 -14
View File
@@ -6,7 +6,7 @@ from typing import Union
import pytz import pytz
from aiogram import Bot, types from aiogram import Bot, types
from aiogram.types import InlineKeyboardButton, KeyboardButton from aiogram.types import InlineKeyboardButton, KeyboardButton, WebAppInfo
from tgbot.data.config import get_admins, BOT_TIMEZONE from tgbot.data.config import get_admins, BOT_TIMEZONE
@@ -18,13 +18,15 @@ def rkb(text: str) -> KeyboardButton:
# Генерация инлайн кнопки # Генерация инлайн кнопки
def ikb(text: str, data: str = None, url: str = None, switch: str = None) -> InlineKeyboardButton: def ikb(text: str, data: str = None, url: str = None, switch: str = None, web: str = None) -> InlineKeyboardButton:
if data is not None: if data is not None:
return InlineKeyboardButton(text=text, callback_data=data) return InlineKeyboardButton(text=text, callback_data=data)
elif url is not None: elif url is not None:
return InlineKeyboardButton(text=text, url=url) return InlineKeyboardButton(text=text, url=url)
else: elif switch is not None:
return InlineKeyboardButton(text=text, switch_inline_query=switch) return InlineKeyboardButton(text=text, switch_inline_query=switch)
elif web is not None:
return InlineKeyboardButton(text=text, web_app=WebAppInfo(url=web))
# Отправка сообщения всем админам # Отправка сообщения всем админам
@@ -115,28 +117,28 @@ def clear_list(get_list: list) -> list:
# Разбив списка на несколько частей # Разбив списка на несколько частей
def split_messages(get_list: list, count: int) -> list[list]: def split_list(get_list: list, count: int) -> list[list]:
return [get_list[i:i + count] for i in range(0, len(get_list), count)] return [get_list[i:i + count] for i in range(0, len(get_list), count)]
# Получение даты # Получение даты
def get_date(full: bool = True) -> str: def get_date(full: bool = True) -> str:
if full: # Полная дата с временем if full: # Полная дата с временем
return datetime.now(pytz.timezone(BOT_TIMEZONE)).strftime("%d.%m.%Y %H:%M:%S") return datetime.now(pytz.timezone(BOT_TIMEZONE)).strftime("%d.%m.%Y %H:%M:%S")
else: # Только дата без времени else: # Только дата без времени
return datetime.now(pytz.timezone(BOT_TIMEZONE)).strftime("%d.%m.%Y") return datetime.now(pytz.timezone(BOT_TIMEZONE)).strftime("%d.%m.%Y")
# Получение unix времени # Получение unix времени
def get_unix(full: bool = False) -> int: def get_unix(full: bool = False) -> int:
if full: # Время в наносекундах if full: # Время в наносекундах
return time.time_ns() return time.time_ns()
else: # Время в секундах else: # Время в секундах
return int(time.time()) return int(time.time())
# Конвертация unix в дату и наоборот, дату в unix # Конвертация unix в дату и наоборот, дату в unix
def convert_date(from_time): def convert_date(from_time) -> Union[str, int]:
if str(from_time).isdigit(): if str(from_time).isdigit():
to_time = datetime.fromtimestamp(from_time, pytz.timezone(BOT_TIMEZONE)).strftime("%d.%m.%Y %H:%M:%S") to_time = datetime.fromtimestamp(from_time, pytz.timezone(BOT_TIMEZONE)).strftime("%d.%m.%Y %H:%M:%S")
else: else:
@@ -148,8 +150,8 @@ def convert_date(from_time):
return to_time return to_time
# Генерация пароля # Генерация пароля | default, number, letter, onechar
def gen_password(len_password: int = 16, type_password: str = "default") -> str: # default, number, letter, onechar def gen_password(len_password: int = 16, type_password: str = "default") -> str:
if type_password == "default": if type_password == "default":
char_password = list("1234567890abcdefghigklmnopqrstuvyxwzABCDEFGHIGKLMNOPQRSTUVYXWZ") char_password = list("1234567890abcdefghigklmnopqrstuvyxwzABCDEFGHIGKLMNOPQRSTUVYXWZ")
elif type_password == "letter": elif type_password == "letter":
@@ -196,6 +198,18 @@ def convert_times(get_time, get_type="day") -> str:
return f"{get_time} {get_list[count]}" return f"{get_time} {get_list[count]}"
# Проверка на булевый тип
def is_bool(value: Union[bool, str, int]) -> bool:
value = str(value).lower()
if value in ('y', 'yes', 't', 'true', 'on', '1'):
return True
elif value in ('n', 'no', 'f', 'false', 'off', '0'):
return False
else:
raise ValueError(f"invalid truth value {value}")
######################################## ЧИСЛА ######################################## ######################################## ЧИСЛА ########################################
# Преобразование длинных вещественных чисел в читаемый вид # Преобразование длинных вещественных чисел в читаемый вид
def snum(amount, remains=0) -> str: def snum(amount, remains=0) -> str:
@@ -258,15 +272,15 @@ def to_int(get_number) -> int:
# Проверка числа на вещественное # Проверка числа на вещественное
def is_number(get_number) -> bool: def is_number(get_number) -> bool:
if str(get_number).isdigit(): if str(get_number).isdigit():
return False return True
else: else:
if "," in str(get_number): get_number = str(get_number).replace(",", ".") if "," in str(get_number): get_number = str(get_number).replace(",", ".")
try: try:
float(get_number) float(get_number)
return False
except ValueError:
return True return True
except ValueError:
return False
# Форматирование числа в читаемый вид # Форматирование числа в читаемый вид
@@ -296,6 +310,7 @@ def format_rate(amount: Union[float, int], around: int = 2) -> str:
out_amount.append(char) out_amount.append(char)
response = "".join(out_amount).strip() + "." + save_remains response = "".join(out_amount).strip() + "." + save_remains
if response.endswith("."): if response.endswith("."):
response = response[:-1] response = response[:-1]
+1 -1
View File
@@ -7,7 +7,7 @@ from tgbot.data.config import get_admins
# Проверка на админа # Проверка на админа
class IsAdmin(BaseFilter): class IsAdmin(BaseFilter):
async def __call__(self, message: Message): async def __call__(self, message: Message) -> bool:
if message.from_user.id in get_admins(): if message.from_user.id in get_admins():
return True return True
else: else: