48 Commits

Author SHA1 Message Date
Whyverum
084a96fad8 Исправлен баг с айди 2024-12-23 22:22:34 +07:00
Whyverum
7dec6de067 Исправлен баг с импортом 2024-12-23 22:11:53 +07:00
Whyverum
46e975aa90 Создание установщика аватарок и информации в бд 2024-12-23 22:11:36 +07:00
Whyverum
f0560571dc Инлайн-посты (в разработке) 2024-12-23 22:11:03 +07:00
Whyverum
1b6c9725f5 Исправлены баги с записью в файл 2024-12-23 22:09:16 +07:00
Whyverum
7dd30d0d95 Поиск айди пользователей улучшен 2024-12-23 22:08:35 +07:00
Whyverum
4e63871c61 Улучшение логгеров 2024-12-23 22:08:23 +07:00
Whyverum
cad15e0d3a Различные функции с медиа (старые) 2024-12-23 22:08:05 +07:00
Whyverum
d62203c693 Удаление вебука и установление логгеров 2024-12-23 22:07:53 +07:00
Whyverum
dc6c70cf77 Обновление загрузчика аватарок 2024-12-23 22:07:12 +07:00
Whyverum
2e75264af9 Автономная создание директорий 2024-12-23 22:06:49 +07:00
Whyverum
0cabaf56e6 Более автономная установка списка команд 2024-12-23 22:06:29 +07:00
Whyverum
41f7b918ec Изменение базы данных пользователей 2024-12-23 22:06:11 +07:00
Whyverum
1bb1cc60fb Обработчик команды /send (в разработке) 2024-12-23 22:05:40 +07:00
Whyverum
b793233c0b Обработчик команды /secret 2024-12-23 22:05:28 +07:00
Whyverum
7e9dfd4d1b Подсчетчик кода в проекте 2024-12-23 22:05:13 +07:00
Whyverum
c8af3efb0b Обработчик обычных сообщений 2024-12-23 22:04:57 +07:00
Whyverum
38040368ed Проверка на день рождение (проверить) 2024-12-23 22:04:34 +07:00
Whyverum
c39453bd7c Обработчик команды /start_time и времени 2024-12-23 22:04:12 +07:00
Whyverum
133c8fa843 Обработчик команды /start 2024-12-23 22:03:38 +07:00
Whyverum
9e229bc691 Обработчик команды /more 2024-12-23 22:03:12 +07:00
Whyverum
97ffc61aa2 Обработчик команды /help 2024-12-23 22:03:04 +07:00
Whyverum
154ae6af27 Обработчик команды /exit 2024-12-23 22:02:54 +07:00
Whyverum
e35e377d5c Обработчик команды /ban 2024-12-23 22:02:46 +07:00
Whyverum
9b39866065 Обработчик команды /actor 2024-12-23 22:02:36 +07:00
Whyverum
6853470162 Новые базовые функции команд 2024-12-23 22:02:12 +07:00
Whyverum
05a79c4144 Обновленные версии зависимостей 2024-12-23 22:01:53 +07:00
Whyverum
22b8181e8c Регулярные выражения (не используется) 2024-12-23 22:01:33 +07:00
Whyverum
e3543c2433 Команда /randnum 2024-12-23 22:01:10 +07:00
Whyverum
9bb313759a Проверка всех типов сообщений 2024-12-23 22:00:20 +07:00
Whyverum
8488c3def4 Установщик проекта на PyPy (сделать выбор+в разработке) 2024-12-23 21:59:53 +07:00
Whyverum
8493cbb76f Функции декорирования удалены 2024-12-23 21:59:25 +07:00
Whyverum
f6d9559a4c Исправлены баги с игнорированием пакетов 2024-12-23 21:59:12 +07:00
Whyverum
114e8ceb0d Система конфигов разбита на модули 2024-12-23 21:59:00 +07:00
Whyverum
03cf587919 Улучшенная настройка бота 2024-12-23 21:58:21 +07:00
Whyverum
08cb5eaa35 Улучшение инициализаторов пакетов 2024-12-23 21:57:34 +07:00
Whyverum
1bbef7e378 Восстановлена работа модуля timer 2024-12-18 12:23:00 +07:00
Whyverum
c2bddb3826 Кастомная библиотека времени (в разработке) 2024-12-18 12:23:00 +07:00
Whyverum
7cb738cda8 Удалена библиотека ошибок 2024-12-18 12:23:00 +07:00
Whyverum
2f926825c1 Багфиксы с командами 2024-12-18 12:23:00 +07:00
Whyverum
59d584f1c8 Багфиксы с командами 2024-12-18 12:23:00 +07:00
Whyverum
5762a5d6ad Новая команда /randnum редактирует сообщение и число 2024-12-18 12:23:00 +07:00
Whyverum
efa9e11839 Исправлены баги с командой /more 2024-12-18 12:23:00 +07:00
Whyverum
59038253e7 Фразы-наводки перенесены в иной файл 2024-12-18 12:23:00 +07:00
Whyverum
d7357347ba Клавиатура для инлайн кнопок 2024-12-18 12:23:00 +07:00
Whyverum
c05f8e3f5f Примеры использование инлайн-клавиатуры для редактирования сообщения 2024-12-18 12:23:00 +07:00
Whyverum
6d9b59bbfb Примеры использование инлайн-клавиатуры 2024-12-18 12:23:00 +07:00
Whyverum
3c350c3246 Инициализация модулей 2024-12-18 12:23:00 +07:00
71 changed files with 1186 additions and 757 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

@@ -3,5 +3,5 @@
from .keyboards import *
from .routers import *
from .time import *
from .timer import *
from .inline import *

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

@@ -2,19 +2,18 @@
# Инициализация пакета keyboards, для работы с клавиатурами
from aiogram import Router
from .start_kb import router as start_kb_router
from .help_kb import router as help_kb_router
from .more_kb import router as more_kb_router
from .inline_kb import router as inline_kb_router
from .reply_kb import router as reply_kb_router
from .inline_kb import *
from .reply_kb import *
# Объявление роутера и настройка экспорта модулей
__all__ = ("router",)
__all__ = ("router", "inline_kb", "reply_kb",)
router = Router(name="kb_router")
# Список подключаемых роутеров сверху-вниз
router.include_routers(
start_kb_router,
help_kb_router,
more_kb_router,
inline_kb_router,
reply_kb_router,
)

View File

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

View File

@@ -0,0 +1,54 @@
# BotCode/keyboards/inline_kb/actor_kb.py
# Создания инлайн-клавиатуры на команду: /actor
from aiogram import Router
from aiogram.types import InlineKeyboardMarkup
from aiogram.utils.keyboard import InlineKeyboardBuilder
# Создание роутера и настройка экспорта
__all__ = ("router", "get_actor_kb", "kb_text", "ButtonInl",)
kb_text = "ActorKb"
router = Router(name="actor_kb_router")
# Класс с параметрами кнопок
class ButtonInl:
tg_chn = "Канал в тг!"
tg_chn_url = "https://t.me/adeptusfiziks"
tg_chat = "Чатик в тг)"
tg_chat_url = "https://t.me/+T8mzbb_StRpiNDdi"
web_text = "Веселая игра скачать"
web_url = "https://gamejolt.com/games/UndertaleYellow/136925"
random_site = "Рандомный сайт"
random_site_cbd = "random_site_cbd"
random_num_dice = "Рандомное число"
random_num_dice_cbd = "random_num_dice_cbd"
random_num_modal = "Рандомный виджет"
random_num_modal_cdb = "random_num_modal_cdb"
# Функция создания клавиатуры на команду: /actor
def get_actor_kb() -> InlineKeyboardMarkup:
# Создаем билдер клавиатуры
builder = InlineKeyboardBuilder()
# Добавляем кнопки, группируя их по строкам
builder.button(text=ButtonInl.tg_chn, url=ButtonInl.tg_chn_url)
builder.button(text=ButtonInl.tg_chat, url=ButtonInl.tg_chat_url)
builder.button(text=ButtonInl.web_text, url=ButtonInl.web_url)
builder.button(text=ButtonInl.random_site, callback_data=ButtonInl.random_site_cbd)
builder.button(text=ButtonInl.random_num_dice, callback_data=ButtonInl.random_num_dice_cbd)
builder.button(text=ButtonInl.random_num_modal, callback_data=ButtonInl.random_num_modal_cdb)
builder.adjust(2, 1)
return builder.as_markup()

View File

@@ -0,0 +1,27 @@
# BotCode/keyboards/inline_kb/randnum_kb.py
# Создания инлайн-клавиатуры на команду: /randnum
from aiogram import Router
from aiogram.types import InlineKeyboardMarkup
from aiogram.utils.keyboard import InlineKeyboardBuilder
# Создание роутера и настройка экспорта
__all__ = ("router", "get_randnum_kb", "kb_text", "ButtonInl",)
kb_text = "RandNumKb"
router = Router(name="actor_kb_router")
# Класс с параметрами кнопок
class ButtonInl:
mark_cbd = "mark_cbd"
# Функция создания клавиатуры на команду: /actor
def get_randnum_kb(text_msg="Получить ответ") -> InlineKeyboardMarkup:
# Создаем билдер клавиатуры
builder = InlineKeyboardBuilder()
# Добавляем кнопки, группируя их по строкам
builder.button(text=text_msg, callback_data=ButtonInl.mark_cbd)
return builder.as_markup()

View File

@@ -0,0 +1,20 @@
# BotCode/keyboards/reply_kb/__init__.py
# Инициализация пакета reply_kb, для работы с клавиатурами
from aiogram import Router
from .start_kb import router as start_kb_router
from .help_kb import router as help_kb_router
from .more_kb import router as more_kb_router
# Объявление роутера и настройка экспорта модулей
__all__ = ("router",)
router = Router(name="reply_kb_router")
# Список подключаемых роутеров сверху-вниз
router.include_routers(
start_kb_router,
help_kb_router,
more_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,8 +1,8 @@
# BotCode/routers/__init__.py
# Инициализация пакета routers, для работы с асинхронными обработчиками
# Пакет старых файлов отключен!!
from aiogram import Router
from .callback_handlers import router as callback_handlers_router
from .commands.bot_command import set_commands
from .administration import router as admin_head_router
from .commands import router as commands_head_router
@@ -17,6 +17,7 @@ router = Router(name="main_router")
# Список подключаемых роутеров сверху-вниз
router.include_routers(
callback_handlers_router,
admin_head_router,
commands_head_router,
downloads_head_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

@@ -0,0 +1,17 @@
# 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,
randnum_kb_cb_router,
)

View File

@@ -0,0 +1,38 @@
# 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()
await callback_query.answer(
url=f"t.me/{bot_me.username}?start={randint(1, 500)}"
)
# Тестирование уведомления для пользователя
@router.callback_query(F.data == ButtonInl.random_num_dice_cbd)
async def random_num_dice_cb(callback_query: CallbackQuery):
await callback_query.answer(
text = f"Твое рандомное число: {randint(1, 21)}",
cache_time=1,
)
# Тестирование модального окна для пользователя
@router.callback_query(F.data == ButtonInl.random_num_modal_cdb)
async def random_num_dice_modal_cb(callback_query: CallbackQuery):
await callback_query.answer(
text = f"Членов в жопе у Степана: {randint(1, 2200)}",
show_alert=True,
)

View File

@@ -0,0 +1,32 @@
# 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()
# Новый текст и клавиатура
new_text = f"Какая оценка у тебя будет сегодня: {randint(1, 5)}"
new_reply_markup = get_randnum_kb("Получить ответ от Таро")
# Текущий текст и клавиатура
current_text = callback_query.message.text
current_reply_markup = callback_query.message.reply_markup
# Проверяем, отличаются ли текст и клавиатура
if current_text != new_text or current_reply_markup != new_reply_markup:
await callback_query.message.edit_text(
text=new_text,
reply_markup=new_reply_markup,
)

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

@@ -7,6 +7,8 @@ from .help_cmd import router as help_router
from .more_cmd import router as more_router
from .exit_cmd import router as exit_router
from .start_time_cmd import router as start_time_router
from .actor_cmd import router as actor_router
from .randnum_cmd import router as randnum_router
# Объявление роутера и настройка экспорта модулей
@@ -20,6 +22,8 @@ router.include_routers(
help_router,
more_router,
exit_router,
actor_router,
randnum_router,
)

View File

@@ -0,0 +1,43 @@
# BotCode/routers/commands/user_cmd/actor_cmd.py
# разработка
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 = "Описание"
# Список ключевых слов для команды
keywords = ["actor", "фсещк",]
# Обработчик команды /actor
@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:
# Вывод сообщения пользователю
text = f"использовал(а) команду /{log_type.lower()}"
markup = get_actor_kb()
await message.reply(
text="Всякое разное для тебя",
reply_markup=markup,
)
# Активация логгера
await cmd_logginger(message, log_type, text)
await msg_default(message)
# Проверка на ошибку и ее логирование
except Exception as e:
text_error = await error_cmd_logginger(message, log_type, e)
return text_error

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

@@ -4,12 +4,14 @@
from aiogram import Router, types, F
from aiogram.filters import Command
from BotLibrary import *
from BotCode.keyboards.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")
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

@@ -4,19 +4,21 @@
from aiogram import Router, types, F
from aiogram.filters import Command
from BotLibrary import *
from BotCode.keyboards.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",)
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

@@ -0,0 +1,32 @@
# BotCode/routers/commands/user_cmd/randnum_cmd.py
# Работа с командой /randnum, для рандомного числа с редактированием сообщения
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=BotVariables.prefixs, ignore_case=True))
@router.message(F.text.lower().in_(keywords))
async def cmd_randnum(message: types.Message):
text = "Работа с рандомом оценок!"
await message.reply(
text="Вы хотите узнать вашу оценку на сегодня?!",
reply_markup=get_randnum_kb("Хочу: ТЫК"),
)
# Активация логгера
await cmd_logginger(message, log_type, text)
await msg_default(message)

View File

@@ -2,14 +2,16 @@
# Работа с командой /start, для запуска бота
from aiogram import Router, types, F
from aiogram.filters import Command
from aiogram.filters import Command, CommandStart
from BotLibrary import *
from BotCode.keyboards.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")
log_type = "Start"
description = "Запустить бота"
# Список ключевых слов для команды
keywords = ["start", "старт", "запуск", "пуск", "on", "вкл", "с", "s", "ы",
@@ -17,17 +19,20 @@ 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):
try:
# Вывод сообщения пользователю
text = f"использовал(а) команду /{log_type.lower()}"
await message.reply(text=f"Стартовый бот!", reply_markup=get_start_kb())
print(f"Текст запроса: {repr(message.text)}")
# Активация логгера
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

@@ -3,6 +3,7 @@
from aiogram import Router
from .messages import router as common_message_router
from .phrase import router as phrase_message_router
# Объявление роутера и настройка экспорта модулей
@@ -12,8 +13,8 @@ router = Router(name="users_head_router")
# Список подключаемых роутеров сверху-вниз
router.include_routers(
common_message_router,
phrase_message_router,
)
# Идет самым последним, если другие роутеры не сработали
# router.include_router(common_message_router)
router.include_router(common_message_router)

View File

@@ -3,91 +3,20 @@
# А также нескольких определенных сообщений (Перенести в иной файл!!!)
from BotLibrary import *
from aiogram import Router, types, F
from aiogram.types import ReplyKeyboardRemove
from BotCode.keyboards.start_kb import ButtonText
from ..downloads.download_avatar_all import download_avatar
from aiogram import Router, types
from routers.msg_default import *
# Настройка экспорта модулей и роутера
__all__ = ("router",)
router = Router(name="common_message_router")
# Ответ бота на кнопку или сообщение: "Привет!"
@router.message(F.text.lower() == ButtonText.Hello.lower())
async def bye(message: types.Message):
log_type = "Start_Button"
text_message = f"Привет, я бот. А ты кто?"
name = find_chat_id(message)
message_type = types_message(message)
await message.reply(
text=text_message,
)
await common_msg_logginger(message, name, message_type, log_type)
return text_message
# Ответ бота на кнопку или сообщение: "Помощь!"
@router.message(F.text.lower() == ButtonText.Help.lower())
async def help_message(message: types.Message):
log_type = "Help_Button"
text_message = f"Привет, я надеюсь помогу тебе... Лучше напиши /help.."
name = find_chat_id(message)
message_type = types_message(message)
await message.reply(
text=text_message,
)
await common_msg_logginger(message, name, message_type, log_type)
return text_message
# Ответ бота на кнопку или сообщение: "Пока-пока!"
@router.message(F.text.lower() == ButtonText.Bye.lower())
async def bye_message(message: types.Message):
log_type = "Messages"
text_message = f"Надеюсь скоро увидимся! Захочешь поговорить нажми на /start!"
name = find_chat_id(message)
message_type = types_message(message)
await message.reply(
text=text_message,
reply_markup=ReplyKeyboardRemove(),
)
await common_msg_logginger(message, name, message_type, log_type)
return text_message
# Ответ бота на сообщение: "Кошмар"
@router.message(F.text.lower() == "кошмар")
async def scary_message(message: types.Message):
log_type = "Messages"
text_message = f"Кошмар, тот еще!"
name = find_chat_id(message)
message_type = types_message(message)
await message.reply(
text=text_message,
)
await common_msg_logginger(message, name, message_type, log_type)
return text_message
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

@@ -0,0 +1,79 @@
# BotCode/routers/common/phrase.py
# Обработчик особых команд
from aiogram import Router, types, F
from aiogram.types import ReplyKeyboardRemove
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")
# Ответ бота на кнопку или сообщение: "Привет!"
@router.message(F.text.lower() == ButtonText.Hello.lower())
async def hello_message(message: types.Message):
log_type = "Start_Button"
text_message = f"Привет, я бот. А ты кто?"
name = find_imp_id(message.from_user.id)
message_type = types_message(message)
await message.reply(
text=text_message,
)
await common_msg_logginger(message, name, message_type, log_type)
await msg_default(message)
# Ответ бота на кнопку или сообщение: "Помощь!"
@router.message(F.text.lower() == ButtonText.Help.lower())
async def help_message(message: types.Message):
log_type = "Help_Button"
text_message = f"Привет, я надеюсь помогу тебе... Лучше напиши /help.."
name = find_imp_id(message.from_user.id)
message_type = types_message(message)
await message.reply(
text=text_message,
)
await common_msg_logginger(message, name, message_type, log_type)
await msg_default(message)
# Ответ бота на кнопку или сообщение: "Пока-пока!"
@router.message(F.text.lower() == ButtonText.Bye.lower())
async def bye_message(message: types.Message):
log_type = "Messages"
text_message = f"Надеюсь скоро увидимся! Захочешь поговорить нажми на /start!"
name = find_imp_id(message.from_user.id)
message_type = types_message(message)
await message.reply(
text=text_message,
reply_markup=ReplyKeyboardRemove(),
)
await common_msg_logginger(message, name, message_type, log_type)
await msg_default(message)
# Ответ бота на сообщение: "Кошмар"
@router.message(F.text.lower() == "кошмар")
async def scary_message(message: types.Message):
log_type = "Scary"
text_message = f"Кошмар, тот еще!"
name = find_imp_id(message.from_user.id)
message_type = types_message(message)
await message.reply(
text=text_message,
)
await common_msg_logginger(message, name, message_type, log_type)
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

@@ -1,2 +0,0 @@
# BotCode/time/__init__.py
# Инициализация пакета time, для временных операций (в разработке)

View File

@@ -0,0 +1,2 @@
# BotCode/timer/__init__.py
# Инициализация пакета timer, для временных операций (в разработке)

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 time 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,81 @@
# 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):
user_id = find_imp_id(message.from_user.id)
chat_id = find_imp_id(message.chat.id)
if message.chat.type == "private":
file_path = f"{ProjectPath.private_message}/{user_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>{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} | 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,75 +0,0 @@
# BotLibrary/library/decorator.py
# Небольшая библиотека для декорирования текста
from art import *
from colorama import *
from termcolor import *
import cowsay
# Подключение 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
# Настройка экспорта модулей и логирования

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