winx_prinx-api / local_worker /mock_sender.py
Sasha
feat: prepare transition to decoupled hosting (Render + Netlify + Supabase)
d9a03db
Raw
History Blame Contribute Delete
7.56 kB
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()