diff --git a/config/user.json b/config/user.json index 5433996..3a6de5b 100644 --- a/config/user.json +++ b/config/user.json @@ -1,12 +1,12 @@ [ { - "tw_acc_pseudo": "exoticnaturees", - "tw_acc_token": "oauth:57ht6937k5du8bex534eetd1epydvg", - "charactere": "Kappa" + "tw_acc_pseudo": "ForFunIlluminaty", + "tw_acc_token": "oauth:8ushh9h0qwywqznsulbdr66wt2xjht", + "charactere": ")" }, { - "tw_acc_pseudo": "ForFunIlluminaty", - "tw_acc_token": "oauth:c5zoigy66klbfldh54h6kapv118mif", - "charactere": "🤖" + "tw_acc_pseudo": "SnowLunaSoft", + "tw_acc_token": "oauth:l348b8e7g7srjnc8trnxjqe2i2boq2", + "charactere": "Kappa" } ] \ No newline at end of file diff --git a/debug_ia_clone b/debug_ia_clone new file mode 160000 index 0000000..bb743c5 --- /dev/null +++ b/debug_ia_clone @@ -0,0 +1 @@ +Subproject commit bb743c57222c7141b02b845f3b9b7e4b963449d3 diff --git a/fonction/first_class.py b/fonction/first_class.py index f744715..e957a22 100644 --- a/fonction/first_class.py +++ b/fonction/first_class.py @@ -1008,7 +1008,10 @@ class messageTwitch: def send_message(self, Message_text): try: command = '-pseudo "'+self.tw_acc_pseudo+'" -token "'+self.tw_acc_token+'" -twitchname "'+self.channel_name+'" -message " '+self.charactere+' '+Message_text+'"' - message_tosend = 'python send_message.py '+ str(command) + + # Utiliser le Python de l'environnement virtuel + python_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'env', 'bin', 'python') + message_tosend = python_path + ' send_message.py '+ str(command) debug_print("d", f"send message = "+str(message_tosend), self.type_debug, self.script_name) sprint(self.script_name,"cyan",f"send message = "+str(message_tosend)) diff --git a/record/2025-07-20_000.mp3 b/record/2025-07-20_000.mp3 index 03e5a60..9b81fb7 100644 Binary files a/record/2025-07-20_000.mp3 and b/record/2025-07-20_000.mp3 differ diff --git a/record/2025-07-20_001.mp3 b/record/2025-07-20_001.mp3 new file mode 100644 index 0000000..23ea4c8 Binary files /dev/null and b/record/2025-07-20_001.mp3 differ diff --git a/record/2025-07-20_002.mp3 b/record/2025-07-20_002.mp3 new file mode 100644 index 0000000..daa9c38 Binary files /dev/null and b/record/2025-07-20_002.mp3 differ diff --git a/record/2025-07-20_003.mp3 b/record/2025-07-20_003.mp3 new file mode 100644 index 0000000..5890d02 Binary files /dev/null and b/record/2025-07-20_003.mp3 differ diff --git a/record/2025-07-20_004.mp3 b/record/2025-07-20_004.mp3 new file mode 100644 index 0000000..10675dc Binary files /dev/null and b/record/2025-07-20_004.mp3 differ diff --git a/send_message.py b/send_message.py index 487c49b..b2cb1fc 100644 --- a/send_message.py +++ b/send_message.py @@ -1,6 +1,14 @@ import asyncio import argparse +import sys +import os from urllib.parse import urlparse + +# Ajouter le chemin de l'environnement virtuel +venv_path = os.path.join(os.path.dirname(__file__), 'env', 'lib', 'python3.10', 'site-packages') +if venv_path not in sys.path: + sys.path.insert(0, venv_path) + from pytmi import Client # Assurez-vous que c'est le nom correct de votre module et qu'il est correctement installé. async def send_message_to_twitch_stream(pseudo, token, stream_url, message): @@ -20,6 +28,9 @@ async def send_message_to_twitch_stream(pseudo, token, stream_url, message): # Attendre un peu avant de se déconnecter pour s'assurer que le message est envoyé await asyncio.sleep(2) print("Déconnexion...") + except AssertionError as e: + print(f"Erreur d'assertion (client déjà connecté ou paramètres invalides): {e}") + print("Vérifiez que le token et le pseudo sont corrects") except Exception as e: print(f"Erreur lors de l'interaction avec Twitch: {type(e).__name__}, {e}") except AttributeError as e: diff --git a/start_web_interface.py b/start_web_interface.py index 8d6bda8..54b1492 100755 --- a/start_web_interface.py +++ b/start_web_interface.py @@ -8,6 +8,20 @@ import sys import subprocess import argparse +# Configurer l'environnement Python pour l'interface web +def setup_environment(): + """Configurer l'environnement Python""" + # Ajouter le chemin de l'environnement virtuel au PYTHONPATH + venv_path = os.path.join(os.path.dirname(__file__), 'env', 'lib', 'python3.10', 'site-packages') + if venv_path not in sys.path: + sys.path.insert(0, venv_path) + print(f"✓ Environnement Python configuré: {venv_path}") + + # Ajouter le répertoire courant au PYTHONPATH + current_dir = os.path.dirname(__file__) + if current_dir not in sys.path: + sys.path.insert(0, current_dir) + def check_dependencies(): """Vérifier que les dépendances sont installées""" try: diff --git a/static/css/style.css b/static/css/style.css index 7f00a6a..ed09929 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -735,5 +735,63 @@ body { .user-status.testing { background-color: var(--warning-color); - animation: pulse 1s infinite; +} + +/* Sélecteurs d'utilisateurs */ +.user-selector { + margin-bottom: 1rem; +} + +.user-selector .form-label { + font-size: 0.875rem; + font-weight: 500; + color: var(--text-secondary); + margin-bottom: 0.5rem; +} + +.user-selector .form-select { + background-color: var(--secondary-bg); + border: 1px solid var(--border-color); + color: var(--text-primary); + border-radius: 6px; + font-size: 0.875rem; + transition: all 0.3s ease; +} + +.user-selector .form-select:focus { + background-color: var(--secondary-bg); + border-color: var(--accent-color); + color: var(--text-primary); + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.user-selector .form-select option { + background-color: var(--secondary-bg); + color: var(--text-primary); + padding: 0.5rem; +} + +/* Amélioration des sélecteurs dans le chat */ +.chat-container .form-select { + background-color: var(--tertiary-bg); + border: 1px solid var(--border-color); + color: var(--text-primary); + font-size: 0.8rem; + padding: 0.375rem 0.75rem; +} + +.chat-container .form-select:focus { + background-color: var(--tertiary-bg); + border-color: var(--accent-color); + color: var(--text-primary); +} + +/* Animation pour les sélecteurs */ +.form-select { + transition: all 0.3s ease; +} + +.form-select:hover { + border-color: var(--accent-color); + transform: translateY(-1px); } \ No newline at end of file diff --git a/static/js/app.js b/static/js/app.js index a1d9c51..40a63ea 100644 --- a/static/js/app.js +++ b/static/js/app.js @@ -327,12 +327,24 @@ async function savePrompts() { // Envoi d'un message personnalisé async function sendCustomMessage() { const message = document.getElementById('custom-message').value.trim(); + const userId = parseInt(document.getElementById('custom-message-user').value); + + console.log('Debug - Message:', message); + console.log('Debug - User ID:', userId); + console.log('Debug - User ID type:', typeof userId); + console.log('Debug - Selector value:', document.getElementById('custom-message-user').value); if (!message) { showToast('Veuillez entrer un message', 'error'); return; } + // Vérifier si l'utilisateur est valide (pas NaN et dans la plage des utilisateurs) + if (isNaN(userId) || userId < 0 || userId >= currentUsers.length) { + showToast('Veuillez sélectionner un utilisateur valide', 'error'); + return; + } + try { const response = await fetch(`${API_BASE}/api/send-message`, { method: 'POST', @@ -341,7 +353,8 @@ async function sendCustomMessage() { }, body: JSON.stringify({ message: message, - channel: 'default' + channel: 'default', + user_id: userId }) }); @@ -364,12 +377,19 @@ async function sendCustomMessage() { async function sendNextMessage() { const nextMessageElement = document.getElementById('next-message'); const message = nextMessageElement.textContent.trim(); + const userId = parseInt(document.getElementById('custom-message-user').value); if (message === 'Aucun message en attente') { showToast('Aucun message à envoyer', 'warning'); return; } + // Vérifier si l'utilisateur est valide (pas NaN et dans la plage des utilisateurs) + if (isNaN(userId) || userId < 0 || userId >= currentUsers.length) { + showToast('Veuillez sélectionner un utilisateur valide', 'error'); + return; + } + try { const response = await fetch(`${API_BASE}/api/send-message`, { method: 'POST', @@ -378,7 +398,8 @@ async function sendNextMessage() { }, body: JSON.stringify({ message: message, - channel: 'default' + channel: 'default', + user_id: userId }) }); @@ -399,6 +420,14 @@ async function sendNextMessage() { // Envoi de la dernière génération async function sendLastGeneration() { + const userId = parseInt(document.getElementById('custom-message-user').value); + + // Vérifier si l'utilisateur est valide (pas NaN et dans la plage des utilisateurs) + if (isNaN(userId) || userId < 0 || userId >= currentUsers.length) { + showToast('Veuillez sélectionner un utilisateur valide', 'error'); + return; + } + try { const response = await fetch(`${API_BASE}/api/generations`); const generations = await response.json(); @@ -418,7 +447,8 @@ async function sendLastGeneration() { }, body: JSON.stringify({ message: lastGeneration, - channel: 'default' + channel: 'default', + user_id: userId }) }); @@ -839,8 +869,21 @@ function addSystemMessage(message) { // Envoi d'un message via le chat async function sendChatMessage() { const message = chatInput.value.trim(); + const userId = parseInt(document.getElementById('chat-user-select').value); + + console.log('Debug - Chat Message:', message); + console.log('Debug - Chat User ID:', userId); + console.log('Debug - Chat User ID type:', typeof userId); + console.log('Debug - Chat Selector value:', document.getElementById('chat-user-select').value); + if (!message) return; + // Vérifier si l'utilisateur est valide (pas NaN et dans la plage des utilisateurs) + if (isNaN(userId) || userId < 0 || userId >= currentUsers.length) { + showToast('Veuillez sélectionner un utilisateur valide', 'error'); + return; + } + // Trouver le premier flux actif const activeFlux = bot_controller.flux_list.find(flux => flux.active); if (!activeFlux) { @@ -855,7 +898,8 @@ async function sendChatMessage() { 'Content-Type': 'application/json' }, body: JSON.stringify({ - message: message + message: message, + user_id: userId }) }); @@ -963,6 +1007,7 @@ async function loadUsers() { const response = await fetch(`${API_BASE}/api/config/users`); currentUsers = await response.json(); renderUsers(); + updateUserSelectors(); // Mettre à jour les sélecteurs après le chargement } catch (error) { console.error('Erreur lors du chargement des utilisateurs:', error); } @@ -1010,6 +1055,53 @@ function renderUsers() { `).join(''); + + // Mettre à jour les sélecteurs d'utilisateurs + updateUserSelectors(); +} + +// Mettre à jour les sélecteurs d'utilisateurs dans l'interface +function updateUserSelectors() { + console.log('Debug - updateUserSelectors called'); + console.log('Debug - currentUsers:', currentUsers); + + const selectors = [ + 'custom-message-user', + 'chat-user-select' + ]; + + selectors.forEach(selectorId => { + const selector = document.getElementById(selectorId); + if (selector) { + console.log(`Debug - Updating selector: ${selectorId}`); + + // Sauvegarder la sélection actuelle + const currentValue = selector.value; + console.log(`Debug - Current value: ${currentValue}`); + + // Vider le sélecteur avec une valeur par défaut différente + selector.innerHTML = ''; + + // Ajouter les utilisateurs + currentUsers.forEach((user, index) => { + const option = document.createElement('option'); + option.value = index.toString(); // Convertir en chaîne + option.textContent = `${user.tw_acc_pseudo} ${user.charactere}`; + selector.appendChild(option); + console.log(`Debug - Added option: value=${index.toString()}, text=${user.tw_acc_pseudo} ${user.charactere}`); + }); + + // Restaurer la sélection si elle était valide + if (currentValue && currentValue !== '-1' && currentValue !== '0') { + selector.value = currentValue; + console.log(`Debug - Restored value: ${currentValue}`); + } + } else { + console.log(`Debug - Selector not found: ${selectorId}`); + } + }); + + console.log('Debug - Selectors updated'); } // Ouvrir le modal pour ajouter un utilisateur @@ -1054,47 +1146,34 @@ async function saveUser() { } try { - let response; - if (userId === '') { - // Ajouter un nouvel utilisateur - response = await fetch(`${API_BASE}/api/config/users`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - tw_acc_pseudo: pseudo, - tw_acc_token: token, - charactere: charactere - }) - }); - } else { - // Modifier un utilisateur existant - response = await fetch(`${API_BASE}/api/config/users/${userId}`, { - method: 'PUT', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - tw_acc_pseudo: pseudo, - tw_acc_token: token, - charactere: charactere - }) - }); - } + const url = userId ? `${API_BASE}/api/config/users/${userId}` : `${API_BASE}/api/config/users`; + const method = userId ? 'PUT' : 'POST'; + + const response = await fetch(url, { + method: method, + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + tw_acc_pseudo: pseudo, + tw_acc_token: token, + charactere: charactere + }) + }); const result = await response.json(); if (result.success) { - showToast(userId === '' ? 'Utilisateur ajouté' : 'Utilisateur modifié', 'success'); + showToast(userId ? 'Utilisateur modifié' : 'Utilisateur ajouté', 'success'); bootstrap.Modal.getInstance(document.getElementById('addUserModal')).hide(); await loadUsers(); + updateUserSelectors(); // Mettre à jour les sélecteurs } else { showToast(result.error || 'Erreur lors de la sauvegarde', 'error'); } } catch (error) { console.error('Erreur:', error); - showToast('Erreur lors de la sauvegarde de l\'utilisateur', 'error'); + showToast('Erreur lors de la sauvegarde', 'error'); } } @@ -1112,13 +1191,14 @@ async function deleteUser(userId) { const result = await response.json(); if (result.success) { - showToast('Utilisateur supprimé avec succès', 'success'); + showToast('Utilisateur supprimé', 'success'); await loadUsers(); + updateUserSelectors(); // Mettre à jour les sélecteurs } else { showToast(result.error || 'Erreur lors de la suppression', 'error'); } } catch (error) { console.error('Erreur:', error); - showToast('Erreur lors de la suppression de l\'utilisateur', 'error'); + showToast('Erreur lors de la suppression', 'error'); } } \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index 727949b..fe6f1de 100644 --- a/templates/index.html +++ b/templates/index.html @@ -140,6 +140,12 @@
Envoyer Message Personnalisé
+
+ + +
@@ -259,6 +265,12 @@