From 780782f369cf6b688918a282cdf4c7e629c9ba37 Mon Sep 17 00:00:00 2001 From: Alexander Popov Date: Fri, 2 May 2025 03:39:13 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20AppImage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 8 ++++ .gitmodules | 3 ++ 3rdparty/colors.sh | 1 + AppDir/AppRun | 5 +++ AppDir/app.desktop | 6 +++ AppDir/shield.png | Bin 0 -> 22740 bytes {app => ClanStat}/__init__.py | 0 {app => ClanStat}/__main__.py | 2 +- {app => ClanStat}/actions.py | 0 {app => ClanStat}/collect.py | 0 {app => ClanStat}/db.py | 0 {app => ClanStat}/utils.py | 0 dist/.gitkeep | 0 requirements.txt | 2 +- scripts/make-appimage.sh | 77 ++++++++++++++++++++++++++++++++++ 15 files changed, 102 insertions(+), 2 deletions(-) create mode 100644 .gitmodules create mode 160000 3rdparty/colors.sh create mode 100755 AppDir/AppRun create mode 100644 AppDir/app.desktop create mode 100644 AppDir/shield.png rename {app => ClanStat}/__init__.py (100%) rename {app => ClanStat}/__main__.py (97%) rename {app => ClanStat}/actions.py (100%) rename {app => ClanStat}/collect.py (100%) rename {app => ClanStat}/db.py (100%) rename {app => ClanStat}/utils.py (100%) create mode 100644 dist/.gitkeep create mode 100755 scripts/make-appimage.sh diff --git a/.gitignore b/.gitignore index dec04eb..36fd90c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,11 @@ db.sqlite # Docs docs/ + +# AppImage +AppDir/.DirIcon +AppDir/usr/ +dist/python* +dist/packages/ +dist/appimagetool*.AppImage +dist/ClanStat-*.AppImage diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..00e747d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "3rdparty/colors.sh"] + path = 3rdparty/colors.sh + url = https://git.a2s.su/iiiypuk/colors.sh.git diff --git a/3rdparty/colors.sh b/3rdparty/colors.sh new file mode 160000 index 0000000..b4c1b5e --- /dev/null +++ b/3rdparty/colors.sh @@ -0,0 +1 @@ +Subproject commit b4c1b5e3ee7372b93da0f82123df7363f1af1118 diff --git a/AppDir/AppRun b/AppDir/AppRun new file mode 100755 index 0000000..7d1de13 --- /dev/null +++ b/AppDir/AppRun @@ -0,0 +1,5 @@ +#!/bin/sh + +export PYTHONPATH="${PYTHONPATH}:${APPDIR}/usr/lib/python3.13/site-packages" + +${APPDIR}/usr/bin/python3.13 -m ClanStat $1 diff --git a/AppDir/app.desktop b/AppDir/app.desktop new file mode 100644 index 0000000..bd40532 --- /dev/null +++ b/AppDir/app.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Application +Name=ClanStat +Icon=shield +Terminal=false +Categories=Utility; diff --git a/AppDir/shield.png b/AppDir/shield.png new file mode 100644 index 0000000000000000000000000000000000000000..9c5dfd360450bba489505eb0495fb3d33038c0e0 GIT binary patch literal 22740 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

5V!R~zX8u>3|JyH>im$s@_P{~#>Zv_ln;0H2 zGHjo9XvdOO3`)0T*%%f{ZrQTuSMu?R@w<0z49I-P@a*~VJS&MdQ-*k>){C>AId*3J zmtg2f3%R}N{^MQm@@>wqkNx?*XlF}NW}cL)4eNu=%M9Y?9y{2f5i^Iy!(?%vUf1(d z-)yn&*8h<)&o3?IjoEi+_LGIo496K|o*kW^QTCCOA&_UwwB6gk$~D zHp))^+d@5tA3HRA@@_B-Uo0_X5IE{`dz1YGi%*>j93>1M%P&`)KIk^%Z1X>!2Wi0) z&kspW=(zGwn_*%D~pl7`J~z-vp;R_5;5wKdN`}voS1^u-v2( zclp!L?V?;&;tVzS@4t6)bY{5E_QA01gL0SnJ|=~(l}n#qegCcMT<61r8Cuhy1?WvL zvp&Ms5bcv_W7GJl!^03{O!oSc{8yHrO7`DBf9-XsNJ;IT`SX|y7Hjs1t4GKQY93*5 z5Gl?*UAO)5iOtOi9psCH9&j_*<#0Wg57y}K5J_ZE@M_qWs_*ggpW$4;v!>Etv)}%z zW{@{+-DtM-Qiq42ACrn#!{Y8oPn*{1^0Xi3mX@A<`|UTC2L6wa{HO5nFt~6QrUdR; zmVN8?($|0Qe*UxCe7j-Q^Yb(Rxo{q2aG0XtE_QU;wDWr(7p?z(M|AyvKgJ&|nmqoA znJy-&bC?~b1fF!<6T?#hkx6PP)-I01_n=8KbLh*2~7as CXYVTj literal 0 HcmV?d00001 diff --git a/app/__init__.py b/ClanStat/__init__.py similarity index 100% rename from app/__init__.py rename to ClanStat/__init__.py diff --git a/app/__main__.py b/ClanStat/__main__.py similarity index 97% rename from app/__main__.py rename to ClanStat/__main__.py index 7fe6d71..4e5929a 100644 --- a/app/__main__.py +++ b/ClanStat/__main__.py @@ -7,7 +7,7 @@ from .actions import get_top_wins, get_top_donates async def main(): - """Запускак клиента Telegram""" + """Запуск клиента Telegram""" await client.start() logger.info('Клиент Telegram запущен') diff --git a/app/actions.py b/ClanStat/actions.py similarity index 100% rename from app/actions.py rename to ClanStat/actions.py diff --git a/app/collect.py b/ClanStat/collect.py similarity index 100% rename from app/collect.py rename to ClanStat/collect.py diff --git a/app/db.py b/ClanStat/db.py similarity index 100% rename from app/db.py rename to ClanStat/db.py diff --git a/app/utils.py b/ClanStat/utils.py similarity index 100% rename from app/utils.py rename to ClanStat/utils.py diff --git a/dist/.gitkeep b/dist/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/requirements.txt b/requirements.txt index c07e4bb..46bd33f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ loguru==0.7.2 -pdoc==15.0.1 Pyrogram==2.0.106 python-dotenv==1.0.1 TgCrypto==1.2.5 +psycopg2==2.9.10 diff --git a/scripts/make-appimage.sh b/scripts/make-appimage.sh new file mode 100755 index 0000000..8ec600e --- /dev/null +++ b/scripts/make-appimage.sh @@ -0,0 +1,77 @@ +#!/bin/sh + +# Импортирует скрипт с определениями цветов +source ../3rdparty/colors.sh/colors.sh + +APPDIR="../AppDir" +GIT_HASH=$(git rev-parse --short HEAD) + +# Скачивает x86_64 AppImageTool +download_appimage_tool() { + echo -e "${CYAN}Загрузка AppImageTool...${NC}" + + wget -q --show-progress https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage + chmod +x appimagetool-x86_64.AppImage +} + +# Скачивает March Any Linux Python +download_python() { + wget -q --show-progress https://github.com/niess/python-appimage/releases/download/python3.13/python3.13.3-cp313-cp313-manylinux2014_x86_64.AppImage + chmod +x python3.13.3-cp313-cp313-manylinux2014_x86_64.AppImage + mv python3.13.3-cp313-cp313-manylinux2014_x86_64.AppImage python3.13 + + mkdir -p ${APPDIR}/usr/bin/ + cp ./python3.13 ${APPDIR}/usr/bin/python3.13 +} + +# Загружает Python зависимости проекта +get_requirements() { + ./python3.13 -m pip install --target=$(pwd)/packages -r ../requirements.txt > /dev/null 2>&1 +} + +# Копирует записимости в AppDir +copy_requirements() { + mkdir -p ${APPDIR}/usr/lib/python3.13/site-packages/ + + cp -r packages/* ${APPDIR}/usr/lib/python3.13/site-packages/ +} + +# Копирует приложение в AppDir +copy_app_files() { + echo -e "${GREEN}Копирование файлов ...${NC}" + rm -rf ${APPDIR}/usr/lib/python3.13/site-packages/ClanStat + + cp -r ../ClanStat ${APPDIR}/usr/lib/python3.13/site-packages/ClanStat + rm -rf ${APPDIR}/usr/lib/python3.13/site-packages/ClanStat/__pycache__ +} + +# Выполянет сборку AppImage +make_appimage() { + echo -e "${GREEN}Сборка AppImage...${NC}" + ./appimagetool-x86_64.AppImage ${APPDIR} > /dev/null 2>&1 + mv ./ClanStat-x86_64.AppImage ./ClanStat-${GIT_HASH}-x86_64.AppImage + + echo -e "${RED}Сборка AppImage заверщена${NC}" +} + +# Основная функция +main() { + clear + + echo -e "${YELLOW}Подготовка к сборке AppImage...${NC}" + if [ ! -f "appimagetool-x86_64.AppImage" ]; then + download_appimage_tool + fi + + if [ ! -f "python3.13" ]; then + download_python + get_requirements + copy_requirements + fi + + copy_app_files + make_appimage +} + +# Запускает основную функцию +main