99 MarzneshinUserModify ,
1010)
1111from app .models .server import ServerTypes
12- from app .api .types .marzban import MarzbanProxyInbound
12+ from app .api .types .marzban import MarzbanProxyInbound , MarzbanUserResponse
13+ from app .api .types .marzneshin import MarzneshinUserResponse
1314
1415
1516def _get_expire_strategy (types : ServerTypes , datetype : str ):
@@ -107,7 +108,68 @@ def user_create_data(
107108
108109
109110def charge_user_data (
110- types : ServerTypes , username : str , datalimit : int , datelimit : int , status : str
111+ types : ServerTypes ,
112+ user : MarzbanUserResponse | MarzneshinUserResponse ,
113+ datalimit : int ,
114+ datelimit : int ,
115+ datetypes : str ,
116+ charge : bool = False ,
117+ ) -> dict :
118+ if charge :
119+ return advenced_charge_user_data (types , user , datalimit , datelimit , datetypes )
120+ return normal_charge_user_data (types , user , datalimit , datelimit , datetypes )
121+
122+
123+ def advenced_charge_user_data (
124+ types : ServerTypes ,
125+ user : MarzbanUserResponse | MarzneshinUserResponse ,
126+ datalimit : int ,
127+ datelimit : int ,
128+ datetypes : str ,
129+ ) -> dict :
130+ match types :
131+ case ServerTypes .MARZBAN :
132+ data = MarzbanUserModify (
133+ data_limit = int (datalimit ) * (1024 ** 3 ) + user .data_limit
134+ if user .data_limit
135+ else 0 ,
136+ status = "on_hold"
137+ if datetypes == DateTypes .AFTER_FIRST_USE
138+ else "active" ,
139+ expire = int (int ((datelimit ) * (24 * 60 * 60 )) + (user .expire ))
140+ if datetypes != DateTypes .AFTER_FIRST_USE
141+ else None ,
142+ on_hold_expire_duration = int (
143+ int ((datelimit ) * (24 * 60 * 60 )) + (user .on_hold_expire_duration )
144+ )
145+ if datetypes == DateTypes .AFTER_FIRST_USE
146+ else None ,
147+ ).dict ()
148+ case ServerTypes .MARZNESHIN :
149+ expire_strategy = _get_expire_strategy (types , datetypes )
150+ data = MarzneshinUserModify (
151+ username = user .username ,
152+ data_limit = int (datalimit ) * (1024 ** 3 ) + user .data_limit
153+ if user .data_limit
154+ else 0 ,
155+ expire_strategy = expire_strategy ,
156+ expire_date = user .expire_date + timedelta (int (datelimit ))
157+ if expire_strategy == MarzneshinUserExpireStrategy .FIXED_DATE
158+ else None ,
159+ usage_duration = user .usage_duration + (int (datelimit ) * (24 * 60 * 60 ))
160+ if expire_strategy == MarzneshinUserExpireStrategy .START_ON_FIRST_USE
161+ else None ,
162+ ).dict ()
163+
164+ return data
165+
166+
167+ def normal_charge_user_data (
168+ types : ServerTypes ,
169+ user : MarzbanUserResponse | MarzneshinUserResponse ,
170+ datalimit : int ,
171+ datelimit : int ,
172+ status : str ,
111173) -> dict :
112174 expire_strategy = _get_expire_strategy (types , status )
113175 expire_date = _get_expire_date (expire_strategy , datelimit )
@@ -126,7 +188,7 @@ def charge_user_data(
126188 ).dict ()
127189 elif types == ServerTypes .MARZNESHIN .value :
128190 data = MarzneshinUserModify (
129- username = username ,
191+ username = user . username ,
130192 data_limit = int (datalimit ) * (1024 ** 3 ),
131193 expire_strategy = expire_strategy ,
132194 expire_date = expire_date ,
0 commit comments