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.

        <what> == II_NOECHO:
          The current no-echo mode of <ob>:
            0: Normal echo mode
            1: no-echo mode was requested (INPUT_NOECHO input is pending)
            2: no-echo mode was acknowledged by the client (this does not
               happen, if the mudlib handles this with the H_NOECHO hook).

        <what> == II_CHARMODE:
          Whether charmode is active for <ob>.
          The values are similar to II_NOECHO.



        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)
