Edit on GitHub

src.kb

Все кнопки и клавиатуры для хендлеров

  1"""Все кнопки и клавиатуры для хендлеров"""
  2
  3from aiogram.types import (
  4    InlineKeyboardButton,
  5    InlineKeyboardMarkup,
  6    KeyboardButton,
  7    ReplyKeyboardMarkup,
  8)
  9from pytils.numeral import get_plural
 10
 11from core.config import settings
 12from db.models import UserActivity, UserData
 13from text import rates
 14
 15static_join_button = InlineKeyboardMarkup(
 16    inline_keyboard=[
 17        [InlineKeyboardButton(text="Присоединиться!", callback_data="start_app")]
 18    ]
 19)
 20"""Клавиатура для кнопки "Присоединиться!".
 21
 22    Используется для приглашения пользователя присоединиться к приложению.
 23"""
 24
 25static_wg_url = InlineKeyboardMarkup(
 26    inline_keyboard=[
 27        [
 28            InlineKeyboardButton(
 29                text="Скачать WireGuard", url="https://www.wireguard.com/install/"
 30            )
 31        ]
 32    ]
 33)
 34"""Клавиатура с кнопкой для скачивания WireGuard.
 35
 36    Предоставляет пользователю ссылку на установку WireGuard.
 37"""
 38
 39static_wg_platform_keyboard = InlineKeyboardMarkup(
 40    inline_keyboard=[
 41        [
 42            InlineKeyboardButton(
 43                text="Windows", callback_data="wg_help_info_Windows_start"
 44            ),
 45            InlineKeyboardButton(
 46                text="Linux", callback_data="wg_help_info_Linux_start"
 47            ),
 48            InlineKeyboardButton(
 49                text="macOS", callback_data="wg_help_info_macOS_start"
 50            ),
 51        ],
 52        [
 53            InlineKeyboardButton(
 54                text="Android", callback_data="wg_help_info_Android_start"
 55            ),
 56            InlineKeyboardButton(text="iOS", callback_data="wg_help_info_iOS_start"),
 57        ],
 58    ]
 59)
 60"""Клавиатура для выбора платформы WireGuard.
 61
 62    Позволяет пользователю выбрать операционную систему для получения
 63    соответствующей информации по настройке WireGuard.
 64"""
 65
 66static_reg_button = InlineKeyboardMarkup(
 67    inline_keyboard=[
 68        [InlineKeyboardButton(text="Зарегистироваться", callback_data="register_user")]
 69    ]
 70)
 71"""Клавиатура с кнопкой регистрации.
 72
 73    Используется для начала процесса регистрации нового пользователя.
 74"""
 75
 76static_pay_button = InlineKeyboardMarkup(
 77    inline_keyboard=[
 78        [InlineKeyboardButton(text="Купить подписку", callback_data="user_payment")]
 79    ]
 80)
 81"""Клавиатура с кнопкой для покупки подписки.
 82
 83    Позволяет пользователю перейти к процессу покупки подписки.
 84"""
 85
 86static_start_button = ReplyKeyboardMarkup(
 87    keyboard=[
 88        [
 89            KeyboardButton(text="Перезагрузка"),
 90            KeyboardButton(text="Статус"),
 91        ],
 92        [
 93            KeyboardButton(text="Подключения"),
 94            KeyboardButton(text="Подписка"),
 95        ],
 96        [
 97            KeyboardButton(text="Помощь"),
 98            KeyboardButton(text="Чат"),
 99        ],
100    ],
101    resize_keyboard=True,
102    input_field_placeholder="Выберите действие или введите команду",
103)
104"""Клавиатура для основных действий пользователя.
105
106    Предоставляет пользователю выбор действий, таких как перезагрузка,
107    проверка статуса, подключений, подписки и получения помощи.
108"""
109
110static_support_button = InlineKeyboardMarkup(
111    inline_keyboard=[
112        [InlineKeyboardButton(text="Доложить о проблеме", callback_data="call_support")]
113    ]
114)
115"""Клавиатура с кнопкой для обращения в службу поддержки.
116
117    Позволяет пользователю сообщить о проблеме или запросить помощь.
118"""
119
120static_balance_button = InlineKeyboardMarkup(
121    inline_keyboard=[
122        [InlineKeyboardButton(text="Пополнить баланс", callback_data="top_up_balance")]
123    ]
124)
125"""Клавиатура с кнопкой для пополнения баланса.
126
127    Позволяет пользователю перейти к процессу пополнения своего баланса.
128"""
129
130why_freezed_button = InlineKeyboardMarkup(
131    inline_keyboard=[
132        [
133            InlineKeyboardButton(
134                text="Почему моя конфигурация заморожена?", callback_data="freeze_info"
135            )
136        ]
137    ]
138)
139"""Клавиатура с кнопкой для получения информации о замороженной конфигурации.
140
141    Позволяет пользователю узнать причины, по которым его конфигурация заморожена.
142"""
143
144freeze_user_button = InlineKeyboardMarkup(
145    inline_keyboard=[
146        [
147            InlineKeyboardButton(
148                text="Заморозить аккаунт", callback_data="freeze_account"
149            )
150        ]
151    ]
152)
153"""Клавиатура с кнопкой для заморозки аккаунта.
154
155    Позволяет пользователю инициировать процесс заморозки своего аккаунта.
156"""
157
158static_history_button = InlineKeyboardMarkup(
159    inline_keyboard=[
160        [
161            InlineKeyboardButton(
162                text="Пополнения", callback_data="transact_history_in"
163            ),
164            InlineKeyboardButton(text="Снятия", callback_data="transact_history_out"),
165        ],
166    ]
167)
168"""Клавиатура для отображения истории транзакций.
169
170    Позволяет пользователю просмотреть историю пополнений и снятий средств.
171"""
172
173
174def get_help_menu(name, user_id):
175    """Создает меню помощи для пользователя.
176
177    Args:
178        name (str): Имя пользователя.
179        user_id (int): ID пользователя.
180
181    Returns:
182        InlineKeyboardMarkup: Клавиатура с кнопками помощи.
183    """
184    return InlineKeyboardMarkup(
185        inline_keyboard=[
186            [InlineKeyboardButton(text="Что это за сервис?", callback_data="bot_info")],
187            [
188                InlineKeyboardButton(
189                    text="Я первый раз. Что мне делать?",
190                    callback_data="first_help_info_start",
191                )
192            ],
193            [
194                InlineKeyboardButton(
195                    text="Как мне настроить WireGuard?", callback_data="wg_help_info"
196                )
197            ],
198            [
199                InlineKeyboardButton(
200                    text="У меня тормозит или не работает VPN",
201                    callback_data="error_help_info_start",
202                )
203            ],
204            [InlineKeyboardButton(text="Команды", callback_data="cmd_help_info")],
205            [
206                InlineKeyboardButton(
207                    text="Задать свой вопрос",
208                    url=f"{settings.subserver_url}bot/bug/create?name={name}&telegram_id={user_id}",
209                )
210            ],
211        ]
212    )
213
214
215def get_help_book_keyboard(pages: list, page: int, prefix: str):
216    """Создает клавиатуру для навигации по страницам помощи.
217
218    Args:
219        pages (list): Список страниц.
220        page (int): Номер текущей страницы.
221        prefix (str): Префикс для callback_data.
222
223    Returns:
224        InlineKeyboardMarkup: Клавиатура с кнопками навигации.
225    """
226    prev_page = page - 1
227    next_page = page + 1
228    if page == 0:
229        return InlineKeyboardMarkup(
230            inline_keyboard=[
231                [
232                    InlineKeyboardButton(
233                        text="Следующий шаг",
234                        callback_data=f"{prefix}_{next_page}",
235                    )
236                ]
237            ]
238        )
239    if page == len(pages) - 1:
240        return InlineKeyboardMarkup(
241            inline_keyboard=[
242                [
243                    InlineKeyboardButton(
244                        text="Предыдущий шаг",
245                        callback_data=f"{prefix}_{prev_page}",
246                    )
247                ],
248                [
249                    InlineKeyboardButton(
250                        text="Покажи весь алгоритм", callback_data=f"{prefix}_all"
251                    )
252                ],
253            ]
254        )
255    return InlineKeyboardMarkup(
256        inline_keyboard=[
257            [
258                InlineKeyboardButton(
259                    text="Предыдущий шаг", callback_data=f"{prefix}_{prev_page}"
260                ),
261                InlineKeyboardButton(
262                    text="Следующий шаг", callback_data=f"{prefix}_{next_page}"
263                ),
264            ],
265        ]
266    )
267
268
269def get_account_keyboard(user_data: UserData, extended=False):
270    """Создает клавиатуру для управления аккаунтом пользователя.
271
272    Args:
273        user_data (UserData): Данные пользователя.
274        extended (bool, optional): Если True, добавляются дополнительные кнопки.
275
276    Returns:
277        InlineKeyboardMarkup: Клавиатура с кнопками управления аккаунтом.
278    """
279    buttons = []
280    match getattr(user_data, "active", None):
281        case UserActivity.active | UserActivity.inactive:
282            buttons.append(
283                [
284                    InlineKeyboardButton(
285                        text="❄️ Заморозить аккаунт", callback_data="freeze_account_info"
286                    )
287                ]
288            )
289        case UserActivity.freezed:
290            buttons.append(
291                [
292                    InlineKeyboardButton(
293                        text="🔥 Разморозить аккаунт", callback_data="recover_account"
294                    )
295                ]
296            )
297        case UserActivity.banned:
298            buttons.append(
299                [
300                    InlineKeyboardButton(
301                        text="Подать заявку на разбан",
302                        url=f"{settings.subserver_url}bot/bug/create?name={user_data.telegram_name}&telegram_id={user_data.telegram_id}",
303                    )
304                ]
305            )
306            return InlineKeyboardMarkup(inline_keyboard=buttons)
307        case _:
308            buttons.append(
309                [
310                    InlineKeyboardButton(
311                        text="Зарегистироваться", callback_data="register_user"
312                    )
313                ]
314            )
315            return InlineKeyboardMarkup(inline_keyboard=buttons)
316    buttons.extend(
317        [
318            [
319                InlineKeyboardButton(
320                    text="📂 Мои конфигурации", callback_data="user_configurations"
321                )
322            ],
323            [InlineKeyboardButton(text="🤩 Подписка", callback_data="user_payment")],
324            [InlineKeyboardButton(text="🆘 Помощь", callback_data="main_help")],
325        ]
326    )
327    if not extended:
328        buttons.extend(
329            [
330                [
331                    InlineKeyboardButton(
332                        text="⏬ Инструменты", callback_data="extra_function_open"
333                    )
334                ]
335            ]
336        )
337    else:
338        buttons.extend(
339            [
340                [
341                    InlineKeyboardButton(
342                        text="⏫ Инструменты", callback_data="extra_function_close"
343                    )
344                ],
345                [
346                    InlineKeyboardButton(
347                        text="💬 Наш чат", callback_data="invite_to_chat"
348                    )
349                ],
350                [
351                    InlineKeyboardButton(
352                        text="🆔 Мой ID", callback_data="user_id_info"
353                    ),
354                    InlineKeyboardButton(
355                        text="🔊 Unmute" if user_data.mute else "🔇 Mute",
356                        callback_data="user_mute_toggle",
357                    ),
358                ],
359                [
360                    InlineKeyboardButton(
361                        text="🔍 Сервер", callback_data="server_status"
362                    ),
363                    InlineKeyboardButton(
364                        text="⚡️ Скорость VPN", callback_data="server_speed"
365                    ),
366                ],
367            ]
368        )
369    return InlineKeyboardMarkup(inline_keyboard=buttons)
370
371
372def get_config_keyboard():
373    """Создает клавиатуру для создания конфигурации.
374
375    Returns:
376        tuple: Кортеж из клавиатур для создания конфигурации и выбора формата.
377    """
378    buttons = []
379    cfgs = []
380    cfgs.append(
381        [
382            InlineKeyboardButton(text="TEXT", callback_data="create_conf_text"),
383            InlineKeyboardButton(text="QR", callback_data="create_conf_qr"),
384            InlineKeyboardButton(text="FILE", callback_data="create_conf_file"),
385            InlineKeyboardButton(text="🚮", callback_data="remove_config_confirm"),
386        ]
387    )
388    buttons.append(
389        [
390            InlineKeyboardButton(
391                text="Создать конфигурацию", callback_data="create_configuration"
392            ),
393        ]
394    )
395    return (
396        InlineKeyboardMarkup(inline_keyboard=buttons),
397        InlineKeyboardMarkup(inline_keyboard=cfgs),
398    )
399
400
401def get_subscr_buttons(user_data: UserData, force_rates=False):
402    """Создает клавиатуру для выбора подписки.
403
404    Args:
405        user_data (UserData): Данные пользователя.
406        force_rates (bool, optional): Если True, принудительно отображает тарифы.
407
408    Returns:
409        InlineKeyboardMarkup: Клавиатура с кнопками подписки.
410    """
411    buttons = []
412    my_rate = rates.get(user_data.stage, None)
413    if my_rate or force_rates:
414        for key, rate in rates.items():
415            if rate == my_rate:
416                prefix = "✅ "
417            elif not user_data.free and key == 0.3:
418                prefix = "❌ "
419            else:
420                prefix = ""
421            buttons.append(
422                [
423                    InlineKeyboardButton(
424                        text=f"{prefix}{rate} тариф", callback_data=f"rate_info_{key}"
425                    )
426                ]
427            )
428        if not force_rates:
429            buttons.append(
430                [
431                    InlineKeyboardButton(
432                        text="Пополнить баланс", callback_data="top_up_balance"
433                    ),
434                    InlineKeyboardButton(
435                        text="История операций", callback_data="transact_history"
436                    ),
437                ],
438            )
439    else:
440        buttons.extend(
441            [
442                [
443                    InlineKeyboardButton(
444                        text="Выбрать тариф", callback_data="change_rate"
445                    )
446                ],
447                [
448                    InlineKeyboardButton(
449                        text="Пополнить баланс", callback_data="top_up_balance"
450                    ),
451                    InlineKeyboardButton(
452                        text="История операций", callback_data="transact_history"
453                    ),
454                ],
455            ]
456        )
457    keyboard = InlineKeyboardMarkup(inline_keyboard=buttons)
458    return keyboard
459
460
461def get_rate_button(rate: int):
462    """Создает кнопку для выбора тарифа.
463
464    Args:
465        rate (int): Значение тарифа.
466
467    Returns:
468        InlineKeyboardMarkup: Клавиатура с кнопкой выбора тарифа.
469    """
470    return InlineKeyboardMarkup(
471        inline_keyboard=[
472            [
473                InlineKeyboardButton(
474                    text="Выбрать этот тариф", callback_data=f"accept_rate_{rate}"
475                )
476            ]
477        ]
478    )
479
480
481def get_pay_keyboard():
482    """Создает клавиатуру для выбора суммы оплаты.
483
484    Returns:
485        InlineKeyboardMarkup: Клавиатура с кнопками для оплаты.
486    """
487    buttons = [
488        [
489            InlineKeyboardButton(text="100", callback_data="pay_sub_100"),
490            InlineKeyboardButton(text="250", callback_data="pay_sub_250"),
491            InlineKeyboardButton(text="500", callback_data="pay_sub_500"),
492            InlineKeyboardButton(text="1000", callback_data="pay_sub_1000"),
493        ]
494    ]
495    keyboard = InlineKeyboardMarkup(inline_keyboard=buttons)
496    return keyboard
497
498
499def get_bug_report_url(name, user_id):
500    """Создает кнопку для заполнения формы обращения.
501
502    Args:
503        name (str): Имя пользователя.
504        user_id (int): ID пользователя.
505
506    Returns:
507        InlineKeyboardMarkup: Клавиатура с кнопкой для заполнения формы обращения.
508    """
509    return InlineKeyboardMarkup(
510        inline_keyboard=[
511            [
512                InlineKeyboardButton(
513                    text="Заполнить форму обращения",
514                    url=f"{settings.subserver_url}bot/bug/create?name={name}&telegram_id={user_id}",
515                )
516            ]
517        ]
518    )
519
520
521def get_pay_url(sum, url):
522    """Создает кнопку для пополнения баланса.
523
524    Args:
525        sum (float): Сумма пополнения.
526        url (str): URL для пополнения.
527
528    Returns:
529        InlineKeyboardMarkup: Клавиатура с кнопкой для пополнения.
530    """
531    return InlineKeyboardMarkup(
532        inline_keyboard=[
533            [
534                InlineKeyboardButton(
535                    text=f"Пополнить на {get_plural(sum, 'рубль, рубля, рублей')}",
536                    url=url,
537                )
538            ]
539        ]
540    )
541
542
543def get_chat_button(url):
544    """Создает кнопку для получения доступа в чат.
545
546    Args:
547        url (str): URL для доступа в чат.
548
549    Returns:
550        InlineKeyboardMarkup: Клавиатура с кнопкой для доступа в чат.
551    """
552    return InlineKeyboardMarkup(
553        inline_keyboard=[
554            [
555                InlineKeyboardButton(
556                    text="🌟Получить доступ в чат",
557                    url=url,
558                )
559            ]
560        ]
561    )
562
563
564def remove_config():
565    buttons = [
566        [
567            InlineKeyboardButton(text="Удалить", callback_data="remove_config"),
568            InlineKeyboardButton(text="Отмена", callback_data="remove_config_cancel"),
569        ]
570    ]
571    keyboard = InlineKeyboardMarkup(inline_keyboard=buttons)
572    return keyboard
static_join_button = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text='Присоединиться!', url=None, callback_data='start_app', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None)]])

Клавиатура для кнопки "Присоединиться!".

Используется для приглашения пользователя присоединиться к приложению.

static_wg_url = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text='Скачать WireGuard', url='https://www.wireguard.com/install/', callback_data=None, web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None)]])

Клавиатура с кнопкой для скачивания WireGuard.

Предоставляет пользователю ссылку на установку WireGuard.

static_wg_platform_keyboard = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text='Windows', url=None, callback_data='wg_help_info_Windows_start', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None), InlineKeyboardButton(text='Linux', url=None, callback_data='wg_help_info_Linux_start', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None), InlineKeyboardButton(text='macOS', url=None, callback_data='wg_help_info_macOS_start', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None)], [InlineKeyboardButton(text='Android', url=None, callback_data='wg_help_info_Android_start', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None), InlineKeyboardButton(text='iOS', url=None, callback_data='wg_help_info_iOS_start', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None)]])

Клавиатура для выбора платформы WireGuard.

Позволяет пользователю выбрать операционную систему для получения соответствующей информации по настройке WireGuard.

static_reg_button = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text='Зарегистироваться', url=None, callback_data='register_user', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None)]])

Клавиатура с кнопкой регистрации.

Используется для начала процесса регистрации нового пользователя.

static_pay_button = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text='Купить подписку', url=None, callback_data='user_payment', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None)]])

Клавиатура с кнопкой для покупки подписки.

Позволяет пользователю перейти к процессу покупки подписки.

static_start_button = ReplyKeyboardMarkup(keyboard=[[KeyboardButton(text='Перезагрузка', request_users=None, request_chat=None, request_contact=None, request_location=None, request_poll=None, web_app=None, request_user=None), KeyboardButton(text='Статус', request_users=None, request_chat=None, request_contact=None, request_location=None, request_poll=None, web_app=None, request_user=None)], [KeyboardButton(text='Подключения', request_users=None, request_chat=None, request_contact=None, request_location=None, request_poll=None, web_app=None, request_user=None), KeyboardButton(text='Подписка', request_users=None, request_chat=None, request_contact=None, request_location=None, request_poll=None, web_app=None, request_user=None)], [KeyboardButton(text='Помощь', request_users=None, request_chat=None, request_contact=None, request_location=None, request_poll=None, web_app=None, request_user=None), KeyboardButton(text='Чат', request_users=None, request_chat=None, request_contact=None, request_location=None, request_poll=None, web_app=None, request_user=None)]], is_persistent=None, resize_keyboard=True, one_time_keyboard=None, input_field_placeholder='Выберите действие или введите команду', selective=None)

Клавиатура для основных действий пользователя.

Предоставляет пользователю выбор действий, таких как перезагрузка, проверка статуса, подключений, подписки и получения помощи.

static_support_button = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text='Доложить о проблеме', url=None, callback_data='call_support', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None)]])

Клавиатура с кнопкой для обращения в службу поддержки.

Позволяет пользователю сообщить о проблеме или запросить помощь.

static_balance_button = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text='Пополнить баланс', url=None, callback_data='top_up_balance', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None)]])

Клавиатура с кнопкой для пополнения баланса.

Позволяет пользователю перейти к процессу пополнения своего баланса.

why_freezed_button = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text='Почему моя конфигурация заморожена?', url=None, callback_data='freeze_info', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None)]])

Клавиатура с кнопкой для получения информации о замороженной конфигурации.

Позволяет пользователю узнать причины, по которым его конфигурация заморожена.

freeze_user_button = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text='Заморозить аккаунт', url=None, callback_data='freeze_account', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None)]])

Клавиатура с кнопкой для заморозки аккаунта.

Позволяет пользователю инициировать процесс заморозки своего аккаунта.

static_history_button = InlineKeyboardMarkup(inline_keyboard=[[InlineKeyboardButton(text='Пополнения', url=None, callback_data='transact_history_in', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None), InlineKeyboardButton(text='Снятия', url=None, callback_data='transact_history_out', web_app=None, login_url=None, switch_inline_query=None, switch_inline_query_current_chat=None, switch_inline_query_chosen_chat=None, copy_text=None, callback_game=None, pay=None)]])

Клавиатура для отображения истории транзакций.

Позволяет пользователю просмотреть историю пополнений и снятий средств.

def get_help_menu(name, user_id):
175def get_help_menu(name, user_id):
176    """Создает меню помощи для пользователя.
177
178    Args:
179        name (str): Имя пользователя.
180        user_id (int): ID пользователя.
181
182    Returns:
183        InlineKeyboardMarkup: Клавиатура с кнопками помощи.
184    """
185    return InlineKeyboardMarkup(
186        inline_keyboard=[
187            [InlineKeyboardButton(text="Что это за сервис?", callback_data="bot_info")],
188            [
189                InlineKeyboardButton(
190                    text="Я первый раз. Что мне делать?",
191                    callback_data="first_help_info_start",
192                )
193            ],
194            [
195                InlineKeyboardButton(
196                    text="Как мне настроить WireGuard?", callback_data="wg_help_info"
197                )
198            ],
199            [
200                InlineKeyboardButton(
201                    text="У меня тормозит или не работает VPN",
202                    callback_data="error_help_info_start",
203                )
204            ],
205            [InlineKeyboardButton(text="Команды", callback_data="cmd_help_info")],
206            [
207                InlineKeyboardButton(
208                    text="Задать свой вопрос",
209                    url=f"{settings.subserver_url}bot/bug/create?name={name}&telegram_id={user_id}",
210                )
211            ],
212        ]
213    )

Создает меню помощи для пользователя.

Arguments:
  • name (str): Имя пользователя.
  • user_id (int): ID пользователя.
Returns:

InlineKeyboardMarkup: Клавиатура с кнопками помощи.

def get_help_book_keyboard(pages: list, page: int, prefix: str):
216def get_help_book_keyboard(pages: list, page: int, prefix: str):
217    """Создает клавиатуру для навигации по страницам помощи.
218
219    Args:
220        pages (list): Список страниц.
221        page (int): Номер текущей страницы.
222        prefix (str): Префикс для callback_data.
223
224    Returns:
225        InlineKeyboardMarkup: Клавиатура с кнопками навигации.
226    """
227    prev_page = page - 1
228    next_page = page + 1
229    if page == 0:
230        return InlineKeyboardMarkup(
231            inline_keyboard=[
232                [
233                    InlineKeyboardButton(
234                        text="Следующий шаг",
235                        callback_data=f"{prefix}_{next_page}",
236                    )
237                ]
238            ]
239        )
240    if page == len(pages) - 1:
241        return InlineKeyboardMarkup(
242            inline_keyboard=[
243                [
244                    InlineKeyboardButton(
245                        text="Предыдущий шаг",
246                        callback_data=f"{prefix}_{prev_page}",
247                    )
248                ],
249                [
250                    InlineKeyboardButton(
251                        text="Покажи весь алгоритм", callback_data=f"{prefix}_all"
252                    )
253                ],
254            ]
255        )
256    return InlineKeyboardMarkup(
257        inline_keyboard=[
258            [
259                InlineKeyboardButton(
260                    text="Предыдущий шаг", callback_data=f"{prefix}_{prev_page}"
261                ),
262                InlineKeyboardButton(
263                    text="Следующий шаг", callback_data=f"{prefix}_{next_page}"
264                ),
265            ],
266        ]
267    )

Создает клавиатуру для навигации по страницам помощи.

Arguments:
  • pages (list): Список страниц.
  • page (int): Номер текущей страницы.
  • prefix (str): Префикс для callback_data.
Returns:

InlineKeyboardMarkup: Клавиатура с кнопками навигации.

def get_account_keyboard(user_data: db.models.userdata.UserData, extended=False):
270def get_account_keyboard(user_data: UserData, extended=False):
271    """Создает клавиатуру для управления аккаунтом пользователя.
272
273    Args:
274        user_data (UserData): Данные пользователя.
275        extended (bool, optional): Если True, добавляются дополнительные кнопки.
276
277    Returns:
278        InlineKeyboardMarkup: Клавиатура с кнопками управления аккаунтом.
279    """
280    buttons = []
281    match getattr(user_data, "active", None):
282        case UserActivity.active | UserActivity.inactive:
283            buttons.append(
284                [
285                    InlineKeyboardButton(
286                        text="❄️ Заморозить аккаунт", callback_data="freeze_account_info"
287                    )
288                ]
289            )
290        case UserActivity.freezed:
291            buttons.append(
292                [
293                    InlineKeyboardButton(
294                        text="🔥 Разморозить аккаунт", callback_data="recover_account"
295                    )
296                ]
297            )
298        case UserActivity.banned:
299            buttons.append(
300                [
301                    InlineKeyboardButton(
302                        text="Подать заявку на разбан",
303                        url=f"{settings.subserver_url}bot/bug/create?name={user_data.telegram_name}&telegram_id={user_data.telegram_id}",
304                    )
305                ]
306            )
307            return InlineKeyboardMarkup(inline_keyboard=buttons)
308        case _:
309            buttons.append(
310                [
311                    InlineKeyboardButton(
312                        text="Зарегистироваться", callback_data="register_user"
313                    )
314                ]
315            )
316            return InlineKeyboardMarkup(inline_keyboard=buttons)
317    buttons.extend(
318        [
319            [
320                InlineKeyboardButton(
321                    text="📂 Мои конфигурации", callback_data="user_configurations"
322                )
323            ],
324            [InlineKeyboardButton(text="🤩 Подписка", callback_data="user_payment")],
325            [InlineKeyboardButton(text="🆘 Помощь", callback_data="main_help")],
326        ]
327    )
328    if not extended:
329        buttons.extend(
330            [
331                [
332                    InlineKeyboardButton(
333                        text="⏬ Инструменты", callback_data="extra_function_open"
334                    )
335                ]
336            ]
337        )
338    else:
339        buttons.extend(
340            [
341                [
342                    InlineKeyboardButton(
343                        text="⏫ Инструменты", callback_data="extra_function_close"
344                    )
345                ],
346                [
347                    InlineKeyboardButton(
348                        text="💬 Наш чат", callback_data="invite_to_chat"
349                    )
350                ],
351                [
352                    InlineKeyboardButton(
353                        text="🆔 Мой ID", callback_data="user_id_info"
354                    ),
355                    InlineKeyboardButton(
356                        text="🔊 Unmute" if user_data.mute else "🔇 Mute",
357                        callback_data="user_mute_toggle",
358                    ),
359                ],
360                [
361                    InlineKeyboardButton(
362                        text="🔍 Сервер", callback_data="server_status"
363                    ),
364                    InlineKeyboardButton(
365                        text="⚡️ Скорость VPN", callback_data="server_speed"
366                    ),
367                ],
368            ]
369        )
370    return InlineKeyboardMarkup(inline_keyboard=buttons)

Создает клавиатуру для управления аккаунтом пользователя.

Arguments:
  • user_data (UserData): Данные пользователя.
  • extended (bool, optional): Если True, добавляются дополнительные кнопки.
Returns:

InlineKeyboardMarkup: Клавиатура с кнопками управления аккаунтом.

def get_config_keyboard():
373def get_config_keyboard():
374    """Создает клавиатуру для создания конфигурации.
375
376    Returns:
377        tuple: Кортеж из клавиатур для создания конфигурации и выбора формата.
378    """
379    buttons = []
380    cfgs = []
381    cfgs.append(
382        [
383            InlineKeyboardButton(text="TEXT", callback_data="create_conf_text"),
384            InlineKeyboardButton(text="QR", callback_data="create_conf_qr"),
385            InlineKeyboardButton(text="FILE", callback_data="create_conf_file"),
386            InlineKeyboardButton(text="🚮", callback_data="remove_config_confirm"),
387        ]
388    )
389    buttons.append(
390        [
391            InlineKeyboardButton(
392                text="Создать конфигурацию", callback_data="create_configuration"
393            ),
394        ]
395    )
396    return (
397        InlineKeyboardMarkup(inline_keyboard=buttons),
398        InlineKeyboardMarkup(inline_keyboard=cfgs),
399    )

Создает клавиатуру для создания конфигурации.

Returns:

tuple: Кортеж из клавиатур для создания конфигурации и выбора формата.

def get_subscr_buttons(user_data: db.models.userdata.UserData, force_rates=False):
402def get_subscr_buttons(user_data: UserData, force_rates=False):
403    """Создает клавиатуру для выбора подписки.
404
405    Args:
406        user_data (UserData): Данные пользователя.
407        force_rates (bool, optional): Если True, принудительно отображает тарифы.
408
409    Returns:
410        InlineKeyboardMarkup: Клавиатура с кнопками подписки.
411    """
412    buttons = []
413    my_rate = rates.get(user_data.stage, None)
414    if my_rate or force_rates:
415        for key, rate in rates.items():
416            if rate == my_rate:
417                prefix = "✅ "
418            elif not user_data.free and key == 0.3:
419                prefix = "❌ "
420            else:
421                prefix = ""
422            buttons.append(
423                [
424                    InlineKeyboardButton(
425                        text=f"{prefix}{rate} тариф", callback_data=f"rate_info_{key}"
426                    )
427                ]
428            )
429        if not force_rates:
430            buttons.append(
431                [
432                    InlineKeyboardButton(
433                        text="Пополнить баланс", callback_data="top_up_balance"
434                    ),
435                    InlineKeyboardButton(
436                        text="История операций", callback_data="transact_history"
437                    ),
438                ],
439            )
440    else:
441        buttons.extend(
442            [
443                [
444                    InlineKeyboardButton(
445                        text="Выбрать тариф", callback_data="change_rate"
446                    )
447                ],
448                [
449                    InlineKeyboardButton(
450                        text="Пополнить баланс", callback_data="top_up_balance"
451                    ),
452                    InlineKeyboardButton(
453                        text="История операций", callback_data="transact_history"
454                    ),
455                ],
456            ]
457        )
458    keyboard = InlineKeyboardMarkup(inline_keyboard=buttons)
459    return keyboard

Создает клавиатуру для выбора подписки.

Arguments:
  • user_data (UserData): Данные пользователя.
  • force_rates (bool, optional): Если True, принудительно отображает тарифы.
Returns:

InlineKeyboardMarkup: Клавиатура с кнопками подписки.

def get_rate_button(rate: int):
462def get_rate_button(rate: int):
463    """Создает кнопку для выбора тарифа.
464
465    Args:
466        rate (int): Значение тарифа.
467
468    Returns:
469        InlineKeyboardMarkup: Клавиатура с кнопкой выбора тарифа.
470    """
471    return InlineKeyboardMarkup(
472        inline_keyboard=[
473            [
474                InlineKeyboardButton(
475                    text="Выбрать этот тариф", callback_data=f"accept_rate_{rate}"
476                )
477            ]
478        ]
479    )

Создает кнопку для выбора тарифа.

Arguments:
  • rate (int): Значение тарифа.
Returns:

InlineKeyboardMarkup: Клавиатура с кнопкой выбора тарифа.

def get_pay_keyboard():
482def get_pay_keyboard():
483    """Создает клавиатуру для выбора суммы оплаты.
484
485    Returns:
486        InlineKeyboardMarkup: Клавиатура с кнопками для оплаты.
487    """
488    buttons = [
489        [
490            InlineKeyboardButton(text="100", callback_data="pay_sub_100"),
491            InlineKeyboardButton(text="250", callback_data="pay_sub_250"),
492            InlineKeyboardButton(text="500", callback_data="pay_sub_500"),
493            InlineKeyboardButton(text="1000", callback_data="pay_sub_1000"),
494        ]
495    ]
496    keyboard = InlineKeyboardMarkup(inline_keyboard=buttons)
497    return keyboard

Создает клавиатуру для выбора суммы оплаты.

Returns:

InlineKeyboardMarkup: Клавиатура с кнопками для оплаты.

def get_bug_report_url(name, user_id):
500def get_bug_report_url(name, user_id):
501    """Создает кнопку для заполнения формы обращения.
502
503    Args:
504        name (str): Имя пользователя.
505        user_id (int): ID пользователя.
506
507    Returns:
508        InlineKeyboardMarkup: Клавиатура с кнопкой для заполнения формы обращения.
509    """
510    return InlineKeyboardMarkup(
511        inline_keyboard=[
512            [
513                InlineKeyboardButton(
514                    text="Заполнить форму обращения",
515                    url=f"{settings.subserver_url}bot/bug/create?name={name}&telegram_id={user_id}",
516                )
517            ]
518        ]
519    )

Создает кнопку для заполнения формы обращения.

Arguments:
  • name (str): Имя пользователя.
  • user_id (int): ID пользователя.
Returns:

InlineKeyboardMarkup: Клавиатура с кнопкой для заполнения формы обращения.

def get_pay_url(sum, url):
522def get_pay_url(sum, url):
523    """Создает кнопку для пополнения баланса.
524
525    Args:
526        sum (float): Сумма пополнения.
527        url (str): URL для пополнения.
528
529    Returns:
530        InlineKeyboardMarkup: Клавиатура с кнопкой для пополнения.
531    """
532    return InlineKeyboardMarkup(
533        inline_keyboard=[
534            [
535                InlineKeyboardButton(
536                    text=f"Пополнить на {get_plural(sum, 'рубль, рубля, рублей')}",
537                    url=url,
538                )
539            ]
540        ]
541    )

Создает кнопку для пополнения баланса.

Arguments:
  • sum (float): Сумма пополнения.
  • url (str): URL для пополнения.
Returns:

InlineKeyboardMarkup: Клавиатура с кнопкой для пополнения.

def get_chat_button(url):
544def get_chat_button(url):
545    """Создает кнопку для получения доступа в чат.
546
547    Args:
548        url (str): URL для доступа в чат.
549
550    Returns:
551        InlineKeyboardMarkup: Клавиатура с кнопкой для доступа в чат.
552    """
553    return InlineKeyboardMarkup(
554        inline_keyboard=[
555            [
556                InlineKeyboardButton(
557                    text="🌟Получить доступ в чат",
558                    url=url,
559                )
560            ]
561        ]
562    )

Создает кнопку для получения доступа в чат.

Arguments:
  • url (str): URL для доступа в чат.
Returns:

InlineKeyboardMarkup: Клавиатура с кнопкой для доступа в чат.

def remove_config():
565def remove_config():
566    buttons = [
567        [
568            InlineKeyboardButton(text="Удалить", callback_data="remove_config"),
569            InlineKeyboardButton(text="Отмена", callback_data="remove_config_cancel"),
570        ]
571    ]
572    keyboard = InlineKeyboardMarkup(inline_keyboard=buttons)
573    return keyboard