43 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
b3557a18b9 Merge pull request #2 from Whyverum/origin
Origin
2024-12-23 22:17:17 +07:00
Whyverum
09aa1bd4b8 Merge pull request #1 from Whyverum/origin
Origin
2024-12-18 12:29:16 +07:00
58 changed files with 921 additions and 658 deletions

10
.gitignore vendored
View File

@@ -2,18 +2,12 @@
# Файл, что запрещает экспортировать определенные части кода # Файл, что запрещает экспортировать определенные части кода
# Игнорирование локального окружения и его файлов # Игнорирование локального окружения и пользовательских конфигураций IDE
.venv .*
.env
# Игнорирование пользовательских конфигураций IDE
.idea
*.iml *.iml
# Игнорирование временных файлов операционной системы # Игнорирование временных файлов операционной системы
.DS_Store
Thumbs.db Thumbs.db

View File

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

View File

@@ -2,7 +2,6 @@
# Инициализация пакета keyboards, для работы с клавиатурами # Инициализация пакета keyboards, для работы с клавиатурами
from aiogram import Router from aiogram import Router
from .inline_kb import router as inline_kb_router
from .reply_kb import router as reply_kb_router from .reply_kb import router as reply_kb_router
from .inline_kb import * from .inline_kb import *
from .reply_kb import * from .reply_kb import *
@@ -13,7 +12,4 @@ router = Router(name="kb_router")
# Список подключаемых роутеров сверху-вниз # Список подключаемых роутеров сверху-вниз
router.include_routers( router.include_routers(reply_kb_router)
inline_kb_router,
reply_kb_router,
)

View File

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

View File

@@ -1,14 +1,11 @@
# BotCode/keyboards/inline_kb/actor_kb.py # BotCode/keyboards/inline_kb/actor_kb.py
# Создания инлайн-клавиатуры на команду: /actor # Создания инлайн-клавиатуры на команду: /actor
from aiogram import Router
from aiogram.types import InlineKeyboardMarkup from aiogram.types import InlineKeyboardMarkup
from aiogram.utils.keyboard import InlineKeyboardBuilder from BotLibrary import ikb
# Создание роутера и настройка экспорта # Создание роутера и настройка экспорта
__all__ = ("router", "get_actor_kb", "kb_text", "ButtonInl",) __all__ = ("get_actor_kb", "ButtonInl")
kb_text = "ActorKb"
router = Router(name="actor_kb_router")
# Класс с параметрами кнопок # Класс с параметрами кнопок
@@ -35,20 +32,14 @@ class ButtonInl:
# Функция создания клавиатуры на команду: /actor # Функция создания клавиатуры на команду: /actor
def get_actor_kb() -> InlineKeyboardMarkup: def get_actor_kb() -> InlineKeyboardMarkup:
# Создаем билдер клавиатуры
builder = InlineKeyboardBuilder()
# Добавляем кнопки, группируя их по строкам # Добавляем кнопки, группируя их по строкам
builder.button(text=ButtonInl.tg_chn, url=ButtonInl.tg_chn_url) ikb.button(text=ButtonInl.tg_chn, url=ButtonInl.tg_chn_url)
builder.button(text=ButtonInl.tg_chat, url=ButtonInl.tg_chat_url) ikb.button(text=ButtonInl.tg_chat, url=ButtonInl.tg_chat_url)
builder.button(text=ButtonInl.web_text, url=ButtonInl.web_url)
builder.button(text=ButtonInl.random_site, callback_data=ButtonInl.random_site_cbd)
builder.button(text=ButtonInl.random_num_dice, callback_data=ButtonInl.random_num_dice_cbd)
builder.button(text=ButtonInl.random_num_modal, callback_data=ButtonInl.random_num_modal_cdb)
builder.adjust(2, 1)
return builder.as_markup()
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

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

View File

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

View File

@@ -1,13 +1,13 @@
# BotCode/keyboards/reply_kb/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")
@@ -18,15 +18,13 @@ def get_help_kb() -> ReplyKeyboardMarkup:
"1", "2", "3", "1", "2", "3",
"4", "5", "6", "4", "5", "6",
"7", "8", "9", "7", "8", "9",
"0", "0",
] ]
# Создание кнопки каждого числа по отдельности
buttons_row = [KeyboardButton(text=num) for num in numbers] buttons_row = [KeyboardButton(text=num) for num in numbers]
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

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

View File

@@ -1,17 +1,15 @@
# BotCode/keyboards/reply_kb/start_kb.py # BotCode/keyboards/reply_kb/start_kb.py
# Создания клавиатуры на команду: /start # Создания клавиатуры на команду: /start
# Для создания базовой клавиатуры с некими элементами
from aiogram import Router from aiogram.types import ReplyKeyboardMarkup
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton from BotLibrary import rkb
from aiogram.utils.keyboard import ReplyKeyboardBuilder
# Создание роутера и настройка экспорта # Настройка экспорта из этого модуля
__all__ = ("router", "get_start_kb", "kb_text", "ButtonText",) __all__ = ("get_start_kb", "ButtonText")
kb_text = "StartKb"
router = Router(name="start_kb_router")
# Класс с названиями кнопок # Создание класса со значениями кнопок
class ButtonText: class ButtonText:
Hello = "Привет!" Hello = "Привет!"
Help = "Помогите!" Help = "Помогите!"
@@ -19,16 +17,9 @@ class ButtonText:
# Функция создания клавиатуры на команду: /start # Функция создания клавиатуры на команду: /start
def get_start_kb() -> ReplyKeyboardBuilder: def get_start_kb() -> ReplyKeyboardMarkup:
button_hello = KeyboardButton(text=ButtonText.Hello) rkb.button(text=ButtonText.Hello)
button_help = KeyboardButton(text=ButtonText.Help) rkb.button(text=ButtonText.Help)
button_bye = KeyboardButton(text=ButtonText.Bye) rkb.button(text=ButtonText.Bye)
rkb.adjust(2)
buttons_first_row = [button_hello, button_help] return rkb.as_markup(resize_keyboard=True, one_time_keyboard=True)
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

@@ -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

@@ -6,6 +6,7 @@ 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
@@ -19,6 +20,7 @@ router = Router(name="main_router")
router.include_routers( router.include_routers(
callback_handlers_router, 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,12 +4,10 @@
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",)
from routers.msg_default import msg_default
router = Router(name="secret_message_router") router = Router(name="secret_message_router")
log_type = "Admin" log_type = "Admin"

View File

@@ -4,16 +4,29 @@
from aiogram import Router, types, F from aiogram import Router, types, F
from aiogram.enums import ChatAction from aiogram.enums import ChatAction
from BotLibrary import * from BotLibrary import *
from routers.msg_default import msg_default from BotCode.routers.msg_default import msg_default
# Создание роутера и настройка экспорта # Создание роутера и настройка экспорта
__all__ = ("router",) __all__ = ("router",)
router = Router(name="easteggs_router") router = Router(name="easteggs")
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 найдена!"
@@ -26,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"{ProjectPath.personal_media}/{ProjectPath.personal_photo}/Undertale.jpg"), photo=types.FSInputFile(path=f"{ProjectPath.personal_photo}/Undertale.jpg"),
caption="ОНА МЕНЯ ЗАСТАВИЛА ПОМОГИТЕ😭... (Кст @fin_aki любит анал, тс..)", caption="ОНА МЕНЯ ЗАСТАВИЛА ПОМОГИТЕ😭... (Кст @fin_aki любит анал, тс..)",
) )
@@ -42,7 +55,7 @@ async def secret_admin_message_finaki(message: types.Message):
# Хэндлер на текст финикх # Хэндлер на текст финикх
@router.message(F.from_user.id.func(lambda user_id: str(user_id) in DataID.important.keys()), @router.message(F.from_user.id.func(lambda user_id: str(user_id) in DataID.important.keys()),
F.text.lower() == "финикх") 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(
@@ -57,7 +70,8 @@ async def secret_admin_message_finik(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.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(
@@ -72,7 +86,8 @@ async def secret_admin_message_finik(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.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,7 +95,7 @@ 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"{ProjectPath.personal_media}/{ProjectPath.personal_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)
@@ -88,7 +103,8 @@ async def secret_admin_message_rishkus(message: types.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"{ProjectPath.personal_media}/{ProjectPath.personal_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)
await msg_default(message) 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,8 +134,7 @@ async def secret_admin_message_lostik(message: types.Message):
# Вывод сообщения-гифки пользователю # Вывод сообщения-гифки пользователю
await message.reply_animation( await message.reply_animation(
animation=types.FSInputFile(path=f"{ProjectPath.personal_media}" animation=types.FSInputFile(path=f"{ProjectPath.personal_gif}/ЛжеРайяПрайм.mp4")
f"/{ProjectPath.personal_gif}/ЛжеРайяПрайм.mp4")
) )
# Активация логгера # Активация логгера
@@ -132,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 ещкере найдена!"
@@ -164,7 +181,8 @@ async def secret_admin_message_finaki(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.Num8)
async def secret_admin_message_finaki(message: types.Message): async def secret_admin_message_finaki(message: types.Message):
text = "Пасхалка 8 маз найдена!" text = "Пасхалка 8 маз найдена!"

View File

@@ -4,11 +4,11 @@
from random import randint from random import randint
from aiogram import Router, F from aiogram import Router, F
from aiogram.types import CallbackQuery from aiogram.types import CallbackQuery
from keyboards.inline_kb.actor_kb import ButtonInl from BotCode.keyboards.inline_kb.actor_kb import ButtonInl
# Создание роутера и настройка экспорта модулей # Создание роутера и настройка экспорта модулей
__all__ = ("router",) __all__ = ("router",)
router = Router(name="actor_kb_cb_router") router = Router(name="actor_kb_cb")
# Тестирование реферальных ссылок # Тестирование реферальных ссылок

View File

@@ -1,14 +1,15 @@
# BotCode/routers/callback_handlers/randnum_kb_cb.py # BotCode/routers/callback_handlers/randnum_kb_cb.py
# Обработчик запросов в команде /randnum # Обработчик запросов в команде /randnum
import asyncio
from random import randint from random import randint
from aiogram import Router, F from aiogram import Router, F
from aiogram.types import CallbackQuery from aiogram.types import CallbackQuery
from keyboards.inline_kb.randnum_kb import ButtonInl, get_randnum_kb from BotLibrary import ikb
from BotCode.keyboards.inline_kb.randnum_kb import ButtonInl, get_randnum_kb
# Создание роутера и настройка экспорта модулей # Создание роутера и настройка экспорта модулей
__all__ = ("router",) __all__ = ("router",)
router = Router(name="randnum_kb_cb_router") router = Router(name="randnum_kb_cb")
# Тестирование редактирования сообщения # Тестирование редактирования сообщения
@@ -18,15 +19,15 @@ async def random_site_cb(callback_query: CallbackQuery):
# Новый текст и клавиатура # Новый текст и клавиатура
new_text = f"Какая оценка у тебя будет сегодня: {randint(1, 5)}" new_text = f"Какая оценка у тебя будет сегодня: {randint(1, 5)}"
new_reply_markup = get_randnum_kb("Получить ответ от Таро") new_reply_markup = ikb.as_markup() # Обновленная клавиатура
# Текущий текст и клавиатура # Проверка, отличается ли текущее сообщение от нового
current_text = callback_query.message.text if callback_query.message.text != new_text or callback_query.message.reply_markup != new_reply_markup:
current_reply_markup = callback_query.message.reply_markup # Добавляем задержку, если необходимо
await asyncio.sleep(0.5) # Задержка 0.5 секунд
# Проверяем, отличаются ли текст и клавиатура # Редактируем сообщение и обновляем клавиатуру
if current_text != new_text or current_reply_markup != new_reply_markup:
await callback_query.message.edit_text( await callback_query.message.edit_text(
text=new_text, text=new_text,
reply_markup=new_reply_markup, reply_markup=new_reply_markup, # Обновляем клавиатуру
) )

View File

@@ -14,7 +14,7 @@ from .user_cmd.start_time_cmd import description as start_time_description,log_t
# Создание роутера и настройка экспорта модулей # Создание роутера и настройка экспорта модулей
__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"

View File

@@ -9,6 +9,7 @@ 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 .actor_cmd import router as actor_router
from .randnum_cmd import router as randnum_router from .randnum_cmd import router as randnum_router
from .time_cmd import router as time_router
# Объявление роутера и настройка экспорта модулей # Объявление роутера и настройка экспорта модулей
@@ -24,6 +25,7 @@ router.include_routers(
exit_router, exit_router,
actor_router, actor_router,
randnum_router, randnum_router,
time_router,
) )

View File

@@ -4,8 +4,8 @@
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 keyboards.inline_kb.actor_kb import get_actor_kb from BotCode.keyboards.inline_kb.actor_kb import get_actor_kb
from routers.msg_default import * from BotCode.routers.msg_default import *
# Создание роутера, переменных и настройка экспорта модулей # Создание роутера, переменных и настройка экспорта модулей
__all__ = ("router", "cmd_actor", "log_type",) __all__ = ("router", "cmd_actor", "log_type",)

View File

@@ -4,7 +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 routers.msg_default import msg_default from BotCode.routers.msg_default import msg_default
# Создание роутера, переменных и экспорта модулей # Создание роутера, переменных и экспорта модулей
__all__ = ("router", "exit_cmd", "log_type", "description") __all__ = ("router", "exit_cmd", "log_type", "description")

View File

@@ -4,8 +4,8 @@
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 keyboards.reply_kb.help_kb import get_help_kb from BotCode.keyboards.reply_kb.help_kb import get_help_kb
from routers.msg_default import msg_default from BotCode.routers.msg_default import msg_default
# Создание роутера, переменных и экспорта модулей # Создание роутера, переменных и экспорта модулей
__all__ = ("router", "cmd_help", "log_type", "description") __all__ = ("router", "cmd_help", "log_type", "description")
@@ -14,7 +14,7 @@ log_type = "Help"
description = "Получить помощь" description = "Получить помощь"
# Список ключевых слов для команды # Список ключевых слов для команды
keywords = ["help", "info", "помощь", "инфо", "?", "информация", "рудз", "штащ", "byaj", keywords = ["help", "info", "помощь", "инфо", "информация", "рудз", "штащ", "byaj",
"gjvjom", "byajhvfwbz",] "gjvjom", "byajhvfwbz",]

View File

@@ -4,8 +4,8 @@
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 keyboards.reply_kb.more_kb import get_more_kb from BotCode.keyboards.reply_kb.more_kb import get_more_kb
from routers.msg_default import msg_default from BotCode.routers.msg_default import msg_default
# Создание роутера, переменных и экспорта модулей # Создание роутера, переменных и экспорта модулей
__all__ = ("router", "cmd_start", "log_type",) __all__ = ("router", "cmd_start", "log_type",)

View File

@@ -4,8 +4,8 @@
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 keyboards.inline_kb.randnum_kb import get_randnum_kb from BotCode.keyboards.inline_kb.randnum_kb import get_randnum_kb
from routers.msg_default import msg_default from BotCode.routers.msg_default import msg_default
# Создание роутера, переменных и экспорта модулей # Создание роутера, переменных и экспорта модулей
__all__ = ("router", "cmd_randnum", "log_type",) __all__ = ("router", "cmd_randnum", "log_type",)
@@ -16,7 +16,6 @@ description = "Описание"
# Список ключевых слов для команды # Список ключевых слов для команды
keywords = ["кфтвтгь", "randnum",] keywords = ["кфтвтгь", "randnum",]
# Хэндлер на команду /randnum # Хэндлер на команду /randnum
@router.message(Command(*keywords, prefix=BotVariables.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))
@@ -24,7 +23,7 @@ async def cmd_randnum(message: types.Message):
text = "Работа с рандомом оценок!" text = "Работа с рандомом оценок!"
await message.reply( await message.reply(
text="Вы хотите узнать вашу оценку на сегодня?!", text="Вы хотите узнать вашу оценку на сегодня?!",
reply_markup=get_randnum_kb("Хочу: ТЫК"), reply_markup=get_randnum_kb(),
) )
# Активация логгера # Активация логгера

View File

@@ -4,8 +4,8 @@
from aiogram import Router, types, F from aiogram import Router, types, F
from aiogram.filters import Command, CommandStart from aiogram.filters import Command, CommandStart
from BotLibrary import * from BotLibrary import *
from keyboards.reply_kb.start_kb import get_start_kb from BotCode.keyboards.reply_kb.start_kb import get_start_kb
from routers.msg_default import msg_default from BotCode.routers.msg_default import msg_default
# Создание роутера, переменных и настройка экспорта модулей # Создание роутера, переменных и настройка экспорта модулей
__all__ = ("router", "cmd_start", "log_type", "description") __all__ = ("router", "cmd_start", "log_type", "description")

View File

@@ -4,7 +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 routers.msg_default import msg_default from BotCode.routers.msg_default import msg_default
# Создание роутера, переменных и настройка экспорта модулей # Создание роутера, переменных и настройка экспорта модулей
__all__ = ("router", "start_time", "log_type", "description") __all__ = ("router", "start_time", "log_type", "description")

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

@@ -4,7 +4,7 @@
from BotLibrary import * from BotLibrary import *
from aiogram import Router, types from aiogram import Router, types
from routers.msg_default import * from BotCode.routers.msg_default import *
# Настройка экспорта модулей и роутера # Настройка экспорта модулей и роутера
__all__ = ("router",) __all__ = ("router",)
@@ -15,7 +15,7 @@ log_type = "Messages"
# Хэндлер на все сообщения и записывает данные # Хэндлер на все сообщения и записывает данные
@router.message() @router.message()
async def handle_all_messages(message: types.Message): async def handle_all_messages(message: types.Message):
user_name = find_imp_id(message.from_user.id) user_name = find_imp_id(message.chat.id)
message_type = types_message(message) message_type = types_message(message)
await common_msg_logginger(message, user_name, message_type, log_type) await common_msg_logginger(message, user_name, message_type, log_type)

View File

@@ -4,9 +4,9 @@
from aiogram import Router, types, F from aiogram import Router, types, F
from aiogram.types import ReplyKeyboardRemove from aiogram.types import ReplyKeyboardRemove
from routers.msg_default import * from BotCode.routers.msg_default import *
from BotLibrary import find_imp_id, types_message, common_msg_logginger from BotLibrary import find_imp_id, types_message, common_msg_logginger
from keyboards.reply_kb.start_kb import ButtonText from BotCode.keyboards.reply_kb.start_kb import ButtonText
# Настройка экспорта модулей и роутера # Настройка экспорта модулей и роутера
__all__ = ("router",) __all__ = ("router",)

View File

@@ -2,7 +2,7 @@
# Небольшое облегчение для команд # Небольшое облегчение для команд
from loguru import logger from loguru import logger
from routers.downloads.download_avatar_all import download_avatar from BotCode.routers.downloads.download_avatar_all import download_avatar
from BotLibrary.analitics.message_to_file import write_message_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 from BotLibrary.analitics.user_data_to_file import write_user_info_to_file

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/timer/__init__.py
# Инициализация пакета timer, для временных операций (в разработке)

View File

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

View File

@@ -6,7 +6,7 @@ from loguru import logger
from datetime import datetime from datetime import datetime
from ..configs import * from ..configs import *
from ..library.time import TimeVariable from BotLibrary.configs import TimeVariable
from .types_msg import types_message, types_chat from .types_msg import types_message, types_chat
from .find_ids import find_imp_id from .find_ids import find_imp_id

View File

@@ -8,7 +8,7 @@ from loguru import logger
from time import sleep from time import sleep
from ..configs import ProjectPath, default_encod from ..configs import ProjectPath, default_encod
from ..library.time import TimeVariable from BotLibrary.configs.settings import TimeVariable
from ..library.bots import BotInfo from ..library.bots import BotInfo
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования

View File

@@ -2,7 +2,7 @@
# Определение типа сообщения # Определение типа сообщения
from aiogram.types import ContentType from aiogram.types import ContentType
from configs import * from ..configs import *
from .find_ids import find_imp_id from .find_ids import find_imp_id
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования

View File

@@ -6,8 +6,8 @@ import json
import datetime import datetime
from aiogram.types import User, Birthdate from aiogram.types import User, Birthdate
from configs import * from ..configs import *
from ..library.time import TimeVariable from BotLibrary.configs import TimeVariable
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования
__all__ = ("write_user_info_to_file", "format_user_record",) __all__ = ("write_user_info_to_file", "format_user_record",)

View File

@@ -2,7 +2,6 @@
# Инициализация пакета library, для работы с собственными библиотеками # Инициализация пакета library, для работы с собственными библиотеками
# Импортируем библиотеки для экспорта # Импортируем библиотеки для экспорта
from .config import *
from .settings import * from .settings import *
from .list_ids import * from .list_ids import *
from .important_path import * from .important_path import *

View File

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

View File

@@ -5,7 +5,7 @@ import os
import json import json
from loguru import logger from loguru import logger
from .config import * from .settings import default_encod
from .important_path import ProjectPath from .important_path import ProjectPath
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования
@@ -68,4 +68,4 @@ class DataID:
groups = data_list_id.get("important_groups_ids", {}) groups = data_list_id.get("important_groups_ids", {})
users = data_list_id.get("important_users_list_ids", {}) users = data_list_id.get("important_users_list_ids", {})
channels = data_list_id.get("important_channel_ids", {}) channels = data_list_id.get("important_channel_ids", {})
important = {**admins, **groups, **users, **channels} important = {**groups, **admins, **users, **channels}

View File

@@ -4,9 +4,17 @@
from os import getenv from os import getenv
from dotenv import load_dotenv from dotenv import load_dotenv
# Настройка экспорта модулей
__all__ = ("BotEdit", "BotVariables", "bot_token", "api_key", # Базовая кодировка файлов
"web_api_key", "important_id", "secret") 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" # Новый выбор для Красноярска
# Класс с параметрами бота # Класс с параметрами бота
@@ -23,10 +31,22 @@ class BotVariables:
prefixs = ('$', '!', '.', '%', '&', ':', '|', '+', '-', '/', '~', '?') prefixs = ('$', '!', '.', '%', '&', ':', '|', '+', '-', '/', '~', '?')
# Загружаем переменные из файла .env # Загружаем переменные из файла ProjectsFile/.env
load_dotenv(".env") load_dotenv("ProjectsFile/.env")
bot_token = getenv("main_bot_token")
api_key = getenv("APIKey") bot_token = getenv("BOT_TOKEN")
web_api_key = getenv("WebAPIKey") bot1_token = getenv("BOT1_TOKEN")
important_id = getenv("important_id") bot2_token = getenv("BOT2_TOKEN")
secret = getenv("secret")
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

@@ -6,7 +6,6 @@ from .bots import *
from .logger import * from .logger import *
from .edit_bot import * from .edit_bot import *
from .directory import * from .directory import *
from .time import *
from art import * from art import *
from colorama import * from colorama import *

View File

@@ -2,21 +2,26 @@
# Создание и настройка бота в одном файле # Создание и настройка бота в одном файле
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 .time import *
from configs import bot_token, BotVariables
# Настройка экспорта модулей и логирования from ..timers import *
__all__ = ("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")
# Создание экземпляра диспатчера и его параметров # Создание экземпляра диспатчера, строителей кнопок
dp = Dispatcher() dp = Dispatcher()
dp["started_at"] = host_time rkb = ReplyKeyboardBuilder()
ikb = InlineKeyboardBuilder()
# Настройка параметров диспатчера
dp["started_at"] = get_choice_time(TimeVariable.choice_utc_krsk)
dp["started_at_msk"] = get_choice_time(TimeVariable.choice_utc_msk) dp["started_at_msk"] = get_choice_time(TimeVariable.choice_utc_msk)
dp["is_active"] = True # Флаг активности бота dp["is_active"] = True # Флаг активности бота
dp["logs"] = [] dp["logs"] = []
@@ -33,19 +38,23 @@ dp["storage"] = {}
dp["database"] = None dp["database"] = None
# Объявление экземпляров и переменных # Объявление экземпляров и переменных для настроек бота
bot_properties = DefaultBotProperties( bot_properties = DefaultBotProperties(
parse_mode=ParseMode.HTML, # Устанавливаем формат HTML для всех сообщений parse_mode=ParseMode.HTML, # Устанавливаем формат HTML для всех сообщений, чтобы поддерживать форматирование
disable_notification=True, # Отключаем уведомления при отправке сообщений disable_notification=False, # Отключаем уведомления при отправке сообщений (не будет звука или всплывающих уведомлений)
protect_content=True, # Защищаем содержимое сообщений от копирования protect_content=False, # Защищаем содержимое сообщений, чтобы предотвратить его копирование
allow_sending_without_reply=True, # Разрешаем отправлять сообщения без ответа на другое сообщение allow_sending_without_reply=True, # Разрешаем отправлять сообщения без ответа на предыдущее сообщение (например, в одиночных чатах)
# link_preview=LinkPreviewOptions(), # Настройка для предварительного просмотра ссылок link_preview_is_disabled=False, # Отключаем предварительный просмотр ссылок (не показывать превью при вставке URL)
link_preview_is_disabled=True, # Отключаем предварительный просмотр ссылок link_preview_prefer_small_media=False, # Предпочитаем показывать маленькие медиа в превью ссылок
show_caption_above_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) # Объявление бота bot = Bot(token=bot_token, default=bot_properties) # Объявление бота
scheduler = AsyncIOScheduler(timezone=get_time_zone()) # Создание планировщика 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 # Фильтр на все
# Класс для хранения данных о боте (некоторые переменные даны как шаблон) # Класс для хранения данных о боте (некоторые переменные даны как шаблон)
@@ -74,7 +83,7 @@ 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.description = getattr(bot_info, 'description', '') # Default to empty string if no description cls.description = getattr(bot_info, 'description', '')
cls.short_description = getattr(bot_info, 'description', '') cls.short_description = getattr(bot_info, 'description', '')
cls.language_code = bot_info.language_code cls.language_code = bot_info.language_code
cls.is_premium = bot_info.is_premium cls.is_premium = bot_info.is_premium
@@ -82,8 +91,8 @@ class BotInfo:
cls.supports_inline_queries = bot_info.supports_inline_queries cls.supports_inline_queries = bot_info.supports_inline_queries
cls.can_connect_to_business = bot_info.can_connect_to_business cls.can_connect_to_business = bot_info.can_connect_to_business
cls.has_main_web_app = bot_info.has_main_web_app cls.has_main_web_app = bot_info.has_main_web_app
cls.can_join_groups = getattr(bot_info, 'can_join_groups', None) # Default to None if no attribute cls.can_join_groups = getattr(bot_info, 'can_join_groups', None)
cls.can_read_all_group_messages = getattr(bot_info, 'can_read_all_group_messages', None) # Default to None cls.can_read_all_group_messages = getattr(bot_info, 'can_read_all_group_messages', None)
# Функция получения данных о боте # Функция получения данных о боте

View File

@@ -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

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

View File

@@ -1,25 +1,18 @@
# BotLibrary/library/time.py # BotLibrary/timers/start_timer.py
# Библиотека поиски времени # Функция получения времени старта
import pytz import pytz
from tzlocal import get_localzone from tzlocal import get_localzone
from datetime import datetime from datetime import datetime
from ..configs import TimeVariable
# Настройка экспорта модулей и логирования # Настройка экспорта модулей и логирования
__all__ = ("TimeVariable", "host_time", "get_choice_time", "get_time_zone") __all__ = ("host_time", "get_choice_time", "get_time_zone")
log_type = "Time" log_type = "Time"
"""Создание класса с временными параметрами"""
class TimeVariable:
format = "%Y-%m-%d %H:%M:%S"
another_format = "%S:%M:%H %d-%m-%Y"
choice_main_utc = "Asia/Novosibirsk"
choice_utc_msk = "Europe/Moscow"
"""Получение времени хоста и иного места""" """Получение времени хоста и иного места"""
timezone = pytz.timezone(TimeVariable.choice_utc_msk) timezone = pytz.timezone(TimeVariable.choice_utc_krsk) # Используем Красноярск вместо Москвы
host_time = datetime.now(timezone) host_time = datetime.now(timezone)
@@ -37,13 +30,13 @@ def get_choice_time(choice_utc):
# Московский часовой пояс # Московский часовой пояс
choice_tz = pytz.timezone(choice_utc) choice_tz = pytz.timezone(choice_utc)
# Перевод времени в московский часовой пояс # Перевод времени в выбранный часовой пояс
choice_now = utc_now.astimezone(choice_tz) choice_now = utc_now.astimezone(choice_tz)
# Смещение UTC для Москвы # Смещение UTC для выбранного региона
utc_offset_choice = choice_now.utcoffset().total_seconds() / 3600 # Смещение в часах 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):+})" choice_time = choice_now.strftime(TimeVariable.format) + f" (UTC{int(utc_offset_choice):+})"
return choice_time 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

@@ -9,11 +9,13 @@
"1398573474": "Финаки", "1398573474": "Финаки",
"1851081467": "Финик", "1851081467": "Финик",
"929782381": "Хиде", "929782381": "Хиде",
"6714237814": "Слешик" "6714237814": "Слешик",
"1686743480": "Полина",
"1184519857": "Катаз"
}, },
"important_groups_ids": { "important_groups_ids": {
"1087968824": "GroupAnonymousBot", "1087968824": "GroupAnonymousBot",
"-1002247934490": "Сплетни_лавочек", "-1002442589033": "Любовники Сергея",
"-1002124483077": "Труба_Сквад", "-1002124483077": "Труба_Сквад",
"-1002123850090": "Тест_Чат", "-1002123850090": "Тест_Чат",
"-1001552311087": "Всеудет_Хорошо" "-1001552311087": "Всеудет_Хорошо"

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

@@ -16,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:
@@ -37,7 +37,7 @@ 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}")

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"
@@ -29,6 +28,7 @@ customtkinter = "^5.2.2"
pillow = "^11.0.0" pillow = "^11.0.0"
certifi = "^2024.12.14" certifi = "^2024.12.14"
idna = "^3.10" idna = "^3.10"
email-validator = "^2.2.0"
[build-system] [build-system]

View File

@@ -37,5 +37,3 @@ async def main():
# Вечная загрузка бота # Вечная загрузка бота
if __name__ == "__main__": # Исправлено: правильное именование if __name__ == "__main__": # Исправлено: правильное именование
asyncio.run(main()) asyncio.run(main())
# app = App()
# app.mainloop()