diff --git a/.github/workflows/actions.yml b/.github/workflows/actions.yml index ddcb46e..71ed01c 100644 --- a/.github/workflows/actions.yml +++ b/.github/workflows/actions.yml @@ -1,99 +1,130 @@ -name: 'Build NSO-RPC - x86_64' +--- +name: Build NSO-RPC - x86_64 on: release: - types: [published] - + types: + - published + pull_request: + types: + - opened + - synchronize jobs: - build-x86_64: - name: 'Build NSO-RPC - x86_64' - runs-on: ${{ matrix.os }} + build-windows: + name: Build NSO-RPC - Windows + runs-on: windows-2022 strategy: fail-fast: false matrix: - os: ['windows-latest', 'ubuntu-latest', 'macos-latest'] + pyqt_version: + - pyqt6 + - pyqt5 steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v3 - with: - python-version: 3.11.4 - - # Windows Build - - name: "Build" - if: matrix.os == 'windows-latest' - run: | - cd scripts && - python -m pip install pyqt6 && - ./build.bat - - - name: "Upload Build" - if: matrix.os == 'windows-latest' - uses: softprops/action-gh-release@v0.1.15 - with: - files: client/dist/NSO-RPC.exe - - # Linux Build - - name: "Upload script" - if: matrix.os == 'ubuntu-latest' - uses: softprops/action-gh-release@v0.1.15 - with: - files: scripts/linux.sh - - # MacOS Build - - name: "Build" - if: matrix.os == 'macos-latest' - run: | - cd scripts && - python -m pip install pyqt6 && - bash ./build.sh && - cd ../client/dist && - ln -s /Applications "Applications (admin)" && - hdiutil create -fs HFS+ -srcfolder . -volname NSO-RPC mac-installer.dmg && - zip -yr mac-portable.zip NSO-RPC.app/ - - - name: "Upload Build" - if: matrix.os == 'macos-latest' - uses: softprops/action-gh-release@v0.1.15 - with: - files: | - client/dist/mac-installer.dmg - client/dist/mac-portable.zip + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: 3.11.4 + - name: Build + run: | + python -m pip install ${{ matrix.pyqt_version }} && + cd scripts && + ./build.bat + - name: Rename executable + if: matrix.pyqt_version == 'pyqt5' + run: mv client/dist/NSO-RPC.exe client/dist/NSO-RPC-qt5.exe + - name: Upload Build + if: github.event_name != 'pull_request' + uses: softprops/action-gh-release@v2.0.4 + with: + files: | + client/dist/NSO-RPC*.exe + build-linux: + name: Build NSO-RPC - Linux + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: 3.11.4 + - name: Upload script + run: | + cd scripts && + chmod +x linux.sh + continue-on-error: false + - name: Upload Build + if: github.event_name != 'pull_request' + uses: softprops/action-gh-release@v2.0.4 + with: + files: scripts/linux.sh + build-macos: + name: Build NSO-RPC - MacOS + runs-on: macos-12 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: 3.11.4 + - name: Build + run: > + cd scripts && + ./build.sh && + cd ../client/dist && + bash ../../scripts/tests/macos_test.sh && + rm output.log && + ln -s /Applications "Applications (admin)" && + hdiutil create -fs HFS+ -srcfolder . -volname NSO-RPC mac-installer.dmg && + zip -yr mac-portable.zip NSO-RPC.app/ + - name: Upload Build + if: github.event_name != 'pull_request' + uses: softprops/action-gh-release@v2.0.4 + with: + files: | + client/dist/mac-installer.dmg + client/dist/mac-portable.zip build-universal2: - name: 'Build NSO-RPC - Universal2' - runs-on: macos-latest + name: Build NSO-RPC - Universal2 + runs-on: macos-12 steps: - - uses: actions/checkout@v3 - - # MacOS Universal Build - - name: "Install Python 3.11.4 and build NSO-RPC" - run: | - curl https://www.python.org/ftp/python/3.11.4/python-3.11.4-macos11.pkg -o python-3.11.4-macos11.pkg - sudo installer -verbose -pkg python-3.11.4-macos11.pkg -target / && - alias python3=python3.11 - cd scripts/macos-universal2 && - bash ./build.sh && - cd ../../client/dist && - ln -s /Applications "Applications (admin)" && - hdiutil create -fs HFS+ -srcfolder . -volname NSO-RPC mac-universal2-installer.dmg && - zip -yr mac-universal2-portable.zip NSO-RPC.app/ - - - name: "Upload NSO-RPC Universal2 Build" - uses: softprops/action-gh-release@v0.1.15 - with: - files: | - client/dist/mac-universal2-installer.dmg - client/dist/mac-universal2-portable.zip - + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: 3.11.4 + - name: Install Python 3.11.4 and build NSO-RPC + run: > + curl https://www.python.org/ftp/python/3.11.4/python-3.11.4-macos11.pkg -o python-3.11.4-macos11.pkg && + sudo installer -verbose -pkg python-3.11.4-macos11.pkg -target / && + alias python3=python3.11 && + cd scripts/macos-universal2 && + bash ./build.sh && + cd ../../client/dist && + bash ../../scripts/tests/macos_test.sh && + rm output.log && + ln -s /Applications "Applications (admin)" && + hdiutil create -fs HFS+ -srcfolder . -volname NSO-RPC mac-universal2-installer.dmg && + zip -yr mac-universal2-portable.zip NSO-RPC.app/ + - name: Upload NSO-RPC Universal2 Build + if: github.event_name != 'pull_request' + uses: softprops/action-gh-release@v2.0.4 + with: + files: | + client/dist/mac-universal2-installer.dmg + client/dist/mac-universal2-portable.zip get-hashes: - runs-on: "ubuntu-latest" - needs: ["build-x86_64", "build-universal2"] + name: Generate Checksums + runs-on: ubuntu-22.04 + needs: + - build-windows + - build-linux + - build-macos + - build-universal2 + if: github.event_name != 'pull_request' steps: - - name: "Generate checksums.txt" + - name: Generate checksums.txt uses: MCJack123/ghaction-generate-release-hashes@v4 with: hash-type: sha256 file-name: checksums.txt get-assets: true - - uses: softprops/action-gh-release@v0.1.15 + - uses: softprops/action-gh-release@v2.0.4 with: files: checksums.txt diff --git a/client/_version.py b/client/_version.py index b9fa3d4..dd655d5 100644 --- a/client/_version.py +++ b/client/_version.py @@ -1,15 +1,25 @@ import os import git + +def get_version_info(): + r = git.repo.Repo(search_parent_directories=True) + try: + # Get all tags sorted by commit date + tags = sorted(r.tags, key=lambda t: t.commit.committed_datetime, reverse=True) + version_info = tags[0].name + except IndexError: + try: + version_info = r.active_branch.name + except TypeError: + version_info = r.head.object.hexsha[:7] + return version_info + + if __name__ == '__main__': - # Deletes current version.txt file if os.path.exists('version.txt'): os.remove('version.txt') - # Writes latest git version info to 'version.txt' - r = git.repo.Repo(search_parent_directories=True) - version_info = r.git.describe('--tags') + version_info = get_version_info() with open('version.txt', 'w') as f: f.write(version_info) - f.write('\n') - f.close() diff --git a/client/api/__init__.py b/client/api/__init__.py index dd036da..5a85f75 100644 --- a/client/api/__init__.py +++ b/client/api/__init__.py @@ -14,6 +14,33 @@ import pickle +def getVersionRegex(html: str): + try: + # Attempt to determine the appropriate regex pattern with prefix + version_with_prefix = re.compile(r'Version\s*\s*(\d+\.\d+\.\d+)').search(html) + if version_with_prefix: + return version_with_prefix + except Exception as e: + print(f"Failed to determine regex pattern with prefix: {e}") + + try: + # Attempt to determine an alternative regex pattern with prefix + version_without_space = re.compile(r'Version\s*(\d+\.\d+\.\d+)').search(html) + if version_without_space: + return version_without_space + except Exception as e: + print(f"Failed to determine alternative regex pattern with prefix: {e}") + + try: + # Attempt to determine an alternative regex pattern without prefix + version_no_prefix = re.compile(r'(\d+\.\d+\.\d+)').search(html) + if version_no_prefix: + return version_no_prefix + except Exception as e: + print(f"Failed to determine regex pattern without prefix: {e}") + return None + + def getAppPath(): # Check for macOS platform and NSO-RPC freeze status if sys.platform.startswith('darwin') and hasattr(sys, 'frozen') and sys.frozen == 'macosx_app': @@ -70,10 +97,10 @@ def getVersion(): else: log('Failed to get Apple\'s store page after multiple retries.') if r: - searchPattern = re.compile(r'Version\s*(\d\.\d\.\d)+') - version = searchPattern.search(r.text) + version = getVersionRegex(r.text) if version: - return version.group(1) + app_version = version.group(1) + return app_version return '' @@ -97,11 +124,11 @@ def getVersion(): class API(): def __init__(self, session_token, user_lang, targetID, version): - pattern = re.compile(r'(\d.\d.\d)') - if not version or not re.search(pattern, version): + version_match = getVersionRegex(version) + if not version_match: raise Exception('missing app version') global nsoAppVersion - nsoAppVersion = version + nsoAppVersion = version_match.group(1) self.headers = { 'X-ProductVersion': nsoAppVersion, 'X-Platform': 'iOS', @@ -283,10 +310,21 @@ def __init__(self, userInfo, userLang, accessToken, guid): self.na_id = userInfo['id'] self.imink = imink(self.na_id, self.accessToken, self.timestamp, self.guid, 1).get() - self.timestamp = int(self.imink['timestamp']) - self.guid = self.imink['request_id'] - self.account = None + if 'error' in self.imink or self.imink.get('error') is not None: + iminkApiError = ( + 'Unable to authenticate with imink. \n\n' + 'The F Calculation API may be experiencing issues or this build of NSO-RPC is outdated \n' + 'Please try the most upto date build of NSO-RPC before submitting an issue. \n' + 'Please check the website for more details: \n' + 'https://status.imink.app/ \n' + ) + raise RuntimeError(iminkApiError) from None + else: + self.timestamp = int(self.imink['timestamp']) + self.guid = self.imink['request_id'] + + self.account = None def loginToAccount(self): route = '/v3/Account/Login' diff --git a/scripts/build.sh b/scripts/build.sh index 9eb8173..1da5d20 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -1,5 +1,8 @@ +#!/bin/bash +python3 -m venv --upgrade-deps venv +source venv/bin/activate cd ../client -python3 -m pip install -r requirements.txt py2app GitPython +python3 -m pip install -r requirements.txt pyqt6 py2app GitPython python3 _version.py rm setup.py py2applet --make-setup app.py icon.icns "icon.png" "taskbarDark.png" "taskbarLight.png" "version.txt" diff --git a/scripts/macos-universal2/build.sh b/scripts/macos-universal2/build.sh index c523351..2e35579 100755 --- a/scripts/macos-universal2/build.sh +++ b/scripts/macos-universal2/build.sh @@ -1,4 +1,6 @@ #!/bin/bash +python3 -m venv --upgrade-deps venv +source venv/bin/activate python3 -m pip install wheel PyQt6 bash prep-PyQt.sh cd ../../client diff --git a/scripts/tests/macos_test.sh b/scripts/tests/macos_test.sh new file mode 100644 index 0000000..c1a6d42 --- /dev/null +++ b/scripts/tests/macos_test.sh @@ -0,0 +1,25 @@ +#!/bin/bash +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +NC='\033[0m' + +# Start the application in the background +./NSO-RPC.app/Contents/MacOS/NSO-RPC > output.log 2>&1 & +APP_PID=$! + +sleep 10 +kill $APP_PID + +output=$(