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.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()
|
||||
|
||||
|
||||
|
||||
@@ -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():
|
||||
|
||||
@@ -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())
|
||||
|
||||
@@ -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}"
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -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"
|
||||
await send_admins(
|
||||
bot,
|
||||
f"<b>❌ Ошибка\n\n"
|
||||
f"<b>Exception: <code>{exception}</code>\n\n"
|
||||
f"Update: <code>{update.dict()}</code></b>")
|
||||
f"Update: <code>{update.dict()}</code></b>"
|
||||
)
|
||||
|
||||
bot_logger.exception(
|
||||
f"Exception: {exception}\n"
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -5,7 +5,7 @@ import aiohttp
|
||||
|
||||
|
||||
# Асинхронная сессия для запросов
|
||||
class RequestsSession:
|
||||
class AsyncSession:
|
||||
def __init__(self) -> None:
|
||||
self._session: Optional[aiohttp.ClientSession] = None
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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,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
|
||||
|
||||
@@ -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,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>")
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user