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', the NUL character '\0' and non-ASCII
          characters (unicode characters > 127) 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 16 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 only
          apply to characters in the ASCII character set (first 128
          characters). This does not apply to unicode characters > 127
          or 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 16 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.

        <what> == IC_ENCODING
          Sets the encoding to convert the network input to/from.
          All received bytes (except telnet negotiations) will be converted
          using this encoding to the internal unicode representation.
          And all text strings will be converted back to this encoding
          when sent to the interactive.

          Default is "ISO-8859-1//TRANSLIT".


HISTORY
        Introduced in LDMud 3.3.719.
        IC_ENCODING introduced in LDMud 3.6.0.


SEE ALSO
        configure_driver(E)
