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
Триггерные сообщения для вызова списка конфигураций
Триггерные сообщения для ответа 'Да'
Триггерные сообщения для ответа 'Нет'
Ответное сообщение об ограничении доступа к функционалу администратора
Сообщение об ошибке с БД
Сообщение об ошибке с Wireguard сервером
Сообщение об ошибке с сервисом Yoomoney
Сообщение о недостатке средств на счете
Сообщение о начале технических работ на сервере
Сообщение об окончании технических работ на сервере
Карта тарифов
Обратная карта тарифов
Вступительное сообщение. Информация о сервисе.
Алгоритм быстрого старта
Алгоритмы установки WireGuard на различные платформы
Алгоритм действий в случае неполадок
310@dataclass 311class AccountStatuses: 312 """Класс для хранения статусов аккаунтов.""" 313 314 freezed = "Заморожен" 315 admin = "Администратор" 316 user = "Пользовательский" 317 deleted = "Удален" 318 banned = "Забанен"
Класс для хранения статусов аккаунтов.
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: Статус аккаунта пользователя.
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: Статус подписки и описание тарифа.
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.
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: Путь к созданному файлу конфигурации.
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-кода.
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: Количество дней до окончания подписки.
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: Описание тарифа.