import os import sys import time import random import requests from dotenv import load_dotenv # Load local environment settings load_dotenv() API_URL = os.getenv("API_URL", "http://localhost:3000") API_KEY = os.getenv("API_KEY", "") TWITCH_CHANNEL = os.getenv("TWITCH_CHANNEL", "winx_prinx").lower() if not API_KEY: print("[Error] API_KEY is missing! Fill out your .env file in local_worker.") sys.exit(1) headers = { "x-api-key": API_KEY, "Content-Type": "application/json" } # Sample usernames and messages for simulation VIEWERS = [ {"username": "alex_gaming", "displayName": "AlexGaming", "isMod": False, "isSub": True}, {"username": "masha_sweet", "displayName": "Машуля", "isMod": False, "isSub": True}, {"username": "moderator_dmitry", "displayName": "Дмитрий_Мод", "isMod": True, "isSub": False}, {"username": "gamer_pro", "displayName": "ProGamer", "isMod": False, "isSub": False}, {"username": "chat_enjoyer", "displayName": "ЛюбительЧата", "isMod": False, "isSub": False}, {"username": "vip_nikita", "displayName": "Никита_VIP", "isMod": False, "isSub": True}, {"username": "stream_fan", "displayName": "ФанСтрима", "isMod": False, "isSub": True}, {"username": "spammer99", "displayName": "Спамер99", "isMod": False, "isSub": False}, {"username": "troll_user", "displayName": "Тролль", "isMod": False, "isSub": False}, ] MOCK_PHRASES = [ "привет всем!", "стрим супер, спасибо!", "какая сейчас игра?", "краш игры был жесткий", "когда следующий стрим?", "модеры, забаньте спамера плиз", "хахаха это было смешно", "какой крутой момент!", "winx_prinx лучший!", "подписка оформлена!", "что думаешь про обновление?", "го в некст игру", "всем хорошего вечера", "какой счет?", ] SPOKEN_WORDS = [ "привет", "ребята", "всем привет", "спасибо", "подписка", "играем", "игра", "победа", "поражение", "жесть", "краш", "число", "стрим", "канал", "чат", "модеры", "круто", "завтра", "сегодня", "начинаем", "отлично", "давай", "погнали", "розыгрыш", "смайлик" ] def generate_messages_batch(count=30): messages = [] base_time = time.time() # Add some messages from the streamer streamer_user = { "username": TWITCH_CHANNEL, "displayName": TWITCH_CHANNEL.capitalize(), "isStreamer": True, "isMod": True, "isSub": False } for i in range(count): # 10% chance it is the streamer writing if random.random() < 0.15: user = streamer_user else: user = random.choice(VIEWERS) phrase = random.choice(MOCK_PHRASES) # Simulate spaced out timestamps over the last 30 minutes timestamp_ms = base_time - (count - i) * 60 # 1 minute intervals timestamp_iso = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(timestamp_ms)) messages.append({ "id": f"mock-{random.randint(100000, 999999)}-{i}", "username": user["username"], "displayName": user["displayName"], "message": phrase, "timestamp": timestamp_iso, "isStreamer": user.get("isStreamer", False), "isMod": user["isMod"], "isSub": user["isSub"] }) return messages def run_simulation(): print(f"=== Запуск Симулятора Стрима для {TWITCH_CHANNEL} ===") print(f"Подключение к бэкенду: {API_URL}") # 1. Send Chat Messages Batch print("\n[1/3] Генерация и отправка сообщений чата...") chat_batch = generate_messages_batch(50) try: url = f"{API_URL}/api/log/messages" res = requests.post(url, json={"messages": chat_batch}, headers=headers, timeout=5) if res.status_code == 200: print(f"-> Успешно записано {len(chat_batch)} сообщений в базу!") else: print(f"-> Ошибка отправки сообщений: {res.status_code} - {res.text}") except Exception as e: print(f"-> Не удалось подключиться к серверу: {e}") return # 2. Send Voice Words (Streamer Speech) print("\n[2/3] Отправка распознанной речи стримера (голос)...") # Generate list of random spoken words with repeat frequencies voice_words_list = [] for _ in range(150): voice_words_list.append(random.choice(SPOKEN_WORDS)) try: url = f"{API_URL}/api/log/voice" voice_timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(time.time() - 300)) res = requests.post(url, json={"words": voice_words_list, "timestamp": voice_timestamp}, headers=headers, timeout=5) if res.status_code == 200: print(f"-> Успешно записано {len(voice_words_list)} произнесенных слов!") else: print(f"-> Ошибка отправки слов: {res.status_code} - {res.text}") except Exception as e: print(f"-> Ошибка: {e}") # 3. Send Mock Moderator Actions print("\n[3/3] Отправка действий модерации...") mock_actions = [ { "actionType": "timeout", "moderator": "moderator_dmitry", "targetUser": "spammer99", "duration": 600, "reason": "Флуд капсом и смайлами", "timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(time.time() - 300)) }, { "actionType": "delete", "moderator": "moderator_dmitry", "targetUser": "troll_user", "messageText": "Стример нуб, удаляй канал лол", "reason": "Оскорбление стримера", "timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(time.time() - 200)) }, { "actionType": "ban", "moderator": "moderator_dmitry", "targetUser": "cheater_pro", "reason": "Реклама стороннего софта в чате", "timestamp": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(time.time() - 100)) } ] success_count = 0 for act in mock_actions: try: url = f"{API_URL}/api/log/mod-action" res = requests.post(url, json=act, headers=headers, timeout=5) if res.status_code == 200: success_count += 1 except Exception as e: print(f"-> Ошибка при отправке действия модерации: {e}") print(f"-> Успешно записано {success_count} действий модерации!") print("\n=== Симуляция успешно завершена! ===") print("Откройте дашборд в браузере, чтобы увидеть сгенерированные графики и таблицы.") if __name__ == "__main__": run_simulation()