import curses import asyncio import sys class Console(): def __init__(self, messages): self.stdscr = curses.initscr() self.messages = messages self.typed_message = "" def __enter__(self): curses.noecho() curses.cbreak() self.stdscr.keypad(True) return self def __exit__(self, *_): curses.nocbreak() self.stdscr.keypad(False) curses.echo() curses.endwin() def redraw(self): self.stdscr.clear() for msg in self.messages: self.stdscr.addstr(msg + '\n') if self.typed_message != "": self.stdscr.addstr(self.typed_message) self.stdscr.refresh() async def start(self, on_str, on_tab): while True: self.redraw() char = await asyncio.to_thread(self.stdscr.get_wch) if isinstance(char, str): if char == '\n': if self.typed_message != "": await on_str(self.typed_message) self.messages.append(self.typed_message) self.typed_message = "" elif char == '\t': await on_tab() else: self.typed_message += char else: if char == 263: self.typed_message = self.typed_message[:-1]