This commit is contained in:
2026-02-20 03:12:47 +07:00
parent 5d350d0885
commit 5aca4e8438
23 changed files with 2291 additions and 1330 deletions

View File

@@ -19,7 +19,8 @@ __all__ = (
"Setting",
"SpamStat",
"SpamLog",
"AutoComment",
"AutoComment",
"Report",
)
@@ -294,3 +295,68 @@ class AutoComment(Base):
def __repr__(self) -> str:
return f"<AutoComment(channel_id={self.channel_id}, enabled={self.is_enabled})>"
class Report(Base):
"""
Модель для хранения статистики репортов.
Attributes:
id: Уникальный ID репорта
report_id: Строковый ID репорта (timestamp)
reporter_id: ID пользователя, который пожаловался
reporter_username: Username жалобщика
reported_user_id: ID пользователя, на которого пожаловались
reported_username: Username нарушителя
chat_id: ID чата, где произошло нарушение
chat_title: Название чата
message_id: ID сообщения-нарушения
message_thread_id: ID топика (если есть)
message_text: Текст сообщения (до 500 символов)
reason: Причина жалобы
status: Статус репорта (pending, closed, banned, deleted)
processed_by: ID админа, который обработал
created_at: Дата создания репорта
processed_at: Дата обработки
"""
__tablename__ = "reports"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
report_id: Mapped[str] = mapped_column(String(50), nullable=False, unique=True, index=True)
# Информация о жалобщике
reporter_id: Mapped[int] = mapped_column(BigInteger, nullable=False, index=True)
reporter_username: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
# Информация о нарушителе
reported_user_id: Mapped[int] = mapped_column(BigInteger, nullable=False, index=True)
reported_username: Mapped[Optional[str]] = mapped_column(String(100), nullable=True)
# Информация о чате и сообщении
chat_id: Mapped[int] = mapped_column(BigInteger, nullable=False)
chat_title: Mapped[Optional[str]] = mapped_column(String(255), nullable=True)
message_id: Mapped[int] = mapped_column(Integer, nullable=False)
message_thread_id: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
message_text: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
# Причина и статус
reason: Mapped[str] = mapped_column(Text, nullable=False)
status: Mapped[str] = mapped_column(
String(20),
default="pending",
nullable=False,
index=True
) # pending, closed, banned, deleted
# Обработка
processed_by: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
created_at: Mapped[datetime] = mapped_column(
DateTime,
default=lambda: datetime.now(timezone.utc),
nullable=False,
index=True
)
processed_at: Mapped[Optional[datetime]] = mapped_column(DateTime, nullable=True)
def __repr__(self) -> str:
return f"<Report(id={self.report_id}, reporter={self.reporter_id}, reported={self.reported_user_id})>"