# `pwnlib.ui` — Functions for user interaction

pwnlib.ui.more(text)

  Shows text like the command line tool `more`.

  It not in term_mode, just prints the data to the screen.

  Parameters:

    text (str) – The text to show.

  Returns:

    `None`

  Tests:

       >>> more("text")
       text
       >>> p = testpwnproc("more('text\\n' * (term.height + 2))")
       >>> p.send(b"x")
       >>> data = p.recvall()
       >>> b"text" in data or data
       True

pwnlib.ui.options(prompt, opts, default=None)

  Presents the user with a prompt (typically in the form of a question) and a number of options.

  Parameters:

    - prompt (str) – The prompt to show

    - opts (list) – The options to show to the user

    - default – The default option to choose

  Returns:

    The users choice in the form of an integer.

  Examples:

       >>> options("Select a color", ("red", "green", "blue"), "green")
       Traceback (most recent call last):
       ...
       ValueError: options(): default must be a number or None

  Tests:

       >>> p = testpwnproc("print(options('select a color', ('red', 'green', 'blue')))")
       >>> p.sendline(b"\33[C\33[A\33[A\33[B\33[1;5A\33[1;5B 0310")
       >>> _ = p.recvall()
       >>> saved_stdin = sys.stdin
       >>> try:
       ...     sys.stdin = io.TextIOWrapper(io.BytesIO(b"\n4\n\n3\n"))
       ...     with context.local(log_level="INFO"):
       ...         options("select a color A", ("red", "green", "blue"), 0)
       ...         options("select a color B", ("red", "green", "blue"))
       ... finally:
       ...     sys.stdin = saved_stdin
        [?] select a color A
              1) red
              2) green
              3) blue
            Choice [1] 0
        [?] select a color B
              1) red
              2) green
              3) blue
            Choice  [?] select a color B
              1) red
              2) green
              3) blue
            Choice  [?] select a color B
              1) red
              2) green
              3) blue
            Choice 2

pwnlib.ui.pause(n=None)

  Waits for either user input or a specific number of seconds.

  Examples:

       >>> with context.local(log_level="INFO"):
       ...     pause(1)
       [x] Waiting
       [x] Waiting: 1...
       [+] Waiting: Done
       >>> pause("whatever")
       Traceback (most recent call last):
       ...
       ValueError: pause(): n must be a number or None

  Tests:

       >>> saved_stdin = sys.stdin
       >>> try:
       ...     sys.stdin = io.TextIOWrapper(io.BytesIO(b"\n"))
       ...     with context.local(log_level="INFO"):
       ...         pause()
       ... finally:
       ...     sys.stdin = saved_stdin
       [*] Paused (press enter to continue)
       >>> p = testpwnproc("pause()")
       >>> b"Paused" in p.recvuntil(b"press any")
       True
       >>> p.send(b"x")
       >>> _ = p.recvall()

pwnlib.ui.yesno(prompt, default=None)

  Presents the user with prompt (typically in the form of question) which the user must answer yes or no.

  Parameters:

    - prompt (str) – The prompt to show

    - default – The default option; True means “yes”

  Returns:

    True if the answer was “yes”, False if “no”

  Examples:

       >>> yesno("A number:", 20)
       Traceback (most recent call last):
       ...
       ValueError: yesno(): default must be a boolean or None
       >>> saved_stdin = sys.stdin
       >>> try:
       ...     sys.stdin = io.TextIOWrapper(io.BytesIO(b"x\nyes\nno\n\n"))
       ...     yesno("is it good 1")
       ...     yesno("is it good 2", True)
       ...     yesno("is it good 3", False)
       ... finally:
       ...     sys.stdin = saved_stdin
        [?] is it good 1 [yes/no] Please answer yes or no
        [?] is it good 1 [yes/no] True
        [?] is it good 2 [Yes/no] False
        [?] is it good 3 [yes/No] False

  Tests:

       >>> p = testpwnproc("print(yesno('is it ok??'))")
       >>> b"is it ok" in p.recvuntil(b"??")
       True
       >>> p.sendline(b"x\nny")
       >>> b"True" in p.recvall()
       True