Обновление 4.2

This commit is contained in:
sergey
2025-02-08 19:12:38 +07:00
parent 6e2e7bdc0f
commit ef6906b240
39 changed files with 730 additions and 553 deletions

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,21 @@
# 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()
# Добавляем кнопки, группируя их по строкам
builder.button(text=text_msg, callback_data=ButtonInl.mark_cbd)
return builder.as_markup()
def get_randnum_kb() -> InlineKeyboardMarkup:
ikb.button(text=ButtonInl.text, callback_data=ButtonInl.mark_cbd)
ikb.add_row(1)
return ikb.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,7 +4,7 @@
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",)

View File

@@ -4,7 +4,7 @@
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",)

View File

@@ -4,7 +4,7 @@
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 BotCode.keyboards.inline_kb.randnum_kb import ButtonInl, get_randnum_kb
# Создание роутера и настройка экспорта модулей
__all__ = ("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")

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",)

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

@@ -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 BotLibrary import BotVariables
from email_validators import valid_email
from keyboards.reply_kb.survey_yesno_kb import get_survey_email_kb
from .states import Survey
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

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

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,7 +6,7 @@ import json
import datetime
from aiogram.types import User, Birthdate
from configs import *
from ..configs import *
from ..library.time import TimeVariable
# Настройка экспорта модулей и логирования

View File

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

@@ -2,20 +2,25 @@
# Создание и настройка бота в одном файле
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
from ..configs import bot_token, BotVariables
# Настройка экспорта модулей и логирования
__all__ = ("dp", "bot", "scheduler", "F_Media", "BotInfo", "bot_get_info")
log_type = "Bot"
# Настройка экспорта из этого модуля
__all__ = ("dp", "rkb", "ikb", "bot", "scheduler",
"F_Media", "F_All", "BotInfo", "bot_get_info")
# Создание экземпляра диспатчера и его параметров
# Создание экземпляра диспатчера, строителей кнопок
dp = Dispatcher()
rkb = ReplyKeyboardBuilder()
ikb = InlineKeyboardBuilder()
# Настройка параметров диспатчера
dp["started_at"] = host_time
dp["started_at_msk"] = get_choice_time(TimeVariable.choice_utc_msk)
dp["is_active"] = True # Флаг активности бота
@@ -46,6 +51,7 @@ bot_properties = DefaultBotProperties(
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 # Фильтр на все
# Класс для хранения данных о боте (некоторые переменные даны как шаблон)

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

@@ -43,3 +43,9 @@
---
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": "Всеудет_Хорошо"

874
poetry.lock generated

File diff suppressed because it is too large Load Diff

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]