from fastapi import APIRouter import logging from os import getenv from remnawave import RemnawaveSDK from remnawave.models.hosts import GetAllHostsResponseDto from remnawave.models.nodes import GetOneNodeResponseDto import re logging.basicConfig(level=logging.INFO) router = APIRouter(prefix='/api/v1', tags=['hosts']) remnawave = RemnawaveSDK(base_url=getenv('REMNAWAVE_URL'), token=getenv('REMNAWAVE_API_TOKEN')) def clean_host_name(name): """ Очищает имя хоста от флагов и лишних символов. Пример: '🇷🇺Russia Speed 🚀' -> 'Russia Speed' """ # Удаляем все флаги (региональные индикаторы) flag_pattern = re.compile(r'[\U0001F1E6-\U0001F1FF]{2}') cleaned = flag_pattern.sub('', name) # Удаляем другие эмодзи (опционально) emoji_pattern = re.compile( "[\U0001F300-\U0001F9FF\U00002600-\U000027BF\U0001F000-\U0001F02F\U0001F0A0-\U0001F0FF]+", flags=re.UNICODE ) cleaned = emoji_pattern.sub('', cleaned) # Убираем лишние пробелы return cleaned.strip() @router.get('/hosts') async def get_nodes(): hosts: GetAllHostsResponseDto = await remnawave.hosts.get_all_hosts() return [ { 'name': clean_host_name(host.remark), 'address': host.address, 'port': host.port, 'country_code': (await remnawave.nodes.get_one_node(uuid=str(host.nodes[0]))).country_code } for host in hosts.root if not host.is_disabled and not host.is_hidden ]