90 lines
1.9 KiB
Python
90 lines
1.9 KiB
Python
|
#!/usr/bin/env python3
|
||
|
import sys
|
||
|
import os
|
||
|
p = os.path.join
|
||
|
pUp = os.path.dirname
|
||
|
s = False
|
||
|
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
|
||
|
s = os.path.realpath(sys.executable)
|
||
|
else:
|
||
|
s = os.path.realpath(__file__)
|
||
|
sp = pUp(s)
|
||
|
|
||
|
# script start
|
||
|
import socket
|
||
|
import threading
|
||
|
import queue
|
||
|
|
||
|
# IMPORTANT! Obtain locks in this order, if you need multiple at once:
|
||
|
# - clientDataLock
|
||
|
# - clientsLock
|
||
|
# - serverThreadsLock
|
||
|
# - fileLock
|
||
|
modulePath = p(sp,"modules")
|
||
|
|
||
|
mainQueue = queue.Queue()
|
||
|
clientsLock = threading.Lock()
|
||
|
clientID = 0
|
||
|
clients = {}
|
||
|
clientDataLock = threading.Lock()
|
||
|
clientData = {}
|
||
|
serverThreadsLock = threading.Lock()
|
||
|
serverThreads = []
|
||
|
fileLock = threading.Lock()
|
||
|
|
||
|
def runCode(str, lcs = False, description = "loose-code"):
|
||
|
if lcs == False: lcs = {}
|
||
|
code = compile(str,description,"exec")
|
||
|
exec(code,globals(),lcs)
|
||
|
return lcs
|
||
|
|
||
|
def runScript(sf, lcs = False):
|
||
|
if lcs == False: lcs = {}
|
||
|
|
||
|
code = False
|
||
|
with fileLock:
|
||
|
with open(sf,"r",encoding="utf-8") as script:
|
||
|
code = script.read()
|
||
|
|
||
|
runCode(code,lcs,sf)
|
||
|
return lcs
|
||
|
|
||
|
def readModuleFile(path):
|
||
|
with open(path,"r",encoding="utf-8") as modulesFile:
|
||
|
for line in modulesFile:
|
||
|
line = line.split("#",1)[0].strip(" \t\r\n")
|
||
|
if line == "": continue
|
||
|
modType = line.rsplit(".",1)[-1].lower()
|
||
|
line = line.replace("\\","/")
|
||
|
|
||
|
if modType == "mods":
|
||
|
print(">> " +line+ " <<")
|
||
|
else:
|
||
|
print("> " +line+ " ...")
|
||
|
|
||
|
line = line.replace("/",os.path.sep)
|
||
|
if line.startswith("." +os.path.sep):
|
||
|
line = pUp(path) + line[1:]
|
||
|
else:
|
||
|
line = p(modulePath,line)
|
||
|
|
||
|
if modType == "py":
|
||
|
runScript(line,locals())
|
||
|
|
||
|
if modType == "mods":
|
||
|
readModuleFile(line)
|
||
|
|
||
|
def main():
|
||
|
if os.path.isfile(p(modulePath,"main.mods")):
|
||
|
print("Loading modules...")
|
||
|
print(">> main.mods <<")
|
||
|
readModuleFile(p(modulePath,"main.mods"))
|
||
|
print("OK.\n")
|
||
|
|
||
|
with serverThreadsLock:
|
||
|
for server in servers:
|
||
|
makeServer(*server)
|
||
|
|
||
|
print("Serving!\n")
|
||
|
|
||
|
main()
|