2026-09-07 19:43:48 +03:00

161 lines
4.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Конфигурация уведомлений для модуля Communications.
Содержит:
- NotificationVerbs - глаголы для уведомлений
- MessageTemplates - шаблоны сообщений
- ActionURLs - URL-адреса действий
- Вспомогательные функции для обработки сообщений
"""
import re
class NotificationVerbs:
"""Глаголы (verbs) для уведомлений communications."""
NEW_MESSAGE = "chat_new_message"
ANNOUNCEMENT = "announcement_new_message"
MENTION = "chat_mention"
REPLY = "chat_reply"
ADDED_TO_CHAT = "chat_added_to_chat"
COMMENTED = "commented" # Для комментариев к объектам
class MessageTemplates:
"""Шаблоны сообщений для уведомлений communications."""
@staticmethod
def mention(author_name: str) -> str:
"""Шаблон для упоминания пользователя."""
return f"Вас упомянул {author_name}"
@staticmethod
def reply(author_name: str) -> str:
"""Шаблон для ответа на сообщение."""
return f"{author_name} ответил на ваше сообщение"
@staticmethod
def announcement(author_name: str) -> str:
"""Шаблон для нового объявления."""
return f"Новое объявление от {author_name}"
@staticmethod
def private_message(author_name: str) -> str:
"""Шаблон для приватного сообщения."""
return f"Новое сообщение от {author_name}"
@staticmethod
def group_message(author_name: str, chat_name: str) -> str:
"""Шаблон для сообщения в группе."""
return f"{author_name} в {chat_name}"
@staticmethod
def added_to_chat(chat_name: str) -> str:
"""Шаблон для добавления в чат."""
return f'Вы были добавлены в чат "{chat_name}"'
@staticmethod
def added_to_chat_title() -> str:
"""Заголовок для уведомления о добавлении в чат."""
return "Вас добавили в чат"
class ActionURLs:
"""URL-адреса для действий с сообщениями."""
MESSAGES = "/messages"
@staticmethod
def chat_detail(chat_id: int) -> str:
"""
Возвращает URL-адрес чата.
"""
return f"/messages/{chat_id}"
@staticmethod
def message_detail(chat_id: int, message_id: int) -> str:
"""
Возвращает URL-адрес сообщения.
В будущем можно добавить прокрутку к конкретному сообщению.
"""
return f"/messages/{chat_id}?message={message_id}"
# ===== Вспомогательные функции =====
def extract_mentions(text: str) -> list[str]:
"""
Извлекает email'ы из упоминаний вида @email.
Args:
text: Текст сообщения
Returns:
list: Список email'ов без символа @
Examples:
>>> extract_mentions("Привет @user@example.com и @test@mail.com")
['user@example.com', 'test@mail.com']
"""
if not text:
return []
# Паттерн: @ + email формат
pattern = r"@([\w.+-]+@[\w.-]+\.[\w]+)"
mentions = re.findall(pattern, text)
return list(set(mentions)) # Уникальные значения
def truncate_message(text: str, max_length: int = 100) -> str:
"""
Обрезает текст сообщения до указанной длины.
Args:
text: Исходный текст
max_length: Максимальная длина (по умолчанию 100)
Returns:
Обрезанный текст с многоточием если нужно
"""
if not text:
return ""
if len(text) <= max_length:
return text
return text[: max_length - 3] + "..."
def get_chat_name(chat) -> str:
"""
Возвращает название чата в зависимости от типа.
Args:
chat: Объект Chat
Returns:
str: Название чата
"""
if chat.name:
return chat.name
if chat.type == "global":
return "Глобальный чат"
# Use context_object (GenericFK) for any chat type
if chat.context_object:
return f"Чат: {chat.context_object}"
if chat.type == "private":
# Для приватного чата можно вернуть имена участников
participants = chat.participants.all()[:2]
if participants:
names = [p.get_full_name() or p.username for p in participants]
return ", ".join(names)
return "Чат"