Template
mirror of
https://github.com/djimboy/djimbo_template_aio3.git
synced 2026-08-25 06:27:43 +00:00
Update
This commit is contained in:
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,235 @@
|
||||
# - *- coding: utf- 8 - *-
|
||||
import random
|
||||
import time
|
||||
from datetime import datetime
|
||||
|
||||
from aiogram import Bot, types
|
||||
from aiogram.types import InlineKeyboardButton, KeyboardButton
|
||||
|
||||
######################################## AIOGRAM ########################################
|
||||
# Генерация реплай кнопки
|
||||
from tgbot.config import get_admins
|
||||
|
||||
|
||||
def rkb(text):
|
||||
return KeyboardButton(text=text)
|
||||
|
||||
|
||||
# Генерация инлайн кнопки
|
||||
def ikb(text, data=None, url=None, switch=None):
|
||||
if data is not None:
|
||||
return InlineKeyboardButton(text=text, callback_data=data)
|
||||
elif url is not None:
|
||||
return InlineKeyboardButton(text=text, url=url)
|
||||
else:
|
||||
return InlineKeyboardButton(text=text, switch_inline_query=switch)
|
||||
|
||||
|
||||
# Отправка сообщения всем админам
|
||||
async def send_admins(bot: Bot, message, markup=None, not_me=0):
|
||||
for admin in get_admins():
|
||||
try:
|
||||
if str(admin) != str(not_me):
|
||||
await bot.send_message(admin, message, reply_markup=markup, disable_web_page_preview=True)
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
# Умная отправка сообщений
|
||||
async def smart_send(bot: Bot, message: types.Message, user_id, text_add=None, reply=None):
|
||||
if message.text is not None:
|
||||
get_text = message.text
|
||||
elif message.caption is not None:
|
||||
get_text = message.caption
|
||||
else:
|
||||
get_text = ""
|
||||
|
||||
if text_add is not None:
|
||||
get_text = text_add.format(get_text)
|
||||
|
||||
if message.photo is not None:
|
||||
await bot.send_photo(user_id, message.photo[-1].file_id, caption=get_text, reply_markup=reply)
|
||||
elif message.video is not None:
|
||||
await bot.send_video(user_id, message.video.file_id, caption=get_text, reply_markup=reply)
|
||||
elif message.document is not None:
|
||||
await bot.send_document(user_id, message.document.file_id, caption=get_text, reply_markup=reply)
|
||||
elif message.audio is not None:
|
||||
await bot.send_audio(user_id, message.audio.file_id, caption=get_text, reply_markup=reply)
|
||||
elif message.voice is not None:
|
||||
await bot.send_voice(user_id, message.voice.file_id, caption=get_text, reply_markup=reply)
|
||||
elif message.animation is not None:
|
||||
await bot.send_animation(user_id, message.animation.file_id, reply_markup=reply)
|
||||
elif message.sticker is not None:
|
||||
await bot.send_sticker(user_id, message.sticker.file_id, reply_markup=reply)
|
||||
elif message.dice is not None:
|
||||
await bot.send_dice(user_id, message.dice.emoji, reply_markup=reply)
|
||||
elif message.location is not None:
|
||||
await bot.send_location(user_id, latitude=message.location.latitude, longitude=message.location.longitude,
|
||||
reply_markup=reply)
|
||||
else:
|
||||
await bot.send_message(user_id, get_text)
|
||||
|
||||
|
||||
######################################## ПРОЧЕЕ ########################################
|
||||
# Очистка HTML тэгов
|
||||
def clear_html(get_text: str):
|
||||
if get_text is not None:
|
||||
if "<" in get_text: get_text = get_text.replace("<", "*")
|
||||
if ">" in get_text: get_text = get_text.replace(">", "*")
|
||||
|
||||
return get_text
|
||||
|
||||
|
||||
# Очистка пробелов в списке
|
||||
def clear_list(get_list: list):
|
||||
while "" in get_list: get_list.remove("")
|
||||
while " " in get_list: get_list.remove(" ")
|
||||
while "," in get_list: get_list.remove(",")
|
||||
while "\r" in get_list: get_list.remove("\r")
|
||||
|
||||
return get_list
|
||||
|
||||
|
||||
# Разбив списка на несколько частей
|
||||
def split_messages(get_list: list, count: int):
|
||||
return [get_list[i:i + count] for i in range(0, len(get_list), count)]
|
||||
|
||||
|
||||
# Получение даты
|
||||
def get_date():
|
||||
this_date = datetime.today().replace(microsecond=0)
|
||||
this_date = this_date.strftime("%d.%m.%Y %H:%M:%S")
|
||||
|
||||
return this_date
|
||||
|
||||
|
||||
# Получение юникс даты
|
||||
def get_unix():
|
||||
return int(time.time())
|
||||
|
||||
|
||||
# Генерация пароля
|
||||
def generate_password(len_password: int):
|
||||
passwd = list("1234567890abcdefghigklmnopqrstuvyxwzABCDEFGHIGKLMNOPQRSTUVYXWZ")
|
||||
random.shuffle(passwd)
|
||||
random_chars = "".join([random.choice(passwd) for x in range(len_password)])
|
||||
|
||||
return random_chars
|
||||
|
||||
|
||||
# Корректный вывод времени
|
||||
def convert_times(get_time, get_type="day"):
|
||||
get_time = int(get_time)
|
||||
|
||||
if get_type == "second":
|
||||
get_list = ["секунда", "секунды", "секунд"]
|
||||
elif get_type == "minute":
|
||||
get_list = ["минута", "минуты", "минут"]
|
||||
elif get_type == "hour":
|
||||
get_list = ["час", "часа", "часов"]
|
||||
elif get_type == "day":
|
||||
get_list = ["день", "дня", "дней"]
|
||||
elif get_type == "month":
|
||||
get_list = ["месяц", "месяца", "месяцев"]
|
||||
else:
|
||||
get_list = ["год", "года", "лет"]
|
||||
|
||||
if get_time % 10 == 1 and get_time % 100 != 11:
|
||||
count = 0
|
||||
elif 2 <= get_time % 10 <= 4 and (get_time % 100 < 10 or get_time % 100 >= 20):
|
||||
count = 1
|
||||
else:
|
||||
count = 2
|
||||
|
||||
return f"{get_time} {get_list[count]}"
|
||||
|
||||
|
||||
######################################## ЧИСЛА ########################################
|
||||
# Конвертация числа в вещественное
|
||||
def to_float(get_number, remains=2):
|
||||
if "," in str(get_number):
|
||||
get_number = str(get_number).replace(",", ".")
|
||||
|
||||
if "." in get_number:
|
||||
get_last = get_number.split(".")
|
||||
|
||||
if get_last[1].endswith("0"):
|
||||
while True:
|
||||
if get_number.endswith("0"):
|
||||
get_number = get_number[:-1]
|
||||
else:
|
||||
break
|
||||
|
||||
get_number = round(float(get_number), remains)
|
||||
|
||||
if str(float(get_number)).split(".")[1] == "0":
|
||||
get_number = int(get_number)
|
||||
else:
|
||||
get_number = float(get_number)
|
||||
|
||||
return get_number
|
||||
|
||||
|
||||
# Конвертация числа в целочисленное
|
||||
def to_int(get_number):
|
||||
if "," in get_number:
|
||||
get_number = get_number.replace(",", ".")
|
||||
|
||||
get_number = int(round(float(get_number)))
|
||||
|
||||
return get_number
|
||||
|
||||
|
||||
# Проверка числа на вещественное
|
||||
def is_number(get_number):
|
||||
if get_number.isdigit():
|
||||
return False
|
||||
else:
|
||||
if "," in str(get_number): get_number = str(get_number).replace(",", ".")
|
||||
|
||||
try:
|
||||
float(get_number)
|
||||
return False
|
||||
except ValueError:
|
||||
return True
|
||||
|
||||
|
||||
# Преобразование длинных вещественных чисел в читаемый вид
|
||||
def show_floats(amount):
|
||||
return f"{float(amount):.{len(str(amount).split('.')[1])}f}"
|
||||
|
||||
|
||||
# Форматирование чисел в читаемый вид
|
||||
def format_rate(rate, around=False):
|
||||
rate = str(round(float(rate), 2))
|
||||
|
||||
if "," in rate:
|
||||
rate = float(rate.replace(",", "."))
|
||||
|
||||
len_rate = str(int(float(rate)))
|
||||
|
||||
if len(len_rate) == 3:
|
||||
get_rate = str(len_rate)
|
||||
elif len(len_rate) == 4:
|
||||
get_rate = f"{len_rate[0]} {len_rate[1:]}"
|
||||
elif len(len_rate) == 5:
|
||||
get_rate = f"{len_rate[0:2]} {len_rate[2:]}"
|
||||
elif len(len_rate) == 6:
|
||||
get_rate = f"{len_rate[0:3]} {len_rate[3:]}"
|
||||
elif len(len_rate) == 7:
|
||||
get_rate = f"{len_rate[0:1]} {len_rate[1:4]} {len_rate[4:]}"
|
||||
elif len(len_rate) == 8:
|
||||
get_rate = f"{len_rate[0:2]} {len_rate[2:5]} {len_rate[5:]}"
|
||||
elif len(len_rate) == 9:
|
||||
get_rate = f"{len_rate[0:3]} {len_rate[3:6]} {len_rate[6:]}"
|
||||
elif len(len_rate) == 10:
|
||||
get_rate = f"{len_rate[0:1]} {len_rate[1:4]} {len_rate[4:7]} {len_rate[7:]}"
|
||||
else:
|
||||
get_rate = 0
|
||||
|
||||
if not around:
|
||||
if "." in rate:
|
||||
dot_amount = rate.find(".")
|
||||
get_rate += f"{rate[dot_amount:]}"
|
||||
|
||||
return get_rate
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
# - *- coding: utf- 8 - *-
|
||||
from aiogram import Bot
|
||||
from aiogram.types import BotCommand, BotCommandScopeChat, BotCommandScopeDefault
|
||||
|
||||
from tgbot.config import get_admins
|
||||
|
||||
# Команды для юзеров
|
||||
user_commands = [
|
||||
BotCommand(command="start", description="♻ Перезапустить бота"),
|
||||
BotCommand(command="inline", description="🌀 Получить Inline клавиатуру"),
|
||||
]
|
||||
|
||||
# Команды для админов
|
||||
admin_commands = [
|
||||
BotCommand(command="start", description="♻ Перезапустить бота"),
|
||||
BotCommand(command="inline", description="🌀 Получить Inline клавиатуру"),
|
||||
BotCommand(command="log", description="🖨 Получить Логи"),
|
||||
BotCommand(command="db", description="📦 Получить Базу Данных"),
|
||||
]
|
||||
|
||||
|
||||
# Установка команд
|
||||
async def set_commands(bot: Bot):
|
||||
await bot.set_my_commands(user_commands, scope=BotCommandScopeDefault())
|
||||
|
||||
for admin in get_admins():
|
||||
try:
|
||||
await bot.set_my_commands(admin_commands, scope=BotCommandScopeChat(chat_id=admin))
|
||||
except:
|
||||
pass
|
||||
@@ -0,0 +1,14 @@
|
||||
# - *- coding: utf- 8 - *-
|
||||
from aiogram.dispatcher.filters import BaseFilter
|
||||
from aiogram.types import Message
|
||||
|
||||
from tgbot.config import get_admins
|
||||
|
||||
|
||||
# Проверка на админа
|
||||
class IsAdmin(BaseFilter):
|
||||
async def __call__(self, message: Message):
|
||||
if message.from_user.id in get_admins():
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
@@ -0,0 +1,32 @@
|
||||
# - *- coding: utf- 8 - *-
|
||||
import logging as bot_logger
|
||||
|
||||
import colorlog
|
||||
|
||||
from tgbot.config import PATH_LOGS
|
||||
|
||||
# Формат логгирования
|
||||
log_formatter_file = bot_logger.Formatter("%(levelname)s | %(asctime)s | %(filename)s:%(lineno)d | %(message)s")
|
||||
log_formatter_console = colorlog.ColoredFormatter(
|
||||
"%(purple)s%(levelname)s %(blue)s|%(purple)s %(asctime)s %(blue)s|%(purple)s %(filename)s:%(lineno)d %(blue)s|%(purple)s %(message)s%(red)s",
|
||||
datefmt="%d-%m-%Y %H:%M:%S",
|
||||
)
|
||||
|
||||
# Логгирование в файл logs.log
|
||||
file_handler = bot_logger.FileHandler(PATH_LOGS, "w", "utf-8")
|
||||
file_handler.setFormatter(log_formatter_file)
|
||||
file_handler.setLevel(bot_logger.INFO)
|
||||
|
||||
# Логгирование в консоль
|
||||
console_handler = bot_logger.StreamHandler()
|
||||
console_handler.setFormatter(log_formatter_console)
|
||||
console_handler.setLevel(bot_logger.CRITICAL)
|
||||
|
||||
# Подключение настроек логгирования
|
||||
bot_logger.basicConfig(
|
||||
format="%(levelname)s | %(asctime)s | %(filename)s:%(lineno)d | %(message)s",
|
||||
handlers=[
|
||||
file_handler,
|
||||
console_handler
|
||||
]
|
||||
)
|
||||
@@ -0,0 +1,10 @@
|
||||
# - *- coding: utf- 8 - *-
|
||||
from textwrap import dedent
|
||||
|
||||
from aiogram.dispatcher.fsm.context import FSMContext
|
||||
|
||||
from tgbot.services.api_session import RequestsSession
|
||||
|
||||
ded = dedent
|
||||
FSM = FSMContext
|
||||
RS = RequestsSession
|
||||
@@ -0,0 +1,24 @@
|
||||
# - *- coding: utf- 8 - *-
|
||||
from aiogram import Bot
|
||||
from aiogram.types import FSInputFile
|
||||
|
||||
from tgbot.config import get_admins, PATH_DATABASE
|
||||
from tgbot.utils.const_functions import get_date, send_admins
|
||||
|
||||
|
||||
# Выполнение функции после запуска бота (рассылка админам о запуске бота)
|
||||
async def startup_notify(bot: Bot):
|
||||
if len(get_admins()) >= 1:
|
||||
await send_admins(bot, "<b>✅ Бот был запущен</b>")
|
||||
|
||||
|
||||
# Автоматические бэкапы БД
|
||||
async def autobackup(bot: Bot):
|
||||
for admin in get_admins():
|
||||
try:
|
||||
await bot.send_document(admin,
|
||||
FSInputFile(PATH_DATABASE),
|
||||
caption=f"<b>📦 AUTOBACKUP</b>\n"
|
||||
f"<code>🕰 {get_date()}</code>")
|
||||
except:
|
||||
pass
|
||||
Reference in New Issue
Block a user