This commit is contained in:
Djimbo
2023-01-19 05:31:54 +03:00
parent edf796a76d
commit 2c64b6208d
13 changed files with 67 additions and 58 deletions
+4 -4
View File
@@ -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()
+1
View File
@@ -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" # Путь к БД
+7 -7
View File
@@ -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) # Роутер пропущенных апдейтов
+7 -7
View File
@@ -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:
+2 -1
View 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 -9
View File
@@ -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")
+10 -5
View File
@@ -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),
)
+5 -5
View File
@@ -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)
+1 -1
View File
@@ -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
+8 -11
View File
@@ -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)
+3 -2
View File
@@ -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")
# Получение юникс даты # Получение юникс даты
+2 -2
View File
@@ -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
+4 -2
View File
@@ -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(
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