Merge pull request #2 from Whyverum/origin

Origin
This commit was merged in pull request #2.
This commit is contained in:
Whyverum
2024-12-23 22:17:17 +07:00
committed by GitHub
65 changed files with 863 additions and 705 deletions

14
.gitignore vendored
View File

@@ -3,12 +3,12 @@
# Игнорирование локального окружения и его файлов # Игнорирование локального окружения и его файлов
.venv
.env .env
.venv/
# Игнорирование пользовательских конфигураций IDE # Игнорирование пользовательских конфигураций IDE
/.idea .idea
*.iml *.iml
@@ -18,8 +18,8 @@ Thumbs.db
# Игнорирование директории сборки # Игнорирование директории сборки
/build/ build/
/dist/ dist/
# Игнорирование всех скачанных данных логирования # Игнорирование всех скачанных данных логирования
@@ -32,9 +32,9 @@ BotLogs/
# Игнорирование установщика проекта # Игнорирование установщика проекта
/Test/project_clone.bat Test/project_clone.bat
# Игнорирование базы данных пользователя # Игнорирование базы данных пользователя
/MySQL/user_data.db MySQL/user_data.db
/MySQL/user_data.json MySQL/user_data.json

View File

@@ -1,2 +1,4 @@
# BotCode/inline/__init__.py
# Инициализация пакета inline, для инлайн сообщений через @user
from .posts_inline import * from .posts_inline import *

View File

@@ -1,7 +1,6 @@
# BotCode/routers/inline/posts_inline.py # BotCode/routers/inline/posts_inline.py
# Создание красивых постов по вкусу (в разработке) # Создание красивых постов по вкусу (в разработке)
import hashlib
import uuid import uuid
from aiogram import Router, types from aiogram import Router, types

View File

@@ -1,5 +1,5 @@
# BotCode/keyboards/__init__.py # BotCode/keyboards/inline_kb/__init__.py
# Инициализация пакета keyboards, для работы с клавиатурами # Инициализация пакета inline_keyboards, для работы с инлайн клавиатурами
from aiogram import Router from aiogram import Router
from .actor_kb import * from .actor_kb import *
@@ -8,7 +8,3 @@ from .randnum_kb import *
# Объявление роутера и настройка экспорта модулей # Объявление роутера и настройка экспорта модулей
__all__ = ("router", "actor_kb", "ButtonInl") __all__ = ("router", "actor_kb", "ButtonInl")
router = Router(name="inline_kb_router") router = Router(name="inline_kb_router")
# Список подключаемых роутеров сверху-вниз
# router.include_routers()

View File

@@ -1,8 +1,8 @@
# BotCode/keyboards/start_kb.py # BotCode/keyboards/inline_kb/actor_kb.py
# Создания клавиатуры на команду: /start # Создания инлайн-клавиатуры на команду: /actor
from aiogram import Router from aiogram import Router
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton from aiogram.types import InlineKeyboardMarkup
from aiogram.utils.keyboard import InlineKeyboardBuilder from aiogram.utils.keyboard import InlineKeyboardBuilder
# Создание роутера и настройка экспорта # Создание роутера и настройка экспорта

View File

@@ -1,8 +1,8 @@
# BotCode/keyboards/start_kb.py # BotCode/keyboards/inline_kb/randnum_kb.py
# Создания клавиатуры на команду: /start # Создания инлайн-клавиатуры на команду: /randnum
from aiogram import Router from aiogram import Router
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton from aiogram.types import InlineKeyboardMarkup
from aiogram.utils.keyboard import InlineKeyboardBuilder from aiogram.utils.keyboard import InlineKeyboardBuilder
# Создание роутера и настройка экспорта # Создание роутера и настройка экспорта

View File

@@ -1,5 +1,5 @@
# BotCode/keyboards/__init__.py # BotCode/keyboards/reply_kb/__init__.py
# Инициализация пакета keyboards, для работы с клавиатурами # Инициализация пакета reply_kb, для работы с клавиатурами
from aiogram import Router from aiogram import Router
from .start_kb import router as start_kb_router from .start_kb import router as start_kb_router

View File

@@ -1,4 +1,4 @@
# BotCode/keyboards/help_kb.py # BotCode/keyboards/reply_kb/help_kb.py
# Создание клавиатуры для сообщения: "Помогите!" # Создание клавиатуры для сообщения: "Помогите!"
from aiogram import Router, F from aiogram import Router, F
@@ -22,15 +22,6 @@ def get_help_kb() -> ReplyKeyboardMarkup:
] ]
buttons_row = [KeyboardButton(text=num) for num in numbers] buttons_row = [KeyboardButton(text=num) for num in numbers]
# Один из способов создания клавиатур
#
# markup = ReplyKeyboardMarkup(
# keyboard=[buttons_row],
# resize_keyboard=True,
# )
# return markup
builder = ReplyKeyboardBuilder() builder = ReplyKeyboardBuilder()
for num in numbers: for num in numbers:
builder.button(text=num) builder.button(text=num)

View File

@@ -1,4 +1,4 @@
# BotCode/keyboards/more_kb.py # BotCode/keyboards/reply_kb/more_kb.py
# Создания клавиатуры на команду: /more # Создания клавиатуры на команду: /more
from aiogram import Router from aiogram import Router

View File

@@ -1,4 +1,4 @@
# BotCode/keyboards/start_kb.py # BotCode/keyboards/reply_kb/start_kb.py
# Создания клавиатуры на команду: /start # Создания клавиатуры на команду: /start
from aiogram import Router from aiogram import Router

View File

@@ -1,6 +1,5 @@
# BotCode/routers/__init__.py # BotCode/routers/__init__.py
# Инициализация пакета routers, для работы с асинхронными обработчиками # Инициализация пакета routers, для работы с асинхронными обработчиками
# Пакет старых файлов отключен!!
from aiogram import Router from aiogram import Router
from .callback_handlers import router as callback_handlers_router from .callback_handlers import router as callback_handlers_router

View File

@@ -7,6 +7,9 @@ from BotLibrary import *
# Создание роутера и настройка экспорта модулей # Создание роутера и настройка экспорта модулей
__all__ = ("router",) __all__ = ("router",)
from routers.msg_default import msg_default
router = Router(name="secret_message_router") router = Router(name="secret_message_router")
log_type = "Admin" log_type = "Admin"
@@ -16,12 +19,13 @@ keywords = ["secret", "секрет", "ыускуе", "ctrhtn",
# Обработчик команды /secret или сообщений с текстом из списка keywords # Обработчик команды /secret или сообщений с текстом из списка keywords
@router.message(F.from_user.id.in_(ListId.important_ids), @router.message(F.from_user.id.func(lambda user_id: str(user_id) in DataID.important.keys()),
Command(*keywords, prefix=BotEdit.prefixs, ignore_case=True)) Command(*keywords, prefix=BotVariables.prefixs, ignore_case=True))
@router.message(F.from_user.id.in_(ListId.important_ids), F.text.lower().in_(keywords)) @router.message(F.from_user.id.func(lambda user_id: str(user_id) in DataID.important.keys()),
F.text.lower().in_(keywords))
async def secret_admin_message(message: types.Message): async def secret_admin_message(message: types.Message):
text = f"Привет, <b>важная персона</b>!" text = f"Привет, <b>важная персона</b>!"
await message.reply(text) await message.reply(text)
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)

View File

@@ -1,14 +1,13 @@
# BotCode/routers/administration/easteggs_handlers.py # BotCode/routers/administration/easteggs_handlers.py
# Функции с шуточными пасхалками (разобраться с логированием и ошибками) # Небольшие шуточные пасхалки
from aiogram import Router, types, F from aiogram import Router, types, F
from aiogram.enums import ChatAction from aiogram.enums import ChatAction
from BotLibrary import * from BotLibrary import *
from routers.msg_default import msg_default
# Создание роутера и настройка экспорта # Создание роутера и настройка экспорта
__all__ = ("router", "secret_admin_message_finaki", "secret_admin_message_lostik", __all__ = ("router",)
"secret_admin_message_rishkus", "secret_admin_message_finik", "secret_admin_message_skodavano",)
router = Router(name="easteggs_router") router = Router(name="easteggs_router")
log_type = "EastEggs" log_type = "EastEggs"
@@ -27,7 +26,7 @@ async def secret_admin_message_finaki(message: types.Message):
# Отправка фотографии # Отправка фотографии
try: try:
await message.reply_photo( await message.reply_photo(
photo=types.FSInputFile(path=f"{ImportantPath.bot_personal_media}/{ImportantPath.photo}/Undertale.jpg"), photo=types.FSInputFile(path=f"{ProjectPath.personal_media}/{ProjectPath.personal_photo}/Undertale.jpg"),
caption="ОНА МЕНЯ ЗАСТАВИЛА ПОМОГИТЕ😭... (Кст @fin_aki любит анал, тс..)", caption="ОНА МЕНЯ ЗАСТАВИЛА ПОМОГИТЕ😭... (Кст @fin_aki любит анал, тс..)",
) )
@@ -38,11 +37,12 @@ async def secret_admin_message_finaki(message: types.Message):
# Дополнительное логирование # Дополнительное логирование
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Хэндлер на текст финикх # Хэндлер на текст финикх
@router.message(F.from_user.id.in_(ListId.important_ids), F.text.lower() == "финикх") @router.message(F.from_user.id.func(lambda user_id: str(user_id) in DataID.important.keys()),
F.text.lower() == "финикх")
async def secret_admin_message_finik(message: types.Message): async def secret_admin_message_finik(message: types.Message):
text = f"Пасхалка 2 финикx найдена!" text = f"Пасхалка 2 финикx найдена!"
await message.bot.send_chat_action( await message.bot.send_chat_action(
@@ -53,7 +53,7 @@ async def secret_admin_message_finik(message: types.Message):
photo="https://vos-mo.ru/upload/iblock/329/g0s939ge8o1n8xp7rcqnw9kkz9mcfrg2/risunok.jpg", photo="https://vos-mo.ru/upload/iblock/329/g0s939ge8o1n8xp7rcqnw9kkz9mcfrg2/risunok.jpg",
caption="Привет, это польза Фиников!") caption="Привет, это польза Фиников!")
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Хэндлер на текст андертейлкино # Хэндлер на текст андертейлкино
@@ -68,7 +68,7 @@ async def secret_admin_message_finik(message: types.Message):
photo="https://i.ytimg.com/vi/c-o4_p4YKIc/mqdefault.jpg", photo="https://i.ytimg.com/vi/c-o4_p4YKIc/mqdefault.jpg",
caption="Меня заставила Финаки, честно!") caption="Меня заставила Финаки, честно!")
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Хэндлер на текст ришкус + отправка с локального хранилища # Хэндлер на текст ришкус + отправка с локального хранилища
@@ -80,11 +80,11 @@ async def secret_admin_message_rishkus(message: types.Message):
action=ChatAction.UPLOAD_PHOTO, action=ChatAction.UPLOAD_PHOTO,
) )
await message.reply_photo( await message.reply_photo(
photo=types.FSInputFile(path=f"{ImportantPath.bot_personal_media}/{ImportantPath.photo}/Кусь.jpg"), photo=types.FSInputFile(path=f"{ProjectPath.personal_media}/{ProjectPath.personal_photo}/Кусь.jpg"),
caption="Россия для грустных", caption="Россия для грустных",
) )
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Хэндлер на текст skodavano + отправка с локального хранилища # Хэндлер на текст skodavano + отправка с локального хранилища
@@ -96,11 +96,11 @@ async def secret_admin_message_skodavano(message: types.Message):
action=ChatAction.UPLOAD_PHOTO, action=ChatAction.UPLOAD_PHOTO,
) )
await message.reply_photo( await message.reply_photo(
photo=types.FSInputFile(path=f"{ImportantPath.bot_personal_media}/{ImportantPath.photo}/Vano.jpg"), photo=types.FSInputFile(path=f"{ProjectPath.personal_media}/{ProjectPath.personal_photo}/Vano.jpg"),
caption="SkodaRacingVano24 -> Синяя изолента", caption="SkodaRacingVano24 -> Синяя изолента",
) )
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Хэндлер на текст лостикслешик + отправка с локального хранилища # Хэндлер на текст лостикслешик + отправка с локального хранилища
@@ -117,12 +117,13 @@ async def secret_admin_message_lostik(message: types.Message):
# Вывод сообщения-гифки пользователю # Вывод сообщения-гифки пользователю
await message.reply_animation( await message.reply_animation(
animation=types.FSInputFile(path=f"{ImportantPath.bot_personal_media}/{ImportantPath.gif}/ЛжеРайяПрайм.mp4") animation=types.FSInputFile(path=f"{ProjectPath.personal_media}"
f"/{ProjectPath.personal_gif}/ЛжеРайяПрайм.mp4")
) )
# Активация логгера # Активация логгера
await cmd_logginger(message, types_message, text) await cmd_logginger(message, types_message, text)
return text await msg_default(message)
# Проверка на ошибку и ее логирование # Проверка на ошибку и ее логирование
except Exception as e: except Exception as e:
@@ -159,7 +160,7 @@ async def secret_admin_message_finaki(message: types.Message):
# Дополнительное логирование # Дополнительное логирование
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Хэндлер на текст маз # Хэндлер на текст маз
@@ -189,5 +190,4 @@ async def secret_admin_message_finaki(message: types.Message):
# Дополнительное логирование # Дополнительное логирование
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)

View File

@@ -1,11 +1,15 @@
from aiogram import Router # BotCode/routers/callback_handlers/__init__.py
# Инициализация пакета callback_handlers, для работы с запросами бота
from aiogram import Router
from .actor_kb_cb import router as actor_kb_cb_router from .actor_kb_cb import router as actor_kb_cb_router
from .randnum_kb_cb import router as randnum_kb_cb_router from .randnum_kb_cb import router as randnum_kb_cb_router
# Объявление роутера и настройка экспорта модулей
__all__ = ("router", ) __all__ = ("router", )
router = Router(name="callback_handlers") router = Router(name="callback_handlers")
# Список подключаемых роутеров сверху-вниз # Список подключаемых роутеров сверху-вниз
router.include_routers( router.include_routers(
actor_kb_cb_router, actor_kb_cb_router,

View File

@@ -1,11 +1,17 @@
from random import randint # BotCode/routers/callback_handlers/actor_kb_cb.py
# Обработчик запросов в команде /actor
from random import randint
from aiogram import Router, F from aiogram import Router, F
from aiogram.types import CallbackQuery from aiogram.types import CallbackQuery
from keyboards.inline_kb.actor_kb import ButtonInl from keyboards.inline_kb.actor_kb import ButtonInl
# Создание роутера и настройка экспорта модулей
__all__ = ("router",)
router = Router(name="actor_kb_cb_router") router = Router(name="actor_kb_cb_router")
# Тестирование реферальных ссылок
@router.callback_query(F.data == ButtonInl.random_site_cbd) @router.callback_query(F.data == ButtonInl.random_site_cbd)
async def random_site_cb(callback_query: CallbackQuery): async def random_site_cb(callback_query: CallbackQuery):
bot_me = await callback_query.bot.me() bot_me = await callback_query.bot.me()
@@ -14,6 +20,7 @@ async def random_site_cb(callback_query: CallbackQuery):
) )
# Тестирование уведомления для пользователя
@router.callback_query(F.data == ButtonInl.random_num_dice_cbd) @router.callback_query(F.data == ButtonInl.random_num_dice_cbd)
async def random_num_dice_cb(callback_query: CallbackQuery): async def random_num_dice_cb(callback_query: CallbackQuery):
await callback_query.answer( await callback_query.answer(
@@ -22,6 +29,7 @@ async def random_num_dice_cb(callback_query: CallbackQuery):
) )
# Тестирование модального окна для пользователя
@router.callback_query(F.data == ButtonInl.random_num_modal_cdb) @router.callback_query(F.data == ButtonInl.random_num_modal_cdb)
async def random_num_dice_modal_cb(callback_query: CallbackQuery): async def random_num_dice_modal_cb(callback_query: CallbackQuery):
await callback_query.answer( await callback_query.answer(

View File

@@ -1,11 +1,17 @@
from random import randint # BotCode/routers/callback_handlers/randnum_kb_cb.py
# Обработчик запросов в команде /randnum
from random import randint
from aiogram import Router, F from aiogram import Router, F
from aiogram.types import CallbackQuery from aiogram.types import CallbackQuery
from keyboards.inline_kb.randnum_kb import ButtonInl, get_randnum_kb from keyboards.inline_kb.randnum_kb import ButtonInl, get_randnum_kb
# Создание роутера и настройка экспорта модулей
__all__ = ("router",)
router = Router(name="randnum_kb_cb_router") router = Router(name="randnum_kb_cb_router")
# Тестирование редактирования сообщения
@router.callback_query(F.data == ButtonInl.mark_cbd) @router.callback_query(F.data == ButtonInl.mark_cbd)
async def random_site_cb(callback_query: CallbackQuery): async def random_site_cb(callback_query: CallbackQuery):
await callback_query.answer() await callback_query.answer()

View File

@@ -6,10 +6,10 @@ from aiogram import Router, types, F
from aiogram.filters import Command from aiogram.filters import Command
from BotLibrary import * from BotLibrary import *
from .user_cmd.start_cmd import log_type as start_cmd_text from .user_cmd.start_cmd import description as start_description, log_type as start_cmd
from .user_cmd.help_cmd import log_type as help_cmd_text from .user_cmd.help_cmd import description as help_description, log_type as help_cmd
from .user_cmd.exit_cmd import log_type as exit_cmd_text from .user_cmd.exit_cmd import description as exit_description, log_type as exit_cmd
from .user_cmd.start_time_cmd import log_type as start_time_cmd_text from .user_cmd.start_time_cmd import description as start_time_description,log_type as start_time_cmd
# Создание роутера и настройка экспорта модулей # Создание роутера и настройка экспорта модулей
@@ -23,16 +23,15 @@ secret_keywords = ["setcommands", "setcommand", "ыуесщььфтвы", "ыу
# Хэндлер на команду /setcommands для использования в чате # Хэндлер на команду /setcommands для использования в чате
@router.message(F.from_user.id.in_(ListId.important_ids), @router.message(F.from_user.id.func(lambda user_id: str(user_id) in DataID.important.keys()),
Command(*secret_keywords, prefix=BotEdit.prefixs, ignore_case=True)) Command(*secret_keywords, prefix=BotVariables.prefixs, ignore_case=True))
@router.message(F.from_user.id.func(lambda user_id: str(user_id) in DataID.important.keys()),
F.text.lower().in_(secret_keywords))
async def set_commands(): async def set_commands():
bot_commands = [ bot_commands = [
types.BotCommand(command=start_cmd_text.lower(), description="Запустить бота"), types.BotCommand(command=start_cmd.lower(), description=start_description),
types.BotCommand(command=help_cmd_text.lower(), description="Получить помощь"), types.BotCommand(command=help_cmd.lower(), description=help_description),
types.BotCommand(command=help_cmd_text.lower(), description="Получить помощь"), types.BotCommand(command=start_time_cmd.lower(), description=start_time_description),
types.BotCommand(command=start_time_cmd_text.lower(), description="Время запуска"), types.BotCommand(command=exit_cmd.lower(), description=exit_description),
types.BotCommand(command=exit_cmd_text.lower(), description="Выйти из чата (в разработке)"),
types.BotCommand(command="command", description="Пустая команда"),
] ]
await bot.set_my_commands(bot_commands) await bot.set_my_commands(bot_commands)
return bot_commands

View File

@@ -5,11 +5,13 @@ from aiogram import Router, types, F
from aiogram.filters import Command from aiogram.filters import Command
from BotLibrary import * from BotLibrary import *
from keyboards.inline_kb.actor_kb import get_actor_kb from keyboards.inline_kb.actor_kb import get_actor_kb
from routers.msg_default import *
# Создание роутера и настройка экспорта модулей # Создание роутера, переменных и настройка экспорта модулей
__all__ = ("router", "cmd_actor", "log_type",) __all__ = ("router", "cmd_actor", "log_type",)
router = Router(name="actor_router") router = Router(name="actor_router")
log_type = "Actor" log_type = "Actor"
description = "Описание"
# Список ключевых слов для команды # Список ключевых слов для команды
@@ -17,7 +19,7 @@ keywords = ["actor", "фсещк",]
# Обработчик команды /actor # Обработчик команды /actor
@router.message(Command(*keywords, prefix=BotEdit.prefixs, ignore_case=True)) @router.message(Command(*keywords, prefix=BotVariables.prefixs, ignore_case=True))
@router.message(F.text.lower().in_(keywords)) @router.message(F.text.lower().in_(keywords))
async def cmd_actor(message: types.Message): async def cmd_actor(message: types.Message):
try: try:
@@ -33,7 +35,7 @@ async def cmd_actor(message: types.Message):
# Активация логгера # Активация логгера
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Проверка на ошибку и ее логирование # Проверка на ошибку и ее логирование
except Exception as e: except Exception as e:

View File

@@ -4,18 +4,20 @@
from aiogram import Router, types, F from aiogram import Router, types, F
from aiogram.filters import Command from aiogram.filters import Command
from BotLibrary import * from BotLibrary import *
from routers.msg_default import msg_default
# Создание роутера и экспорта модулей # Создание роутера, переменных и экспорта модулей
__all__ = ("router", "exit_cmd", "log_type",) __all__ = ("router", "exit_cmd", "log_type", "description")
router = Router(name="exit_router") router = Router(name="exit_router")
log_type = "Exit" log_type = "Exit"
description = "Выйти из чата (в разработке)"
# Список ключевых слов для команды # Список ключевых слов для команды
keywords = ["выход", "ds[j;", "exit", "учше",] keywords = ["выход", "ds[j;", "exit", "учше",]
# Обработчик команды /exit # Обработчик команды /exit
@router.message(Command(*keywords, prefix=BotEdit.prefixs, ignore_case=True)) @router.message(Command(*keywords, prefix=BotVariables.prefixs, ignore_case=True))
@router.message(F.text.lower().in_(keywords)) @router.message(F.text.lower().in_(keywords))
async def exit_cmd(message: types.Message): async def exit_cmd(message: types.Message):
try: try:
@@ -26,7 +28,7 @@ async def exit_cmd(message: types.Message):
# Активация логгера # Активация логгера
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Проверка на ошибку и ее логирование # Проверка на ошибку и ее логирование
except Exception as e: except Exception as e:

View File

@@ -5,11 +5,13 @@ from aiogram import Router, types, F
from aiogram.filters import Command from aiogram.filters import Command
from BotLibrary import * from BotLibrary import *
from keyboards.reply_kb.help_kb import get_help_kb from keyboards.reply_kb.help_kb import get_help_kb
from routers.msg_default import msg_default
# Создание роутера и экспорта модулей # Создание роутера, переменных и экспорта модулей
__all__ = ("router", "cmd_help", "log_type",) __all__ = ("router", "cmd_help", "log_type", "description")
router = Router(name="help_router") router = Router(name="help_router")
log_type = "Help" log_type = "Help"
description = "Получить помощь"
# Список ключевых слов для команды # Список ключевых слов для команды
keywords = ["help", "info", "помощь", "инфо", "?", "информация", "рудз", "штащ", "byaj", keywords = ["help", "info", "помощь", "инфо", "?", "информация", "рудз", "штащ", "byaj",
@@ -17,7 +19,7 @@ keywords = ["help", "info", "помощь", "инфо", "?", "информаци
# Хэндлер на команду /info или /help # Хэндлер на команду /info или /help
@router.message(Command(*keywords, prefix=BotEdit.prefixs, ignore_case=True)) @router.message(Command(*keywords, prefix=BotVariables.prefixs, ignore_case=True))
@router.message(F.text.lower().in_(keywords)) @router.message(F.text.lower().in_(keywords))
async def cmd_help(message: types.Message): async def cmd_help(message: types.Message):
try: try:
@@ -28,7 +30,7 @@ async def cmd_help(message: types.Message):
# Активация логгера # Активация логгера
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Проверка на ошибку и ее логирование # Проверка на ошибку и ее логирование
except Exception as e: except Exception as e:

View File

@@ -5,18 +5,20 @@ from aiogram import Router, types, F
from aiogram.filters import Command from aiogram.filters import Command
from BotLibrary import * from BotLibrary import *
from keyboards.reply_kb.more_kb import get_more_kb from keyboards.reply_kb.more_kb import get_more_kb
from routers.msg_default import msg_default
# Создание роутера и экспорта модулей # Создание роутера, переменных и экспорта модулей
__all__ = ("router", "cmd_start", "log_type",) __all__ = ("router", "cmd_start", "log_type",)
router = Router(name="more_router") router = Router(name="more_router")
log_type = "More" log_type = "More"
description = "Описание"
# Список ключевых слов для команды # Список ключевых слов для команды
keywords = ["more", "ьщку",] keywords = ["more", "ьщку",]
# Обработчик команды /more # Обработчик команды /more
@router.message(Command(*keywords, prefix=BotEdit.prefixs, ignore_case=True)) @router.message(Command(*keywords, prefix=BotVariables.prefixs, ignore_case=True))
@router.message(F.text.lower().in_(keywords)) @router.message(F.text.lower().in_(keywords))
async def cmd_start(message: types.Message): async def cmd_start(message: types.Message):
try: try:
@@ -26,7 +28,7 @@ async def cmd_start(message: types.Message):
# Активация логгера # Активация логгера
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Проверка на ошибку и ее логирование # Проверка на ошибку и ее логирование
except Exception as e: except Exception as e:

View File

@@ -5,18 +5,20 @@ from aiogram import Router, types, F
from aiogram.filters import Command from aiogram.filters import Command
from BotLibrary import * from BotLibrary import *
from keyboards.inline_kb.randnum_kb import get_randnum_kb from keyboards.inline_kb.randnum_kb import get_randnum_kb
from routers.msg_default import msg_default
# Создание роутера и экспорта модулей # Создание роутера, переменных и экспорта модулей
__all__ = ("router", "cmd_randnum", "log_type",) __all__ = ("router", "cmd_randnum", "log_type",)
router = Router(name="randnum_router") router = Router(name="randnum_router")
log_type = "Randnum" log_type = "Randnum"
description = "Описание"
# Список ключевых слов для команды # Список ключевых слов для команды
keywords = ["кфтвтгь", "randnum",] keywords = ["кфтвтгь", "randnum",]
# Хэндлер на команду /randnum # Хэндлер на команду /randnum
@router.message(Command(*keywords, prefix=BotEdit.prefixs, ignore_case=True)) @router.message(Command(*keywords, prefix=BotVariables.prefixs, ignore_case=True))
@router.message(F.text.lower().in_(keywords)) @router.message(F.text.lower().in_(keywords))
async def cmd_randnum(message: types.Message): async def cmd_randnum(message: types.Message):
text = "Работа с рандомом оценок!" text = "Работа с рандомом оценок!"
@@ -27,4 +29,4 @@ async def cmd_randnum(message: types.Message):
# Активация логгера # Активация логгера
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)

View File

@@ -5,11 +5,13 @@ from aiogram import Router, types, F
from aiogram.filters import Command, CommandStart from aiogram.filters import Command, CommandStart
from BotLibrary import * from BotLibrary import *
from keyboards.reply_kb.start_kb import get_start_kb from keyboards.reply_kb.start_kb import get_start_kb
from routers.msg_default import msg_default
# Создание роутера и настройка экспорта модулей # Создание роутера, переменных и настройка экспорта модулей
__all__ = ("router", "cmd_start", "log_type",) __all__ = ("router", "cmd_start", "log_type", "description")
router = Router(name="start_router") router = Router(name="start_router")
log_type = "Start" log_type = "Start"
description = "Запустить бота"
# Список ключевых слов для команды # Список ключевых слов для команды
keywords = ["start", "старт", "запуск", "пуск", "on", "вкл", "с", "s", "ы", keywords = ["start", "старт", "запуск", "пуск", "on", "вкл", "с", "s", "ы",
@@ -17,7 +19,7 @@ keywords = ["start", "старт", "запуск", "пуск", "on", "вкл", "
# Обработчик команды /start # Обработчик команды /start
@router.message(Command(*keywords, prefix=BotEdit.prefixs, ignore_case=True)) @router.message(Command(*keywords, prefix=BotVariables.prefixs, ignore_case=True))
@router.message(F.text.lower().in_(keywords)) @router.message(F.text.lower().in_(keywords))
@router.message(CommandStart()) @router.message(CommandStart())
async def cmd_start(message: types.Message): async def cmd_start(message: types.Message):
@@ -30,7 +32,7 @@ async def cmd_start(message: types.Message):
# Активация логгера # Активация логгера
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Проверка на ошибку и ее логирование # Проверка на ошибку и ее логирование
except Exception as e: except Exception as e:

View File

@@ -4,11 +4,13 @@
from aiogram import Router, types, F from aiogram import Router, types, F
from aiogram.filters import Command from aiogram.filters import Command
from BotLibrary import * from BotLibrary import *
from routers.msg_default import msg_default
# Создание роутера и настройка экспорта модулей # Создание роутера, переменных и настройка экспорта модулей
__all__ = ("router", "start_time", "log_type",) __all__ = ("router", "start_time", "log_type", "description")
router = Router(name="start_time_router") router = Router(name="start_time_router")
log_type = "Start_Time" log_type = "Start_Time"
description = "Время запуска"
# Список ключевых слов для команды # Список ключевых слов для команды
start_time_keywords = ["start_time", "stime", "старт_время", "время_старта", "сремя", start_time_keywords = ["start_time", "stime", "старт_время", "время_старта", "сремя",
@@ -17,7 +19,7 @@ start_time_keywords = ["start_time", "stime", "старт_время", "врем
# Хэндлер на команду /start_time # Хэндлер на команду /start_time
@router.message(Command(*start_time_keywords, prefix=BotEdit.prefixs, ignore_case=True)) @router.message(Command(*start_time_keywords, prefix=BotVariables.prefixs, ignore_case=True))
@router.message(F.text.lower().in_(start_time_keywords)) @router.message(F.text.lower().in_(start_time_keywords))
async def start_time(message: types.Message, started_at: str, started_at_msk: str): async def start_time(message: types.Message, started_at: str, started_at_msk: str):
try: try:
@@ -29,7 +31,7 @@ async def start_time(message: types.Message, started_at: str, started_at_msk: st
# Активация логгера # Активация логгера
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Проверка на ошибку и ее логирование # Проверка на ошибку и ее логирование
except Exception as e: except Exception as e:

View File

@@ -4,22 +4,19 @@
from BotLibrary import * from BotLibrary import *
from aiogram import Router, types from aiogram import Router, types
from routers.msg_default import *
from ..downloads.download_avatar_all import download_avatar
# Настройка экспорта модулей и роутера # Настройка экспорта модулей и роутера
__all__ = ("router",) __all__ = ("router",)
router = Router(name="common_message_router") router = Router(name="common_message_router")
log_type = "Messages"
# Хэндлер на все сообщения и записывает данные # Хэндлер на все сообщения и записывает данные
@router.message() @router.message()
async def handle_all_messages(message: types.Message): async def handle_all_messages(message: types.Message):
log_type = "Messages" user_name = find_imp_id(message.from_user.id)
name = find_chat_id(message)
message_type = types_message(message) message_type = types_message(message)
await logginger(message) await common_msg_logginger(message, user_name, message_type, log_type)
await download_avatar(message) await msg_default(message)
await common_msg_logginger(message, name, message_type, log_type)
return f"Получено новое сообщение!"

View File

@@ -1,11 +1,16 @@
# BotCode/routers/common/phrase.py
# Обработчик особых команд
from aiogram import Router, types, F from aiogram import Router, types, F
from aiogram.types import ReplyKeyboardRemove from aiogram.types import ReplyKeyboardRemove
from BotLibrary import find_chat_id, types_message, common_msg_logginger from routers.msg_default import *
from BotLibrary import find_imp_id, types_message, common_msg_logginger
from keyboards.reply_kb.start_kb import ButtonText from keyboards.reply_kb.start_kb import ButtonText
# Настройка экспорта модулей и роутера # Настройка экспорта модулей и роутера
__all__ = ("router",) __all__ = ("router",)
router = Router(name="phrase_message_router") router = Router(name="phrase_message_router")
@@ -14,7 +19,7 @@ router = Router(name="phrase_message_router")
async def hello_message(message: types.Message): async def hello_message(message: types.Message):
log_type = "Start_Button" log_type = "Start_Button"
text_message = f"Привет, я бот. А ты кто?" text_message = f"Привет, я бот. А ты кто?"
name = find_chat_id(message) name = find_imp_id(message.from_user.id)
message_type = types_message(message) message_type = types_message(message)
await message.reply( await message.reply(
@@ -22,8 +27,7 @@ async def hello_message(message: types.Message):
) )
await common_msg_logginger(message, name, message_type, log_type) await common_msg_logginger(message, name, message_type, log_type)
return text_message await msg_default(message)
# Ответ бота на кнопку или сообщение: "Помощь!" # Ответ бота на кнопку или сообщение: "Помощь!"
@@ -31,7 +35,7 @@ async def hello_message(message: types.Message):
async def help_message(message: types.Message): async def help_message(message: types.Message):
log_type = "Help_Button" log_type = "Help_Button"
text_message = f"Привет, я надеюсь помогу тебе... Лучше напиши /help.." text_message = f"Привет, я надеюсь помогу тебе... Лучше напиши /help.."
name = find_chat_id(message) name = find_imp_id(message.from_user.id)
message_type = types_message(message) message_type = types_message(message)
await message.reply( await message.reply(
@@ -39,7 +43,7 @@ async def help_message(message: types.Message):
) )
await common_msg_logginger(message, name, message_type, log_type) await common_msg_logginger(message, name, message_type, log_type)
return text_message await msg_default(message)
# Ответ бота на кнопку или сообщение: "Пока-пока!" # Ответ бота на кнопку или сообщение: "Пока-пока!"
@@ -47,7 +51,7 @@ async def help_message(message: types.Message):
async def bye_message(message: types.Message): async def bye_message(message: types.Message):
log_type = "Messages" log_type = "Messages"
text_message = f"Надеюсь скоро увидимся! Захочешь поговорить нажми на /start!" text_message = f"Надеюсь скоро увидимся! Захочешь поговорить нажми на /start!"
name = find_chat_id(message) name = find_imp_id(message.from_user.id)
message_type = types_message(message) message_type = types_message(message)
await message.reply( await message.reply(
@@ -56,15 +60,15 @@ async def bye_message(message: types.Message):
) )
await common_msg_logginger(message, name, message_type, log_type) await common_msg_logginger(message, name, message_type, log_type)
return text_message await msg_default(message)
# Ответ бота на сообщение: "Кошмар" # Ответ бота на сообщение: "Кошмар"
@router.message(F.text.lower() == "кошмар") @router.message(F.text.lower() == "кошмар")
async def scary_message(message: types.Message): async def scary_message(message: types.Message):
log_type = "Messages" log_type = "Scary"
text_message = f"Кошмар, тот еще!" text_message = f"Кошмар, тот еще!"
name = find_chat_id(message) name = find_imp_id(message.from_user.id)
message_type = types_message(message) message_type = types_message(message)
await message.reply( await message.reply(
@@ -72,4 +76,4 @@ async def scary_message(message: types.Message):
) )
await common_msg_logginger(message, name, message_type, log_type) await common_msg_logginger(message, name, message_type, log_type)
return text_message await msg_default(message)

View File

@@ -3,15 +3,17 @@
from aiogram import Router from aiogram import Router
from .download_handlers import router as download_media_router from .download_handlers import router as download_media_router
from .download_user_avatar import router as user_avatar_router
from .download_avatar_all import *
from .download_chat_avatar import *
from .download_user_avatar import *
# Объявление роутера и настройка экспорта модулей # Объявление роутера и настройка экспорта модулей
__all__ = ("router",) __all__ = ("router", "download_avatar_all", "download_chat_avatar", "download_user_photos", "download_avatar")
router = Router(name="downloads_head_router") router = Router(name="downloads_head_router")
# Список подключаемых роутеров сверху-вниз # Список подключаемых роутеров сверху-вниз
router.include_routers( router.include_routers(
download_media_router, download_media_router,
user_avatar_router,
) )

View File

@@ -1,15 +1,15 @@
# BotCode/routers/downloads/download_avatar_all.py # BotCode/routers/downloads/download_avatar_all.py
# Объединение закачки аватаров всех типов # Объединение закачки аватаров всех типов
from BotLibrary import write_user_info_to_file
from .download_chat_avatar import download_chat_avatar from .download_chat_avatar import download_chat_avatar
from .download_user_avatar import download_user_photos from .download_user_avatar import download_user_photos
# Настройка экспорта модулей # Настройка экспорта модулей
__all__ = ("download_avatar",) __all__ = ("download_avatar", "download_chat_avatar", "download_user_photos")
# Функция объединения закачки аватарок # Функция объединения закачки аватарок
async def download_avatar(message): async def download_avatar(message):
await download_chat_avatar(message, message.chat) await download_chat_avatar(message)
await download_user_photos(message) await download_user_photos(message)
return f"Успешная закачка аватаров!" write_user_info_to_file(message.from_user)

View File

@@ -1,32 +1,29 @@
# BotCode/routers/downloads/download_chat_avatar.py
# Функция скачивания аватара чата
import os import os
import requests import aiohttp
from aiogram import Router
from aiogram.types import Chat
from BotLibrary import * from BotLibrary import *
# Создание роутера и настройка экспорта модулей # Создание роутера и настройка экспорта модулей
__all__ = ("router", "download_chat_avatar",) __all__ = ("download_chat_avatar",)
router = Router(name="avatar_chat_router")
log_type = "AvatarChat" log_type = "AvatarChat"
# Функция закачки аватарок чатов # Функция закачки аватарок чатов
async def download_chat_avatar(message, chat: Chat): async def download_chat_avatar(message):
try: try:
chat = message.chat
# Проверка типа чата (группа или супергруппа) # Проверка типа чата (группа или супергруппа)
if chat.type in ["group", "supergroup"]: if chat.type in ["group", "supergroup"]:
# Получаем информацию о чате (включая фото)
chat_info = await bot.get_chat(chat.id) chat_info = await bot.get_chat(chat.id)
chat_id = chat.id # Проверка на наличие фотографий чата
# Проверка наличия аватара
if not chat_info.photo: if not chat_info.photo:
text_error = f"Чат с ID {chat_id} не имеет аватара." text_error = f"Чат с ID {chat.id} не имеет аватара."
logger.bind(log_type=log_type, user=chat_id).error(text_error) logger.bind(log_type=log_type, user=chat.id).error(text_error)
return text_error return text_error
# Получаем file_id для фото (высокое качество приоритетно)
file_id = ( file_id = (
getattr(chat_info.photo, 'big_file_id', None) or getattr(chat_info.photo, 'big_file_id', None) or
getattr(chat_info.photo, 'medium_file_id', None) or getattr(chat_info.photo, 'medium_file_id', None) or
@@ -34,39 +31,41 @@ async def download_chat_avatar(message, chat: Chat):
) )
if not file_id: if not file_id:
text_error = f"Не удалось получить file_id аватара чата с ID {chat_id}." text_error = f"Не удалось получить file_id аватара чата с ID {chat.id}."
logger.bind(log_type=log_type, user=chat_id).error(text_error) logger.bind(log_type=log_type, user=chat.id).error(text_error)
return text_error return text_error
# Получаем file_info для фото
file_info = await bot.get_file(file_id) file_info = await bot.get_file(file_id)
# Строим URL для скачивания файла
file_url = f"https://api.telegram.org/file/bot{bot.token}/{file_info.file_path}" file_url = f"https://api.telegram.org/file/bot{bot.token}/{file_info.file_path}"
# Формируем путь для сохранения фото chat_id = find_imp_id(chat.id)
chat_id = find_chat_id(message) save_dir = f"{ProjectPath.chat_avatar}/{chat_id}"
save_dir = f"{ImportantPath.chat_avatar}/{chat_id}"
os.makedirs(save_dir, exist_ok=True) os.makedirs(save_dir, exist_ok=True)
file_extension = os.path.splitext(file_info.file_path)[-1] file_extension = os.path.splitext(file_info.file_path)[-1]
file_name = f"avatar{file_extension}" file_name = f"avatar{file_extension}"
save_path = os.path.join(save_dir, file_name) save_path = os.path.join(save_dir, file_name)
# Скачиваем аватар # Асинхронное скачивание
response = requests.get(file_url, stream=True) async with aiohttp.ClientSession() as session:
if response.status_code == 200: async with session.get(file_url) as response:
with open(save_path, "wb") as file: if response.status == 200:
for chunk in response.iter_content(chunk_size=8192): with open(save_path, "wb") as file:
file.write(chunk) while True:
return f"Фото аватара чата с ID {chat_id} успешно скачано." chunk = await response.content.read(8192)
if not chunk:
else: break
text_error = f"Не удалось скачать фото аватара чата с ID {chat_id}. Статус: {response.status_code}" file.write(chunk)
logger.bind(log_type=log_type, user=chat_id).error(text_error) return f"Фото аватара чата с ID {chat_id} успешно скачано."
return text_error else:
text_error = f"Не удалось скачать фото аватара чата с ID {chat_id}. Статус: {response.status}"
logger.bind(log_type=log_type, user=chat.id).error(text_error)
return text_error
else:
return
except Exception as e: except Exception as e:
chat = message.chat
text_error = f"Ошибка при скачивании фото аватара чата с ID {chat.id}: {e}" text_error = f"Ошибка при скачивании фото аватара чата с ID {chat.id}: {e}"
logger.bind(log_type=log_type, user=chat.id).exception(text_error) logger.bind(log_type=log_type, user=chat.id).error(text_error)
return text_error return text_error

View File

@@ -19,7 +19,7 @@ log_type = "Media"
async def handle_media(message: types.Message): async def handle_media(message: types.Message):
try: try:
await download_avatar(message) await download_avatar(message)
name = find_chat_id(message) name = find_imp_id(message.from_user.id)
await logginger(message) await logginger(message)
file_id = None file_id = None
@@ -28,8 +28,8 @@ async def handle_media(message: types.Message):
media = message.video if message.content_type == types.ContentType.VIDEO else message.animation media = message.video if message.content_type == types.ContentType.VIDEO else message.animation
file_extension = media.mime_type.split('/')[-1] # Получаем расширение файла (например, "mp4" или "gif") file_extension = media.mime_type.split('/')[-1] # Получаем расширение файла (например, "mp4" или "gif")
file_name = f"{media.file_id}.{file_extension}" # Используем file_id и расширение для имени file_name = f"{media.file_id}.{file_extension}" # Используем file_id и расширение для имени
save_dir = ImportantPath.video_directory if message.content_type == types.ContentType.VIDEO \ save_dir = ProjectPath.received_video if message.content_type == types.ContentType.VIDEO \
else ImportantPath.gif_directory else ProjectPath.received_gif
elif message.content_type == types.ContentType.PHOTO: elif message.content_type == types.ContentType.PHOTO:
media = message.photo media = message.photo
@@ -38,22 +38,22 @@ async def handle_media(message: types.Message):
file_info = await bot.get_file(file_id) file_info = await bot.get_file(file_id)
# Имя файла будет взято из file_path, который содержит оригинальное имя файла # Имя файла будет взято из file_path, который содержит оригинальное имя файла
file_name = file_info.file_path.split('/')[-1] # Используем имя файла из пути file_name = file_info.file_path.split('/')[-1] # Используем имя файла из пути
save_dir = ImportantPath.photo_directory save_dir = ProjectPath.received_photo
elif message.content_type == types.ContentType.VOICE: elif message.content_type == types.ContentType.VOICE:
media = message.voice media = message.voice
file_name = f"{media.file_id}.ogg" # Для голосовых сообщений используем file_id и расширение .ogg file_name = f"{media.file_id}.ogg" # Для голосовых сообщений используем file_id и расширение .ogg
save_dir = ImportantPath.voice_directory save_dir = ProjectPath.received_voice
elif message.content_type == types.ContentType.VIDEO_NOTE: elif message.content_type == types.ContentType.VIDEO_NOTE:
media = message.video_note media = message.video_note
file_name = f"{media.file_id}.mp4" # Для видеосообщений используем file_id и расширение .mp4 file_name = f"{media.file_id}.mp4" # Для видеосообщений используем file_id и расширение .mp4
save_dir = ImportantPath.videonote_directory save_dir = ProjectPath.received_videonote
elif message.content_type == types.ContentType.DOCUMENT: elif message.content_type == types.ContentType.DOCUMENT:
media = message.document media = message.document
file_name = media.file_name # Для видеосообщений используем file_id и расширение .mp4 file_name = media.file_name # Для видеосообщений используем file_id и расширение .mp4
save_dir = ImportantPath.document_directory save_dir = ProjectPath.received_document
else: else:
(logger.bind(log_type=log_type, user=message.from_user.username) (logger.bind(log_type=log_type, user=message.from_user.username)

View File

@@ -2,35 +2,31 @@
# Закачка всех аватаров пользователей # Закачка всех аватаров пользователей
import os import os
from aiogram import Router, types from aiogram import types
from aiogram.types import UserProfilePhotos from aiogram.types import UserProfilePhotos
from BotLibrary import * from BotLibrary import *
# Создание роутера и настройка экспорта модулей # Создание роутера и настройка экспорта модулей
__all__ = ("router", "download_user_photos",) __all__ = ("download_user_photos",)
router = Router(name="avatar_router")
log_type = "AvatarUser" log_type = "AvatarUser"
# Функция закачки аватарок пользователя # Функция закачки аватарок пользователя
async def download_user_photos(message: types.Message): async def download_user_photos(message: types.Message):
try: try:
# Получение ID пользователя # Проверка на наличие в списке "важных" пользователей
user_id = message.from_user.id user_id = find_imp_id(message.from_user.id)
# Получение аватарок пользователя # Получение аватарок пользователя
user_profile_photos: UserProfilePhotos = await bot.get_user_profile_photos(user_id) user_profile_photos: UserProfilePhotos = await bot.get_user_profile_photos(message.from_user.id)
# Проверка на наличие в списке "важных" пользователей
user_id = find_people_id(user_id)
# Проверка наличия фотографий # Проверка наличия фотографий
if user_profile_photos.total_count == 0: if user_profile_photos.total_count == 0:
return f"У пользователя {user_id} нет аватарок." return f"У пользователя {user_id} нет аватарок."
# Объявление пути и создание директории # Объявление пути и создание директории
user_directory = f'{ImportantPath.user_avatar}/{user_id}' user_directory = f'{ProjectPath.user_avatar}/{user_id}'
os.makedirs(user_directory, exist_ok=True) os.makedirs(user_directory, exist_ok=True)
# Закачка аватарок пользователя # Закачка аватарок пользователя

View File

@@ -0,0 +1,12 @@
# BotCode/routers/common/msg_default.py
# Небольшое облегчение для команд
from loguru import logger
from routers.downloads.download_avatar_all import download_avatar
from BotLibrary.analitics.message_to_file import write_message_to_file
from BotLibrary.analitics.user_data_to_file import write_user_info_to_file
async def msg_default(message):
await download_avatar(message)
await write_message_to_file(message)
write_user_info_to_file(message.from_user)

View File

@@ -5,4 +5,4 @@
from .analitics import * from .analitics import *
from .library import * from .library import *
from .media import * from .media import *
from .config import * from .configs import *

View File

@@ -4,6 +4,6 @@
# Импортируем библиотеки для экспорта # Импортируем библиотеки для экспорта
from .start_info_out import * from .start_info_out import *
from .message_to_file import * from .message_to_file import *
from .type_messages import * from .types_msg import *
from .user_data_to_file import * from .user_data_to_file import *
from .find_ids import * from .find_ids import *

View File

@@ -1,42 +1,35 @@
# BotLibrary/analitics/find_ids.py # BotLibrary/analitics/find_ids.py
# Проверка пользователя на нахождение в списках бота # Проверка пользователя на нахождение в списках бота
from aiogram import types from ..configs.list_ids import DataID
from config import ListId
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования
__all__ = ("find_people_id", "find_chat_id", "find_adm_id", "find_ban_id") __all__ = ("find_imp_id", "find_adm_id", "find_ban_id")
log_type = "ID" log_type = "ID"
# Функция поиска человека в списке администраторов # Функция поиска человека в списке администраторов
def find_adm_id(message): def find_adm_id(admin_id):
if message.from_user.id in ListId.adm_list_id: admin_id = str(admin_id)
if admin_id in DataID.admins:
return True return True
else: else:
return f"Пользователь не является администратором!" return f"Пользователь {admin_id} не является администратором!"
# Функция поиска человека в списке администраторов # Функция поиска человека в списке забаненных пользователей
def find_ban_id(message): def find_ban_id(ban_id):
if message.from_user.id in ListId.ban_list_id: ban_id = str(ban_id)
if ban_id in DataID.ban_list:
return True return True
else: else:
return f"Пользователь не забанен!" return f"Пользователь {ban_id} не забанен!"
# Функция поиска человека в списке "важных" пользователей # Функция поиска человека в списке "важных" чатов
def find_people_id(user_id): def find_imp_id(user_id):
# Проверка на наличие пользователя в списке "важных" пользователей user_id = str(user_id)
if user_id in ListId.important_ids: if user_id in DataID.important:
user_id = ListId.important_ids[user_id] return DataID.important[user_id] # Возвращаем имя пользователя
return user_id else:
return user_id
# Проверка на наличие чата в списке "важных" чатов
def find_chat_id(message: types.Message):
chat_id = message.chat.id
# Проверка на наличие чата в списке "важных" чатов
if chat_id in ListId.important_ids:
chat_id = ListId.important_ids[chat_id]
return chat_id

View File

@@ -5,9 +5,10 @@ import os
from loguru import logger from loguru import logger
from datetime import datetime from datetime import datetime
from config import BotVariables from ..configs import *
from .type_messages import * from ..library.time import TimeVariable
from .find_ids import find_chat_id from .types_msg import types_message, types_chat
from .find_ids import find_imp_id
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования
__all__ = ("write_message_to_file",) __all__ = ("write_message_to_file",)
@@ -19,12 +20,12 @@ async def write_message_to_file(message):
try: try:
# Создание переменных с информацией # Создание переменных с информацией
message_type = types_message(message) message_type = types_message(message)
chat_id = find_chat_id(message) chat_id = find_imp_id(message.from_user.id)
file_path = types_chat(message) file_path = types_chat(message)
# Переменные для логов сообщений # Переменные для логов сообщений
date = datetime.now().strftime(BotVariables.time_format) date = datetime.now().strftime(TimeVariable.format)
username = message.from_user.username if message.from_user.username else "No username" username = message.from_user.username if message.from_user.username else "Нет @username"
log_shablon = f"{date} | @{username} ({message.from_user.id}) |" log_shablon = f"{date} | @{username} ({message.from_user.id}) |"
# Проверка и создание директорий # Проверка и создание директорий
@@ -32,17 +33,14 @@ async def write_message_to_file(message):
os.makedirs(os.path.dirname(file_path)) os.makedirs(os.path.dirname(file_path))
# Запись информации в файл # Запись информации в файл
with open(file_path, "a", encoding=BotVariables.encoding) as file: with open(file_path, "a", encoding=default_encod) as file:
# Проверка на наличие текста # Проверка на наличие текста
if message.text is None: if message.text is None:
file.write(f"{log_shablon} Тип: {message_type}\n\n") file.write(f"{log_shablon} Тип: {message_type}\n\n")
else: else:
file.write(f"{log_shablon} ChatID: {chat_id} | Текст: {message.text}\n\n") file.write(f"{log_shablon} ChatID: {chat_id} | Текст: {message.text}\n\n")
return f"Сообщение пользователя успешно записано в файл."
# Проверка на ошибку и ее логирование # Проверка на ошибку и ее логирование
except Exception as e: except Exception as e:
text_error = f"Ошибка в сохранении сообщения в файл: {str(e)}" text_error = f"Ошибка в сохранении сообщения в файл: {str(e)}"
logger.bind(custom_variable=log_type, user_var=f"@{message.from_user.username}").error(text_error) logger.bind(custom_variable=log_type, user_var=f"@{message.from_user.username}").error(text_error)
return text_error

View File

@@ -3,12 +3,13 @@
# Логирование стартов бота в bot_start.log # Логирование стартов бота в bot_start.log
from datetime import datetime from datetime import datetime
from timer import sleep from colorama import Fore
from loguru import logger from loguru import logger
from time import sleep
from config import ImportantPath, BotVariables from ..configs import ProjectPath, default_encod
from ..library.time import TimeVariable
from ..library.bots import BotInfo from ..library.bots import BotInfo
from ..library.decorator import TextDecorator
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования
__all__ = ("bot_info_out",) __all__ = ("bot_info_out",)
@@ -17,14 +18,14 @@ log_type = "Start_INFO"
# Функция для получения информации о боте и выводе ее в консоль и файл # Функция для получения информации о боте и выводе ее в консоль и файл
def bot_info_out(): def bot_info_out():
bot_time = f"Бот @{BotInfo.username} запущен в {datetime.now().strftime(BotVariables.time_format)}\n" bot_time = f"Бот @{BotInfo.username} запущен в {datetime.now().strftime(TimeVariable.format)}\n"
bot_name = f"Основное имя: {BotInfo.first_name}\n" bot_name = f"Основное имя: {BotInfo.first_name}\n"
bot_postname = f" Доп. имя: {BotInfo.last_name}\n" bot_postname = f" Доп. имя: {BotInfo.last_name}\n"
bot_username = f" Юзернейм: @{BotInfo.username}\n" bot_username = f" Юзернейм: @{BotInfo.username}\n"
bot_id = f" ID: {BotInfo.id}\n" bot_id = f" ID: {BotInfo.id}\n"
bot_language = f" Языковой код: {BotInfo.language_code}\n" bot_language = f" Языковой код: {BotInfo.language_code}\n"
bot_can_join_groups = f" Может ли вступать в группы: {BotInfo.can_join_groups}\n" bot_can_join_groups = f" Может ли вступать в группы: {BotInfo.can_join_groups}\n"
bot_can_read_all_group_messages = f" Чтение всех сообщений: {BotInfo.can_read_all_group_messages}\n" bot_can_read_all_group_messages = f" Чтение всех сообщений: {BotInfo.can_read_all_group_messages}\n" # Теперь атрибут существует
bot_is_premium = f" Является премиум-ботом: {BotInfo.is_premium}\n" bot_is_premium = f" Является премиум-ботом: {BotInfo.is_premium}\n"
bot_added_to_attachment_menu = f" Добавлен в меню вложений: {BotInfo.added_to_attachment_menu}\n" bot_added_to_attachment_menu = f" Добавлен в меню вложений: {BotInfo.added_to_attachment_menu}\n"
bot_supports_inline_queries = f" Поддерживает инлайн-запросы: {BotInfo.supports_inline_queries}\n" bot_supports_inline_queries = f" Поддерживает инлайн-запросы: {BotInfo.supports_inline_queries}\n"
@@ -39,20 +40,20 @@ def bot_info_out():
# Печатаем все данные в консоль с задержкой в 1 секунду # Печатаем все данные в консоль с задержкой в 1 секунду
sleep(1) sleep(1)
print(TextDecorator.BLUE, bot_all_info, TextDecorator.RESET_DECORATOR) print(Fore.CYAN + bot_all_info)
# Записываем информацию в файл # Записываем информацию в файл
try: try:
with open(ImportantPath.log_info, 'w', encoding=BotVariables.encoding) as log_file: with open(ProjectPath.log_info, 'w', encoding=default_encod) as log_file:
log_file.write(f"{bot_time}{bot_all_info}") log_file.write(f"{bot_time}{bot_all_info}")
# Создание файла bot_start.log # Создание файла bot_start.log
with open(ImportantPath.log_start, 'a', encoding=BotVariables.encoding) as log_start_file: with open(ProjectPath.log_start, 'a', encoding=default_encod) as log_start_file:
log_start_file.write(f"{bot_time}\n") log_start_file.write(f"{bot_time}\n")
return bot_all_info return bot_all_info
# Проверка на ошибку и ее логирование # Проверка на ошибку и ее логирование
except Exception as e: except Exception as e:
text_error = f"Ошибка при получении ID пользователя: {e}" text_error = f"Ошибка при получении ID пользователя: {e}"
logger.bind(log_type="INFO", user=log_type).error(text_error) logger.bind(log_type="INFO", user=log_type).error(text_error)
return text_error

View File

@@ -1,73 +0,0 @@
# BotLibrary/analitics/log_type.py
# Определение типа сообщения
from .find_ids import find_chat_id
from config import BotEdit, ImportantPath
# Настройка экспорта модулей и логирования
__all__ = ("types_message", "types_chat",)
log_type = "Type_message"
# Проверка на тип чата
def types_chat(message):
chat_id = find_chat_id(message)
if message.chat.type == "private":
file_path = f"{ImportantPath.private_message}/{chat_id}.txt"
else:
file_path = f"{ImportantPath.group_message}/{chat_id}.txt"
return file_path
# Проверка на тип сообщения
def types_message(message):
if message.pinned_message: # Закрепленное сообщение
file_type = "Закрепленное сообщение"
elif message.text:
first_char = message.text.strip()[0] if message.text.strip() else "" # Извлекаем первый символ текста
if first_char in BotEdit.prefixs:
file_type = "Команда"
else:
file_type = "Текст"
elif message.photo:
file_type = "Фото"
elif message.sticker:
file_type = "Стикер"
elif message.animation:
file_type = "Гиф"
elif message.voice:
file_type = "Голосовое сообщение"
elif message.video_note:
file_type = "Видеосообщение"
elif message.video:
file_type = "Видео"
elif message.audio:
file_type = "Аудио"
elif message.files:
file_type = "Документ"
elif message.contact:
file_type = "Контакт"
elif message.location:
file_type = "Локация"
elif message.venue:
file_type = "Место"
elif message.dice:
file_type = "Бросок кубика"
elif message.story:
file_type = "История"
elif message.game:
file_type = "Игра"
elif message.new_chat_members:
file_type = (f"Участник(и) присоединился(ись): "
f"{', '.join([member.username for member in message.new_chat_members if member.username])}")
elif message.left_chat_member:
file_type = f"Участник покинул чат: {message.left_chat_member.username or 'Неизвестный'}"
elif getattr(message, 'boost_added', False): # Проверяем наличие атрибута boost_added
file_type = "Буст чата!"
elif message.poll:
file_type = "Опрос"
elif message.forward_from or message.forward_from_chat:
file_type = "Пересланное сообщение"
else:
file_type = "Неизвестный тип сообщения"
return file_type

View File

@@ -0,0 +1,80 @@
# BotLibrary/analitics/log_type.py
# Определение типа сообщения
from aiogram.types import ContentType
from configs import *
from .find_ids import find_imp_id
# Настройка экспорта модулей и логирования
__all__ = ("types_message", "types_chat",)
log_type = "Type_message"
# Проверка на тип чата
def types_chat(message):
chat_id = find_imp_id(message.from_user.id)
if message.chat.type == "private":
file_path = f"{ProjectPath.private_message}/{chat_id}.txt"
else:
file_path = f"{ProjectPath.group_message}/{chat_id}.txt"
return file_path
def types_message(message):
# Словарь для соответствия типов сообщений
content_types = {
ContentType.TEXT: "Текст",
ContentType.PHOTO: "Фото",
ContentType.STICKER: "Стикер",
ContentType.ANIMATION: "Гиф",
ContentType.VOICE: "Голосовое сообщение",
ContentType.VIDEO_NOTE: "Видеосообщение",
ContentType.VIDEO: "Видео",
ContentType.AUDIO: "Аудио",
ContentType.DOCUMENT: "Документ",
ContentType.CONTACT: "Контакт",
ContentType.LOCATION: "Локация",
ContentType.VENUE: "Место",
ContentType.DICE: "Бросок кубика",
ContentType.STORY: "История",
ContentType.GAME: "Игра",
ContentType.POLL: "Опрос",
ContentType.FORUM_TOPIC_CREATED: "Создание темы на форуме",
ContentType.FORUM_TOPIC_EDITED: "Редактирование темы форума",
ContentType.FORUM_TOPIC_CLOSED: "Закрытие темы форума",
ContentType.FORUM_TOPIC_REOPENED: "Открытие темы форума",
ContentType.GENERAL_FORUM_TOPIC_HIDDEN: "Скрытие общей темы форума",
ContentType.GENERAL_FORUM_TOPIC_UNHIDDEN: "Раскрытие общей темы форума",
ContentType.GIVEAWAY_CREATED: "Создание розыгрыша",
ContentType.GIVEAWAY: "Розыгрыш",
ContentType.GIVEAWAY_WINNERS: "Победители розыгрыша",
ContentType.GIVEAWAY_COMPLETED: "Розыгрыш завершен",
ContentType.VIDEO_CHAT_SCHEDULED: "Запланированный видеочат",
ContentType.VIDEO_CHAT_STARTED: "Видеочат начат",
ContentType.VIDEO_CHAT_ENDED: "Видеочат завершен",
ContentType.VIDEO_CHAT_PARTICIPANTS_INVITED: "Участники приглашены в видеочат",
ContentType.PINNED_MESSAGE: "Закрепленное сообщение",
ContentType.INVOICE: "Счет",
ContentType.SUCCESSFUL_PAYMENT: "Успешный платеж",
ContentType.REFUNDED_PAYMENT: "Возврат платежа",
ContentType.USERS_SHARED: "Пользователи поделились",
ContentType.CHAT_SHARED: "Чат был передан",
ContentType.CONNECTED_WEBSITE: "Подключенный веб-сайт",
ContentType.WRITE_ACCESS_ALLOWED: "Разрешение на запись",
ContentType.PASSPORT_DATA: "Данные паспорта",
ContentType.PROXIMITY_ALERT_TRIGGERED: "Срабатывание предупреждения о близости",
ContentType.BOOST_ADDED: "Буст чата",
ContentType.CHAT_BACKGROUND_SET: "Установлен фон чата"
}
# Проверяем тип сообщения и возвращаем описание
if message.pinned_message: # Закрепленное сообщение
return content_types.get(ContentType.PINNED_MESSAGE, "Закрепленное сообщение")
# Проверка для обычных сообщений
for content_type, description in content_types.items():
if getattr(message, content_type.value, None):
return description
# Если сообщение не соответствует ни одному из типов
return "Неизвестный тип сообщения"

View File

@@ -1,10 +1,13 @@
# BotLibrary/analitics/user_data_to_file.py # BotLibrary/analitics/user_data_to_file.py
# Запись информации о пользователях в файл "user_data.db" (Сделать счетчик пользователей) # Запись информации о пользователи в базу данных
import os import os
import json import json
import datetime import datetime
from config import ImportantPath, BotVariables
from aiogram.types import User, Birthdate
from configs import *
from ..library.time import TimeVariable
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования
__all__ = ("write_user_info_to_file", "format_user_record",) __all__ = ("write_user_info_to_file", "format_user_record",)
@@ -12,13 +15,13 @@ log_type = "User_data_file"
# Функция записи информации в JSON-файл # Функция записи информации в JSON-файл
def write_user_info_to_file(user): def write_user_info_to_file(user: User):
directory = os.path.dirname(ImportantPath.user_info_file) directory = os.path.dirname(ProjectPath.user_info_file)
if not os.path.exists(directory): if not os.path.exists(directory):
os.makedirs(directory) os.makedirs(directory)
if os.path.exists(ImportantPath.user_info_file): if os.path.exists(ProjectPath.user_info_file):
with open(ImportantPath.user_info_file, "r", encoding=BotVariables.encoding) as file: with open(ProjectPath.user_info_file, "r", encoding=default_encod) as file:
try: try:
user_data = json.load(file) user_data = json.load(file)
except json.JSONDecodeError: except json.JSONDecodeError:
@@ -29,19 +32,24 @@ def write_user_info_to_file(user):
user_record = format_user_record(user) user_record = format_user_record(user)
user_data[str(user.id)] = user_record user_data[str(user.id)] = user_record
with open(ImportantPath.user_info_file, "w", encoding=BotVariables.encoding) as file: with open(ProjectPath.user_info_file, "w", encoding=default_encod) as file:
json.dump(user_data, file, ensure_ascii=False, indent=4) json.dump(user_data, file, ensure_ascii=False, indent=4)
return f"Информация о пользователе успешно записана или обновлена."
# Функция форматирования вывода в JSON-файл # Функция форматирования вывода в JSON-файл
def format_user_record(user): def format_user_record(user: User):
first_name = getattr(user, 'first_name', '') # Получаем имя first_name = getattr(user, 'first_name', '') # Получаем имя
last_name = getattr(user, 'last_name', '') # Получаем фамилию или пустую строку last_name = getattr(user, 'last_name', '') # Получаем фамилию или пустую строку
# Получение даты рождения
birthdate = getattr(user, 'birthdate', None)
if isinstance(birthdate, Birthdate):
birthdate_str = f"{birthdate.day:02d}.{birthdate.month:02d}.{birthdate.year or 'Не указано'}"
else:
birthdate_str = "Не указано"
return { return {
"Время знакомства": datetime.datetime.now().strftime(BotVariables.time_format), "Время знакомства": datetime.datetime.now().strftime(TimeVariable.format),
"Имя": first_name, "Имя": first_name,
"Фамилия": last_name, "Фамилия": last_name,
"Юзернейм": f"@{getattr(user, 'username', 'Не указано')}", "Юзернейм": f"@{getattr(user, 'username', 'Не указано')}",
@@ -50,5 +58,5 @@ def format_user_record(user):
"Бот": getattr(user, 'is_bot', False), "Бот": getattr(user, 'is_bot', False),
"Премиум": getattr(user, 'is_premium', False), "Премиум": getattr(user, 'is_premium', False),
"Язык": getattr(user, 'language_code', 'Не указано'), "Язык": getattr(user, 'language_code', 'Не указано'),
"Дата рождения": birthdate_str, # Добавляем дату рождения
} }

View File

@@ -1,145 +0,0 @@
# BotLibrary/configs/config.py
# Список практически всех переменных проекта
from os import getenv
from dotenv import load_dotenv
from MySQL.list_ids import *
# Настройка экспорта модулей и логирования
__all__ = ("LogsSet", "BotEdit", "ListId", "ImportantPath", "BotVariables",
"bot_token", "api_key", "web_api_key", )
log_type = "Config"
# Загружаем переменные из файла .env
load_dotenv()
bot_token = getenv("main_bot_token")
api_key = getenv("APIKey")
web_api_key = getenv("WebAPIKey")
important_id = getenv("important_id")
secret = getenv("secret")
# Класс для параметров логгера
class LogsSet:
# Максимальный размер лог-файла
max_size = "500 MB"
# Шаблон логов для обычного логгера
info_text = ("<green>{timer:YYYY-MM-DD HH:mm:ss}</green> <red> | </red> "
"<blue>PRIMO-{extra[log_type]}</blue> <red> | </red> "
"<red>{extra[user]} | </red> <level>{message}</level>")
# Шаблон логов для логгера-ошибок
error_text = ("<level>{timer:YYYY-MM-DD HH:mm:ss} | ERROR-{extra[log_type]} | "
"{extra[user]} | {message}</level>")
# Прочие переменные для проекта
class BotVariables:
# Основные настройки бота
encoding = "utf-8"
time_format = "%Y-%m-%d %H:%M:%S"
language = "Python-Aiogram"
time_zone = "Asia/Novosibirsk"
# Типы сообщений и список директорий для создания
private_msg = "Личные"
group_msg = "Группы"
bot_msg_directories = [private_msg, group_msg,]
# Названия директорий для хранения аватаров
user_avatar = "UserAvatar"
chat_avatar = "ChatAvatar"
channel_avatar = "ChannelAvatar"
bot_avatar_directories = [user_avatar, chat_avatar, channel_avatar,]
# Названия директорий-хранилищ
avatar = "Avatar"
photo = "Photo"
video = "Video"
videonote = "VideoNote"
gif = "GIF"
files = "Document"
voice = "Voice"
youtube = "YouTube"
# Список директорий для создания
bot_media_directories = [
avatar, photo, video, videonote, gif, files, voice, youtube,
]
# Класс с параметрами бота
class BotEdit:
name = "Первородная Жемчужина" # Описание имени бота
description = ("Привет, мое имя - Эми! Я буду рада, вам помочь "
"посетить другие миры! Вместе!") # Описание бота
short_description = "Привет, это описание! Как дела?" # Описание виджета бота
prefixs = ('$', '!', '.', '%', '&', ':', '|', '+', '-', '/', '~', '?') # Доступные префиксы бота
# Создание списков с ids пользователей
class ListId:
# Получение списков из базы данных
ban_list_id = ban_list_ids
adm_list_id = important_adm_ids
important_users_list_id = important_users_list_ids
groups_list_id = important_groups_ids
channel_list_id = important_channel_ids
# Создание единого словаря важных ID с использованием оператора |
important_ids = (important_adm_ids | important_users_list_ids |
important_groups_ids | important_channel_ids)
# Класс с важными переменными-пути
class ImportantPath:
# Путь к аватарам проекта
bot_avatar = f"BotLibrary/MediaPersonal/bot_avatar.png"
console_app_avatar = f"BotLibrary/MediaPersonal/console_avatar.png"
# Пути к файлам логирования
log_start = f"BotLogs/bot_start.log"
log_file = f"BotLogs/bot.log"
log_info = f"BotLogs/bot_info.log"
log_error_file = f"BotLogs/bot_error.log"
# Пути к хранению сообщений
msg = f"BotLogs/BotMessages"
private_message = f"{msg}/{BotVariables.private_msg}"
group_message = f"{msg}/{BotVariables.group_msg}"
# Путь к хранилищу базы данных
user_info_file = f"MySQL/user_data.json"
# Пути к хранению медиа
bot_files = f"BotFiles"
bot_personal_media = f"BotLibrary/media"
bot_received_media = f"BotFiles/MediaReceived"
user_avatar = f"{bot_files}/{BotVariables.user_avatar}"
chat_avatar = f"{bot_files}/{BotVariables.chat_avatar}"
channel_avatar = f"{bot_files}/{BotVariables.channel_avatar}"
# Названия директорий-хранилищ для медиа
bot_avatar_directory = f"{bot_personal_media}/{BotVariables.avatar}/"
bot_photo_directory = f"{bot_personal_media}/{BotVariables.photo}/"
bot_video_directory = f"{bot_personal_media}/{BotVariables.video}/"
bot_videonote_directory = f"{bot_personal_media}/{BotVariables.videonote}/"
bot_gif_directory = f"{bot_personal_media}/{BotVariables.gif}/"
bot_document_directory = f"{bot_personal_media}/{BotVariables.files}/"
bot_voice_directory = f"{bot_personal_media}/{BotVariables.voice}/"
bot_youtube_directory = f"{bot_personal_media}/{BotVariables.youtube}/"
# Названия директорий-хранилищ для закачки
avatar_directory = f"{bot_received_media}/{BotVariables.avatar}/"
photo_directory = f"{bot_received_media}/{BotVariables.photo}/"
video_directory = f"{bot_received_media}/{BotVariables.video}/"
videonote_directory = f"{bot_received_media}/{BotVariables.videonote}/"
gif_directory = f"{bot_received_media}/{BotVariables.gif}/"
document_directory = f"{bot_received_media}/{BotVariables.files}/"
voice_directory = f"{bot_received_media}/{BotVariables.voice}/"
youtube_directory = f"{bot_received_media}/{BotVariables.youtube}/"

View File

@@ -0,0 +1,8 @@
# BotLibrary/library/__init__.py
# Инициализация пакета library, для работы с собственными библиотеками
# Импортируем библиотеки для экспорта
from .config import *
from .settings import *
from .list_ids import *
from .important_path import *

View File

@@ -0,0 +1,5 @@
# BotLibrary/configs/config.py
# Базовые переменные для проекта
# Базовая кодировка файлов
default_encod = "utf-8"

View File

@@ -0,0 +1,87 @@
# BotLibrary/configs/important_path.py
# Хранилище всех важных путей
# Класс для хранения типов директорий
class TypeDirectory:
# Типы сообщений и список директорий для создания
private_msg = "Личные"
group_msg = "Группы"
msg_directories = [private_msg, group_msg]
# Названия директорий для хранения аватаров
user_avatar = "UserAvatar"
chat_avatar = "ChatAvatar"
channel_avatar = "ChannelAvatar"
avatar_directories = [user_avatar, chat_avatar, channel_avatar]
# Названия директорий-хранилищ
avatar = "Avatar"
photo = "Photo"
video = "Video"
videonote = "VideoNote"
gif = "GIF"
files = "Document"
voice = "Voice"
youtube = "YouTube"
# Список директорий для создания
media_directories = [avatar, photo, video, videonote,
gif, files, voice, youtube]
# Класс с важными путями и настройками
class ProjectPath:
# Пути к файлам логирования
logs = "BotLogs"
log_start = f"{logs}/start.log"
log_file = f"{logs}/bot.log"
log_info = f"{logs}/info.log"
log_error_file = f"{logs}/error.log"
# Пути к хранилищу сообщений
msg = f"{logs}/BotMessages"
private_message = f"{msg}/{TypeDirectory.private_msg}"
group_message = f"{msg}/{TypeDirectory.group_msg}"
# Путь к хранилищу базы данных
SQL = "MySQL"
user_info_file = f"{SQL}/user_data.json"
list_id = f"{SQL}/list_ids.json"
# Пути к хранилищу медиа
bot_files = "BotFiles"
personal_media = f"BotLibrary/media"
received_media = f"{bot_files}/MediaReceived"
# Пути к папкам аватаров
user_avatar = f"{bot_files}/{TypeDirectory.user_avatar}"
chat_avatar = f"{bot_files}/{TypeDirectory.chat_avatar}"
channel_avatar = f"{bot_files}/{TypeDirectory.channel_avatar}"
# Путь к папкам хранения медиа
console_app_avatar = f"{personal_media}/console_avatar.png"
personal_avatar = f"{personal_media}/{TypeDirectory.avatar}"
personal_photo = f"{personal_media}/{TypeDirectory.photo}"
personal_video = f"{personal_media}/{TypeDirectory.video}"
personal_videonote = f"{personal_media}/{TypeDirectory.videonote}"
personal_gif = f"{personal_media}/{TypeDirectory.gif}"
personal_document = f"{personal_media}/{TypeDirectory.files}"
personal_voice = f"{personal_media}/{TypeDirectory.voice}"
personal_youtube = f"{personal_media}/{TypeDirectory.youtube}"
# Путь к папкам получения медиа
received_avatar = f"{received_media}/{TypeDirectory.avatar}"
received_photo = f"{received_media}/{TypeDirectory.photo}"
received_video = f"{received_media}/{TypeDirectory.video}"
received_videonote = f"{received_media}/{TypeDirectory.videonote}"
received_gif = f"{received_media}/{TypeDirectory.gif}"
received_document = f"{received_media}/{TypeDirectory.files}"
received_voice = f"{received_media}/{TypeDirectory.voice}"
received_youtube = f"{received_media}/{TypeDirectory.youtube}"

View File

@@ -0,0 +1,71 @@
# BotLibrary/configs/list_ids.py
# Получение id пользователей из базы данных
import os
import json
from loguru import logger
from .config import *
from .important_path import ProjectPath
# Настройка экспорта модулей и логирования
__all__ = ("load_ids_from_json", "save_ids_to_json", "DataID")
default_file = ProjectPath.list_id
log_type = "ListID"
# Чтение данных из файла JSON с обработкой ошибок
def load_ids_from_json(file=default_file, encoding=default_encod):
try:
# Проверка существования файла
if not os.path.exists(file):
# Если файл не существует, создаем его с пустым содержимым
with open(file, "w", encoding=encoding) as f:
json.dump({}, f, ensure_ascii=False, indent=4)
# Чтение данных из файла
with open(file, "r", encoding=encoding) as f:
return json.load(f)
except FileNotFoundError:
(logger.bind(log_type=log_type, user="Файл id")
.error(f"Файл {file} не найден!"))
return {}
except json.JSONDecodeError:
(logger.bind(log_type=log_type, user="Декодирование id")
.error(f"Ошибка декодирования JSON в файле {file}"))
return {}
except Exception as e:
(logger.bind(log_type=log_type, user="Чтение id")
.error(f"Произошла ошибка при чтении файла {file}: {e}"))
return {}
# Запись данных в файл JSON с обработкой ошибок
def save_ids_to_json(file=default_file, encoding=default_encod, data=None):
try:
with open(file, "w", encoding=encoding) as f:
json.dump(data, f, ensure_ascii=False, indent=4)
except Exception as e:
(logger.bind(log_type=log_type, user="Запись id")
.error(f"Произошла ошибка при записи в файл {file}: {e}"))
# Класс для хранения данных из JSON
class DataID:
# Получение информации из списка важных айди, забанненых айди и общих
data_list_id = load_ids_from_json(ProjectPath.list_id)
data_user_data = load_ids_from_json(ProjectPath.user_info_file)
# Список забанненых пользователей
ban_list = data_list_id.get("ban_list_ids", {})
# Список важных айди
admins = data_list_id.get("important_adm_ids", {})
groups = data_list_id.get("important_groups_ids", {})
users = data_list_id.get("important_users_list_ids", {})
channels = data_list_id.get("important_channel_ids", {})
important = {**admins, **groups, **users, **channels}

View File

@@ -0,0 +1,32 @@
# BotLibrary/configs/settings.py
# Список практически всех переменных проекта
from os import getenv
from dotenv import load_dotenv
# Настройка экспорта модулей
__all__ = ("BotEdit", "BotVariables", "bot_token", "api_key",
"web_api_key", "important_id", "secret")
# Класс с параметрами бота
class BotEdit:
name = "Первородная Жемчужина" # Описание имени бота
description = ("Привет, мое имя - Эми! Я буду рада помочь вам "
"посетить другие миры! Вместе!") # Описание бота
short_description = "Привет, это описание! Как дела?" # Описание виджета бота
# Важные параметры бота
class BotVariables:
language = "Python3-Aiogram"
prefixs = ('$', '!', '.', '%', '&', ':', '|', '+', '-', '/', '~', '?')
# Загружаем переменные из файла .env
load_dotenv(".env")
bot_token = getenv("main_bot_token")
api_key = getenv("APIKey")
web_api_key = getenv("WebAPIKey")
important_id = getenv("important_id")
secret = getenv("secret")

View File

@@ -3,7 +3,11 @@
# Импортируем библиотеки для экспорта # Импортируем библиотеки для экспорта
from .bots import * from .bots import *
from .decorator import *
from .logger import * from .logger import *
from .edit_bot import * from .edit_bot import *
from .directory import * from .directory import *
from .time import *
from art import *
from colorama import *
from termcolor import *

View File

@@ -1,53 +1,29 @@
# BotLibrary/library/bots.py # BotLibrary/library/bots.py
# Создание и настройка бота в одном файле # Создание и настройка бота в одном файле
import pytz
from tzlocal import get_localzone
from datetime import datetime
from aiogram import Dispatcher, Bot, F from aiogram import Dispatcher, Bot, F
from aiogram.client.default import DefaultBotProperties from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode from aiogram.enums import ParseMode
from apscheduler.schedulers.asyncio import AsyncIOScheduler from apscheduler.schedulers.asyncio import AsyncIOScheduler
from config import bot_token, BotVariables from .time import *
from configs import bot_token, BotVariables
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования
__all__ = ("bot_token", "dp", "bot", "scheduler", "F_Media", "BotInfo", "bot_get_info") __all__ = ("dp", "bot", "scheduler", "F_Media", "BotInfo", "bot_get_info")
log_type = "Bot" log_type = "Bot"
# Получение времени по UTC
utc_now = datetime.now(pytz.utc)
# Получение локального времени хоста (с использованием локального часового пояса)
local_tz = get_localzone() # Автоматически определяет локальный часовой пояс
local_now = utc_now.astimezone(local_tz)
# Получение московского времени
moscow_tz = pytz.timezone("Europe/Moscow")
moscow_now = utc_now.astimezone(moscow_tz)
# Форматирование времени UTC
utc_time = utc_now.strftime("%Y-%m-%d %H:%M:%S") + " (UTC)"
# Форматирование времени хоста со сдвигом
utc_offset_host = local_now.utcoffset().total_seconds() / 3600 # Смещение в часах
host_time = local_now.strftime("%Y-%m-%d %H:%M:%S") + f" (UTC{int(utc_offset_host):+})"
# Форматирование московского времени со сдвигом
utc_offset_moscow = moscow_now.utcoffset().total_seconds() / 3600 # Смещение в часах
moscow_time = moscow_now.strftime("%Y-%m-%d %H:%M:%S") + f" (UTC{int(utc_offset_moscow):+})"
# Создание экземпляра диспатчера и его параметров # Создание экземпляра диспатчера и его параметров
dp = Dispatcher() dp = Dispatcher()
dp["started_at"] = host_time dp["started_at"] = host_time
dp["started_at_msk"] = moscow_time dp["started_at_msk"] = get_choice_time(TimeVariable.choice_utc_msk)
dp["is_active"] = True # Флаг активности бота dp["is_active"] = True # Флаг активности бота
dp["logs"] = [] dp["logs"] = []
dp["users"] = {} dp["users"] = {}
dp["sessions"] = {} dp["sessions"] = {}
dp["task_queue"] = [] dp["task_queue"] = []
dp["config"] = {"max_connections": 100, "retry_interval": 5, "time_format": BotVariables.time_format} dp["configs"] = {"max_connections": 100, "retry_interval": 5, "time_format": TimeVariable.format}
dp["metrics"] = {"messages_received": 0, "messages_sent": 0, "errors": 0} dp["metrics"] = {"messages_received": 0, "messages_sent": 0, "errors": 0}
dp["modules"] = {} dp["modules"] = {}
dp["state"] = {} dp["state"] = {}
@@ -58,21 +34,33 @@ dp["database"] = None
# Объявление экземпляров и переменных # Объявление экземпляров и переменных
bot = Bot(token=bot_token, default=DefaultBotProperties(parse_mode=ParseMode.HTML)) # Объявление бота bot_properties = DefaultBotProperties(
scheduler = AsyncIOScheduler(timezone=BotVariables.time_zone) # Создание планировщика parse_mode=ParseMode.HTML, # Устанавливаем формат HTML для всех сообщений
disable_notification=True, # Отключаем уведомления при отправке сообщений
protect_content=True, # Защищаем содержимое сообщений от копирования
allow_sending_without_reply=True, # Разрешаем отправлять сообщения без ответа на другое сообщение
# link_preview=LinkPreviewOptions(), # Настройка для предварительного просмотра ссылок
link_preview_is_disabled=True, # Отключаем предварительный просмотр ссылок
show_caption_above_media=False, # Показываем подпись выше медиа
)
bot = Bot(token=bot_token, default=bot_properties) # Объявление бота
scheduler = AsyncIOScheduler(timezone=get_time_zone()) # Создание планировщика
F_Media = F.photo | F.files | F.video | F.animation | F.voice | F.video_note # Фильтр-медиа F_Media = F.photo | F.files | F.video | F.animation | F.voice | F.video_note # Фильтр-медиа
# Класс для хранения данных о боте (некоторые переменные даны как шаблон) # Класс для хранения данных о боте (некоторые переменные даны как шаблон)
class BotInfo: class BotInfo:
# Статические переменные для хранения данных # Статические переменные для хранения данных
id = 10000000 id = None
first_name = "TESTBOT" first_name = None
last_name = "" last_name = None
username = "testbot" username = None
description = None
short_description = None
can_join_groups = None can_join_groups = None
can_read_all_group_messages = None can_read_all_group_messages = None
language_code = BotVariables.language language_code = BotVariables.language
prefixs = BotVariables.prefixs
is_premium = None is_premium = None
added_to_attachment_menu = None added_to_attachment_menu = None
supports_inline_queries = None supports_inline_queries = None
@@ -86,13 +74,16 @@ class BotInfo:
cls.first_name = bot_info.first_name cls.first_name = bot_info.first_name
cls.last_name = bot_info.last_name cls.last_name = bot_info.last_name
cls.username = bot_info.username cls.username = bot_info.username
cls.can_join_groups = bot_info.can_join_groups cls.description = getattr(bot_info, 'description', '') # Default to empty string if no description
cls.can_read_all_group_messages = bot_info.can_read_all_group_messages cls.short_description = getattr(bot_info, 'description', '')
cls.language_code = bot_info.language_code
cls.is_premium = bot_info.is_premium cls.is_premium = bot_info.is_premium
cls.added_to_attachment_menu = bot_info.added_to_attachment_menu cls.added_to_attachment_menu = bot_info.added_to_attachment_menu
cls.supports_inline_queries = bot_info.supports_inline_queries cls.supports_inline_queries = bot_info.supports_inline_queries
cls.can_connect_to_business = bot_info.can_connect_to_business cls.can_connect_to_business = bot_info.can_connect_to_business
cls.has_main_web_app = bot_info.has_main_web_app cls.has_main_web_app = bot_info.has_main_web_app
cls.can_join_groups = getattr(bot_info, 'can_join_groups', None) # Default to None if no attribute
cls.can_read_all_group_messages = getattr(bot_info, 'can_read_all_group_messages', None) # Default to None
# Функция получения данных о боте # Функция получения данных о боте
@@ -110,12 +101,14 @@ async def bot_get_info():
'first_name': bot_info_data.first_name, 'first_name': bot_info_data.first_name,
'last_name': bot_info_data.last_name, 'last_name': bot_info_data.last_name,
'username': bot_info_data.username, 'username': bot_info_data.username,
'can_join_groups': bot_info_data.can_join_groups, 'description': getattr(bot_info_data, 'description', ''),
'can_read_all_group_messages': bot_info_data.can_read_all_group_messages, 'short_description': getattr(bot_info_data, 'description', ''),
'language_code': BotVariables.language, 'language_code': bot_info_data.language_code,
'prefixs': BotVariables.prefixs,
'is_premium': bot_info_data.is_premium, 'is_premium': bot_info_data.is_premium,
'added_to_attachment_menu': bot_info_data.added_to_attachment_menu, 'added_to_attachment_menu': bot_info_data.added_to_attachment_menu,
'supports_inline_queries': bot_info_data.supports_inline_queries, 'supports_inline_queries': bot_info_data.supports_inline_queries,
'can_connect_to_business': bot_info_data.can_connect_to_business, 'can_connect_to_business': bot_info_data.can_connect_to_business,
'has_main_web_app': bot_info_data.has_main_web_app, 'has_main_web_app': bot_info_data.has_main_web_app,
'can_join_groups': getattr(bot_info_data, 'can_join_groups', None),
} }

View File

@@ -1,74 +0,0 @@
# BotLibrary/library/decorator.py
# Небольшая библиотека для декорирования текста
from art import *
from colorama import *
from termcolor import *
# Подключение ANSI в стандартное Windows_cmd
just_fix_windows_console()
# Некоторые возможности библиотеки art и termcolor (не полный, проще использовать сам art)
class ArtObject:
text_hw = colored("Привет, Мир!", "red", attrs=["reverse", "blink"])
coffe_art = art("coffee", number=1, space=1) # c[_]
women_art = art("woman", number=1, space=1) # ▓⚗_⚗▓ ▓⚗_⚗▓
butterfly_art = art("butterfly", number=1, space=1) # Ƹ̵̡Ӝ̵̨̄Ʒ
happy_art = art("happy", number=1, space=1) # ۜ\(סּںסּَ` )/ۜ
random_art = art("random", number=1, space=1) # Вывод случайного арта из библиотеки
block_font = 'block' # Делает большие квадраты вокруг рисунка
white_buble = 'white_bubble' # Делает вокруг букв белый кружок
cybermedium = 'cybermedium' # Делает текст более "киберпанковым"
random_font = 'random' # Делает случайный фон вокруг рисунка
# Коды для редактирования текста
class TextDecorator:
RESET_DECORATOR = "\033[0m" # Код для сброса форматирования
BOLD = "\033[1m" # Код для включения жирного текста
FAINT = "\033[2m" # Код для включения тонкого текста (редко поддерживается)
KURTIV = "\033[3m" # Код для включения курсива
UNDERLINE = "\033[4m" # Код для включения подчеркнутого текста
BLINK = "\033[5m" # Код для включения мигающего текста (редко поддерживается)
INVERT = "\033[7m" # Код для инверсированного цвета
HIDDEN = "\033[8m" # Код для скрытого текста
STRIKETHROUGH = "\033[9m" # Код для зачеркнутого текста
# Коды для цвета текста
BLACK = "\033[30m" # Черный текст
RED = "\033[31m" # Красный текст
GREEN = "\033[32m" # Зеленый текст
YELLOW = "\033[33m" # Желтый текст
BLUE = "\033[34m" # Синий текст
MAGENTA = "\033[35m" # Пурпурный текст
CYAN = "\033[36m" # Бирюзовый текст
WHITE = "\033[37m" # Белый текст
LIGHT_BLACK = "\033[90m" # Светлый черный (серый) текст
LIGHT_RED = "\033[91m" # Светлый красный текст
LIGHT_GREEN = "\033[92m" # Светлый зеленый текст
LIGHT_YELLOW = "\033[93m" # Светлый желтый текст
LIGHT_BLUE = "\033[94m" # Светлый синий текст
LIGHT_MAGENTA = "\033[95m" # Светлый пурпурный текст
LIGHT_CYAN = "\033[96m" # Светлый бирюзовый текст
LIGHT_WHITE = "\033[97m" # Светлый белый текст
# Коды для цвета фона
BLACK_BACKGROUND = "\033[40m" # Черный фон
RED_BACKGROUND = "\033[41m" # Красный фон
GREEN_BACKGROUND = "\033[42m" # Зеленый фон
YELLOW_BACKGROUND = "\033[43m" # Желтый фон
BLUE_BACKGROUND = "\033[44m" # Синий фон
MAGENTA_BACKGROUND = "\033[45m" # Пурпурный фон
CYAN_BACKGROUND = "\033[46m" # Бирюзовый фон
WHITE_BACKGROUND = "\033[47m" # Белый фон
LIGHT_BLACK_BACKGROUND = "\033[100m" # Светлый черный фон
LIGHT_RED_BACKGROUND = "\033[101m" # Светлый красный фон
LIGHT_GREEN_BACKGROUND = "\033[102m" # Светлый зеленый фон
LIGHT_YELLOW_BACKGROUND = "\033[103m" # Светлый желтый фон
LIGHT_BLUE_BACKGROUND = "\033[104m" # Светлый синий фон
LIGHT_MAGENTA_BACKGROUND = "\033[105m" # Светлый пурпурный фон
LIGHT_CYAN_BACKGROUND = "\033[106m" # Светлый бирюзовый фон
LIGHT_WHITE_BACKGROUND = "\033[107m" # Светлый белый фон

View File

@@ -2,7 +2,7 @@
# Небольшая библиотека для создания директорий # Небольшая библиотека для создания директорий
import os import os
from config import ImportantPath, BotVariables from BotLibrary.configs import ProjectPath, TypeDirectory
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования
__all__ = ("create_directories", "setup_directories", ) __all__ = ("create_directories", "setup_directories", )
@@ -22,8 +22,7 @@ def create_directories(base_directory, subdirectories):
# Начальная установка пустых директорий # Начальная установка пустых директорий
def setup_directories(): def setup_directories():
create_directories(ImportantPath.bot_personal_media, BotVariables.bot_media_directories) create_directories(ProjectPath.personal_media, TypeDirectory.media_directories)
create_directories(ImportantPath.bot_received_media, BotVariables.bot_media_directories) create_directories(ProjectPath.received_media, TypeDirectory.media_directories)
create_directories(ImportantPath.msg, BotVariables.bot_msg_directories) create_directories(ProjectPath.bot_files, TypeDirectory.avatar_directories)
create_directories(ImportantPath.bot_files, BotVariables.bot_avatar_directories) create_directories(ProjectPath.msg, TypeDirectory.msg_directories)
return f"Пустые директории - успешно созданы!"

View File

@@ -4,7 +4,7 @@
from aiogram.types import ChatAdministratorRights from aiogram.types import ChatAdministratorRights
from loguru import logger from loguru import logger
from config import BotEdit from BotLibrary.configs import BotEdit
from BotLibrary.library.bots import bot from BotLibrary.library.bots import bot
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования
@@ -107,4 +107,4 @@ async def set_bot_short_description():
await bot.set_my_short_description(short_description=BotEdit.short_description) await bot.set_my_short_description(short_description=BotEdit.short_description)
return f"Короткое описание бота изменено!" return f"Короткое описание бота изменено!"
else: else:
return f"Короткое описание бота уже установлено и не требует изменений." return f"Короткое описание бота уже установлено и не требует изменений."

View File

@@ -3,21 +3,56 @@
import sys import sys
from loguru import logger from loguru import logger
from config import ImportantPath, LogsSet
from ..analitics.message_to_file import write_message_to_file from BotLibrary.configs import ProjectPath
from ..analitics.user_data_to_file import write_user_info_to_file from BotLibrary.analitics.message_to_file import write_message_to_file
from BotLibrary.analitics.user_data_to_file import write_user_info_to_file
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования
__all__ = ("logger", "setup_logger", "cmd_logginger", "error_cmd_logginger", __all__ = ("logger", "setup_logger", "cmd_logginger", "error_cmd_logginger",
"logginger", "common_msg_logginger", ) "logginger", "common_msg_logginger", )
# Класс для параметров логгера
class LogsSet:
# Максимальный размер лог-файла
max_size = "500 MB"
# Шаблон логов для информации
info_text = (
"<green>{time:YYYY-MM-DD HH:mm:ss}</green> <red>|</red> "
"<blue>PRIMO-{extra[log_type]}</blue> <red>|</red> "
"<red>{extra[user]} |</red> <level>{message}</level>"
)
# Шаблон логов для ошибок
error_text = (
"<level>{time:YYYY-MM-DD HH:mm:ss} | "
"<bold>ERROR-{extra[log_type]}</bold> | "
"{extra[user]} | {message}</level>"
)
# Шаблон логов для отладки
debug_text = (
"<cyan>{time:YYYY-MM-DD HH:mm:ss}</cyan> <red>|</red> "
"<magenta>DEBUG-{extra[log_type]}</magenta> <red>|</red> "
"<yellow>{extra[user]} |</yellow> <level>{message}</level>"
)
# Шаблон логов для предупреждений
warning_text = (
"<yellow>{time:YYYY-MM-DD HH:mm:ss}</yellow> <red>|</red> "
"<orange>WARNING-{extra[log_type]}</orange> <red>|</red> "
"<red>{extra[user]} |</red> <level>{message}</level>"
)
# Создание обычного логгера + логгер в файл # Создание обычного логгера + логгер в файл
async def setup_logger(): async def setup_logger():
logger.remove() # Удаляем все логгеры logger.remove() # Удаляем все логгеры
# Пустой логгер для записи отступов в файл уровня TRACE # Пустой логгер для записи отступов в файл уровня TRACE
logger.add(ImportantPath.log_file, logger.add(ProjectPath.log_file,
rotation=LogsSet.max_size, rotation=LogsSet.max_size,
format="\n\n\n", format="\n\n\n",
backtrace=True, backtrace=True,
@@ -32,7 +67,7 @@ async def setup_logger():
format=LogsSet.info_text, format=LogsSet.info_text,
level="INFO", level="INFO",
filter=lambda record: record["level"].name == "INFO") filter=lambda record: record["level"].name == "INFO")
logger.add(ImportantPath.log_file, logger.add(ProjectPath.log_file,
rotation=LogsSet.max_size, rotation=LogsSet.max_size,
format=LogsSet.info_text, format=LogsSet.info_text,
backtrace=True, backtrace=True,
@@ -46,21 +81,19 @@ async def setup_logger():
format=LogsSet.error_text, format=LogsSet.error_text,
level="ERROR", level="ERROR",
filter=lambda record: record["level"].name == "ERROR") filter=lambda record: record["level"].name == "ERROR")
logger.add(ImportantPath.log_error_file, logger.add(ProjectPath.log_error_file,
rotation=LogsSet.max_size, rotation=LogsSet.max_size,
format=LogsSet.error_text, format=LogsSet.error_text,
backtrace=True, backtrace=True,
diagnose=True, diagnose=True,
level="ERROR", level="ERROR",
filter=lambda record: record["level"].name == "ERROR") filter=lambda record: record["level"].name == "ERROR")
return f"Логгеры - подключены!"
# Запись сообщения в файл и информации о пользователи # Запись сообщения в файл и информации о пользователи
async def logginger(message): async def logginger(message):
write_user_info_to_file(message.from_user) write_user_info_to_file(message.from_user)
await write_message_to_file(message) await write_message_to_file(message)
return f"Сообщение и информация о пользователи - успешно записаны!"
# Создание функции логирования на обычные сообщения # Создание функции логирования на обычные сообщения
@@ -72,14 +105,12 @@ async def common_msg_logginger(message, name, message_type, log_type):
else: else:
logger.bind(log_type=log_type, user=f"@{message.from_user.username}").info( logger.bind(log_type=log_type, user=f"@{message.from_user.username}").info(
f"Получено сообщение из ({name}) : {message.text}") f"Получено сообщение из ({name}) : {message.text}")
return f"Логгер на обычный сообщения - успешно активирован"
# Специальный логгер для команд. Вывод в консоль, файл и запись информации о пользователи # Специальный логгер для команд. Вывод в консоль, файл и запись информации о пользователи
async def cmd_logginger(message, log_type, text): async def cmd_logginger(message, log_type, text):
await logginger(message) await logginger(message)
logger.bind(log_type=log_type, user=f"@{message.from_user.username}").info(text) logger.bind(log_type=log_type, user=f"@{message.from_user.username}").info(text)
return f"Логгер на команду - успешно активирован"
# Специальный логгер для ошибок с командами. Вывод в консоль, файл и запись информации о пользователи # Специальный логгер для ошибок с командами. Вывод в консоль, файл и запись информации о пользователи
@@ -87,4 +118,3 @@ async def error_cmd_logginger(message, log_type, e):
text_error = f"Ошибка при использовании команды /{log_type.lower()}: {str(e)}\n" text_error = f"Ошибка при использовании команды /{log_type.lower()}: {str(e)}\n"
await logginger(message) await logginger(message)
logger.bind(log_type=log_type, user=f"@{message.from_user.username}").error(text_error) logger.bind(log_type=log_type, user=f"@{message.from_user.username}").error(text_error)
return text_error

View File

@@ -0,0 +1,49 @@
# BotLibrary/library/time.py
# Библиотека поиски времени
import pytz
from tzlocal import get_localzone
from datetime import datetime
# Настройка экспорта модулей и логирования
__all__ = ("TimeVariable", "host_time", "get_choice_time", "get_time_zone")
log_type = "Time"
"""Создание класса с временными параметрами"""
class TimeVariable:
format = "%Y-%m-%d %H:%M:%S"
another_format = "%S:%M:%H %d-%m-%Y"
choice_main_utc = "Asia/Novosibirsk"
choice_utc_msk = "Europe/Moscow"
"""Получение времени хоста и иного места"""
timezone = pytz.timezone(TimeVariable.choice_utc_msk)
host_time = datetime.now(timezone)
"""Функция получения локальной временной зоны"""
def get_time_zone():
local_timezone = get_localzone()
return local_timezone.key
"""Возвращает текущее время по выбранному часовому поясу в формате строки"""
def get_choice_time(choice_utc):
# Текущее время в UTC
utc_now = datetime.now(pytz.utc)
# Московский часовой пояс
choice_tz = pytz.timezone(choice_utc)
# Перевод времени в московский часовой пояс
choice_now = utc_now.astimezone(choice_tz)
# Смещение UTC для Москвы
utc_offset_choice = choice_now.utcoffset().total_seconds() / 3600 # Смещение в часах
# Форматирование времени
choice_time = choice_now.strftime(TimeVariable.format) + f" (UTC{int(utc_offset_choice):+})"
return choice_time

View File

@@ -6,7 +6,6 @@ __all__ = ("router", "db")
# Импортируем библиотеки для экспорта # Импортируем библиотеки для экспорта
from aiogram import Router from aiogram import Router
from .db import *
# Создание роутера "sql_router" # Создание роутера "sql_router"

33
MySQL/list_ids.json Normal file
View File

@@ -0,0 +1,33 @@
{
"ban_list_ids": {
"6666666666666": "Забанненый"
},
"important_adm_ids": {
"6751720805": "Лейн",
"7051557370": "Рикси",
"1570652377": "Риша",
"1398573474": "Финаки",
"1851081467": "Финик",
"929782381": "Хиде",
"6714237814": "Слешик"
},
"important_groups_ids": {
"1087968824": "GroupAnonymousBot",
"-1002247934490": "Сплетни_лавочек",
"-1002124483077": "Труба_Сквад",
"-1002123850090": "Тест_Чат",
"-1001552311087": "Всеудет_Хорошо"
},
"important_users_list_ids": {
"7145369362": "Артур",
"1219440132": "Данил",
"1443833264": "Виктор",
"5424384921": "Олег",
"556943853": "Ваня",
"1295708467": "Степан"
},
"important_channel_ids": {
"10000000000000": "Канал1",
"20000000000000": "Канал2"
}
}

View File

@@ -1,47 +0,0 @@
# MySQL/list_ids.py
# Хранилище забанненых и важных пользователей и чатов
# Айди забанненых пользователей
ban_list_ids = {
6666666666666: "Лох", # @username_ban1
# 6751720805: "Лейн", # @verdise
}
# Айди администраторов бота
important_adm_ids = {
6751720805: "Лейн", # @verdise
7051557370: "Рикси", # @exetreon
1570652377: "Риша", # @ariinwx
1398573474: "Финаки", # @fin_aki
1851081467: "Финик", # @Huuuvs
929782381: "Хиде", # @tghjudy
6714237814: "Слешик", # @Slashichan
}
# Айди групп-администраторов
important_groups_ids = {
1087968824: "GroupAnonymousBot",
-1002247934490: "Сплетни_лавочек",
-1002124483077: "Труба_Сквад",
-1002123850090: "Тест_Чат",
-1001552311087: "Всеудет_Хорошо",
}
# Айди важных пользователей бота
important_users_list_ids = {
7145369362: "Артур", # @i_toksichen
1219440132: "Данил", # @ohwtfuck
1443833264: "Виктор", # @B500OP98
5424384921: "Олег", # @s1s2s3sf
556943853: "Ваня", # @skodaracing24
1295708467: "Степан", # @No_step_toback
}
# Айди важных каналов
important_channel_ids = {
# 7145369362: "Артур", # @i_toksichen
}

View File

@@ -15,7 +15,7 @@ command_text = "BAN"
# Функция проверки блокировки пользователя в боте # Функция проверки блокировки пользователя в боте
@router.message(lambda message: message.from_user.id in ListId.ban_list_id) @router.message(lambda message: message.from_user.id in ListId.ban_list_id)
async def banned_user(message: types.Message): async def banned_user(message: types_msg.Message):
try: try:
# Вывод сообщения пользователю # Вывод сообщения пользователю
chat_id = await find_chat_id(message) chat_id = await find_chat_id(message)
@@ -36,7 +36,7 @@ async def banned_user(message: types.Message):
# Обработчик команды /ban # Обработчик команды /ban
@router.message(Command("ban", "ифт", "бан", ",fy", prefix=BotEdit.prefixs, ignore_case=True)) @router.message(Command("ban", "ифт", "бан", ",fy", prefix=BotEdit.prefixs, ignore_case=True))
async def ban_user_by_username(message: types.Message): async def ban_user_by_username(message: types_msg.Message):
try: try:
text = f"использовал(а) команду /{command_text.lower()}" text = f"использовал(а) команду /{command_text.lower()}"

View File

@@ -12,10 +12,10 @@ command_text = "Send"
# Обработчик команды /send для отправки сообщения определенному пользователю (в разработке) # Обработчик команды /send для отправки сообщения определенному пользователю (в разработке)
@router.message(F.from_user.id.in_(ListId.important_ids), @router.message(F.from_user.id.in_(ListId.important),
Command("send", "отправить", "отправ", "s", "ыутв", "jnghfdbnm", "jnghfd", Command("send", "отправить", "отправ", "s", "ыутв", "jnghfdbnm", "jnghfd",
prefix=BotEdit.prefixs, ignore_case=True)) prefix=BotEdit.prefixs, ignore_case=True))
async def send_message(message: types.Message): async def send_message(message: types_msg.Message):
try: try:
if message.chat.id in ListId.adm_list_id: if message.chat.id in ListId.adm_list_id:
text = f"использовал(а) команду /{command_text.lower()}" text = f"использовал(а) команду /{command_text.lower()}"
@@ -37,7 +37,7 @@ async def send_message(message: types.Message):
await bot.send_message(chat_id=user_id, text=text_send) await bot.send_message(chat_id=user_id, text=text_send)
# Логирование # Логирование
user_id = find_people_id(user_id) user_id = find_imp_id(user_id)
await cmd_logginger(message, command_text, text) await cmd_logginger(message, command_text, text)
# Логирование и отчет об отправке # Логирование и отчет об отправке

View File

@@ -12,7 +12,7 @@ router = Router(name="media_func")
# @router.message(F.photo, ~F.caption) # @router.message(F.photo, ~F.caption)
async def handle_photo_wo_caption(message: types.Message): async def handle_photo_wo_caption(message: types_msg.Message):
caption = f"Простите, я не могу это увидеть. Вы можете описать что это?" caption = f"Простите, я не могу это увидеть. Вы можете описать что это?"
await message.reply_photo( await message.reply_photo(
photo=message.photo[-1].file_id, photo=message.photo[-1].file_id,
@@ -22,14 +22,14 @@ async def handle_photo_wo_caption(message: types.Message):
# @router.message(F.photo, F.caption.contains("please")) # @router.message(F.photo, F.caption.contains("please"))
async def handle_photo_with_please_caption(message: types.Message): async def handle_photo_with_please_caption(message: types_msg.Message):
text = f"Простите, я не могу это увидеть." text = f"Простите, я не могу это увидеть."
await message.reply(text) await message.reply(text)
return text return text
# @router.message(any_media_filter, ~F.caption) # @router.message(any_media_filter, ~F.caption)
async def handle_any_media_wo_caption(message: types.Message): async def handle_any_media_wo_caption(message: types_msg.Message):
if message.document: if message.document:
await message.reply_document( await message.reply_document(
document=message.document.file_id, document=message.document.file_id,
@@ -49,7 +49,7 @@ async def handle_any_media_wo_caption(message: types.Message):
# @router.message(any_media_filter, F.caption) # @router.message(any_media_filter, F.caption)
async def handle_any_media_w_caption(message: types.Message): async def handle_any_media_w_caption(message: types_msg.Message):
text = f"Что-то на медиа. Твой текст: {message.caption!r}" text = f"Что-то на медиа. Твой текст: {message.caption!r}"
await message.reply(text) await message.reply(text)
return text return text

View File

@@ -6,7 +6,7 @@ from magic_filter import RegexpMode
from re import Match from re import Match
from BotLibrary import logginger from BotLibrary import logginger
import config import configs
# Настройка экспорта модулей и роутера # Настройка экспорта модулей и роутера
__all__ = ("router",) __all__ = ("router",)
@@ -15,7 +15,7 @@ router = Router(name="regular_handlers")
# Хэндлер на циферный код (регулярная функция) # Хэндлер на циферный код (регулярная функция)
@router.message( @router.message(
F.from_user.id.in_(config.ListId.adm_list_id), F.from_user.id.in_(configs.ListId.adm_list_id),
F.text.regexp(r"(\d+)", mode=RegexpMode.MATCH).as_("code"), F.text.regexp(r"(\d+)", mode=RegexpMode.MATCH).as_("code"),
) )
async def handle_code(message: types.Message, code: Match[str]): async def handle_code(message: types.Message, code: Match[str]):

View File

@@ -9,6 +9,9 @@ from BotCode.routers import set_commands
# Запуск основного кода # Запуск основного кода
async def main(): async def main():
# Создание логгера
await setup_logger()
# Подключение ANSI в стандартное Windows_cmd # Подключение ANSI в стандартное Windows_cmd
just_fix_windows_console() just_fix_windows_console()
@@ -22,12 +25,12 @@ async def main():
await set_commands() # Установка команд бота await set_commands() # Установка команд бота
await bot_get_info() # Получение информации о боте await bot_get_info() # Получение информации о боте
# Создание логгера и оповещение о запуске # Оповещение о запуске с информацией бота
await setup_logger()
logger.bind(log_type="AEP", user="Console").info(f"Начало запуска бота @{BotInfo.username}...") logger.bind(log_type="AEP", user="Console").info(f"Начало запуска бота @{BotInfo.username}...")
bot_info_out() bot_info_out()
# Включение опроса бота # Включение опроса бота
await bot.delete_webhook()
await dp.start_polling(bot) await dp.start_polling(bot)

2
poetry.lock generated
View File

@@ -1331,4 +1331,4 @@ propcache = ">=0.2.0"
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.10" python-versions = "^3.10"
content-hash = "5c732bafa39062b05f576fe9af74f08f65896e2af2788bbc502ccc8194f3cb68" content-hash = "097c1d241fa62752422275b6a77b4a01de1d4774329740c01f9abffed43ee7c1"

View File

@@ -1,9 +1,14 @@
# project_count_line.py
# Файл для подсчета количества строк и файлов
import os import os
# Настройка экспорта модулей # Настройка экспорта модулей
__all__ = ("count_lines_in_python_files",) __all__ = ("count_lines_in_python_files",)
type_messages = "count_lines_project" type_messages = "count_lines_project"
# Функция подсчета строк и кода python3
def count_lines_in_python_files(directory): def count_lines_in_python_files(directory):
total_lines = 0 total_lines = 0
total_files = 0 total_files = 0
@@ -32,8 +37,8 @@ def count_lines_in_python_files(directory):
return total_lines, total_files return total_lines, total_files
# Задайте путь к вашей директории # Задайте путь к вашей директории
directory_path = r'/' directory_path = r'./'
lines_count, files_count = count_lines_in_python_files(directory_path) lines_count, files_count = count_lines_in_python_files(directory_path)
print(f'Общее количество строк в файлах .py: {lines_count}') print(f"Общее количество строк в файлах .py: {lines_count}")
print(f'Общее количество файлов .py: {files_count}') print(f"Общее количество файлов .py: {files_count}")

View File

@@ -27,6 +27,8 @@ charset-normalizer = "^3.4.0"
frozenlist = "^1.5.0" frozenlist = "^1.5.0"
customtkinter = "^5.2.2" customtkinter = "^5.2.2"
pillow = "^11.0.0" pillow = "^11.0.0"
certifi = "^2024.12.14"
idna = "^3.10"
[build-system] [build-system]

171
start.bat
View File

@@ -1,93 +1,158 @@
@echo off @echo off
REM start.bat REM start.bat
REM Этот файл нужно запускать перед стартом проекта REM Этот файл нужно запускать перед стартом проекта.
REM Он создает локальное окружение, скачивает все зависимости REM Он создает локальное окружение, скачивает все зависимости.
REM Чтобы запустить файл используйте: start start или ./start REM Чтобы запустить файл, используйте: start start или ./start.
REM Включение кодировки для Windows REM Установить кодировку UTF-8 и заголовок для консоли.
chcp 65001 > nul chcp 65001 > nul
title Запуск Бота-aiogram
cls cls
REM Изменяем заголовок окна консоли REM Проверка установки PyPy.
title Запуск Бота-aiogram
REM Убедитесь, что PyPy установлен и доступен
echo Проверка наличия PyPy... echo Проверка наличия PyPy...
pypy --version || ( pypy --version > nul 2>&1 || (
color C color C
echo PyPy не установлен. Установите PyPy и повторите попытку. echo [ОШИБКА]: PyPy не установлен. Установите PyPy и повторите попытку.
echo Установите его по ссылке: https://www.pypy.org/download.html echo Ссылка для установки: https://www.pypy.org/download.html
title Проект - PyPy не установлен! title Проект - PyPy не установлен!
pause pause
exit /b exit /b
) )
echo [OK]: PyPy установлен.
echo. echo.
REM Проверка наличия Git REM Проверка установки Git.
echo Проверка наличия Git... echo Проверка наличия Git...
git --version > nul 2>&1 || ( git --version > nul 2>&1 || (
color C color C
echo Git не установлен. Установите Git и повторите попытку. echo [ОШИБКА]: Git не установлен. Установите Git и повторите попытку.
echo Установите его по ссылке: https://git-scm.com/downloads echo Ссылка для установки: https://git-scm.com/downloads
title Проект - Git не установлен! title Проект - Git не установлен!
pause pause
exit /b exit /b
) )
echo [OK]: Git установлен.
echo. echo.
REM Проверка наличия Git репозитория REM Проверка и инициализация Git репозитория.
if not exist .git ( if not exist .git (
echo Создание Git репозитория... echo Создание Git репозитория...
git init git init > nul
echo Добавление удалённого репозитория... git remote add origin https://github.com/Whyverum/PrimoPearlBot > nul
git remote add origin https://github.com/Whyverum/PrimoPearlBot echo [OK]: Git репозиторий создан и настроен.
) else ( ) else (
echo Удалённый репозиторий уже настроен. echo [OK]: Git репозиторий уже настроен.
) )
echo. echo.
REM Создание .env для хранения токенов REM Создание виртуального окружения, если его еще нет.
echo Создаётся файл .env...
(
echo main_bot_token=Вставьте Токен бота с @BotFather
echo APIKey=Иной ключ-api
echo WebAPIKey=Иной ключ web-api
echo important_id=Иной важный айди
echo secret=Некий секрет
) > .env
echo.
echo Файл .env - успешно создан!
echo Пожалуйста, перейдите в файл и вставьте свои ключи.
pause > Вы готовы продолжить? Нажмите ENTER, чтобы продолжить!
echo.
pause > Вы уверены???Нажмите ENTER, чтобы продолжить!
REM Создание виртуального окружения, если его еще нет
if not exist .venv ( if not exist .venv (
echo Создание виртуального окружения... echo Создание виртуального окружения...
pypy -m venv .venv pypy -m venv .venv > nul
echo. if %errorlevel% neq 0 (
color C
echo [ОШИБКА]: Не удалось создать виртуальное окружение.
pause
exit /b
)
echo [OK]: Виртуальное окружение создано.
) else (
echo [OK]: Виртуальное окружение уже существует.
) )
echo.
REM Активируем виртуальное окружение REM Создание файла .env с вводом данных из консоли в папке .venv.
if not exist .venv\.env (
echo Создаётся файл .env в папке .venv...
set /p main_bot_token=Введите токен бота (main_bot_token):
set /p APIKey=Введите ключ API (APIKey):
set /p WebAPIKey=Введите ключ Web API (WebAPIKey):
set /p important_id=Введите важный ID (important_id):
set /p secret=Введите секретный ключ (secret):
REM Проверяем пустые значения.
if "%main_bot_token%"=="" (
echo [ОШИБКА]: Токен бота не может быть пустым.
pause
exit /b
)
if "%APIKey%"=="" (
echo [ОШИБКА]: Ключ API не может быть пустым.
pause
exit /b
)
if "%WebAPIKey%"=="" (
echo [ОШИБКА]: Ключ Web API не может быть пустым.
pause
exit /b
)
if "%important_id%"=="" (
echo [ОШИБКА]: Важный ID не может быть пустым.
pause
exit /b
)
if "%secret%"=="" (
echo [ОШИБКА]: Секретный ключ не может быть пустым.
pause
exit /b
)
REM Создание файла .env.
(
echo main_bot_token=%main_bot_token%
echo APIKey=%APIKey%
echo WebAPIKey=%WebAPIKey%
echo important_id=%important_id%
echo secret=%secret%
) > .venv\.env
echo [OK]: Файл .env успешно создан в папке .venv!
) else (
echo [OK]: Файл .env уже существует в папке .venv.
)
echo.
REM Активация виртуального окружения.
echo Активация виртуального окружения... echo Активация виртуального окружения...
call .venv\Scripts\activate call .venv\Scripts\activate > nul
echo. if %errorlevel% neq 0 (
color C
REM Установка Poetry, если не установлен echo [ОШИБКА]: Не удалось активировать виртуальное окружение.
echo Проверка наличия Poetry... pause
poetry --version || ( exit /b
echo Установка Poetry...
pip install poetry
) )
echo [OK]: Виртуальное окружение активировано.
echo. echo.
REM Установка зависимостей из poetry.lock и pyproject.toml REM Проверка и установка Poetry.
echo Установка зависимостей... echo Проверка наличия Poetry...
poetry install poetry --version > nul 2>&1 || (
poetry update echo Установка Poetry...
pip install poetry > nul
if %errorlevel% neq 0 (
color C
echo [ОШИБКА]: Не удалось установить Poetry.
pause
exit /b
)
echo [OK]: Poetry успешно установлен.
)
echo [OK]: Poetry установлен.
echo. echo.
REM Очистка консоли перед запуском main.py REM Установка зависимостей.
echo Установка зависимостей проекта...
poetry install > nul
if %errorlevel% neq 0 (
color C
echo [ОШИБКА]: Не удалось установить зависимости.
pause
exit /b
)
echo [OK]: Зависимости установлены.
echo.
REM Очистка консоли перед запуском.
cls cls
pause > Настройте конфигуратор или запустите main.py! echo Все готово! Настройте конфигурацию или запустите main.py.
pause