|
1 | 1 | import ctypes |
2 | 2 | import os |
| 3 | +import shutil |
| 4 | +import ssl |
3 | 5 | import sys |
4 | 6 | import time |
5 | 7 | from contextlib import suppress |
| 8 | +from dataclasses import dataclass |
6 | 9 | from json import load |
7 | | -from random import randint, choice |
| 10 | +from random import randint, choice, randrange |
8 | 11 | from typing import Any |
| 12 | +from urllib.parse import urlparse |
| 13 | +from zipfile import ZipFile |
9 | 14 |
|
10 | 15 | import requests |
11 | 16 | from colorama import Fore |
|
23 | 28 | eGenerated = 0 |
24 | 29 | solvedCaptcha = 0 |
25 | 30 |
|
| 31 | +class AutoUpdater: |
| 32 | + def __init__(self, version): |
| 33 | + self.version = version |
| 34 | + self.latest = self.get_latest() |
| 35 | + self.this = os.getcwd() |
| 36 | + self.file = os.getenv("TEMP")+"\latest.zip" |
| 37 | + self.folder = os.getenv("TEMP")+f"\latest_{randrange(1_000_000, 999_999_999)}" |
| 38 | + |
| 39 | + @dataclass |
| 40 | + class latest_data: |
| 41 | + version: str |
| 42 | + zip_url: str |
| 43 | + |
| 44 | + def get_latest(self): |
| 45 | + rjson = requests.get("https://api.github.com/repos/MatrixTM/OutlookGen/tags").json() |
| 46 | + return self.latest_data(version=rjson[0]["name"], zip_url=requests.get(rjson[0]["zipball_url"]).url) |
| 47 | + |
| 48 | + @staticmethod |
| 49 | + def download(host, path, filename): |
| 50 | + import socket |
| 51 | + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: |
| 52 | + context = ssl.create_default_context() |
| 53 | + with context.wrap_socket(sock, server_hostname="api.github.com") as wrapped_socket: |
| 54 | + wrapped_socket.connect((socket.gethostbyname(host), 443)) |
| 55 | + wrapped_socket.send( |
| 56 | + f"GET {path} HTTP/1.1\r\nHost:{host}\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,file/avif,file/webp,file/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n\r\n".encode()) |
| 57 | + |
| 58 | + resp = b"" |
| 59 | + while resp[-4:-1] != b"\r\n\r": |
| 60 | + resp += wrapped_socket.recv(1) |
| 61 | + else: |
| 62 | + resp = resp.decode() |
| 63 | + content_length = int( |
| 64 | + "".join([tag.split(" ")[1] for tag in resp.split("\r\n") if "content-length" in tag.lower()])) |
| 65 | + _file = b"" |
| 66 | + while content_length > 0: |
| 67 | + data = wrapped_socket.recv(2048) |
| 68 | + if not data: |
| 69 | + print("EOF") |
| 70 | + break |
| 71 | + _file += data |
| 72 | + content_length -= len(data) |
| 73 | + with open(filename, "wb") as file: |
| 74 | + file.write(_file) |
| 75 | + |
| 76 | + def update(self): |
| 77 | + if not self.version == self.latest.version: |
| 78 | + print("Updating Script...") |
| 79 | + parsed = urlparse(self.latest.zip_url) |
| 80 | + self.download(parsed.hostname, parsed.path, self.file) |
| 81 | + ZipFile(self.file).extractall(self.folder) |
| 82 | + os.chdir("{}\\{}".format(self.folder, os.listdir(self.folder)[0])) |
| 83 | + for files in os.listdir(): |
| 84 | + if os.path.isdir(files): |
| 85 | + with suppress(FileNotFoundError): |
| 86 | + shutil.rmtree("{}\\{}".format(self.this, files)) |
| 87 | + shutil.copytree(files, "{}\\{}".format(self.this, files)) |
| 88 | + else: |
| 89 | + with suppress(FileNotFoundError): |
| 90 | + os.remove("{}\\{}".format(self.this, files)) |
| 91 | + shutil.copyfile(files, "{}\\{}".format(self.this, files)) |
| 92 | + return |
| 93 | + print("Script is up to date!") |
| 94 | + |
| 95 | + |
| 96 | + |
26 | 97 |
|
27 | 98 | class eGen: |
28 | 99 | def __init__(self): |
| 100 | + self.version = "v1.1" |
| 101 | + AutoUpdater(self.version).update() |
29 | 102 | self.Utils = Utils() # Utils Module |
30 | 103 | self.config: Any = load(open('config.json')) # Config File |
31 | 104 | self.checkConfig() # Check Config File |
|
0 commit comments