mirror of
https://github.com/djimboy/djimbo_template_aio3.git
synced 2026-07-25 09:44:29 +00:00
Update
This commit is contained in:
@@ -13,15 +13,15 @@ from tgbot.services.api_session import AsyncSession
|
|||||||
from tgbot.services.api_sqlite import create_dbx
|
from tgbot.services.api_sqlite import create_dbx
|
||||||
from tgbot.utils.misc.bot_commands import set_commands
|
from tgbot.utils.misc.bot_commands import set_commands
|
||||||
from tgbot.utils.misc.bot_logging import bot_logger
|
from tgbot.utils.misc.bot_logging import bot_logger
|
||||||
from tgbot.utils.misc_functions import autobackup, startup_notify
|
from tgbot.utils.misc_functions import autobackup_admin, startup_notify
|
||||||
|
|
||||||
colorama.init()
|
colorama.init()
|
||||||
|
|
||||||
|
|
||||||
# Запуск шедулеров
|
# Запуск шедулеров
|
||||||
async def scheduler_start(bot):
|
async def scheduler_start(bot):
|
||||||
scheduler.add_job(autobackup, "cron", hour=00, args=(bot,)) # Ежедневный Автобэкап в 00:00
|
scheduler.add_job(autobackup_admin, "cron", hour=00, args=(bot,)) # Ежедневный Автобэкап в 00:00
|
||||||
scheduler.add_job(autobackup, "cron", hour=12, args=(bot,)) # Ежедневный Автобэкап в 12:00
|
scheduler.add_job(autobackup_admin, "cron", hour=12, args=(bot,)) # Ежедневный Автобэкап в 12:00
|
||||||
|
|
||||||
|
|
||||||
# Запуск бота и функций
|
# Запуск бота и функций
|
||||||
@@ -38,11 +38,10 @@ async def main():
|
|||||||
await set_commands(bot)
|
await set_commands(bot)
|
||||||
await startup_notify(bot)
|
await startup_notify(bot)
|
||||||
await scheduler_start(bot)
|
await scheduler_start(bot)
|
||||||
bot_info = await bot.get_me()
|
|
||||||
|
|
||||||
bot_logger.warning("Bot was started")
|
bot_logger.warning("Bot was started")
|
||||||
print(colorama.Fore.LIGHTYELLOW_EX + f"~~~~~ Bot was started - @{bot_info.username} ~~~~~")
|
print(colorama.Fore.LIGHTYELLOW_EX + f"~~~~~ Bot was started - @{(await bot.get_me()).username} ~~~~~")
|
||||||
print(colorama.Fore.LIGHTBLUE_EX + "~~~~~ TG developer: @djimbox ~~~~~")
|
print(colorama.Fore.LIGHTBLUE_EX + "~~~~~ TG developer - @djimbox ~~~~~")
|
||||||
print(colorama.Fore.RESET)
|
print(colorama.Fore.RESET)
|
||||||
|
|
||||||
if len(get_admins()) == 0: print("***** ENTER ADMIN ID IN settings.ini *****")
|
if len(get_admins()) == 0: print("***** ENTER ADMIN ID IN settings.ini *****")
|
||||||
|
|||||||
+3
-3
@@ -1,6 +1,6 @@
|
|||||||
|
APScheduler==3.9.1
|
||||||
|
aiogram==3.0.0b5
|
||||||
colorlog==6.7.0
|
colorlog==6.7.0
|
||||||
aiogram>=3.0.0b4
|
|
||||||
aiohttp==3.8.1
|
|
||||||
typing==3.7.4.3
|
typing==3.7.4.3
|
||||||
APScheduler==3.8.0
|
aiohttp==3.8.3
|
||||||
colorama==0.4.5
|
colorama==0.4.5
|
||||||
@@ -4,7 +4,7 @@ import configparser
|
|||||||
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
||||||
|
|
||||||
# Токен бота
|
# Токен бота
|
||||||
BOT_TOKEN = configparser.ConfigParser(timezone="Europe/Moscow")
|
BOT_TOKEN = configparser.ConfigParser()
|
||||||
BOT_TOKEN.read("settings.ini")
|
BOT_TOKEN.read("settings.ini")
|
||||||
BOT_TOKEN = BOT_TOKEN['settings']['token'].strip().replace(' ', '')
|
BOT_TOKEN = BOT_TOKEN['settings']['token'].strip().replace(' ', '')
|
||||||
|
|
||||||
@@ -22,10 +22,10 @@ def get_admins():
|
|||||||
read_admins = configparser.ConfigParser()
|
read_admins = configparser.ConfigParser()
|
||||||
read_admins.read('settings.ini')
|
read_admins.read('settings.ini')
|
||||||
|
|
||||||
admins = read_admins['settings']['admin_id'].strip().replace(' ', '')
|
admins = read_admins['settings']['admin_id'].strip().replace(" ", "")
|
||||||
|
|
||||||
if ',' in admins:
|
if "," in admins:
|
||||||
admins = admins.split(',')
|
admins = admins.split(",")
|
||||||
else:
|
else:
|
||||||
if len(admins) >= 1:
|
if len(admins) >= 1:
|
||||||
admins = [admins]
|
admins = [admins]
|
||||||
|
|||||||
@@ -9,14 +9,16 @@ from tgbot.utils.const_functions import ikb
|
|||||||
def menu_finl(user_id):
|
def menu_finl(user_id):
|
||||||
keyboard = InlineKeyboardBuilder(
|
keyboard = InlineKeyboardBuilder(
|
||||||
).row(
|
).row(
|
||||||
ikb("User 1", data="..."),
|
ikb("User X", data="user_inline_x"),
|
||||||
ikb("User 2", data="..."),
|
ikb("User 1", data="user_inline:1"),
|
||||||
|
ikb("User 2", data="user_inline:2"),
|
||||||
)
|
)
|
||||||
|
|
||||||
if user_id in get_admins():
|
if user_id in get_admins():
|
||||||
keyboard.row(
|
keyboard.row(
|
||||||
ikb("Admin 1", data="..."),
|
ikb("Admin X", data="admin_inline_x"),
|
||||||
ikb("Admin 2", data="..."),
|
ikb("Admin 1", data="admin_inline:1"),
|
||||||
|
ikb("Admin 2", data="admin_inline:2"),
|
||||||
)
|
)
|
||||||
|
|
||||||
return keyboard.as_markup()
|
return keyboard.as_markup()
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ admin_rep = ReplyKeyboardBuilder(
|
|||||||
rkb("Admin Reply 1"),
|
rkb("Admin Reply 1"),
|
||||||
rkb("Admin Reply 2"),
|
rkb("Admin Reply 2"),
|
||||||
).row(
|
).row(
|
||||||
rkb("⬅ Главное меню"),
|
rkb("🔙 Главное меню"),
|
||||||
).as_markup(resize_keyboard=True)
|
).as_markup(resize_keyboard=True)
|
||||||
|
|
||||||
# Тестовые юзер реплай кнопки
|
# Тестовые юзер реплай кнопки
|
||||||
@@ -18,5 +18,5 @@ user_rep = ReplyKeyboardBuilder(
|
|||||||
rkb("User Reply 1"),
|
rkb("User Reply 1"),
|
||||||
rkb("User Reply 2"),
|
rkb("User Reply 2"),
|
||||||
).row(
|
).row(
|
||||||
rkb("⬅ Главное меню"),
|
rkb("🔙 Главное меню"),
|
||||||
).as_markup(resize_keyboard=True)
|
).as_markup(resize_keyboard=True)
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ def register_all_routers(dp: Dispatcher):
|
|||||||
dp.include_router(main_errors.router)
|
dp.include_router(main_errors.router)
|
||||||
dp.include_router(main_start.router)
|
dp.include_router(main_start.router)
|
||||||
|
|
||||||
# Подключение хендлеров (юзеров и админов)
|
# Подключение пользовательских роутеров (юзеров и админов)
|
||||||
dp.include_router(user_menu.router) # Юзер хендлер
|
dp.include_router(user_menu.router) # Юзер хендлер
|
||||||
dp.include_router(admin_menu.router) # Админ хендлер
|
dp.include_router(admin_menu.router) # Админ хендлер
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# - *- coding: utf- 8 - *-
|
# - *- coding: utf- 8 - *-
|
||||||
from aiogram import Router, Bot
|
from aiogram import Router, Bot
|
||||||
from aiogram.types import FSInputFile, Message
|
from aiogram.filters import Text, Command
|
||||||
|
from aiogram.types import FSInputFile, Message, CallbackQuery
|
||||||
|
|
||||||
from tgbot.data.config import PATH_DATABASE, PATH_LOGS
|
from tgbot.data.config import PATH_DATABASE, PATH_LOGS
|
||||||
from tgbot.keyboards.inline_misc import admin_inl
|
from tgbot.keyboards.inline_misc import admin_inl
|
||||||
@@ -12,7 +13,7 @@ router = Router()
|
|||||||
|
|
||||||
|
|
||||||
# Кнопка - Admin Inline
|
# Кнопка - Admin Inline
|
||||||
@router.message(text="Admin Inline")
|
@router.message(Text(text="Admin Inline"))
|
||||||
async def admin_button_inline(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def admin_button_inline(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
@@ -20,35 +21,50 @@ async def admin_button_inline(message: Message, bot: Bot, state: FSM, aSession:
|
|||||||
|
|
||||||
|
|
||||||
# Кнопка - Admin Reply
|
# Кнопка - Admin Reply
|
||||||
@router.message(text="Admin Reply")
|
@router.message(Text(text="Admin Reply"))
|
||||||
async def admin_button_reply(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def admin_button_reply(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
await message.answer("Click Button - Admin Reply", reply_markup=admin_rep)
|
await message.answer("Click Button - Admin Reply", reply_markup=admin_rep)
|
||||||
|
|
||||||
|
|
||||||
|
# Колбэк - Admin X
|
||||||
|
@router.callback_query(Text(text="admin_inline_x"))
|
||||||
|
async def admin_callback_inline_x(call: CallbackQuery, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
|
await call.answer(f"Click Admin X")
|
||||||
|
|
||||||
|
|
||||||
|
# Колбэк - Admin
|
||||||
|
@router.callback_query(Text(startswith="admin_inline:"))
|
||||||
|
async def admin_callback_inline(call: CallbackQuery, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
|
get_data = call.data.split(":")[1]
|
||||||
|
|
||||||
|
await call.answer(f"Click Admin - {get_data}", True)
|
||||||
|
|
||||||
|
|
||||||
# Получение Базы Данных
|
# Получение Базы Данных
|
||||||
@router.message(commands=['db', 'database'])
|
@router.message(Command(commands=['db', 'database']))
|
||||||
async def admin_database(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def admin_database(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
await message.answer_document(FSInputFile(PATH_DATABASE),
|
await message.answer_document(FSInputFile(PATH_DATABASE),
|
||||||
caption=f"<b>📦 BACKUP</b>\n"
|
caption=f"<b>📦 BACKUP</b>\n"
|
||||||
f"<code>🕰 {get_date()}</code>")
|
f"🕰 <code>{get_date()}</code>")
|
||||||
|
|
||||||
|
|
||||||
# Получение логов
|
# Получение логов
|
||||||
@router.message(commands=['log', 'logs'])
|
@router.message(Command(commands=['log', 'logs']))
|
||||||
async def admin_log(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def admin_log(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
await message.answer_document(FSInputFile(PATH_LOGS), caption=f"<code>🕰 {get_date()}</code>")
|
await message.answer_document(FSInputFile(PATH_LOGS),
|
||||||
|
caption=f"<b>🖨 LOGS</b>\n"
|
||||||
|
f"🕰 <code>{get_date()}</code>")
|
||||||
|
|
||||||
|
|
||||||
# Очистить логи
|
# Очистить логи
|
||||||
@router.message(text_contains=['log', '_', 'clean'])
|
@router.message(Command(commands=['clear_log', 'clear_logs', 'log_clear', 'logs_clear']))
|
||||||
@router.message(text_contains=['log', '_', 'clear'])
|
async def admin_logs_clear(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
async def admin_log_clear(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
with open(PATH_LOGS, "w") as file:
|
with open(PATH_LOGS, "w") as file:
|
||||||
|
|||||||
@@ -1,26 +1,29 @@
|
|||||||
# - *- coding: utf- 8 - *-
|
# - *- coding: utf- 8 - *-
|
||||||
from aiogram import Router, Bot
|
from aiogram import Router
|
||||||
from aiogram.exceptions import TelegramAPIError
|
from aiogram.exceptions import TelegramForbiddenError
|
||||||
from aiogram.types import Update
|
from aiogram.filters import ExceptionTypeFilter, ExceptionMessageFilter
|
||||||
|
from aiogram.handlers import ErrorHandler
|
||||||
|
|
||||||
from tgbot.utils.misc.bot_logging import bot_logger
|
from tgbot.utils.misc.bot_logging import bot_logger
|
||||||
from tgbot.utils.misc_functions import send_admins
|
|
||||||
|
|
||||||
router = Router()
|
router = Router()
|
||||||
|
|
||||||
|
|
||||||
# Обработка ошибок
|
# Ошибка с блокировкой бота пользователем
|
||||||
@router.errors()
|
@router.errors(ExceptionTypeFilter(TelegramForbiddenError))
|
||||||
async def processing_errors(update: Update, exception: TelegramAPIError, bot: Bot):
|
class MyHandler(ErrorHandler):
|
||||||
print(f"-Exception | {exception}")
|
async def handle(self):
|
||||||
await send_admins(
|
pass
|
||||||
bot,
|
|
||||||
f"<b>❌ Ошибка\n\n"
|
|
||||||
f"<b>Exception: <code>{exception}</code>\n\n"
|
|
||||||
f"Update: <code>{update.dict()}</code></b>"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
|
# Ошибка с редактированием одинакового сообщения
|
||||||
|
@router.errors(ExceptionMessageFilter(
|
||||||
|
"Bad Request: message is not modified: specified new message content and reply markup are exactly the same as a current content and reply markup of the message"))
|
||||||
|
class MyHandler(ErrorHandler):
|
||||||
|
async def handle(self):
|
||||||
bot_logger.exception(
|
bot_logger.exception(
|
||||||
f"Exception: {exception}\n"
|
f"====================\n"
|
||||||
f"Update: {update.dict()}"
|
f"Exception name: {self.exception_name}\n"
|
||||||
|
f"Exception message: {self.exception_message}\n"
|
||||||
|
f"===================="
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,28 +1,29 @@
|
|||||||
# - *- coding: utf- 8 - *-
|
# - *- coding: utf- 8 - *-
|
||||||
from aiogram import types, Router
|
from aiogram import Router, Bot
|
||||||
from aiogram.types import CallbackQuery
|
from aiogram.filters import Text
|
||||||
|
from aiogram.types import CallbackQuery, Message
|
||||||
|
|
||||||
from tgbot.keyboards.reply_main import menu_frep
|
from tgbot.keyboards.reply_main import menu_frep
|
||||||
from tgbot.utils.misc.bot_models import FSM
|
from tgbot.utils.misc.bot_models import FSM, AS
|
||||||
|
|
||||||
router = Router()
|
router = Router()
|
||||||
|
|
||||||
|
|
||||||
# Колбэк с удалением сообщения
|
# Колбэк с удалением сообщения
|
||||||
@router.callback_query(text="close_this")
|
@router.callback_query(Text(text="close_this"))
|
||||||
async def processing_callback_close(call: CallbackQuery, state: FSM):
|
async def main_callback_close(call: CallbackQuery, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
await call.message.delete()
|
await call.message.delete()
|
||||||
|
|
||||||
|
|
||||||
# Колбэк с обработкой кнопки
|
# Колбэк с обработкой кнопки
|
||||||
@router.callback_query(text="...")
|
@router.callback_query(Text(text="..."))
|
||||||
async def processing_callback_answer(call: CallbackQuery, state: FSM):
|
async def main_callback_answer(call: CallbackQuery, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
await call.answer(cache_time=20)
|
await call.answer(cache_time=20)
|
||||||
|
|
||||||
|
|
||||||
# Колбэк с обработкой удаления сообщений потерявших стейт
|
# Колбэк с обработкой удаления сообщений потерявших стейт
|
||||||
@router.callback_query()
|
@router.callback_query()
|
||||||
async def processing_callback_missed(call: CallbackQuery, state: FSM):
|
async def main_callback_missed(call: CallbackQuery, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
try:
|
try:
|
||||||
await call.message.delete()
|
await call.message.delete()
|
||||||
except:
|
except:
|
||||||
@@ -35,6 +36,6 @@ async def processing_callback_missed(call: CallbackQuery, state: FSM):
|
|||||||
|
|
||||||
# Обработка всех неизвестных команд
|
# Обработка всех неизвестных команд
|
||||||
@router.message()
|
@router.message()
|
||||||
async def processing_message_missed(message: types.Message, state: FSM):
|
async def main_message_missed(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
await message.answer("♦ Неизвестная команда.\n"
|
await message.answer("♦ Неизвестная команда.\n"
|
||||||
"▶ Введите /start")
|
"▶ Введите /start")
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# - *- coding: utf- 8 - *-
|
# - *- coding: utf- 8 - *-
|
||||||
from aiogram import Router, Bot
|
from aiogram import Router, Bot
|
||||||
|
from aiogram.filters import Text, Command
|
||||||
from aiogram.types import Message
|
from aiogram.types import Message
|
||||||
|
|
||||||
from tgbot.keyboards.reply_main import menu_frep
|
from tgbot.keyboards.reply_main import menu_frep
|
||||||
@@ -9,7 +10,8 @@ router = Router()
|
|||||||
|
|
||||||
|
|
||||||
# Открытие главного меню
|
# Открытие главного меню
|
||||||
@router.message(text_startswith=["⬅ Главное меню", "/start"])
|
@router.message(Text(text=['🔙 Главное меню']))
|
||||||
|
@router.message(Command(commands=['start']))
|
||||||
async def main_start(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def main_start(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# - *- coding: utf- 8 - *-
|
# - *- coding: utf- 8 - *-
|
||||||
from aiogram import Router, Bot
|
from aiogram import Router, Bot
|
||||||
from aiogram.types import Message
|
from aiogram.filters import Command, Text
|
||||||
|
from aiogram.types import Message, CallbackQuery
|
||||||
|
|
||||||
from tgbot.keyboards.inline_main import menu_finl
|
from tgbot.keyboards.inline_main import menu_finl
|
||||||
from tgbot.keyboards.inline_misc import user_inl
|
from tgbot.keyboards.inline_misc import user_inl
|
||||||
@@ -11,7 +12,7 @@ router = Router()
|
|||||||
|
|
||||||
|
|
||||||
# Кнопка - User Inline
|
# Кнопка - User Inline
|
||||||
@router.message(text="User Inline")
|
@router.message(Text(text="User Inline"))
|
||||||
async def user_button_inline(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def user_button_inline(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
@@ -19,7 +20,7 @@ async def user_button_inline(message: Message, bot: Bot, state: FSM, aSession: A
|
|||||||
|
|
||||||
|
|
||||||
# Кнопка - User Reply
|
# Кнопка - User Reply
|
||||||
@router.message(text="User Reply")
|
@router.message(Text(text="User Reply"))
|
||||||
async def user_button_reply(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def user_button_reply(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
@@ -27,8 +28,22 @@ async def user_button_reply(message: Message, bot: Bot, state: FSM, aSession: AS
|
|||||||
|
|
||||||
|
|
||||||
# Команда - /inline
|
# Команда - /inline
|
||||||
@router.message(commands="inline")
|
@router.message(Command(commands="inline"))
|
||||||
async def user_command_inline(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def user_command_inline(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
await message.answer("Click command - /inline", reply_markup=menu_finl(message.from_user.id))
|
await message.answer("Click command - /inline", reply_markup=menu_finl(message.from_user.id))
|
||||||
|
|
||||||
|
|
||||||
|
# Колбэк - User X
|
||||||
|
@router.callback_query(Text(text="user_inline_x"))
|
||||||
|
async def user_callback_inline_x(call: CallbackQuery, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
|
await call.answer(f"Click User X")
|
||||||
|
|
||||||
|
|
||||||
|
# Колбэк - User
|
||||||
|
@router.callback_query(Text(startswith="user_inline:"))
|
||||||
|
async def user_callback_inline(call: CallbackQuery, bot: Bot, state: FSM, aSession: AS, my_user):
|
||||||
|
get_data = call.data.split(":")[1]
|
||||||
|
|
||||||
|
await call.answer(f"Click User - {get_data}", True)
|
||||||
|
|||||||
@@ -116,5 +116,6 @@ def create_dbx():
|
|||||||
"user_surname TEXT,"
|
"user_surname TEXT,"
|
||||||
"user_fullname TEXT,"
|
"user_fullname TEXT,"
|
||||||
"user_date TIMESTAMP,"
|
"user_date TIMESTAMP,"
|
||||||
"user_unix INTEGER)")
|
"user_unix INTEGER"
|
||||||
|
")")
|
||||||
print("DB was not found(1/1) | Creating...")
|
print("DB was not found(1/1) | Creating...")
|
||||||
|
|||||||
@@ -2,20 +2,22 @@
|
|||||||
import random
|
import random
|
||||||
import time
|
import time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from typing import Union
|
||||||
|
|
||||||
from aiogram import Bot, types
|
from aiogram import Bot, types
|
||||||
from aiogram.types import InlineKeyboardButton, KeyboardButton
|
from aiogram.types import InlineKeyboardButton, KeyboardButton
|
||||||
|
|
||||||
from tgbot.data.config import get_admins
|
from tgbot.data.config import get_admins
|
||||||
|
|
||||||
|
|
||||||
######################################## AIOGRAM ########################################
|
######################################## AIOGRAM ########################################
|
||||||
# Генерация реплай кнопки
|
# Генерация реплай кнопки
|
||||||
def rkb(text):
|
def rkb(text) -> KeyboardButton:
|
||||||
return KeyboardButton(text=text)
|
return KeyboardButton(text=text)
|
||||||
|
|
||||||
|
|
||||||
# Генерация инлайн кнопки
|
# Генерация инлайн кнопки
|
||||||
def ikb(text, data=None, url=None, switch=None):
|
def ikb(text, data=None, url=None, switch=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:
|
||||||
@@ -71,7 +73,7 @@ async def smart_send(bot: Bot, message: types.Message, user_id, text_add=None, r
|
|||||||
|
|
||||||
######################################## ПРОЧЕЕ ########################################
|
######################################## ПРОЧЕЕ ########################################
|
||||||
# Удаление отступов у текста
|
# Удаление отступов у текста
|
||||||
def ded(get_text: str):
|
def ded(get_text: str) -> str:
|
||||||
if get_text is not None:
|
if get_text is not None:
|
||||||
split_text = get_text.split("\n")
|
split_text = get_text.split("\n")
|
||||||
if split_text[0] == "": split_text.pop(0)
|
if split_text[0] == "": split_text.pop(0)
|
||||||
@@ -84,20 +86,25 @@ def ded(get_text: str):
|
|||||||
|
|
||||||
save_text.append(text)
|
save_text.append(text)
|
||||||
get_text = "\n".join(save_text)
|
get_text = "\n".join(save_text)
|
||||||
|
else:
|
||||||
|
get_text = ""
|
||||||
|
|
||||||
return get_text
|
return get_text
|
||||||
|
|
||||||
|
|
||||||
# Очистка HTML тэгов
|
# Очистка HTML тэгов
|
||||||
def clear_html(get_text: str):
|
def clear_html(get_text: str) -> str:
|
||||||
if get_text is not None:
|
if get_text is not None:
|
||||||
if "<" in get_text: get_text = get_text.replace("<", "*")
|
if "<" in get_text: get_text = get_text.replace("<", "*")
|
||||||
if ">" in get_text: get_text = get_text.replace(">", "*")
|
if ">" in get_text: get_text = get_text.replace(">", "*")
|
||||||
|
else:
|
||||||
|
get_text = ""
|
||||||
|
|
||||||
return get_text
|
return get_text
|
||||||
|
|
||||||
|
|
||||||
# Очистка пробелов в списке
|
# Очистка пробелов в списке
|
||||||
def clear_list(get_list: list):
|
def clear_list(get_list: list) -> list:
|
||||||
while "" in get_list: get_list.remove("")
|
while "" in get_list: get_list.remove("")
|
||||||
while " " in get_list: get_list.remove(" ")
|
while " " in get_list: get_list.remove(" ")
|
||||||
while "," in get_list: get_list.remove(",")
|
while "," in get_list: get_list.remove(",")
|
||||||
@@ -112,7 +119,7 @@ def split_messages(get_list: list, count: int):
|
|||||||
|
|
||||||
|
|
||||||
# Получение даты
|
# Получение даты
|
||||||
def get_date():
|
def get_date() -> str:
|
||||||
this_date = datetime.today().replace(microsecond=0)
|
this_date = datetime.today().replace(microsecond=0)
|
||||||
this_date = this_date.strftime("%d.%m.%Y %H:%M:%S")
|
this_date = this_date.strftime("%d.%m.%Y %H:%M:%S")
|
||||||
|
|
||||||
@@ -120,35 +127,50 @@ def get_date():
|
|||||||
|
|
||||||
|
|
||||||
# Получение юникс даты
|
# Получение юникс даты
|
||||||
def get_unix():
|
def get_unix(full=False) -> int:
|
||||||
|
if full:
|
||||||
|
return time.time_ns()
|
||||||
|
else:
|
||||||
return int(time.time())
|
return int(time.time())
|
||||||
|
|
||||||
|
|
||||||
# Генерация пароля
|
# Генерация пароля
|
||||||
def generate_password(len_password: int):
|
def gen_password(len_password: int = 16, type_password: str = "default") -> str: # default, number, letter, onechar
|
||||||
passwd = list("1234567890abcdefghigklmnopqrstuvyxwzABCDEFGHIGKLMNOPQRSTUVYXWZ")
|
if type_password == "default":
|
||||||
random.shuffle(passwd)
|
char_password = list("1234567890abcdefghigklmnopqrstuvyxwzABCDEFGHIGKLMNOPQRSTUVYXWZ")
|
||||||
random_chars = "".join([random.choice(passwd) for x in range(len_password)])
|
elif type_password == "letter":
|
||||||
|
char_password = list("abcdefghigklmnopqrstuvyxwzABCDEFGHIGKLMNOPQRSTUVYXWZ")
|
||||||
|
elif type_password == "number":
|
||||||
|
char_password = list("1234567890")
|
||||||
|
elif type_password == "onechar":
|
||||||
|
char_password = list("1234567890")
|
||||||
|
|
||||||
|
random.shuffle(char_password)
|
||||||
|
random_chars = "".join([random.choice(char_password) for x in range(len_password)])
|
||||||
|
|
||||||
|
if type_password == "onechar":
|
||||||
|
random_chars = f"{random.choice('abcdefghigklmnopqrstuvyxwzABCDEFGHIGKLMNOPQRSTUVYXWZ')}{random_chars[1:]}"
|
||||||
|
|
||||||
return random_chars
|
return random_chars
|
||||||
|
|
||||||
|
|
||||||
# Корректный вывод времени
|
# Корректный вывод времени
|
||||||
def convert_times(get_time, get_type="day"):
|
def convert_times(get_time, get_type="day") -> str:
|
||||||
get_time = int(get_time)
|
get_time = int(get_time)
|
||||||
|
if get_time < 0: get_time = 0
|
||||||
|
|
||||||
if get_type == "second":
|
if get_type == "second":
|
||||||
get_list = ["секунда", "секунды", "секунд"]
|
get_list = ['секунда', 'секунды', 'секунд']
|
||||||
elif get_type == "minute":
|
elif get_type == "minute":
|
||||||
get_list = ["минута", "минуты", "минут"]
|
get_list = ['минута', 'минуты', 'минут']
|
||||||
elif get_type == "hour":
|
elif get_type == "hour":
|
||||||
get_list = ["час", "часа", "часов"]
|
get_list = ['час', 'часа', 'часов']
|
||||||
elif get_type == "day":
|
elif get_type == "day":
|
||||||
get_list = ["день", "дня", "дней"]
|
get_list = ['день', 'дня', 'дней']
|
||||||
elif get_type == "month":
|
elif get_type == "month":
|
||||||
get_list = ["месяц", "месяца", "месяцев"]
|
get_list = ['месяц', 'месяца', 'месяцев']
|
||||||
else:
|
else:
|
||||||
get_list = ["год", "года", "лет"]
|
get_list = ['год', 'года', 'лет']
|
||||||
|
|
||||||
if get_time % 10 == 1 and get_time % 100 != 11:
|
if get_time % 10 == 1 and get_time % 100 != 11:
|
||||||
count = 0
|
count = 0
|
||||||
@@ -161,35 +183,57 @@ def convert_times(get_time, get_type="day"):
|
|||||||
|
|
||||||
|
|
||||||
######################################## ЧИСЛА ########################################
|
######################################## ЧИСЛА ########################################
|
||||||
|
# Преобразование длинных вещественных чисел в читаемый вид
|
||||||
|
def snum(amount, remains=0) -> str:
|
||||||
|
if "-" in str(amount):
|
||||||
|
str_amount = "%.*f" % (int(str(amount).split("-")[1]), amount)
|
||||||
|
elif "." in str(amount):
|
||||||
|
str_amount = f"{float(amount):.{len(str(amount).split('.')[1])}f}"
|
||||||
|
else:
|
||||||
|
str_amount = str(amount)
|
||||||
|
|
||||||
|
while str_amount.endswith('0'): str_amount = str_amount[:-1]
|
||||||
|
if str_amount.endswith('.'): str_amount = str_amount[:-1]
|
||||||
|
|
||||||
|
if remains != 0:
|
||||||
|
str_amount = round(float(str_amount), remains)
|
||||||
|
|
||||||
|
return str(str_amount)
|
||||||
|
|
||||||
|
|
||||||
# Конвертация числа в вещественное
|
# Конвертация числа в вещественное
|
||||||
def to_float(get_number, remains=2):
|
def to_float(get_number, remains=2) -> Union[int, float]:
|
||||||
if "," in str(get_number):
|
if "," in str(get_number):
|
||||||
get_number = str(get_number).replace(",", ".")
|
get_number = str(get_number).replace(",", ".")
|
||||||
|
|
||||||
if "." in get_number:
|
if "." in str(get_number):
|
||||||
get_last = get_number.split(".")
|
get_last = str(get_number).split(".")
|
||||||
|
|
||||||
if get_last[1].endswith("0"):
|
if str(get_last[1]).endswith("0"):
|
||||||
while True:
|
while True:
|
||||||
if get_number.endswith("0"):
|
if str(get_number).endswith("0"):
|
||||||
get_number = get_number[:-1]
|
get_number = str(get_number)[:-1]
|
||||||
else:
|
else:
|
||||||
break
|
break
|
||||||
|
|
||||||
get_number = round(float(get_number), remains)
|
get_number = round(float(get_number), remains)
|
||||||
|
|
||||||
if str(float(get_number)).split(".")[1] == "0":
|
str_number = snum(get_number)
|
||||||
|
if "." in str_number:
|
||||||
|
if str_number.split(".")[1] == "0":
|
||||||
get_number = int(get_number)
|
get_number = int(get_number)
|
||||||
else:
|
else:
|
||||||
get_number = float(get_number)
|
get_number = float(get_number)
|
||||||
|
else:
|
||||||
|
get_number = int(get_number)
|
||||||
|
|
||||||
return get_number
|
return get_number
|
||||||
|
|
||||||
|
|
||||||
# Конвертация числа в целочисленное
|
# Конвертация числа в целочисленное
|
||||||
def to_int(get_number):
|
def to_int(get_number) -> int:
|
||||||
if "," in get_number:
|
if "," in get_number:
|
||||||
get_number = get_number.replace(",", ".")
|
get_number = str(get_number).replace(",", ".")
|
||||||
|
|
||||||
get_number = int(round(float(get_number)))
|
get_number = int(round(float(get_number)))
|
||||||
|
|
||||||
@@ -197,8 +241,8 @@ def to_int(get_number):
|
|||||||
|
|
||||||
|
|
||||||
# Проверка числа на вещественное
|
# Проверка числа на вещественное
|
||||||
def is_number(get_number):
|
def is_number(get_number) -> bool:
|
||||||
if get_number.isdigit():
|
if str(get_number).isdigit():
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
if "," in str(get_number): get_number = str(get_number).replace(",", ".")
|
if "," in str(get_number): get_number = str(get_number).replace(",", ".")
|
||||||
@@ -210,18 +254,11 @@ def is_number(get_number):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
# Преобразование длинных вещественных чисел в читаемый вид
|
# Форматирование числа в читаемый вид
|
||||||
def show_floats(amount):
|
def format_rate(rate, around=False) -> str:
|
||||||
return f"{float(amount):.{len(str(amount).split('.')[1])}f}"
|
|
||||||
|
|
||||||
|
|
||||||
# Форматирование чисел в читаемый вид
|
|
||||||
def format_rate(rate, around=False):
|
|
||||||
rate = str(round(float(rate), 2))
|
rate = str(round(float(rate), 2))
|
||||||
|
|
||||||
if "," in rate:
|
if "," in rate: rate = float(rate.replace(",", "."))
|
||||||
rate = float(rate.replace(",", "."))
|
|
||||||
|
|
||||||
len_rate = str(int(float(rate)))
|
len_rate = str(int(float(rate)))
|
||||||
|
|
||||||
if len(len_rate) == 3:
|
if len(len_rate) == 3:
|
||||||
@@ -241,7 +278,7 @@ def format_rate(rate, around=False):
|
|||||||
elif len(len_rate) == 10:
|
elif len(len_rate) == 10:
|
||||||
get_rate = f"{len_rate[0:1]} {len_rate[1:4]} {len_rate[4:7]} {len_rate[7:]}"
|
get_rate = f"{len_rate[0:1]} {len_rate[1:4]} {len_rate[4:7]} {len_rate[7:]}"
|
||||||
else:
|
else:
|
||||||
get_rate = 0
|
get_rate = "0"
|
||||||
|
|
||||||
if not around:
|
if not around:
|
||||||
if "." in rate:
|
if "." in rate:
|
||||||
|
|||||||
@@ -13,12 +13,12 @@ async def startup_notify(bot: Bot):
|
|||||||
|
|
||||||
|
|
||||||
# Автоматические бэкапы БД
|
# Автоматические бэкапы БД
|
||||||
async def autobackup(bot: Bot):
|
async def autobackup_admin(bot: Bot):
|
||||||
for admin in get_admins():
|
for admin in get_admins():
|
||||||
try:
|
try:
|
||||||
await bot.send_document(admin,
|
await bot.send_document(admin,
|
||||||
FSInputFile(PATH_DATABASE),
|
FSInputFile(PATH_DATABASE),
|
||||||
caption=f"<b>📦 AUTOBACKUP</b>\n"
|
caption=f"<b>📦 AUTOBACKUP</b>\n"
|
||||||
f"<code>🕰 {get_date()}</code>")
|
f"🕰 <code>{get_date()}</code>")
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|||||||
Reference in New Issue
Block a user