From 37b569eca60875b53f554422b30e6b1ad12c6943 Mon Sep 17 00:00:00 2001 From: CaitSith2 Date: Mon, 27 Jun 2022 03:10:41 -0700 Subject: [PATCH] Changes: (#639) * Changes: * When client loses connection to the server through no fault of your own, it no longer forgets your username. * It is now possible to do /connect archipelago://username:password@server:port or to paste archipelago://username:password@server:port into the connect bar and hit connect, and have both the username/password filled in that way. * Switch checksfinder client to getting username from url if suppplied by url. * Correct the print statement --- ChecksFinderClient.py | 5 +---- CommonClient.py | 30 ++++++++++++++++++++++++------ Starcraft2Client.py | 5 +---- kvui.py | 11 +++++++++-- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/ChecksFinderClient.py b/ChecksFinderClient.py index edf40995..3bb96ceb 100644 --- a/ChecksFinderClient.py +++ b/ChecksFinderClient.py @@ -36,10 +36,7 @@ class ChecksFinderContext(CommonContext): async def server_auth(self, password_requested: bool = False): if password_requested and not self.password: await super(ChecksFinderContext, self).server_auth(password_requested) - if not self.auth: # TODO: Replace this if block with await self.getusername() once that PR is merged in. - logger.info('Enter slot name:') - self.auth = await self.console_input() - + await self.get_username() await self.send_connect() async def connection_closed(self): diff --git a/CommonClient.py b/CommonClient.py index 17f013d6..76623ff3 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -43,12 +43,14 @@ class ClientCommandProcessor(CommandProcessor): def _cmd_connect(self, address: str = "") -> bool: """Connect to a MultiWorld Server""" self.ctx.server_address = None + self.ctx.username = None asyncio.create_task(self.ctx.connect(address if address else None), name="connecting") return True def _cmd_disconnect(self) -> bool: """Disconnect from a MultiWorld Server""" self.ctx.server_address = None + self.ctx.username = None asyncio.create_task(self.ctx.disconnect(), name="disconnecting") return True @@ -161,6 +163,7 @@ class CommonContext: def __init__(self, server_address, password): # server state self.server_address = server_address + self.username = None self.password = password self.hint_cost = None self.slot_info = {} @@ -253,6 +256,13 @@ class CommonContext: self.password = await self.console_input() return self.password + async def get_username(self): + if not self.auth: + self.auth = self.username + if not self.auth: + logger.info('Enter slot name:') + self.auth = await self.console_input() + async def send_connect(self, **kwargs): payload = { 'cmd': 'Connect', @@ -309,6 +319,7 @@ class CommonContext: async def shutdown(self): self.server_address = "" + self.username = None if self.server and not self.server.socket.closed: await self.server.socket.close() if self.server_task: @@ -469,12 +480,20 @@ async def server_loop(ctx: CommonContext, address=None): logger.info('Please connect to an Archipelago server.') return - address = f"ws://{address}" if "://" not in address else address - port = urllib.parse.urlparse(address).port or 38281 + address = f"ws://{address}" if "://" not in address \ + else address.replace("archipelago://", "ws://") + + server_url = urllib.parse.urlparse(address) + if server_url.username: + ctx.username = server_url.username + if server_url.password: + ctx.password = server_url.password + port = server_url.port or 38281 logger.info(f'Connecting to Archipelago server at {address}') try: socket = await websockets.connect(address, port=port, ping_timeout=None, ping_interval=None) + ctx.ui.update_address_bar(server_url.netloc) ctx.server = Endpoint(socket) logger.info('Connected') ctx.server_address = address @@ -585,6 +604,7 @@ async def process_server_cmd(ctx: CommonContext, args: dict): raise Exception('Connection refused by the multiworld host, no reason provided') elif cmd == 'Connected': + ctx.username = ctx.auth ctx.team = args["team"] ctx.slot = args["slot"] # int keys get lost in JSON transfer @@ -708,10 +728,7 @@ if __name__ == '__main__': async def server_auth(self, password_requested: bool = False): if password_requested and not self.password: await super(TextContext, self).server_auth(password_requested) - if not self.auth: - logger.info('Enter slot name:') - self.auth = await self.console_input() - + await self.get_username() await self.send_connect() def on_package(self, cmd: str, args: dict): @@ -722,6 +739,7 @@ if __name__ == '__main__': async def main(args): ctx = TextContext(args.connect, args.password) ctx.auth = args.name + ctx.server_address = args.connect ctx.server_task = asyncio.create_task(server_loop(ctx), name="server loop") if gui_enabled: diff --git a/Starcraft2Client.py b/Starcraft2Client.py index 54cc484a..f9b6b43f 100644 --- a/Starcraft2Client.py +++ b/Starcraft2Client.py @@ -95,10 +95,7 @@ class SC2Context(CommonContext): async def server_auth(self, password_requested: bool = False): if password_requested and not self.password: await super(SC2Context, self).server_auth(password_requested) - if not self.auth: - logger.info('Enter slot name:') - self.auth = await self.console_input() - + await self.get_username() await self.send_connect() def on_package(self, cmd: str, args: dict): diff --git a/kvui.py b/kvui.py index 6a8079e9..3c1161f9 100644 --- a/kvui.py +++ b/kvui.py @@ -334,8 +334,8 @@ class GameManager(App): # top part server_label = ServerLabel() self.connect_layout.add_widget(server_label) - self.server_connect_bar = ConnectBarTextInput(text="archipelago.gg", size_hint_y=None, height=30, multiline=False, - write_tab=False) + self.server_connect_bar = ConnectBarTextInput(text=self.ctx.server_address or "archipelago.gg", size_hint_y=None, + height=30, multiline=False, write_tab=False) self.server_connect_bar.bind(on_text_validate=self.connect_button_action) self.connect_layout.add_widget(self.server_connect_bar) self.server_connect_button = Button(text="Connect", size=(100, 30), size_hint_y=None, size_hint_x=None) @@ -412,6 +412,7 @@ class GameManager(App): def connect_button_action(self, button): if self.ctx.server: self.ctx.server_address = None + self.ctx.username = None asyncio.create_task(self.ctx.disconnect()) else: asyncio.create_task(self.ctx.connect(self.server_connect_bar.text.replace("/connect ", ""))) @@ -445,6 +446,12 @@ class GameManager(App): self.log_panels["Archipelago"].on_message_markup(text) self.log_panels["All"].on_message_markup(text) + def update_address_bar(self, text: str): + if hasattr(self, "server_connect_bar"): + self.server_connect_bar.text = text + else: + logging.getLogger("Client").info("Could not update address bar as the GUI is not yet initialized.") + def enable_energy_link(self): if not hasattr(self, "energy_link_label"): self.energy_link_label = Label(text="Energy Link: Standby",