Origin #2

Merged
Whyverum merged 35 commits from origin into master 2024-12-23 18:17:17 +03:00
65 changed files with 863 additions and 705 deletions

14
.gitignore vendored
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,5 @@
# BotCode/keyboards/__init__.py
# Инициализация пакета keyboards, для работы с клавиатурами
# BotCode/keyboards/reply_kb/__init__.py
# Инициализация пакета reply_kb, для работы с клавиатурами
from aiogram import 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
@@ -22,15 +22,6 @@ def get_help_kb() -> ReplyKeyboardMarkup:
]
buttons_row = [KeyboardButton(text=num) for num in numbers]
# Один из способов создания клавиатур
#
# markup = ReplyKeyboardMarkup(
# keyboard=[buttons_row],
# resize_keyboard=True,
# )
# return markup
builder = ReplyKeyboardBuilder()
for num in numbers:
builder.button(text=num)

View File

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

View File

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

View File

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

View File

@@ -7,6 +7,9 @@ from BotLibrary import *
# Создание роутера и настройка экспорта модулей
__all__ = ("router",)
from routers.msg_default import msg_default
router = Router(name="secret_message_router")
log_type = "Admin"
@@ -16,12 +19,13 @@ keywords = ["secret", "секрет", "ыускуе", "ctrhtn",
# Обработчик команды /secret или сообщений с текстом из списка keywords
@router.message(F.from_user.id.in_(ListId.important_ids),
Command(*keywords, prefix=BotEdit.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()),
Command(*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_(keywords))
async def secret_admin_message(message: types.Message):
text = f"Привет, <b>важная персона</b>!"
await message.reply(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
# Функции с шуточными пасхалками (разобраться с логированием и ошибками)
# Небольшие шуточные пасхалки
from aiogram import Router, types, F
from aiogram.enums import ChatAction
from BotLibrary import *
from routers.msg_default import msg_default
# Создание роутера и настройка экспорта
__all__ = ("router", "secret_admin_message_finaki", "secret_admin_message_lostik",
"secret_admin_message_rishkus", "secret_admin_message_finik", "secret_admin_message_skodavano",)
__all__ = ("router",)
router = Router(name="easteggs_router")
log_type = "EastEggs"
@@ -27,7 +26,7 @@ async def secret_admin_message_finaki(message: types.Message):
# Отправка фотографии
try:
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 любит анал, тс..)",
)
@@ -38,11 +37,12 @@ async def secret_admin_message_finaki(message: types.Message):
# Дополнительное логирование
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):
text = f"Пасхалка 2 финикx найдена!"
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",
caption="Привет, это польза Фиников!")
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",
caption="Меня заставила Финаки, честно!")
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,
)
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="Россия для грустных",
)
await cmd_logginger(message, log_type, text)
return text
await msg_default(message)
# Хэндлер на текст skodavano + отправка с локального хранилища
@@ -96,11 +96,11 @@ async def secret_admin_message_skodavano(message: types.Message):
action=ChatAction.UPLOAD_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 -> Синяя изолента",
)
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(
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)
return text
await msg_default(message)
# Проверка на ошибку и ее логирование
except Exception as e:
@@ -159,7 +160,7 @@ async def secret_admin_message_finaki(message: types.Message):
# Дополнительное логирование
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)
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 .randnum_kb_cb import router as randnum_kb_cb_router
# Объявление роутера и настройка экспорта модулей
__all__ = ("router", )
router = Router(name="callback_handlers")
# Список подключаемых роутеров сверху-вниз
router.include_routers(
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.types import CallbackQuery
from keyboards.inline_kb.actor_kb import ButtonInl
# Создание роутера и настройка экспорта модулей
__all__ = ("router",)
router = Router(name="actor_kb_cb_router")
# Тестирование реферальных ссылок
@router.callback_query(F.data == ButtonInl.random_site_cbd)
async def random_site_cb(callback_query: CallbackQuery):
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)
async def random_num_dice_cb(callback_query: CallbackQuery):
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)
async def random_num_dice_modal_cb(callback_query: CallbackQuery):
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.types import CallbackQuery
from keyboards.inline_kb.randnum_kb import ButtonInl, get_randnum_kb
# Создание роутера и настройка экспорта модулей
__all__ = ("router",)
router = Router(name="randnum_kb_cb_router")
# Тестирование редактирования сообщения
@router.callback_query(F.data == ButtonInl.mark_cbd)
async def random_site_cb(callback_query: CallbackQuery):
await callback_query.answer()

View File

@@ -6,10 +6,10 @@ from aiogram import Router, types, F
from aiogram.filters import Command
from BotLibrary import *
from .user_cmd.start_cmd import log_type as start_cmd_text
from .user_cmd.help_cmd import log_type as help_cmd_text
from .user_cmd.exit_cmd import log_type as exit_cmd_text
from .user_cmd.start_time_cmd import log_type as start_time_cmd_text
from .user_cmd.start_cmd import description as start_description, log_type as start_cmd
from .user_cmd.help_cmd import description as help_description, log_type as help_cmd
from .user_cmd.exit_cmd import description as exit_description, log_type as exit_cmd
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 для использования в чате
@router.message(F.from_user.id.in_(ListId.important_ids),
Command(*secret_keywords, prefix=BotEdit.prefixs, ignore_case=True))
@router.message(F.from_user.id.func(lambda user_id: str(user_id) in DataID.important.keys()),
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():
bot_commands = [
types.BotCommand(command=start_cmd_text.lower(), description="Запустить бота"),
types.BotCommand(command=help_cmd_text.lower(), description="Получить помощь"),
types.BotCommand(command=help_cmd_text.lower(), description="Получить помощь"),
types.BotCommand(command=start_time_cmd_text.lower(), description="Время запуска"),
types.BotCommand(command=exit_cmd_text.lower(), description="Выйти из чата (в разработке)"),
types.BotCommand(command="command", description="Пустая команда"),
types.BotCommand(command=start_cmd.lower(), description=start_description),
types.BotCommand(command=help_cmd.lower(), description=help_description),
types.BotCommand(command=start_time_cmd.lower(), description=start_time_description),
types.BotCommand(command=exit_cmd.lower(), description=exit_description),
]
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 BotLibrary import *
from keyboards.inline_kb.actor_kb import get_actor_kb
from routers.msg_default import *
# Создание роутера и настройка экспорта модулей
# Создание роутера, переменных и настройка экспорта модулей
__all__ = ("router", "cmd_actor", "log_type",)
router = Router(name="actor_router")
log_type = "Actor"
description = "Описание"
# Список ключевых слов для команды
@@ -17,7 +19,7 @@ keywords = ["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))
async def cmd_actor(message: types.Message):
try:
@@ -33,7 +35,7 @@ async def cmd_actor(message: types.Message):
# Активация логгера
await cmd_logginger(message, log_type, text)
return text
await msg_default(message)
# Проверка на ошибку и ее логирование
except Exception as e:

View File

@@ -4,18 +4,20 @@
from aiogram import Router, types, F
from aiogram.filters import Command
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")
log_type = "Exit"
description = "Выйти из чата (в разработке)"
# Список ключевых слов для команды
keywords = ["выход", "ds[j;", "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))
async def exit_cmd(message: types.Message):
try:
@@ -26,7 +28,7 @@ async def exit_cmd(message: types.Message):
# Активация логгера
await cmd_logginger(message, log_type, text)
return text
await msg_default(message)
# Проверка на ошибку и ее логирование
except Exception as e:

View File

@@ -5,11 +5,13 @@ from aiogram import Router, types, F
from aiogram.filters import Command
from BotLibrary import *
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")
log_type = "Help"
description = "Получить помощь"
# Список ключевых слов для команды
keywords = ["help", "info", "помощь", "инфо", "?", "информация", "рудз", "штащ", "byaj",
@@ -17,7 +19,7 @@ keywords = ["help", "info", "помощь", "инфо", "?", "информаци
# Хэндлер на команду /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))
async def cmd_help(message: types.Message):
try:
@@ -28,7 +30,7 @@ async def cmd_help(message: types.Message):
# Активация логгера
await cmd_logginger(message, log_type, text)
return text
await msg_default(message)
# Проверка на ошибку и ее логирование
except Exception as e:

View File

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

View File

@@ -5,18 +5,20 @@ from aiogram import Router, types, F
from aiogram.filters import Command
from BotLibrary import *
from keyboards.inline_kb.randnum_kb import get_randnum_kb
from routers.msg_default import msg_default
# Создание роутера и экспорта модулей
# Создание роутера, переменных и экспорта модулей
__all__ = ("router", "cmd_randnum", "log_type",)
router = Router(name="randnum_router")
log_type = "Randnum"
description = "Описание"
# Список ключевых слов для команды
keywords = ["кфтвтгь", "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))
async def cmd_randnum(message: types.Message):
text = "Работа с рандомом оценок!"
@@ -27,4 +29,4 @@ async def cmd_randnum(message: types.Message):
# Активация логгера
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 BotLibrary import *
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")
log_type = "Start"
description = "Запустить бота"
# Список ключевых слов для команды
keywords = ["start", "старт", "запуск", "пуск", "on", "вкл", "с", "s", "ы",
@@ -17,7 +19,7 @@ keywords = ["start", "старт", "запуск", "пуск", "on", "вкл", "
# Обработчик команды /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(CommandStart())
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)
return text
await msg_default(message)
# Проверка на ошибку и ее логирование
except Exception as e:

View File

@@ -4,11 +4,13 @@
from aiogram import Router, types, F
from aiogram.filters import Command
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")
log_type = "Start_Time"
description = "Время запуска"
# Список ключевых слов для команды
start_time_keywords = ["start_time", "stime", "старт_время", "время_старта", "сремя",
@@ -17,7 +19,7 @@ start_time_keywords = ["start_time", "stime", "старт_время", "врем
# Хэндлер на команду /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))
async def start_time(message: types.Message, started_at: str, started_at_msk: str):
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)
return text
await msg_default(message)
# Проверка на ошибку и ее логирование
except Exception as e:

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,35 +2,31 @@
# Закачка всех аватаров пользователей
import os
from aiogram import Router, types
from aiogram import types
from aiogram.types import UserProfilePhotos
from BotLibrary import *
# Создание роутера и настройка экспорта модулей
__all__ = ("router", "download_user_photos",)
router = Router(name="avatar_router")
__all__ = ("download_user_photos",)
log_type = "AvatarUser"
# Функция закачки аватарок пользователя
async def download_user_photos(message: types.Message):
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_id = find_people_id(user_id)
user_profile_photos: UserProfilePhotos = await bot.get_user_profile_photos(message.from_user.id)
# Проверка наличия фотографий
if user_profile_photos.total_count == 0:
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)
# Закачка аватарок пользователя

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 .library import *
from .media import *
from .config import *
from .configs import *

View File

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

View File

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

View File

@@ -5,9 +5,10 @@ import os
from loguru import logger
from datetime import datetime
from config import BotVariables
from .type_messages import *
from .find_ids import find_chat_id
from ..configs import *
from ..library.time import TimeVariable
from .types_msg import types_message, types_chat
from .find_ids import find_imp_id
# Настройка экспорта модулей и логирования
__all__ = ("write_message_to_file",)
@@ -19,12 +20,12 @@ async def write_message_to_file(message):
try:
# Создание переменных с информацией
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)
# Переменные для логов сообщений
date = datetime.now().strftime(BotVariables.time_format)
username = message.from_user.username if message.from_user.username else "No username"
date = datetime.now().strftime(TimeVariable.format)
username = message.from_user.username if message.from_user.username else "Нет @username"
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))
# Запись информации в файл
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:
file.write(f"{log_shablon} Тип: {message_type}\n\n")
else:
file.write(f"{log_shablon} ChatID: {chat_id} | Текст: {message.text}\n\n")
return f"Сообщение пользователя успешно записано в файл."
# Проверка на ошибку и ее логирование
except Exception as e:
text_error = f"Ошибка в сохранении сообщения в файл: {str(e)}"
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
from datetime import datetime
from timer import sleep
from colorama import Fore
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.decorator import TextDecorator
# Настройка экспорта модулей и логирования
__all__ = ("bot_info_out",)
@@ -17,14 +18,14 @@ log_type = "Start_INFO"
# Функция для получения информации о боте и выводе ее в консоль и файл
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_postname = f" Доп. имя: {BotInfo.last_name}\n"
bot_username = f" Юзернейм: @{BotInfo.username}\n"
bot_id = f" ID: {BotInfo.id}\n"
bot_language = f" Языковой код: {BotInfo.language_code}\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_added_to_attachment_menu = f" Добавлен в меню вложений: {BotInfo.added_to_attachment_menu}\n"
bot_supports_inline_queries = f" Поддерживает инлайн-запросы: {BotInfo.supports_inline_queries}\n"
@@ -39,20 +40,20 @@ def bot_info_out():
# Печатаем все данные в консоль с задержкой в 1 секунду
sleep(1)
print(TextDecorator.BLUE, bot_all_info, TextDecorator.RESET_DECORATOR)
print(Fore.CYAN + bot_all_info)
# Записываем информацию в файл
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}")
# Создание файла 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")
return bot_all_info
# Проверка на ошибку и ее логирование
except Exception as e:
text_error = f"Ошибка при получении ID пользователя: {e}"
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
# Запись информации о пользователях в файл "user_data.db" (Сделать счетчик пользователей)
# Запись информации о пользователи в базу данных
import os
import json
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",)
@@ -12,13 +15,13 @@ log_type = "User_data_file"
# Функция записи информации в JSON-файл
def write_user_info_to_file(user):
directory = os.path.dirname(ImportantPath.user_info_file)
def write_user_info_to_file(user: User):
directory = os.path.dirname(ProjectPath.user_info_file)
if not os.path.exists(directory):
os.makedirs(directory)
if os.path.exists(ImportantPath.user_info_file):
with open(ImportantPath.user_info_file, "r", encoding=BotVariables.encoding) as file:
if os.path.exists(ProjectPath.user_info_file):
with open(ProjectPath.user_info_file, "r", encoding=default_encod) as file:
try:
user_data = json.load(file)
except json.JSONDecodeError:
@@ -29,19 +32,24 @@ def write_user_info_to_file(user):
user_record = format_user_record(user)
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)
return f"Информация о пользователе успешно записана или обновлена."
# Функция форматирования вывода в JSON-файл
def format_user_record(user):
def format_user_record(user: User):
first_name = getattr(user, 'first_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 {
"Время знакомства": datetime.datetime.now().strftime(BotVariables.time_format),
"Время знакомства": datetime.datetime.now().strftime(TimeVariable.format),
"Имя": first_name,
"Фамилия": last_name,
"Юзернейм": f"@{getattr(user, 'username', 'Не указано')}",
@@ -50,5 +58,5 @@ def format_user_record(user):
"Бот": getattr(user, 'is_bot', False),
"Премиум": getattr(user, 'is_premium', False),
"Язык": 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 .decorator import *
from .logger import *
from .edit_bot 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
# Создание и настройка бота в одном файле
import pytz
from tzlocal import get_localzone
from datetime import datetime
from aiogram import Dispatcher, Bot, F
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
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"
# Получение времени по 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["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["logs"] = []
dp["users"] = {}
dp["sessions"] = {}
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["modules"] = {}
dp["state"] = {}
@@ -58,21 +34,33 @@ dp["database"] = None
# Объявление экземпляров и переменных
bot = Bot(token=bot_token, default=DefaultBotProperties(parse_mode=ParseMode.HTML)) # Объявление бота
scheduler = AsyncIOScheduler(timezone=BotVariables.time_zone) # Создание планировщика
bot_properties = DefaultBotProperties(
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 # Фильтр-медиа
# Класс для хранения данных о боте (некоторые переменные даны как шаблон)
class BotInfo:
# Статические переменные для хранения данных
id = 10000000
first_name = "TESTBOT"
last_name = ""
username = "testbot"
id = None
first_name = None
last_name = None
username = None
description = None
short_description = None
can_join_groups = None
can_read_all_group_messages = None
language_code = BotVariables.language
prefixs = BotVariables.prefixs
is_premium = None
added_to_attachment_menu = None
supports_inline_queries = None
@@ -86,13 +74,16 @@ class BotInfo:
cls.first_name = bot_info.first_name
cls.last_name = bot_info.last_name
cls.username = bot_info.username
cls.can_join_groups = bot_info.can_join_groups
cls.can_read_all_group_messages = bot_info.can_read_all_group_messages
cls.description = getattr(bot_info, 'description', '') # Default to empty string if no description
cls.short_description = getattr(bot_info, 'description', '')
cls.language_code = bot_info.language_code
cls.is_premium = bot_info.is_premium
cls.added_to_attachment_menu = bot_info.added_to_attachment_menu
cls.supports_inline_queries = bot_info.supports_inline_queries
cls.can_connect_to_business = bot_info.can_connect_to_business
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,
'last_name': bot_info_data.last_name,
'username': bot_info_data.username,
'can_join_groups': bot_info_data.can_join_groups,
'can_read_all_group_messages': bot_info_data.can_read_all_group_messages,
'language_code': BotVariables.language,
'description': getattr(bot_info_data, 'description', ''),
'short_description': getattr(bot_info_data, 'description', ''),
'language_code': bot_info_data.language_code,
'prefixs': BotVariables.prefixs,
'is_premium': bot_info_data.is_premium,
'added_to_attachment_menu': bot_info_data.added_to_attachment_menu,
'supports_inline_queries': bot_info_data.supports_inline_queries,
'can_connect_to_business': bot_info_data.can_connect_to_business,
'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
from config import ImportantPath, BotVariables
from BotLibrary.configs import ProjectPath, TypeDirectory
# Настройка экспорта модулей и логирования
__all__ = ("create_directories", "setup_directories", )
@@ -22,8 +22,7 @@ def create_directories(base_directory, subdirectories):
# Начальная установка пустых директорий
def setup_directories():
create_directories(ImportantPath.bot_personal_media, BotVariables.bot_media_directories)
create_directories(ImportantPath.bot_received_media, BotVariables.bot_media_directories)
create_directories(ImportantPath.msg, BotVariables.bot_msg_directories)
create_directories(ImportantPath.bot_files, BotVariables.bot_avatar_directories)
return f"Пустые директории - успешно созданы!"
create_directories(ProjectPath.personal_media, TypeDirectory.media_directories)
create_directories(ProjectPath.received_media, TypeDirectory.media_directories)
create_directories(ProjectPath.bot_files, TypeDirectory.avatar_directories)
create_directories(ProjectPath.msg, TypeDirectory.msg_directories)

View File

@@ -4,7 +4,7 @@
from aiogram.types import ChatAdministratorRights
from loguru import logger
from config import BotEdit
from BotLibrary.configs import BotEdit
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)
return f"Короткое описание бота изменено!"
else:
return f"Короткое описание бота уже установлено и не требует изменений."
return f"Короткое описание бота уже установлено и не требует изменений."

View File

@@ -3,21 +3,56 @@
import sys
from loguru import logger
from config import ImportantPath, LogsSet
from ..analitics.message_to_file import write_message_to_file
from ..analitics.user_data_to_file import write_user_info_to_file
from BotLibrary.configs import ProjectPath
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",
"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():
logger.remove() # Удаляем все логгеры
# Пустой логгер для записи отступов в файл уровня TRACE
logger.add(ImportantPath.log_file,
logger.add(ProjectPath.log_file,
rotation=LogsSet.max_size,
format="\n\n\n",
backtrace=True,
@@ -32,7 +67,7 @@ async def setup_logger():
format=LogsSet.info_text,
level="INFO",
filter=lambda record: record["level"].name == "INFO")
logger.add(ImportantPath.log_file,
logger.add(ProjectPath.log_file,
rotation=LogsSet.max_size,
format=LogsSet.info_text,
backtrace=True,
@@ -46,21 +81,19 @@ async def setup_logger():
format=LogsSet.error_text,
level="ERROR",
filter=lambda record: record["level"].name == "ERROR")
logger.add(ImportantPath.log_error_file,
logger.add(ProjectPath.log_error_file,
rotation=LogsSet.max_size,
format=LogsSet.error_text,
backtrace=True,
diagnose=True,
level="ERROR",
filter=lambda record: record["level"].name == "ERROR")
return f"Логгеры - подключены!"
# Запись сообщения в файл и информации о пользователи
async def logginger(message):
write_user_info_to_file(message.from_user)
await write_message_to_file(message)
return f"Сообщение и информация о пользователи - успешно записаны!"
# Создание функции логирования на обычные сообщения
@@ -72,14 +105,12 @@ async def common_msg_logginger(message, name, message_type, log_type):
else:
logger.bind(log_type=log_type, user=f"@{message.from_user.username}").info(
f"Получено сообщение из ({name}) : {message.text}")
return f"Логгер на обычный сообщения - успешно активирован"
# Специальный логгер для команд. Вывод в консоль, файл и запись информации о пользователи
async def cmd_logginger(message, log_type, text):
await logginger(message)
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"
await logginger(message)
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 .db import *
# Создание роутера "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)
async def banned_user(message: types.Message):
async def banned_user(message: types_msg.Message):
try:
# Вывод сообщения пользователю
chat_id = await find_chat_id(message)
@@ -36,7 +36,7 @@ async def banned_user(message: types.Message):
# Обработчик команды /ban
@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:
text = f"использовал(а) команду /{command_text.lower()}"

View File

@@ -12,10 +12,10 @@ command_text = "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",
prefix=BotEdit.prefixs, ignore_case=True))
async def send_message(message: types.Message):
async def send_message(message: types_msg.Message):
try:
if message.chat.id in ListId.adm_list_id:
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)
# Логирование
user_id = find_people_id(user_id)
user_id = find_imp_id(user_id)
await cmd_logginger(message, command_text, text)
# Логирование и отчет об отправке

View File

@@ -12,7 +12,7 @@ router = Router(name="media_func")
# @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"Простите, я не могу это увидеть. Вы можете описать что это?"
await message.reply_photo(
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"))
async def handle_photo_with_please_caption(message: types.Message):
async def handle_photo_with_please_caption(message: types_msg.Message):
text = f"Простите, я не могу это увидеть."
await message.reply(text)
return text
# @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:
await message.reply_document(
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)
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}"
await message.reply(text)
return text

View File

@@ -6,7 +6,7 @@ from magic_filter import RegexpMode
from re import Match
from BotLibrary import logginger
import config
import configs
# Настройка экспорта модулей и роутера
__all__ = ("router",)
@@ -15,7 +15,7 @@ router = Router(name="regular_handlers")
# Хэндлер на циферный код (регулярная функция)
@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"),
)
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():
# Создание логгера
await setup_logger()
# Подключение ANSI в стандартное Windows_cmd
just_fix_windows_console()
@@ -22,12 +25,12 @@ async def main():
await set_commands() # Установка команд бота
await bot_get_info() # Получение информации о боте
# Создание логгера и оповещение о запуске
await setup_logger()
# Оповещение о запуске с информацией бота
logger.bind(log_type="AEP", user="Console").info(f"Начало запуска бота @{BotInfo.username}...")
bot_info_out()
# Включение опроса бота
await bot.delete_webhook()
await dp.start_polling(bot)

2
poetry.lock generated
View File

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

View File

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

View File

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

171
start.bat
View File

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