init commit

This commit is contained in:
2025-12-18 05:55:32 +09:00
commit a6817e487e
72 changed files with 13847 additions and 0 deletions

40
app/utils/__init__.py Normal file
View File

@@ -0,0 +1,40 @@
from datetime import datetime, timedelta
from app.models import Group
async def can_send_message(group: Group) -> tuple[bool, int]:
"""
Проверить, можно ли отправить сообщение в группу с учетом slow mode
Возвращает (можно_ли_отправить, сколько_секунд_ждать)
"""
if group.slow_mode_delay == 0:
# Нет ограничений
return True, 0
if group.last_message_time is None:
# Первое сообщение
return True, 0
time_since_last_message = datetime.utcnow() - group.last_message_time
seconds_to_wait = group.slow_mode_delay - time_since_last_message.total_seconds()
if seconds_to_wait <= 0:
return True, 0
else:
return False, int(seconds_to_wait) + 1
async def wait_for_slow_mode(group: Group) -> int:
"""
Ждать, пока пройдет slow mode
Возвращает реальное время ожидания в секундах
"""
can_send, wait_time = await can_send_message(group)
if can_send:
return 0
await asyncio.sleep(wait_time)
return wait_time
import asyncio

89
app/utils/keyboards.py Normal file
View File

@@ -0,0 +1,89 @@
from telegram import InlineKeyboardMarkup, InlineKeyboardButton
from enum import Enum
class CallbackType(str, Enum):
"""Типы callback'ов для кнопок"""
MANAGE_MESSAGES = "manage_messages"
MANAGE_GROUPS = "manage_groups"
CREATE_MESSAGE = "create_message"
CREATE_GROUP = "create_group"
VIEW_MESSAGE = "view_message"
VIEW_GROUP = "view_group"
DELETE_MESSAGE = "delete_message"
DELETE_GROUP = "delete_group"
ADD_TO_GROUP = "add_to_group"
REMOVE_FROM_GROUP = "remove_from_group"
SEND_NOW = "send_now"
LIST_MESSAGES = "list_messages"
LIST_GROUPS = "list_groups"
BACK = "back"
MAIN_MENU = "main_menu"
def get_main_keyboard() -> InlineKeyboardMarkup:
"""Главное меню"""
keyboard = [
[
InlineKeyboardButton("📨 Сообщения", callback_data=CallbackType.MANAGE_MESSAGES),
InlineKeyboardButton("👥 Группы", callback_data=CallbackType.MANAGE_GROUPS),
]
]
return InlineKeyboardMarkup(keyboard)
def get_messages_keyboard() -> InlineKeyboardMarkup:
"""Меню управления сообщениями"""
keyboard = [
[InlineKeyboardButton(" Новое сообщение", callback_data=CallbackType.CREATE_MESSAGE)],
[InlineKeyboardButton("📜 Список сообщений", callback_data=CallbackType.LIST_MESSAGES)],
[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.MAIN_MENU)],
]
return InlineKeyboardMarkup(keyboard)
def get_groups_keyboard() -> InlineKeyboardMarkup:
"""Меню управления группами"""
keyboard = [
[InlineKeyboardButton(" Добавить группу", callback_data=CallbackType.CREATE_GROUP)],
[InlineKeyboardButton("📜 Список групп", callback_data=CallbackType.LIST_GROUPS)],
[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.MAIN_MENU)],
]
return InlineKeyboardMarkup(keyboard)
def get_back_keyboard() -> InlineKeyboardMarkup:
"""Кнопка назад"""
keyboard = [[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.MAIN_MENU)]]
return InlineKeyboardMarkup(keyboard)
def get_message_actions_keyboard(message_id: int) -> InlineKeyboardMarkup:
"""Действия с сообщением"""
keyboard = [
[InlineKeyboardButton("📤 Отправить", callback_data=f"send_msg_{message_id}")],
[InlineKeyboardButton("🗑️ Удалить", callback_data=f"delete_msg_{message_id}")],
[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.LIST_MESSAGES)],
]
return InlineKeyboardMarkup(keyboard)
def get_group_actions_keyboard(group_id: int) -> InlineKeyboardMarkup:
"""Действия с группой"""
keyboard = [
[InlineKeyboardButton("📝 Сообщения", callback_data=f"group_messages_{group_id}")],
[InlineKeyboardButton("🗑️ Удалить", callback_data=f"delete_group_{group_id}")],
[InlineKeyboardButton("⬅️ Назад", callback_data=CallbackType.LIST_GROUPS)],
]
return InlineKeyboardMarkup(keyboard)
def get_yes_no_keyboard(action: str) -> InlineKeyboardMarkup:
"""Подтверждение да/нет"""
keyboard = [
[
InlineKeyboardButton("✅ Да", callback_data=f"confirm_{action}"),
InlineKeyboardButton("❌ Нет", callback_data=CallbackType.MAIN_MENU),
]
]
return InlineKeyboardMarkup(keyboard)