Skip to content

Commit 50c4d37

Browse files
authored
feat: add user charge in templates without reset (#173)
1 parent 10776bc commit 50c4d37

File tree

4 files changed

+87
-7
lines changed

4 files changed

+87
-7
lines changed

app/api/_clinet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ async def generate_access(
3030
case ServerTypes.MARZNESHIN:
3131
api = MarzneshinApiManager(host=data["host"])
3232
token = await api.get_token(data["username"], data["password"])
33-
token = token.access_token if token and token.is_sudo is True else None
33+
token = token.access_token if token and token.is_sudo is True else False
3434

3535
case ServerTypes.MARZBAN:
3636
api = MarzbanApiManager(host=data["host"])

app/keys/_enums.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,7 @@ class Actions(str, Enum):
2222

2323
class YesOrNot(str, Enum):
2424
YES_USAGE = "✅ Yes (reset usage)"
25+
YES_NORMAL = "✅ Yes (no reset/charge)"
26+
YES_CHARGE = "✅ Yes (charge)"
2527
YES = "✅ Yes"
2628
NO = "❌ No"

app/routers/users/modify/charge.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ async def chargestart(
4848
await state.set_state(UserModifyForm.TEMPLATE)
4949
await state.update_data(username=callback_data.extra)
5050
return await callback.message.edit_text(
51-
text=MessageTexts.ASK_ADMIN,
51+
text=MessageTexts.ITEMS,
5252
reply_markup=BotKeys.selector(
5353
data=[(tem.button_remark, tem.id) for tem in templates],
5454
types=Pages.USERS,
@@ -79,11 +79,17 @@ async def chargeend(
7979
return await callback.message.edit_text(
8080
text=MessageTexts.ASK_SURE,
8181
reply_markup=BotKeys.selector(
82-
data=[YesOrNot.YES_USAGE, YesOrNot.YES, YesOrNot.NO],
82+
data=[
83+
YesOrNot.YES_USAGE,
84+
YesOrNot.YES_CHARGE,
85+
YesOrNot.YES_NORMAL,
86+
YesOrNot.NO,
87+
],
8388
types=Pages.USERS,
8489
action=Actions.MODIFY,
8590
extra=callback_data.extra,
8691
panel=server.id,
92+
width=1,
8793
),
8894
)
8995

@@ -99,6 +105,7 @@ async def chargeend(
99105
YesOrNot.YES_USAGE,
100106
YesOrNot.YES,
101107
YesOrNot.NO,
108+
YesOrNot.YES_CHARGE,
102109
]
103110
)
104111
)
@@ -128,17 +135,26 @@ async def confirmend(
128135
)
129136
return await tracker.add(track)
130137

138+
user = await ClinetManager.get_user(server, data["username"])
139+
if not user:
140+
track = await callback.message.edit_text(
141+
text=MessageTexts.NOT_FOUND, reply_markup=BotKeys.cancel()
142+
)
143+
return await tracker.add(track)
144+
131145
if callback_data.select == YesOrNot.YES_USAGE.value:
132146
await ClinetManager.reset_user(server, data["username"])
133147

134148
datadict = charge_user_data(
135149
server.types,
136-
data["username"],
150+
user,
137151
template.data_limit,
138152
template.date_limit,
139153
template.date_types,
154+
charge=True if callback_data.select == YesOrNot.YES_CHARGE else False,
140155
)
141156
action = await ClinetManager.modify_user(server, data["username"], datadict)
157+
142158
return await callback.message.edit_text(
143159
text=MessageTexts.SUCCESS if action else MessageTexts.FAILED,
144160
reply_markup=BotKeys.cancel(),

app/settings/utils/user.py

Lines changed: 65 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
MarzneshinUserModify,
1010
)
1111
from 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

1516
def _get_expire_strategy(types: ServerTypes, datetype: str):
@@ -107,7 +108,68 @@ def user_create_data(
107108

108109

109110
def 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

Comments
 (0)