marzban 0.1.10__py3-none-any.whl → 0.2.1__py3-none-any.whl

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.
marzban/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
1
  from .api import MarzbanAPI
2
2
  from .models import *
3
3
 
4
- __version__ = "0.1.10"
4
+ __version__ = "0.2.1"
marzban/api.py CHANGED
@@ -14,7 +14,7 @@ class MarzbanAPI:
14
14
  async def _request(self, method: str, url: str, token: Optional[str] = None, data: Optional[BaseModel] = None, params: Optional[Dict[str, Any]] = None) -> httpx.Response:
15
15
  headers = self._get_headers(token) if token else {}
16
16
  json_data = data.model_dump(exclude_none=True) if data else None
17
-
17
+ params = [param for param in (params or []) if param is not None]
18
18
  response = await self.client.request(method, url, headers=headers, json=json_data, params=params)
19
19
  response.raise_for_status()
20
20
  return response
@@ -139,13 +139,12 @@ class MarzbanAPI:
139
139
  async def get_user_usage(self, username: str, token: str, start: Optional[str] = None, end: Optional[str] = None) -> UserUsagesResponse:
140
140
  url = f"/api/user/{username}/usage"
141
141
  params = {"start": start, "end": end}
142
- response = await self._request("GET", url, token, params=params)
142
+ response: httpx.Response = await self._request("GET", url, token, params=params)
143
143
  return UserUsagesResponse(**response.json())
144
144
 
145
145
  async def set_owner(self, username: str, admin_username: str, token: str) -> UserResponse:
146
- url = f"/api/user/{username}/set-owner"
147
- params = {"admin_username": admin_username}
148
- response = await self._request("PUT", url, token, params=params)
146
+ url = f"/api/user/{username}/set-owner?admin_username={admin_username}"
147
+ response = await self._request("PUT", url, token)
149
148
  return UserResponse(**response.json())
150
149
 
151
150
  async def get_expired_users(self, token: str, expired_before: Optional[str] = None, expired_after: Optional[str] = None) -> List[str]:
@@ -225,4 +224,4 @@ class MarzbanAPI:
225
224
  return NodesUsageResponse(**response.json())
226
225
 
227
226
  async def close(self):
228
- await self.client.aclose()
227
+ await self.client.aclose()
marzban/models.py CHANGED
@@ -8,20 +8,20 @@ class Token(BaseModel):
8
8
  class Admin(BaseModel):
9
9
  username: str
10
10
  is_sudo: bool
11
- telegram_id: Optional[int]
12
- discord_webhook: Optional[str]
11
+ telegram_id: Optional[int] = None
12
+ discord_webhook: Optional[str] = None
13
13
 
14
14
  class AdminCreate(Admin):
15
15
  password: str
16
16
 
17
17
  class AdminModify(BaseModel):
18
18
  is_sudo: bool
19
- password: Optional[str]
20
- telegram_id: Optional[int]
21
- discord_webhook: Optional[str]
19
+ password: Optional[str] = None
20
+ telegram_id: Optional[int] = None
21
+ discord_webhook: Optional[str] = None
22
22
 
23
23
  class HTTPValidationError(BaseModel):
24
- detail: Optional[List[Dict[str, Any]]]
24
+ detail: Optional[List[Dict[str, Any]]] = None
25
25
 
26
26
  class SystemStats(BaseModel):
27
27
  version: str
@@ -39,7 +39,7 @@ class SystemStats(BaseModel):
39
39
  class ProxySettings(BaseModel):
40
40
  id: Optional[str] = None
41
41
  flow: Optional[str] = None
42
-
42
+
43
43
  class UserCreate(BaseModel):
44
44
  username: str
45
45
  proxies: Optional[Dict[str, ProxySettings]] = {}
@@ -61,7 +61,7 @@ class UserResponse(BaseModel):
61
61
  expire: Optional[int] = None
62
62
  data_limit: Optional[int] = None
63
63
  data_limit_reset_strategy: Optional[str] = None
64
- inbounds: Optional[Dict[str, List[str]]] = {}
64
+ inbounds: Optional[Dict[str, List[str]]] = None
65
65
  note: Optional[str] = None
66
66
  sub_updated_at: Optional[str] = None
67
67
  sub_last_user_agent: Optional[str] = None
@@ -74,7 +74,7 @@ class UserResponse(BaseModel):
74
74
  created_at: Optional[str] = None
75
75
  links: Optional[List[str]] = []
76
76
  subscription_url: Optional[str] = None
77
- excluded_inbounds: Optional[Dict[str, List[str]]] = {}
77
+ excluded_inbounds: Optional[Dict[str, List[str]]] = None
78
78
 
79
79
  class NodeCreate(BaseModel):
80
80
  name: str
@@ -85,12 +85,12 @@ class NodeCreate(BaseModel):
85
85
  add_as_new_host: bool = True
86
86
 
87
87
  class NodeModify(BaseModel):
88
- name: Optional[str]
89
- address: Optional[str]
90
- port: Optional[int]
91
- api_port: Optional[int]
92
- usage_coefficient: Optional[float]
93
- status: Optional[str]
88
+ name: Optional[str] = None
89
+ address: Optional[str] = None
90
+ port: Optional[int] = None
91
+ api_port: Optional[int] = None
92
+ usage_coefficient: Optional[float] = None
93
+ status: Optional[str] = None
94
94
 
95
95
  class NodeResponse(BaseModel):
96
96
  name: str
@@ -99,15 +99,15 @@ class NodeResponse(BaseModel):
99
99
  api_port: int
100
100
  usage_coefficient: float
101
101
  id: int
102
- xray_version: Optional[str]
102
+ xray_version: Optional[str] = None
103
103
  status: str
104
- message: Optional[str]
104
+ message: Optional[str] = None
105
105
 
106
106
  class NodeUsageResponse(BaseModel):
107
- node_id: int
108
- node_name: str
109
- uplink: int
110
- downlink: int
107
+ node_id: Optional[int] = None
108
+ node_name: Optional[str] = None
109
+ uplink: Optional[int] = None
110
+ downlink: Optional[int] = None
111
111
 
112
112
  class NodesUsageResponse(BaseModel):
113
113
  usages: List[NodeUsageResponse]
@@ -115,10 +115,10 @@ class NodesUsageResponse(BaseModel):
115
115
  class ProxyHost(BaseModel):
116
116
  remark: str
117
117
  address: str
118
- port: Optional[int]
119
- sni: Optional[str]
120
- host: Optional[str]
121
- path: Optional[str]
118
+ port: Optional[int] = None
119
+ sni: Optional[str] = None
120
+ host: Optional[str] = None
121
+ path: Optional[str] = None
122
122
  security: str = "inbound_default"
123
123
  alpn: str = ""
124
124
  fingerprint: str = ""
@@ -142,7 +142,7 @@ class UserModify(BaseModel):
142
142
  expire: Optional[int] = None
143
143
  data_limit: Optional[int] = None
144
144
  data_limit_reset_strategy: Optional[str] = None
145
- inbounds: Optional[Dict[str, List[str]]] = {}
145
+ inbounds: Optional[Dict[str, List[str]]] = None
146
146
  note: Optional[str] = None
147
147
  sub_updated_at: Optional[str] = None
148
148
  sub_last_user_agent: Optional[str] = None
@@ -152,34 +152,34 @@ class UserModify(BaseModel):
152
152
  status: Optional[str] = None
153
153
 
154
154
  class UserTemplateCreate(BaseModel):
155
- name: Optional[str]
155
+ name: Optional[str] = None
156
156
  data_limit: int = 0
157
157
  expire_duration: int = 0
158
- username_prefix: Optional[str]
159
- username_suffix: Optional[str]
158
+ username_prefix: Optional[str] = None
159
+ username_suffix: Optional[str] = None
160
160
  inbounds: Optional[Dict[str, List[str]]] = {}
161
161
 
162
162
  class UserTemplateResponse(BaseModel):
163
163
  id: int
164
- name: Optional[str]
164
+ name: Optional[str] = None
165
165
  data_limit: int
166
166
  expire_duration: int
167
- username_prefix: Optional[str]
168
- username_suffix: Optional[str]
167
+ username_prefix: Optional[str] = None
168
+ username_suffix: Optional[str] = None
169
169
  inbounds: Dict[str, List[str]]
170
170
 
171
171
  class UserTemplateModify(BaseModel):
172
- name: Optional[str]
173
- data_limit: Optional[int]
174
- expire_duration: Optional[int]
175
- username_prefix: Optional[str]
176
- username_suffix: Optional[str]
177
- inbounds: Optional[Dict[str, List[str]]]
172
+ name: Optional[str] = None
173
+ data_limit: Optional[int] = None
174
+ expire_duration: Optional[int] = None
175
+ username_prefix: Optional[str] = None
176
+ username_suffix: Optional[str] = None
177
+ inbounds: Optional[Dict[str, List[str]]] = None
178
178
 
179
179
  class UserUsageResponse(BaseModel):
180
- node_id: int
181
- node_name: str
182
- used_traffic: int
180
+ node_id: Optional[int]
181
+ node_name: Optional[str]
182
+ used_traffic: Optional[int]
183
183
 
184
184
  class UserUsagesResponse(BaseModel):
185
185
  username: str
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: marzban
3
- Version: 0.1.10
3
+ Version: 0.2.1
4
4
  Summary: Асинхронная библиотека Python для взаимодействия с MarzbanAPI
5
5
  Home-page: https://github.com/sm1ky/marzban_api
6
6
  Author: Artem
@@ -0,0 +1,8 @@
1
+ marzban/__init__.py,sha256=WA7e4DKxvw9vrQd7UgvE6KlXMABnIo4HQY1a6nZonjI,72
2
+ marzban/api.py,sha256=m8Uv0dgN0gg4yeCu_u5RBWw1hhz5dRSSOvp7SffjW80,10681
3
+ marzban/models.py,sha256=CmmrobcipIsv3m6Jc9XMPdgQMNMoYyJdmwn3NbVIjvU,5600
4
+ marzban-0.2.1.dist-info/LICENSE,sha256=e7OchdHfXoz2OZRHj8iltLIKYwdri9J4_9PMEnov418,1061
5
+ marzban-0.2.1.dist-info/METADATA,sha256=BP6cwfoov4vmgoriYXkwnv8_2nTNiXgJr8AWQQRPgz8,1111
6
+ marzban-0.2.1.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
7
+ marzban-0.2.1.dist-info/top_level.txt,sha256=KUmBWzTarBlzw2GZOuk-d-jM2GU4zPWo1iwvW_mXS-c,8
8
+ marzban-0.2.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.1.1)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,8 +0,0 @@
1
- marzban/__init__.py,sha256=ciudM83BFaA1fW_PVYq4W-HuE3qDor-6s55gTXpSIaQ,73
2
- marzban/api.py,sha256=B_Dni2-9a41oxzNbLVVh1SyqIo8aSWU4DYc-BPFu-0E,10626
3
- marzban/models.py,sha256=RwVSr4tfQIb3LYx_vwdbJueiyzS6ay8scdIpsV9FAts,5282
4
- marzban-0.1.10.dist-info/LICENSE,sha256=e7OchdHfXoz2OZRHj8iltLIKYwdri9J4_9PMEnov418,1061
5
- marzban-0.1.10.dist-info/METADATA,sha256=oTeZlBMWmYatdCc_gK8qbCY1XLHBC_Cx6RZpPbKBanQ,1112
6
- marzban-0.1.10.dist-info/WHEEL,sha256=mguMlWGMX-VHnMpKOjjQidIo1ssRlCFu4a4mBpz1s2M,91
7
- marzban-0.1.10.dist-info/top_level.txt,sha256=KUmBWzTarBlzw2GZOuk-d-jM2GU4zPWo1iwvW_mXS-c,8
8
- marzban-0.1.10.dist-info/RECORD,,