This commit is contained in:
Foufure13
2025-04-07 13:26:43 +02:00
parent fc45df9799
commit 91c8ac5a3a
16 changed files with 169 additions and 133 deletions
Binary file not shown.
Binary file not shown.
+48 -15
View File
@@ -419,27 +419,36 @@ class TwitchChatBot:
self.channel = channel.lower()
self.messages: List[ChatMessage] = []
self.uri = "wss://irc-ws.chat.twitch.tv:443"
self.is_running = True
self.script_name = "TwitchChat"
self.chat_thread = None
self.loop = None
def get_last_message(self) -> Optional[ChatMessage]:
return self.messages[-1] if self.messages else None
def get_all_messages(self) -> List[ChatMessage]:
return self.messages
def stop(self):
sprint(self.script_name, "red", f"Arrêt de la connexion au chat")
self.is_running = False
if self.loop and self.loop.is_running():
self.loop.call_soon_threadsafe(self.loop.stop)
if self.chat_thread and self.chat_thread.is_alive():
self.chat_thread.join(timeout=2) # Attendre max 2 secondes
sprint(self.script_name, "red", "Connexion au chat arrêtée.")
else:
sprint(self.script_name, "yellow", f"Connexion au chat déjà arrêtée")
async def connect_to_twitch_chat(self):
while self.is_running:
try:
async with websockets.connect(self.uri) as websocket:
# Se connecter en tant qu'utilisateur anonyme
await websocket.send("CAP REQ :twitch.tv/tags twitch.tv/commands")
await websocket.send(f"NICK justinfan{random.randint(10000,99999)}")
await websocket.send(f"JOIN #{self.channel}")
print(f"Connecté au chat de #{self.channel}")
sprint(self.script_name, "green", f"Connecté au chat de #{self.channel}")
while True:
while self.is_running:
try:
message = await websocket.recv()
if "PRIVMSG" in message:
# Extraction des données du message
user = message.split("!", 1)[0][1:]
if "display-name=" in user:
user = user.split("display-name=")[1].split(";")[0]
@@ -449,21 +458,45 @@ class TwitchChatBot:
msg = message.split("PRIVMSG", 1)[1].split(":", 1)[1]
timestamp = datetime.now()
# Création et stockage du message
chat_message = ChatMessage(timestamp=timestamp, username=user, content=msg)
self.messages.append(chat_message)
# Affichage formaté
time_str = timestamp.strftime("%H:%M:%S.%f")[:-3]
print(f"[\033[95m{time_str}\033[0m] \033[94m{user}\033[0m: \033[92m{msg}\033[0m")
sprint(self.script_name, "magenta", f"[{time_str}] {user}: {msg}")
except websockets.exceptions.ConnectionClosed:
print("\033[91m⚠️ Connexion fermée, reconnexion en cours...\033[0m")
sprint(self.script_name, "yellow", "⚠️ Connexion fermée, tentative de reconnexion...")
break
def start(self):
asyncio.run(self.connect_to_twitch_chat())
except Exception as e:
sprint(self.script_name, "red", f"Erreur de connexion: {str(e)}")
if self.is_running:
await asyncio.sleep(5)
def run_chat_loop(self):
try:
self.loop = asyncio.new_event_loop()
asyncio.set_event_loop(self.loop)
self.loop.run_until_complete(self.connect_to_twitch_chat())
except Exception as e:
if self.is_running: # Ignorer les erreurs pendant l'arrêt
sprint(self.script_name, "red", f"Erreur dans la boucle du chat: {str(e)}")
finally:
try:
if self.loop and self.loop.is_running():
self.loop.close()
except:
pass
def start_background(self):
"""Lance la connexion au chat dans un thread séparé"""
self.is_running = True
self.chat_thread = threading.Thread(target=self.run_chat_loop)
self.chat_thread.daemon = True
self.chat_thread.start()
self.chat_thread = threading.Thread(target=self.main_loop)
self.chat_thread.start() # Démarre dans un thread séparé
+11 -11
View File
@@ -192,20 +192,20 @@ if __name__ == '__main__':
recordTw.main()
#lancement d'enregistrement chat du stream
hprint("blue", "start loop TwitchChatBot")
bot = TwitchChatBot(args.twitchname)
bot.start()
# hprint("blue", "start loop TwitchChatBot")
# bot = TwitchChatBot(args.twitchname)
# bot.start_background()
# hprint("blue", "start loop Subtitle_translation")
# sb_translation = Subtitle_translation("../config/config.json")
# sb_translation.start_main_loop()
hprint("blue", "start loop Subtitle_translation")
sb_translation = Subtitle_translation("../config/config.json")
sb_translation.start_main_loop()
# hprint("blue", "start loop IA_generator")
# ask_text = IA_generator("../config/config.json")
# ask_text.start_main_loop()
hprint("blue", "start loop IA_generator")
ask_text = IA_generator("../config/config.json")
ask_text.start_main_loop()
# controluser = messageTwitch("../config/user.json",args.twitchname)
# controluser.start_loop_respond()
controluser = messageTwitch("../config/user.json",args.twitchname)
controluser.start_loop_respond()
print_help()
listener_thread = threading.Thread(target=start_keyboard_listener)
-1
View File
@@ -1 +0,0 @@
{"text": " Brian, on peut en reparler dans une minute ? ...de le faire. En pla\u00e7ant les balises \u00e9lectroniques sur la voiture, il faut simplement acc\u00e9der au v\u00e9hicule, faire sauter le r\u00e9servoir... ...Fischer avait mis un autocollant sur le pare-choc arri\u00e8re de sa voiture et quelqu'un est venu recoller exactement le m\u00eame autocollant sur celui d\u00e9j\u00e0 existant, donc je crois que c'est l\u00e0 que la balise a mis un autocollant sur le pare-choc arri\u00e8re de sa voiture et quelqu'un est venu recoller exactement le m\u00eame autocollant sur celui d\u00e9j\u00e0 existant, donc je crois que c'est l\u00e0 que la balise a mis un autocollant sur le pare-choc arri\u00e8re de sa voiture.", "segments": [{"id": 0, "seek": 0, "start": 0.88, "end": 3.0, "text": " Brian, on peut en reparler dans une minute ?", "tokens": [50409, 10765, 11, 322, 5977, 465, 33291, 1918, 2680, 2251, 3456, 2506, 50515], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 1, "seek": 0, "start": 3.0, "end": 5.38, "text": " ...de le faire. En pla\u00e7ant les balises \u00e9lectroniques sur la voiture,", "tokens": [50515, 1097, 1479, 476, 4865, 13, 2193, 15256, 1138, 394, 1512, 3119, 3598, 30996, 2044, 4911, 1022, 635, 38859, 11, 50634], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 2, "seek": 0, "start": 5.7, "end": 8.0, "text": " il faut simplement acc\u00e9der au v\u00e9hicule, faire sauter le r\u00e9servoir...", "tokens": [50650, 1930, 8487, 24208, 1317, 526, 1068, 1609, 49438, 2271, 11, 4865, 601, 20314, 476, 14415, 1978, 9043, 485, 50765], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 3, "seek": 0, "start": 8.52, "end": 11.48, "text": " ...Fischer avait mis un autocollant sur le pare-choc arri\u00e8re de sa voiture", "tokens": [50791, 1097, 37, 19674, 11853, 3346, 517, 45833, 1833, 394, 1022, 476, 7448, 12, 339, 905, 3399, 4212, 368, 601, 38859, 50939], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 4, "seek": 0, "start": 11.48, "end": 14.42, "text": " et quelqu'un est venu recoller exactement le m\u00eame autocollant", "tokens": [50939, 1030, 25283, 6, 409, 871, 6138, 84, 39495, 260, 38111, 476, 5698, 45833, 1833, 394, 51086], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 5, "seek": 0, "start": 14.42, "end": 18.56, "text": " sur celui d\u00e9j\u00e0 existant, donc je crois que c'est l\u00e0 que la balise a mis un autocollant", "tokens": [51086, 1022, 22829, 12027, 2514, 394, 11, 5926, 1506, 21724, 631, 269, 6, 377, 3684, 631, 635, 3119, 908, 257, 3346, 517, 45833, 1833, 394, 51293], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 6, "seek": 0, "start": 18.56, "end": 23.3, "text": " sur le pare-choc arri\u00e8re de sa voiture et quelqu'un est venu recoller exactement le m\u00eame autocollant", "tokens": [51293, 1022, 476, 7448, 12, 339, 905, 3399, 4212, 368, 601, 38859, 1030, 25283, 6, 409, 871, 6138, 84, 39495, 260, 38111, 476, 5698, 45833, 1833, 394, 51530], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 7, "seek": 0, "start": 23.3, "end": 27.36, "text": " sur celui d\u00e9j\u00e0 existant, donc je crois que c'est l\u00e0 que la balise a mis un autocollant", "tokens": [51530, 1022, 22829, 12027, 2514, 394, 11, 5926, 1506, 21724, 631, 269, 6, 377, 3684, 631, 635, 3119, 908, 257, 3346, 517, 45833, 1833, 394, 51733], "temperature": 0.0, "avg_logprob": -0.1896892874581473, "compression_ratio": 2.3423076923076924, "no_speech_prob": 0.25903812050819397}, {"id": 8, "seek": 2736, "start": 27.36, "end": 29.02, "text": " sur le pare-choc arri\u00e8re de sa voiture.", "tokens": [50365, 1022, 476, 7448, 12, 339, 905, 3399, 4212, 368, 601, 38859, 13, 50448], "temperature": 0.0, "avg_logprob": -0.2770047823588053, "compression_ratio": 0.8333333333333334, "no_speech_prob": 0.4634491205215454}], "language": "fr"}
-36
View File
@@ -1,36 +0,0 @@
1
00:00:00,880 --> 00:00:03,000
Brian, on peut en reparler dans une minute ?
2
00:00:03,000 --> 00:00:05,380
...de le faire. En plaçant les balises électroniques sur la voiture,
3
00:00:05,700 --> 00:00:08,000
il faut simplement accéder au véhicule, faire sauter le réservoir...
4
00:00:08,520 --> 00:00:11,480
...Fischer avait mis un autocollant sur le pare-choc arrière de sa voiture
5
00:00:11,480 --> 00:00:14,420
et quelqu'un est venu recoller exactement le même autocollant
6
00:00:14,420 --> 00:00:18,560
sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
7
00:00:18,560 --> 00:00:23,300
sur le pare-choc arrière de sa voiture et quelqu'un est venu recoller exactement le même autocollant
8
00:00:23,300 --> 00:00:27,360
sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
9
00:00:27,360 --> 00:00:29,020
sur le pare-choc arrière de sa voiture.
-10
View File
@@ -1,10 +0,0 @@
start end text
880 3000 Brian, on peut en reparler dans une minute ?
3000 5380 ...de le faire. En plaçant les balises électroniques sur la voiture,
5700 8000 il faut simplement accéder au véhicule, faire sauter le réservoir...
8520 11480 ...Fischer avait mis un autocollant sur le pare-choc arrière de sa voiture
11480 14420 et quelqu'un est venu recoller exactement le même autocollant
14420 18560 sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
18560 23300 sur le pare-choc arrière de sa voiture et quelqu'un est venu recoller exactement le même autocollant
23300 27360 sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
27360 29020 sur le pare-choc arrière de sa voiture.
1 start end text
2 880 3000 Brian, on peut en reparler dans une minute ?
3 3000 5380 ...de le faire. En plaçant les balises électroniques sur la voiture,
4 5700 8000 il faut simplement accéder au véhicule, faire sauter le réservoir...
5 8520 11480 ...Fischer avait mis un autocollant sur le pare-choc arrière de sa voiture
6 11480 14420 et quelqu'un est venu recoller exactement le même autocollant
7 14420 18560 sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
8 18560 23300 sur le pare-choc arrière de sa voiture et quelqu'un est venu recoller exactement le même autocollant
9 23300 27360 sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
10 27360 29020 sur le pare-choc arrière de sa voiture.
-9
View File
@@ -1,9 +0,0 @@
Brian, on peut en reparler dans une minute ?
...de le faire. En plaçant les balises électroniques sur la voiture,
il faut simplement accéder au véhicule, faire sauter le réservoir...
...Fischer avait mis un autocollant sur le pare-choc arrière de sa voiture
et quelqu'un est venu recoller exactement le même autocollant
sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
sur le pare-choc arrière de sa voiture et quelqu'un est venu recoller exactement le même autocollant
sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
sur le pare-choc arrière de sa voiture.
-29
View File
@@ -1,29 +0,0 @@
WEBVTT
00:00.880 --> 00:03.000
Brian, on peut en reparler dans une minute ?
00:03.000 --> 00:05.380
...de le faire. En plaçant les balises électroniques sur la voiture,
00:05.700 --> 00:08.000
il faut simplement accéder au véhicule, faire sauter le réservoir...
00:08.520 --> 00:11.480
...Fischer avait mis un autocollant sur le pare-choc arrière de sa voiture
00:11.480 --> 00:14.420
et quelqu'un est venu recoller exactement le même autocollant
00:14.420 --> 00:18.560
sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
00:18.560 --> 00:23.300
sur le pare-choc arrière de sa voiture et quelqu'un est venu recoller exactement le même autocollant
00:23.300 --> 00:27.360
sur celui déjà existant, donc je crois que c'est là que la balise a mis un autocollant
00:27.360 --> 00:29.020
sur le pare-choc arrière de sa voiture.
+1
View File
@@ -0,0 +1 @@
{"text": " Que \u00e7a soit vraiment dramatique Je suis oblig\u00e9 de jouer Shojin Parce que comme Shogat \u00e7a stack \u00e9norm\u00e9ment d'HP Bah il me faut le plus gros tube possible Y'a un monde o\u00f9 je joue le stuff avec Gage de Sterak et tout et tout Plut\u00f4t un stuff Bruiser Je pense que c'est le meilleur en vrai Dans cette game", "segments": [{"id": 0, "seek": 0, "start": 0.0, "end": 1.68, "text": " Que \u00e7a soit vraiment dramatique", "tokens": [50365, 4493, 2788, 12703, 8322, 7538, 20728, 50449], "temperature": 0.0, "avg_logprob": -0.1219998534007739, "compression_ratio": 1.4413145539906103, "no_speech_prob": 0.19703343510627747}, {"id": 1, "seek": 0, "start": 1.68, "end": 3.96, "text": " Je suis oblig\u00e9 de jouer Shojin", "tokens": [50449, 2588, 7624, 9270, 526, 368, 30823, 31404, 13970, 50563], "temperature": 0.0, "avg_logprob": -0.1219998534007739, "compression_ratio": 1.4413145539906103, "no_speech_prob": 0.19703343510627747}, {"id": 2, "seek": 0, "start": 3.96, "end": 6.48, "text": " Parce que comme Shogat \u00e7a stack \u00e9norm\u00e9ment d'HP", "tokens": [50563, 20429, 631, 5173, 1160, 664, 267, 2788, 8630, 41595, 274, 6, 39, 47, 50689], "temperature": 0.0, "avg_logprob": -0.1219998534007739, "compression_ratio": 1.4413145539906103, "no_speech_prob": 0.19703343510627747}, {"id": 3, "seek": 0, "start": 6.48, "end": 8.2, "text": " Bah il me faut le plus gros tube possible", "tokens": [50689, 14782, 1930, 385, 8487, 476, 1804, 18638, 9917, 1944, 50775], "temperature": 0.0, "avg_logprob": -0.1219998534007739, "compression_ratio": 1.4413145539906103, "no_speech_prob": 0.19703343510627747}, {"id": 4, "seek": 0, "start": 8.2, "end": 16.46, "text": " Y'a un monde o\u00f9 je joue le stuff avec Gage de Sterak et tout et tout", "tokens": [50775, 398, 6, 64, 517, 10431, 9068, 1506, 46209, 476, 1507, 4163, 460, 609, 368, 33539, 514, 1030, 3486, 1030, 3486, 51188], "temperature": 0.0, "avg_logprob": -0.1219998534007739, "compression_ratio": 1.4413145539906103, "no_speech_prob": 0.19703343510627747}, {"id": 5, "seek": 0, "start": 16.46, "end": 17.6, "text": " Plut\u00f4t un stuff Bruiser", "tokens": [51188, 2149, 325, 8775, 517, 1507, 12792, 6694, 51245], "temperature": 0.0, "avg_logprob": -0.1219998534007739, "compression_ratio": 1.4413145539906103, "no_speech_prob": 0.19703343510627747}, {"id": 6, "seek": 0, "start": 17.6, "end": 19.98, "text": " Je pense que c'est le meilleur en vrai", "tokens": [51245, 2588, 11209, 631, 269, 6, 377, 476, 41457, 465, 17815, 51364], "temperature": 0.0, "avg_logprob": -0.1219998534007739, "compression_ratio": 1.4413145539906103, "no_speech_prob": 0.19703343510627747}, {"id": 7, "seek": 0, "start": 19.98, "end": 21.1, "text": " Dans cette game", "tokens": [51364, 16897, 5550, 1216, 51420], "temperature": 0.0, "avg_logprob": -0.1219998534007739, "compression_ratio": 1.4413145539906103, "no_speech_prob": 0.19703343510627747}], "language": "fr"}
+32
View File
@@ -0,0 +1,32 @@
1
00:00:00,000 --> 00:00:01,680
Que ça soit vraiment dramatique
2
00:00:01,680 --> 00:00:03,960
Je suis obligé de jouer Shojin
3
00:00:03,960 --> 00:00:06,480
Parce que comme Shogat ça stack énormément d'HP
4
00:00:06,480 --> 00:00:08,200
Bah il me faut le plus gros tube possible
5
00:00:08,200 --> 00:00:16,460
Y'a un monde où je joue le stuff avec Gage de Sterak et tout et tout
6
00:00:16,460 --> 00:00:17,600
Plutôt un stuff Bruiser
7
00:00:17,600 --> 00:00:19,980
Je pense que c'est le meilleur en vrai
8
00:00:19,980 --> 00:00:21,100
Dans cette game
+9
View File
@@ -0,0 +1,9 @@
start end text
0 1680 Que ça soit vraiment dramatique
1680 3960 Je suis obligé de jouer Shojin
3960 6480 Parce que comme Shogat ça stack énormément d'HP
6480 8200 Bah il me faut le plus gros tube possible
8200 16460 Y'a un monde où je joue le stuff avec Gage de Sterak et tout et tout
16460 17600 Plutôt un stuff Bruiser
17600 19980 Je pense que c'est le meilleur en vrai
19980 21100 Dans cette game
1 start end text
2 0 1680 Que ça soit vraiment dramatique
3 1680 3960 Je suis obligé de jouer Shojin
4 3960 6480 Parce que comme Shogat ça stack énormément d'HP
5 6480 8200 Bah il me faut le plus gros tube possible
6 8200 16460 Y'a un monde où je joue le stuff avec Gage de Sterak et tout et tout
7 16460 17600 Plutôt un stuff Bruiser
8 17600 19980 Je pense que c'est le meilleur en vrai
9 19980 21100 Dans cette game
+8
View File
@@ -0,0 +1,8 @@
Que ça soit vraiment dramatique
Je suis obligé de jouer Shojin
Parce que comme Shogat ça stack énormément d'HP
Bah il me faut le plus gros tube possible
Y'a un monde où je joue le stuff avec Gage de Sterak et tout et tout
Plutôt un stuff Bruiser
Je pense que c'est le meilleur en vrai
Dans cette game
+26
View File
@@ -0,0 +1,26 @@
WEBVTT
00:00.000 --> 00:01.680
Que ça soit vraiment dramatique
00:01.680 --> 00:03.960
Je suis obligé de jouer Shojin
00:03.960 --> 00:06.480
Parce que comme Shogat ça stack énormément d'HP
00:06.480 --> 00:08.200
Bah il me faut le plus gros tube possible
00:08.200 --> 00:16.460
Y'a un monde où je joue le stuff avec Gage de Sterak et tout et tout
00:16.460 --> 00:17.600
Plutôt un stuff Bruiser
00:17.600 --> 00:19.980
Je pense que c'est le meilleur en vrai
00:19.980 --> 00:21.100
Dans cette game
+5
View File
@@ -0,0 +1,5 @@
{
"18:06:49": "Rapprocher les objets, cest comme faire lamour, ça prend du temps mais cest marrant !",
"18:07:33": "Le gars est complètement dingue ! Il me raconte des histoires à dormir debout. Jai limpression dêtre dans un film de science-fiction. À mon niveau, jen ai marre de ces conneries. On devrait vraiment le frapper sur la tête pour lui faire tenir sa langue.Cette version conserve lessence humoristique et légère du texte original, tout en le rendant plus clair et plus court. Elle utilise également quelques expressions familières pour ajouter une touche de verve au texte.",
"18:08:14": "```// Code de guerre du clavier (version légère)const PATATES = 42;const BORDEL = extremine;function exterminerBordel() { console.log(Patate !);}for (let i = 0; i < PATATES; i++) { exterminerBordel();}```Ce code est en JavaScript et utilise des variables humoristiques pour créer un effet comique. Il sagit dun exemple de code qui pourrait être utilisé dans un contexte ludique ou pédagogique."
}
+7
View File
@@ -0,0 +1,7 @@
{
"18:06:43": "En vrai elles sont compliquées à rapprocher en vrai. Pour Rakan et moi très rapprocher. Quest-ce quil fout ?",
"18:07:21": "Mais cest un fou lui enfin cest... Cest quoi ce malade mental là ? Il mexplique ou... Je pense quon les bat. suis niveau 11 et tout je peux mettre sacré ult.",
"18:07:58": "voilà cest pas dur clavier de guerre et non plus au vp v énorme mais vraiment les patates que je vais mettre là ça va exterminer la bordel",
"18:08:38": "Aïe aïe Ah mais quand tu joues à LOL Genre deviens fou sur ton clavier Par contre ça cest pas mal Ça me fait bien comme back par vraiment chier le que là Varus A eu kill Bon après je pense Que",
"18:08:57": "Que ça soit vraiment dramatique Je suis obligé de jouer Shojin Parce que comme Shogat stack énormément dHP Bah il me faut le plus gros tube possible Ya un monde où je joue stuff avec Gage Sterak et tout Plutôt Bruiser pense cest meilleur en vrai Dans cette game"
}