[project @ 2005-06-01 11:12:41 by unknown_lamer]
[clinton/bobotpp.git] / bobot++.info
index a9712c3..364f5c1 100644 (file)
@@ -1,10 +1,10 @@
-This is bobot++.info, produced by makeinfo version 4.1 from
+This is bobot++.info, produced by makeinfo version 4.7 from
 bobot++.texinfo.
 
    This file documents Bobot++ by Clinton Ebadi and Etienne Bernard
 (original author, no longer works on program).
 
-   Copyright 2002 Clinton Ebadi
+   Copyright 2002,2004,2005 Clinton Ebadi
 
    Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.1 or
@@ -18,9 +18,9 @@ File: bobot++.info,  Node: Top,  Next: Introduction,  Prev: (dir),  Up: (dir)
    This document describes Bobot++ by Clinton Ebadi and Etienne Bernard
 (original author, no longer works on program).
 
-   This document applies to version 2.1.0 of the program named Bobot++
+   This document applies to version 2.1.5 of the program named Bobot++
 
-   Copyright 2002 Clinton Ebadi
+   Copyright 2002,2004 Clinton Ebadi
 
    Permission is granted to copy, distribute and/or modify this document
 under the terms of the GNU Free Documentation License, Version 1.1 or
@@ -38,100 +38,437 @@ Texts.
 * Function Index::
 * Variable Index::
 
+ --- The Detailed Node Listing ---
+
+Configuration
+
+* Configuration Files::
+* Configuration File Placement::
+
+Configuration Files
+
+* bot.conf::
+* bot.users::
+
+bot.conf
+
+* server syntax::
+* channel syntax::
+
+Using Bobot++
+
+* Starting the Bot::
+* User Levels::
+* Protection::
+* Automatic Op::
+* Built-In Commands::
+
+Scripting
+
+* Adding New Commands::
+* Hooks::
+* Scheme User Levels::
+* Sending Messages::
+* Misc Scripting Stuff::
+
+Hooks
+
+* Creating a Hook::
+* Hook Types::
+
+Sending Messages
+
+* High Level Message Functions::
+* Low Level Message Functions::
+
 \1f
 File: bobot++.info,  Node: Introduction,  Next: Configuration,  Prev: Top,  Up: Top
 
-Introduction
-************
+Introduction
+**************
 
-   This manual feels abused and neglected because it has almost no
-content.
+This manual feels abused and neglected because it has almost no content.
 
 \1f
 File: bobot++.info,  Node: Configuration,  Next: Using the Bot,  Prev: Introduction,  Up: Top
 
-Configuration
-*************
+Configuration
+***************
 
-   Bobot++ is easy to configure. The configuration file format may be
-changing in the 2.1 series, so it is not documented for now. See the
-`examples' directory for an example configuration.
+Bobot++ is easy to configure. See the `examples' directory for an
+example configuration.
 
 * Menu:
 
-* Configuration File Syntax::
-* Configure File Placement::
+* Configuration Files::
+* Configuration File Placement::
 
 \1f
-File: bobot++.info,  Node: Configuration File Syntax,  Next: Configure File Placement,  Prev: Configuration,  Up: Configuration
+File: bobot++.info,  Node: Configuration Files,  Next: Configuration File Placement,  Prev: Configuration,  Up: Configuration
 
-Configuration File Syntax
-=========================
+2.1 Configuration Files
+=======================
+
+* Menu:
 
-   Not here yet.
+* bot.conf::
+* bot.users::
 
 \1f
-File: bobot++.info,  Node: Configure File Placement,  Prev: Configuration File Syntax,  Up: Configuration
+File: bobot++.info,  Node: bot.conf,  Next: bot.users,  Prev: Configuration Files,  Up: Configuration Files
 
-Configuration File Placement
-============================
+2.1.1 bot.conf
+--------------
 
-   Bobot++ will look in `/etc/bobotpp/default/' for its default config
-if none is specified on the command line. Put the configuration files
-you want to be loaded by default in this directory. If you are not root
-or you want to have your own personal configration, put it in
+* Menu:
+
+* server syntax::
+* channel syntax::
+
+   `bot.conf' contains key value pairs separated by `='.
+
+   `<key> = <value>'
+
+   Comments are started with a `#' and cause the entire line to be
+ignored. _Note that this only works when the `#' is the first character
+of the line_.
+
+   bot.conf is the main configuration file for a Bobot++. The available
+configuration variables are listed below in the format "VARIABLE
+<default-value>: description"
+
+   * NICKNAME <Bobot>: The nickname of the bot (NICK is an alias for
+     NICKNAME)
+
+   * USERNAME <bobot>: The IRC username of the bot
+
+   * CMDCHAR <!>: The character that prefixes commands given to the bot
+     (COMMAND is an alias for CMDCHAR)
+
+   * IRCNAME <I'm a bobot++!>: The IRC name (or 'real name') of the bot
+     (REALNAME is an alias for IRCNAME)
+
+   * USERLIST <bot.users>: Name of the file where the userlist is stored
+
+   * SHITLIST <bot.shit>: Name of the file where the shitlist is stored
+
+   * LOGFILE <$LOGDIR/bot.log>: Location of the bot logfile (set this
+     to `/dev/null' to disable logging).
+
+   * SERVER <None>: This specifies the server to connect to. Note that
+     this has a special syntax.
+
+   * CHANNEL <None>: This specifies a channel the bot will join when it
+     starts up. This also has a special syntax.
+
+
+\1f
+File: bobot++.info,  Node: server syntax,  Next: channel syntax,  Prev: bot.conf,  Up: bot.conf
+
+2.1.1.1 server syntax
+.....................
+
+SERVER = SERVER_NAME [PORT [PASSWORD]]
+
+   This will make Bobot++ attempt to connect to SERVER_NAME on port
+PORT with the password PASSWORD. SERVER_NAME should be the address of
+the server. PORT and PASSWORD are optional. You may use more than one
+server line; Bobot++ will attempt to connect to the first one and, if
+it fails, will connect to the next one in the list. There is also a
+command to cause the bot to cycle servers. At the present time Bobot++
+cannot connect to more than one server at a time. This is a planned
+feature of 3.0 (which is a very long way away; the current structure of
+the program would make it very difficult to add support for connecting
+to multiple servers at a time in a usable manner).
+
+\1f
+File: bobot++.info,  Node: channel syntax,  Prev: server syntax,  Up: bot.conf
+
+2.1.1.2 channel syntax
+......................
+
+CHANNEL = NAME:INITIAL_MODES:MODES_TO_KEEP:CHANNEL_KEY
+
+   You may have any number of channel lines. When Bobot++ starts it will
+attempt to join and gain ops in every channel listed. It will join NAME
+and set the channel modes to INITIAL_MODES (e.g. "nt") if it is able to
+gain operator status. It will then maintain MODES_TO_KEEP. If the
+channel requires a key to enter simply set CHANNEL_KEY. Every argument
+except for NAME is optional.
+
+   A few example lines:
+
+   `CHANNEL = #foo:nt:nt:bar'
+
+   The bot will join `#foo' with the channel key `bar' and will then
+maintain the modes `nt'.
+
+   `CHANNEL = #bar:::'
+
+   The bot will join `#bar' and will not set any modes nor will it
+attempt to maintain any modes.
+
+\1f
+File: bobot++.info,  Node: bot.users,  Prev: bot.conf,  Up: Configuration Files
+
+2.1.2 bot.users
+---------------
+
+`bot.users' is the default file name of the userlist. It may be changed
+in `bot.conf'. The file contains lines with the format:
+
+   `MASK:CHANNEL:LEVEL:PROTECTION:AUTO-OP'
+
+   * MASK is the host mask (e.g. `*!*username
+     .domain.com') of the user
+
+   * CHANNEL is a channel mask of the channels that the user has
+     priviliges to use the bot in (e.g. `*' for all channels, `#*' for
+     all non-local channel, `#foo*' for all channels starting with
+     "foo," `#bar' for channel "#bar" only, etc.)
+
+   * LEVEL is the user level of the user (*Note User Levels::).
+
+   * PROTECTION is the protection level of the user (*Note
+     Protection::).
+
+   * AUTO-OP is set to control whether a user is automatically given
+     operator priviliges on channel entry (*Note Automatic Op::).
+
+
+\1f
+File: bobot++.info,  Node: Configuration File Placement,  Prev: Configuration Files,  Up: Configuration
+
+2.2 Configuration File Placement
+================================
+
+Bobot++ will look in `/etc/bobotpp/default/' for its default config if
+none is specified on the command line. Put the configuration files you
+want to be loaded by default in this directory. If you are not root or
+you want to have your own personal configuration, put it in
 `~/.bobotpp/config/default/'.
 
 \1f
 File: bobot++.info,  Node: Using the Bot,  Next: Scripting,  Prev: Configuration,  Up: Top
 
-Using Bobot++
-*************
+Using Bobot++
+***************
 
-   FIXME: stuff here...
+FIXME: stuff here...
 
 * Menu:
 
+* Starting the Bot::
 * User Levels::
+* Protection::
+* Automatic Op::
+* Built-In Commands::
+
+\1f
+File: bobot++.info,  Node: Starting the Bot,  Next: User Levels,  Prev: Using the Bot,  Up: Using the Bot
+
+3.1 Starting the Bot
+====================
+
+The bot is usually installed with the binary name `bobotpp'. It accepts
+the following command line arguments:
+
+   * `[--help][-h]' - Shows detailed help and exits
+
+   * `[--version][-v]' - Shows version information and exits
+
+   * `[--no-background][-b]' - Run bobot++ in the foreground
+
+   * `[--config-file file][-f]' - Use file instead of `bot.conf'
+
+   * `[--config-dir dir][-d]' - Use dir as dir to load config file from
+
+   * `[--config dir][-c]' - Search your config path (defaults to
+     `$HOME/.bobotpp/config/' and then `/etc/bobotpp/') for dir and
+     then loads your config data using dir
+
+   * `[--sys-config dir][-s]' - Looks for config in `/etc/bobotpp/dir'.
+     Note that the user dir is still searched first
+
+   * `[--user-config dir][-u]' - Looks for config in
+     `$HOME/.bobotpp/config/dir/'. Note that the system dir is still
+     searched after this if dir is not found.
+
+   * `[--debug][-D]' Makes Bobot++ print debugging info and run in the
+     foreground
+
+
+   The default configuration is read from
+`$HOME/.bobotpp/config/default/' and then `/etc/bobotpp/default/' if
+the user config is not found.
+
+   The bot defaults to running in the background as a daemon.
+
+\1f
+File: bobot++.info,  Node: User Levels,  Next: Protection,  Prev: Starting the Bot,  Up: Using the Bot
+
+3.2 User Levels
+===============
+
+There are several user levels available in Bobot++ to provide gradated
+access to commands. `!adduser' and `bot.users' use the numeric code;
+Scheme uses the textual name for the level. By default (if no catch-all
+setting is found in *Note bot.users::.) a user is not even a
+`bot:user-none' and cannot execute *any* commands, even commands
+available to `bot:user-none'.
+
+  0. `bot:user-none' - No *built-in* commands may be executed _by
+     default_ (commands may be added from Scheme that can be executed
+     by users of level none and the level required to execute a command
+     may be changed from Scheme).
+
+  1. `bot:user-user' - Will be able to execute most commands but not
+     all and cannot use masks on kicks and bans.
+
+  2. `bot:user-trusted' - For built-ins with a default configuration
+     this user has access to the same set of commands as an `user' but
+     may use masks on kicks and bans. Scheme commands may be added
+     which require a user to be of this level.
+
+  3. `bot:user-friend' - In the default configuration a user who is a
+     friend will be able to do everything short of stopping the bot.
+     Again, there may be user added commands that require a higher user
+     level.
+
+  4. `bot:user-master' - This is the highest user level and has access
+     to every feature of the bot.
+
+
+\1f
+File: bobot++.info,  Node: Protection,  Next: Automatic Op,  Prev: User Levels,  Up: Using the Bot
+
+3.3 Protection
+==============
+
+A user added via Scheme, the `bot.users' file, or `!adduser' may be
+protected from being deoped, kicked, or banned. There are currently no
+symbolic levels in Scheme; just use the numeric code.
+
+  0. No protection
+
+  1. No ban. If a user is banned the bot will unban him..
+
+  2. No kick. The user may still be kicked but the bot will kickban the
+     user who kicked the protected user.
+
+  3. No deop. The bot will ensure that the user always maintains
+     operator status.
+
 
 \1f
-File: bobot++.info,  Node: User Levels,  Prev: Using the Bot,  Up: Using the Bot
-
-User Levels
-===========
-
-   There are five levels that a user may be when interfacing with a bot:
-NONE, USER, TRUSTED_USER, FRIEND, MASTER. All users default to NONE
-unless they are changed by a script, the `!adduser' command or the
-`bot.users' file. NONE is for everyone--very few commands (e.g. help)
-are available to the users and almost everyone should be this level. A
-USER can execute many of the bot commands, but can't use masks on kicks
-and bans. A TRUSTED user can everything a USER can do, but can also use
-masks on kicks and bans. A FRIEND can do everything except for stopping
-the bot (be careful who you give this to!). The MASTER level is for the
-bot's owner (probably you) and can do _everything_ to the bot. Be
-_very_ careful if you give MASTER level access to anyone else. You
-cannot use this symbolic levels with the `!adduser' command. See
-(FIXME: ref) for the numbers you must use with `!adduser'.
+File: bobot++.info,  Node: Automatic Op,  Next: Built-In Commands,  Prev: Protection,  Up: Using the Bot
+
+3.4 Automatic Op
+================
+
+A user may be automatically given operator status upon entering a
+channel. Set the AOP field to "0" to disable auto-op or "1" to enable
+auto-op.
+
+\1f
+File: bobot++.info,  Node: Built-In Commands,  Prev: Automatic Op,  Up: Using the Bot
+
+3.5 Built-In Commands
+=====================
+
+Bobot++ has many built-in commands that make it useful without
+scripting support. The reference leaves off the command char; remember
+to use whatever you defined the command char to be in `bot.conf'. If a
+command needs the channel name then you must specify the channel as the
+first argument to the command when private messaging the bot a command.
+
+COMMAND            NEEDS CHANNEL      MIN LEVEL TO USE   DESCRIPTION
+`action' `do'      Yes                USER                Causes the bot
+                                                         to perform the
+                                                         action `do' in
+                                                         the current
+                                                         channel.
+`adduser'                                                
+`addserver'                                              
+`addshit'                                                
+`alias'                                                  
+`ban'                                                    
+`banlist'                                                
+`channels'                                               
+`cycle'                                                  
+`dcclist'                                                
+`deban'                                                  
+`delserver'                                              
+`deluser'                                                
+`delshit'                                                
+`deop'                                                   
+`die'                                                    
+`do'                                                     
+`execute'                                                *Only available
+                                                         if scripting
+                                                         support is
+                                                         enabled*
+`help'                                                   
+`ident'                                                  
+`invite'                                                 
+`join'                                                   
+`keep'                                                   
+`kick'                                                   
+`kickban'                                                
+`load'                                                   
+`loadscript'                                             *Only available
+                                                         if scripting
+                                                         support is
+                                                         enabled*
+`lock'                                                   
+`mode'                                                   
+`msg'                                                    
+`names'                                                  
+`nextserver'                                             
+`nick'                                                   
+`nslookup'                                               
+`op'                                                     
+`part'                                                   
+`password'                                               
+`reconnect'                                              
+`rspymessage'                                            
+`save'                                                   
+`say'                                                    
+`server'                                                 
+`serverlist'                                             
+`setfloodrate'                                           
+`setversion'                                             
+`shitlist'                                               
+`spylist'                                                
+`spymessage'                                             
+`stats'                                                  
+`tban'                                                   
+`tkban'                                                  
+`topic'                                                  
+`unlock'                                                 
+`userlist'                                               
+`who'                                                    
+`whois'                                                  
 
 \1f
 File: bobot++.info,  Node: Scripting,  Next: Concept Index,  Prev: Using the Bot,  Up: Top
 
-Scripting
-*********
+Scripting
+***********
 
-   Bobot++'s most powerful feature is its scripting system. You write
+Bobot++'s most powerful feature is its scripting system. You write
 scripts using Guile Scheme. This manual does not cover how to use Guile
 or how to learn Scheme. *Note Guile Reference Manual: (guile)Top, for
 the Guile reference manual and
-<http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html> for a
+`http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html' for a
 good tutorial on Scheme.
 
    Note that in previous versions the scripting commands where in the
 form `bot-FUNCTION'. They are now in the form `bot:FUNCTION'. The old
 names are still available, but are deprecated and will be removed in
-Bobot++ 2.4. The command `perl -pi -e ``s/bot-/bot:/g'' YOUR-FILES'
-should be enough to convert your code to use the new functions.
+Bobot++ 3.0. New commands are only available with the `bot:' prefix.
+The command `perl -pi -e ``s/bot-/bot:/g'' YOUR-FILES' should be enough
+to convert your code to use the new functions.
 
 * Menu:
 
@@ -144,10 +481,10 @@ should be enough to convert your code to use the new functions.
 \1f
 File: bobot++.info,  Node: Adding New Commands,  Next: Hooks,  Prev: Scripting,  Up: Scripting
 
-Adding New Commands
-===================
+4.1 Adding New Commands
+=======================
 
-   Adding a new command is simple. To register a new command use
+Adding a new command is simple. To register a new command use
 `bot:addcommand'. The prototype for `bot:addcommand' is
 `(bot:addcommand name func needs-channel? num-of-args min-level)'. The
 `name' is a string representing the name of the command being added.
@@ -164,7 +501,7 @@ set to the empty string `""'. An example of a new command would be:
        (if (string=? name "")
          (bot:say channel "Hello world!")
          (bot:say channel (string-append "Hello " name "!")))
-     
+
      (bot:addcommand "hello" hello #t 2 0)
 
    This will display "Hello World!" if called as `!hello' and "Hello
@@ -173,10 +510,10 @@ World `USER'" if called as `!hello USER'.
 \1f
 File: bobot++.info,  Node: Hooks,  Next: Scheme User Levels,  Prev: Adding New Commands,  Up: Scripting
 
-Hooks
-=====
+4.2 Hooks
+=========
 
-   Hooks are a powerful feature of Bobot++. Hooks are a hybrid of ircII
+Hooks are a powerful feature of Bobot++. Hooks are a hybrid of ircII
 and tiny fugue (a MUD bot) hooks with a little bit of extra stuff added
 in. The basic idea of a hook if that you match a text against regular
 expression and call a function if text in a message matches that regex.
@@ -197,33 +534,33 @@ non-fallthrough hooks matches processing of hooks stops.
 \1f
 File: bobot++.info,  Node: Creating a Hook,  Next: Hook Types,  Prev: Hooks,  Up: Hooks
 
-Creating a Hook
----------------
-
-   To add a new hook you use the function `bot:addhook'. `bot:addhook'
-is prototyped as `(bot:addhook type regex function pri fall name)'.
-`type' specifies the type of hook (the types of hooks are listed in
-*Note Hook Types::). `regex' is a standard regular expression. If
-`regex' is matched, `function' will be called. `function' will take a
-different number of args depending on the hook type. `pri' specifies
-the priority of the hook--higher priority hooks are executed first.
-This argument is optional and defaults to `0'. `fall' is `#t' if the
-hook is a fallthrough hook and `#f' is the hook is not a fallthrough
-hook. This arg is also optional and default to `#t'. `name' is the
-optional name of the hook that defaults to "DEFAULT". If you set the
-name then you can have more than one hook that matches the same regexp,
-as long as they have the same name. E.g. in a log script you could have
-the regexps for the log function all be `".*"' and set their names to
+4.2.1 Creating a Hook
+---------------------
+
+To add a new hook you use the function `bot:addhook'. `bot:addhook' is
+prototyped as `(bot:addhook type regex function pri fall name)'. `type'
+specifies the type of hook (the types of hooks are listed in *Note Hook
+Types::). `regex' is a standard regular expression. If `regex' is
+matched, `function' will be called. `function' will take a different
+number of args depending on the hook type. `pri' specifies the priority
+of the hook--higher priority hooks are executed first. This argument is
+optional and defaults to `0'. `fall' is `#t' if the hook is a
+fallthrough hook and `#f' is the hook is not a fallthrough hook. This
+arg is also optional and default to `#t'. `name' is the optional name
+of the hook that defaults to "DEFAULT". If you set the name then you
+can have more than one hook that matches the same regexp, as long as
+they have the same name. E.g. in a log script you could have the
+regexps for the log function all be `".*"' and set their names to
 `"log"' to avoid a conflict with other hooks.
 
 \1f
 File: bobot++.info,  Node: Hook Types,  Prev: Creating a Hook,  Up: Hooks
 
-Hook Types
-----------
+4.2.2 Hook Types
+----------------
 
-   Here is a list of the various hooks are notes on each one. The
-general format of a hook is:
+Here is a list of the various hooks are notes on each one. The general
+format of a hook is:
 
    * `hooks/name' (this is the Scheme variable name of the hook)
         - Description of the hook
@@ -244,7 +581,7 @@ general format of a hook is:
 
         - FROM, TO, ACTION
              - FROM: this is the address of the person that performed
-               the action in the form `USER ! NICK @ HOST' (without the
+               the action in the form `NICK ! USER @ HOST' (without the
                spaces).
 
              - TO: This is the target of the action, which is either a
@@ -362,14 +699,31 @@ general format of a hook is:
         - # of args
              - `arg1': desc
 
+   * `hooks/dcc/begin'
+        - This hook is triggered when a user begins a DCC CHAT with the
+          bot.
+
+        - FROM
+             - FROM: This is the user's address in the form
+               `nick!user@host'.
+
+   * `hooks/dcc/message'
+        - This hook is triggered when a user sends a message to the bot
+          through a DCC CHAT
+
+        - FROM MESSAGE
+             - FROM: This is the user's address in the form
+               `nick!user@host'.
+
+             - MESSAGE: This is the message the user sent to the bot.
 
 \1f
 File: bobot++.info,  Node: Scheme User Levels,  Next: Sending Messages,  Prev: Hooks,  Up: Scripting
 
-Scheme User Levels
-==================
+4.3 Scheme User Levels
+======================
 
-   There are five levels that a user may be when interfacing with a bot:
+There are five levels that a user may be when interfacing with a bot:
 NONE, USER, TRUSTED_USER, FRIEND, MASTER. The Scheme variables for the
 user levels are `bot:user-none', `bot:user-user', `bot:user-trusted',
 `bot:user-friend', and `bot:user-master'. See *Note User Levels:: for
@@ -389,15 +743,15 @@ can use new commands you add.
 \1f
 File: bobot++.info,  Node: Sending Messages,  Next: Misc Scripting Stuff,  Prev: Scheme User Levels,  Up: Scripting
 
-Sending Messages
-================
+4.4 Sending Messages
+====================
 
-   There are several types of messages you can send with Bobot++ from
+There are several types of messages you can send with Bobot++ from
 scripts. There is the simple, but rather limited, `bot:say',
 `bot:action' and `bot:msg', and the more powerful, but lower level,
 `bot:send-MESSAGE' functions. Most bots will probably only need the
 higher level functions, but for the sake of why-not Bobot++ lets you
-use the lower level functions.
+use the lower level functions (in progress).
 
 * Menu:
 
@@ -407,18 +761,18 @@ use the lower level functions.
 \1f
 File: bobot++.info,  Node: High Level Message Functions,  Next: Low Level Message Functions,  Prev: Sending Messages,  Up: Sending Messages
 
-"High Level" Message Functions
-------------------------------
+4.4.1 "High Level" Message Functions
+------------------------------------
 
-   ...
+...
 
 \1f
 File: bobot++.info,  Node: Low Level Message Functions,  Prev: High Level Message Functions,  Up: Sending Messages
 
-"Low Level" Message Functions
------------------------------
+4.4.2 "Low Level" Message Functions
+-----------------------------------
 
-   The "Low Level" messaging functions allow you to do things like send
+The "Low Level" messaging functions allow you to do things like send
 CTCP messages. You probably want to read rfc 2812 and the CTCP spec
 before using these. If you have no idea what these do, read rfc 2812
 (IRC Client Protocol) and CTCP spec. These functions all return
@@ -433,10 +787,10 @@ before using these. If you have no idea what these do, read rfc 2812
 \1f
 File: bobot++.info,  Node: Misc Scripting Stuff,  Prev: Sending Messages,  Up: Scripting
 
-Misc. Scripting Stuff
-=====================
+4.5 Misc. Scripting Stuff
+=========================
 
-   These are a few useful things that I thought people writing scripts
+These are a few useful things that I thought people writing scripts
 might want to know.
 
    If you want to execute code when the bot exits, just do `add-hook!
@@ -449,9 +803,10 @@ File: bobot++.info,  Node: Concept Index,  Next: Function Index,  Prev: Scriptin
 Concept Index
 *************
 
+\0\b[index\0\b]
 * Menu:
 
-* Background on Hooks:                   Hooks.
+* Background on Hooks:                   Hooks.                 (line 6)
 
 \1f
 File: bobot++.info,  Node: Function Index,  Next: Variable Index,  Prev: Concept Index,  Up: Top
@@ -459,10 +814,11 @@ File: bobot++.info,  Node: Function Index,  Next: Variable Index,  Prev: Concept
 Function Index
 **************
 
+\0\b[index\0\b]
 * Menu:
 
-* addcommand:                            Adding New Commands.
-* addhook:                               Creating a Hook.
+* addcommand:                            Adding New Commands.   (line 6)
+* addhook:                               Creating a Hook.       (line 6)
 
 \1f
 File: bobot++.info,  Node: Variable Index,  Prev: Function Index,  Up: Top
@@ -470,56 +826,68 @@ File: bobot++.info,  Node: Variable Index,  Prev: Function Index,  Up: Top
 Variable Index
 **************
 
+\0\b[index\0\b]
 * Menu:
 
 * exit-hook:                             Misc Scripting Stuff.
-* hooks/action:                          Hook Types.
-* hooks/ctcp:                            Hook Types.
-* hooks/ctcp-reply:                      Hook Types.
-* hooks/disconnect:                      Hook Types.
-* hooks/flood:                           Hook Types.
-* hooks/invite:                          Hook Types.
-* hooks/join:                            Hook Types.
-* hooks/kick:                            Hook Types.
-* hooks/message:                         Hook Types.
-* hooks/mode:                            Hook Types.
-* hooks/nickname:                        Hook Types.
-* hooks/notice:                          Hook Types.
-* hooks/part:                            Hook Types.
-* hooks/public:                          Hook Types.
-* hooks/public-notice:                   Hook Types.
-* hooks/raw:                             Hook Types.
-* hooks/signoff:                         Hook Types.
-* hooks/timer:                           Hook Types.
-* hooks/topic:                           Hook Types.
-* user-friend:                           Scheme User Levels.
-* user-master:                           Scheme User Levels.
-* user-none:                             Scheme User Levels.
-* user-trusted:                          Scheme User Levels.
-* user-user:                             Scheme User Levels.
+                                                              (line   9)
+* hooks/action:                          Hook Types.          (line  23)
+* hooks/ctcp:                            Hook Types.          (line  50)
+* hooks/ctcp-reply:                      Hook Types.          (line  56)
+* hooks/dcc/begin:                       Hook Types.          (line 146)
+* hooks/dcc/message:                     Hook Types.          (line 154)
+* hooks/disconnect:                      Hook Types.          (line  62)
+* hooks/flood:                           Hook Types.          (line  68)
+* hooks/invite:                          Hook Types.          (line  74)
+* hooks/join:                            Hook Types.          (line  80)
+* hooks/kick:                            Hook Types.          (line  86)
+* hooks/message:                         Hook Types.          (line 104)
+* hooks/mode:                            Hook Types.          (line  98)
+* hooks/nickname:                        Hook Types.          (line  38)
+* hooks/notice:                          Hook Types.          (line 110)
+* hooks/part:                            Hook Types.          (line  92)
+* hooks/public:                          Hook Types.          (line 116)
+* hooks/public-notice:                   Hook Types.          (line 122)
+* hooks/raw:                             Hook Types.          (line 128)
+* hooks/signoff:                         Hook Types.          (line  44)
+* hooks/timer:                           Hook Types.          (line 134)
+* hooks/topic:                           Hook Types.          (line 140)
+* user-friend:                           Scheme User Levels.  (line   6)
+* user-master:                           Scheme User Levels.  (line   6)
+* user-none:                             Scheme User Levels.  (line   6)
+* user-trusted:                          Scheme User Levels.  (line   6)
+* user-user:                             Scheme User Levels.  (line   6)
 
 
 \1f
 Tag Table:
-Node: Top\7f517
-Node: Introduction\7f1246
-Node: Configuration\7f1437
-Node: Configuration File Syntax\7f1823
-Node: Configure File Placement\7f2025
-Node: Using the Bot\7f2499
-Node: User Levels\7f2673
-Node: Scripting\7f3677
-Node: Adding New Commands\7f4585
-Node: Hooks\7f5852
-Node: Creating a Hook\7f6826
-Node: Hook Types\7f7965
-Node: Scheme User Levels\7f10905
-Node: Sending Messages\7f12034
-Node: High Level Message Functions\7f12631
-Node: Low Level Message Functions\7f12845
-Node: Misc Scripting Stuff\7f13598
-Node: Concept Index\7f14017
-Node: Function Index\7f14199
-Node: Variable Index\7f14460
+Node: Top\7f527
+Node: Introduction\7f1816
+Node: Configuration\7f2008
+Node: Configuration Files\7f2295
+Node: bot.conf\7f2510
+Node: server syntax\7f3948
+Node: channel syntax\7f4812
+Node: bot.users\7f5655
+Node: Configuration File Placement\7f6558
+Node: Using the Bot\7f7036
+Node: Starting the Bot\7f7286
+Node: User Levels\7f8630
+Node: Protection\7f10086
+Node: Automatic Op\7f10695
+Node: Built-In Commands\7f10984
+Node: Scripting\7f15518
+Node: Adding New Commands\7f16483
+Node: Hooks\7f17750
+Node: Creating a Hook\7f18729
+Node: Hook Types\7f19877
+Node: Scheme User Levels\7f23360
+Node: Sending Messages\7f24494
+Node: High Level Message Functions\7f25110
+Node: Low Level Message Functions\7f25333
+Node: Misc Scripting Stuff\7f26095
+Node: Concept Index\7f26519
+Node: Function Index\7f26738
+Node: Variable Index\7f27037
 \1f
 End Tag Table