This commit is contained in:
djimbo
2022-09-24 20:38:34 +03:00
parent 359b9717ec
commit 9213a80cb9
16 changed files with 77 additions and 49 deletions
+7 -7
View File
@@ -9,7 +9,7 @@ from aiogram import Bot, Dispatcher
from tgbot.data.config import BOT_TOKEN, scheduler, get_admins
from tgbot.middlewares import register_all_middlwares
from tgbot.routers import register_all_routers
from tgbot.services.api_session import RequestsSession
from tgbot.services.api_session import AsyncSession
from tgbot.services.api_sqlite import create_dbx
from tgbot.utils.misc.bot_commands import set_commands
from tgbot.utils.misc.bot_logging import bot_logger
@@ -20,15 +20,15 @@ colorama.init()
# Запуск шедулеров
async def scheduler_start(bot):
scheduler.add_job(autobackup, "cron", hour=00, args=(bot,)) # Автобэкап в 12:00
scheduler.add_job(autobackup, "cron", hour=12, args=(bot,)) # Автобэкап в 00:00
scheduler.add_job(autobackup, "cron", hour=00, args=(bot,)) # Ежедневный Автобэкап в 00:00
scheduler.add_job(autobackup, "cron", hour=12, args=(bot,)) # Ежедневный Автобэкап в 12:00
# Запуск бота и функций
async def main():
scheduler.start() # Запуск Шедулера
dp = Dispatcher() # Создание Диспетчера
rSession = RequestsSession() # Асинхронные Запросы
dp = Dispatcher() # Образ Диспетчера
aSession = AsyncSession() # Пул асинхронной сессии запросов
bot = Bot(token=BOT_TOKEN, parse_mode="HTML") # Образ Бота
register_all_middlwares(dp) # Регистрация всех мидлварей
@@ -48,9 +48,9 @@ async def main():
await bot.delete_webhook()
await bot.get_updates(offset=-1)
await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types(), rSession=rSession)
await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types(), aSession=aSession)
finally:
await rSession.close()
await aSession.close()
await bot.session.close()
+9 -5
View File
@@ -3,15 +3,19 @@ import configparser
from apscheduler.schedulers.asyncio import AsyncIOScheduler
scheduler = AsyncIOScheduler()
# Токен бота
BOT_TOKEN = configparser.ConfigParser()
BOT_TOKEN.read("settings.ini")
BOT_TOKEN = BOT_TOKEN['settings']['token'].strip().replace(' ', '')
read_config = configparser.ConfigParser()
read_config.read("settings.ini")
BOT_TOKEN = read_config['settings']['token'].strip().replace(' ', '') # Токен бота
# Пути к файлам
PATH_DATABASE = "tgbot/data/database.db" # Путь к БД
PATH_LOGS = "tgbot/data/logs.log" # Путь к Логам
# Образы и конфиги
scheduler = AsyncIOScheduler() # Образ шедулера
start_status = True # Оповещение админам при запуске бота (True или False)
# Получение администраторов бота
def get_admins():
+1
View File
@@ -5,6 +5,7 @@ from tgbot.middlewares.exists_user import ExistsUserMiddleware
from tgbot.middlewares.throttling import ThrottlingMiddleware
# Регистрация всех миддлварей
def register_all_middlwares(dp: Dispatcher):
dp.callback_query.outer_middleware(ExistsUserMiddleware())
dp.message.outer_middleware(ExistsUserMiddleware())
+3 -3
View File
@@ -16,15 +16,15 @@ class ExistsUserMiddleware(BaseMiddleware):
user_id = this_user.id
user_login = this_user.username
user_name = clear_html(this_user.first_name)
user_fullname = clear_html(this_user.first_name)
user_surname = clear_html(this_user.last_name)
user_fullname = clear_html(this_user.first_name)
user_language = this_user.language_code
if user_language != "ru": user_language = "en"
if user_login is None: user_login = ""
if user_name is None: user_name = ""
if user_fullname is None: user_fullname = ""
if user_surname is None: user_surname = ""
if user_fullname is None: user_fullname = ""
if user_language != "ru": user_language = "en"
if len(user_surname) >= 1: user_fullname += f" {user_surname}"
+3 -3
View File
@@ -7,7 +7,7 @@ from tgbot.routers.user import user_menu
from tgbot.utils.misc.bot_filters import IsAdmin
# Регистрация роутеров
# Регистрация всех роутеров
def register_all_routers(dp: Dispatcher):
# Подключение фильтров
main_errors.router.message.filter(F.chat.type == "private")
@@ -18,7 +18,7 @@ def register_all_routers(dp: Dispatcher):
admin_menu.router.message.filter(F.chat.type == "private", IsAdmin())
# Инициализация обязательных роутеров
# Подключение обязательных роутеров
dp.include_router(main_errors.router)
dp.include_router(main_start.router)
@@ -26,5 +26,5 @@ def register_all_routers(dp: Dispatcher):
dp.include_router(user_menu.router) # Юзер хендлер
dp.include_router(admin_menu.router) # Админ хендлер
# Инициализация обязательных роутеров
# Подключение обязательных роутеров
dp.include_router(main_missed.router)
+17 -6
View File
@@ -2,19 +2,18 @@
from aiogram import Router, Bot
from aiogram.types import FSInputFile, Message
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.reply_misc import admin_rep
from tgbot.utils.const_functions import get_date
from tgbot.utils.misc.bot_models import FSM, RS
from tgbot.utils.misc.bot_models import FSM, AS
router = Router()
# Кнопка - Admin Inline
@router.message(text="Admin Inline")
async def admin_button_inline(message: Message, bot: Bot, state: FSM, rSession: RS, my_user):
async def admin_button_inline(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
await state.clear()
await message.answer("Click Button - Admin Inline", reply_markup=admin_inl)
@@ -22,7 +21,7 @@ async def admin_button_inline(message: Message, bot: Bot, state: FSM, rSession:
# Кнопка - Admin Reply
@router.message(text="Admin Reply")
async def admin_button_reply(message: Message, bot: Bot, state: FSM, rSession: RS, my_user):
async def admin_button_reply(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
await state.clear()
await message.answer("Click Button - Admin Reply", reply_markup=admin_rep)
@@ -30,7 +29,7 @@ async def admin_button_reply(message: Message, bot: Bot, state: FSM, rSession: R
# Получение Базы Данных
@router.message(commands=['db', 'database'])
async def admin_database(message: Message, bot: Bot, state: FSM, rSession: RS, my_user):
async def admin_database(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
await state.clear()
await message.answer_document(FSInputFile(PATH_DATABASE),
@@ -40,7 +39,19 @@ async def admin_database(message: Message, bot: Bot, state: FSM, rSession: RS, m
# Получение логов
@router.message(commands=['log', 'logs'])
async def admin_log(message: Message, bot: Bot, state: FSM, rSession: RS, my_user):
async def admin_log(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
await state.clear()
await message.answer_document(FSInputFile(PATH_LOGS), caption=f"<code>🕰 {get_date()}</code>")
# Очистить логи
@router.message(text_contains=['log', '_', 'clean'])
@router.message(text_contains=['log', '_', 'clear'])
async def admin_log_clear(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
await state.clear()
with open(PATH_LOGS, "w") as file:
file.write(f"{get_date()} | LOGS WAS CLEAR")
await message.answer("<b>🖨 Логи были успешно очищены</b>")
+6 -3
View File
@@ -13,9 +13,12 @@ router = Router()
@router.errors()
async def processing_errors(update: Update, exception: TelegramAPIError, bot: Bot):
print(f"-Exception | {exception}")
await send_admins(bot, f"<b>❌ Ошибка\n\n"
f"<b>Exception: <code>{exception}</code>\n\n"
f"Update: <code>{update.dict()}</code></b>")
await send_admins(
bot,
f"<b>❌ Ошибка\n\n"
f"<b>Exception: <code>{exception}</code>\n\n"
f"Update: <code>{update.dict()}</code></b>"
)
bot_logger.exception(
f"Exception: {exception}\n"
+1 -1
View File
@@ -10,7 +10,7 @@ router = Router()
# Колбэк с удалением сообщения
@router.callback_query(text="close_this")
async def processing_callback_remove(call: CallbackQuery, state: FSM):
async def processing_callback_close(call: CallbackQuery, state: FSM):
await call.message.delete()
+2 -2
View File
@@ -3,14 +3,14 @@ from aiogram import Router, Bot
from aiogram.types import Message
from tgbot.keyboards.reply_main import menu_frep
from tgbot.utils.misc.bot_models import FSM, RS
from tgbot.utils.misc.bot_models import FSM, AS
router = Router()
# Открытие главного меню
@router.message(text_startswith=["⬅ Главное меню", "/start"])
async def main_start(message: Message, bot: Bot, state: FSM, rSession: RS, my_user):
async def main_start(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
await state.clear()
await message.answer("🔸 Бот готов к использованию.\n"
+4 -4
View File
@@ -5,14 +5,14 @@ from aiogram.types import Message
from tgbot.keyboards.inline_main import menu_finl
from tgbot.keyboards.inline_misc import user_inl
from tgbot.keyboards.reply_misc import user_rep
from tgbot.utils.misc.bot_models import FSM, RS
from tgbot.utils.misc.bot_models import FSM, AS
router = Router()
# Кнопка - User Inline
@router.message(text="User Inline")
async def user_button_inline(message: Message, bot: Bot, state: FSM, rSession: RS, my_user):
async def user_button_inline(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
await state.clear()
await message.answer("Click Button - User Inline", reply_markup=user_inl)
@@ -20,7 +20,7 @@ async def user_button_inline(message: Message, bot: Bot, state: FSM, rSession: R
# Кнопка - User Reply
@router.message(text="User Reply")
async def user_button_reply(message: Message, bot: Bot, state: FSM, rSession: RS, my_user):
async def user_button_reply(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
await state.clear()
await message.answer("Click Button - User Reply", reply_markup=user_rep)
@@ -28,7 +28,7 @@ async def user_button_reply(message: Message, bot: Bot, state: FSM, rSession: RS
# Команда - /inline
@router.message(commands="inline")
async def user_command_inline(message: Message, bot: Bot, state: FSM, rSession: RS, my_user):
async def user_command_inline(message: Message, bot: Bot, state: FSM, aSession: AS, my_user):
await state.clear()
await message.answer("Click command - /inline", reply_markup=menu_finl(message.from_user.id))
+1 -1
View File
@@ -5,7 +5,7 @@ import aiohttp
# Асинхронная сессия для запросов
class RequestsSession:
class AsyncSession:
def __init__(self) -> None:
self._session: Optional[aiohttp.ClientSession] = None
-5
View File
@@ -51,7 +51,6 @@ def add_userx(user_id, user_login, user_name, user_surname, user_fullname):
"(user_id, user_login, user_name, user_surname, user_fullname, user_date, user_unix) "
"VALUES (?, ?, ?, ?, ?, ?, ?)",
[user_id, user_login, user_name, user_surname, user_fullname, get_date(), get_unix()])
con.commit()
# Получение пользователя
@@ -88,7 +87,6 @@ def update_userx(user_id, **kwargs):
sql, parameters = update_format_with_args(sql, kwargs)
parameters.append(user_id)
con.execute(sql + "WHERE user_id = ?", parameters)
con.commit()
# Удаление пользователя
@@ -98,7 +96,6 @@ def delete_userx(**kwargs):
sql = "DELETE FROM storage_users"
sql, parameters = update_format_args(sql, kwargs)
con.execute(sql, parameters)
con.commit()
######################################## СОЗДАНИЕ БАЗЫ ДАННЫХ ######################################
@@ -121,5 +118,3 @@ def create_dbx():
"user_date TIMESTAMP,"
"user_unix INTEGER)")
print("DB was not found(1/1) | Creating...")
con.commit()
+17
View File
@@ -70,6 +70,23 @@ async def smart_send(bot: Bot, message: types.Message, user_id, text_add=None, r
######################################## ПРОЧЕЕ ########################################
# Удаление отступов у текста
def ded(get_text: str):
if get_text is not None:
split_text = get_text.split("\n")
if split_text[0] == "": split_text.pop(0)
if split_text[-1] == "": split_text.pop(-1)
save_text = []
for text in split_text:
while text.startswith(" "):
text = text[1:]
save_text.append(text)
get_text = "\n".join(save_text)
return get_text
# Очистка HTML тэгов
def clear_html(get_text: str):
if get_text is not None:
+1 -1
View File
@@ -1,5 +1,5 @@
# - *- coding: utf- 8 - *-
from aiogram.dispatcher.filters import BaseFilter
from aiogram.filters import BaseFilter
from aiogram.types import Message
from tgbot.data.config import get_admins
+3 -6
View File
@@ -1,10 +1,7 @@
# - *- coding: utf- 8 - *-
from textwrap import dedent
from aiogram.fsm.context import FSMContext
from aiogram.dispatcher.fsm.context import FSMContext
from tgbot.services.api_session import AsyncSession
from tgbot.services.api_session import RequestsSession
ded = dedent
FSM = FSMContext
RS = RequestsSession
AS = AsyncSession
+2 -2
View File
@@ -2,13 +2,13 @@
from aiogram import Bot
from aiogram.types import FSInputFile
from tgbot.data.config import get_admins, PATH_DATABASE
from tgbot.data.config import get_admins, PATH_DATABASE, start_status
from tgbot.utils.const_functions import get_date, send_admins
# Выполнение функции после запуска бота (рассылка админам о запуске бота)
async def startup_notify(bot: Bot):
if len(get_admins()) >= 1:
if len(get_admins()) >= 1 and start_status:
await send_admins(bot, "<b>✅ Бот был запущен</b>")