from helpers import HButtonSelect, spawnDialog, spawnSimplePopup, errorTxt, isValidUsername from prompt_toolkit.application.current import get_app from prompt_toolkit.buffer import Buffer from prompt_toolkit.layout.containers import HSplit from prompt_toolkit.validation import Validator from prompt_toolkit.widgets import Box, Button, Dialog, Label, TextArea, ValidationToolbar class AccountSettings: def __init__(self,name,guestLogin,server,floats): self.name = name self.server = server self.floats = floats acc = HButtonSelect([("Log out",self.logout),("Change username",self.changename),("Change password",self.changepass)]) if guestLogin: acc = HSplit([ Box(HButtonSelect([("Log out",self.logout)]),padding=0), Label("You are currently logged in as a guest."), ]) self.el = acc def logout(self): get_app().exit(result="login") def changename(self): usernameValidator = Validator.from_callable(isValidUsername, error_message='Invalid username') def nameaccept(buf: Buffer): # get_app().layout.focus(okbtn) dlgclose(True) return True nntxtfield = TextArea( text=self.name, multiline=False, password=False, completer=None, validator=usernameValidator, accept_handler=nameaccept, ) okbtn = Button("OK",handler=lambda: dlgclose(True)) cancelbtn = Button("Cancel",handler=lambda: dlgclose(False)) async def _changename(): res = await self.server.changename(nntxtfield.text) if res["type"]=="error": await spawnSimplePopup("Error",errorTxt(res),self.floats) else: get_app().exit(result="restart") def dlgclose(res): despawn() if not res: return get_app().create_background_task(_changename()) dlg = Dialog( title="Change name", body=HSplit([ Label(text="Insert your account's new name here:", dont_extend_height=True), nntxtfield, Label(text="Keep in mind that you can only change your name every 7 days.", dont_extend_height=True), ValidationToolbar(), ]), buttons=[okbtn, cancelbtn] ) despawn = spawnDialog(dlg,self.floats) def changepass(self): def oldaccept(buf: Buffer): get_app().layout.focus(newtxtfield) return True def newaccept(buf: Buffer): # get_app().layout.focus(okbtn) dlgclose(True) return True oldtxtfield = TextArea( text="", multiline=False, password=True, completer=None, validator=None, accept_handler=oldaccept, ) newtxtfield = TextArea( text="", multiline=False, password=True, completer=None, validator=None, accept_handler=newaccept, ) okbtn = Button("OK",handler=lambda: dlgclose(True)) cancelbtn = Button("Cancel",handler=lambda: dlgclose(False)) async def _changepass(): res = await self.server.changepass(oldtxtfield.text,newtxtfield.text) if res["type"]=="error": await spawnSimplePopup("Error",errorTxt(res),self.floats) def dlgclose(res): despawn() if not res: return get_app().create_background_task(_changepass()) dlg = Dialog( title="Change password", body=HSplit([ Label(text="Old password:", dont_extend_height=True), oldtxtfield, Label(text="New password:", dont_extend_height=True), newtxtfield, ValidationToolbar(), ]), buttons=[okbtn, cancelbtn] ) despawn = spawnDialog(dlg,self.floats)