--- /dev/null
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
+<html>
+ <head>
+ <title>Bobot++ - an IRC bot</title>
+ </head>
+
+ <body bgcolor="white">
+ <h1>Bobot++ - an IRC bot</h1>
+
+ <p>First, if you don't know what is a bot or if you don't know what
+ is IRC, you're at the wrong place, sorry :-)</p>
+
+ <h2>Introduction</h2>
+
+ <p>The <em>bobot++</em> is an IRC bot written in C++. This is the
+ evolution of the <em><a
+ href="http://www.via.ecp.fr/~hugo/bobot.html">bobot</a></em>
+ that I wrote in C with <a
+ href="http://www.via.ecp.fr/~hugo/">Bartman</a>.</p>
+
+ <p>The <em>bobot</em> was a powerful bot, but it was limited to an
+ unique channel, and an unique bot per process. The
+ <em>bobot++</em> is designed to support as many channels as you
+ want (in the limit of 20 channels, but this limit is set by the
+ servers). Moreover, it will support multithreading easily (all
+ the objects are thread-safe).</p>
+
+ <p>Here is a non comprehensive list of the <em>bobot++</em>'s
+ features:</p>
+
+ <ul>
+ <li>No backdoor: there is no backdoors in the
+ <em>bobot++</em>. You are free to believe me or not, but
+ unlike many other bots, this one has no backdoor. Note that
+ there is an hidden command, but this command is not designed to
+ take control of the bot,</li>
+ <li>Multichannel: A <em>bobot++</em> can join as many channels
+ as you want,</li>
+ <li>Flood control: It will ignore people flooding it,</li>
+ <li>Output rate control and priority handling: The
+ <em>bobot++</em> will send its commands to the server at the
+ highest possible rate (ie as fast as possible without making
+ an ``excess flood''). The most important commands (MODE's,
+ etc.) are sent first,</li>
+ <li>Time dependant commands: you can ban people for a fixed
+ amount of time. This is really useful in order not to fill the
+ banlist, [NOT YET FINISHED]</li>
+ <li>Complex online help system: each user can have the list of
+ the commands he can execute. Each command has its description
+ in the help system,</li>
+ <li>Four user levels (user, trusted user, friend and master),
+ three different protections (no kick, no ban and no deop) and
+ possible auto-op. Note that trusted user is created to permit
+ the use of wildcards on dangerous commands such as
+ <tt>kick</tt>, or <tt>ban</tt>,</li>
+ <li>Support for combined join and channel op of 2.9 servers on
+ IRCNet (this feature will be suppressed from the servers, but
+ it may remain useful...),</li>
+ <li>Logging of commands and events,</li>
+ <li>``Intelligent'' ban and deban,</li>
+ <li>Password protection on accounts, expiration dates on user
+ accounts,</li>
+ <li>Anti-spoof: one can not acquire operator priviledges spoofing
+ the bot</li>
+ </ul>
+
+ <h2>Downloading the bobot++</h2>
+
+ <p>You can get the latest version of the bobot++ from this site
+ <em>only</em>. Here is the current version:</p>
+
+ <p><a href="bobot++.1.0.tgz">Download the 1.0 version</a></p>
+ <p><a href="bobot++.1.2.tgz">Download the 1.2 version</a></p>
+ <p><a href="bobot++.1.4.tgz">Download the 1.4 version</a></p>
+
+ <p>Note that revision numbers 1.1 and 1.3 were development
+ versions only.</p>
+
+ <h2>Change log</h2>
+
+ <p>Changes since version 1.2:</p>
+
+ <ul>
+ <li>Fixed a memory leak in the <tt>UserList::load()</tt>
+ function.</li>
+ <li>Added antispoofing code (the bot pings before
+ auto-opping)</li>
+ <li>Added password protection of user accounts.</li>
+ <li>Added expiration on user accounts</li>
+ </ul>
+
+ <h2>Compiling the bobot++</h2>
+
+ <p>Compiling the <em>bobot++</em> is rather simple. You will only
+ need an Un*x-like system and a C++ compiler supporting the
+ Standard Template Library (STL).</p>
+
+ <p>The <em>bobot++</em> compiles fine under the following
+ operating systems:</p>
+
+ <ul>
+ <li>Linux 2.0.x and g++ version 2.7.2.3,</li>
+ <li>HP-UX version 9.x and 10.x and g++ version 2.7.2,</li>
+ <li>SunOS 4.1 and g++.</li>
+ </ul>
+
+ <p>It should compile easily on many other POSIX compliant
+ systems.</p>
+
+ <p>First, you will have to edit the <tt>Makefile</tt> if your C++
+ compiler is not g++. Change the line:</p>
+
+ <pre>CXX=g++</pre>
+
+ <p>With some Un*ces, you will have to link the program with some
+ extra libraries. Change the line:</p>
+
+ <pre>LIBS=</pre>
+
+ <p>For example, you will need this line with Solaris:</p>
+
+ <pre>LIBS=-lsocket -lnsl</pre>
+
+ <p>Then you should be ready to compile the program. Type
+ <tt>make</tt> at the prompt. If you get an error, please try and
+ fix it before emailing me...</p>
+
+ <p>Now, you should have a executable file named <tt>bobot++</tt>
+ in the directory. This is it! We will have to configure the bot,
+ now...</p>
+
+ <h2>Configuring the bobot++</h2>
+
+ <h4>General configuration</h4>
+
+ <p>Edit the example file <tt>bot.conf</tt> to suit your needs. The
+ comments in the file should be self explanatory...</p>
+
+ <p>Here is an example:</p>
+
+ <pre>nick = Bobot
+username = bot
+cmdchar = !
+userlist = bot.users
+logfile = log
+server = irc.eurecom.fr
+server = irc.emn.fr
+server = irc.enst.fr
+server = salambo.enserb.u-bordeaux.fr
+channel = #test1
+channel = #test2 key</pre>
+
+ <p>The bot will be named <em>Bobot</em>, more precisely
+ <em>Bobot!bot@your.machine.com</em>. Its command char will be
+ '!'. It will find its user list in the file <tt>bot.users</tt>,
+ and it will have three servers in its server list. The log will
+ be written to the file <tt>log</tt>. It will join two channels:
+ #test1 and #test2 with <tt>key</tt> as the channel key
+ (remember, the +k mode for channels...).</p>
+
+ <p>If you omit one of these configuration options, a default value
+ will be used.</p>
+
+ <p>Comments begin with ``#'' (at the first column only), and here
+ is the meaning of all configuration options. Note that there are
+ synonyms.</p>
+
+ <table border="1">
+ <tr>
+ <th>Syntax</th>
+ <th>Default value</th>
+ <th>Meaning</th>
+ </tr>
+ <tr>
+ <td>NICK=<nickname><br>
+ NICKNAME=<nickname></td>
+ <td>Bobot</td>
+ <td>This is the nickname of the bot</td>
+ </tr>
+ <tr>
+ <td>USERNAME=<username></td>
+ <td>bot</td>
+ <td>The username of the bot, if there is no <tt>identd</tt> daemon</td>
+ </tr>
+ <tr>
+ <td>IRCNAME=<ircname><br>
+ REALNAME=<ircname></td>
+ <td>I'm a bobot++!</td>
+ <td>The ircname of the bot</td>
+ </tr>
+ <tr>
+ <td>CMDCHAR=<command char><br>
+ COMMAND=<command char></td>
+ <td>!</td>
+ <td>The command char of the bot</td>
+ </tr>
+ <tr>
+ <td>USERLIST=<file name></td>
+ <td>bot.users</td>
+ <td>The userlist file</td>
+ </tr>
+ <tr>
+ <td>LOGFILE=<file name></td>
+ <td>log</td>
+ <td>The log file (may be set to <tt>/dev/null</tt> if you do
+ not want to log...</td>
+ </tr>
+ <tr>
+ <td>SERVER=<server name> [<port> [<password>]]</td>
+ <td>None</td>
+ <td>The server the bot will try to connect to, on the port
+ specified, and optionally with a password. You can put any
+ number of SERVER lines</td>
+ </tr>
+ <tr>
+ <td>CHANNEL=<channel name> [<channel key>]</td>
+ <td>None</td>
+ <td>The channel the bot will join on startup. You can put any
+ number of CHANNEL lines</td>
+ </tr>
+ </table>
+
+ <h4>You are the master of the bot</h4>
+
+ <p>Yes! But the bot does not know who you are yet. Edit the file
+ <tt>bot.users</tt> (or whatever your userlist file is) and put
+ in a line like this one:</p>
+
+ <pre><your adress>:#*:4:0:0:-1:*NONE*</pre>
+
+ <p>where <your adress> is composed with your IRC address. It
+ should be something like that:</p>
+
+ <pre>*!*username@*.domain.com</pre>
+
+ <p>if you connect on IRC from <tt>machine.domaine.com</tt>, with
+ <tt>username</tt> as login.</p>
+
+ <p>For me, this is <tt>*!*bernard@*.cma.fr</tt>.</p>
+
+ <p>Now, you can run the bot:</p>
+
+ <pre>./bobot++</pre>
+
+ <p>Note that there are certain command line options that you can
+ see with:</p>
+
+ <pre>./bobot++ -h</pre>
+
+ <h2>Using the <em>bobot++</em></h2>
+
+ <h4>Adding people on the userlist</h4>
+
+ <p>Of course, you will want to add people on the userlist, as well
+ as other bots. The <tt>adduser</tt> command is for you, then!
+ Its syntax is:</p>
+
+ <pre>!adduser <nick>|<mask> <channel mask> <level> <prot> <aop></pre>
+
+ <p>Note that ``!'' is the command char of the bot, and it may be
+ different according to the configuration you chose.<br>
+ The meaning of the different options is rather simple:</p>
+
+ <table border="1">
+ <tr>
+ <td align="center"><nick></td>
+ <td>The nickname of the person to add. The bot will generate a
+ mask matching this person. If the mask is not accurate
+ enough, you should use...</td>
+ </tr>
+ <tr>
+ <td align="center"><mask></td>
+ <td>...to select the mask you really want. I remind you that
+ the mask is a regular expression designed to match
+ <em>nick!username@hostname</em></td>
+ </tr>
+ <tr>
+ <td align="center"><channel mask></td>
+ <td>This is a mask representing channels where this account is
+ available. You can put ``*'' for every channels, ``#*'' for
+ every non-local channels, etc.</td>
+ </tr>
+ <tr>
+ <td align="center"><level></td>
+ <td><table width="100%" border="1">
+ <tr>
+ <td>0</td>
+ <td>No level - Impossible to execute commands. This is
+ for bots, for example.</td>
+ </tr>
+ <tr>
+ <td>1</td>
+ <td>User level - Will be able to execute many of the
+ commands, but will not be able to use masks on kicks
+ and on bans.</td>
+ </tr>
+ <tr>
+ <td>2</td>
+ <td>Trusted user level - Exactly the same commands as
+ the ``User'' level, except that the user will be able
+ to use masks on bans and kicks.</td>
+ </tr>
+ <tr>
+ <td>3</td>
+ <td>Friend level - Can do everything on the bot, except
+ stopping it. Be careful of who your friends are :-)</td>
+ </tr>
+ <tr>
+ <td>4</td>
+ <td>Master level - Can do everything on the bot.</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><protection></td>
+ <td><table width="100%" border="1">
+ <tr>
+ <td>0</td>
+ <td>No protection - for nearly everybody.</td>
+ </tr>
+ <tr>
+ <td>1</td>
+ <td>No ban - it will be impossible to ban the user,
+ directly or indirectly.</td>
+ </tr>
+ <tr>
+ <td>2</td>
+ <td>No kick - if the user is kicked, there will be a
+ revenge.</td>
+ </tr>
+ <tr>
+ <td>3</td>
+ <td>No deop - The bot will insure that the user can not
+ be deopped. Useful for bots.</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td align="center"><aop></td>
+ <td><table width="100%" border="1">
+ <tr>
+ <td>0</td>
+ <td>No auto-op on join.</td>
+ </tr>
+ <tr>
+ <td>1</td>
+ <td>Auto-op on join. For bots, and optionnaly other
+ users. It depends on the policy of your channel.</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+
+ <p>Here are two examples:</p>
+
+ <pre>!adduser eb #* 2 1 0
+!adduser *!*test@138.195.*.* #test 0 3 1
+!save</pre>
+
+ <p>We first add ``eb'' (me!) to the userlist, for every non-local
+ channel, at level 2 (trusted user), with no-ban protection and
+ no auto-op.</p>
+
+ <p>Then we add every user matching ``*!*test@138.195.*.*'' to the
+ userlist for channel ``#test'', with level 0 (no level),
+ protection 3 (no-deop) and auto-op on join. It is probably
+ another bot.</p>
+
+ <p>Finally, we save the changes to the userlist. Note that this is
+ not mandatory, since the userlist is saved when the bot
+ <tt>!die</tt>s, but if the bot is killed or if there is a bug
+ (yes, there <em>are</em> bugs :-), all your changes would not
+ have been saved.</p>
+
+ <h4>Issuing a command (like for example a kick)</h4>
+
+ <p>The <em>bobot++</em> supports two types of commands: those who
+ affect a channel (kick, ban, topic...) and those who don't.</p>
+
+ <p>For commands which need a channel name, the channel name can be
+ optionnaly put after the name of the command. This is mandatory
+ if the command is made directly to the bot, with a private
+ message.</p>
+
+ <p>Suppose the bot is on two channels, <tt>#test1</tt> and
+ <tt>#test2</tt>. You are on channel <tt>#test1</tt>. Here is the
+ behavior of the bot:</p>
+
+ <table border="1">
+ <tr>
+ <td><tt>#test1> !kick foo reason</tt></td>
+ <td>This will kick <em>foo</em> out of channel
+ <tt>#test1</tt>.</td>
+ </tr>
+ <tr>
+ <td><tt>#test1> !kick #test1 foo reason</tt></td>
+ <td>This will also kick <em>foo</em> out of channel
+ <tt>#test1</tt>.</td>
+ </tr>
+ <tr>
+ <td><tt>#test1> !kick #test2 foo reason</tt></td>
+ <td>This will kick <em>foo</em> out of channel
+ <tt>#test2</tt>.</td>
+ </tr>
+ <tr>
+ <td><tt>-> *bot* !kick #test1 foo reason</tt></td>
+ <td>This will kick <em>foo</em> out of channel
+ <tt>#test1</tt>.</td>
+ </tr>
+ <tr>
+ <td><tt>-> *bot* !kick #test2 foo reason</tt></td>
+ <td>This will kick <em>foo</em> out of channel
+ <tt>#test2</tt>.</td>
+ </tr>
+ <tr>
+ <td><tt>-> *bot* !kick foo reason</tt></td>
+ <td>This will <em>not</em> work. The bot has no way to know to
+ which channel this command applies to.
+ </tr>
+ </table>
+
+ <p>Is this clear enough? This is rather compelling, I know, but I
+ have not found a better way to do this.</p>
+
+ <h4>Spying the bot</h4>
+
+ <p>I hate people that kick others <em>via</em> the bots, and using
+ a private message to the bot. There is no good way to really
+ know what others do. Furthermore, some private messages can be
+ sent to the bot and this can be funny. That is why I made a
+ command to spy bot's private messages.</p>
+
+ <p>There is a ``spylist'' on the bot that every user can read with
+ the command <tt>!spylist</tt>. To be added to the spylist, you
+ should use the <tt>!spymessage</tt> command. To be removed, this
+ is the <tt>!rspymessage</tt> command.</p>
+
+ <p>Note that password control on the bot is not yet implemented,
+ so there is no danger of knowing the password of other people. I
+ will improve the spylist later in order not to be able to see
+ others' password.</p>
+
+ <h4>Intelligent ban and deban</h4>
+
+ <p>Note what happens if you try:</p>
+
+ <pre>!ban *.a.a
+!ban *.b.a
+!ban *.c.a
+!ban *.d.a</pre>
+
+ <p>Then</p>
+
+ <pre>!ban *.a</pre>
+
+ <p>Fine, isn't it? If we didn't do that, the server would not
+ accept the last ban. Try also <tt>!deban *</tt> (use it when the
+ banlist is full!).</p>
+
+ <h4>Getting help on other commands</h4>
+
+ <p>The <tt>!help</tt> command without arguments will give you all
+ the commands you can issue. For a master, this will give
+ you (this may change in the future):</p>
+
+ <pre>-Bobot- Available topics for you are:
+-Bobot- ACTION ADDUSER ADDSERVER BAN CHANNELS CYCLE DEBAN DELSERVER DEOP
+ DIE HELP INVITE JOIN KICK KICKBAN LOCK NAMES NEXTSERVER NICK
+ NSLOOKUP OP PART RECONNECT RSPYMESSAGE SAVE SAY SERVER SERVERLIST
+ SPYLIST SPYMESSAGE TOPIC UNLOCK USERLIST WHO WHOIS
+-Bobot- Use HELP <command> for help about <command></pre>
+
+ <p>If you want help about the <tt>!kick</tt> command, use
+ <tt>!help kick</tt>:</p>
+
+ <pre>-Bobot- Help for KICK:
+-Bobot- KICK [<channel>] <mask>|<nick> [<reason>]
+-Bobot- Kicks <mask> or <nick> out of <channel>, because of <reason>.
+-Bobot- You need to be a trusted user to use a <mask>.
+-Bobot- End of help.</pre>
+
+ <p>Then you have the tools to explore the <em>bobot++</em> in
+ details. Good luck!</p>
+
+ <h2>Bugs, questions, etc.</h2>
+
+ <p>If you find a bug or a strange behaviour of the bot, please try
+ to reproduce it, and then send me a mail describing the problem
+ <em>in details</em>.</p>
+
+ <p>If you have suggestions about new features, please tell
+ me. If you added features yourself, send me your patch!</p>
+
+ <p>Note that I will not answer to configuration or compilation
+ problems...</p>
+
+ <h2>Plans for the future</h2>
+
+ <p>Here is what I plan to add to the <em>bobot++</em>:</p>
+
+ <ul>
+ <li>Scripting support with Guile, the GNU Scheme
+ interpreter;</li>
+ <li>Bot control via telnet, or a java applet;</li>
+ <li>DCC Send and Get (we will be able to use the bot as a
+ file server);</li>
+ <li>Shitlist, like on the <em>bobot</em>;</li>
+ <li>Dynamic settings;</li>
+ <li>Other ideas?</li>
+ </ul>
+
+ <h2>Why use Guile?</h2>
+
+ <p>Guile is the GNU Scheme interpreter. In a future release of the
+ <em>bobot++</em>, I plan to add scripting support using this
+ interpreter.</p>
+
+ <p>So, why did I chose Guile, instead of Tcl or Python?</p>
+
+ <p>One of the main features of Guile is that it will be easy to
+ extend the interpreter in order to translate Python, Tcl or
+ Perl to Scheme code. So, you will have the choice of the
+ language! If you prefer Python instead of Perl or Tcl, use
+ Python. If you prefer CTax (a language similar to C), all right!
+ I hope that religious wars opposing those languages will soon be
+ over...</p>
+
+ <p>Moreover, as Guile is GNU code, it is <em>really</em> a free
+ software, and will keep this status.</p>
+
+ <p>Finally, it is an excellent product, so why shouldn't we use
+ it?</p>
+
+
+ <hr>
+ <address><a href="mailto:bernard@isia.cma.fr">Etienne
+ BERNARD</a></address>
+
+ <!-- Created: Fri Mar 6 18:45:32 CET 1998 -->
+ <!-- hhmts start -->
+Last modified: Sat Mar 21 13:32:54 CET 1998
+<!-- hhmts end -->
+ </body>
+</html>