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
This commit is contained in:
parent
d317111d20
commit
37b569eca6
|
@ -36,10 +36,7 @@ class ChecksFinderContext(CommonContext):
|
||||||
async def server_auth(self, password_requested: bool = False):
|
async def server_auth(self, password_requested: bool = False):
|
||||||
if password_requested and not self.password:
|
if password_requested and not self.password:
|
||||||
await super(ChecksFinderContext, self).server_auth(password_requested)
|
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.
|
await self.get_username()
|
||||||
logger.info('Enter slot name:')
|
|
||||||
self.auth = await self.console_input()
|
|
||||||
|
|
||||||
await self.send_connect()
|
await self.send_connect()
|
||||||
|
|
||||||
async def connection_closed(self):
|
async def connection_closed(self):
|
||||||
|
|
|
@ -43,12 +43,14 @@ class ClientCommandProcessor(CommandProcessor):
|
||||||
def _cmd_connect(self, address: str = "") -> bool:
|
def _cmd_connect(self, address: str = "") -> bool:
|
||||||
"""Connect to a MultiWorld Server"""
|
"""Connect to a MultiWorld Server"""
|
||||||
self.ctx.server_address = None
|
self.ctx.server_address = None
|
||||||
|
self.ctx.username = None
|
||||||
asyncio.create_task(self.ctx.connect(address if address else None), name="connecting")
|
asyncio.create_task(self.ctx.connect(address if address else None), name="connecting")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def _cmd_disconnect(self) -> bool:
|
def _cmd_disconnect(self) -> bool:
|
||||||
"""Disconnect from a MultiWorld Server"""
|
"""Disconnect from a MultiWorld Server"""
|
||||||
self.ctx.server_address = None
|
self.ctx.server_address = None
|
||||||
|
self.ctx.username = None
|
||||||
asyncio.create_task(self.ctx.disconnect(), name="disconnecting")
|
asyncio.create_task(self.ctx.disconnect(), name="disconnecting")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -161,6 +163,7 @@ class CommonContext:
|
||||||
def __init__(self, server_address, password):
|
def __init__(self, server_address, password):
|
||||||
# server state
|
# server state
|
||||||
self.server_address = server_address
|
self.server_address = server_address
|
||||||
|
self.username = None
|
||||||
self.password = password
|
self.password = password
|
||||||
self.hint_cost = None
|
self.hint_cost = None
|
||||||
self.slot_info = {}
|
self.slot_info = {}
|
||||||
|
@ -253,6 +256,13 @@ class CommonContext:
|
||||||
self.password = await self.console_input()
|
self.password = await self.console_input()
|
||||||
return self.password
|
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):
|
async def send_connect(self, **kwargs):
|
||||||
payload = {
|
payload = {
|
||||||
'cmd': 'Connect',
|
'cmd': 'Connect',
|
||||||
|
@ -309,6 +319,7 @@ class CommonContext:
|
||||||
|
|
||||||
async def shutdown(self):
|
async def shutdown(self):
|
||||||
self.server_address = ""
|
self.server_address = ""
|
||||||
|
self.username = None
|
||||||
if self.server and not self.server.socket.closed:
|
if self.server and not self.server.socket.closed:
|
||||||
await self.server.socket.close()
|
await self.server.socket.close()
|
||||||
if self.server_task:
|
if self.server_task:
|
||||||
|
@ -469,12 +480,20 @@ async def server_loop(ctx: CommonContext, address=None):
|
||||||
logger.info('Please connect to an Archipelago server.')
|
logger.info('Please connect to an Archipelago server.')
|
||||||
return
|
return
|
||||||
|
|
||||||
address = f"ws://{address}" if "://" not in address else address
|
address = f"ws://{address}" if "://" not in address \
|
||||||
port = urllib.parse.urlparse(address).port or 38281
|
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}')
|
logger.info(f'Connecting to Archipelago server at {address}')
|
||||||
try:
|
try:
|
||||||
socket = await websockets.connect(address, port=port, ping_timeout=None, ping_interval=None)
|
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)
|
ctx.server = Endpoint(socket)
|
||||||
logger.info('Connected')
|
logger.info('Connected')
|
||||||
ctx.server_address = address
|
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')
|
raise Exception('Connection refused by the multiworld host, no reason provided')
|
||||||
|
|
||||||
elif cmd == 'Connected':
|
elif cmd == 'Connected':
|
||||||
|
ctx.username = ctx.auth
|
||||||
ctx.team = args["team"]
|
ctx.team = args["team"]
|
||||||
ctx.slot = args["slot"]
|
ctx.slot = args["slot"]
|
||||||
# int keys get lost in JSON transfer
|
# int keys get lost in JSON transfer
|
||||||
|
@ -708,10 +728,7 @@ if __name__ == '__main__':
|
||||||
async def server_auth(self, password_requested: bool = False):
|
async def server_auth(self, password_requested: bool = False):
|
||||||
if password_requested and not self.password:
|
if password_requested and not self.password:
|
||||||
await super(TextContext, self).server_auth(password_requested)
|
await super(TextContext, self).server_auth(password_requested)
|
||||||
if not self.auth:
|
await self.get_username()
|
||||||
logger.info('Enter slot name:')
|
|
||||||
self.auth = await self.console_input()
|
|
||||||
|
|
||||||
await self.send_connect()
|
await self.send_connect()
|
||||||
|
|
||||||
def on_package(self, cmd: str, args: dict):
|
def on_package(self, cmd: str, args: dict):
|
||||||
|
@ -722,6 +739,7 @@ if __name__ == '__main__':
|
||||||
async def main(args):
|
async def main(args):
|
||||||
ctx = TextContext(args.connect, args.password)
|
ctx = TextContext(args.connect, args.password)
|
||||||
ctx.auth = args.name
|
ctx.auth = args.name
|
||||||
|
ctx.server_address = args.connect
|
||||||
ctx.server_task = asyncio.create_task(server_loop(ctx), name="server loop")
|
ctx.server_task = asyncio.create_task(server_loop(ctx), name="server loop")
|
||||||
|
|
||||||
if gui_enabled:
|
if gui_enabled:
|
||||||
|
|
|
@ -95,10 +95,7 @@ class SC2Context(CommonContext):
|
||||||
async def server_auth(self, password_requested: bool = False):
|
async def server_auth(self, password_requested: bool = False):
|
||||||
if password_requested and not self.password:
|
if password_requested and not self.password:
|
||||||
await super(SC2Context, self).server_auth(password_requested)
|
await super(SC2Context, self).server_auth(password_requested)
|
||||||
if not self.auth:
|
await self.get_username()
|
||||||
logger.info('Enter slot name:')
|
|
||||||
self.auth = await self.console_input()
|
|
||||||
|
|
||||||
await self.send_connect()
|
await self.send_connect()
|
||||||
|
|
||||||
def on_package(self, cmd: str, args: dict):
|
def on_package(self, cmd: str, args: dict):
|
||||||
|
|
11
kvui.py
11
kvui.py
|
@ -334,8 +334,8 @@ class GameManager(App):
|
||||||
# top part
|
# top part
|
||||||
server_label = ServerLabel()
|
server_label = ServerLabel()
|
||||||
self.connect_layout.add_widget(server_label)
|
self.connect_layout.add_widget(server_label)
|
||||||
self.server_connect_bar = ConnectBarTextInput(text="archipelago.gg", size_hint_y=None, height=30, multiline=False,
|
self.server_connect_bar = ConnectBarTextInput(text=self.ctx.server_address or "archipelago.gg", size_hint_y=None,
|
||||||
write_tab=False)
|
height=30, multiline=False, write_tab=False)
|
||||||
self.server_connect_bar.bind(on_text_validate=self.connect_button_action)
|
self.server_connect_bar.bind(on_text_validate=self.connect_button_action)
|
||||||
self.connect_layout.add_widget(self.server_connect_bar)
|
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)
|
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):
|
def connect_button_action(self, button):
|
||||||
if self.ctx.server:
|
if self.ctx.server:
|
||||||
self.ctx.server_address = None
|
self.ctx.server_address = None
|
||||||
|
self.ctx.username = None
|
||||||
asyncio.create_task(self.ctx.disconnect())
|
asyncio.create_task(self.ctx.disconnect())
|
||||||
else:
|
else:
|
||||||
asyncio.create_task(self.ctx.connect(self.server_connect_bar.text.replace("/connect ", "")))
|
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["Archipelago"].on_message_markup(text)
|
||||||
self.log_panels["All"].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):
|
def enable_energy_link(self):
|
||||||
if not hasattr(self, "energy_link_label"):
|
if not hasattr(self, "energy_link_label"):
|
||||||
self.energy_link_label = Label(text="Energy Link: Standby",
|
self.energy_link_label = Label(text="Energy Link: Standby",
|
||||||
|
|
Loading…
Reference in New Issue