Edit on GitHub

src.text

Текстовые константы, сообщения и функции, связанные с управлением VPN-сервисом на базе WireGuard. Триггерные сообщения для взаимодействия с пользователями, статусы аккаунтов, алгоритмы установки WireGuard на разных платформах и функции для получения информации о конфигурациях и подписках пользователей. Также в файле реализованы методы для создания конфигурационных файлов и QR-кодов, проверки состояния подписки и получения описаний тарифов.

  1"""Текстовые константы, сообщения и функции, связанные с управлением VPN-сервисом на базе WireGuard.
  2Триггерные сообщения для взаимодействия с пользователями, статусы аккаунтов,
  3алгоритмы установки WireGuard на разных платформах и функции для получения информации о конфигурациях
  4и подписках пользователей. Также в файле реализованы методы для создания конфигурационных файлов и QR-кодов,
  5проверки состояния подписки и получения описаний тарифов."""
  6
  7import os
  8import uuid
  9from dataclasses import dataclass
 10
 11import aiofiles
 12import pyqrcode
 13from pytils.numeral import get_plural
 14
 15from core.config import settings
 16from core.path import PATH
 17from db.models import UserActivity, UserData, WgConfig
 18
 19me = {"я", "мои данные", "данные", "конфиги", "мои конфиги", "config", "подключения"}
 20"""Триггерные сообщения для вызова списка конфигураций"""
 21
 22yes = {"yes", "y", "da", "да"}
 23"""Триггерные сообщения для ответа 'Да'"""
 24
 25no = {"no", "n", "нет"}
 26"""Триггерные сообщения для ответа 'Нет'"""
 27
 28only_admin = (
 29    "Данный функционал предназначен для пользования администратором. "
 30    "Если вы администратор, а мы не знаем об этом, отправьте боту секретный пароль."
 31)
 32"""Ответное сообщение об ограничении доступа к функционалу администратора"""
 33
 34DB_ERROR = "Ошибка подключения к БД. Обратитесь к администратору."
 35"""Сообщение об ошибке с БД"""
 36
 37WG_ERROR = "Ошибка подключения к серверу wireguard. Обратитесь к администратору."
 38"""Сообщение об ошибке с Wireguard сервером"""
 39
 40YOO_ERROR = "Ошибка подключения к серверу yoomoney. Попробуйте еще раз позже"
 41"""Сообщение об ошибке с сервисом Yoomoney"""
 42
 43UNPAY = (
 44    "Функционал создания конфигураций заблокирован. Действующие конфигурации заблокированы. "
 45    "Для разблокировки оплатите подписку."
 46)
 47"""Сообщение о недостатке средств на счете"""
 48
 49SERVER_STOPPED = (
 50    "Уважаемые пользователи, уведомляем вас о технических работах на сервере. "
 51    "В это время доступа к серверу не будет либо он может быть ограничен. "
 52    "Приносим свои извинения за доставленные неудобства. "
 53    "На время технических работ денежные средства со счетов пользователей списываться не будут."
 54)
 55"""Сообщение о начале технических работ на сервере"""
 56
 57SERVER_STARTED = (
 58    "Уважаемые пользователи, спешим уведомить вас, что сервер снова работоспособен. "
 59    "Еще раз приносим свои извинения за доставленные неудобства. "
 60    "В случае, если у вас возникли какие-либо проблемы во время технических работ или после них, "
 61    "сообщите нам, воспользовавшись командой `/bug`"
 62)
 63"""Сообщение об окончании технических работ на сервере"""
 64
 65rates = {0.3: "Пробный", 1: "Базовый", 2.5: "Расширенный", 5: "Люкс"}
 66"""Карта тарифов"""
 67reverse_rates = {"free": 0.3, "base": 1, "advanced": 2.5, "luxury": 5}
 68"""Обратная карта тарифов"""
 69
 70BOT_INFO = """
 71🌐 Добро пожаловать в наш VPN-сервис на базе WireGuard!
 72
 73Наш сервис предоставляет надежное и быстрое решение для обеспечения вашей онлайн-безопасности и конфиденциальности. Вот как он работает:
 74
 75🔒 Безопасное соединение: WireGuard использует современные криптографические протоколы для создания защищенного канала связи между вашим устройством и интернетом. Это означает, что ваши данные остаются в безопасности и недоступны для посторонних.
 76
 77⚡ Высокая скорость: Благодаря своей легковесной архитектуре, WireGuard обеспечивает высокую скорость соединения, что позволяет вам наслаждаться потоковым видео, играми и другими онлайн-активностями без задержек.
 78
 79🤖 Управление через чат-бота: Мы сделали процесс управления вашим VPN-сервисом максимально удобным. С помощью нашего чат-бота вы можете легко подключать себе VPN, а также получать помощь и советы по использованию сервиса.
 80
 81🔧 Простота использования: Наша платформа разработана с учетом удобства пользователей. Вы сможете быстро настроить соединение и начать пользоваться всеми преимуществами VPN без лишних усилий.
 82
 83Присоединяйтесь к нам и обеспечьте свою онлайн-безопасность уже сегодня! Если у вас есть вопросы, не стесняйтесь обращаться к нашему чат-боту — он всегда готов помочь!
 84"""
 85"""Вступительное сообщение. Информация о сервисе."""
 86
 87BOT_STEPS = [
 88    """1. <b>Запустите бота</b>: 
 89    
 90    - Если вы только что начали, введите команду /start , чтобы запустить или перезагрузить бота (🔘кнопка 'Перезагрузка').""",
 91    """2. <b>Создайте аккаунт</b>: 
 92    
 93    - Для начала работы с сервисом вам нужно зарегистрироваться. Введите команду `/reg` (либо воспользуйтесь соответствующей кнопкой в чате), чтобы создать аккаунт.""",
 94    """3. <b>Пополните баланс</b>: 
 95    
 96    - Далее вам необходимо пополнить баланс. Используйте команду `/sub` (🔘кнопка 'Подписка'), чтобы выбрать и купить тариф пользования.""",
 97    """4. <b>Создайте конфигурацию</b>: 
 98    
 99    - После пополнения баланса введите команду /create (🔘кнопка 'Подключения'), чтобы создать конфигурацию WireGuard для вашего устройства.""",
100    """5. <b>Скачайте WireGuard</b>: 
101    
102    - Убедитесь, что у вас установлено приложение WireGuard. Вы можете скачать его на официальном сайте WireGuard (https://www.wireguard.com/install/), приложение работает на Windows, macOS, Linux, Android и iOS.""",
103    """6. <b>Подключите конфигурацию</b>: 
104    
105    - После создания конфигурации получите ее (🔘кнопка 'Подключения') 
106        📄 в текстовом виде (🔘кнопка 'TEXT'),
107        
108        📱 в виде qr-кода (🔘кнопка 'QR'),
109        
110        🗂️ или скачайте файл (🔘кнопка 'FILE'), 
111        
112и импортируйте ее в приложение WireGuard. Это позволит вам установить защищенное соединение. \n(Если вы не знаете как импортировать конфигурацию, воспользуйтесь командой `/help` - 🔘'Помощь' и выберите 'Как мне настроить WireGuard?')""",
113    """7. <b>Управление аккаунтом</b>:
114    
115    - Для доступа к основному функционалу вашего аккаунта используйте команду /account или /app, либо 🔘кнопку 'Статус'.
116    - Если вам нужно временно приостановить использование сервиса, используйте /freeze (🔘'Заморозить аккаунт'), а для восстановления доступа — команду /recover (🔘'Разморозить аккаунт').""",
117    """8. <b>Получите помощь</b>: 
118    
119    - Если у вас возникли вопросы, введите /help (🔘кнопка 'Помощь'), чтобы получить информацию о доступных командах и функциях.""",
120    """9. <b>Дополнительные команды</b>:
121    
122    - Для получения списка всех команд введите /cmd .
123    - Если вы администратор, используйте команду /admin для доступа к функционалу администратора.
124    - Чтобы сообщить о баге, используйте /bug .
125    - Для получения вашего Telegram ID введите /id .
126    - Если хотите узнать время запуска бота, введите /time .""",
127]
128"""Алгоритм быстрого старта"""
129
130WG_STEPS = {
131    "Windows": [
132        """1. <b>Скачайте и установите WireGuard</b>:
133    
134    - Перейдите на официальный сайт WireGuard (https://www.wireguard.com/install/) и скачайте версию для Windows.
135    - Установите приложение, следуя инструкциям на экране.""",
136        """2. <b>Создайте конфигурационный файл</b>:
137    
138    - Пополнив баланс у чат-бота, введите команду `/create` (🔘кнопка 'Подключения'), чтобы создать конфигурацию WireGuard для вашего устройства.
139    - В появившемся меню конфигурации (🔘кнопка 'Подключения') получите файл конфигурации (🔘кнопка 'FILE') либо создайте его самостоятельно:
140    
141        ~ Откройте текстовый редактор (например, Блокнот) и вставьте конфигурацию, которую вы получили от чат-бота (🔘кнопка 'TEXT').
142        ~ Сохраните файл с расширением `.conf` , например, `my_vpn.conf` .""",
143        """3. <b>Импортируйте конфигурацию в WireGuard</b>:
144    
145    - Откройте приложение WireGuard.
146    - Нажмите на кнопку "Import tunnel from file" (Импортировать туннель из файла) и выберите созданный вами конфигурационный файл.""",
147        """4. <b>Подключитесь к VPN</b>:
148    
149    - После импорта конфигурации вы увидите ваш туннель в списке. Нажмите на кнопку "Activate" (Подключить), чтобы подключиться к VPN.""",
150        """5. <b>Проверьте подключение</b>:
151    
152    - Убедитесь, что ваше соединение активно. Вы можете проверить свой IP-адрес через любой онлайн-сервис для определения IP, чтобы убедиться, что вы подключены к VPN. (Например, https://2ip.ru/)""",
153    ],
154    "Linux": [
155        """1. <b>Установите WireGuard</b>:
156    
157    - Перейдите на официальный сайт WireGuard (https://www.wireguard.com/install/) и найдите команду установки для вашего дистрибутива.
158    - Откройте терминал.
159    - Установите приложение, следуя инструкциям на сайте.""",
160        """2. <b>Создайте конфигурационный файл</b>:
161
162    - Пополнив баланс у чат-бота, введите команду `/create` (🔘кнопка 'Подключения'), чтобы создать конфигурацию WireGuard для вашего устройства.
163    - В появившемся меню конфигурации (🔘кнопка 'Подключения') получите файл конфигурации (🔘кнопка 'FILE') либо создайте его самостоятельно:
164    
165        ~ Откройте текстовый редактор (например, `nano` или `vim` ) и создайте новый файл конфигурации. Например, `wg0.conf` .
166        ~ Вставьте конфигурацию, которую вы получили от чат-бота. 
167        ~ Сохраните файл и закройте текстовый редактор.
168        ~ Переместите конфигурацию по адресу `/etc/wireguard/wg0.conf`""",
169        """3. <b>Запустите WireGuard</b>:
170
171    - Чтобы активировать VPN-соединение, выполните следующую команду:
172    <pre>sudo wg-quick up wg0</pre>""",
173        """4. <b>Проверьте подключение</b>:
174
175    - Убедитесь, что ваше соединение активно, выполнив команду:
176    <pre>sudo wg</pre>
177
178    - Также вы можете проверить свой IP-адрес через любой онлайн-сервис для определения IP, чтобы убедиться, что вы подключены к VPN. (Например, https://2ip.ru/)""",
179        """5. <b>Отключите WireGuard</b>:
180
181    - Чтобы отключить VPN-соединение, выполните команду:
182    <pre>sudo wg-quick down wg0</pre>""",
183    ],
184    "macOS": [
185        """1. <b>Скачайте и установите приложение WireGuard</b>:
186
187    - Откройте Mac App Store на вашем Mac.
188    - Найдите приложение "WireGuard" и скачайте его (либо скачайте на официальном сайте WireGuard https://www.wireguard.com/install/).
189    - Установите приложение, следуя инструкциям на экране.""",
190        """2. <b>Создайте конфигурационный файл</b>:
191        
192    - Пополнив баланс у чат-бота, введите команду `/create` (🔘кнопка 'Подключения'), чтобы создать конфигурацию WireGuard для вашего устройства.
193    - В появившемя меню конфигурации (🔘кнопка 'Подключения') получите файл конфигурации (🔘кнопка 'FILE') либо создайте его самостоятельно:
194    
195        ~ Откройте текстовый редактор (например, TextEdit).
196        ~ Вставьте конфигурацию, которую вы получили от чат-бота. Пример конфигурации:
197        ~ Сохраните файл с расширением  `.conf` , например,  `my_vpn.conf`.""",
198        """3. <b>Импортируйте конфигурацию в WireGuard</b>:
199
200    - Откройте приложение WireGuard.
201    - Добавьте конфигурацию WireGuard, нажав кнопку «Импорт туннелей из файла...» или кнопку ✚ в нижней левой части окна приложения WireGuard и «Импорт туннелей из файла...».
202    - Настройте автоподключение для локальной сети или Wi-Fi (для всех Wi-Fi подключений или какого-то отдельного по Вашему выбору) и нажмите «Сохранить». 
203    - При добавлении новой конфигурации может появиться окно с запросом разрешения на добавление конфигураций VPN. Нажмите «Разрешить» для добавления новой конфигурации. """,
204        """4. <b>Подключитесь к VPN</b>:
205
206    - После успешного добавления конфигурации WireGuard для подключения к серверу нажмите «Подключен» в меню приложения на панели задач или «Подключение» (Activate) в программе WireGuard.  
207    - В случае успешного подключения статус изменится на «Подключен» (Active).""",
208        """2. <b>Проверьте подключение</b>:
209
210    - Убедитесь, что ваше соединение активно. Вы можете проверить свой IP-адрес через любой онлайн-сервис для определения IP, чтобы убедиться, что вы подключены к VPN. (Например, https://2ip.ru/)""",
211    ],
212    "Android": [
213        """1. <b>Скачайте и установите приложение WireGuard</b>:
214    
215    - Перейдите в Google Play Store на вашем устройстве.
216    - Найдите приложение "WireGuard" и скачайте его (либо скачайте на официальном сайте WireGuard https://www.wireguard.com/install/).
217    - Установите приложение, следуя инструкциям на экране.""",
218        """2. <b>Создайте конфигурационный файл</b>:
219        
220    - Пополнив баланс у чат-бота, введите команду `/create` (🔘кнопка 'Подключения'), чтобы создать конфигурацию WireGuard для вашего устройства.
221    - В появившемся меню конфигурации (🔘кнопка 'Подключения') получите файл конфигурации: 
222        📄 в текстовом виде (🔘кнопка 'TEXT'),
223        
224        📱 в виде qr-кода (🔘кнопка 'QR'),
225        
226        🗂️ или скачайте файл (🔘кнопка 'FILE')""",
227        """3. <b>Импортируйте конфигурацию в WireGuard</b>:
228    
229    - Откройте приложение WireGuard.
230    - Нажмите на кнопку "Добавить туннель" (или значок ✚ в правом нижнем углу).
231    - Выберите "Импорт из файла", "Сканировать QR-код", или "Создать с нуля"(для опытных) в зависимости от того, как вы сохранили конфигурацию.
232    
233    - Если вы выбрали "Импорт из файла", найдите и выберите ваш `.conf` файл. 
234    - Если вы выбрали "Сканировать QR-код", отсканируйте его в чате с ботом.
235    - Если вы выбрали "Создать с нуля", самостоятельно заполните все поля согласно полученной конфигурации.""",
236        """4. <b>Подключитесь к VPN</b>:
237    
238    - После импорта конфигурации вы увидите ваш туннель в списке. Нажмите на переключатель рядом с названием туннеля, чтобы активировать VPN-соединение.""",
239        """5. <b>Проверьте подключение</b>:
240    
241    - Убедитесь, что ваше соединение активно. Вы можете проверить свой IP-адрес через любой онлайн-сервис для определения IP, чтобы убедиться, что вы подключены к VPN. (Например, https://2ip.ru/)""",
242    ],
243    "iOS": [
244        """1. <b>Скачайте и установите приложение WireGuard</b>:
245    
246    - Откройте App Store на вашем iPhone или iPad.
247    - Найдите приложение "WireGuard" и скачайте его (либо скачайте на официальном сайте WireGuard https://www.wireguard.com/install/).
248    - Установите приложение, следуя инструкциям на экране.""",
249        """2. <b>Создайте конфигурационный файл</b>:
250        
251    - Пополнив баланс у чат-бота, введите команду `/create` (🔘кнопка 'Подключения'), чтобы создать конфигурацию WireGuard для вашего устройства.
252    - В появившемся меню конфигурации (🔘кнопка 'Подключения') получите файл конфигурации: 
253        📄 в текстовом виде (🔘кнопка 'TEXT'),
254        
255        📱 в виде qr-кода (🔘кнопка 'QR'),
256        
257        🗂️ или скачайте файл (🔘кнопка 'FILE')""",
258        """3. <b>Импортируйте конфигурацию в WireGuard</b>:
259    
260    - Откройте приложение WireGuard.
261    - Нажмите на кнопку "Добавить туннель" (или значок ✚ в правом верхнем углу).
262    - Выберите "Импорт из файла", "Сканировать QR-код", или "Создать с нуля"(для опытных) в зависимости от того, как вы сохранили конфигурацию.
263    
264    - Если вы выбрали "Импорт из файла", найдите и выберите ваш `.conf` файл. 
265    - Если вы выбрали "Сканировать QR-код", отсканируйте его в чате с ботом.
266    - Если вы выбрали "Создать с нуля", самостоятельно заполните все поля согласно полученной конфигурации.""",
267        """4. <b>Подключитесь к VPN</b>:
268    
269    - После импорта конфигурации вы увидите ваш туннель в списке. Нажмите на переключатель рядом с названием туннеля, чтобы активировать VPN-соединение.""",
270        """5. <b>Проверьте подключение</b>:
271    
272    - Убедитесь, что ваше соединение активно. Вы можете проверить свой IP-адрес через любой онлайн-сервис для определения IP, чтобы убедиться, что вы подключены к VPN. (Например, https://2ip.ru/)""",
273    ],
274}
275"""Алгоритмы установки WireGuard на различные платформы"""
276
277BOT_ERROR_STEP = [
278    """1. <b>Проверьте подключение к интернету</b>:
279    
280    - Убедитесь, что ваше устройство подключено к интернету. Попробуйте открыть веб-сайт или использовать другое приложение, чтобы проверить соединение.""",
281    """2. <b>Перезагрузите приложение WireGuard</b>:
282    
283    - Закройте приложение WireGuard и откройте его снова. Это может помочь устранить временные проблемы.""",
284    """3. <b>Переподключитесь к VPN</b>:
285    
286    - Отключите VPN-соединение и снова подключитесь. Это может помочь восстановить стабильность соединения.""",
287    """4. <b>Проверьте конфигурацию</b>:
288    
289    - Убедитесь, что вы используете правильную конфигурацию. Проверьте, что все ключи и адреса указаны корректно.""",
290    """5. <b>Проверьте настройки брандмауэра</b>:
291    
292    - Убедитесь, что брандмауэр на вашем устройстве или роутере не блокирует соединение WireGuard. Возможно, потребуется настроить исключения.""",
293    """6. <b>Обновите приложение</b>:
294    
295    - Проверьте, есть ли обновления для приложения WireGuard. Убедитесь, что вы используете последнюю версию.""",
296    """7. <b>Перезагрузите устройство</b>:
297    
298    - Перезагрузите ваше устройство. Это может помочь устранить временные сбои в работе системы.""",
299    """8. <b>Проверьте состояние сервиса</b>:
300    
301    - Убедитесь, что сервис WireGuard работает корректно: команда `/app` (🔘кнопка 'Статус'). Если есть известные проблемы, они могут быть указаны на нашем сайте или в социальных сетях.""",
302    """9. <b>Обратитесь за поддержкой</b>:
303    
304    - Если проблема не решается, воспользуйтесь командой `/bug` и напишите в службу поддержки с описанием вашей проблемы. Укажите, какие шаги вы уже предприняли для устранения проблемы.""",
305]
306"""Алгоритм действий в случае неполадок"""
307
308
309@dataclass
310class AccountStatuses:
311    """Класс для хранения статусов аккаунтов."""
312
313    freezed = "Заморожен"
314    admin = "Администратор"
315    user = "Пользовательский"
316    deleted = "Удален"
317    banned = "Забанен"
318
319
320def get_account_status(user_data: UserData) -> str:
321    """Получить статус аккаунта пользователя.
322
323    Args:
324        user_data (UserData): Данные пользователя.
325
326    Returns:
327        str: Статус аккаунта пользователя.
328    """
329    if user_data.active == UserActivity.freezed:
330        return AccountStatuses.freezed
331    elif user_data.active == UserActivity.banned:
332        return AccountStatuses.banned
333    elif user_data.active == UserActivity.deleted:
334        return AccountStatuses.deleted
335    elif user_data.admin:
336        return AccountStatuses.admin
337    else:
338        return AccountStatuses.user
339
340
341def get_sub_status(user_data: UserData) -> tuple:
342    """Получить статус подписки пользователя.
343
344    Args:
345        user_data (UserData): Данные пользователя.
346
347    Returns:
348        tuple: Статус подписки и описание тарифа.
349    """
350    if user_data.active == UserActivity.active:
351        return "Активна", rates.get(user_data.stage, "Неопознанный")
352    elif user_data.active == UserActivity.inactive:
353        return "Неактивна", ""
354    else:
355        return "", ""
356
357
358def get_config_data(user_config: WgConfig) -> str:
359    """Получить конфигурационные данные для WireGuard.
360
361    Args:
362        user_config (WgConfig): Конфигурация пользователя.
363
364    Returns:
365        str: Конфигурационные данные в формате WireGuard.
366    """
367    return f"""[Interface]
368PrivateKey = {user_config.user_private_key}
369Address = {user_config.address}
370DNS = {user_config.dns}
371[Peer]
372PublicKey = {settings.WG_SERVER_KEY}
373AllowedIPs = {user_config.allowed_ips}
374Endpoint = {user_config.endpoint_ip}:{user_config.endpoint_port}
375PersistentKeepalive = 25
376"""
377
378
379async def create_config_file(config: str) -> str:
380    """Создать файл конфигурации WireGuard.
381
382    Args:
383        config (str): Конфигурация в виде строки.
384
385    Returns:
386        str: Путь к созданному файлу конфигурации.
387    """
388    path = os.path.join(PATH, "tmp", f"{uuid.uuid3(uuid.NAMESPACE_DNS, config)}.conf")
389    async with aiofiles.open(path, "w") as file:
390        await file.write(config)
391    return path
392
393
394def create_config_qr(config: str) -> str:
395    """Создать QR-код для конфигурации WireGuard.
396
397    Args:
398        config (str): Конфигурация в виде строки.
399
400    Returns:
401        str: Путь к созданному файлу QR-кода.
402    """
403    path = os.path.join(PATH, "tmp", f"{uuid.uuid3(uuid.NAMESPACE_DNS, config)}.png")
404    qr = pyqrcode.create(config)
405    qr.png(path, scale=8)
406    return path
407
408
409def get_end_sub(user_data: UserData) -> int:
410    """Получить количество дней до окончания подписки.
411
412    Args:
413        user_data (UserData): Данные пользователя.
414
415    Returns:
416        int: Количество дней до окончания подписки.
417    """
418    try:
419        end = round(user_data.fbalance() / (user_data.stage * settings.cost))
420    except ZeroDivisionError:
421        end = 0
422    else:
423        if end < 0:
424            end = 0
425    return end
426
427
428def get_rate_descr(rate: int) -> str:
429    """Получить описание тарифа по его значению.
430
431    Args:
432        rate (int): Значение тарифа.
433
434    Returns:
435        str: Описание тарифа.
436    """
437    general_1 = "\n<b>‼️ (Плата взимается ежедневно!)</b>"
438    general_2 = "\n\n❗️ (Одна конфигурация может быть подключена к нескольким устройствам, однако такие подключения не могут быть одновременными, поэтому рекомендуется создавать по одной конфигурации на каждое устройство)"
439    match rate:
440        case 0:
441            descr = "<b>Тариф: Нулевой</b>" "\nНе подключен никакой тариф" + general_2
442        case 0.3:
443            descr = (
444                "<b>Тариф: Пробный</b>\n"
445                "\n❗️ Может быть подключен <b>единоразово</b>"
446                "\nПодключение другого тарифа лишает пользователя возможности подключить этот тариф"
447                "\n\n‼️ Время действия пробного периода <b>7 дней</b>"
448                "\n\n✅ Позволяет опробовать функционал подключения к VPN сервису"
449                "\n✅ Доступно создание 1 конфигурации (1 устройство)" + general_2
450            )
451        case 1:
452            descr = (
453                "<b>Тариф: ⭐️Базовый⭐️</b>\n"
454                "\n✅ Позволяет получить доступ к базовому функционалу VPN сервиса"
455                "\n✅ Доступно создание 3 конфигураций (3 устройства)"
456                + general_2
457                + f"\n\n‼️ Актуальная стоимость тарифа: <b>{get_plural(settings.cost * rate, 'рубль, рубля, рублей')} в день</b>."
458                + general_1
459            )
460        case 2.5:
461            descr = (
462                "<b>Тариф: 🌟Расширенный🌟</b>\n"
463                "\n✅ Позволяет получить доступ к расширенному функционалу VPN сервиса"
464                "\n✅ Доступны различные инструменты анализа работы VPN сервиса"
465                "\n✅ Возможность отключать ненужные уведомления"
466                "\n✅ Доступно создание 8 конфигураций (8 устройств)"
467                + general_2
468                + f"\n\n‼️ Актуальная стоимость тарифа: <b>{get_plural(settings.cost * rate, 'рубль, рубля, рублей')} в день</b>. "
469                + general_1
470            )
471        case 5:
472            descr = (
473                "<b>Тариф: 💰Люкс💰</b>\n"
474                "\n✅ Позволяет получить доступ к максимально доступному функционалу VPN сервиса"
475                "\n✅ Доступны различные инструменты анализа работы VPN сервиса"
476                "\n✅ Возможность отключать ненужные уведомления"
477                "\n✅ Круглосуточный доступ к техподдержке сервиса (Поможет и расскажет как все настроить или починить)"
478                "\n✅ Только обладатели тарифа Люкс могут подать заявку на получение статуса Администратор"
479                "\n✅ Доступно создание 15 конфигураций (15 устройств)"
480                + general_2
481                + f"\n\n‼️ Актуальная стоимость тарифа: <b>{get_plural(settings.cost * rate, 'рубль, рубля, рублей')} в день</b>. "
482                + general_1
483            )
484    return descr
me = {'подключения', 'конфиги', 'config', 'мои конфиги', 'данные', 'я', 'мои данные'}

Триггерные сообщения для вызова списка конфигураций

yes = {'y', 'yes', 'да', 'da'}

Триггерные сообщения для ответа 'Да'

no = {'no', 'нет', 'n'}

Триггерные сообщения для ответа 'Нет'

only_admin = 'Данный функционал предназначен для пользования администратором. Если вы администратор, а мы не знаем об этом, отправьте боту секретный пароль.'

Ответное сообщение об ограничении доступа к функционалу администратора

DB_ERROR = 'Ошибка подключения к БД. Обратитесь к администратору.'

Сообщение об ошибке с БД

WG_ERROR = 'Ошибка подключения к серверу wireguard. Обратитесь к администратору.'

Сообщение об ошибке с Wireguard сервером

YOO_ERROR = 'Ошибка подключения к серверу yoomoney. Попробуйте еще раз позже'

Сообщение об ошибке с сервисом Yoomoney

UNPAY = 'Функционал создания конфигураций заблокирован. Действующие конфигурации заблокированы. Для разблокировки оплатите подписку.'

Сообщение о недостатке средств на счете

SERVER_STOPPED = 'Уважаемые пользователи, уведомляем вас о технических работах на сервере. В это время доступа к серверу не будет либо он может быть ограничен. Приносим свои извинения за доставленные неудобства. На время технических работ денежные средства со счетов пользователей списываться не будут.'

Сообщение о начале технических работ на сервере

SERVER_STARTED = 'Уважаемые пользователи, спешим уведомить вас, что сервер снова работоспособен. Еще раз приносим свои извинения за доставленные неудобства. В случае, если у вас возникли какие-либо проблемы во время технических работ или после них, сообщите нам, воспользовавшись командой `/bug`'

Сообщение об окончании технических работ на сервере

rates = {0.3: 'Пробный', 1: 'Базовый', 2.5: 'Расширенный', 5: 'Люкс'}

Карта тарифов

reverse_rates = {'free': 0.3, 'base': 1, 'advanced': 2.5, 'luxury': 5}

Обратная карта тарифов

BOT_INFO = '\n🌐 Добро пожаловать в наш VPN-сервис на базе WireGuard!\n\nНаш сервис предоставляет надежное и быстрое решение для обеспечения вашей онлайн-безопасности и конфиденциальности. Вот как он работает:\n\n🔒 Безопасное соединение: WireGuard использует современные криптографические протоколы для создания защищенного канала связи между вашим устройством и интернетом. Это означает, что ваши данные остаются в безопасности и недоступны для посторонних.\n\n⚡ Высокая скорость: Благодаря своей легковесной архитектуре, WireGuard обеспечивает высокую скорость соединения, что позволяет вам наслаждаться потоковым видео, играми и другими онлайн-активностями без задержек.\n\n🤖 Управление через чат-бота: Мы сделали процесс управления вашим VPN-сервисом максимально удобным. С помощью нашего чат-бота вы можете легко подключать себе VPN, а также получать помощь и советы по использованию сервиса.\n\n🔧 Простота использования: Наша платформа разработана с учетом удобства пользователей. Вы сможете быстро настроить соединение и начать пользоваться всеми преимуществами VPN без лишних усилий.\n\nПрисоединяйтесь к нам и обеспечьте свою онлайн-безопасность уже сегодня! Если у вас есть вопросы, не стесняйтесь обращаться к нашему чат-боту — он всегда готов помочь!\n'

Вступительное сообщение. Информация о сервисе.

BOT_STEPS = ["1. <b>Запустите бота</b>: \n \n - Если вы только что начали, введите команду /start , чтобы запустить или перезагрузить бота (🔘кнопка 'Перезагрузка').", '2. <b>Создайте аккаунт</b>: \n \n - Для начала работы с сервисом вам нужно зарегистрироваться. Введите команду `/reg` (либо воспользуйтесь соответствующей кнопкой в чате), чтобы создать аккаунт.', "3. <b>Пополните баланс</b>: \n \n - Далее вам необходимо пополнить баланс. Используйте команду `/sub` (🔘кнопка 'Подписка'), чтобы выбрать и купить тариф пользования.", "4. <b>Создайте конфигурацию</b>: \n \n - После пополнения баланса введите команду /create (🔘кнопка 'Подключения'), чтобы создать конфигурацию WireGuard для вашего устройства.", '5. <b>Скачайте WireGuard</b>: \n \n - Убедитесь, что у вас установлено приложение WireGuard. Вы можете скачать его на официальном сайте WireGuard (https://www.wireguard.com/install/), приложение работает на Windows, macOS, Linux, Android и iOS.', "6. <b>Подключите конфигурацию</b>: \n \n - После создания конфигурации получите ее (🔘кнопка 'Подключения') \n 📄 в текстовом виде (🔘кнопка 'TEXT'),\n \n 📱 в виде qr-кода (🔘кнопка 'QR'),\n \n 🗂️ или скачайте файл (🔘кнопка 'FILE'), \n \nи импортируйте ее в приложение WireGuard. Это позволит вам установить защищенное соединение. \n(Если вы не знаете как импортировать конфигурацию, воспользуйтесь командой `/help` - 🔘'Помощь' и выберите 'Как мне настроить WireGuard?')", "7. <b>Управление аккаунтом</b>:\n \n - Для доступа к основному функционалу вашего аккаунта используйте команду /account или /app, либо 🔘кнопку 'Статус'.\n - Если вам нужно временно приостановить использование сервиса, используйте /freeze (🔘'Заморозить аккаунт'), а для восстановления доступа — команду /recover (🔘'Разморозить аккаунт').", "8. <b>Получите помощь</b>: \n \n - Если у вас возникли вопросы, введите /help (🔘кнопка 'Помощь'), чтобы получить информацию о доступных командах и функциях.", '9. <b>Дополнительные команды</b>:\n \n - Для получения списка всех команд введите /cmd .\n - Если вы администратор, используйте команду /admin для доступа к функционалу администратора.\n - Чтобы сообщить о баге, используйте /bug .\n - Для получения вашего Telegram ID введите /id .\n - Если хотите узнать время запуска бота, введите /time .']

Алгоритм быстрого старта

WG_STEPS = {'Windows': ['1. <b>Скачайте и установите WireGuard</b>:\n \n - Перейдите на официальный сайт WireGuard (https://www.wireguard.com/install/) и скачайте версию для Windows.\n - Установите приложение, следуя инструкциям на экране.', "2. <b>Создайте конфигурационный файл</b>:\n \n - Пополнив баланс у чат-бота, введите команду `/create` (🔘кнопка 'Подключения'), чтобы создать конфигурацию WireGuard для вашего устройства.\n - В появившемся меню конфигурации (🔘кнопка 'Подключения') получите файл конфигурации (🔘кнопка 'FILE') либо создайте его самостоятельно:\n \n ~ Откройте текстовый редактор (например, Блокнот) и вставьте конфигурацию, которую вы получили от чат-бота (🔘кнопка 'TEXT').\n ~ Сохраните файл с расширением `.conf` , например, `my_vpn.conf` .", '3. <b>Импортируйте конфигурацию в WireGuard</b>:\n \n - Откройте приложение WireGuard.\n - Нажмите на кнопку "Import tunnel from file" (Импортировать туннель из файла) и выберите созданный вами конфигурационный файл.', '4. <b>Подключитесь к VPN</b>:\n \n - После импорта конфигурации вы увидите ваш туннель в списке. Нажмите на кнопку "Activate" (Подключить), чтобы подключиться к VPN.', '5. <b>Проверьте подключение</b>:\n \n - Убедитесь, что ваше соединение активно. Вы можете проверить свой IP-адрес через любой онлайн-сервис для определения IP, чтобы убедиться, что вы подключены к VPN. (Например, https://2ip.ru/)'], 'Linux': ['1. <b>Установите WireGuard</b>:\n \n - Перейдите на официальный сайт WireGuard (https://www.wireguard.com/install/) и найдите команду установки для вашего дистрибутива.\n - Откройте терминал.\n - Установите приложение, следуя инструкциям на сайте.', "2. <b>Создайте конфигурационный файл</b>:\n\n - Пополнив баланс у чат-бота, введите команду `/create` (🔘кнопка 'Подключения'), чтобы создать конфигурацию WireGuard для вашего устройства.\n - В появившемся меню конфигурации (🔘кнопка 'Подключения') получите файл конфигурации (🔘кнопка 'FILE') либо создайте его самостоятельно:\n \n ~ Откройте текстовый редактор (например, `nano` или `vim` ) и создайте новый файл конфигурации. Например, `wg0.conf` .\n ~ Вставьте конфигурацию, которую вы получили от чат-бота. \n ~ Сохраните файл и закройте текстовый редактор.\n ~ Переместите конфигурацию по адресу `/etc/wireguard/wg0.conf`", '3. <b>Запустите WireGuard</b>:\n\n - Чтобы активировать VPN-соединение, выполните следующую команду:\n <pre>sudo wg-quick up wg0</pre>', '4. <b>Проверьте подключение</b>:\n\n - Убедитесь, что ваше соединение активно, выполнив команду:\n <pre>sudo wg</pre>\n\n - Также вы можете проверить свой IP-адрес через любой онлайн-сервис для определения IP, чтобы убедиться, что вы подключены к VPN. (Например, https://2ip.ru/)', '5. <b>Отключите WireGuard</b>:\n\n - Чтобы отключить VPN-соединение, выполните команду:\n <pre>sudo wg-quick down wg0</pre>'], 'macOS': ['1. <b>Скачайте и установите приложение WireGuard</b>:\n\n - Откройте Mac App Store на вашем Mac.\n - Найдите приложение "WireGuard" и скачайте его (либо скачайте на официальном сайте WireGuard https://www.wireguard.com/install/).\n - Установите приложение, следуя инструкциям на экране.', "2. <b>Создайте конфигурационный файл</b>:\n \n - Пополнив баланс у чат-бота, введите команду `/create` (🔘кнопка 'Подключения'), чтобы создать конфигурацию WireGuard для вашего устройства.\n - В появившемя меню конфигурации (🔘кнопка 'Подключения') получите файл конфигурации (🔘кнопка 'FILE') либо создайте его самостоятельно:\n \n ~ Откройте текстовый редактор (например, TextEdit).\n ~ Вставьте конфигурацию, которую вы получили от чат-бота. Пример конфигурации:\n ~ Сохраните файл с расширением `.conf` , например, `my_vpn.conf`.", '3. <b>Импортируйте конфигурацию в WireGuard</b>:\n\n - Откройте приложение WireGuard.\n - Добавьте конфигурацию WireGuard, нажав кнопку «Импорт туннелей из файла...» или кнопку ✚ в нижней левой части окна приложения WireGuard и «Импорт туннелей из файла...».\n - Настройте автоподключение для локальной сети или Wi-Fi (для всех Wi-Fi подключений или какого-то отдельного по Вашему выбору) и нажмите «Сохранить». \n - При добавлении новой конфигурации может появиться окно с запросом разрешения на добавление конфигураций VPN. Нажмите «Разрешить» для добавления новой конфигурации. ', '4. <b>Подключитесь к VPN</b>:\n\n - После успешного добавления конфигурации WireGuard для подключения к серверу нажмите «Подключен» в меню приложения на панели задач или «Подключение» (Activate) в программе WireGuard. \n - В случае успешного подключения статус изменится на «Подключен» (Active).', '2. <b>Проверьте подключение</b>:\n\n - Убедитесь, что ваше соединение активно. Вы можете проверить свой IP-адрес через любой онлайн-сервис для определения IP, чтобы убедиться, что вы подключены к VPN. (Например, https://2ip.ru/)'], 'Android': ['1. <b>Скачайте и установите приложение WireGuard</b>:\n \n - Перейдите в Google Play Store на вашем устройстве.\n - Найдите приложение "WireGuard" и скачайте его (либо скачайте на официальном сайте WireGuard https://www.wireguard.com/install/).\n - Установите приложение, следуя инструкциям на экране.', "2. <b>Создайте конфигурационный файл</b>:\n \n - Пополнив баланс у чат-бота, введите команду `/create` (🔘кнопка 'Подключения'), чтобы создать конфигурацию WireGuard для вашего устройства.\n - В появившемся меню конфигурации (🔘кнопка 'Подключения') получите файл конфигурации: \n 📄 в текстовом виде (🔘кнопка 'TEXT'),\n \n 📱 в виде qr-кода (🔘кнопка 'QR'),\n \n 🗂️ или скачайте файл (🔘кнопка 'FILE')", '3. <b>Импортируйте конфигурацию в WireGuard</b>:\n \n - Откройте приложение WireGuard.\n - Нажмите на кнопку "Добавить туннель" (или значок ✚ в правом нижнем углу).\n - Выберите "Импорт из файла", "Сканировать QR-код", или "Создать с нуля"(для опытных) в зависимости от того, как вы сохранили конфигурацию.\n \n - Если вы выбрали "Импорт из файла", найдите и выберите ваш `.conf` файл. \n - Если вы выбрали "Сканировать QR-код", отсканируйте его в чате с ботом.\n - Если вы выбрали "Создать с нуля", самостоятельно заполните все поля согласно полученной конфигурации.', '4. <b>Подключитесь к VPN</b>:\n \n - После импорта конфигурации вы увидите ваш туннель в списке. Нажмите на переключатель рядом с названием туннеля, чтобы активировать VPN-соединение.', '5. <b>Проверьте подключение</b>:\n \n - Убедитесь, что ваше соединение активно. Вы можете проверить свой IP-адрес через любой онлайн-сервис для определения IP, чтобы убедиться, что вы подключены к VPN. (Например, https://2ip.ru/)'], 'iOS': ['1. <b>Скачайте и установите приложение WireGuard</b>:\n \n - Откройте App Store на вашем iPhone или iPad.\n - Найдите приложение "WireGuard" и скачайте его (либо скачайте на официальном сайте WireGuard https://www.wireguard.com/install/).\n - Установите приложение, следуя инструкциям на экране.', "2. <b>Создайте конфигурационный файл</b>:\n \n - Пополнив баланс у чат-бота, введите команду `/create` (🔘кнопка 'Подключения'), чтобы создать конфигурацию WireGuard для вашего устройства.\n - В появившемся меню конфигурации (🔘кнопка 'Подключения') получите файл конфигурации: \n 📄 в текстовом виде (🔘кнопка 'TEXT'),\n \n 📱 в виде qr-кода (🔘кнопка 'QR'),\n \n 🗂️ или скачайте файл (🔘кнопка 'FILE')", '3. <b>Импортируйте конфигурацию в WireGuard</b>:\n \n - Откройте приложение WireGuard.\n - Нажмите на кнопку "Добавить туннель" (или значок ✚ в правом верхнем углу).\n - Выберите "Импорт из файла", "Сканировать QR-код", или "Создать с нуля"(для опытных) в зависимости от того, как вы сохранили конфигурацию.\n \n - Если вы выбрали "Импорт из файла", найдите и выберите ваш `.conf` файл. \n - Если вы выбрали "Сканировать QR-код", отсканируйте его в чате с ботом.\n - Если вы выбрали "Создать с нуля", самостоятельно заполните все поля согласно полученной конфигурации.', '4. <b>Подключитесь к VPN</b>:\n \n - После импорта конфигурации вы увидите ваш туннель в списке. Нажмите на переключатель рядом с названием туннеля, чтобы активировать VPN-соединение.', '5. <b>Проверьте подключение</b>:\n \n - Убедитесь, что ваше соединение активно. Вы можете проверить свой IP-адрес через любой онлайн-сервис для определения IP, чтобы убедиться, что вы подключены к VPN. (Например, https://2ip.ru/)']}

Алгоритмы установки WireGuard на различные платформы

BOT_ERROR_STEP = ['1. <b>Проверьте подключение к интернету</b>:\n \n - Убедитесь, что ваше устройство подключено к интернету. Попробуйте открыть веб-сайт или использовать другое приложение, чтобы проверить соединение.', '2. <b>Перезагрузите приложение WireGuard</b>:\n \n - Закройте приложение WireGuard и откройте его снова. Это может помочь устранить временные проблемы.', '3. <b>Переподключитесь к VPN</b>:\n \n - Отключите VPN-соединение и снова подключитесь. Это может помочь восстановить стабильность соединения.', '4. <b>Проверьте конфигурацию</b>:\n \n - Убедитесь, что вы используете правильную конфигурацию. Проверьте, что все ключи и адреса указаны корректно.', '5. <b>Проверьте настройки брандмауэра</b>:\n \n - Убедитесь, что брандмауэр на вашем устройстве или роутере не блокирует соединение WireGuard. Возможно, потребуется настроить исключения.', '6. <b>Обновите приложение</b>:\n \n - Проверьте, есть ли обновления для приложения WireGuard. Убедитесь, что вы используете последнюю версию.', '7. <b>Перезагрузите устройство</b>:\n \n - Перезагрузите ваше устройство. Это может помочь устранить временные сбои в работе системы.', "8. <b>Проверьте состояние сервиса</b>:\n \n - Убедитесь, что сервис WireGuard работает корректно: команда `/app` (🔘кнопка 'Статус'). Если есть известные проблемы, они могут быть указаны на нашем сайте или в социальных сетях.", '9. <b>Обратитесь за поддержкой</b>:\n \n - Если проблема не решается, воспользуйтесь командой `/bug` и напишите в службу поддержки с описанием вашей проблемы. Укажите, какие шаги вы уже предприняли для устранения проблемы.']

Алгоритм действий в случае неполадок

@dataclass
class AccountStatuses:
310@dataclass
311class AccountStatuses:
312    """Класс для хранения статусов аккаунтов."""
313
314    freezed = "Заморожен"
315    admin = "Администратор"
316    user = "Пользовательский"
317    deleted = "Удален"
318    banned = "Забанен"

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

freezed = 'Заморожен'
admin = 'Администратор'
user = 'Пользовательский'
deleted = 'Удален'
banned = 'Забанен'
def get_account_status(user_data: db.models.userdata.UserData) -> str:
321def get_account_status(user_data: UserData) -> str:
322    """Получить статус аккаунта пользователя.
323
324    Args:
325        user_data (UserData): Данные пользователя.
326
327    Returns:
328        str: Статус аккаунта пользователя.
329    """
330    if user_data.active == UserActivity.freezed:
331        return AccountStatuses.freezed
332    elif user_data.active == UserActivity.banned:
333        return AccountStatuses.banned
334    elif user_data.active == UserActivity.deleted:
335        return AccountStatuses.deleted
336    elif user_data.admin:
337        return AccountStatuses.admin
338    else:
339        return AccountStatuses.user

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

Arguments:
  • user_data (UserData): Данные пользователя.
Returns:

str: Статус аккаунта пользователя.

def get_sub_status(user_data: db.models.userdata.UserData) -> tuple:
342def get_sub_status(user_data: UserData) -> tuple:
343    """Получить статус подписки пользователя.
344
345    Args:
346        user_data (UserData): Данные пользователя.
347
348    Returns:
349        tuple: Статус подписки и описание тарифа.
350    """
351    if user_data.active == UserActivity.active:
352        return "Активна", rates.get(user_data.stage, "Неопознанный")
353    elif user_data.active == UserActivity.inactive:
354        return "Неактивна", ""
355    else:
356        return "", ""

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

Arguments:
  • user_data (UserData): Данные пользователя.
Returns:

tuple: Статус подписки и описание тарифа.

def get_config_data(user_config: db.models.wg_config.WgConfig) -> str:
359def get_config_data(user_config: WgConfig) -> str:
360    """Получить конфигурационные данные для WireGuard.
361
362    Args:
363        user_config (WgConfig): Конфигурация пользователя.
364
365    Returns:
366        str: Конфигурационные данные в формате WireGuard.
367    """
368    return f"""[Interface]
369PrivateKey = {user_config.user_private_key}
370Address = {user_config.address}
371DNS = {user_config.dns}
372[Peer]
373PublicKey = {settings.WG_SERVER_KEY}
374AllowedIPs = {user_config.allowed_ips}
375Endpoint = {user_config.endpoint_ip}:{user_config.endpoint_port}
376PersistentKeepalive = 25
377"""

Получить конфигурационные данные для WireGuard.

Arguments:
  • user_config (WgConfig): Конфигурация пользователя.
Returns:

str: Конфигурационные данные в формате WireGuard.

async def create_config_file(config: str) -> str:
380async def create_config_file(config: str) -> str:
381    """Создать файл конфигурации WireGuard.
382
383    Args:
384        config (str): Конфигурация в виде строки.
385
386    Returns:
387        str: Путь к созданному файлу конфигурации.
388    """
389    path = os.path.join(PATH, "tmp", f"{uuid.uuid3(uuid.NAMESPACE_DNS, config)}.conf")
390    async with aiofiles.open(path, "w") as file:
391        await file.write(config)
392    return path

Создать файл конфигурации WireGuard.

Arguments:
  • config (str): Конфигурация в виде строки.
Returns:

str: Путь к созданному файлу конфигурации.

def create_config_qr(config: str) -> str:
395def create_config_qr(config: str) -> str:
396    """Создать QR-код для конфигурации WireGuard.
397
398    Args:
399        config (str): Конфигурация в виде строки.
400
401    Returns:
402        str: Путь к созданному файлу QR-кода.
403    """
404    path = os.path.join(PATH, "tmp", f"{uuid.uuid3(uuid.NAMESPACE_DNS, config)}.png")
405    qr = pyqrcode.create(config)
406    qr.png(path, scale=8)
407    return path

Создать QR-код для конфигурации WireGuard.

Arguments:
  • config (str): Конфигурация в виде строки.
Returns:

str: Путь к созданному файлу QR-кода.

def get_end_sub(user_data: db.models.userdata.UserData) -> int:
410def get_end_sub(user_data: UserData) -> int:
411    """Получить количество дней до окончания подписки.
412
413    Args:
414        user_data (UserData): Данные пользователя.
415
416    Returns:
417        int: Количество дней до окончания подписки.
418    """
419    try:
420        end = round(user_data.fbalance() / (user_data.stage * settings.cost))
421    except ZeroDivisionError:
422        end = 0
423    else:
424        if end < 0:
425            end = 0
426    return end

Получить количество дней до окончания подписки.

Arguments:
  • user_data (UserData): Данные пользователя.
Returns:

int: Количество дней до окончания подписки.

def get_rate_descr(rate: int) -> str:
429def get_rate_descr(rate: int) -> str:
430    """Получить описание тарифа по его значению.
431
432    Args:
433        rate (int): Значение тарифа.
434
435    Returns:
436        str: Описание тарифа.
437    """
438    general_1 = "\n<b>‼️ (Плата взимается ежедневно!)</b>"
439    general_2 = "\n\n❗️ (Одна конфигурация может быть подключена к нескольким устройствам, однако такие подключения не могут быть одновременными, поэтому рекомендуется создавать по одной конфигурации на каждое устройство)"
440    match rate:
441        case 0:
442            descr = "<b>Тариф: Нулевой</b>" "\nНе подключен никакой тариф" + general_2
443        case 0.3:
444            descr = (
445                "<b>Тариф: Пробный</b>\n"
446                "\n❗️ Может быть подключен <b>единоразово</b>"
447                "\nПодключение другого тарифа лишает пользователя возможности подключить этот тариф"
448                "\n\n‼️ Время действия пробного периода <b>7 дней</b>"
449                "\n\n✅ Позволяет опробовать функционал подключения к VPN сервису"
450                "\n✅ Доступно создание 1 конфигурации (1 устройство)" + general_2
451            )
452        case 1:
453            descr = (
454                "<b>Тариф: ⭐️Базовый⭐️</b>\n"
455                "\n✅ Позволяет получить доступ к базовому функционалу VPN сервиса"
456                "\n✅ Доступно создание 3 конфигураций (3 устройства)"
457                + general_2
458                + f"\n\n‼️ Актуальная стоимость тарифа: <b>{get_plural(settings.cost * rate, 'рубль, рубля, рублей')} в день</b>."
459                + general_1
460            )
461        case 2.5:
462            descr = (
463                "<b>Тариф: 🌟Расширенный🌟</b>\n"
464                "\n✅ Позволяет получить доступ к расширенному функционалу VPN сервиса"
465                "\n✅ Доступны различные инструменты анализа работы VPN сервиса"
466                "\n✅ Возможность отключать ненужные уведомления"
467                "\n✅ Доступно создание 8 конфигураций (8 устройств)"
468                + general_2
469                + f"\n\n‼️ Актуальная стоимость тарифа: <b>{get_plural(settings.cost * rate, 'рубль, рубля, рублей')} в день</b>. "
470                + general_1
471            )
472        case 5:
473            descr = (
474                "<b>Тариф: 💰Люкс💰</b>\n"
475                "\n✅ Позволяет получить доступ к максимально доступному функционалу VPN сервиса"
476                "\n✅ Доступны различные инструменты анализа работы VPN сервиса"
477                "\n✅ Возможность отключать ненужные уведомления"
478                "\n✅ Круглосуточный доступ к техподдержке сервиса (Поможет и расскажет как все настроить или починить)"
479                "\n✅ Только обладатели тарифа Люкс могут подать заявку на получение статуса Администратор"
480                "\n✅ Доступно создание 15 конфигураций (15 устройств)"
481                + general_2
482                + f"\n\n‼️ Актуальная стоимость тарифа: <b>{get_plural(settings.cost * rate, 'рубль, рубля, рублей')} в день</b>. "
483                + general_1
484            )
485    return descr

Получить описание тарифа по его значению.

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

str: Описание тарифа.