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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

@@ -1,13 +1,13 @@
# BotCode/keyboards/reply_kb/help_kb.py
# Создание клавиатуры для сообщения: "Помогите!"
# Создает небольшую числовую клавиатуру для тестов
from aiogram import Router, F
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from aiogram.utils.keyboard import ReplyKeyboardBuilder
from BotLibrary import rkb
# Создание роутера и настройка экспорта модулей
__all__ = ("router", "get_help_kb", "kb_text",)
kb_text = "HelpKb"
__all__ = ("router", "get_help_kb")
router = Router(name="help_kb_router")
@@ -21,12 +21,10 @@ def get_help_kb() -> ReplyKeyboardMarkup:
"0",
]
# Создание кнопки каждого числа по отдельности
buttons_row = [KeyboardButton(text=num) for num in numbers]
builder = ReplyKeyboardBuilder()
for num in numbers:
builder.button(text=num)
builder.adjust(3)
builder.row(buttons_row[3], buttons_row[9])
builder.add(buttons_row[-1])
rkb.button(text=num)
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
# Создания клавиатуры на команду: /more
# Для проверки отправки информации о пользователе
from aiogram import Router
from aiogram.types import KeyboardButtonPollType
from aiogram.utils.keyboard import ReplyKeyboardBuilder
from aiogram.types import KeyboardButtonPollType, ReplyKeyboardMarkup
from BotLibrary import rkb
# Создание роутера и настройка экспорта модулей
__all__ = ("router", "get_more_kb", "kb_text",)
kb_text = "HelpKb"
router = Router(name="more_kb_router")
# Настройка экспорта из этого модуля
__all__ = ("get_more_kb", "ButtonText")
# Класс с названиями кнопок
# Создание класса со значениями кнопок
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
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

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

@@ -6,6 +6,7 @@ from .callback_handlers import router as callback_handlers_router
from .commands.bot_command import set_commands
from .administration import router as admin_head_router
from .commands import router as commands_head_router
from .survey import router as survey_head_router
from .downloads import router as downloads_head_router
from .common import router as users_head_router
@@ -19,6 +20,7 @@ router = Router(name="main_router")
router.include_routers(
callback_handlers_router,
admin_head_router,
survey_head_router,
commands_head_router,
downloads_head_router,
)

View File

@@ -4,12 +4,10 @@
from aiogram import Router, types, F
from aiogram.filters import Command
from BotLibrary import *
from BotCode.routers.msg_default import msg_default
# Создание роутера и настройка экспорта модулей
__all__ = ("router",)
from routers.msg_default import msg_default
router = Router(name="secret_message_router")
log_type = "Admin"

View File

@@ -4,16 +4,29 @@
from aiogram import Router, types, F
from aiogram.enums import ChatAction
from BotLibrary import *
from routers.msg_default import msg_default
from BotCode.routers.msg_default import msg_default
# Создание роутера и настройка экспорта
__all__ = ("router",)
router = Router(name="easteggs_router")
router = Router(name="easteggs")
log_type = "EastEggs"
# Класс с текстовыми пасхалками бота
class EastEggsName:
Num1 = "финаки228"
Num2 = "финикх"
Num3 = "андертейлкино"
Num4 = "ришкус"
Num5 = "skodavano"
Num6 = "лостикслешик"
Num7 = "ещкере"
Num8 = "маз"
# Хэндлер на текст финаки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):
text = "Пасхалка 1 Финаки228 найдена!"
@@ -26,7 +39,7 @@ async def secret_admin_message_finaki(message: types.Message):
# Отправка фотографии
try:
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 любит анал, тс..)",
)
@@ -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()),
F.text.lower() == "финикх")
F.text.lower() == EastEggsName.Num2)
async def secret_admin_message_finik(message: types.Message):
text = f"Пасхалка 2 финикx найдена!"
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):
text = f"Пасхалка 3 андертейлкино найдена!"
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):
text = f"Пасхалка 4 ришкус найдена!"
await message.bot.send_chat_action(
@@ -80,7 +95,7 @@ async def secret_admin_message_rishkus(message: types.Message):
action=ChatAction.UPLOAD_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="Россия для грустных",
)
await cmd_logginger(message, log_type, text)
@@ -88,7 +103,8 @@ async def secret_admin_message_rishkus(message: types.Message):
# Хэндлер на текст 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):
text = f"Пасхалка 5 skodavano найдена!"
await message.bot.send_chat_action(
@@ -96,15 +112,16 @@ async def secret_admin_message_skodavano(message: types.Message):
action=ChatAction.UPLOAD_PHOTO,
)
await message.reply_photo(
photo=types.FSInputFile(path=f"{ProjectPath.personal_media}/{ProjectPath.personal_photo}/Vano.jpg"),
caption="SkodaRacingVano24 -> Синяя изолента",
photo=types.FSInputFile(path=f"{ProjectPath.personal_photo}/Vano.jpg"),
caption="@skodaracing24 -> Синяя изолента",
)
await cmd_logginger(message, log_type, 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):
try:
text = f"Пасхалка 6 лостикслешик найдена!"
@@ -117,8 +134,7 @@ async def secret_admin_message_lostik(message: types.Message):
# Вывод сообщения-гифки пользователю
await message.reply_animation(
animation=types.FSInputFile(path=f"{ProjectPath.personal_media}"
f"/{ProjectPath.personal_gif}/ЛжеРайяПрайм.mp4")
animation=types.FSInputFile(path=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):
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):
text = "Пасхалка 8 маз найдена!"

View File

@@ -4,11 +4,11 @@
from random import randint
from aiogram import Router, F
from aiogram.types import CallbackQuery
from keyboards.inline_kb.actor_kb import ButtonInl
from BotCode.keyboards.inline_kb.actor_kb import ButtonInl
# Создание роутера и настройка экспорта модулей
__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
# Обработчик запросов в команде /randnum
import asyncio
from random import randint
from aiogram import Router, F
from aiogram.types import CallbackQuery
from keyboards.inline_kb.randnum_kb import ButtonInl, get_randnum_kb
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")
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_reply_markup = get_randnum_kb("Получить ответ от Таро")
new_reply_markup = ikb.as_markup() # Обновленная клавиатура
# Текущий текст и клавиатура
current_text = callback_query.message.text
current_reply_markup = callback_query.message.reply_markup
# Проверка, отличается ли текущее сообщение от нового
if callback_query.message.text != new_text or callback_query.message.reply_markup != new_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(
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",)
router = Router(name="bot_command_router")
router = Router(name=__name__)
log_type = "SetCmd"
# Список ключевых слов для команды "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 .actor_cmd import router as actor_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,
actor_router,
randnum_router,
time_router,
)

View File

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

View File

@@ -4,7 +4,7 @@
from aiogram import Router, types, F
from aiogram.filters import Command
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")

View File

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

View File

@@ -4,8 +4,8 @@
from aiogram import Router, types, F
from aiogram.filters import Command
from BotLibrary import *
from keyboards.reply_kb.more_kb import get_more_kb
from routers.msg_default import msg_default
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",)

View File

@@ -4,8 +4,8 @@
from aiogram import Router, types, F
from aiogram.filters import Command
from BotLibrary import *
from keyboards.inline_kb.randnum_kb import get_randnum_kb
from routers.msg_default import msg_default
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",)
@@ -16,7 +16,6 @@ description = "Описание"
# Список ключевых слов для команды
keywords = ["кфтвтгь", "randnum",]
# Хэндлер на команду /randnum
@router.message(Command(*keywords, prefix=BotVariables.prefixs, ignore_case=True))
@router.message(F.text.lower().in_(keywords))
@@ -24,7 +23,7 @@ async def cmd_randnum(message: types.Message):
text = "Работа с рандомом оценок!"
await message.reply(
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.filters import Command, CommandStart
from BotLibrary import *
from keyboards.reply_kb.start_kb import get_start_kb
from routers.msg_default import msg_default
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", "description")

View File

@@ -4,7 +4,7 @@
from aiogram import Router, types, F
from aiogram.filters import Command
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")

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 aiogram import Router, types
from routers.msg_default import *
from BotCode.routers.msg_default import *
# Настройка экспорта модулей и роутера
__all__ = ("router",)
@@ -15,7 +15,7 @@ log_type = "Messages"
# Хэндлер на все сообщения и записывает данные
@router.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)
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.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 keyboards.reply_kb.start_kb import ButtonText
from BotCode.keyboards.reply_kb.start_kb import ButtonText
# Настройка экспорта модулей и роутера
__all__ = ("router",)

View File

@@ -2,7 +2,7 @@
# Небольшое облегчение для команд
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.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 .media 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 ..configs import *
from ..library.time import TimeVariable
from BotLibrary.configs import TimeVariable
from .types_msg import types_message, types_chat
from .find_ids import find_imp_id

View File

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

View File

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

View File

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

View File

@@ -2,7 +2,6 @@
# Инициализация пакета library, для работы с собственными библиотеками
# Импортируем библиотеки для экспорта
from .config import *
from .settings import *
from .list_ids 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
from loguru import logger
from .config import *
from .settings import default_encod
from .important_path import ProjectPath
# Настройка экспорта модулей и логирования
@@ -68,4 +68,4 @@ class DataID:
groups = data_list_id.get("important_groups_ids", {})
users = data_list_id.get("important_users_list_ids", {})
channels = data_list_id.get("important_channel_ids", {})
important = {**admins, **groups, **users, **channels}
important = {**groups, **admins, **users, **channels}

View File

@@ -4,9 +4,17 @@
from os import getenv
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 = ('$', '!', '.', '%', '&', ':', '|', '+', '-', '/', '~', '?')
# Загружаем переменные из файла .env
load_dotenv(".env")
bot_token = getenv("main_bot_token")
api_key = getenv("APIKey")
web_api_key = getenv("WebAPIKey")
important_id = getenv("important_id")
secret = getenv("secret")
# Загружаем переменные из файла 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

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

View File

@@ -2,21 +2,26 @@
# Создание и настройка бота в одном файле
from aiogram import Dispatcher, Bot, F
from aiogram.client.default import DefaultBotProperties
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 .time import *
from configs import bot_token, BotVariables
# Настройка экспорта модулей и логирования
__all__ = ("dp", "bot", "scheduler", "F_Media", "BotInfo", "bot_get_info")
log_type = "Bot"
from ..timers import *
from ..configs import bot_token, BotVariables, TimeVariable
# Настройка экспорта из этого модуля
__all__ = ("dp", "rkb", "ikb", "bot", "scheduler",
"F_Media", "F_All", "BotInfo", "bot_get_info")
# Создание экземпляра диспатчера и его параметров
# Создание экземпляра диспатчера, строителей кнопок
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["is_active"] = True # Флаг активности бота
dp["logs"] = []
@@ -33,19 +38,23 @@ dp["storage"] = {}
dp["database"] = None
# Объявление экземпляров и переменных
# Объявление экземпляров и переменных для настроек бота
bot_properties = DefaultBotProperties(
parse_mode=ParseMode.HTML, # Устанавливаем формат HTML для всех сообщений
disable_notification=True, # Отключаем уведомления при отправке сообщений
protect_content=True, # Защищаем содержимое сообщений от копирования
allow_sending_without_reply=True, # Разрешаем отправлять сообщения без ответа на другое сообщение
# link_preview=LinkPreviewOptions(), # Настройка для предварительного просмотра ссылок
link_preview_is_disabled=True, # Отключаем предварительный просмотр ссылок
show_caption_above_media=False, # Показываем подпись выше медиа
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_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.last_name = bot_info.last_name
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.language_code = bot_info.language_code
cls.is_premium = bot_info.is_premium
@@ -82,8 +91,8 @@ class BotInfo:
cls.supports_inline_queries = bot_info.supports_inline_queries
cls.can_connect_to_business = bot_info.can_connect_to_business
cls.has_main_web_app = bot_info.has_main_web_app
cls.can_join_groups = getattr(bot_info, 'can_join_groups', None) # Default to None if no attribute
cls.can_read_all_group_messages = getattr(bot_info, 'can_read_all_group_messages', None) # Default to None
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)
# Функция получения данных о боте

View File

@@ -19,7 +19,7 @@ async def set_all():
await set_bot_name()
await set_bot_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()
if current_rights != rights:
await bot.set_my_default_administrator_rights(rights)
return f"Админ права бота изменены!"
return "Админ права бота изменены!"
else:
return f"Админ права уже установлены и не требуют изменений."
return "Админ права уже установлены и не требуют изменений."
# Функция установки описания бота с проверкой на ограничения
@@ -87,9 +87,9 @@ async def set_bot_description():
# Проверяем, совпадает ли текущее описание с тем, которое мы хотим установить
if current_description != BotEdit.description:
await bot.set_my_description(description=BotEdit.description)
return f"Описание бота изменено!"
return "Описание бота изменено!"
else:
return f"Описание бота уже установлено и не требует изменений."
return "Описание бота уже установлено и не требует изменений."
# Функция установки короткого описания бота с проверкой на ограничения
@@ -105,6 +105,6 @@ async def set_bot_short_description():
# Проверяем, совпадает ли текущее короткое описание с тем, которое мы хотим установить
if current_short_description != BotEdit.short_description:
await bot.set_my_short_description(short_description=BotEdit.short_description)
return f"Короткое описание бота изменено!"
return "Короткое описание бота изменено!"
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
from tzlocal import get_localzone
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"
"""Создание класса с временными параметрами"""
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)
@@ -37,13 +30,13 @@ def get_choice_time(choice_utc):
# Московский часовой пояс
choice_tz = pytz.timezone(choice_utc)
# Перевод времени в московский часовой пояс
# Перевод времени в выбранный часовой пояс
choice_now = utc_now.astimezone(choice_tz)
# Смещение UTC для Москвы
# Смещение 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

@@ -9,11 +9,13 @@
"1398573474": "Финаки",
"1851081467": "Финик",
"929782381": "Хиде",
"6714237814": "Слешик"
"6714237814": "Слешик",
"1686743480": "Полина",
"1184519857": "Катаз"
},
"important_groups_ids": {
"1087968824": "GroupAnonymousBot",
"-1002247934490": "Сплетни_лавочек",
"-1002442589033": "Любовники Сергея",
"-1002124483077": "Труба_Сквад",
"-1002123850090": "Тест_Чат",
"-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):
# Исключаем определенные директории
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
for file in files:
@@ -37,7 +37,7 @@ def count_lines_in_python_files(directory):
return total_lines, total_files
# Задайте путь к вашей директории
directory_path = r'./'
directory_path = r'../'
lines_count, files_count = count_lines_in_python_files(directory_path)
print(f"Общее количество строк в файлах .py: {lines_count}")

View File

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

View File

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