Files
StingNET/telnet-basic/account_settings.py
T

126 lines
4.0 KiB
Python

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)