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:
@@ -9,7 +9,7 @@ from aiogram import Bot, Dispatcher
|
|||||||
from tgbot.data.config import BOT_TOKEN, scheduler, get_admins
|
from tgbot.data.config import BOT_TOKEN, scheduler, get_admins
|
||||||
from tgbot.middlewares import register_all_middlwares
|
from tgbot.middlewares import register_all_middlwares
|
||||||
from tgbot.routers import register_all_routers
|
from tgbot.routers import register_all_routers
|
||||||
from tgbot.services.api_session import AsyncSession
|
from tgbot.services.api_session import RequestSession
|
||||||
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
|
||||||
@@ -28,7 +28,7 @@ async def scheduler_start(bot):
|
|||||||
async def main():
|
async def main():
|
||||||
scheduler.start() # Запуск Шедулера
|
scheduler.start() # Запуск Шедулера
|
||||||
dp = Dispatcher() # Образ Диспетчера
|
dp = Dispatcher() # Образ Диспетчера
|
||||||
aSession = AsyncSession() # Пул асинхронной сессии запросов
|
rSession = RequestSession() # Пул асинхронной сессии запросов
|
||||||
bot = Bot(token=BOT_TOKEN, parse_mode="HTML") # Образ Бота
|
bot = Bot(token=BOT_TOKEN, parse_mode="HTML") # Образ Бота
|
||||||
|
|
||||||
register_all_middlwares(dp) # Регистрация всех мидлварей
|
register_all_middlwares(dp) # Регистрация всех мидлварей
|
||||||
@@ -48,9 +48,9 @@ async def main():
|
|||||||
|
|
||||||
await bot.delete_webhook()
|
await bot.delete_webhook()
|
||||||
await bot.get_updates(offset=-1)
|
await bot.get_updates(offset=-1)
|
||||||
await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types(), aSession=aSession)
|
await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types(), rSession=rSession)
|
||||||
finally:
|
finally:
|
||||||
await aSession.close()
|
await rSession.close()
|
||||||
await bot.session.close()
|
await bot.session.close()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
|||||||
BOT_TOKEN = configparser.ConfigParser()
|
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(' ', '')
|
||||||
|
BOT_TIMEZONE = "Europe/Moscow" # Временная зона бота
|
||||||
|
|
||||||
# Пути к файлам
|
# Пути к файлам
|
||||||
PATH_DATABASE = "tgbot/data/database.db" # Путь к БД
|
PATH_DATABASE = "tgbot/data/database.db" # Путь к БД
|
||||||
|
|||||||
@@ -12,19 +12,19 @@ def register_all_routers(dp: Dispatcher):
|
|||||||
# Подключение фильтров
|
# Подключение фильтров
|
||||||
main_errors.router.message.filter(F.chat.type == "private")
|
main_errors.router.message.filter(F.chat.type == "private")
|
||||||
main_start.router.message.filter(F.chat.type == "private")
|
main_start.router.message.filter(F.chat.type == "private")
|
||||||
main_missed.router.message.filter(F.chat.type == "private")
|
|
||||||
|
|
||||||
user_menu.router.message.filter(F.chat.type == "private")
|
user_menu.router.message.filter(F.chat.type == "private")
|
||||||
|
|
||||||
admin_menu.router.message.filter(F.chat.type == "private", IsAdmin())
|
admin_menu.router.message.filter(F.chat.type == "private", IsAdmin())
|
||||||
|
|
||||||
|
main_missed.router.message.filter(F.chat.type == "private")
|
||||||
|
|
||||||
# Подключение обязательных роутеров
|
# Подключение обязательных роутеров
|
||||||
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) # Админ роутер
|
||||||
|
|
||||||
# Подключение обязательных роутеров
|
# Подключение обязательных роутеров
|
||||||
dp.include_router(main_missed.router)
|
dp.include_router(main_missed.router) # Роутер пропущенных апдейтов
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ router = Router()
|
|||||||
|
|
||||||
# Кнопка - Admin Inline
|
# Кнопка - Admin Inline
|
||||||
@router.message(Text(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, rSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
await message.answer("Click Button - Admin Inline", reply_markup=admin_inl)
|
await message.answer("Click Button - Admin Inline", reply_markup=admin_inl)
|
||||||
@@ -22,7 +22,7 @@ async def admin_button_inline(message: Message, bot: Bot, state: FSM, aSession:
|
|||||||
|
|
||||||
# Кнопка - Admin Reply
|
# Кнопка - Admin Reply
|
||||||
@router.message(Text(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, rSession: 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)
|
||||||
@@ -30,13 +30,13 @@ async def admin_button_reply(message: Message, bot: Bot, state: FSM, aSession: A
|
|||||||
|
|
||||||
# Колбэк - Admin X
|
# Колбэк - Admin X
|
||||||
@router.callback_query(Text(text="admin_inline_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):
|
async def admin_callback_inline_x(call: CallbackQuery, bot: Bot, state: FSM, rSession: AS, my_user):
|
||||||
await call.answer(f"Click Admin X")
|
await call.answer(f"Click Admin X")
|
||||||
|
|
||||||
|
|
||||||
# Колбэк - Admin
|
# Колбэк - Admin
|
||||||
@router.callback_query(Text(startswith="admin_inline:"))
|
@router.callback_query(Text(startswith="admin_inline:"))
|
||||||
async def admin_callback_inline(call: CallbackQuery, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def admin_callback_inline(call: CallbackQuery, bot: Bot, state: FSM, rSession: AS, my_user):
|
||||||
get_data = call.data.split(":")[1]
|
get_data = call.data.split(":")[1]
|
||||||
|
|
||||||
await call.answer(f"Click Admin - {get_data}", True)
|
await call.answer(f"Click Admin - {get_data}", True)
|
||||||
@@ -44,7 +44,7 @@ async def admin_callback_inline(call: CallbackQuery, bot: Bot, state: FSM, aSess
|
|||||||
|
|
||||||
# Получение Базы Данных
|
# Получение Базы Данных
|
||||||
@router.message(Command(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, rSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
await message.answer_document(FSInputFile(PATH_DATABASE),
|
await message.answer_document(FSInputFile(PATH_DATABASE),
|
||||||
@@ -54,7 +54,7 @@ async def admin_database(message: Message, bot: Bot, state: FSM, aSession: AS, m
|
|||||||
|
|
||||||
# Получение логов
|
# Получение логов
|
||||||
@router.message(Command(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, rSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
await message.answer_document(FSInputFile(PATH_LOGS),
|
await message.answer_document(FSInputFile(PATH_LOGS),
|
||||||
@@ -64,7 +64,7 @@ async def admin_log(message: Message, bot: Bot, state: FSM, aSession: AS, my_use
|
|||||||
|
|
||||||
# Очистить логи
|
# Очистить логи
|
||||||
@router.message(Command(commands=['clear_log', 'clear_logs', 'log_clear', 'logs_clear']))
|
@router.message(Command(commands=['clear_log', 'clear_logs', 'log_clear', 'logs_clear']))
|
||||||
async def admin_logs_clear(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def admin_logs_clear(message: Message, bot: Bot, state: FSM, rSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
with open(PATH_LOGS, "w") as file:
|
with open(PATH_LOGS, "w") as file:
|
||||||
|
|||||||
@@ -18,7 +18,8 @@ class MyHandler(ErrorHandler):
|
|||||||
|
|
||||||
# Ошибка с редактированием одинакового сообщения
|
# Ошибка с редактированием одинакового сообщения
|
||||||
@router.errors(ExceptionMessageFilter(
|
@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"))
|
"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):
|
class MyHandler(ErrorHandler):
|
||||||
async def handle(self):
|
async def handle(self):
|
||||||
bot_logger.exception(
|
bot_logger.exception(
|
||||||
|
|||||||
@@ -11,31 +11,33 @@ router = Router()
|
|||||||
|
|
||||||
# Колбэк с удалением сообщения
|
# Колбэк с удалением сообщения
|
||||||
@router.callback_query(Text(text="close_this"))
|
@router.callback_query(Text(text="close_this"))
|
||||||
async def main_callback_close(call: CallbackQuery, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def main_callback_close(call: CallbackQuery, bot: Bot, state: FSM, rSession: AS, my_user):
|
||||||
await call.message.delete()
|
await call.message.delete()
|
||||||
|
|
||||||
|
|
||||||
# Колбэк с обработкой кнопки
|
# Колбэк с обработкой кнопки
|
||||||
@router.callback_query(Text(text="..."))
|
@router.callback_query(Text(text="..."))
|
||||||
async def main_callback_answer(call: CallbackQuery, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def main_callback_answer(call: CallbackQuery, bot: Bot, state: FSM, rSession: AS, my_user):
|
||||||
await call.answer(cache_time=20)
|
await call.answer(cache_time=30)
|
||||||
|
|
||||||
|
|
||||||
# Колбэк с обработкой удаления сообщений потерявших стейт
|
# Колбэк с обработкой удаления сообщений потерявших стейт
|
||||||
@router.callback_query()
|
@router.callback_query()
|
||||||
async def main_callback_missed(call: CallbackQuery, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def main_callback_missed(call: CallbackQuery, bot: Bot, state: FSM, rSession: AS, my_user):
|
||||||
try:
|
try:
|
||||||
await call.message.delete()
|
await call.message.delete()
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
await call.message.answer("<b>❌ Данные не были найдены из-за перезапуска скрипта.\n"
|
await call.message.answer(
|
||||||
"♻ Выполните действие заново.</b>",
|
"❌ Данные не были найдены из-за перезапуска скрипта.\n"
|
||||||
reply_markup=menu_frep(call.from_user.id))
|
"♻ Выполните действие заново.",
|
||||||
|
reply_markup=menu_frep(call.from_user.id),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# Обработка всех неизвестных команд
|
# Обработка всех неизвестных команд
|
||||||
@router.message()
|
@router.message()
|
||||||
async def main_message_missed(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def main_message_missed(message: Message, bot: Bot, state: FSM, rSession: AS, my_user):
|
||||||
await message.answer("♦ Неизвестная команда.\n"
|
await message.answer("♦ Неизвестная команда.\n"
|
||||||
"▶ Введите /start")
|
"♦ Введите /start")
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ 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
|
||||||
|
from tgbot.utils.const_functions import ded
|
||||||
from tgbot.utils.misc.bot_models import FSM, AS
|
from tgbot.utils.misc.bot_models import FSM, AS
|
||||||
|
|
||||||
router = Router()
|
router = Router()
|
||||||
@@ -12,10 +13,14 @@ router = Router()
|
|||||||
# Открытие главного меню
|
# Открытие главного меню
|
||||||
@router.message(Text(text=['🔙 Главное меню']))
|
@router.message(Text(text=['🔙 Главное меню']))
|
||||||
@router.message(Command(commands=['start']))
|
@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, rSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
await message.answer("🔸 Бот готов к использованию.\n"
|
await message.answer(
|
||||||
"🔸 Если не появились вспомогательные кнопки\n"
|
ded("""
|
||||||
"▶ Введите /start",
|
🔸 Бот готов к использованию.
|
||||||
reply_markup=menu_frep(message.from_user.id))
|
🔸 Если не появились вспомогательные кнопки
|
||||||
|
🔸 Введите /start,
|
||||||
|
"""),
|
||||||
|
reply_markup=menu_frep(message.from_user.id),
|
||||||
|
)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ router = Router()
|
|||||||
|
|
||||||
# Кнопка - User Inline
|
# Кнопка - User Inline
|
||||||
@router.message(Text(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, rSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
await message.answer("Click Button - User Inline", reply_markup=user_inl)
|
await message.answer("Click Button - User Inline", reply_markup=user_inl)
|
||||||
@@ -21,7 +21,7 @@ async def user_button_inline(message: Message, bot: Bot, state: FSM, aSession: A
|
|||||||
|
|
||||||
# Кнопка - User Reply
|
# Кнопка - User Reply
|
||||||
@router.message(Text(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, rSession: AS, my_user):
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
await message.answer("Click Button - User Reply", reply_markup=user_rep)
|
await message.answer("Click Button - User Reply", reply_markup=user_rep)
|
||||||
@@ -29,7 +29,7 @@ async def user_button_reply(message: Message, bot: Bot, state: FSM, aSession: AS
|
|||||||
|
|
||||||
# Команда - /inline
|
# Команда - /inline
|
||||||
@router.message(Command(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, rSession: 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))
|
||||||
@@ -37,13 +37,13 @@ async def user_command_inline(message: Message, bot: Bot, state: FSM, aSession:
|
|||||||
|
|
||||||
# Колбэк - User X
|
# Колбэк - User X
|
||||||
@router.callback_query(Text(text="user_inline_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):
|
async def user_callback_inline_x(call: CallbackQuery, bot: Bot, state: FSM, rSession: AS, my_user):
|
||||||
await call.answer(f"Click User X")
|
await call.answer(f"Click User X")
|
||||||
|
|
||||||
|
|
||||||
# Колбэк - User
|
# Колбэк - User
|
||||||
@router.callback_query(Text(startswith="user_inline:"))
|
@router.callback_query(Text(startswith="user_inline:"))
|
||||||
async def user_callback_inline(call: CallbackQuery, bot: Bot, state: FSM, aSession: AS, my_user):
|
async def user_callback_inline(call: CallbackQuery, bot: Bot, state: FSM, rSession: AS, my_user):
|
||||||
get_data = call.data.split(":")[1]
|
get_data = call.data.split(":")[1]
|
||||||
|
|
||||||
await call.answer(f"Click User - {get_data}", True)
|
await call.answer(f"Click User - {get_data}", True)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import aiohttp
|
|||||||
|
|
||||||
|
|
||||||
# Асинхронная сессия для запросов
|
# Асинхронная сессия для запросов
|
||||||
class AsyncSession:
|
class RequestSession:
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
self._session: Optional[aiohttp.ClientSession] = None
|
self._session: Optional[aiohttp.ClientSession] = None
|
||||||
|
|
||||||
|
|||||||
@@ -18,21 +18,18 @@ def dict_factory(cursor, row):
|
|||||||
####################################################################################################
|
####################################################################################################
|
||||||
##################################### ФОРМАТИРОВАНИЕ ЗАПРОСОВ ######################################
|
##################################### ФОРМАТИРОВАНИЕ ЗАПРОСОВ ######################################
|
||||||
# Форматирование запроса без аргументов
|
# Форматирование запроса без аргументов
|
||||||
def update_format_with_args(sql, parameters: dict):
|
def update_format(sql, parameters: dict):
|
||||||
if "XXX" not in sql:
|
|
||||||
sql += " XXX "
|
|
||||||
|
|
||||||
values = ", ".join([
|
values = ", ".join([
|
||||||
f"{item} = ?" for item in parameters
|
f"{item} = ?" for item in parameters
|
||||||
])
|
])
|
||||||
sql = sql.replace("XXX", values)
|
sql += f" {values}"
|
||||||
|
|
||||||
return sql, list(parameters.values())
|
return sql, list(parameters.values())
|
||||||
|
|
||||||
|
|
||||||
# Форматирование запроса с аргументами
|
# Форматирование запроса с аргументами
|
||||||
def update_format_args(sql, parameters: dict):
|
def update_format_where(sql, parameters: dict):
|
||||||
sql = f"{sql} WHERE "
|
sql += " WHERE "
|
||||||
|
|
||||||
sql += " AND ".join([
|
sql += " AND ".join([
|
||||||
f"{item} = ?" for item in parameters
|
f"{item} = ?" for item in parameters
|
||||||
@@ -58,7 +55,7 @@ def get_userx(**kwargs):
|
|||||||
with sqlite3.connect(PATH_DATABASE) as con:
|
with sqlite3.connect(PATH_DATABASE) as con:
|
||||||
con.row_factory = dict_factory
|
con.row_factory = dict_factory
|
||||||
sql = "SELECT * FROM storage_users"
|
sql = "SELECT * FROM storage_users"
|
||||||
sql, parameters = update_format_args(sql, kwargs)
|
sql, parameters = update_format_where(sql, kwargs)
|
||||||
return con.execute(sql, parameters).fetchone()
|
return con.execute(sql, parameters).fetchone()
|
||||||
|
|
||||||
|
|
||||||
@@ -67,7 +64,7 @@ def get_usersx(**kwargs):
|
|||||||
with sqlite3.connect(PATH_DATABASE) as con:
|
with sqlite3.connect(PATH_DATABASE) as con:
|
||||||
con.row_factory = dict_factory
|
con.row_factory = dict_factory
|
||||||
sql = "SELECT * FROM storage_users"
|
sql = "SELECT * FROM storage_users"
|
||||||
sql, parameters = update_format_args(sql, kwargs)
|
sql, parameters = update_format_where(sql, kwargs)
|
||||||
return con.execute(sql, parameters).fetchall()
|
return con.execute(sql, parameters).fetchall()
|
||||||
|
|
||||||
|
|
||||||
@@ -84,7 +81,7 @@ def update_userx(user_id, **kwargs):
|
|||||||
with sqlite3.connect(PATH_DATABASE) as con:
|
with sqlite3.connect(PATH_DATABASE) as con:
|
||||||
con.row_factory = dict_factory
|
con.row_factory = dict_factory
|
||||||
sql = f"UPDATE storage_users SET"
|
sql = f"UPDATE storage_users SET"
|
||||||
sql, parameters = update_format_with_args(sql, kwargs)
|
sql, parameters = update_format(sql, kwargs)
|
||||||
parameters.append(user_id)
|
parameters.append(user_id)
|
||||||
con.execute(sql + "WHERE user_id = ?", parameters)
|
con.execute(sql + "WHERE user_id = ?", parameters)
|
||||||
|
|
||||||
@@ -94,7 +91,7 @@ def delete_userx(**kwargs):
|
|||||||
with sqlite3.connect(PATH_DATABASE) as con:
|
with sqlite3.connect(PATH_DATABASE) as con:
|
||||||
con.row_factory = dict_factory
|
con.row_factory = dict_factory
|
||||||
sql = "DELETE FROM storage_users"
|
sql = "DELETE FROM storage_users"
|
||||||
sql, parameters = update_format_args(sql, kwargs)
|
sql, parameters = update_format_where(sql, kwargs)
|
||||||
con.execute(sql, parameters)
|
con.execute(sql, parameters)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,10 +4,11 @@ import time
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
|
import pytz
|
||||||
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, BOT_TIMEZONE
|
||||||
|
|
||||||
|
|
||||||
######################################## AIOGRAM ########################################
|
######################################## AIOGRAM ########################################
|
||||||
@@ -120,7 +121,7 @@ def split_messages(get_list: list, count: int) -> list[list]:
|
|||||||
|
|
||||||
# Получение даты
|
# Получение даты
|
||||||
def get_date() -> str:
|
def get_date() -> str:
|
||||||
return datetime.today().replace(microsecond=0).strftime("%d.%m.%Y %H:%M:%S")
|
return datetime.now(pytz.timezone(BOT_TIMEZONE)).strftime("%d.%m.%Y %H:%M:%S")
|
||||||
|
|
||||||
|
|
||||||
# Получение юникс даты
|
# Получение юникс даты
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# - *- coding: utf- 8 - *-
|
# - *- coding: utf- 8 - *-
|
||||||
from aiogram.fsm.context import FSMContext
|
from aiogram.fsm.context import FSMContext
|
||||||
|
|
||||||
from tgbot.services.api_session import AsyncSession
|
from tgbot.services.api_session import RequestSession
|
||||||
|
|
||||||
FSM = FSMContext
|
FSM = FSMContext
|
||||||
AS = AsyncSession
|
AS = RequestSession
|
||||||
|
|||||||
@@ -16,9 +16,11 @@ async def startup_notify(bot: Bot):
|
|||||||
async def autobackup_admin(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(
|
||||||
FSInputFile(PATH_DATABASE),
|
admin,
|
||||||
caption=f"<b>📦 AUTOBACKUP</b>\n"
|
FSInputFile(PATH_DATABASE),
|
||||||
f"🕰 <code>{get_date()}</code>")
|
caption=f"<b>📦 AUTOBACKUP</b>\n"
|
||||||
|
f"🕰 <code>{get_date()}</code>",
|
||||||
|
)
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|||||||
Reference in New Issue
Block a user