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(c, on_str, on_tab): while True: c.redraw() char = await asyncio.to_thread(c.stdscr.get_wch) if isinstance(char, str): if char == '\n': if c.typed_message != "": await on_str(c.typed_message) c.messages.append(c.typed_message) c.typed_message = "" elif char == '\t': await on_tab() else: c.typed_message += char else: if char == 263: c.typed_message = c.typed_message[:-1]