SYNOPSIS
        #include <interactive_info.h>

        mixed interactive_info(object ob, int what)

DESCRIPTION
        Returns some internal information about the interactive user <ob>.
        The argument <what> determines which information is returned.

        It can be either a configuration option as given to
        configure_interactive() or one of the following options:



        Connection Information:

        <what> == II_IP_NAME:
          The hostname of <ob>. The hostname will asynchronously
          looked up by the ERQ daemon and might therefore not be
          available at the time of the first connection.
          If no name is available the address will be returned.

        <what> == II_IP_NUMBER:
          The IP address of <ob> given as a string.

        <what> == II_IP_PORT:
          The client port number of <ob>.

        <what> == II_IP_ADDRESS:
          The full socket address structure given as an array of bytes.

          For IPv4 (sockaddr_in):
              array[0.. 1]: sin_family
              array[2.. 3]: sin_port
              array[4.. 7]: sin_addr
              array[8..15]: undefined.

          For IPv6 (sockaddr_in6):
              array[ 0.. 1]: sin6_family
              array[ 2.. 3]: sin6_port
              array[ 4.. 7]: sin6_flowinfo
              array[ 8..23]: sin6_addr
              array[24..27]: sin6_scope_id

        <what> == II_MUD_PORT:
          The server port number that <ob> connected to.



        Telnet Related Information:

        <what> == II_MCCP_STATS:
          Statistics about the current compression of <ob> given
          as an array ({ uncompressed bytes, compressed bytes }).

          If the connection is not compressed, 0 is returned.

          Available only if the driver is compiled with MCCP enabled;
          __MCCP__ is defined in that case.



        Input Handling:

        <what> == II_INPUT_PENDING:
          If <ob> has an input_to() pending, the object that has called
          the input_to() is returned, else 0.

        <what> == II_EDITING:
          If <ob> is currently editing with ed() and ed() was called with
          an exit function, then the object that has called ed()
          will be returned, 0 otherwise.

        <what> == II_IDLE:
          The number of seconds that the interactive object <ob> has been
          idle.



        Output Handling:

        <what> == II_SNOOP_NEXT:
          Returns the user who is currently snooping <ob>.
          The calling object must be privileged by the master object
          via valid_query_snoop().

        <what> == II_SNOOP_PREV:
          Returns the victim who is currently snooped by <ob>.
          The calling object must be privileged by the master object
          via valid_query_snoop().

        <what> == II_SNOOP_ALL:
          Returns all objects who are currently snooping <ob>.
          Only one object can snoop <ob> directly, but that user might
          be snooped, too, and so building a chain that is returned
          as an array.

          The calling object must be privileged by the master object
          via valid_query_snoop().


HISTORY
        Introduced in LDMud 3.5.0.

SEE ALSO
        configure_interactive(E), object_info(E), driver_info(E)
