import humanize, datetime from helpers import spawnDialog, spawnSimplePopup, spawnYesNoPopup, HButtonSelect, errorTxt, isValidUsername from prompt_toolkit.application.current import get_app from prompt_toolkit.buffer import Buffer from prompt_toolkit.layout import FormattedTextControl from prompt_toolkit.layout.containers import HSplit, Window from prompt_toolkit.layout.dimension import Dimension as D from prompt_toolkit.validation import Validator from prompt_toolkit.widgets import Button, Dialog, Label, TextArea, RadioList, ValidationToolbar class AdminPanel: def __init__(self,floats,server): self.floats = floats self.server = server self.el = HButtonSelect([("Ban user",self.banuser),("Unban user",self.unbanuser)]) async def banuserconfirm(self,name,duration,motive): res = await self.server.getuserinfo(name) if res["type"]=="error": return await spawnSimplePopup("Error",f"{errorTxt(res)}\nCould not get information about the user.",self.floats) info = res["response"] create_time = datetime.datetime.fromtimestamp(info["created"]) motivestr = f"\"{motive}\"" if len(motive)>0 else "N/A" conf = await spawnYesNoPopup("Confirm Ban?",Window(FormattedTextControl([ ("","You are about to ban "), ("bold",info["name"]), (""," for "), ("bold",({0: "an indefinite amount of time",24*60*60: "24 hours",3*24*60*60: "3 days",7*24*60*60: "7 days"})[duration]), ("",".\n\nMotive: "),("bold",motivestr),("","\n"), ("","\nUser information:\n"), ("","- Internal ID: "),("bold",str(info["id"])),("","\n"), ("","- Created: "),("bold",humanize.naturaldate(create_time)),("",f" ({create_time})\n") ],focusable=False),dont_extend_width=True,dont_extend_height=True),self.floats) if conf: res = await self.server.banuser(info["id"],duration,motive) if res["type"]=="error": await spawnSimplePopup("Error",f"{errorTxt(res)}\nCould not ban this user.",self.floats) def banuser(self): def dlgclose(): despawn() get_app().create_background_task(self.banuserconfirm(usertextfield.text,timeselect.current_value,motivetextfield.text)) def nameaccept(buf: Buffer): get_app().layout.focus(motivetextfield) return True def motiveaccept(buf: Buffer): get_app().layout.focus(timeselect) return True usernameValidator = Validator.from_callable(isValidUsername, error_message='Invalid username') ok_button = Button(text="OK", handler=dlgclose, width=16) cancel_button = Button(text="Cancel", handler=lambda: despawn(), width=16) usertextfield = TextArea( text="", multiline=False, password=False, completer=None, validator=usernameValidator, accept_handler=nameaccept, ) motivetextfield = TextArea( text="", multiline=False, password=False, completer=None, validator=None, accept_handler=motiveaccept, ) timeselect = RadioList([(24*60*60,"24 hours"),(3*24*60*60,"3 days"),(7*24*60*60,"7 days"),(0,"Permanent")],default=24*60*60) dlg = Dialog( title="Ban user", body=HSplit( [ Label(text="Username:", dont_extend_height=True), usertextfield, Label(text="Motive:", dont_extend_height=True), motivetextfield, Label(text="Time:", dont_extend_height=True), timeselect, ValidationToolbar(), ], padding=D(preferred=1, max=1), width=70 ), buttons=[ok_button, cancel_button], with_background=True, ) despawn = spawnDialog(dlg,self.floats) async def unbanuserconfirm(self,name): res = await self.server.getuserinfo(name) if res["type"]=="error": return await spawnSimplePopup("Error",f"{errorTxt(res)}\nCould not get information about the user.",self.floats) info = res["response"] if info["banned"]==False: return await spawnSimplePopup("Error",f"The user {name} is not banned.",self.floats) create_time = datetime.datetime.fromtimestamp(info["created"]) ban_date = datetime.datetime.fromtimestamp(info["ban_details"]["ban_date"]) expire_date = datetime.datetime.fromtimestamp(info["ban_details"]["expire_date"]) if info["ban_details"]["expire_date"]>0 else "Indefinite" motive = f"\"{info["ban_details"]["motive"]}\"" if ("motive" in info["ban_details"]) and (len(info["ban_details"]["motive"])>0) else "N/A" conf = await spawnYesNoPopup("Confirm Ban?",Window(FormattedTextControl([ ("","You are about to unban "), ("bold",info["name"]), ("",".\n\nUser information:\n"), ("","- Internal ID: "),("bold",str(info["id"])),("","\n"), ("","- Created: "),("bold",humanize.naturaldate(create_time)),("",f" ({create_time})\n"), ("","\nBan information:\n"), ("","- Motive: "),("bold",motive),("","\n"), ("","- Banned on: "),("bold",humanize.naturaldate(ban_date)),("",f" ({ban_date})\n"), ("","- Ban expires on: "),("bold",humanize.naturaldate(expire_date)),("",f" ({expire_date})\n"), ],focusable=False),dont_extend_width=True,dont_extend_height=True),self.floats) if conf: res = await self.server.unbanuser(info["id"]) if res["type"]=="error": await spawnSimplePopup("Error",f"{errorTxt(res)}\nCould not unban this user.",self.floats) def unbanuser(self): def dlgclose(): despawn() get_app().create_background_task(self.unbanuserconfirm(usertextfield.text)) def nameaccept(buf: Buffer): dlgclose() return True usernameValidator = Validator.from_callable(isValidUsername, error_message='Invalid username') ok_button = Button(text="OK", handler=dlgclose, width=16) cancel_button = Button(text="Cancel", handler=lambda: despawn(), width=16) usertextfield = TextArea( text="", multiline=False, password=False, completer=None, validator=usernameValidator, accept_handler=nameaccept, ) dlg = Dialog( title="Unban user", body=HSplit( [ Label(text="Username:"), usertextfield, ValidationToolbar(), ], padding=D(preferred=1, max=1), ), buttons=[ok_button, cancel_button], with_background=True, ) despawn = spawnDialog(dlg,self.floats)