Skip to content

Commit c960be3

Browse files
author
InvalidAccount
committed
Auto Updater
1 parent 8c1988c commit c960be3

File tree

1 file changed

+74
-1
lines changed

1 file changed

+74
-1
lines changed

main.py

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
import ctypes
22
import os
3+
import shutil
4+
import ssl
35
import sys
46
import time
57
from contextlib import suppress
8+
from dataclasses import dataclass
69
from json import load
7-
from random import randint, choice
10+
from random import randint, choice, randrange
811
from typing import Any
12+
from urllib.parse import urlparse
13+
from zipfile import ZipFile
914

1015
import requests
1116
from colorama import Fore
@@ -23,9 +28,77 @@
2328
eGenerated = 0
2429
solvedCaptcha = 0
2530

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+
2697

2798
class eGen:
2899
def __init__(self):
100+
self.version = "v1.1"
101+
AutoUpdater(self.version).update()
29102
self.Utils = Utils() # Utils Module
30103
self.config: Any = load(open('config.json')) # Config File
31104
self.checkConfig() # Check Config File

0 commit comments

Comments
 (0)