import os
import json
import threading
import asyncio
from pythonosc import udp_client, osc_server, dispatcher
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes

# Настройки OSC
osc_client = udp_client.SimpleUDPClient("127.0.0.1", 9000)  # Адрес и порт OSC клиента
received_parameters = {}  # Словарь для хранения полученных параметров

# Функция для обработки OSC сообщений
def on_parameter_received(address, *args):
    global received_parameters
    param_name = address.split("/")[-1]
    value = args[0] if args else 0.0
    received_parameters[param_name] = value
    print(f"Получен параметр: {param_name} = {value}")

# Настройка OSC сервера
def setup_osc_server():
    disp = dispatcher.Dispatcher()
    disp.map("/avatar/parameters/*", on_parameter_received)
    server = osc_server.ThreadingOSCUDPServer(("127.0.0.1", 9000), disp)
    server_thread = threading.Thread(target=server.serve_forever, daemon=True)
    server_thread.start()
    print("✅ OSC сервер запущен")

# Команда /start для Telegram бота
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    await update.message.reply_text('Привет! Я ваш VRChat бот. Используйте /status для получения статуса параметров.')

# Команда /status для получения статуса параметров
async def status(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    global received_parameters
    response = "Текущие параметры:\n"
    for param, value in received_parameters.items():
        response += f"{param}: {value:.2f}\n"
    await update.message.reply_text(response)

# Команда для изменения параметров аватара
async def set_parameter(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    if len(context.args) != 2:
        await update.message.reply_text("Используйте: /set_parameter <имя параметра> <значение>")
        return

    param_name = context.args[0]
    try:
        value = float(context.args[1])
        osc_client.send_message(f"/avatar/parameters/{param_name}", value)
        await update.message.reply_text(f"Параметр {param_name} установлен на {value:.2f}")
    except ValueError:
        await update.message.reply_text("Значение должно быть числом.")

# Команда для выполнения действий (например, эмоции)
async def perform_action(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    if len(context.args) != 1:
        await update.message.reply_text("Используйте: /perform_action <имя действия>")
        return

    action_name = context.args[0]
    osc_client.send_message(f"/avatar/actions/{action_name}", 1)  # Отправляем команду на выполнение действия
    await update.message.reply_text(f"Выполнено действие: {action_name}")

# Основная функция для запуска Telegram бота
def main():
    # Запуск OSC сервера
    setup_osc_server()

    # Создание и запуск Telegram бота
    application = Application.builder().token("8375951215:AAG55mNIiyCR1JMlSa4E8jsTonyvGE2zFBE").build()  # Замените на ваш токен бота
    
    # Добавление обработчиков команд
    application.add_handler(CommandHandler("start", start))
    application.add_handler(CommandHandler("status", status))
    application.add_handler(CommandHandler("set_parameter", set_parameter))
    application.add_handler(CommandHandler("perform_action", perform_action))

    # Запуск бота
    print("✅ Telegram бот запускается...")
    application.run_polling()

if __name__ == '__main__':
    main()

