74 lines
3.6 KiB
Python
74 lines
3.6 KiB
Python
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'<GroupMember {self.user_id} in group {self.group_id}>'
|
||
|
||
|
||
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'<GroupKeyword group_id={self.group_id}>'
|
||
|
||
|
||
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'<GroupStatistics group_id={self.group_id}>'
|