marzban 0.3.3__tar.gz → 0.4.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: marzban
3
- Version: 0.3.3
3
+ Version: 0.4.1
4
4
  Summary: Асинхронная библиотека Python для взаимодействия с MarzbanAPI | Поддерживает работу через HTTPS/SSH
5
5
  Home-page: https://github.com/sm1ky/marzban_api
6
6
  Author: Artem
@@ -20,6 +20,17 @@ Requires-Dist: httpx>=0.23.0
20
20
  Requires-Dist: pydantic>=1.10.0
21
21
  Requires-Dist: paramiko>=3.5.0
22
22
  Requires-Dist: sshtunnel>=0.4.0
23
+ Requires-Dist: datetime>=5.5
24
+ Dynamic: author
25
+ Dynamic: author-email
26
+ Dynamic: classifier
27
+ Dynamic: description
28
+ Dynamic: description-content-type
29
+ Dynamic: home-page
30
+ Dynamic: project-url
31
+ Dynamic: requires-dist
32
+ Dynamic: requires-python
33
+ Dynamic: summary
23
34
 
24
35
 
25
36
  # MarzbanAPI Client
@@ -30,8 +41,13 @@ Requires-Dist: sshtunnel>=0.4.0
30
41
  [![Supported python versions](https://img.shields.io/pypi/pyversions/marzban.svg)](https://pypi.python.org/pypi/marzban)
31
42
  [![Downloads](https://img.shields.io/pypi/dm/marzban.svg)](https://pypi.python.org/pypi/marzban)
32
43
  [![PyPi Package Version](https://img.shields.io/pypi/v/marzban)](https://pypi.python.org/pypi/marzban)
44
+ [![Supported Marzban Version](https://img.shields.io/badge/Marzban-0.8.0-brightgreen)](https://github.com/Gozargah/Marzban)
45
+
33
46
 
34
47
  **MarzbanAPI Client** is an asynchronous Python library designed for interacting with [Marzban](https://github.com/Gozargah/Marzban). It provides comprehensive methods for managing administrators, users, nodes, and system statistics.
48
+ It supports **Marzban version 0.8.0**, providing comprehensive methods for managing administrators, users, nodes, and system statistics.
49
+
50
+ To see the list of supported Marzban versions and corresponding API compatibility, check out our [Supported Versions](https://github.com/sm1ky/marzban_api/blob/production/.readme/supported_version.md) file.
35
51
 
36
52
  ## Installation
37
53
 
@@ -7,8 +7,13 @@
7
7
  [![Supported python versions](https://img.shields.io/pypi/pyversions/marzban.svg)](https://pypi.python.org/pypi/marzban)
8
8
  [![Downloads](https://img.shields.io/pypi/dm/marzban.svg)](https://pypi.python.org/pypi/marzban)
9
9
  [![PyPi Package Version](https://img.shields.io/pypi/v/marzban)](https://pypi.python.org/pypi/marzban)
10
+ [![Supported Marzban Version](https://img.shields.io/badge/Marzban-0.8.0-brightgreen)](https://github.com/Gozargah/Marzban)
11
+
10
12
 
11
13
  **MarzbanAPI Client** is an asynchronous Python library designed for interacting with [Marzban](https://github.com/Gozargah/Marzban). It provides comprehensive methods for managing administrators, users, nodes, and system statistics.
14
+ It supports **Marzban version 0.8.0**, providing comprehensive methods for managing administrators, users, nodes, and system statistics.
15
+
16
+ To see the list of supported Marzban versions and corresponding API compatibility, check out our [Supported Versions](https://github.com/sm1ky/marzban_api/blob/production/.readme/supported_version.md) file.
12
17
 
13
18
  ## Installation
14
19
 
@@ -27,7 +27,8 @@ from .models import (
27
27
  HTTPValidationError,
28
28
  ValidationError,
29
29
  SubscriptionUserResponse,
30
- SystemStats
30
+ SystemStats,
31
+ NextPlanModel
31
32
  )
32
33
 
33
34
  __all__ = (
@@ -60,7 +61,8 @@ __all__ = (
60
61
  "HTTPValidationError",
61
62
  "ValidationError",
62
63
  "SubscriptionUserResponse",
63
- "SystemStats"
64
+ "SystemStats",
65
+ "NextPlanModel"
64
66
  )
65
67
 
66
- __version__ = "0.3.3"
68
+ __version__ = "0.4.1"
@@ -2,10 +2,9 @@ import httpx
2
2
  import paramiko
3
3
  from paramiko.ssh_exception import SSHException
4
4
  from sshtunnel import SSHTunnelForwarder
5
-
5
+ from datetime import datetime
6
6
  from .models import *
7
-
8
-
7
+ from typing import Optional
9
8
  class MarzbanAPI:
10
9
  def __init__(self,
11
10
  base_url: str, *,
@@ -166,6 +165,24 @@ class MarzbanAPI:
166
165
  response = await self._request("GET", url, token, params=params)
167
166
  return [Admin(**admin) for admin in response.json()]
168
167
 
168
+ async def disable_all_users_admin(self, username: str, token: str) -> None:
169
+ url = f"/api/admin/{username}/users/disable"
170
+ await self._request("POST", url, token)
171
+
172
+ async def activate_all_users_admin(self, username: str, token: str) -> None:
173
+ url = f"/api/admin/{username}/users/activate"
174
+ await self._request("POST", url, token)
175
+
176
+ async def reset_admin_usage(self, username: str, token: str) -> Admin:
177
+ url = f"/api/admin/usage/reset/{username}"
178
+ response = await self._request("POST", url, token)
179
+ return Admin(**response.json())
180
+
181
+ async def get_admin_usage(self, username: str, token: str) -> Admin:
182
+ url = f"/api/admin/usage/{username}"
183
+ response = await self._request("GET", url, token)
184
+ return response.json()
185
+
169
186
  async def get_system_stats(self, token: str) -> SystemStats:
170
187
  url = "/api/system"
171
188
  response = await self._request("GET", url, token)
@@ -219,6 +236,11 @@ class MarzbanAPI:
219
236
  url = f"/api/user/{username}"
220
237
  response = await self._request("PUT", url, token, data=user)
221
238
  return UserResponse(**response.json())
239
+
240
+ async def activate_next_plan(self, username: str, token: str) -> UserResponse:
241
+ url = f"/api/user/{username}/active-next"
242
+ response = await self._request("POST", url, token)
243
+ return UserResponse(**response.json())
222
244
 
223
245
  async def remove_user(self, username: str, token: str) -> None:
224
246
  url = f"/api/user/{username}"
@@ -245,6 +267,21 @@ class MarzbanAPI:
245
267
  async def reset_users_data_usage(self, token: str) -> None:
246
268
  url = "/api/users/reset"
247
269
  await self._request("POST", url, token)
270
+
271
+ async def get_user_data_usage(self, username: str, token: str, start_date: Optional[datetime] = None, end_date: Optional[datetime] = None) -> UserUsagesResponse:
272
+ if isinstance(start_date, str):
273
+ start_date = datetime.fromisoformat(start_date)
274
+ if isinstance(end_date, str):
275
+ end_date = datetime.fromisoformat(end_date)
276
+
277
+ params = {
278
+ "start": start_date.isoformat(timespec="seconds") if start_date else None,
279
+ "end": end_date.isoformat(timespec="seconds") if end_date else None
280
+ }
281
+ params = {k: v for k, v in params.items() if v is not None}
282
+ url = f"/api/user/{username}/usage"
283
+ response = await self._request("GET", url, token, params=params)
284
+ return UserUsagesResponse(**response.json())
248
285
 
249
286
  async def set_owner(self, username: str, admin_username: str, token: str) -> UserResponse:
250
287
  url = f"/api/user/{username}/set-owner?admin_username={admin_username}"
@@ -1,5 +1,5 @@
1
1
  from pydantic import BaseModel, field_validator, ValidationInfo, AfterValidator, ValidationError
2
- from typing import Optional, List, Dict, Any, ClassVar, Annotated
2
+ from typing import Optional, List, Dict, Any, ClassVar, Annotated, Literal
3
3
 
4
4
 
5
5
  class Token(BaseModel):
@@ -12,6 +12,7 @@ class Admin(BaseModel):
12
12
  is_sudo: bool
13
13
  telegram_id: Optional[int] = None
14
14
  discord_webhook: Optional[str] = None
15
+ users_usage: Optional[int] = None
15
16
 
16
17
 
17
18
  class AdminCreate(Admin):
@@ -23,6 +24,7 @@ class AdminModify(BaseModel):
23
24
  password: Optional[str] = None
24
25
  telegram_id: Optional[int] = None
25
26
  discord_webhook: Optional[str] = None
27
+ users_usage: Optional[int] = None
26
28
 
27
29
 
28
30
  class HTTPValidationError(BaseModel):
@@ -33,6 +35,17 @@ class ProxySettings(BaseModel):
33
35
  id: Optional[str] = None
34
36
  flow: Optional[str] = None
35
37
 
38
+ class NextPlanModel(BaseModel):
39
+ add_remaining_traffic: bool = False
40
+ data_limit: Optional[int] = 0
41
+ expire: Optional[int] = 0
42
+ fire_on_either: bool = True
43
+
44
+ @field_validator("data_limit", mode="before")
45
+ def validate_data_limit(cls, value):
46
+ if value is not None and value < 0:
47
+ raise ValueError("Data limit in the next plan must be 0 or greater")
48
+ return value
36
49
 
37
50
  class UserCreate(BaseModel):
38
51
  username: str
@@ -47,7 +60,8 @@ class UserCreate(BaseModel):
47
60
  online_at: Optional[str] = None
48
61
  on_hold_expire_duration: Optional[int] = 0
49
62
  on_hold_timeout: Optional[str] = None
50
- status: Optional[str] = "active"
63
+ status: Literal["active", "on_hold"] = "active"
64
+ next_plan: Optional[NextPlanModel] = None
51
65
 
52
66
 
53
67
  class UserResponse(BaseModel):
@@ -63,15 +77,16 @@ class UserResponse(BaseModel):
63
77
  online_at: Optional[str] = None
64
78
  on_hold_expire_duration: Optional[int] = None
65
79
  on_hold_timeout: Optional[str] = None
66
- status: Optional[str] = None
67
- admin: Optional[Admin] = None
80
+ status: Literal["active", "disabled", "limited", "expired", "on_hold"] = "active"
68
81
  used_traffic: Optional[int] = None
69
82
  lifetime_used_traffic: Optional[int] = None
70
- created_at: Optional[str] = None
71
83
  links: Optional[List[str]] = []
72
84
  subscription_url: Optional[str] = None
73
85
  subscription_token: Optional[str] = None
74
86
  excluded_inbounds: Optional[Dict[str, List[str]]] = None
87
+ next_plan: Optional[NextPlanModel] = None
88
+ admin: Optional[Admin] = None
89
+ created_at: Optional[str] = None
75
90
 
76
91
  def __init__(self, **data):
77
92
  super().__init__(**data)
@@ -152,7 +167,7 @@ class UserModify(BaseModel):
152
167
  proxies: Optional[Dict[str, ProxySettings]] = {}
153
168
  expire: Optional[int] = None
154
169
  data_limit: Optional[int] = None
155
- data_limit_reset_strategy: Optional[str] = None
170
+ data_limit_reset_strategy: Optional[Literal["no_reset", "day", "week", "month", "year"]] = None
156
171
  inbounds: Optional[Dict[str, List[str]]] = None
157
172
  note: Optional[str] = None
158
173
  sub_updated_at: Optional[str] = None
@@ -160,7 +175,8 @@ class UserModify(BaseModel):
160
175
  online_at: Optional[str] = None
161
176
  on_hold_expire_duration: Optional[int] = None
162
177
  on_hold_timeout: Optional[str] = None
163
- status: Optional[str] = None
178
+ status: Optional[Literal["active", "disabled", "limited", "expired", "on_hold"]] = None
179
+ next_plan: Optional[NextPlanModel] = None
164
180
 
165
181
 
166
182
  class UserTemplateCreate(BaseModel):
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: marzban
3
- Version: 0.3.3
3
+ Version: 0.4.1
4
4
  Summary: Асинхронная библиотека Python для взаимодействия с MarzbanAPI | Поддерживает работу через HTTPS/SSH
5
5
  Home-page: https://github.com/sm1ky/marzban_api
6
6
  Author: Artem
@@ -20,6 +20,17 @@ Requires-Dist: httpx>=0.23.0
20
20
  Requires-Dist: pydantic>=1.10.0
21
21
  Requires-Dist: paramiko>=3.5.0
22
22
  Requires-Dist: sshtunnel>=0.4.0
23
+ Requires-Dist: datetime>=5.5
24
+ Dynamic: author
25
+ Dynamic: author-email
26
+ Dynamic: classifier
27
+ Dynamic: description
28
+ Dynamic: description-content-type
29
+ Dynamic: home-page
30
+ Dynamic: project-url
31
+ Dynamic: requires-dist
32
+ Dynamic: requires-python
33
+ Dynamic: summary
23
34
 
24
35
 
25
36
  # MarzbanAPI Client
@@ -30,8 +41,13 @@ Requires-Dist: sshtunnel>=0.4.0
30
41
  [![Supported python versions](https://img.shields.io/pypi/pyversions/marzban.svg)](https://pypi.python.org/pypi/marzban)
31
42
  [![Downloads](https://img.shields.io/pypi/dm/marzban.svg)](https://pypi.python.org/pypi/marzban)
32
43
  [![PyPi Package Version](https://img.shields.io/pypi/v/marzban)](https://pypi.python.org/pypi/marzban)
44
+ [![Supported Marzban Version](https://img.shields.io/badge/Marzban-0.8.0-brightgreen)](https://github.com/Gozargah/Marzban)
45
+
33
46
 
34
47
  **MarzbanAPI Client** is an asynchronous Python library designed for interacting with [Marzban](https://github.com/Gozargah/Marzban). It provides comprehensive methods for managing administrators, users, nodes, and system statistics.
48
+ It supports **Marzban version 0.8.0**, providing comprehensive methods for managing administrators, users, nodes, and system statistics.
49
+
50
+ To see the list of supported Marzban versions and corresponding API compatibility, check out our [Supported Versions](https://github.com/sm1ky/marzban_api/blob/production/.readme/supported_version.md) file.
35
51
 
36
52
  ## Installation
37
53
 
@@ -2,3 +2,4 @@ httpx>=0.23.0
2
2
  pydantic>=1.10.0
3
3
  paramiko>=3.5.0
4
4
  sshtunnel>=0.4.0
5
+ datetime>=5.5
@@ -5,13 +5,14 @@ with open("README.md", "r", encoding="utf-8") as fh:
5
5
 
6
6
  setup(
7
7
  name="marzban",
8
- version="0.3.3",
8
+ version="0.4.1",
9
9
  packages=find_packages(),
10
10
  install_requires=[
11
11
  "httpx>=0.23.0",
12
12
  "pydantic>=1.10.0",
13
13
  "paramiko>=3.5.0",
14
- "sshtunnel>=0.4.0"
14
+ "sshtunnel>=0.4.0",
15
+ "datetime>=5.5",
15
16
  ],
16
17
  author="Artem",
17
18
  author_email="contant@sm1ky.com",
File without changes
File without changes