message achoix

This commit is contained in:
gpatruno
2025-07-20 03:33:48 +02:00
parent 9725cd7a7c
commit 75d9a65cc4
15 changed files with 272 additions and 47 deletions
+6 -6
View File
@@ -1,12 +1,12 @@
[ [
{ {
"tw_acc_pseudo": "exoticnaturees", "tw_acc_pseudo": "ForFunIlluminaty",
"tw_acc_token": "oauth:57ht6937k5du8bex534eetd1epydvg", "tw_acc_token": "oauth:8ushh9h0qwywqznsulbdr66wt2xjht",
"charactere": "Kappa" "charactere": ")"
}, },
{ {
"tw_acc_pseudo": "ForFunIlluminaty", "tw_acc_pseudo": "SnowLunaSoft",
"tw_acc_token": "oauth:c5zoigy66klbfldh54h6kapv118mif", "tw_acc_token": "oauth:l348b8e7g7srjnc8trnxjqe2i2boq2",
"charactere": "🤖" "charactere": "Kappa"
} }
] ]
+1
Submodule debug_ia_clone added at bb743c5722
+4 -1
View File
@@ -1008,7 +1008,10 @@ class messageTwitch:
def send_message(self, Message_text): def send_message(self, Message_text):
try: try:
command = '-pseudo "'+self.tw_acc_pseudo+'" -token "'+self.tw_acc_token+'" -twitchname "'+self.channel_name+'" -message " '+self.charactere+' '+Message_text+'"' 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) 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)) sprint(self.script_name,"cyan",f"send message = "+str(message_tosend))
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+11
View File
@@ -1,6 +1,14 @@
import asyncio import asyncio
import argparse import argparse
import sys
import os
from urllib.parse import urlparse 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é. 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): 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é # Attendre un peu avant de se déconnecter pour s'assurer que le message est envoyé
await asyncio.sleep(2) await asyncio.sleep(2)
print("Déconnexion...") 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: except Exception as e:
print(f"Erreur lors de l'interaction avec Twitch: {type(e).__name__}, {e}") print(f"Erreur lors de l'interaction avec Twitch: {type(e).__name__}, {e}")
except AttributeError as e: except AttributeError as e:
+14
View File
@@ -8,6 +8,20 @@ import sys
import subprocess import subprocess
import argparse 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(): def check_dependencies():
"""Vérifier que les dépendances sont installées""" """Vérifier que les dépendances sont installées"""
try: try:
+59 -1
View File
@@ -735,5 +735,63 @@ body {
.user-status.testing { .user-status.testing {
background-color: var(--warning-color); 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);
} }
+116 -36
View File
@@ -327,12 +327,24 @@ async function savePrompts() {
// Envoi d'un message personnalisé // Envoi d'un message personnalisé
async function sendCustomMessage() { async function sendCustomMessage() {
const message = document.getElementById('custom-message').value.trim(); 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) { if (!message) {
showToast('Veuillez entrer un message', 'error'); showToast('Veuillez entrer un message', 'error');
return; 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 { try {
const response = await fetch(`${API_BASE}/api/send-message`, { const response = await fetch(`${API_BASE}/api/send-message`, {
method: 'POST', method: 'POST',
@@ -341,7 +353,8 @@ async function sendCustomMessage() {
}, },
body: JSON.stringify({ body: JSON.stringify({
message: message, message: message,
channel: 'default' channel: 'default',
user_id: userId
}) })
}); });
@@ -364,12 +377,19 @@ async function sendCustomMessage() {
async function sendNextMessage() { async function sendNextMessage() {
const nextMessageElement = document.getElementById('next-message'); const nextMessageElement = document.getElementById('next-message');
const message = nextMessageElement.textContent.trim(); const message = nextMessageElement.textContent.trim();
const userId = parseInt(document.getElementById('custom-message-user').value);
if (message === 'Aucun message en attente') { if (message === 'Aucun message en attente') {
showToast('Aucun message à envoyer', 'warning'); showToast('Aucun message à envoyer', 'warning');
return; 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 { try {
const response = await fetch(`${API_BASE}/api/send-message`, { const response = await fetch(`${API_BASE}/api/send-message`, {
method: 'POST', method: 'POST',
@@ -378,7 +398,8 @@ async function sendNextMessage() {
}, },
body: JSON.stringify({ body: JSON.stringify({
message: message, message: message,
channel: 'default' channel: 'default',
user_id: userId
}) })
}); });
@@ -399,6 +420,14 @@ async function sendNextMessage() {
// Envoi de la dernière génération // Envoi de la dernière génération
async function sendLastGeneration() { 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 { try {
const response = await fetch(`${API_BASE}/api/generations`); const response = await fetch(`${API_BASE}/api/generations`);
const generations = await response.json(); const generations = await response.json();
@@ -418,7 +447,8 @@ async function sendLastGeneration() {
}, },
body: JSON.stringify({ body: JSON.stringify({
message: lastGeneration, message: lastGeneration,
channel: 'default' channel: 'default',
user_id: userId
}) })
}); });
@@ -839,8 +869,21 @@ function addSystemMessage(message) {
// Envoi d'un message via le chat // Envoi d'un message via le chat
async function sendChatMessage() { async function sendChatMessage() {
const message = chatInput.value.trim(); 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; 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 // Trouver le premier flux actif
const activeFlux = bot_controller.flux_list.find(flux => flux.active); const activeFlux = bot_controller.flux_list.find(flux => flux.active);
if (!activeFlux) { if (!activeFlux) {
@@ -855,7 +898,8 @@ async function sendChatMessage() {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
}, },
body: JSON.stringify({ 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`); const response = await fetch(`${API_BASE}/api/config/users`);
currentUsers = await response.json(); currentUsers = await response.json();
renderUsers(); renderUsers();
updateUserSelectors(); // Mettre à jour les sélecteurs après le chargement
} catch (error) { } catch (error) {
console.error('Erreur lors du chargement des utilisateurs:', error); console.error('Erreur lors du chargement des utilisateurs:', error);
} }
@@ -1010,6 +1055,53 @@ function renderUsers() {
</div> </div>
</div> </div>
`).join(''); `).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 = '<option value="-1">Sélectionner un utilisateur...</option>';
// 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 // Ouvrir le modal pour ajouter un utilisateur
@@ -1054,47 +1146,34 @@ async function saveUser() {
} }
try { try {
let response; const url = userId ? `${API_BASE}/api/config/users/${userId}` : `${API_BASE}/api/config/users`;
if (userId === '') { const method = userId ? 'PUT' : 'POST';
// Ajouter un nouvel utilisateur
response = await fetch(`${API_BASE}/api/config/users`, { const response = await fetch(url, {
method: 'POST', method: method,
headers: { headers: {
'Content-Type': 'application/json' 'Content-Type': 'application/json'
}, },
body: JSON.stringify({ body: JSON.stringify({
tw_acc_pseudo: pseudo, tw_acc_pseudo: pseudo,
tw_acc_token: token, tw_acc_token: token,
charactere: charactere 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 result = await response.json(); const result = await response.json();
if (result.success) { if (result.success) {
showToast(userId === '' ? 'Utilisateur ajouté' : 'Utilisateur modifié', 'success'); showToast(userId ? 'Utilisateur modifié' : 'Utilisateur ajouté', 'success');
bootstrap.Modal.getInstance(document.getElementById('addUserModal')).hide(); bootstrap.Modal.getInstance(document.getElementById('addUserModal')).hide();
await loadUsers(); await loadUsers();
updateUserSelectors(); // Mettre à jour les sélecteurs
} else { } else {
showToast(result.error || 'Erreur lors de la sauvegarde', 'error'); showToast(result.error || 'Erreur lors de la sauvegarde', 'error');
} }
} catch (error) { } catch (error) {
console.error('Erreur:', 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(); const result = await response.json();
if (result.success) { if (result.success) {
showToast('Utilisateur supprimé avec succès', 'success'); showToast('Utilisateur supprimé', 'success');
await loadUsers(); await loadUsers();
updateUserSelectors(); // Mettre à jour les sélecteurs
} else { } else {
showToast(result.error || 'Erreur lors de la suppression', 'error'); showToast(result.error || 'Erreur lors de la suppression', 'error');
} }
} catch (error) { } catch (error) {
console.error('Erreur:', error); console.error('Erreur:', error);
showToast('Erreur lors de la suppression de l\'utilisateur', 'error'); showToast('Erreur lors de la suppression', 'error');
} }
} }
+12
View File
@@ -140,6 +140,12 @@
<h5><i class="fas fa-keyboard me-2"></i>Envoyer Message Personnalisé</h5> <h5><i class="fas fa-keyboard me-2"></i>Envoyer Message Personnalisé</h5>
</div> </div>
<div class="card-body"> <div class="card-body">
<div class="mb-3">
<label for="custom-message-user" class="form-label">Utilisateur</label>
<select class="form-select user-selector" id="custom-message-user">
<option value="-1">Sélectionner un utilisateur...</option>
</select>
</div>
<div class="mb-3"> <div class="mb-3">
<textarea class="form-control" id="custom-message" rows="3" placeholder="Tapez votre message ici..."></textarea> <textarea class="form-control" id="custom-message" rows="3" placeholder="Tapez votre message ici..."></textarea>
</div> </div>
@@ -259,6 +265,12 @@
</div> </div>
</div> </div>
<div class="card-footer"> <div class="card-footer">
<div class="mb-2">
<label for="chat-user-select" class="form-label small">Utilisateur</label>
<select class="form-select form-select-sm user-selector" id="chat-user-select">
<option value="-1">Sélectionner un utilisateur...</option>
</select>
</div>
<div class="input-group"> <div class="input-group">
<input type="text" class="form-control" id="chat-input" placeholder="Tapez un message..." disabled> <input type="text" class="form-control" id="chat-input" placeholder="Tapez un message..." disabled>
<button class="btn btn-primary" type="button" onclick="sendChatMessage()" disabled> <button class="btn btn-primary" type="button" onclick="sendChatMessage()" disabled>
+38
View File
@@ -0,0 +1,38 @@
#!/usr/bin/env python3
"""
Script de test pour vérifier l'envoi de messages
"""
import sys
import os
# Ajouter le chemin vers les modules
sys.path.append('.')
from fonction.first_class import messageTwitch
def test_send_message():
"""Test de l'envoi de message"""
try:
# Créer une instance de messageTwitch
msg_bot = messageTwitch("config/user.json", "test_channel")
# Tester l'envoi d'un message
print("Test d'envoi de message...")
msg_bot.send_message("Test message from bot")
print("✓ Test réussi !")
except Exception as e:
print(f"✗ Erreur lors du test: {e}")
return False
return True
if __name__ == "__main__":
print("🧪 Test de l'envoi de messages")
print("=" * 40)
if test_send_message():
print("\n✅ Tous les tests sont passés !")
else:
print("\n❌ Certains tests ont échoué.")
+11 -3
View File
@@ -7,6 +7,11 @@ import time
from datetime import datetime from datetime import datetime
import sys import sys
# 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)
# Import des classes du bot # Import des classes du bot
sys.path.append('.') sys.path.append('.')
from fonction.first_class import RecordTwitch, Subtitle_translation, IA_generator, messageTwitch, TwitchChatBot, storage from fonction.first_class import RecordTwitch, Subtitle_translation, IA_generator, messageTwitch, TwitchChatBot, storage
@@ -335,6 +340,7 @@ def send_message():
data = request.json data = request.json
message = data.get('message') message = data.get('message')
channel = data.get('channel', 'default') channel = data.get('channel', 'default')
user_id = data.get('user_id', 0) # Nouveau paramètre pour choisir l'utilisateur
if not message: if not message:
return jsonify({'error': 'Message requis'}), 400 return jsonify({'error': 'Message requis'}), 400
@@ -342,7 +348,8 @@ def send_message():
# Trouver le bot de message pour ce canal # Trouver le bot de message pour ce canal
try: try:
msg_bot = messageTwitch("config/user.json", channel) msg_bot = messageTwitch("config/user.json", channel)
msg_bot.send_message(message) # Utiliser send_message_user au lieu de send_message pour spécifier l'utilisateur
msg_bot.send_message_user(user_id, message)
return jsonify({'success': True}) return jsonify({'success': True})
except Exception as e: except Exception as e:
return jsonify({'error': str(e)}), 500 return jsonify({'error': str(e)}), 500
@@ -393,6 +400,7 @@ def send_chat_message(flux_id):
"""Envoyer un message dans le chat d'un flux spécifique""" """Envoyer un message dans le chat d'un flux spécifique"""
data = request.json data = request.json
message = data.get('message', '') message = data.get('message', '')
user_id = data.get('user_id', 0) # Nouveau paramètre pour choisir l'utilisateur
if not message: if not message:
return jsonify({'error': 'Message requis'}), 400 return jsonify({'error': 'Message requis'}), 400
@@ -408,9 +416,9 @@ def send_chat_message(flux_id):
if not flux: if not flux:
return jsonify({'error': 'Flux non trouvé'}), 404 return jsonify({'error': 'Flux non trouvé'}), 404
# Envoyer le message # Envoyer le message avec l'utilisateur spécifié
msg_bot = messageTwitch("config/user.json", flux['twitchname']) msg_bot = messageTwitch("config/user.json", flux['twitchname'])
msg_bot.send_message(message) msg_bot.send_message_user(user_id, message)
return jsonify({'success': True}) return jsonify({'success': True})