From 2971b9ad2e9e6993fd2c071422b1c29d642eaf14 Mon Sep 17 00:00:00 2001 From: machka pasla Date: Wed, 19 Nov 2025 11:30:34 +0300 Subject: [PATCH] added external squad --- .env.example | 2 ++ README.md | 1 + bot/services/panel_api_service.py | 3 +++ bot/services/subscription_service.py | 4 ++++ config/settings.py | 13 +++++++++++++ 5 files changed, 23 insertions(+) diff --git a/.env.example b/.env.example index f1218a5..7538c8b 100644 --- a/.env.example +++ b/.env.example @@ -118,6 +118,8 @@ USER_TRAFFIC_STRATEGY="NO_RESET" # Tr # Default Internal Squads for Users (Optional, comma-separated UUIDs) USER_SQUAD_UUIDS=uuid1,uuid2,uuid3 +# Default External Squad for Users (Optional, single UUID) +USER_EXTERNAL_SQUAD_UUID= # Optional: UUID from Remnawave External Squads to auto-link new panel users # Trial Settings TRIAL_ENABLED=True # Enable the trial period diff --git a/README.md b/README.md index 2528a2a..5d62ad4 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,7 @@ | `PANEL_API_KEY` | API ключ для доступа к панели. | | `PANEL_WEBHOOK_SECRET`| Секретный ключ для проверки вебхуков от панели. | | `USER_SQUAD_UUIDS` | ID отрядов для новых пользователей. | + | `USER_EXTERNAL_SQUAD_UUID` | Опционально. UUID внешнего отряда (External Squad) из [документации Remnawave](https://docs.rw/api), куда автоматически добавляются новые пользователи. | | `USER_TRAFFIC_LIMIT_GB`| Лимит трафика в ГБ (0 - безлимит). | | `USER_HWID_DEVICE_LIMIT`| Лимит устройств (HWID) для новых пользователей (0 - безлимит). | diff --git a/bot/services/panel_api_service.py b/bot/services/panel_api_service.py index 6acb08d..c8e649f 100644 --- a/bot/services/panel_api_service.py +++ b/bot/services/panel_api_service.py @@ -339,6 +339,7 @@ class PanelApiService: default_traffic_limit_strategy: str = "NO_RESET", hwid_device_limit: Optional[int] = None, specific_squad_uuids: Optional[List[str]] = None, + external_squad_uuid: Optional[str] = None, description: Optional[str] = None, tag: Optional[str] = None, status: str = "ACTIVE", @@ -383,6 +384,8 @@ class PanelApiService: ) if specific_squad_uuids: payload["activeInternalSquads"] = specific_squad_uuids + if external_squad_uuid: + payload["externalSquadUuid"] = external_squad_uuid if telegram_id is not None: payload["telegramId"] = telegram_id if email: payload["email"] = email if description: payload["description"] = description diff --git a/bot/services/subscription_service.py b/bot/services/subscription_service.py index 2c2862e..b22b7b4 100644 --- a/bot/services/subscription_service.py +++ b/bot/services/subscription_service.py @@ -125,6 +125,7 @@ class SubscriptionService: (db_user.last_name or "") if db_user else "", ]), specific_squad_uuids=self.settings.parsed_user_squad_uuids, + external_squad_uuid=self.settings.parsed_user_external_squad_uuid, default_traffic_limit_bytes=self.settings.user_traffic_limit_bytes, default_traffic_limit_strategy=self.settings.USER_TRAFFIC_STRATEGY, ) @@ -153,6 +154,7 @@ class SubscriptionService: (db_user.last_name or "") if db_user else "", ]), specific_squad_uuids=self.settings.parsed_user_squad_uuids, + external_squad_uuid=self.settings.parsed_user_external_squad_uuid, default_traffic_limit_bytes=self.settings.user_traffic_limit_bytes, default_traffic_limit_strategy=self.settings.USER_TRAFFIC_STRATEGY, ) @@ -915,4 +917,6 @@ class SubscriptionService: payload["trafficLimitStrategy"] = self.settings.USER_TRAFFIC_STRATEGY if self.settings.parsed_user_squad_uuids: payload["activeInternalSquads"] = self.settings.parsed_user_squad_uuids + if self.settings.parsed_user_external_squad_uuid: + payload["externalSquadUuid"] = self.settings.parsed_user_external_squad_uuid return payload diff --git a/config/settings.py b/config/settings.py index d86472e..c0b0298 100644 --- a/config/settings.py +++ b/config/settings.py @@ -133,6 +133,10 @@ class Settings(BaseSettings): default=None, description= "Comma-separated UUIDs of internal squads to assign to new panel users") + USER_EXTERNAL_SQUAD_UUID: Optional[str] = Field( + default=None, + description= + "UUID of the external squad to assign to new panel users (optional)") TRIAL_ENABLED: bool = Field(default=True) TRIAL_DURATION_DAYS: int = Field(default=3) @@ -215,6 +219,15 @@ class Settings(BaseSettings): ] return None + @computed_field + @property + def parsed_user_external_squad_uuid(self) -> Optional[str]: + if self.USER_EXTERNAL_SQUAD_UUID: + cleaned = self.USER_EXTERNAL_SQUAD_UUID.strip() + if cleaned: + return cleaned + return None + @computed_field @property def yookassa_webhook_path(self) -> str: