Rewrite session and connection
A session and connection now have a room assigned to them for their lifetime. You can't connect a session to another room. The launch() function must only be called once.
This commit is contained in:
parent
c4fdb2942e
commit
2529c2d238
2 changed files with 43 additions and 57 deletions
|
|
@ -14,7 +14,7 @@ SSLOPT = {"ca_certs": ssl.get_default_verify_paths().cafile}
|
||||||
ROOM_FORMAT = "wss://euphoria.io/room/{}/ws"
|
ROOM_FORMAT = "wss://euphoria.io/room/{}/ws"
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
logger.setLevel(logging.INFO)
|
#logger.setLevel(logging.INFO)
|
||||||
|
|
||||||
class Connection():
|
class Connection():
|
||||||
"""
|
"""
|
||||||
|
|
@ -30,18 +30,20 @@ class Connection():
|
||||||
- "stop"
|
- "stop"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, url_format=ROOM_FORMAT, tries=10, delay=30):
|
def __init__(self, room, url_format=ROOM_FORMAT, tries=10, delay=30):
|
||||||
"""
|
"""
|
||||||
url_format - url the bot will connect to, where the room name is represented by {}
|
url_format - url the bot will connect to, where the room name is represented by {}
|
||||||
tries - how often to try to reconnect when connection is lost (-1 - try forever)
|
tries - how often to try to reconnect when connection is lost (-1 - try forever)
|
||||||
delay - time (in seconds) to wait between tries
|
delay - time (in seconds) to wait between tries
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.room = None
|
self.room = room
|
||||||
self.tries = tries
|
self.tries = tries
|
||||||
self.delay = delay
|
self.delay = delay
|
||||||
self.url_format = url_format
|
self.url_format = url_format
|
||||||
|
|
||||||
|
self.start_time = None
|
||||||
|
|
||||||
self._stopping = True
|
self._stopping = True
|
||||||
|
|
||||||
self._ws = None
|
self._ws = None
|
||||||
|
|
@ -102,22 +104,6 @@ class Connection():
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _launch(self):
|
|
||||||
"""
|
|
||||||
_launch() -> Thread
|
|
||||||
|
|
||||||
Connect to the room and spawn a new thread.
|
|
||||||
"""
|
|
||||||
|
|
||||||
self._stopping = False
|
|
||||||
self._thread = threading.Thread(
|
|
||||||
target=self._run,
|
|
||||||
name="{}-{}".format(int(time.time()), self.room)
|
|
||||||
)
|
|
||||||
logger.debug("Launching new thread: {}".format(self._thread.name))
|
|
||||||
self._thread.start()
|
|
||||||
return self._thread
|
|
||||||
|
|
||||||
def _run(self):
|
def _run(self):
|
||||||
"""
|
"""
|
||||||
_run() -> None
|
_run() -> None
|
||||||
|
|
@ -182,26 +168,27 @@ class Connection():
|
||||||
except WSException:
|
except WSException:
|
||||||
self.disconnect()
|
self.disconnect()
|
||||||
|
|
||||||
def connected(self):
|
def launch(self):
|
||||||
return self._ws
|
|
||||||
|
|
||||||
def connect_to(self, room):
|
|
||||||
"""
|
"""
|
||||||
connect_to(room) -> bool
|
launch() -> bool
|
||||||
|
|
||||||
Attempts to connect to the room and spawns a new thread if it's successful.
|
Connect to the room and spawn a new thread.
|
||||||
Returns True if connection was sucessful, else False.
|
Returns True if connecting was successful and a new thread was spawned.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.stop()
|
|
||||||
|
|
||||||
logger.debug("Connecting to &{}.".format(room))
|
|
||||||
self.room = room
|
|
||||||
if self._connect(1):
|
if self._connect(1):
|
||||||
self._launch()
|
self.start_time = time.time()
|
||||||
|
self._stopping = False
|
||||||
|
|
||||||
|
self._thread = threading.Thread(
|
||||||
|
target=self._run,
|
||||||
|
name="{}-{}".format(int(self.start_time), self.room)
|
||||||
|
)
|
||||||
|
|
||||||
|
logger.debug("Launching new thread: {}".format(self._thread.name))
|
||||||
|
self._thread.start()
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
logger.warn("Could not connect to &{}.".format(room))
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def disconnect(self):
|
def disconnect(self):
|
||||||
|
|
|
||||||
|
|
@ -28,14 +28,17 @@ class Session():
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, name=None):
|
def __init__(self, room, password=None, name=None, timeout=10):
|
||||||
|
self.password = password
|
||||||
|
self.real_name = name
|
||||||
|
|
||||||
self._room_accessible = False
|
self._room_accessible = False
|
||||||
self._room_accessible_event = threading.Event()
|
self._room_accessible_event = threading.Event()
|
||||||
self._room_accessible_timeout = None
|
self._room_accessible_timeout = threading.Timer(timeout, self.stop)
|
||||||
|
|
||||||
self._connection = Connection()
|
self._connection = Connection(room)
|
||||||
self._connection.subscribe("disconnect", self._reset_variables)
|
self._connection.subscribe("disconnect", self._reset_variables)
|
||||||
|
# and now the packet types
|
||||||
self._connection.subscribe("bounce-event", self._handle_bounce_event)
|
self._connection.subscribe("bounce-event", self._handle_bounce_event)
|
||||||
self._connection.subscribe("disconnect-event", self._handle_disconnect_event)
|
self._connection.subscribe("disconnect-event", self._handle_disconnect_event)
|
||||||
self._connection.subscribe("hello-event", self._handle_hello_event)
|
self._connection.subscribe("hello-event", self._handle_hello_event)
|
||||||
|
|
@ -53,9 +56,6 @@ class Session():
|
||||||
self._callbacks = Callbacks()
|
self._callbacks = Callbacks()
|
||||||
self.subscribe("enter", self._on_enter)
|
self.subscribe("enter", self._on_enter)
|
||||||
|
|
||||||
self.password = None
|
|
||||||
self.real_name = name
|
|
||||||
|
|
||||||
#self._hello_event_completed = False
|
#self._hello_event_completed = False
|
||||||
#self._snapshot_event_completed = False
|
#self._snapshot_event_completed = False
|
||||||
#self._ready = False
|
#self._ready = False
|
||||||
|
|
@ -66,30 +66,12 @@ class Session():
|
||||||
|
|
||||||
self._reset_variables()
|
self._reset_variables()
|
||||||
|
|
||||||
def switch_to(self, room, password=None, timeout=10):
|
|
||||||
logger.info("Switching to &{}.".format(room))
|
|
||||||
self.password = password
|
|
||||||
|
|
||||||
if self._room_accessible_timeout:
|
|
||||||
self._room_accessible_timeout.cancel()
|
|
||||||
self._room_accessible_timeout = threading.Timer(timeout, self.stop)
|
|
||||||
self._room_accessible_timeout.start()
|
|
||||||
|
|
||||||
if self._connection.connect_to(room):
|
|
||||||
logger.debug("Connection established. Waiting for correct events")
|
|
||||||
self._room_accessible_event.wait()
|
|
||||||
return self._room_accessible
|
|
||||||
else:
|
|
||||||
logger.warn("Could not connect to room url.")
|
|
||||||
return False
|
|
||||||
|
|
||||||
def _reset_variables(self):
|
def _reset_variables(self):
|
||||||
logger.debug("Resetting room-related variables")
|
logger.debug("Resetting room-related variables")
|
||||||
self._room_accessible = False
|
self._room_accessible = False
|
||||||
|
|
||||||
self.my_session = SessionView(None, None, None, None, None)
|
self.my_session = SessionView(None, None, None, None, None)
|
||||||
self.sessions = {}
|
self.sessions = {}
|
||||||
self._room_accessible_event.clear()
|
|
||||||
|
|
||||||
self._hello_event_completed = False
|
self._hello_event_completed = False
|
||||||
self._snapshot_event_completed = False
|
self._snapshot_event_completed = False
|
||||||
|
|
@ -114,6 +96,19 @@ class Session():
|
||||||
if self.real_name:
|
if self.real_name:
|
||||||
self._set_name(self.real_name)
|
self._set_name(self.real_name)
|
||||||
|
|
||||||
|
def launch(self, timeout=10):
|
||||||
|
logger.info("Launching session &{}.".format(room))
|
||||||
|
|
||||||
|
self._room_accessible_timeout.start()
|
||||||
|
|
||||||
|
if self._connection.launch(room):
|
||||||
|
logger.debug("Connection established. Waiting for correct events")
|
||||||
|
self._room_accessible_event.wait()
|
||||||
|
return self._room_accessible
|
||||||
|
else:
|
||||||
|
logger.warn("Could not connect to room url.")
|
||||||
|
return False
|
||||||
|
|
||||||
def launch(self):
|
def launch(self):
|
||||||
return self._connection.launch()
|
return self._connection.launch()
|
||||||
|
|
||||||
|
|
@ -153,6 +148,10 @@ class Session():
|
||||||
def room(self):
|
def room(self):
|
||||||
return self._connection.room
|
return self._connection.room
|
||||||
|
|
||||||
|
@property
|
||||||
|
def start_time(self):
|
||||||
|
return self._connection.start_time
|
||||||
|
|
||||||
def refresh_sessions(self):
|
def refresh_sessions(self):
|
||||||
logger.debug("Refreshing sessions")
|
logger.debug("Refreshing sessions")
|
||||||
self._connection.send_packet("who")
|
self._connection.send_packet("who")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue