92 Commits

Author SHA1 Message Date
Whyverum
37986f4ac8 Delete .env 2025-02-11 02:59:18 +07:00
Whyverum
5ec1790040 Create .env 2025-02-11 02:59:04 +07:00
sergey
69b51ab5e8 Улучшение навигации и директорий 2025-02-11 02:56:46 +07:00
sergey
77b87088dc Фикс бага "дублирования кнопок" 2025-02-11 02:49:31 +07:00
sergey
15fc26e852 Добавление нового класса времени 2025-02-11 02:49:19 +07:00
sergey
4c9db75804 Фикс багов с временем 2025-02-11 02:49:10 +07:00
sergey
0cb140e225 Новая команда /time 2025-02-11 02:48:59 +07:00
sergey
675519da5f Фикс багов со временем 2025-02-11 02:48:50 +07:00
sergey
b7293f896f Фикс багов со временем 2025-02-11 02:48:45 +07:00
sergey
802d2eb615 Фикс багов со временем 2025-02-11 02:48:36 +07:00
sergey
a49991d66f Фикс времени хоста 2025-02-11 02:48:23 +07:00
sergey
d70e2daa32 Обновление списка багов и фиксов 2025-02-11 02:48:06 +07:00
sergey
1a16c6b1b1 Обновление подключений в роутере 2025-02-11 02:47:58 +07:00
sergey
b865478f69 Небольшие багфиксы 2025-02-11 02:11:15 +07:00
sergey
ebb24dca64 Небольшие багфиксы 2025-02-11 02:11:00 +07:00
sergey
23d7754ff3 Небольшие багфиксы 2025-02-11 02:10:03 +07:00
sergey
f120591399 Исправлен баг с импортом конфига 2025-02-11 01:16:02 +07:00
sergey
463517b60a Исправлен баг с импортом конфига 2025-02-11 01:14:02 +07:00
sergey
76a164c206 Роутер имеет авто-название 2025-02-11 01:13:47 +07:00
sergey
c49fd29748 Убран лишний пакет 2025-02-11 01:13:35 +07:00
sergey
2e7c57541d Убран лишний пакет 2025-02-11 01:13:28 +07:00
sergey
f612e0e50d Исправлены ошибки с модулем 2025-02-11 01:13:14 +07:00
sergey
8becda03c4 Удален лишний модуль 2025-02-11 01:12:46 +07:00
sergey
a4a86853fb Исправлен баг с импортом модуля времени 2025-02-11 01:12:30 +07:00
sergey
1f21732833 Перенесен модули локального и московского времени 2025-02-11 01:12:10 +07:00
sergey
8c4b0d7533 Исправлены баги с импортом пакета времени 2025-02-11 01:11:49 +07:00
sergey
43b3c24c67 settings стал более практичным модулем 2025-02-11 01:11:27 +07:00
sergey
24cdb8bd70 Исправлены баги с импортом времени 2025-02-11 01:11:09 +07:00
sergey
db92f33642 Фикс windows консоли 2025-02-11 01:10:55 +07:00
sergey
3f68f3a4ff Убрана команда /? и сообщение ? 2025-02-11 01:10:33 +07:00
sergey
dd9d438082 Отключены лишние импорты 2025-02-11 01:10:17 +07:00
sergey
5ce39fb3bc Убраны лишние f-строки 2025-02-11 01:10:03 +07:00
sergey
21c3d00465 Исправлены баги с пасхалками для админов 2025-02-11 01:09:25 +07:00
sergey
ca8fef6714 Изменены настройки бота 2025-02-11 01:09:12 +07:00
sergey
535a36648c Улучшение конфигов приложения 2025-02-11 00:14:19 +07:00
sergey
ad378cc5f5 Улучшенный .gitignore 2025-02-11 00:03:30 +07:00
sergey
4cbbdf021a Улучшенный просчет строк 2025-02-11 00:01:12 +07:00
sergey
c8805eba26 Улучшенный .env 2025-02-11 00:01:01 +07:00
Whyverum
847e48d6d3 Create .env 2025-02-08 19:13:49 +07:00
sergey
ef6906b240 Обновление 4.2 2025-02-08 19:12:38 +07:00
Whyverum
6e2e7bdc0f Merge pull request #3 from Whyverum/origin
Исправлен баг с айди
2024-12-24 00:24:40 +07:00
Whyverum
084a96fad8 Исправлен баг с айди 2024-12-23 22:22:34 +07:00
Whyverum
b3557a18b9 Merge pull request #2 from Whyverum/origin
Origin
2024-12-23 22:17:17 +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
09aa1bd4b8 Merge pull request #1 from Whyverum/origin
Origin
2024-12-18 12:29:16 +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
Whyverum
3637c1d0fd Команда блокировки пользователей (в разработке) 2024-12-18 07:26:15 +07:00
83 changed files with 2082 additions and 1327 deletions

20
.gitignore vendored
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,45 @@
# BotCode/keyboards/inline_kb/actor_kb.py
# Создания инлайн-клавиатуры на команду: /actor
from aiogram.types import InlineKeyboardMarkup
from BotLibrary import ikb
# Создание роутера и настройка экспорта
__all__ = ("get_actor_kb", "ButtonInl")
# Класс с параметрами кнопок
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:
# Добавляем кнопки, группируя их по строкам
ikb.button(text=ButtonInl.tg_chn, url=ButtonInl.tg_chn_url)
ikb.button(text=ButtonInl.tg_chat, url=ButtonInl.tg_chat_url)
ikb.button(text=ButtonInl.web_text, url=ButtonInl.web_url)
ikb.button(text=ButtonInl.random_site, callback_data=ButtonInl.random_site_cbd)
ikb.button(text=ButtonInl.random_num_dice, callback_data=ButtonInl.random_num_dice_cbd)
ikb.button(text=ButtonInl.random_num_modal, callback_data=ButtonInl.random_num_modal_cdb)
ikb.adjust(2, 1)
return ikb.as_markup()

View File

@@ -0,0 +1,22 @@
# BotCode/keyboards/inline_kb/randnum_kb.py
# Создания инлайн-клавиатуры на команду: /randnum
from aiogram.types import InlineKeyboardMarkup
from BotLibrary import ikb
# Создание роутера и настройка экспорта
__all__ = ("get_randnum_kb", "ButtonInl")
# Класс с параметрами кнопок
class ButtonInl:
text = "Получить ответ"
mark_cbd = "mark_cbd"
# Функция создания клавиатуры на команду: /randnum
def get_randnum_kb(text=ButtonInl.text) -> InlineKeyboardMarkup:
ikb.button(text=text, callback_data=ButtonInl.mark_cbd)
ikb.adjust(1)
return ikb.as_markup() # Возвращаем клавиатуру

View File

@@ -1,39 +0,0 @@
# BotCode/keyboards/more_kb.py
# Создания клавиатуры на команду: /more
from aiogram import Router
from aiogram.types import KeyboardButtonPollType
from aiogram.utils.keyboard import ReplyKeyboardBuilder
# Создание роутера и настройка экспорта модулей
__all__ = ("router", "get_more_kb", "kb_text",)
kb_text = "HelpKb"
router = Router(name="more_kb_router")
# Класс с названиями кнопок
class ButtonText:
More = "More"
Location = "Отправить локацию"
Contact = "Отправить контакт"
Chat = "Отправить чат???"
Poll = "Отправить опрос"
Users = "Что то с common"
# Функция создания клавиатуры на команду: /more
def get_more_kb() -> ReplyKeyboardBuilder:
builder = ReplyKeyboardBuilder()
# builder.add(KeyboardButton(text=ButtonText.Location, request_location=True))
builder.button(text=ButtonText.Location, request_location=True)
builder.button(text=ButtonText.Contact, request_contact=True)
builder.button(text=ButtonText.Poll, request_poll=KeyboardButtonPollType())
builder.adjust(1)
return builder.as_markup(resize_keyboard=True)
# Один из вариантов создание клавиатуры
# markup = ReplyKeyboardMarkup(
# keyboard=[]
# )
# return markup

View File

@@ -0,0 +1,14 @@
# BotCode/keyboards/reply_kb/__init__.py
# Инициализация пакета reply_kb, для работы с клавиатурами
from aiogram import Router
from .help_kb import router as help_kb_router
# Объявление роутера и настройка экспорта модулей
__all__ = ("router",)
router = Router(name=__name__)
# Список подключаемых роутеров сверху-вниз
router.include_routers(help_kb_router)

View File

@@ -1,13 +1,13 @@
# BotCode/keyboards/help_kb.py # BotCode/keyboards/reply_kb/help_kb.py
# Создание клавиатуры для сообщения: "Помогите!" # Создание клавиатуры для сообщения: "Помогите!"
# Создает небольшую числовую клавиатуру для тестов
from aiogram import Router, F from aiogram import Router, F
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from aiogram.utils.keyboard import ReplyKeyboardBuilder from BotLibrary import rkb
# Создание роутера и настройка экспорта модулей # Создание роутера и настройка экспорта модулей
__all__ = ("router", "get_help_kb", "kb_text",) __all__ = ("router", "get_help_kb")
kb_text = "HelpKb"
router = Router(name="help_kb_router") router = Router(name="help_kb_router")
@@ -21,21 +21,10 @@ def get_help_kb() -> ReplyKeyboardMarkup:
"0", "0",
] ]
# Создание кнопки каждого числа по отдельности
buttons_row = [KeyboardButton(text=num) for num in numbers] buttons_row = [KeyboardButton(text=num) for num in numbers]
# Один из способов создания клавиатур
#
# markup = ReplyKeyboardMarkup(
# keyboard=[buttons_row],
# resize_keyboard=True,
# )
# return markup
builder = ReplyKeyboardBuilder()
for num in numbers: for num in numbers:
builder.button(text=num) rkb.button(text=num)
builder.adjust(3)
builder.row(buttons_row[3], buttons_row[9])
builder.add(buttons_row[-1])
return builder.as_markup(resize_keyboard=True) rkb.adjust(3)
return rkb.as_markup(resize_keyboard=True)

View File

@@ -0,0 +1,25 @@
# BotCode/keyboards/reply_kb/more_kb.py
# Создания клавиатуры на команду: /more
# Для проверки отправки информации о пользователе
from aiogram.types import KeyboardButtonPollType, ReplyKeyboardMarkup
from BotLibrary import rkb
# Настройка экспорта из этого модуля
__all__ = ("get_more_kb", "ButtonText")
# Создание класса со значениями кнопок
class ButtonText:
Location = "Отправить локацию"
Contact = "Отправить контакт"
Poll = "Отправить опрос"
# Функция создания клавиатуры на команду: /more
def get_more_kb() -> ReplyKeyboardMarkup:
rkb.button(text=ButtonText.Location, request_location=True)
rkb.button(text=ButtonText.Contact, request_contact=True)
rkb.button(text=ButtonText.Poll, request_poll=KeyboardButtonPollType())
rkb.adjust(1)
return rkb.as_markup(resize_keyboard=True, one_time_keyboard=True)

View File

@@ -0,0 +1,25 @@
# BotCode/keyboards/reply_kb/start_kb.py
# Создания клавиатуры на команду: /start
# Для создания базовой клавиатуры с некими элементами
from aiogram.types import ReplyKeyboardMarkup
from BotLibrary import rkb
# Настройка экспорта из этого модуля
__all__ = ("get_start_kb", "ButtonText")
# Создание класса со значениями кнопок
class ButtonText:
Hello = "Привет!"
Help = "Помогите!"
Bye = "Пока-пока!"
# Функция создания клавиатуры на команду: /start
def get_start_kb() -> ReplyKeyboardMarkup:
rkb.button(text=ButtonText.Hello)
rkb.button(text=ButtonText.Help)
rkb.button(text=ButtonText.Bye)
rkb.adjust(2)
return rkb.as_markup(resize_keyboard=True, one_time_keyboard=True)

View File

@@ -0,0 +1,23 @@
# BotCode/keyboards/reply_kb/survey_yesno_kb.py
# Создания клавиатуры на команду: /survey
# Для того, чтобы определить отправлять ли сообщения в будущем
from aiogram.types import ReplyKeyboardMarkup
from BotLibrary import rkb
# Настройка экспорта из этого модуля
__all__ = ("get_survey_email_kb", "ButtonText")
# Создание класса со значениями кнопок
class ButtonText:
Yes = "Да"
No = "Нет"
# Функция создания клавиатуры на команду: /survey
def get_survey_email_kb() -> ReplyKeyboardMarkup:
rkb.button(text=ButtonText.Yes)
rkb.button(text=ButtonText.No)
rkb.adjust(1)
return rkb.as_markup(resize_keyboard=True, one_time_keyboard=True)

View File

@@ -1,34 +0,0 @@
# BotCode/keyboards/start_kb.py
# Создания клавиатуры на команду: /start
from aiogram import Router
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from aiogram.utils.keyboard import ReplyKeyboardBuilder
# Создание роутера и настройка экспорта
__all__ = ("router", "get_start_kb", "kb_text", "ButtonText",)
kb_text = "StartKb"
router = Router(name="start_kb_router")
# Класс с названиями кнопок
class ButtonText:
Hello = "Привет!"
Help = "Помогите!"
Bye = "Пока-пока!"
# Функция создания клавиатуры на команду: /start
def get_start_kb() -> ReplyKeyboardBuilder:
button_hello = KeyboardButton(text=ButtonText.Hello)
button_help = KeyboardButton(text=ButtonText.Help)
button_bye = KeyboardButton(text=ButtonText.Bye)
buttons_first_row = [button_hello, button_help]
buttons_second_row = [button_bye]
markup = ReplyKeyboardMarkup(
keyboard=[buttons_first_row, buttons_second_row],
resize_keyboard=True,
one_time_keyboard=True,
)
return markup

View File

@@ -1,11 +1,12 @@
# BotCode/routers/__init__.py # BotCode/routers/__init__.py
# Инициализация пакета routers, для работы с асинхронными обработчиками # Инициализация пакета routers, для работы с асинхронными обработчиками
# Пакет старых файлов отключен!!
from aiogram import Router from aiogram import Router
from .callback_handlers import router as callback_handlers_router
from .commands.bot_command import set_commands from .commands.bot_command import set_commands
from .administration import router as admin_head_router from .administration import router as admin_head_router
from .commands import router as commands_head_router from .commands import router as commands_head_router
from .survey import router as survey_head_router
from .downloads import router as downloads_head_router from .downloads import router as downloads_head_router
from .common import router as users_head_router from .common import router as users_head_router
@@ -17,7 +18,9 @@ router = Router(name="main_router")
# Список подключаемых роутеров сверху-вниз # Список подключаемых роутеров сверху-вниз
router.include_routers( router.include_routers(
callback_handlers_router,
admin_head_router, admin_head_router,
survey_head_router,
commands_head_router, commands_head_router,
downloads_head_router, downloads_head_router,
) )

View File

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

View File

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

View File

@@ -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 BotCode.keyboards.inline_kb.actor_kb import ButtonInl
# Создание роутера и настройка экспорта модулей
__all__ = ("router",)
router = Router(name="actor_kb_cb")
# Тестирование реферальных ссылок
@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,33 @@
# BotCode/routers/callback_handlers/randnum_kb_cb.py
# Обработчик запросов в команде /randnum
import asyncio
from random import randint
from aiogram import Router, F
from aiogram.types import CallbackQuery
from BotLibrary import ikb
from BotCode.keyboards.inline_kb.randnum_kb import ButtonInl, get_randnum_kb
# Создание роутера и настройка экспорта модулей
__all__ = ("router",)
router = Router(name="randnum_kb_cb")
# Тестирование редактирования сообщения
@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 = ikb.as_markup() # Обновленная клавиатура
# Проверка, отличается ли текущее сообщение от нового
if callback_query.message.text != new_text or callback_query.message.reply_markup != new_reply_markup:
# Добавляем задержку, если необходимо
await asyncio.sleep(0.5) # Задержка 0.5 секунд
# Редактируем сообщение и обновляем клавиатуру
await callback_query.message.edit_text(
text=new_text,
reply_markup=new_reply_markup, # Обновляем клавиатуру
)

View File

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

View File

@@ -7,6 +7,9 @@ from .help_cmd import router as help_router
from .more_cmd import router as more_router from .more_cmd import router as more_router
from .exit_cmd import router as exit_router from .exit_cmd import router as exit_router
from .start_time_cmd import router as start_time_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
from .time_cmd import router as time_router
# Объявление роутера и настройка экспорта модулей # Объявление роутера и настройка экспорта модулей
@@ -20,6 +23,9 @@ router.include_routers(
help_router, help_router,
more_router, more_router,
exit_router, exit_router,
actor_router,
randnum_router,
time_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 BotCode.keyboards.inline_kb.actor_kb import get_actor_kb
from BotCode.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 import Router, types, F
from aiogram.filters import Command from aiogram.filters import Command
from BotLibrary import * from BotLibrary import *
from BotCode.routers.msg_default import msg_default
# Создание роутера и экспорта модулей # Создание роутера, переменных и экспорта модулей
__all__ = ("router", "exit_cmd", "log_type",) __all__ = ("router", "exit_cmd", "log_type", "description")
router = Router(name="exit_router") router = Router(name="exit_router")
log_type = "Exit" log_type = "Exit"
description = "Выйти из чата (в разработке)"
# Список ключевых слов для команды # Список ключевых слов для команды
keywords = ["выход", "ds[j;", "exit", "учше",] keywords = ["выход", "ds[j;", "exit", "учше",]
# Обработчик команды /exit # Обработчик команды /exit
@router.message(Command(*keywords, prefix=BotEdit.prefixs, ignore_case=True)) @router.message(Command(*keywords, prefix=BotVariables.prefixs, ignore_case=True))
@router.message(F.text.lower().in_(keywords)) @router.message(F.text.lower().in_(keywords))
async def exit_cmd(message: types.Message): async def exit_cmd(message: types.Message):
try: try:
@@ -26,7 +28,7 @@ async def exit_cmd(message: types.Message):
# Активация логгера # Активация логгера
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Проверка на ошибку и ее логирование # Проверка на ошибку и ее логирование
except Exception as e: except Exception as e:

View File

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

View File

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

View File

@@ -0,0 +1,31 @@
# BotCode/routers/commands/user_cmd/randnum_cmd.py
# Работа с командой /randnum, для рандомного числа с редактированием сообщения
from aiogram import Router, types, F
from aiogram.filters import Command
from BotLibrary import *
from BotCode.keyboards.inline_kb.randnum_kb import get_randnum_kb
from BotCode.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, для запуска бота # Работа с командой /start, для запуска бота
from aiogram import Router, types, F from aiogram import Router, types, F
from aiogram.filters import Command from aiogram.filters import Command, CommandStart
from BotLibrary import * from BotLibrary import *
from BotCode.keyboards.start_kb import get_start_kb from BotCode.keyboards.reply_kb.start_kb import get_start_kb
from BotCode.routers.msg_default import msg_default
# Создание роутера и настройка экспорта модулей # Создание роутера, переменных и настройка экспорта модулей
__all__ = ("router", "cmd_start", "log_type",) __all__ = ("router", "cmd_start", "log_type", "description")
router = Router(name="start_router") router = Router(name="start_router")
log_type = "Start" log_type = "Start"
description = "Запустить бота"
# Список ключевых слов для команды # Список ключевых слов для команды
keywords = ["start", "старт", "запуск", "пуск", "on", "вкл", "с", "s", "ы", keywords = ["start", "старт", "запуск", "пуск", "on", "вкл", "с", "s", "ы",
@@ -17,17 +19,20 @@ keywords = ["start", "старт", "запуск", "пуск", "on", "вкл", "
# Обработчик команды /start # Обработчик команды /start
@router.message(Command(*keywords, prefix=BotEdit.prefixs, ignore_case=True)) @router.message(Command(*keywords, prefix=BotVariables.prefixs, ignore_case=True))
@router.message(F.text.lower().in_(keywords)) @router.message(F.text.lower().in_(keywords))
@router.message(CommandStart())
async def cmd_start(message: types.Message): async def cmd_start(message: types.Message):
try: try:
# Вывод сообщения пользователю # Вывод сообщения пользователю
text = f"использовал(а) команду /{log_type.lower()}" text = f"использовал(а) команду /{log_type.lower()}"
await message.reply(text=f"Стартовый бот!", reply_markup=get_start_kb()) await message.reply(text=f"Стартовый бот!", reply_markup=get_start_kb())
print(f"Текст запроса: {repr(message.text)}")
# Активация логгера # Активация логгера
await cmd_logginger(message, log_type, text) await cmd_logginger(message, log_type, text)
return text await msg_default(message)
# Проверка на ошибку и ее логирование # Проверка на ошибку и ее логирование
except Exception as e: except Exception as e:

View File

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

View File

@@ -0,0 +1,43 @@
# BotCode/routers/commands/user_cmd/time_cmd.py
# Работа с командой /time, для вывода времени
from aiogram import Router, types
from aiogram.filters import Command
from BotLibrary import *
from BotCode.routers.msg_default import msg_default
# Создание роутера, переменных и настройка экспорта модулей
__all__ = ("router", "cmd_time", "log_type", "description")
router = Router(name="time_cmd_router")
log_type = "Time"
description = "Мировое время"
# Список ключевых слов для команды
keywords = ["time", "ешьу", "dhtvz", "время"]
# Обработчик команды /time
@router.message(Command(*keywords, prefix=BotVariables.prefixs, ignore_case=True))
async def cmd_time(message: types.Message):
try:
# Получаем текущее время для Москвы и Красноярска
current_time_msk = get_choice_time(TimeVariable.choice_utc_msk)
current_time_krsk = get_choice_time(TimeVariable.choice_utc_krsk)
# Формируем текст для ответа
text = (
f"Текущее время в Москве: \n<b>{current_time_msk}</b>\n"
f"Текущее время в Красноярске: \n<b>{current_time_krsk}</b>"
)
# Отправляем сообщение пользователю
await message.reply(text)
# Активация логгера
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

@@ -3,6 +3,7 @@
from aiogram import Router from aiogram import Router
from .messages import router as common_message_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( 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 BotLibrary import *
from aiogram import Router, types, F from aiogram import Router, types
from aiogram.types import ReplyKeyboardRemove from BotCode.routers.msg_default import *
from BotCode.keyboards.start_kb import ButtonText
from ..downloads.download_avatar_all import download_avatar
# Настройка экспорта модулей и роутера # Настройка экспорта модулей и роутера
__all__ = ("router",) __all__ = ("router",)
router = Router(name="common_message_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" 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
# Хэндлер на все сообщения и записывает данные # Хэндлер на все сообщения и записывает данные
@router.message() @router.message()
async def handle_all_messages(message: types.Message): async def handle_all_messages(message: types.Message):
log_type = "Messages" user_name = find_imp_id(message.chat.id)
name = find_chat_id(message)
message_type = types_message(message) message_type = types_message(message)
await logginger(message) await common_msg_logginger(message, user_name, message_type, log_type)
await download_avatar(message) await msg_default(message)
await common_msg_logginger(message, name, message_type, log_type)
return f"Получено новое сообщение!"

View File

@@ -0,0 +1,79 @@
# BotCode/routers/common/phrase.py
# Обработчик особых команд
from aiogram import Router, types, F
from aiogram.types import ReplyKeyboardRemove
from BotCode.routers.msg_default import *
from BotLibrary import find_imp_id, types_message, common_msg_logginger
from BotCode.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 aiogram import Router
from .download_handlers import router as download_media_router from .download_handlers import router as download_media_router
from .download_user_avatar import router as user_avatar_router
from .download_avatar_all import *
from .download_chat_avatar import *
from .download_user_avatar import *
# Объявление роутера и настройка экспорта модулей # Объявление роутера и настройка экспорта модулей
__all__ = ("router",) __all__ = ("router", "download_avatar_all", "download_chat_avatar", "download_user_photos", "download_avatar")
router = Router(name="downloads_head_router") router = Router(name="downloads_head_router")
# Список подключаемых роутеров сверху-вниз # Список подключаемых роутеров сверху-вниз
router.include_routers( router.include_routers(
download_media_router, download_media_router,
user_avatar_router,
) )

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,12 @@
# BotCode/routers/common/msg_default.py
# Небольшое облегчение для команд
from loguru import logger
from BotCode.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

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

View File

@@ -0,0 +1,89 @@
from aiogram import Router, types, F
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from aiogram.utils import markdown
from .states import Survey
from BotLibrary import BotVariables, valid_email
from BotCode.keyboards.reply_kb.survey_yesno_kb import get_survey_email_kb
# Создание роутера
router = Router(name=__name__)
@router.message(Command("survey", prefix=BotVariables.prefixs))
async def handler_survey(message: types.Message, state: FSMContext):
await state.set_state(Survey.full_name)
await message.answer(
text="Приветствую тебя в нашем маленьком раю! Подожди, я кажется не знаю твоего имени.. Как тебя зовут?",
reply_markup=types.ReplyKeyboardRemove(),
)
@router.message(Survey.full_name, F.text)
async def handler_survey_user_name(message: types.Message, state: FSMContext):
await state.update_data(full_name=message.text)
await message.answer(
f"Привет, {markdown.hbold(message.text)}! Скажи свою почту)",
)
await state.set_state(Survey.email)
@router.message(Survey.full_name)
async def handler_survey_user_name_invalid(message: types.Message):
await message.answer(
f"Извините, но кажется я вас не понимаю.. Повторите свое имя, пожалуйста!!!",
)
@router.message(Survey.email, F.text.cast(valid_email).as_("email"))
async def handler_survey_email(message: types.Message, state: FSMContext, email: str):
await state.update_data(email=email)
await message.answer(
text=f"Отличная почта: {markdown.hcode(message.text)}! "
f"\nХочешь ли получать письма от меня?",
reply_markup=get_survey_email_kb()
)
await state.set_state(Survey.email_newsletter)
async def send_survey_results(message: types.Message, data: dict) -> None:
text = markdown.text(
"Ваши результаты: \n",
markdown.text(f"Имя: {markdown.hbold(data['full_name'])}"),
markdown.text(f"Почта: {markdown.hcode(data['email'])}"),
(
"Отлично, теперь ждите новых сообщений)"
if data["news_letter"]
else "Что-ж, мы не будем писать вам!"
),
sep='\n'
)
await message.answer(text=text, reply_markup=types.ReplyKeyboardRemove())
@router.message(Survey.email)
async def handler_survey_email_invalid(message: types.Message):
await message.answer(
text="Почта не подошла, попробуйте еще раз!",
)
@router.message(Survey.email_newsletter, F.text.casefold() == "да")
async def handle_survey_email_newsletter_ok(message: types.Message, state: FSMContext):
data = await state.update_data(news_letter=True)
await state.clear()
await send_survey_results(message, data)
@router.message(Survey.email_newsletter, F.text.casefold() == "нет")
async def handle_survey_email_newsletter_no(message: types.Message, state: FSMContext):
data = await state.update_data(news_letter=False)
await state.clear()
await send_survey_results(message, data)
@router.message(Survey.email_newsletter)
async def handle_survey_email_newsletter_not_understand(message: types.Message, state: FSMContext):
await message.answer(
text=f"Простите, я не понимаю пожалуйста ответьте {markdown.hcode("да")} или {markdown.hcode("нет")}!"
)

View File

@@ -0,0 +1,15 @@
from enum import StrEnum
from aiogram.fsm.state import StatesGroup, State
class Survey(StatesGroup):
full_name = State()
age = State()
email = State()
sport = State()
email_newsletter = State()
class Sports(StrEnum):
tennis = "Теннис"
football = "Футбол"
fomula_one = "Гонки"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,145 +0,0 @@
# BotLibrary/configs/config.py
# Список практически всех переменных проекта
from os import getenv
from dotenv import load_dotenv
from MySQL.list_ids import *
# Настройка экспорта модулей и логирования
__all__ = ("LogsSet", "BotEdit", "ListId", "ImportantPath", "BotVariables",
"bot_token", "api_key", "web_api_key", )
log_type = "Config"
# Загружаем переменные из файла .env
load_dotenv()
bot_token = getenv("main_bot_token")
api_key = getenv("APIKey")
web_api_key = getenv("WebAPIKey")
important_id = getenv("important_id")
secret = getenv("secret")
# Класс для параметров логгера
class LogsSet:
# Максимальный размер лог-файла
max_size = "500 MB"
# Шаблон логов для обычного логгера
info_text = ("<green>{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,7 @@
# BotLibrary/library/__init__.py
# Инициализация пакета library, для работы с собственными библиотеками
# Импортируем библиотеки для экспорта
from .settings import *
from .list_ids import *
from .important_path import *

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 .settings import default_encod
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 = {**groups, **admins, **users, **channels}

View File

@@ -0,0 +1,52 @@
# BotLibrary/configs/settings.py
# Список практически всех переменных проекта
from os import getenv
from dotenv import load_dotenv
# Базовая кодировка файлов
default_encod = "utf-8"
# Создание класса с временными параметрами
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"
choice_utc_krsk = "Asia/Krasnoyarsk" # Новый выбор для Красноярска
# Класс с параметрами бота
class BotEdit:
name = "Первородная Жемчужина" # Описание имени бота
description = ("Привет, мое имя - Эми! Я буду рада помочь вам "
"посетить другие миры! Вместе!") # Описание бота
short_description = "Привет, это описание! Как дела?" # Описание виджета бота
# Важные параметры бота
class BotVariables:
language = "Python3-Aiogram"
prefixs = ('$', '!', '.', '%', '&', ':', '|', '+', '-', '/', '~', '?')
# Загружаем переменные из файла ProjectsFile/.env
load_dotenv("ProjectsFile/.env")
bot_token = getenv("BOT_TOKEN")
bot1_token = getenv("BOT1_TOKEN")
bot2_token = getenv("BOT2_TOKEN")
api_key = getenv("API_KEY")
web_api_key = getenv("WEB_API_KEY")
tg_api_uid = getenv("TG_API_UID")
tg_api_hash = getenv("TG_API_HASH")
admin_id = getenv("ADMIN_ID")
important_id = getenv("IMPORTANT_ID")
important_group_id = getenv("IMPORTANT_GROUP_ID")
important_channel_id = getenv("IMPORTANT_CHANNEL_ID")
secret = getenv("SECRET")

View File

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

View File

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

View File

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

View File

@@ -4,7 +4,7 @@
from aiogram.types import ChatAdministratorRights from aiogram.types import ChatAdministratorRights
from loguru import logger from loguru import logger
from config import BotEdit from BotLibrary.configs import BotEdit
from BotLibrary.library.bots import bot from BotLibrary.library.bots import bot
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования
@@ -19,7 +19,7 @@ async def set_all():
await set_bot_name() await set_bot_name()
await set_bot_description() await set_bot_description()
await set_bot_short_description() await set_bot_short_description()
return f"Автономная настройка бота - завершена!" return "Автономная настройка бота - завершена!"
# Функция установки имени бота с проверкой на ограничения # Функция установки имени бота с проверкой на ограничения
@@ -69,9 +69,9 @@ async def set_adm_rights():
current_rights = await bot.get_my_default_administrator_rights() current_rights = await bot.get_my_default_administrator_rights()
if current_rights != rights: if current_rights != rights:
await bot.set_my_default_administrator_rights(rights) await bot.set_my_default_administrator_rights(rights)
return f"Админ права бота изменены!" return "Админ права бота изменены!"
else: else:
return f"Админ права уже установлены и не требуют изменений." return "Админ права уже установлены и не требуют изменений."
# Функция установки описания бота с проверкой на ограничения # Функция установки описания бота с проверкой на ограничения
@@ -87,9 +87,9 @@ async def set_bot_description():
# Проверяем, совпадает ли текущее описание с тем, которое мы хотим установить # Проверяем, совпадает ли текущее описание с тем, которое мы хотим установить
if current_description != BotEdit.description: if current_description != BotEdit.description:
await bot.set_my_description(description=BotEdit.description) await bot.set_my_description(description=BotEdit.description)
return f"Описание бота изменено!" return "Описание бота изменено!"
else: else:
return f"Описание бота уже установлено и не требует изменений." return "Описание бота уже установлено и не требует изменений."
# Функция установки короткого описания бота с проверкой на ограничения # Функция установки короткого описания бота с проверкой на ограничения
@@ -105,6 +105,6 @@ async def set_bot_short_description():
# Проверяем, совпадает ли текущее короткое описание с тем, которое мы хотим установить # Проверяем, совпадает ли текущее короткое описание с тем, которое мы хотим установить
if current_short_description != BotEdit.short_description: if current_short_description != BotEdit.short_description:
await bot.set_my_short_description(short_description=BotEdit.short_description) await bot.set_my_short_description(short_description=BotEdit.short_description)
return f"Короткое описание бота изменено!" return "Короткое описание бота изменено!"
else: else:
return f"Короткое описание бота уже установлено и не требует изменений." return "Короткое описание бота уже установлено и не требует изменений."

View File

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

View File

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

View File

@@ -0,0 +1,42 @@
# BotLibrary/timers/start_timer.py
# Функция получения времени старта
import pytz
from tzlocal import get_localzone
from datetime import datetime
from ..configs import TimeVariable
# Настройка экспорта модулей и логирования
__all__ = ("host_time", "get_choice_time", "get_time_zone")
log_type = "Time"
"""Получение времени хоста и иного места"""
timezone = pytz.timezone(TimeVariable.choice_utc_krsk) # Используем Красноярск вместо Москвы
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 # Смещение в часах
# Форматирование времени в стиле, как у Москвы (YYYY-MM-DD HH:MM:SS (UTC±X))
choice_time = choice_now.strftime(TimeVariable.format) + f" (UTC{int(utc_offset_choice):+})"
return choice_time

View File

@@ -0,0 +1,5 @@
# BotLibrary/validators/__init__.py
# Инициализация пакета validator, для работы с валидацией данных
# Импортируем библиотеки для экспорта
from .email_validators import *

View File

@@ -0,0 +1,15 @@
# BotLibrary/validators/email_validators.py
# Создание валидации почты для проекта
from email_validator import validate_email, EmailNotValidError
# Настройка экспорта из этого модуля
__all__ = ("valid_email",)
def valid_email(text: str) -> str | None:
try:
email = validate_email(text)
except EmailNotValidError:
return None
return email.normalized

View File

@@ -33,13 +33,13 @@
- [ ] Исправить остальные проблемы - [ ] Исправить остальные проблемы
- [X] Прокомментировать каждый файл - [ ] Прокомментировать каждый файл
- [ ] Сделать нормальную инструкцию - [ ] Сделать нормальную инструкцию
- [ ] Проверить все файлы и улучшить их - [ ] Проверить все файлы и улучшить их
- [ ] Иное.
--- ---
- [ ] Сделать проверку на ошибки в edit_bot? (Там также добавлена команда set_commands) 07.02.2025
- [ ] Сделать проверку на личные сообщения
- [ ] Починить start_time и отображение времени
--- - [ ] Модуль день рождение
- [ ] FSM

View File

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

35
MySQL/list_ids.json Normal file
View File

@@ -0,0 +1,35 @@
{
"ban_list_ids": {
"6666666666666": "Забанненый"
},
"important_adm_ids": {
"6751720805": "Лейн",
"7051557370": "Рикси",
"1570652377": "Риша",
"1398573474": "Финаки",
"1851081467": "Финик",
"929782381": "Хиде",
"6714237814": "Слешик",
"1686743480": "Полина",
"1184519857": "Катаз"
},
"important_groups_ids": {
"1087968824": "GroupAnonymousBot",
"-1002442589033": "Любовники Сергея",
"-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
}

24
ProjectsFile/.env Normal file
View File

@@ -0,0 +1,24 @@
# ProjectsFile/.env
# Файл-хранилище всех секретных токенов и ключей
# Токены от ботов телеграмма
BOT_TOKEN=ВВЕДИТЕ_ТОКЕН_ОСНОВНОГООТА
BOT1_TOKEN=ТОКЕНОТА1
BOT2_TOKEN=ТОКЕНОТА2
# Ключи от API
API_KEY=КЛЮЧ_ОТ_СТОРОННЕГО_API
WEB_API_KEY=КЛЮЧ_ОТ_СТОРОННЕГО_WEB_API
# Хранилище сессии телеграмма
TG_API_UID=ID_ОТ_API_ТЕЛЕГРАММА
TG_API_HASH=HASH_ОТ_API_ТЕЛЕГРАММА
# Айди пользователей, группы и канала
ADMIN_ID=ВВЕДИТЕ_ID_АДМИНИСТРАТОРА
IMPORTANT_ID=ВВЕДИТЕ_ВАЖНЫЙ_ID_ПОЛЬЗОВАТЕЛЯ
IMPORTANT_GROUP_ID=ВВЕДИТЕ_ВАЖНЫЙ_ID_ГРУППЫ
IMPORTANT_CHANNEL_ID=ВВЕДИТЕ_ВАЖНЫЙ_ID_КАНАЛА
# Дополнительные пермемнные
SECRET=СЕКРЕТ

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,14 @@
# project_count_line.py
# Файл для подсчета количества строк и файлов
import os import os
# Настройка экспорта модулей # Настройка экспорта модулей
__all__ = ("count_lines_in_python_files",) __all__ = ("count_lines_in_python_files",)
type_messages = "count_lines_project" type_messages = "count_lines_project"
# Функция подсчета строк и кода python3
def count_lines_in_python_files(directory): def count_lines_in_python_files(directory):
total_lines = 0 total_lines = 0
total_files = 0 total_files = 0
@@ -11,7 +16,7 @@ def count_lines_in_python_files(directory):
# Проходим по всем директориям и файлам в заданной директории # Проходим по всем директориям и файлам в заданной директории
for root, dirs, files in os.walk(directory): for root, dirs, files in os.walk(directory):
# Исключаем определенные директории # Исключаем определенные директории
if any(excluded in root for excluded in ['.venv', '.git', '.idea', '__pycache__']): if any(excluded in root for excluded in ['.venv', '.env', '.git', '.idea', '__pycache__']):
continue continue
for file in files: for file in files:
@@ -32,8 +37,8 @@ def count_lines_in_python_files(directory):
return total_lines, total_files return total_lines, total_files
# Задайте путь к вашей директории # Задайте путь к вашей директории
directory_path = r'/' directory_path = r'../'
lines_count, files_count = count_lines_in_python_files(directory_path) lines_count, files_count = count_lines_in_python_files(directory_path)
print(f'Общее количество строк в файлах .py: {lines_count}') print(f"Общее количество строк в файлах .py: {lines_count}")
print(f'Общее количество файлов .py: {files_count}') print(f"Общее количество файлов .py: {files_count}")

View File

@@ -19,7 +19,6 @@ pytz = "^2024.2"
termcolor = "^2.5.0" termcolor = "^2.5.0"
colorama = "^0.4.6" colorama = "^0.4.6"
art = "^6.4" art = "^6.4"
cowsay = "^6.1"
python-dotenv = "^1.0.1" python-dotenv = "^1.0.1"
pydantic-settings = "^2.7.0" pydantic-settings = "^2.7.0"
python-decouple = "^3.8" python-decouple = "^3.8"
@@ -27,6 +26,9 @@ charset-normalizer = "^3.4.0"
frozenlist = "^1.5.0" frozenlist = "^1.5.0"
customtkinter = "^5.2.2" customtkinter = "^5.2.2"
pillow = "^11.0.0" pillow = "^11.0.0"
certifi = "^2024.12.14"
idna = "^3.10"
email-validator = "^2.2.0"
[build-system] [build-system]

158
ProjectsFile/start.bat Normal file
View File

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

63
Test/commands/ban_cmd.py Normal file
View File

@@ -0,0 +1,63 @@
# BotCode/routers/commands/admin_cmd/ban_cmd.py
# Работа с админ-командой /ban, для блокировки пользователей (в разработке)
# Проверка на наличие блокировки пользователя в боте
from aiogram import Router, types
from aiogram.filters import Command
from BotLibrary import *
# Создание роутера и настройка экспорта
__all__ = ("router", "banned_user", "ban_user_by_username",)
router = Router(name="ban_router")
command_text = "BAN"
# Функция проверки блокировки пользователя в боте
@router.message(lambda message: message.from_user.id in ListId.ban_list_id)
async def banned_user(message: types_msg.Message):
try:
# Вывод сообщения пользователю
chat_id = await find_chat_id(message)
text = (f"{TextDecorator.RED}Получено сообщение от забанненго пользователя"
f" из ({chat_id}) : {message.text}{TextDecorator.RESET_DECORATOR}")
await message.answer(f"Вы были забаннены в боте @{BotInfo.username}!")
# Активация логгера
await cmd_logginger(message, command_text, text)
return text
# Проверка на ошибку и ее логирование
except Exception as e:
text_error = await error_cmd_logginger(message, command_text, e)
return text_error
# Обработчик команды /ban
@router.message(Command("ban", "ифт", "бан", ",fy", prefix=BotEdit.prefixs, ignore_case=True))
async def ban_user_by_username(message: types_msg.Message):
try:
text = f"использовал(а) команду /{command_text.lower()}"
# Получаем аргументы команды
args = message.get_args() # Вернет все, что идет после /ban
# Проверка на наличие аргумента
if not args:
text = f"Пожалуйста, укажите ID или имя пользователя для бана. Пример: /ban 123456"
await message.reply(text)
return text
# Вывод сообщения пользователю
await message.reply(text=f"Вы попытались забанить, обидно да?")
# Активация логгера
await cmd_logginger(message, command_text, text)
return text
# Проверка на ошибку и ее логирование
except Exception as e:
text_error = await error_cmd_logginger(message, command_text, e)
return text_error

View File

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

View File

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

View File

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

View File

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

View File

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