GitHub

tg

Как мне пришла эта идея

На уроке обществознания предложили создать бизнес-план своего проекта. Я начал думать, что я буду описывать. Можно было сделать только план, но я решил сделать целый проект. Тогда, все что я умел программировать - это telegram боты на aiogram и telebot. И в голову пришла идея сделать приложение на PyQt6 и telegram бот для покупки подписок.

Первые попытки

Я пробовал использовать tkinter, все было ок, но дизайн выходил скучным и не было полной поддержки javascript вставок, которые мне были нужны чтобы связать tg бот и само приложение. Была идея, когда пользователь хотел зайти в аккаунт, появлялось бы меню с кнопкой "войти через telegram". Но tkinter нормально не поддерживал js, поэтому я перешел на PyQt6, где была полная его поддержка.

Один из первых макетов лаунчера на tkinter
Один из первых макетов лаунчера на tkinter

Первые дизайны получались откровенно дерьмовыми и я начал использовать либу custom-tkinter. С ней ситуация улучшилась, но все же я не мог сделать аутентификацию через telegram. Я сменил курс на PyQt6 и PyDracula как стартовый шаблон.

Переход на веб-приложения

Главным минусом для меня любых gui на python является их размер. Как я помню, приложение на PyQt6 у меня весило около 600 мегабайт в распакованном виде. При этом там практически ничего не было кроме кнопочек и формочек. Надо было что-то делать. В голове появилась идея перенести интерфейс на сервер и подгружать его когда это нужно. С этой задачею отлично справлялся electron. Я мог просто захостить сайт и подгружать его удаленно с клиента! Меня это воодушевило и в этот момент начался мой путь знакомства с веб фреймворками.

Создание telegram бота

Данные о подписках надо было как-то хранить и я решил юзать sqlite как бд. В самом tg боте была система выдачи ключей. Примерная схема работы была такова:

  1. Генерация ключа

  2. Выдача ключа пользователю

  3. Запись в бд уже зашифрованного ключа

Для представления меню я использовал WebApp. Его код вы можете найти на моем github. Кстати я использовал фишку для проводки разных изображений и цен для разных товаров.

Вот код:

ITEMS = {
    "1": "7",
    "2": "31",
    "3": "365",
    "4": "infinity"
}
ITEMS_IMAGE = {
    "1": "https://raw.githubusercontent.com/alananisimov/ezfps-tg-web-app/main/%D1%82%D0%B5%D1%81%D1%82.png",
    "2": "https://raw.githubusercontent.com/alananisimov/ezfps-tg-web-app/main/1%20%D0%BC%D0%B5%D1%81%D1%8F%D1%86.png",
    "3": "https://raw.githubusercontent.com/alananisimov/ezfps-tg-web-app/main/1%20%D0%B3%D0%BE%D0%B4.png",
    "4": "https://raw.githubusercontent.com/alananisimov/"
         "ezfps-tg-web-app/main/%D0%BD%D0%B0%D0%B2%D1%81%D0%B5%D0%B3%D0%B4%D0%B0.png"
}
await bot.send_invoice(
                    chat_id=web_app_message.chat.id,
                    title='Покупка',
                    description='Высокой FPS за минимальdную стоимость',
                    provider_token="" if mode != "dev" else "",
                    currency='rub',
                    need_email=False,
                    photo_url=ITEMS_IMAGE[f'{web_app_message.web_app_data.data}'],
                    need_phone_number=True,
                    prices=PRICE[f'{web_app_message.web_app_data.data}'],
                    start_parameter='',
                    payload=ITEMS[f'{web_app_message.web_app_data.data}']
  )

Написание Electron приложения

репозиторий приложения

Electron - потрясающая вещь. Он предоставляет возможность нативно управлять ПК через web приложение не храня интерфейс локально. Для оптимизации я сделал отдельный класс ScriptManager . В нем можно удобно управлять, обновлять и удалять exe`шники и взаимодействовать с системой. Вот система оптимизации:

  1. Формирование json файла с параметрами и путями до игр

  2. Скачивание exe`шника с сервера

  3. Запуск с параметрами из json файла

Создание оптимизационного скрипта

репозиторий скрипта

Концепция была такова:

  1. Юзер выбирал степень оптимизации(чем больше - чем больше эффект)

  2. Electron запускал скрипт с параметрами и этой степенью

  3. Скрипт действовал по разному в отличии от системы

Сначала я пытался использовать bash скрипты, но на Windows они не работали, что осложняло разработку. С++ показался мне понятным и я мог полноценно взаимодействовать с системой. В коде я постарался разделить оптимизацию под разную систему используя ее особенности. К примеру на Windows я использовал powershell и изменение регистра. Но одно было везде - оптимизация CSGo и Dota2. Я играл в эти игры и понимал что там можно оптимизировать.

Фоточки

Рекламный сайт ezfps.store
Рекламный сайт ezfps.store
Страница аутентификации в лаунчере
Страница аутентификации в лаунчере
Главная страница лаунчера
Главная страница лаунчера

Конец

Спасибо за прочтение статьи! Я буду стараться и дальше развивать этот проект. Это мой первый проект такого размера. Жду разумную критику в комментариях :-)

Комментарии (10)


  1. Ksedline
    10.12.2023 13:47

    Очень сжатая статья, не раскрыта тема применения C++ в связке с Electron. Поверхностно и бегло обо всем и не о чем. Больше выглядит как реклама сервиса.


    1. hollz69 Автор
      10.12.2023 13:47

      Спасибо за комментарий! Планирую выпустить 2 статью с полноценным описанием всех взаимодействий


  1. kmeaw
    10.12.2023 13:47

    Делает ли программа что-то кроме того, что написано в файле https://github.com/alananisimov/OptimizeScript/blob/main/clearSystem.cpp ?


    1. hollz69 Автор
      10.12.2023 13:47

      Привет, git repo давно не обновлялся. Скрипт еще в разработке, вскоре постараюсь аплоаднуть ласт версию


  1. CaptGg
    10.12.2023 13:47

        std::string dota = "C:\\Program Files (x86)\\Steam\\steamapps\\common\\dota 2 beta\\game\\dota\\addons";
        std::string csgo = "C:\\Program Files (x86)\\Steam\\steamapps\\common\\Counter-Strike Global Offensive\\csgo\\cache";

    Наивно полагать, что у людей будут такие пути. Steam давно предлагает выбор куда устанавливать игры.

    Да и вообще в коде C++ у вас нет ничего кроме взаимодействия с файловой системой и запуска других процессов. Все это можно было делать из Electon напрямую, раз уж он все равно у вас уже отвечает за интерфейс и является основой приложения.


    1. hollz69 Автор
      10.12.2023 13:47

      То что вы показали - это значения по дефолту если electron не отправил нужные пути. Electron определяет какие пути нужны на моменте формирование json конфигурации. В самом приложении вы можете изменить эти пути в разделе "Дополнительные настройки". С этим всем можно ознакомиться на гите моего electron приложения в файле ScriptManager.ts. Кстати в самой статье указывается схема работы этой системы


    1. hollz69 Автор
      10.12.2023 13:47

      Согласен с вами насчёт некой скудности оптимизации. Система устроена таким образом, что каждый раз скрипт скачивается в сервера, то есть у каждого пользователя будет ласт версия скрипта. Постепенно я буду его дорабатывать


  1. saboteur_kiev
    10.12.2023 13:47

    Впервые слышу чтобы PyQt6 весил больше, чем электрон.
    Может оптимизацию следовало провести в PyQt6, а не переходить на другой стек?


    1. Jezpy
      10.12.2023 13:47

      У меня тоже есть ощущение что Qt будет легковесней... Правда в последнее время начал учить rust после того как узнал о tauri. Советую чекнуть :)


  1. Einherjar
    10.12.2023 13:47

    Выглядит как какой то скам. В системах особо нечего "оптимизировать". Дохлое железо как ни поверни дохлым и останется.