SYNOPSIS
        #include <configuration.h>

        void configure_interactive(object ob, int what, mixed data)

DESCRIPTION
        Sets the option <what> to the value <data> on the interactive <ob>
        or the default for all interactives if <ob> is 0.

        If the first argument <ob> is not this_object(), the privilege
        violation ("configure_interactive", this_object(), ob, what, data)
        occurs.

        As <what>, the following arguments are accepted:

        <what> == IC_MAX_WRITE_BUFFER_SIZE
          Sets the maximum amount of data to be held pending for writing
          per player to <data> bytes. A value of -1 means unlimited,
          0 deactivates the write buffer.

        <what> == IC_SOCKET_BUFFER_SIZE
          Changes the socket buffer size to the given size in bytes.
          Not every operating system might provide this option to
          change the buffer size.

          The buffer size is used for sending, when the remote side isn't
          getting the data fast enough. When the socket buffer is full,
          the driver will buffer in its internal write buffer (see
          IC_MAX_WRITE_BUFFER_SIZE). When that gets full, too, then
          messages are discarded.

        <what> == IC_COMBINE_CHARSET_AS_STRING
          Set the set of characters which can be combined into a single
          string when already received en-bloc in charmode from the
          interactive user <ob>. Non-combinable characters and single
          received characters are returned as separate strings as usual.

          The newline '\n' and the NUL character '\0' are always
          non-combinable.

          The given string should contain all combinable characters.
          If given as the number 0, the default combine charset is
          re-established.

        <what> == IC_COMBINE_CHARSET_AS_ARRAY
          Set the set of characters which can be combined into a single
          string, just like IC_COMBINE_CHARSET_AS_STRING.

          The given array shall contain an array of up to 32 integers
          that are interpreted as 8-bit-values. Each character is encoded
          as one bit (ASCII characters 0-7 in the first integer, and so on).
          So a character <n> is treated as combinable if

              array[n/8] & (1 << n%8)

          If the array contains less elements, the missing elements will
          be regarded as 0 (non-combinable characters).

        <what> == IC_CONNECTION_CHARSET_AS_STRING
          Set the set of characters which can be output to the interactive
          user <ob>. All other characters are discarded. (This does not
          apply to binary_message()).

          The given string should contain all allowed characters.
          If given as the number 0, the default charset is re-established.

        <what> == IC_CONNECTION_CHARSET_AS_ARRAY
          Set the set of characters which can be output to the interactive
          user <ob>, just like IC_CONNECTION_CHARSET_AS_STRING.

          The given array shall contain an array of up to 32 integers
          that are interpreted as 8-bit-values. Each character is encoded
          as one bit (ASCII characters 0-7 in the first integer, and so on).
          So a character <n> is allowed to be output if

              array[n/8] & (1 << n%8)

          If the array contains less elements, the missing elements will
          be regarded as 0 (not allowed, ie. to be discarded).

        <what> == IC_QUOTE_IAC
          Sets whether the character 255 (telnet IAC) shall be quoted
          by prepending another IAC character, so it will not be interpreted
          by the telnet protocol. Enable with 1, disable with 0. By default
          it is enabled and does only apply if character 255 is allowed to
          be output (ie. it is part of the connection charset).

        <what> == IC_TELNET_ENABLED
          Enables (1) or disables (0) the telnet machine for the interactive
          user <ob>. When deactivated the driver won't handle telnet
          negotiations (eg. H_TELNET_NEG won't be called), they will be
          part of the user input. Also INPUT_NOECHO won't be effective
          as the driver won't send any telnet negotiations itself.

        <what> == IC_MCCP
          Starts oder ends MCCP compression of the driver -> client traffic.
          <data> must be the MCCP version (either TELOPT_COMPRESS or
          TELOPT_COMPRESS2 from <telnet.h>). When the telnet machine
          is disabled, any value other then zero will do, and the compression
          starts without a telnet preamble.

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

        <what> == IC_PROMPT
          Sets the prompt for the interactive user <ob> to <data>. The
          prompt can either be a string or a closure that will be called
          each time the prompt is shown.

        <what> == IC_MAX_COMMANDS
          Sets the max number of commands the interactive user <ob> is
          allowed to execute per second to <data>. A negative value means
          'unlimited' and is the setting for newly created connections.

          A 'command' in this context means every received data packet
          which causes a LPC call - actions and calls to input_to()
          alike.

        <what> == IC_MODIFY_COMMAND
          Sets an object that will act as a modifier for each command.
          All commands for the interactive user <ob> will be passed to
          data->modify_command() before actually being executed.
          <data> must be given as an object.

          When an object is set, the H_MODIFY_COMMAND hook wont be
          called anymore. 0 as argument will stop the command modification
          and reinstall the use of that driver hook.

          This mechanism is intended to expand aliases on quicktypers
          or the like. The name of the lfun called can be changed
          from modify_command() to something else using the
          H_MODIFY_COMMAND_FNAME hook.


HISTORY
        Introduced in LDMud 3.3.719.

SEE ALSO
        configure_driver(E)
