update update

This commit is contained in:
gpatruno
2026-04-28 21:06:26 +02:00
parent 7b2135bfed
commit b4254c9e06
28 changed files with 2032 additions and 547 deletions
+171 -27
View File
@@ -31,6 +31,9 @@
<a class="nav-link navbar-sitemap-link" data-main-tab="interaction-tab" href="#" onclick="activateMainTab('interaction-tab'); return false;">
<i class="fas fa-at me-1"></i>Interaction chat
</a>
<a class="nav-link navbar-sitemap-link" data-main-tab="clips-tab" href="#" onclick="activateMainTab('clips-tab'); return false;">
<i class="fas fa-film me-1"></i>Clips
</a>
<a class="nav-link navbar-sitemap-link" data-main-tab="settings-tab" href="#" onclick="activateMainTab('settings-tab'); return false;">
<i class="fas fa-sliders-h me-1"></i>Paramètres
</a>
@@ -75,6 +78,11 @@
<i class="fas fa-at me-2"></i>Interaction chat
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="clips-tab" data-bs-toggle="tab" data-bs-target="#clips" type="button">
<i class="fas fa-film me-2"></i>Clips
</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="settings-tab" data-bs-toggle="tab" data-bs-target="#settings" type="button">
<i class="fas fa-sliders-h me-2"></i>Paramètres
@@ -196,21 +204,6 @@
</div>
</div>
<div class="col-md-6 col-xl-4">
<div class="d-flex justify-content-between align-items-center">
<div>
<div class="fw-semibold">Envoi Messages Chat</div>
<div class="small text-muted">Interrupteur global: autorise/bloque tout envoi sur Twitch.</div>
</div>
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="chatMessageToggle" onchange="toggleChatMessage()">
</div>
</div>
<div class="mt-2">
<small class="text-muted" id="chatMessageStatus">Désactivé</small>
</div>
</div>
<div class="col-md-6 col-xl-6">
<div class="d-flex justify-content-between align-items-center">
<div>
@@ -308,7 +301,12 @@
<div class="col-md-6">
<div class="card bg-secondary">
<div class="card-header">
<h5><i class="fas fa-microphone me-2"></i>Dernier Texte Détecté</h5>
<div class="d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="fas fa-microphone me-2"></i>Dernier Texte Détecté</h5>
<select class="form-select form-select-sm" id="subtitles-flux-select" style="max-width: 220px;" onchange="onSubtitlesFluxChange()">
<option value="-1">Flux…</option>
</select>
</div>
</div>
<div class="card-body">
<div class="alert alert-warning" id="last-subtitle">
@@ -337,8 +335,11 @@
</div>
<div class="col-md-6">
<div class="card bg-secondary">
<div class="card-header">
<h5><i class="fas fa-list me-2"></i>Historique des Sous-titres</h5>
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="fas fa-list me-2"></i>Historique des Sous-titres</h5>
<button class="btn btn-outline-light btn-sm" onclick="refreshSubtitlesAll()">
<i class="fas fa-sync me-1"></i>Rafraîchir
</button>
</div>
<div class="card-body">
<div id="subtitles-history" class="subtitle-history">
@@ -348,6 +349,59 @@
</div>
</div>
</div>
<div class="row mt-3 g-3">
<div class="col-md-7">
<div class="card bg-secondary">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="fas fa-bolt me-2"></i>Règles (sous-titres → actions)</h5>
<div class="d-flex gap-2">
<button class="btn btn-outline-light btn-sm" onclick="refreshSubtitleRules()">
<i class="fas fa-sync me-1"></i>Recharger
</button>
<button class="btn btn-success btn-sm" onclick="saveSubtitleRules()">
<i class="fas fa-save me-1"></i>Sauvegarder
</button>
</div>
</div>
<div class="card-body">
<div class="row g-3">
<div class="col-md-4">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="subtitle-rules-enabled">
<label class="form-check-label" for="subtitle-rules-enabled">Actif</label>
</div>
</div>
</div>
<hr class="border-secondary my-3">
<div class="d-flex justify-content-between align-items-center mb-2">
<h6 class="mb-0"><i class="fas fa-list me-2"></i>Règles</h6>
<button class="btn btn-primary btn-sm" onclick="addSubtitleRule()">
<i class="fas fa-plus me-1"></i>Ajouter règle
</button>
</div>
<div id="subtitle-rules" class="d-flex flex-column gap-2"></div>
<div class="form-text text-muted mt-2">
Déclenche une action quand un sous-titre contient un mot/texte.
</div>
</div>
</div>
</div>
<div class="col-md-5">
<div class="card bg-secondary">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="fas fa-clipboard-list me-2"></i>Logs règles</h5>
<button class="btn btn-outline-light btn-sm" onclick="refreshSubtitleRulesLog()">
<i class="fas fa-sync me-1"></i>Rafraîchir
</button>
</div>
<div class="card-body">
<div id="subtitle-rules-log" class="subtitle-history">
<div class="text-muted text-center">Aucun log</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Interaction Chat Tab -->
@@ -377,8 +431,8 @@
<div class="col-md-4">
<label class="form-label small text-muted" for="interaction-mode">Mode</label>
<select class="form-select form-select-sm" id="interaction-mode">
<option value="predefined">Réponses préenregistrées (défaut)</option>
<option value="tgpt">TGPT</option>
<option value="predefined">Réponses préenregistrées</option>
<option value="tgpt">TGPT (IA)</option>
</select>
</div>
<div class="col-md-4">
@@ -387,13 +441,7 @@
</div>
</div>
<div class="row g-3 mt-1">
<div class="col-md-4">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="interaction-tgpt-enabled">
<label class="form-check-label" for="interaction-tgpt-enabled">TGPT activé</label>
</div>
</div>
<div class="row g-3 mt-1" id="interaction-tgpt-settings">
<div class="col-md-5">
<label class="form-label small text-muted" for="interaction-tgpt-preprompt">Préprompt TGPT (global)</label>
<textarea class="form-control" id="interaction-tgpt-preprompt" rows="2" placeholder="Ex: Réponds brièvement en français."></textarea>
@@ -457,6 +505,86 @@
</div>
</div>
<!-- Clips Tab -->
<div class="tab-pane fade" id="clips" role="tabpanel">
<div class="row g-3">
<div class="col-lg-7">
<div class="card bg-secondary">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="fas fa-film me-2"></i>Créer un clip</h5>
<button class="btn btn-outline-light btn-sm" onclick="prefillClipChannelFromActiveFlux()" title="Utiliser le flux actif">
<i class="fas fa-wand-magic-sparkles me-1"></i>Auto
</button>
</div>
<div class="card-body">
<div class="row g-3">
<div class="col-md-6">
<label class="form-label small text-muted" for="clips-user-select">Utilisateur (token)</label>
<select class="form-select form-select-sm user-selector" id="clips-user-select">
<option value="-1">Sélectionner un utilisateur...</option>
</select>
<div class="form-text text-muted">Le token doit avoir le scope <code>clips:edit</code>.</div>
</div>
<div class="col-md-6">
<label class="form-label small text-muted" for="clips-channel-login">Chaîne Twitch (login)</label>
<input class="form-control form-control-sm" id="clips-channel-login" type="text" placeholder="ex: exoticnaturees">
<div class="form-text text-muted">Entrez le login sans URL. Le @ est accepté.</div>
</div>
<div class="col-md-6">
<div class="form-check form-switch mt-4">
<input class="form-check-input" type="checkbox" id="clips-has-delay">
<label class="form-check-label" for="clips-has-delay">has_delay</label>
</div>
<div class="form-text text-muted">À activer si le stream a un délai (anti-streamsniping).</div>
</div>
<div class="col-12 d-flex gap-2">
<button class="btn btn-success" onclick="createClip()">
<i class="fas fa-scissors me-2"></i>Créer le clip
</button>
<button class="btn btn-outline-light" onclick="clearClipResult()">
<i class="fas fa-eraser me-2"></i>Effacer
</button>
</div>
</div>
<hr class="border-secondary my-3">
<div id="clips-result" class="d-none">
<div class="alert alert-info mb-2">
<div class="fw-semibold mb-1">Résultat</div>
<div class="small">
<div>Clip: <a id="clips-public-url" href="#" target="_blank" rel="noopener noreferrer"></a></div>
<div>Edit: <a id="clips-edit-url" href="#" target="_blank" rel="noopener noreferrer"></a></div>
<div class="text-muted mt-1">ID: <span id="clips-id"></span></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-5">
<div class="card bg-secondary">
<div class="card-header">
<h5 class="mb-0"><i class="fas fa-gears me-2"></i>Automatisation (futur)</h5>
</div>
<div class="card-body">
<div class="small text-muted">
Une base est prête côté API pour brancher une automatisation (ex: clip sur mot-clé, intervalle, événement).
Pour linstant, aucune boucle nest lancée automatiquement.
</div>
<div class="mt-3">
<button class="btn btn-outline-light btn-sm" onclick="checkClipAutomationStatus()">
<i class="fas fa-circle-info me-1"></i>Statut
</button>
<div class="mt-2 small text-muted" id="clips-automation-status"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Settings Tab -->
<div class="tab-pane fade" id="settings" role="tabpanel">
<div class="card bg-secondary">
@@ -542,6 +670,22 @@
Enregistrer l'audio du stream
</label>
</div>
<div class="form-check mt-2">
<input class="form-check-input" type="checkbox" id="send-messages" checked>
<label class="form-check-label" for="send-messages">
Autoriser lenvoi de messages sur ce stream
</label>
<div class="form-text text-muted">Contrôle par flux.</div>
</div>
<div class="form-check mt-2">
<input class="form-check-input" type="checkbox" id="enable-ia" checked>
<label class="form-check-label" for="enable-ia">
Activer génération TGPT (IA) à partir des sous-titres
</label>
<div class="form-text text-muted">
Si désactivé: pas de génération TGPT et pas denvoi automatique des messages générés.
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Annuler</button>