From a3b3fdf33bd1f3b5cca3d5d2d7ecd96bb3f8cfef Mon Sep 17 00:00:00 2001 From: vladimir Date: Fri, 3 Jul 2026 18:04:30 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D1=8B=20=D1=81=20target?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/xray_manager/core/target.py | 61 +++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/xray_manager/core/target.py diff --git a/src/xray_manager/core/target.py b/src/xray_manager/core/target.py new file mode 100644 index 0000000..1acc774 --- /dev/null +++ b/src/xray_manager/core/target.py @@ -0,0 +1,61 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from .xray_manager_config import XrayManagerConfig + +@dataclass(frozen=True) +class Target: + id: str + pretty: str + route: str + + +class TargetStorage: + def __init__(self, xray_manager_config: XrayManagerConfig): + self.xrmc = xray_manager_config + + @property + def target_dict(self) -> dict[str, dict[str, str]]: + return self.xrmc.config.get("target", {}) + + def load_by_id(self, target_id: str) -> Target: + if target_id not in self.target_dict: + raise ValueError(f"Target not found: {target_id}") + + target_data = self.target_dict[target_id] + + if "route" not in target_data: + raise ValueError( + f"Missing required 'route' field for target: {target_id}" + ) + + return Target( + id=target_id, + pretty=target_data.get("pretty_name", target_id), + route=target_data["route"] + ) + + def load_by_pretty(self, target_pretty_name: str) -> Target: + for target_id, target_data in self.target_dict.items(): + if target_data.get("pretty_name", target_id) == target_pretty_name: + return self.load_by_id(target_id) + + raise ValueError(f"Target pretty name not found: {target_pretty_name}") + + def load_all_targets(self) -> list[Target]: + targets = [ + self.load_by_id(target_id) for target_id in self.target_dict.keys() + ] + return targets + + def save_target(self, target: Target): + self.xrmc.set_target(target.id, target.pretty, target.route) + + def delete_target(self, target: Target): + if target not in self.load_all_targets(): + raise ValueError(f"Target not found: {target.id}") + + self.xrmc.delete_target(target.id) \ No newline at end of file