Files
MamieHenriette/database/models.py
T

275 lines
10 KiB
Python

from datetime import datetime
from database import db
from flask_login import UserMixin
# Rôles par défaut (niveau 0 à 5) — seed en base via migration
ROLE_ORDER = [
"viewer_twitch",
"utilisateur_discord",
"moderateur_discord",
"expert_discord",
"moderateur_twitch",
"super_administrateur",
]
def role_level(role_name: str) -> int:
"""Retourne le niveau du rôle depuis la table webapp_role (-1 si inconnu)."""
if not role_name:
return -1
r = WebappRole.query.filter_by(name=role_name).first()
return r.level if r else -1
class WebappRole(db.Model):
__tablename__ = "webapp_role"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True, nullable=False)
level = db.Column(db.Integer, nullable=False, default=0)
description = db.Column(db.String(256), nullable=True)
color = db.Column(db.String(7), nullable=True, default="#6B7280") # Couleur hexadécimale pour l'affichage
icon = db.Column(db.String(32), nullable=True) # Nom d'icône (ex: 'user', 'shield', 'crown')
class PagePermission(db.Model):
__tablename__ = "webapp_page_permission"
id = db.Column(db.Integer, primary_key=True)
page_key = db.Column(db.String(64), unique=True, nullable=False)
min_level = db.Column(db.Integer, nullable=False, default=0)
write_level = db.Column(db.Integer, nullable=True)
category = db.Column(db.String(32), nullable=True, default="general") # Catégorie: 'general', 'moderation', 'content', 'config'
description = db.Column(db.String(256), nullable=True) # Description de la page
class WebappUser(db.Model, UserMixin):
__tablename__ = "webapp_user"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, nullable=False)
email = db.Column(db.String(256), unique=True, nullable=False)
password_hash = db.Column(db.String(256), nullable=False)
role = db.Column(db.String(64), nullable=False, default="viewer_twitch")
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
def get_level(self) -> int:
return role_level(self.role)
def has_role_at_least(self, min_role: str) -> bool:
return self.get_level() >= role_level(min_role)
def has_level_at_least(self, level: int) -> bool:
return self.get_level() >= level
def has_any_role(self, roles: list) -> bool:
return self.role in roles
class Configuration(db.Model):
key = db.Column(db.String(32), primary_key=True)
value = db.Column(db.Text)
class Humeur(db.Model):
id = db.Column(db.Integer, primary_key=True)
enable = db.Column(db.Boolean, default=True)
text = db.Column(db.String(256))
class GameAlias(db.Model):
id = db.Column(db.Integer, primary_key=True)
alias = db.Column(db.String(32))
name = db.Column(db.String(256))
class GameBundle(db.Model):
url = db.Column(db.String(2048), primary_key=True)
name = db.Column(db.String(256))
json = db.Column(db.String(2048))
class LiveAlert(db.Model):
id = db.Column(db.Integer, primary_key=True)
enable = db.Column(db.Boolean, default=True)
online = db.Column(db.Boolean, default=False)
login = db.Column(db.String(128))
notify_channel = db.Column(db.Integer)
message = db.Column(db.String(2000)) # message optionnel avant l'embed
watch_activity = db.Column(db.Boolean, default=False)
# Personnalisation de l'embed Discord (comme YouTube)
embed_title = db.Column(db.String(256))
embed_description = db.Column(db.String(2000))
embed_color = db.Column(db.String(8), default='9146FF') # violet Twitch
embed_footer = db.Column(db.String(2048))
embed_author_name = db.Column(db.String(256))
embed_author_icon = db.Column(db.String(512))
embed_thumbnail = db.Column(db.Boolean, default=True)
embed_image = db.Column(db.Boolean, default=True)
class TwitchAnnouncement(db.Model):
__tablename__ = 'twitch_announcement'
id = db.Column(db.Integer, primary_key=True)
enable = db.Column(db.Boolean, default=True)
name = db.Column(db.String(64))
text = db.Column(db.String(500))
periodicity = db.Column(db.Integer, default=10)
min_chat_messages = db.Column(db.Integer, default=0)
last_sent = db.Column(db.DateTime, nullable=True)
# Niveaux de permission Twitch pour les commandes personnalisées : viewer, sub, vip, moderator
class Commande(db.Model):
id = db.Column(db.Integer, primary_key=True)
discord_enable = db.Column(db.Boolean, default=True)
twitch_enable = db.Column(db.Boolean, default=True)
trigger = db.Column(db.String(32), unique=True)
response = db.Column(db.String(2000))
twitch_permission = db.Column(db.String(16), default='viewer') # viewer | sub | vip | moderator
class ModerationEvent(db.Model):
id = db.Column(db.Integer, primary_key=True)
type = db.Column(db.String(32))
username = db.Column(db.String(256))
discord_id = db.Column(db.String(64))
created_at = db.Column(db.DateTime)
reason = db.Column(db.String(1024))
staff_id = db.Column(db.String(64))
staff_name = db.Column(db.String(256))
duration = db.Column(db.Integer)
class TwitchModerationLog(db.Model):
__tablename__ = 'twitch_moderation_log'
id = db.Column(db.Integer, primary_key=True)
action = db.Column(db.String(32))
moderator = db.Column(db.String(256))
target = db.Column(db.String(256))
details = db.Column(db.String(512))
created_at = db.Column(db.DateTime)
class TwitchLinkFilter(db.Model):
__tablename__ = 'twitch_link_filter'
id = db.Column(db.Integer, primary_key=True)
enabled = db.Column(db.Boolean, default=False)
allow_subscribers = db.Column(db.Boolean, default=True)
allow_vips = db.Column(db.Boolean, default=True)
allow_moderators = db.Column(db.Boolean, default=True)
timeout_duration = db.Column(db.Integer, default=60)
warning_message = db.Column(db.String(500), default="Les liens ne sont pas autorises dans le chat.")
class TwitchAllowedDomain(db.Model):
__tablename__ = 'twitch_allowed_domain'
id = db.Column(db.Integer, primary_key=True)
domain = db.Column(db.String(256), unique=True)
class TwitchPermit(db.Model):
__tablename__ = 'twitch_permit'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(256))
expires_at = db.Column(db.DateTime)
class TwitchAllowedUser(db.Model):
__tablename__ = 'twitch_allowed_user'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(256), unique=True)
class AntiCheatCache(db.Model):
__tablename__ = 'anticheat_cache'
steam_id = db.Column(db.String(32), primary_key=True)
game_name = db.Column(db.String(256))
status = db.Column(db.String(32))
anticheats = db.Column(db.String(512))
reference = db.Column(db.String(512))
notes = db.Column(db.String(1024))
updated_at = db.Column(db.DateTime)
class YouTubeNotification(db.Model):
__tablename__ = 'youtube_notification'
id = db.Column(db.Integer, primary_key=True)
enable = db.Column(db.Boolean, default=True)
channel_id = db.Column(db.String(128))
notify_channel = db.Column(db.Integer)
message = db.Column(db.String(2000))
video_type = db.Column(db.String(16), default='all')
last_video_id = db.Column(db.String(128))
embed_title = db.Column(db.String(256))
embed_description = db.Column(db.String(2000))
embed_color = db.Column(db.String(8), default='FF0000')
embed_footer = db.Column(db.String(2048))
embed_author_name = db.Column(db.String(256))
embed_author_icon = db.Column(db.String(512))
embed_thumbnail = db.Column(db.Boolean, default=True)
embed_image = db.Column(db.Boolean, default=True)
class YouTubeVideoHistory(db.Model):
__tablename__ = 'youtube_video_history'
id = db.Column(db.Integer, primary_key=True)
notification_id = db.Column(db.Integer, db.ForeignKey('youtube_notification.id'), nullable=False)
video_id = db.Column(db.String(128), nullable=False)
title = db.Column(db.String(512))
url = db.Column(db.String(512))
channel_name = db.Column(db.String(256))
thumbnail = db.Column(db.String(512))
published_at = db.Column(db.String(64))
is_short = db.Column(db.Boolean, default=False)
notified = db.Column(db.Boolean, default=False)
detected_at = db.Column(db.DateTime, default=datetime.utcnow)
class AutoRoom(db.Model):
"""État persistant des salons vocaux temporaires."""
__tablename__ = 'auto_room'
guild_id = db.Column(db.String(32), primary_key=True)
voice_channel_id = db.Column(db.String(32), primary_key=True)
owner_id = db.Column(db.String(32), nullable=False)
control_message_id = db.Column(db.String(32))
access_mode = db.Column(db.String(16), nullable=False, default='open')
whitelist = db.Column(db.Text, nullable=False, default='[]')
blacklist = db.Column(db.Text, nullable=False, default='[]')
managed_member_ids = db.Column(db.Text, nullable=False, default='[]')
class FreeLootEntry(db.Model):
__tablename__ = 'freeloot_entry'
entry_id = db.Column(db.String(256), primary_key=True)
class TwitchEventNotification(db.Model):
"""Configuration des notifications par type d'événement (sub, follow, raid, clip)."""
__tablename__ = 'twitch_event_notification'
id = db.Column(db.Integer, primary_key=True)
event_type = db.Column(db.String(32), unique=True, nullable=False) # sub, follow, raid, clip
enable = db.Column(db.Boolean, default=True)
notify_twitch_chat = db.Column(db.Boolean, default=True)
notify_discord = db.Column(db.Boolean, default=False)
discord_channel_id = db.Column(db.Integer, nullable=True)
message_twitch = db.Column(db.String(500), default='')
message_discord = db.Column(db.String(2000), nullable=True)
embed_color = db.Column(db.String(8), default='9146FF')
embed_title = db.Column(db.String(256), nullable=True)
embed_description = db.Column(db.String(2000), nullable=True)
embed_thumbnail = db.Column(db.Boolean, default=True)
last_clip_id = db.Column(db.String(128), nullable=True) # pour détecter les nouveaux clips
class TwitchBannedWord(db.Model):
"""Mots interdits dans le chat Twitch."""
__tablename__ = 'twitch_banned_word'
id = db.Column(db.Integer, primary_key=True)
word = db.Column(db.String(256), unique=True, nullable=False)
enabled = db.Column(db.Boolean, default=True)
timeout_duration = db.Column(db.Integer, default=60) # durée du timeout en secondes
created_at = db.Column(db.DateTime, default=datetime.utcnow)
class PatreonPost(db.Model):
__tablename__ = 'patreon_post'
guid = db.Column(db.String(512), primary_key=True)
title = db.Column(db.String(512))
link = db.Column(db.String(1024))
description = db.Column(db.Text)
published_at = db.Column(db.String(64))
notified = db.Column(db.Boolean, default=False)
class ModShoutboxMessage(db.Model):
__tablename__ = 'mod_shoutbox_message'
id = db.Column(db.Integer, primary_key=True)
author = db.Column(db.String(64), nullable=False)
message = db.Column(db.String(500), nullable=False)
created_at = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)