Как мне пришла эта идея
На уроке обществознания предложили создать бизнес-план своего проекта. Я начал думать, что я буду описывать. Можно было сделать только план, но я решил сделать целый проект. Тогда, все что я умел программировать - это telegram боты на aiogram и telebot. И в голову пришла идея сделать приложение на PyQt6 и telegram бот для покупки подписок.
Первые попытки
Я пробовал использовать tkinter, все было ок, но дизайн выходил скучным и не было полной поддержки javascript вставок, которые мне были нужны чтобы связать tg бот и само приложение. Была идея, когда пользователь хотел зайти в аккаунт, появлялось бы меню с кнопкой "войти через telegram". Но tkinter нормально не поддерживал js, поэтому я перешел на PyQt6, где была полная его поддержка.
Первые дизайны получались откровенно дерьмовыми и я начал использовать либу custom-tkinter. С ней ситуация улучшилась, но все же я не мог сделать аутентификацию через telegram. Я сменил курс на PyQt6 и PyDracula как стартовый шаблон.
Переход на веб-приложения
Главным минусом для меня любых gui на python является их размер. Как я помню, приложение на PyQt6 у меня весило около 600 мегабайт в распакованном виде. При этом там практически ничего не было кроме кнопочек и формочек. Надо было что-то делать. В голове появилась идея перенести интерфейс на сервер и подгружать его когда это нужно. С этой задачею отлично справлялся electron. Я мог просто захостить сайт и подгружать его удаленно с клиента! Меня это воодушевило и в этот момент начался мой путь знакомства с веб фреймворками.
Создание telegram бота
Данные о подписках надо было как-то хранить и я решил юзать sqlite как бд. В самом tg боте была система выдачи ключей. Примерная схема работы была такова:
Генерация ключа
Выдача ключа пользователю
Запись в бд уже зашифрованного ключа
Для представления меню я использовал 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`шники и взаимодействовать с системой. Вот система оптимизации:
Формирование json файла с параметрами и путями до игр
Скачивание exe`шника с сервера
Запуск с параметрами из json файла
Создание оптимизационного скрипта
Концепция была такова:
Юзер выбирал степень оптимизации(чем больше - чем больше эффект)
Electron запускал скрипт с параметрами и этой степенью
Скрипт действовал по разному в отличии от системы
Сначала я пытался использовать bash скрипты, но на Windows они не работали, что осложняло разработку. С++ показался мне понятным и я мог полноценно взаимодействовать с системой. В коде я постарался разделить оптимизацию под разную систему используя ее особенности. К примеру на Windows я использовал powershell и изменение регистра. Но одно было везде - оптимизация CSGo и Dota2. Я играл в эти игры и понимал что там можно оптимизировать.
Фоточки
Конец
Спасибо за прочтение статьи! Я буду стараться и дальше развивать этот проект. Это мой первый проект такого размера. Жду разумную критику в комментариях :-)
Комментарии (10)
kmeaw
10.12.2023 13:47Делает ли программа что-то кроме того, что написано в файле https://github.com/alananisimov/OptimizeScript/blob/main/clearSystem.cpp ?
hollz69 Автор
10.12.2023 13:47Привет, git repo давно не обновлялся. Скрипт еще в разработке, вскоре постараюсь аплоаднуть ласт версию
CaptGg
10.12.2023 13:47std::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 напрямую, раз уж он все равно у вас уже отвечает за интерфейс и является основой приложения.
hollz69 Автор
10.12.2023 13:47То что вы показали - это значения по дефолту если electron не отправил нужные пути. Electron определяет какие пути нужны на моменте формирование json конфигурации. В самом приложении вы можете изменить эти пути в разделе "Дополнительные настройки". С этим всем можно ознакомиться на гите моего electron приложения в файле ScriptManager.ts. Кстати в самой статье указывается схема работы этой системы
hollz69 Автор
10.12.2023 13:47Согласен с вами насчёт некой скудности оптимизации. Система устроена таким образом, что каждый раз скрипт скачивается в сервера, то есть у каждого пользователя будет ласт версия скрипта. Постепенно я буду его дорабатывать
saboteur_kiev
10.12.2023 13:47Впервые слышу чтобы PyQt6 весил больше, чем электрон.
Может оптимизацию следовало провести в PyQt6, а не переходить на другой стек?Jezpy
10.12.2023 13:47У меня тоже есть ощущение что Qt будет легковесней... Правда в последнее время начал учить rust после того как узнал о tauri. Советую чекнуть :)
Einherjar
10.12.2023 13:47Выглядит как какой то скам. В системах особо нечего "оптимизировать". Дохлое железо как ни поверни дохлым и останется.
Ksedline
Очень сжатая статья, не раскрыта тема применения C++ в связке с Electron. Поверхностно и бегло обо всем и не о чем. Больше выглядит как реклама сервиса.
hollz69 Автор
Спасибо за комментарий! Планирую выпустить 2 статью с полноценным описанием всех взаимодействий