Spaces:
Sleeping
Sleeping
| 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() | |