diff --git a/NOTE.md b/NOTE.md index 5172c91..e65d7ac 100644 --- a/NOTE.md +++ b/NOTE.md @@ -6,5 +6,4 @@ A faire : - Combiner le _event_wrapper de Window et Scene (?) Bug : -- Appuyez sur "Créer une salle" va lancer un thread, mais il n'est pas fermé s'il l'on revient dans -le menu principal \ No newline at end of file +- / \ No newline at end of file diff --git a/source/gui/scene/RoomCreate.py b/source/gui/scene/RoomCreate.py index 018d90f..59f8c53 100644 --- a/source/gui/scene/RoomCreate.py +++ b/source/gui/scene/RoomCreate.py @@ -6,7 +6,6 @@ import requests from source import network from source.gui.scene.abc import Scene from source.gui import widget, texture -from source.utils.dict import dict_add_prefix if TYPE_CHECKING: from source.gui.window import Window @@ -36,8 +35,7 @@ class RoomCreate(Scene): label_batch=self.batch_label ) - from source.gui.scene import MainMenu - self.back.add_listener("on_click_release", lambda *_: self.window.set_scene(MainMenu)) + self.back.add_listener("on_click_release", self.button_back_callback) self.label_ip = self.add_widget( widget.Text, @@ -65,6 +63,11 @@ class RoomCreate(Scene): self.thread = network.Host(window=self.window, daemon=True, username="Host") self.thread.start() + def button_back_callback(self, *_): + self.thread.stop() + from source.gui.scene import MainMenu + self.window.set_scene(MainMenu) + def on_draw(self): self.batch_button_background.draw() self.batch_label.draw() diff --git a/source/gui/scene/RoomJoin.py b/source/gui/scene/RoomJoin.py index bdb2e6e..d16f714 100644 --- a/source/gui/scene/RoomJoin.py +++ b/source/gui/scene/RoomJoin.py @@ -30,8 +30,7 @@ class RoomJoin(Scene): label_batch=self.batch_label ) - from source.gui.scene import MainMenu - self.back.add_listener("on_click_release", lambda *_: self.window.set_scene(MainMenu)) + self.back.add_listener("on_click_release", self.button_back_callback) self.entry_ip = self.add_widget( widget.Input, @@ -76,6 +75,10 @@ class RoomJoin(Scene): username="Client" ).start()) + def button_back_callback(self, *_): + from source.gui.scene import MainMenu + self.window.set_scene(MainMenu) + def on_draw(self): self.batch_button_background.draw() self.batch_input_background.draw() diff --git a/source/network/Host.py b/source/network/Host.py index 64db993..a9bf3a6 100644 --- a/source/network/Host.py +++ b/source/network/Host.py @@ -15,20 +15,32 @@ class Host(Thread): def __init__(self, window: "Window", username: str, port: int = 52321, **kw): super().__init__(**kw) + self._stop = False + self.window = window self.username = username self.port = port + def stop(self) -> None: + self._stop = True + def run(self) -> None: print("[Serveur] Thread démarré") with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: - s.bind(("", self.port)) - s.listen() - connection, address = s.accept() + s.bind(("", self.port)) # connecte le socket au port indiqué + + s.settimeout(5) # defini le timeout à 5 secondes + s.listen() # écoute de nouvelle connexion + + while True: + try: + connection, address = s.accept() # accepte la première connexion entrante + break # sort de la boucle + except socket.timeout: # en cas de timeout + if self._stop: return # vérifie si le thread n'est pas censé s'arrêter + # sinon, réessaye print(f"[Serveur] Connecté avec {address}") pyglet.clock.schedule_once(lambda dt: self.window.set_scene(scene.Game), 0) - -