gitscope
https://dev.kronoz.win/r/marzneshin.git
app/telegram/utils/keyboard.py · v0.2.1
Source
1 a47eb4c Dawsh 2y ago from datetime import datetime as dt
2 a47eb4c Dawsh 2y ago from itertools import islice
3 a47eb4c Dawsh 2y ago from typing import Literal, Dict, List
4 a47eb4c Dawsh 2y ago
5 a47eb4c Dawsh 2y ago from telebot import types # noqa
6 a47eb4c Dawsh 2y ago
7 a47eb4c Dawsh 2y ago from app.utils.system import readable_size
8 a47eb4c Dawsh 2y ago
9 a47eb4c Dawsh 2y ago
10 a47eb4c Dawsh 2y ago def chunk_dict(data: dict, size: int = 2):
11 a47eb4c Dawsh 2y ago it = iter(data)
12 a47eb4c Dawsh 2y ago for i in range(0, len(data), size):
13 a47eb4c Dawsh 2y ago yield {k: data[k] for k in islice(it, size)}
14 a47eb4c Dawsh 2y ago
15 a47eb4c Dawsh 2y ago
16 a47eb4c Dawsh 2y ago class BotKeyboard:
17 a47eb4c Dawsh 2y ago
18 a47eb4c Dawsh 2y ago @staticmethod
19 a47eb4c Dawsh 2y ago def main_menu():
20 a47eb4c Dawsh 2y ago keyboard = types.InlineKeyboardMarkup()
21 a47eb4c Dawsh 2y ago keyboard.add(
22 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(text='🔁 System Info', callback_data='system'),
23 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(text='♻️ Restart Xray', callback_data='restart'))
24 a47eb4c Dawsh 2y ago keyboard.add(
25 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(text='👥 Users', callback_data='users:1'),
26 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(text='✏️ Edit All Users', callback_data='edit_all'))
27 9bfa731 Dawsh 2y ago #keyboard.add(
28 9bfa731 Dawsh 2y ago # types.InlineKeyboardButton(text='➕ Create User From Template', callback_data='template_add_user'))
29 a47eb4c Dawsh 2y ago keyboard.add(
30 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(text='➕ Create User', callback_data='add_user'))
31 a47eb4c Dawsh 2y ago return keyboard
32 a47eb4c Dawsh 2y ago
33 a47eb4c Dawsh 2y ago
34 a47eb4c Dawsh 2y ago @staticmethod
35 a47eb4c Dawsh 2y ago def edit_all_menu():
36 a47eb4c Dawsh 2y ago keyboard = types.InlineKeyboardMarkup()
37 a47eb4c Dawsh 2y ago keyboard.add(
38 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(text='🗑 Delete Expired', callback_data='delete_expired'),
39 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(text='🗑 Delete Limited', callback_data='delete_limited'))
40 a47eb4c Dawsh 2y ago keyboard.add(
41 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(text='🔋 Data (➕|➖)', callback_data='add_data'),
42 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(text='📅 Time (➕|➖)', callback_data='add_time'))
43 9bfa731 Dawsh 2y ago #keyboard.add(
44 9bfa731 Dawsh 2y ago # types.InlineKeyboardButton(text='➕ Add Inbound', callback_data='inbound_add'),
45 9bfa731 Dawsh 2y ago # types.InlineKeyboardButton(text='➖ Remove Inbound', callback_data='inbound_remove'))
46 a47eb4c Dawsh 2y ago keyboard.add(types.InlineKeyboardButton(text='🔙 Back', callback_data='cancel'))
47 a47eb4c Dawsh 2y ago return keyboard
48 a47eb4c Dawsh 2y ago
49 a47eb4c Dawsh 2y ago
50 9bfa731 Dawsh 2y ago #@staticmethod
51 9bfa731 Dawsh 2y ago #def inbounds_menu(action, inbounds):
52 9bfa731 Dawsh 2y ago # keyboard = types.InlineKeyboardMarkup()
53 9bfa731 Dawsh 2y ago # for inbound in inbounds:
54 9bfa731 Dawsh 2y ago # keyboard.add(types.InlineKeyboardButton(text=inbound, callback_data=f'confirm_{action}:{inbound}'))
55 9bfa731 Dawsh 2y ago # keyboard.add(types.InlineKeyboardButton(text='🔙 Back', callback_data='cancel'))
56 9bfa731 Dawsh 2y ago # return keyboard
57 a47eb4c Dawsh 2y ago
58 a47eb4c Dawsh 2y ago
59 a47eb4c Dawsh 2y ago @staticmethod
60 a47eb4c Dawsh 2y ago def random_username(template_id: str = ''):
61 a47eb4c Dawsh 2y ago keyboard = types.InlineKeyboardMarkup()
62 a47eb4c Dawsh 2y ago
63 a47eb4c Dawsh 2y ago keyboard.add(types.InlineKeyboardButton(
64 a47eb4c Dawsh 2y ago text='🔡 Random Username',
65 a47eb4c Dawsh 2y ago callback_data=f'random:{template_id}'))
66 a47eb4c Dawsh 2y ago keyboard.add(types.InlineKeyboardButton(
67 a47eb4c Dawsh 2y ago text='🔙 Cancel',
68 a47eb4c Dawsh 2y ago callback_data='cancel'))
69 a47eb4c Dawsh 2y ago return keyboard
70 a47eb4c Dawsh 2y ago
71 a47eb4c Dawsh 2y ago
72 a47eb4c Dawsh 2y ago @staticmethod
73 a47eb4c Dawsh 2y ago def user_menu(user_info, with_back: bool = True, page: int = 1, note: bool = False):
74 a47eb4c Dawsh 2y ago keyboard = types.InlineKeyboardMarkup()
75 a47eb4c Dawsh 2y ago keyboard.add(
76 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
77 a47eb4c Dawsh 2y ago text='❌ Disable' if user_info['status'] == 'active' else '✅ Activate',
78 a47eb4c Dawsh 2y ago callback_data=f"{'suspend' if user_info['status'] == 'active' else 'activate'}:{user_info['username']}"
79 a47eb4c Dawsh 2y ago ),
80 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
81 a47eb4c Dawsh 2y ago text='🗑 Delete',
82 a47eb4c Dawsh 2y ago callback_data=f"delete:{user_info['username']}"
83 a47eb4c Dawsh 2y ago ),
84 a47eb4c Dawsh 2y ago )
85 a47eb4c Dawsh 2y ago if note:
86 a47eb4c Dawsh 2y ago keyboard.add(
87 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
88 a47eb4c Dawsh 2y ago text='🚫 Revoke Sub',
89 a47eb4c Dawsh 2y ago callback_data=f"revoke_sub:{user_info['username']}"),
90 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
91 a47eb4c Dawsh 2y ago text='✏️ Edit',
92 a47eb4c Dawsh 2y ago callback_data=f"edit:{user_info['username']}"))
93 a47eb4c Dawsh 2y ago keyboard.add(
94 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
95 a47eb4c Dawsh 2y ago text='📝 Edit Note',
96 a47eb4c Dawsh 2y ago callback_data=f"edit_note:{user_info['username']}"),
97 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
98 a47eb4c Dawsh 2y ago text='📡 Links',
99 a47eb4c Dawsh 2y ago callback_data=f"links:{user_info['username']}"))
100 a47eb4c Dawsh 2y ago else:
101 a47eb4c Dawsh 2y ago keyboard.add(
102 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
103 a47eb4c Dawsh 2y ago text='📡 Links',
104 a47eb4c Dawsh 2y ago callback_data=f"links:{user_info['username']}"),
105 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
106 a47eb4c Dawsh 2y ago text='✏️ Edit',
107 a47eb4c Dawsh 2y ago callback_data=f"edit:{user_info['username']}"))
108 a47eb4c Dawsh 2y ago keyboard.add(
109 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
110 a47eb4c Dawsh 2y ago text='🔁 Reset usage',
111 a47eb4c Dawsh 2y ago callback_data=f"reset_usage:{user_info['username']}"
112 a47eb4c Dawsh 2y ago ),
113 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
114 a47eb4c Dawsh 2y ago text='🔋 Charge',
115 a47eb4c Dawsh 2y ago callback_data=f"charge:{user_info['username']}"
116 a47eb4c Dawsh 2y ago )
117 a47eb4c Dawsh 2y ago )
118 a47eb4c Dawsh 2y ago if with_back:
119 a47eb4c Dawsh 2y ago keyboard.add(
120 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
121 a47eb4c Dawsh 2y ago text='🔙 Back',
122 a47eb4c Dawsh 2y ago callback_data=f'users:{page}'
123 a47eb4c Dawsh 2y ago )
124 a47eb4c Dawsh 2y ago )
125 a47eb4c Dawsh 2y ago return keyboard
126 a47eb4c Dawsh 2y ago
127 a47eb4c Dawsh 2y ago @staticmethod
128 a47eb4c Dawsh 2y ago def show_links(username: str):
129 a47eb4c Dawsh 2y ago keyboard = types.InlineKeyboardMarkup()
130 a47eb4c Dawsh 2y ago
131 a47eb4c Dawsh 2y ago keyboard.add(
132 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
133 a47eb4c Dawsh 2y ago text="🖼 QR code",
134 a47eb4c Dawsh 2y ago callback_data=f'genqr:{username}'
135 a47eb4c Dawsh 2y ago )
136 a47eb4c Dawsh 2y ago )
137 a47eb4c Dawsh 2y ago keyboard.add(
138 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
139 a47eb4c Dawsh 2y ago text='🔙 Back',
140 a47eb4c Dawsh 2y ago callback_data=f'user:{username}'
141 a47eb4c Dawsh 2y ago )
142 a47eb4c Dawsh 2y ago )
143 a47eb4c Dawsh 2y ago return keyboard
144 a47eb4c Dawsh 2y ago
145 a47eb4c Dawsh 2y ago
146 a47eb4c Dawsh 2y ago @staticmethod
147 a47eb4c Dawsh 2y ago def subscription_page(sub_url: str):
148 a47eb4c Dawsh 2y ago keyboard = types.InlineKeyboardMarkup()
149 a47eb4c Dawsh 2y ago if sub_url[:4] == 'http':
150 a47eb4c Dawsh 2y ago keyboard.add(types.InlineKeyboardButton(
151 a47eb4c Dawsh 2y ago text='🚀 Subscription Page',
152 a47eb4c Dawsh 2y ago url=sub_url))
153 a47eb4c Dawsh 2y ago return keyboard
154 a47eb4c Dawsh 2y ago
155 a47eb4c Dawsh 2y ago
156 a47eb4c Dawsh 2y ago @staticmethod
157 a47eb4c Dawsh 2y ago def confirm_action(action: str, username: str = None):
158 a47eb4c Dawsh 2y ago keyboard = types.InlineKeyboardMarkup()
159 a47eb4c Dawsh 2y ago keyboard.add(
160 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
161 a47eb4c Dawsh 2y ago text='Yes',
162 9bfa731 Dawsh 2y ago callback_data=f"{action}:{username}"
163 a47eb4c Dawsh 2y ago ),
164 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
165 a47eb4c Dawsh 2y ago text='No',
166 a47eb4c Dawsh 2y ago callback_data=f"cancel"
167 a47eb4c Dawsh 2y ago )
168 a47eb4c Dawsh 2y ago )
169 a47eb4c Dawsh 2y ago return keyboard
170 a47eb4c Dawsh 2y ago
171 a47eb4c Dawsh 2y ago @staticmethod
172 a47eb4c Dawsh 2y ago def inline_cancel_action(callback_data: str = "cancel"):
173 a47eb4c Dawsh 2y ago keyboard = types.InlineKeyboardMarkup()
174 a47eb4c Dawsh 2y ago keyboard.add(
175 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
176 a47eb4c Dawsh 2y ago text="🔙 Cancel",
177 a47eb4c Dawsh 2y ago callback_data=callback_data
178 a47eb4c Dawsh 2y ago )
179 a47eb4c Dawsh 2y ago )
180 a47eb4c Dawsh 2y ago return keyboard
181 a47eb4c Dawsh 2y ago
182 a47eb4c Dawsh 2y ago @staticmethod
183 a47eb4c Dawsh 2y ago def user_list(users: list, page: int, total_pages: int):
184 a47eb4c Dawsh 2y ago keyboard = types.InlineKeyboardMarkup()
185 a47eb4c Dawsh 2y ago if len(users) >= 2:
186 a47eb4c Dawsh 2y ago users = [p for p in users]
187 a47eb4c Dawsh 2y ago users = [users[i:i + 2] for i in range(0, len(users), 2)]
188 a47eb4c Dawsh 2y ago else:
189 a47eb4c Dawsh 2y ago users = [users]
190 a47eb4c Dawsh 2y ago for user in users:
191 a47eb4c Dawsh 2y ago row = []
192 a47eb4c Dawsh 2y ago for p in user:
193 a47eb4c Dawsh 2y ago status = {
194 a47eb4c Dawsh 2y ago 'active': '✅',
195 a47eb4c Dawsh 2y ago 'expired': '🕰',
196 a47eb4c Dawsh 2y ago 'limited': '📵',
197 a47eb4c Dawsh 2y ago 'disabled': '❌'
198 a47eb4c Dawsh 2y ago }
199 a47eb4c Dawsh 2y ago row.append(types.InlineKeyboardButton(
200 a47eb4c Dawsh 2y ago text=f"{p.username} ({status[p.status]})",
201 a47eb4c Dawsh 2y ago callback_data=f'user:{p.username}:{page}'
202 a47eb4c Dawsh 2y ago ))
203 a47eb4c Dawsh 2y ago keyboard.row(*row)
204 a47eb4c Dawsh 2y ago # if there is more than one page
205 a47eb4c Dawsh 2y ago if total_pages > 1:
206 a47eb4c Dawsh 2y ago if page > 1:
207 a47eb4c Dawsh 2y ago keyboard.add(
208 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
209 a47eb4c Dawsh 2y ago text="⬅️ Previous",
210 a47eb4c Dawsh 2y ago callback_data=f'users:{page - 1}'
211 a47eb4c Dawsh 2y ago )
212 a47eb4c Dawsh 2y ago )
213 a47eb4c Dawsh 2y ago if page < total_pages:
214 a47eb4c Dawsh 2y ago keyboard.add(
215 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
216 a47eb4c Dawsh 2y ago text="➡️ Next",
217 a47eb4c Dawsh 2y ago callback_data=f'users:{page + 1}'
218 a47eb4c Dawsh 2y ago )
219 a47eb4c Dawsh 2y ago )
220 a47eb4c Dawsh 2y ago keyboard.add(
221 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
222 a47eb4c Dawsh 2y ago text='🔙 Back',
223 a47eb4c Dawsh 2y ago callback_data='cancel'
224 a47eb4c Dawsh 2y ago )
225 a47eb4c Dawsh 2y ago )
226 a47eb4c Dawsh 2y ago return keyboard
227 a47eb4c Dawsh 2y ago
228 a47eb4c Dawsh 2y ago @staticmethod
229 9bfa731 Dawsh 2y ago def select_services(services,
230 9bfa731 Dawsh 2y ago selected_services: List[int],
231 9bfa731 Dawsh 2y ago action: Literal["edit", "create"],
232 9bfa731 Dawsh 2y ago username: str = None,
233 9bfa731 Dawsh 2y ago data_limit: float = None,
234 9bfa731 Dawsh 2y ago expire_date: dt = None):
235 9bfa731 Dawsh 2y ago
236 a47eb4c Dawsh 2y ago keyboard = types.InlineKeyboardMarkup()
237 a47eb4c Dawsh 2y ago
238 a47eb4c Dawsh 2y ago if action == "edit":
239 a47eb4c Dawsh 2y ago keyboard.add(
240 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
241 a47eb4c Dawsh 2y ago text="⚠️ Data Limit:",
242 a47eb4c Dawsh 2y ago callback_data=f"help_edit"
243 a47eb4c Dawsh 2y ago )
244 a47eb4c Dawsh 2y ago )
245 a47eb4c Dawsh 2y ago keyboard.add(
246 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
247 a47eb4c Dawsh 2y ago text=f"{readable_size(data_limit) if data_limit else 'Unlimited'}",
248 a47eb4c Dawsh 2y ago callback_data=f"help_edit"
249 a47eb4c Dawsh 2y ago ),
250 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
251 a47eb4c Dawsh 2y ago text="✏️ Edit",
252 a47eb4c Dawsh 2y ago callback_data=f"edit_user:{username}:data"
253 a47eb4c Dawsh 2y ago )
254 a47eb4c Dawsh 2y ago )
255 a47eb4c Dawsh 2y ago keyboard.add(
256 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
257 a47eb4c Dawsh 2y ago text="📅 Expire Date:",
258 a47eb4c Dawsh 2y ago callback_data=f"help_edit"
259 a47eb4c Dawsh 2y ago )
260 a47eb4c Dawsh 2y ago )
261 a47eb4c Dawsh 2y ago keyboard.add(
262 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
263 a47eb4c Dawsh 2y ago text=f"{expire_date.strftime('%Y-%m-%d') if expire_date else 'Never'}",
264 a47eb4c Dawsh 2y ago callback_data=f"help_edit"
265 a47eb4c Dawsh 2y ago ),
266 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
267 a47eb4c Dawsh 2y ago text="✏️ Edit",
268 a47eb4c Dawsh 2y ago callback_data=f"edit_user:{username}:expire"
269 a47eb4c Dawsh 2y ago )
270 a47eb4c Dawsh 2y ago )
271 9bfa731 Dawsh 2y ago for s in services:
272 9bfa731 Dawsh 2y ago keyboard.add(
273 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
274 9bfa731 Dawsh 2y ago text=f"🌐 {s.name} {'✅' if s.id in selected_services else '❌'}",
275 9bfa731 Dawsh 2y ago callback_data=f"switch_service:{s.id}:{action}"
276 a47eb4c Dawsh 2y ago )
277 9bfa731 Dawsh 2y ago )
278 a47eb4c Dawsh 2y ago keyboard.add(
279 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
280 a47eb4c Dawsh 2y ago text='Done',
281 9bfa731 Dawsh 2y ago callback_data='edit_user_done' if action == "edit" else 'add_user_done'
282 a47eb4c Dawsh 2y ago )
283 a47eb4c Dawsh 2y ago )
284 a47eb4c Dawsh 2y ago keyboard.add(
285 a47eb4c Dawsh 2y ago types.InlineKeyboardButton(
286 a47eb4c Dawsh 2y ago text='Cancel',
287 a47eb4c Dawsh 2y ago callback_data=f'user:{username}' if action == "edit" else 'cancel'
288 a47eb4c Dawsh 2y ago )
289 a47eb4c Dawsh 2y ago )
290 a47eb4c Dawsh 2y ago
291 9bfa731 Dawsh 2y ago return keyboard