mirror of
https://github.com/TheGreyDiamond/Enlight.git
synced 2025-12-17 23:40:45 +01:00
More changes
This commit is contained in:
152
Code/session.py
152
Code/session.py
@@ -8,6 +8,12 @@ USED_SESSION_IDS = []
|
|||||||
|
|
||||||
VERSION = "1.1.1"
|
VERSION = "1.1.1"
|
||||||
|
|
||||||
|
## Role defs
|
||||||
|
HOST = 0
|
||||||
|
USER = 1
|
||||||
|
ADMIN = 2
|
||||||
|
VALID_ROLES = [HOST, USER, ADMIN]
|
||||||
|
|
||||||
|
|
||||||
def get_random_alphanumeric_string(length):
|
def get_random_alphanumeric_string(length):
|
||||||
letters_and_digits = string.ascii_letters + string.digits
|
letters_and_digits = string.ascii_letters + string.digits
|
||||||
@@ -16,34 +22,86 @@ def get_random_alphanumeric_string(length):
|
|||||||
|
|
||||||
class enlightSession():
|
class enlightSession():
|
||||||
''' The main session class '''
|
''' The main session class '''
|
||||||
def __init__(self, name, password = ""):
|
def __init__(self, name = "", role = HOST, password = ""):
|
||||||
self.sessionId = None
|
|
||||||
self.sessionName = name
|
self.sessionName = name
|
||||||
|
self.__activ__ = False
|
||||||
|
|
||||||
|
## For HOST role
|
||||||
|
self.sessionId = None
|
||||||
|
self.__server__ = None
|
||||||
|
self.__server_thread__ = None
|
||||||
self.sessionPassword = password
|
self.sessionPassword = password
|
||||||
self.members = []
|
self.members = []
|
||||||
|
self.allowJoin = False
|
||||||
|
|
||||||
|
## For USER and ADMIN role
|
||||||
|
self.sessionId = None
|
||||||
|
self.__client__ = None
|
||||||
|
self.__client_thread__ = None
|
||||||
|
self.allOnlineSessions = {}
|
||||||
|
|
||||||
|
self.__role__ = role
|
||||||
|
|
||||||
if(self.sessionPassword == ""):
|
if(self.sessionPassword == ""):
|
||||||
self.passwordSet = "0"
|
self.passwordSet = "0"
|
||||||
else:
|
else:
|
||||||
self.passwordSet = "1"
|
self.passwordSet = "1"
|
||||||
self.__activ__ = False
|
|
||||||
self.__server__ = None
|
if(self.__role__ not in VALID_ROLES):
|
||||||
self.__server_thread__ = None
|
self.__role__ = HOST
|
||||||
self.allowJoin = False
|
logging.warning("No vaild session role was set, using HOST as default")
|
||||||
|
|
||||||
|
if(self.__role__ == HOST and name == ""):
|
||||||
|
logging.warning("Role is set to HOST, but no session name was given.")
|
||||||
|
self.sessionName = "Unnamed session"
|
||||||
|
|
||||||
|
|
||||||
def initConnection(self):
|
def initConnection(self):
|
||||||
''' Starts the main dicovery/connction method(s) '''
|
''' Starts the main dicovery/connction method(s) '''
|
||||||
global USED_SESSION_IDS
|
global USED_SESSION_IDS
|
||||||
self.sessionId = get_random_alphanumeric_string(24)
|
if(self.__role__ == HOST):
|
||||||
while(self.sessionId in USED_SESSION_IDS):
|
|
||||||
self.sessionId = get_random_alphanumeric_string(24)
|
self.sessionId = get_random_alphanumeric_string(24)
|
||||||
USED_SESSION_IDS.append(self.sessionId)
|
while(self.sessionId in USED_SESSION_IDS):
|
||||||
self.__server__ = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
|
self.sessionId = get_random_alphanumeric_string(24)
|
||||||
self.__server__.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
USED_SESSION_IDS.append(self.sessionId)
|
||||||
self.__activ__ = True
|
self.__server__ = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
|
||||||
self.allowJoin = True
|
self.__server__.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
||||||
logging.info("Starting server thread")
|
self.__activ__ = True
|
||||||
self.__server_thread__ = threading.Thread(target=self.serverMain, args=(), name="Discovery server")
|
self.allowJoin = True
|
||||||
self.__server_thread__.start()
|
logging.info("Starting server thread")
|
||||||
|
self.__server_thread__ = threading.Thread(target=self.serverMain, args=(), name="Discovery server")
|
||||||
|
self.__server_thread__.start()
|
||||||
|
elif(self.__role__ == USER or self.__role__ == ADMIN):
|
||||||
|
self.__client__ = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # UDP
|
||||||
|
self.__client__.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
||||||
|
self.__client__.bind(("", 37020))
|
||||||
|
logging.info("Starting lighthouse thread")
|
||||||
|
self.__client_thread__ = threading.Thread(target=self.lighthouseMain, args=(), name="Lighthouse server")
|
||||||
|
self.__client_thread__.start()
|
||||||
|
self.__activ__ = True
|
||||||
|
|
||||||
|
|
||||||
|
def lighthouseMain(self):
|
||||||
|
''' The main thread for searching/finding sessions '''
|
||||||
|
while True:
|
||||||
|
data, addr = self.__client__.recvfrom(1024)
|
||||||
|
data = data.decode("utf-8")
|
||||||
|
data = data.replace("|", "")
|
||||||
|
proc = data.split(";")
|
||||||
|
|
||||||
|
logging.info("Got broadcast from " + str(addr) + " with data " + str(proc))
|
||||||
|
if(proc[3] != VERSION): #if(proc[3] == VERSION):
|
||||||
|
logging.warning("Software versions are not compatible. ABORT")
|
||||||
|
else:
|
||||||
|
## More data handling
|
||||||
|
if(proc[2] not in self.allOnlineSessions):
|
||||||
|
self.allOnlineSessions[proc[2]] = proc[1]
|
||||||
|
logging.info("Found new session named " + proc[1])
|
||||||
|
|
||||||
|
def researchAllSessions(self):
|
||||||
|
if(self.__role__ != HOST):
|
||||||
|
logging.info("Clearing all know session")
|
||||||
|
self.allOnlineSessions = {}
|
||||||
|
|
||||||
def serverMain(self):
|
def serverMain(self):
|
||||||
logging.info("Discovery server started")
|
logging.info("Discovery server started")
|
||||||
@@ -57,9 +115,21 @@ class enlightSession():
|
|||||||
logging.info("Sent discovery broadcast")
|
logging.info("Sent discovery broadcast")
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
logging.info("Discovery server stopped")
|
logging.info("Discovery server stopped")
|
||||||
|
|
||||||
|
def getSessionMembers(self):
|
||||||
|
return(self.members)
|
||||||
|
|
||||||
|
def stopSession(self):
|
||||||
|
if(self.__role__ == HOST):
|
||||||
|
self.allowJoin = False
|
||||||
|
self.__activ__ = False
|
||||||
|
# TODO: Kick all users
|
||||||
|
self.members = []
|
||||||
|
self.__server_thread__ = None
|
||||||
|
self.__server__.shutdown(socket.SHUT_RDWR)
|
||||||
|
self.__server__.close()
|
||||||
|
else:
|
||||||
|
logging.warning("stopSession was called, without the role set to HOST. Did you mean .leave?")
|
||||||
|
|
||||||
|
|
||||||
# Enable port reusage so we will be able to run multiple clients and servers on single (host, port).
|
# Enable port reusage so we will be able to run multiple clients and servers on single (host, port).
|
||||||
@@ -69,41 +139,15 @@ class enlightSession():
|
|||||||
# Thanks to @stevenreddie
|
# Thanks to @stevenreddie
|
||||||
# client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
|
# client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
|
||||||
|
|
||||||
# Enable broadcasting mode
|
|
||||||
client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # UDP
|
|
||||||
client.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
|
||||||
|
|
||||||
client.bind(("", 37020))
|
def testModule():
|
||||||
|
testSession = enlightSession("TestSession", role = HOST)
|
||||||
|
userSession = enlightSession("myLocalSession", role = USER)
|
||||||
|
userSession.initConnection()
|
||||||
|
testSession.initConnection()
|
||||||
|
time.sleep(5)
|
||||||
|
userSession.researchAllSessions()
|
||||||
|
time.sleep(5)
|
||||||
|
testSession.stopSession()
|
||||||
|
|
||||||
|
testModule()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def clientMain():
|
|
||||||
print("Client started")
|
|
||||||
while True:
|
|
||||||
# Thanks @seym45 for a fix
|
|
||||||
data, addr = client.recvfrom(1024)
|
|
||||||
data = data.decode("utf-8")
|
|
||||||
data = data.replace("|", "")
|
|
||||||
|
|
||||||
proc = data.split(";")
|
|
||||||
# print(proc[2])
|
|
||||||
if(proc[2] == USED_SESSION_IDS[0]):
|
|
||||||
print("From same device")
|
|
||||||
print(addr)
|
|
||||||
print("received message: %s" % data)
|
|
||||||
print(f"Rec at {time.strftime('%X')}")
|
|
||||||
print("Client quited")
|
|
||||||
|
|
||||||
def main():
|
|
||||||
thread = []
|
|
||||||
ses = enlightSession("TestSession")
|
|
||||||
ses.initConnection()
|
|
||||||
thread.append(threading.Thread(target=clientMain, args=()))
|
|
||||||
# thread.append(threading.Thread(target=serverMain, args=()))
|
|
||||||
for th in thread:
|
|
||||||
th.start()
|
|
||||||
|
|
||||||
main()
|
|
||||||
print("Quited")
|
|
||||||
BIN
icon-highres.png
Normal file
BIN
icon-highres.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 201 KiB |
Reference in New Issue
Block a user