from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Boolean, Text from sqlalchemy.orm import relationship from datetime import datetime from .base import Base class GroupMember(Base): """Модель для хранения участников группы""" __tablename__ = 'group_members' id = Column(Integer, primary_key=True) group_id = Column(Integer, ForeignKey('groups.id'), nullable=False) user_id = Column(String, nullable=False) # Telegram user ID username = Column(String, nullable=True) # Username если есть first_name = Column(String, nullable=True) # Имя last_name = Column(String, nullable=True) # Фамилия is_bot = Column(Boolean, default=False) # Это бот? is_admin = Column(Boolean, default=False) # Администратор группы? is_owner = Column(Boolean, default=False) # Владелец группы? joined_at = Column(DateTime, nullable=True) # Когда присоединился last_activity = Column(DateTime, default=datetime.utcnow) # Последняя активность created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Обратная связь group = relationship('Group', back_populates='members') def __repr__(self): return f'' class GroupKeyword(Base): """Модель для ключевых слов поиска групп""" __tablename__ = 'group_keywords' id = Column(Integer, primary_key=True) group_id = Column(Integer, ForeignKey('groups.id'), nullable=False, unique=True) keywords = Column(Text, nullable=False) # JSON массив ключевых слов description = Column(String, nullable=True) # Описание для поиска last_parsed = Column(DateTime, nullable=True) # Когда последний раз парсили is_active = Column(Boolean, default=True) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # Обратная связь group = relationship('Group', back_populates='keywords', foreign_keys=[group_id]) def __repr__(self): return f'' class GroupStatistics(Base): """Модель для статистики групп""" __tablename__ = 'group_statistics' id = Column(Integer, primary_key=True) group_id = Column(Integer, ForeignKey('groups.id'), nullable=False, unique=True) total_members = Column(Integer, default=0) # Всего участников total_admins = Column(Integer, default=0) # Всего администраторов total_bots = Column(Integer, default=0) # Всего ботов messages_sent = Column(Integer, default=0) # Отправлено сообщений messages_failed = Column(Integer, default=0) # Ошибок при отправке messages_via_client = Column(Integer, default=0) # Отправлено через Pyrogram can_send_as_bot = Column(Boolean, default=True) # Может ли бот отправлять? can_send_as_client = Column(Boolean, default=False) # Может ли клиент отправлять? last_updated = Column(DateTime, default=datetime.utcnow) created_at = Column(DateTime, default=datetime.utcnow) # Обратная связь group = relationship('Group', back_populates='statistics', foreign_keys=[group_id]) def __repr__(self): return f''