0f3f7127032fc4430ff0668ce5d2e3a7935b5cbd
[clinton/bobotpp.git] / bobot++.info
1 This is bobot++.info, produced by makeinfo version 4.7 from
2 bobot++.texinfo.
3
4 This file documents Bobot++ by Clinton Ebadi and Etienne Bernard
5 (The original author who no longer works on the program).
6
7 Copyright 2002,2004,2005 Clinton Ebadi
8
9 Permission is granted to copy, distribute and/or modify this document
10 under the terms of the GNU Free Documentation License, Version 1.1 or
11 any later version published by the Free Software Foundation; with no
12 Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
13 Texts.
14
15 \1f
16 File: bobot++.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir)
17
18 This document describes Bobot++ by Clinton Ebadi and Etienne Bernard
19 (The original author who no longer works on the program).
20
21 This document applies to version 2.2 of the program named Bobot++.
22
23 Copyright 2002,2004,2005 Clinton Ebadi
24
25 Permission is granted to copy, distribute and/or modify this document
26 under the terms of the GNU Free Documentation License, Version 1.1 or
27 any later version published by the Free Software Foundation; with no
28 Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
29 Texts.
30
31 * Menu:
32
33 * Introduction::
34 * Configuration::
35 * Using the Bot::
36 * Scripting::
37 * Concept Index::
38 * Function Index::
39 * Variable Index::
40
41 --- The Detailed Node Listing ---
42
43 Configuration
44
45 * Configuration File Placement::
46 * Configuration Files::
47
48 Configuration Files
49
50 * bot.conf::
51 * bot.users::
52 * bot.init::
53 * bot.autoexec::
54 * bot.shit::
55
56 bot.conf
57
58 * server syntax::
59 * channel syntax::
60
61 Using Bobot++
62
63 * Starting the Bot::
64 * Concepts::
65 * Built-In Commands::
66
67 Concepts
68
69 * User Levels::
70 * Protection::
71 * Automatic Op::
72 * Shit Levels::
73
74 Scripting
75
76 * Adding New Commands::
77 * Hooks::
78 * Sending Messages::
79 * Misc Scripting Stuff::
80
81 Hooks
82
83 * Creating a Hook::
84 * Hook Types::
85
86 Hook Types
87
88 * Received Message Hooks::
89 * Sent Message Hooks::
90 * DCC CHAT Hooks::
91 * Miscellaneous Hooks::
92
93 Sending Messages
94
95 * High Level Message Functions::
96 * Low Level Message Functions::
97
98 \1f
99 File: bobot++.info, Node: Introduction, Next: Configuration, Prev: Top, Up: Top
100
101 1 Introduction
102 **************
103
104 Bobot++ is a powerful IRC bot written in C++. It can be used standalone
105 as a channel maintenence bot, or extended to do almost anything using
106 Scheme scripts.
107
108 FIXME: Fill the intro in more?
109
110 \1f
111 File: bobot++.info, Node: Configuration, Next: Using the Bot, Prev: Introduction, Up: Top
112
113 2 Configuration
114 ***************
115
116 Bobot++ is easy to configure. See the `examples' directory for an
117 example configuration.
118
119 The main configuration file is `bot.conf'. There are several
120 auxiliary configuration files (a user list, aliases file, ban list, and
121 a script autoexec).
122
123 * Menu:
124
125 * Configuration File Placement::
126 * Configuration Files::
127
128 \1f
129 File: bobot++.info, Node: Configuration File Placement, Next: Configuration Files, Prev: Configuration, Up: Configuration
130
131 2.1 Configuration File Placement
132 ================================
133
134 Bobot++ will look in `/etc/bobotpp/default/' for its default config if
135 none is specified on the command line. Put the configuration files you
136 want to be loaded by default in this directory. If you are not root, or
137 you want to have your own personal configuration, put it in
138 `~/.bobotpp/config/default/'.
139
140 \1f
141 File: bobot++.info, Node: Configuration Files, Prev: Configuration File Placement, Up: Configuration
142
143 2.2 Configuration Files
144 =======================
145
146 * Menu:
147
148 * bot.conf::
149 * bot.users::
150 * bot.init::
151 * bot.autoexec::
152 * bot.shit::
153
154 \1f
155 File: bobot++.info, Node: bot.conf, Next: bot.users, Prev: Configuration Files, Up: Configuration Files
156
157 2.2.1 bot.conf
158 --------------
159
160 `bot.conf' contains key value pairs separated by `='.
161
162 `<key> = <value>'
163
164 Comments are started with a `#' and cause the entire line to be
165 ignored. _Note that this only works when the `#' is the first character
166 of the line_.
167
168 bot.conf is the main configuration file for a Bobot++. The available
169 configuration variables are listed below in the format "VARIABLE
170 <default-value>: description"
171
172 A few of the options have more complex syntax, they are documented in
173 their own subsections.
174
175 * Menu:
176
177 * server syntax::
178 * channel syntax::
179
180 * MAXNICKLENGTH <9>: The maximum length a valid nickname may be.
181 This should be set before setting the bot's nickname if it will be
182 more than nine characters long. Most IRC servers support nicknames
183 longer than nine characters, but Bobot++ still follows the old spec
184 and defaults to nine.
185
186 * NICKNAME <Bobot>: The nickname of the bot (NICK is an alias for
187 NICKNAME)
188
189 * USERNAME <bobot>: The IRC username of the bot
190
191 * CMDCHAR <!>: The character that prefixes commands given to the bot
192 (COMMAND is an alias for CMDCHAR)
193
194 * IRCNAME <I'm a bobot++!>: The IRC name (or 'real name') of the bot
195 (REALNAME is an alias for IRCNAME)
196
197 * USERLIST <bot.users>: Name of the file where the userlist is stored
198
199 * AUTOEXECFILE <bot.autoexec>: Name of the file containing Scheme
200 code to be executed when the bot starts (only used if the bot is
201 compiled with scripting support)
202
203 * INITFILE <bot.init>: Name of the file containing the default
204 command aliases
205
206 * SHITLIST <bot.shit>: Name of the file where the shitlist (ban
207 list) is stored
208
209 * LOGFILE <$LOGDIR/bot.log>: Location of the bot logfile (set this
210 to `/dev/null' to disable logging).
211
212 * SERVER <None>: This specifies the server to which the bot will
213 connect. Note that this has a special syntax *note server syntax::.
214
215 * CHANNEL <None>: This specifies the channels the bot will join when
216 it starts up. This has a special syntax *note channel syntax::.
217
218
219 \1f
220 File: bobot++.info, Node: server syntax, Next: channel syntax, Prev: bot.conf, Up: bot.conf
221
222 2.2.1.1 server syntax
223 .....................
224
225 The server syntax in `bot.conf' allows you to specify an alternate port
226 to connect on, and a password to send the server.
227
228 You may use more than one server line; Bobot++ will attempt to
229 connect to the first one, and will connect to the next one in the list
230 if it fails. The bot will continue cycling through the server list
231 until it is able to connect to one. There is a command (`!cycle') to
232 make the bot to cycle servers.
233
234 SERVER = SERVER_NAME [PORT [PASSWORD]]
235
236 This will make Bobot++ attempt to connect to SERVER_NAME on port
237 PORT with the password PASSWORD. SERVER_NAME should be the address of
238 the server. PORT and PASSWORD are optional.
239
240 \1f
241 File: bobot++.info, Node: channel syntax, Prev: server syntax, Up: bot.conf
242
243 2.2.1.2 channel syntax
244 ......................
245
246 The channel syntax in `bot.conf' allows you to specify the initial
247 modes the bot should set on a channel, the modes the bot should
248 maintain, and a key if the channel needs it.
249
250 You may have any number of channel lines. When Bobot++ starts it will
251 attempt to join and gain operator status in every channel listed.
252
253 CHANNEL = NAME:INITIAL_MODES:MODES_TO_KEEP:CHANNEL_KEY
254
255 The bot will join NAME and set the channel modes to INITIAL_MODES
256 (e.g. "nt") if it is able to gain operator status. It will then
257 maintain MODES_TO_KEEP. If the channel requires a key to enter simply
258 set CHANNEL_KEY. Every argument except for NAME is optional.
259
260 A few example lines:
261
262 CHANNEL = #foo:nt:nt:bar
263
264 The bot will join `#foo' with the channel key `bar' and will then
265 maintain the modes `nt'.
266
267 CHANNEL = #bar:::
268
269 The bot will join `#bar' and will not set any modes nor will it
270 attempt to maintain any modes.
271
272 \1f
273 File: bobot++.info, Node: bot.users, Next: bot.init, Prev: bot.conf, Up: Configuration Files
274
275 2.2.2 bot.users (User List)
276 ---------------------------
277
278 `bot.users' is the default file name of the userlist. It may be changed
279 in `bot.conf' via the USERLIST option. *You must add an entry for
280 yourself manually.* You will probably want to add other entries using
281 the IRC command interface as it is more intuitive than editing the file
282 by hand.
283
284 The file contains lines with the format:
285
286 `HOST_MASK:CHANNEL_MASK:LEVEL:PROTECTION:AUTO-OP:EXPIRATION:PASSWORD'
287
288 * HOST_MASK is the host mask (e.g. `*!*username
289 .domain.com') of the user
290
291 * CHANNEL_MASK is a channel mask of the channels that the user has
292 priviliges to use the bot in (e.g. `*' for all channels, `#*' for
293 all non-local channel, `#foo*' for all channels starting with
294 "foo," `#bar' for channel "#bar" only, etc.)
295
296 * LEVEL is the user level of the user (*Note User Levels::).
297
298 * PROTECTION is the protection level of the user (*Note
299 Protection::).
300
301 * AUTO-OP is set to control whether a user is automatically given
302 operator priviliges on channel entry (*Note Automatic Op::).
303
304 * EXPIRATION is the UNIX timestamp of when the user entry becomes
305 invalid. Setting this to -1 will make the entry permanent.
306
307 * PASSWORD is the password the user must supply to the bot to
308 authenticate. This can be set to `*NONE*' to not have a password.
309
310
311 \1f
312 File: bobot++.info, Node: bot.init, Next: bot.autoexec, Prev: bot.users, Up: Configuration Files
313
314 2.2.3 bot.init (Command Aliases)
315 --------------------------------
316
317 This file stores a list of IRC command aliases. The filename may be
318 changed in `bot.conf' via the INITFILE option. You use this file to set
319 up aliases for IRC commands, e.g. to make `!a' call `!adduser'. This
320 way you can save typing for commonly used commands.
321
322 The format of a line in the file is: ALIAS COMMAND
323
324 This will make ALIAS call COMMAND. e.g. `t topic' will make `!t New
325 Topic' set the current channel's topic to "New Topic," just as if you
326 had used `!topic New Topic'.
327
328 \1f
329 File: bobot++.info, Node: bot.autoexec, Next: bot.shit, Prev: bot.init, Up: Configuration Files
330
331 2.2.4 bot.autoexec (Scheme Init File)
332 -------------------------------------
333
334 This file is only used when Bobot++ is compiled with scripting support.
335 The name of the autoexec file can be changed in `bot.conf' via the
336 AUTOEXECFILE option.
337
338 The contents of this file are evaluated by Guile when the bot
339 starts. You can use this to do things like loading a few default
340 modules when the bot starts.
341
342 \1f
343 File: bobot++.info, Node: bot.shit, Prev: bot.autoexec, Up: Configuration Files
344
345 2.2.5 bot.shit (Ban/Shit List)
346 ------------------------------
347
348 This file stores the ban list. The name may be changed in `bot.conf'
349 via the SHITLIST option. You will most likely want to use the IRC
350 command interface to edit this file instead of editing it directly.
351
352 The file contains lines in the form:
353
354 `HOST_MASK:CHANNEL_MASK:LEVEL:EXPIRATION:REASON'
355
356 * HOST_MASK is the host mask (e.g. `*!*username
357 .domain.com') of the user
358
359 * CHANNEL_MASK is a channel mask of the channels that the user is
360 banned on (e.g. `*' for all channels, `#*' for all non-local
361 channel, `#foo*' for all channels starting with "foo," `#bar' for
362 channel "#bar" only, etc.
363
364 * LEVEL is a number specifying if the bot should not allow the user
365 to gain ops, to kick the user upon joining, or to prevent the user
366 from being debanned by other users. *Note Shit Levels:: for
367 information on the available levels.
368
369 * EXPIRATION is the UNIX timestamp of when the shit entry becomes
370 invalid. This may be set to -1 to make it valid forever.
371
372 * REASON is text that is sent to the user when they are kicked or
373 banned from the channel.
374
375
376 \1f
377 File: bobot++.info, Node: Using the Bot, Next: Scripting, Prev: Configuration, Up: Top
378
379 3 Using Bobot++
380 ***************
381
382 Using Bobot++ is easy. This chapter covers starting the bot, a few
383 Bobot++ specific concepts, and using the built-in commands of the bot.
384
385 * Menu:
386
387 * Starting the Bot::
388 * Concepts::
389 * Built-In Commands::
390
391 \1f
392 File: bobot++.info, Node: Starting the Bot, Next: Concepts, Prev: Using the Bot, Up: Using the Bot
393
394 3.1 Starting the Bot
395 ====================
396
397 The bot is usually installed with the binary name `bobotpp'. It accepts
398 the following command line arguments.
399
400 * `[--help][-h]' - Shows detailed help and exits
401
402 * `[--version][-v]' - Shows version information and exits
403
404 * `[--no-background][-b]' - Run bobot++ in the foreground
405
406 * `[--config-file file][-f]' - Use file instead of `bot.conf'
407
408 * `[--config-dir dir][-d]' - Use dir as dir to load config file from
409
410 * `[--config dir][-c]' - Search your config path (defaults to
411 `$HOME/.bobotpp/config/' and then `/etc/bobotpp/') for dir and
412 then loads your config data using dir
413
414 * `[--sys-config dir][-s]' - Looks for config in `/etc/bobotpp/dir'.
415 Note that the user dir is still searched first
416
417 * `[--user-config dir][-u]' - Looks for config in
418 `$HOME/.bobotpp/config/dir/'. Note that the system dir is still
419 searched after this if dir is not found.
420
421 * `[--debug][-D]' Makes Bobot++ print debugging info and run in the
422 foreground
423
424 * `[--debug-scripts][-S]' Enables the Guile debugging evaluator for
425 verbose script errors and backtraces while still running the bot
426 in the background.
427
428 The default configuration is read from
429 `$HOME/.bobotpp/config/default/' and then `/etc/bobotpp/default/' if
430 the user config is not found.
431
432 The bot defaults to running in the background as a daemon.
433
434 \1f
435 File: bobot++.info, Node: Concepts, Next: Built-In Commands, Prev: Starting the Bot, Up: Using the Bot
436
437 3.2 Concepts
438 ============
439
440 There are a few general concepts that a user of Bobot++ should know
441 about.
442
443 * Menu:
444
445 * User Levels::
446 * Protection::
447 * Automatic Op::
448 * Shit Levels::
449
450 \1f
451 File: bobot++.info, Node: User Levels, Next: Protection, Prev: Concepts, Up: Concepts
452
453 3.2.1 User Levels
454 -----------------
455
456 There are several user levels available in Bobot++ to provide gradated
457 access to commands. `!adduser' and `bot.users' use the numeric code;
458 Scheme uses the textual name for the level. By default (if the user is
459 not found in the userlist) a user has access to commands with the level
460 `bot:user-none'.
461
462 0. `bot:user-none' - No *built-in* commands may be executed _by
463 default_ (commands may be added from Scheme that can be executed
464 by users of level none and the level required to execute a command
465 may be changed from Scheme).
466
467 1. `bot:user-user' - Will be able to execute most commands but not
468 all and cannot use masks on kicks and bans.
469
470 2. `bot:user-trusted' - For built-ins with a default configuration
471 this user has access to the same set of commands as an `user' but
472 may use masks on kicks and bans. Scheme commands may be added
473 which require a user to be of this level.
474
475 3. `bot:user-friend' - In the default configuration a user who is a
476 friend will be able to do everything short of stopping the bot.
477 Again, there may be user added commands that require a higher user
478 level.
479
480 4. `bot:user-master' - This is the highest user level and has access
481 to every feature of the bot.
482
483
484 \1f
485 File: bobot++.info, Node: Protection, Next: Automatic Op, Prev: User Levels, Up: Concepts
486
487 3.2.2 Protection
488 ----------------
489
490 A user added via Scheme, the `bot.users' file, or `!adduser' may be
491 protected from being deoped, kicked, or banned. The user list and IRC
492 commands use the numeric codes, Scheme uses the symbolic names.
493
494 0. `bot:protection/none' No protection
495
496 1. `bot:protection/no-ban' No ban. If a user is banned the bot will
497 unban him..
498
499 2. `bot:protection/no-kick' No kick. The user may still be kicked but
500 the bot will kickban the user who kicked the protected user.
501
502 3. `bot:protection/no-deop' No deop. The bot will ensure that the
503 user always maintains operator status.
504
505 \1f
506 File: bobot++.info, Node: Automatic Op, Next: Shit Levels, Prev: Protection, Up: Concepts
507
508 3.2.3 Automatic Op
509 ------------------
510
511 A user may be automatically given operator status upon entering a
512 channel. Scheme uses the symbolic name, the user list (`bot.users') and
513 IRC commands use the numeric value.
514
515 0. `bot:aop/no' Do not automatically op the user
516
517 1. `bot:aop/yes' Do automatically op the user
518
519 \1f
520 File: bobot++.info, Node: Shit Levels, Prev: Automatic Op, Up: Concepts
521
522 3.2.4 Shit Levels
523 -----------------
524
525 The shit list and shit list related commands use different levels to
526 define how much the bot hates a user. Scheme uses the symbolic names,
527 the shit list and IRC commands use the numbers.
528
529 0. `bot:shit/none' The bot doesn't hate the user (this is the normal
530 level)
531
532 1. `bot:shit/no-op' The bot will deop the user any time he gains
533 operator priviliges in the channel
534
535 2. `bot:shit/no-join' The bot will kick and ban the user when he
536 joins the channel
537
538 3. `bot:shit/no-deban' The bot will kick and ban usre when he joins
539 the channel, and will prevent other users from debanning him.
540
541 \1f
542 File: bobot++.info, Node: Built-In Commands, Prev: Concepts, Up: Using the Bot
543
544 3.3 Built-In Commands
545 =====================
546
547 Bobot++ has many built-in commands that make it useful without
548 scripting support. The reference leaves off the command char; remember
549 to use whatever you defined the command char to be in `bot.conf'. If a
550 command needs the channel name then you must specify the channel as the
551 first argument to the command when private messaging the bot a command.
552
553 COMMAND NEEDS MIN LEVEL DESCRIPTION
554 CHANNEL TO USE
555 `action' `do' Yes USER Causes the bot to perform the
556 action `do' in the current channel.
557 `adduser'
558 `addserver' Adds the server specified by HOST
559 NAME or IP ADDRESS to the server
560 list.
561 `addshit'
562 `alias' Makes an alias, and adds the
563 function NEW NAME, that will do
564 exactly the same command as OLD
565 NAME.
566 `ban' Bans MASK or NICK from CHANNEL. You
567 need to be a trusted user to ban
568 with a MASK.
569 `banlist'
570 `channels' Prints the channel(s) where the bot
571 is currently.
572 `cycle' Yes Makes the bot leave and join
573 CHANNEL.
574 `dcclist' Gives the list of all DCC Chat
575 connections.
576 `deban' Yes Debans MASK or NICK from CHANNEL.
577 You need to be a trusted user to
578 deban with a MASK.
579 `delserver' Deletes server from server list
580 whose number in the server list is
581 SERVER NUMBER.
582 `deluser' Removes NICK or MASK from the
583 userlist.
584 `delshit' Removes NICK or MASK from the
585 shitlist.
586 `deop' Yes Deops MASK or NICK on CHANNEL.
587 `die' Makes the bot stop immediately.
588 `do'
589 `execute' *Only available if scripting
590 support is enabled*
591 `help'
592 `ident' Identifies you on the bot. Note
593 that you should not use this
594 command in public ...
595 `invite' Yes Invites NICK on CHANNEL.
596 `join' Makes the bot join CHANNEL.
597 `keep' Yes Sets the MODES that the bot will
598 keep for CHANNEL.
599 `kick' Yes Kicks MASK or NICK out of CHANNEL,
600 because of REASON. You need to be a
601 trusted user to use a MASK.
602 `kickban' Yes Bans then kicks MASK or NICK out of
603 CHANNEL, because of REASON. You need
604 to be a trusted user to use a MASK.
605 `load' Reloads the userlist from disk.
606 `loadscript' *Only available if scripting
607 support is enabled*
608 `lock' Locks topic on CHANNEL.
609 `mode' Yes Sends MODE STRING as mode for
610 CHANNEL.
611 `msg'
612 `names' Yes Shows the nicknames and status of
613 users on CHANNEL.
614 `nextserver' Makes the bot connect to the next
615 server in its server list.
616 `nick' Makes the bot use nickname NICK.
617 `nslookup' Does a nameserver query about NICK
618 host, HOST or IP ADDRESS.
619 `op' Yes Ops NICK on CHANNEL.
620 `part' Yes Makes the bot leave CHANNEL.
621 `password' Changes your password on the bot.
622 Use `NONE' as password if you want
623 to clear it. Do not use this
624 command in public!
625 `reconnect' Makes the bot reconnect to its
626 current server.
627 `rspymessage' Removes you from the spy list.
628 `save' Saves the userlist.
629 `say' Yes Makes the bot say MESSAGE on
630 CHANNEL.
631 `server' Select the server to connect to.
632 SERVER NUMBER is the number of the
633 server in the serverlist.
634 `serverlist' Shows the bot's serverlist.
635 `setfloodrate'
636 `setversion'
637 `shitlist' Shows the bot's shitlist.
638 `spylist' Shows the bot's spylist.
639 `spymessage' Adds you to the spylist
640 `stats' Yes Gives CHANNEL's statistics.
641 `tban' Yes Bans NICK or MASK from CHANNEL for
642 TIME seconds.
643 `tkban' Yes Bans NICK or MASK from CHANNEL for
644 TIME seconds, then kicks him/them
645 because of REASON.
646 `topic' Yes If no TOPICis given, prints
647 CHANNEL's topic. Otherwise, the bot
648 will change CHANNEL's topic to
649 TOPIC.
650 `unlock' Yes Makes the bot unlock topic on
651 CHANNEL
652 `userlist' Shows the bot's userlist
653 `who' Yes Show your level on CHANNEL
654 `whois' Yes Shows information about NICK on
655 CHANNEL
656
657 \1f
658 File: bobot++.info, Node: Scripting, Next: Concept Index, Prev: Using the Bot, Up: Top
659
660 4 Scripting
661 ***********
662
663 Bobot++'s most powerful feature is its scripting system. You write
664 scripts using Guile Scheme. This manual does not cover how to use Guile
665 or how to learn Scheme. *Note Guile Reference Manual: (guile)Top, for
666 the Guile reference manual and
667 `http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html' for a
668 good tutorial on Scheme.
669
670 Note that in previous versions the scripting commands where in the
671 form `bot-FUNCTION'. They are now in the form `bot:FUNCTION'. The old
672 names are still available, but are deprecated and will be removed in
673 Bobot++ 3.0. New commands are only available with the `bot:' prefix.
674 The command `perl -pi -e ``s/bot-/bot:/g'' YOUR-FILES' should be enough
675 to convert your code to use the new functions.
676
677 *NOTE*: All arguments to functions and hooks called by the bot are
678 strings unless otherwise specified.
679
680 * Menu:
681
682 * Adding New Commands::
683 * Hooks::
684 * Sending Messages::
685 * Misc Scripting Stuff::
686
687 \1f
688 File: bobot++.info, Node: Adding New Commands, Next: Hooks, Prev: Scripting, Up: Scripting
689
690 4.1 Adding New Commands
691 =======================
692
693 Adding a new command is simple. To register a new command use
694 `bot:addcommand'.
695
696 -- Function: bot:addcommand name func needs-channel? num-of-args
697 min-level
698 The NAME is a string representing the name of the command being
699 added. FUNC is a function accepting NUM-OF-ARGS arguments.
700 NEEDS-CHANNEL? is a bool that is true if the function needs the
701 channel name as its first arg, and false otherwise. NUM-OF-ARGS
702 is the number of args FUNC will take and must be within zero (0)
703 and twenty (20). MIN-LEVEL is one of the *Note User Levels::. A
704 user must be at least a MIN-LEVEL user to use the new command.
705 None of the arguments are guaranteed to be passed; if they aren't
706 they are set to the empty string `""'. An example of a new
707 command would be:
708
709 (define (hello channel name)
710 (if (string=? name "")
711 (bot:say channel "Hello world!")
712 (bot:say channel (string-append "Hello " name "!")))
713
714 (bot:addcommand "hello" hello #t 2 0)
715
716 This will display "Hello World!" if called as `!hello' and "Hello
717 World USER" if called as `!hello USER'.
718
719 \1f
720 File: bobot++.info, Node: Hooks, Next: Sending Messages, Prev: Adding New Commands, Up: Scripting
721
722 4.2 Hooks
723 =========
724
725 Hooks are a powerful feature of Bobot++. Hooks are a hybrid of ircII
726 and tiny fugue (a MUD bot) hooks with a little bit of extra stuff added
727 in. A hook is called when a regular expression is matched against a
728 message sent to or by the bot.
729
730 Bobot++ uses different hook types for each IRC message type, and also
731 includes a hook for accessing raw irc messages. Hooks are tagged with a
732 priority and a flag that specifies whether to call the next hook that
733 matches after calling the current one or to stop processing.
734
735 Hooks are processed from the highest to lowest priority, with
736 fallthrough hooks of equal priority to non-fallthrough hooks being
737 executed first.
738
739 * Menu:
740
741 * Creating a Hook::
742 * Hook Types::
743
744 \1f
745 File: bobot++.info, Node: Creating a Hook, Next: Hook Types, Prev: Hooks, Up: Hooks
746
747 4.2.1 Creating a Hook
748 ---------------------
749
750 To add a new hook you use the function `bot:addhook'.
751
752 -- Function: bot:addhook type regex function [pri fall name]
753 TYPE specifies the type of hook (the types of hooks are listed in
754 *Note Hook Types::).
755
756 REGEX is a standard regular expression. If REGEX is matched,
757 FUNCTION will be called.
758
759 FUNCTION will take a different number of args depending on the
760 hook type.
761
762 PRI specifies the priority of the hook--higher priority hooks are
763 executed first. This argument is optional and defaults to `0'.
764
765 FALL is `#t' if the hook is a fallthrough hook and `#f' is the
766 hook is not a fallthrough hook. This arg is also optional and
767 defaults to `#t'.
768
769 NAME is the optional name of the hook that defaults to
770 `"DEFAULT"'. If you set the name then you can have more than one
771 hook that matches the same regexp, as long as they have the same
772 name. E.g. in a log script you could have the regexps for the log
773 function all be `".*"' and set their names to `"log"' to avoid a
774 conflict with other hooks.
775
776 \1f
777 File: bobot++.info, Node: Hook Types, Prev: Creating a Hook, Up: Hooks
778
779 4.2.2 Hook Types
780 ----------------
781
782 The following sections document the different hooks Bobot++ exposes.
783
784 The general format of each hook description is as if it were a
785 function to be defined, but these describe the function to be passed to
786 `bot:add-hook'. Do _not_ name your functions these names.
787
788 That said, here is the list of available hooks functions. FIXME:
789 write docs
790
791 * Menu:
792
793 * Received Message Hooks::
794 * Sent Message Hooks::
795 * DCC CHAT Hooks::
796 * Miscellaneous Hooks::
797
798 \1f
799 File: bobot++.info, Node: Received Message Hooks, Next: Sent Message Hooks, Prev: Hook Types, Up: Hook Types
800
801 4.2.2.1 Receieved Message Hooks
802 ...............................
803
804 The following hooks are triggered when a mesage is received by the bot.
805
806 -- Function: hooks/action from to action
807 This hook is triggered when someone performs an action.
808
809 FROM is the nickname the person that performed the action.
810
811 TO is the target of the action, which is either a channel or the
812 Bot's nick if the user private messages the bot.
813
814 ACTION is the text of the action. E.g. if someone did `* foobar
815 does baz', then ACTION would be the string `"does baz"'.
816
817 -- Function: hooks/nickname old-nick new-nick
818 This hook is called when someone changes his nickname from
819 OLD-NICK to NEW-NICK.
820
821 -- Function: hooks/signoff nick message
822 This hook is called when someone signs off of IRC.
823
824 NICK is the nickname of the person signing off.
825
826 MESSAGE is his quit message
827
828 -- Function: hooks/ctcp nick to command rest
829 This hook is called when a CTCP request is received by the bot.
830
831 NICK is the nickname of the sender.
832
833 TO is the target of the CTCP request. This will either be a
834 channel the bot is in, or the nickname of the bot.
835
836 COMMAND is the CTCP command issued.
837
838 REST contains the arguments to the CTCP command.
839
840 -- Function: hooks/ctcp-reply nick command rest
841 This hook is called when a CTCP REPLY is received. This occurs when
842 the bot has sent a CTCP request to another client. The CTCP REPLY
843 is always addressed to the bot directly.
844
845 NICK is the nickname of the person who replied.
846
847 COMMAND is the command to which NICK is replying.
848
849 REST contains the body of the reply.
850
851 -- Function: hooks/disconnect server intentional
852 This is called when the bot is disconnected from a server.
853
854 SERVER is the hostname of the server from which the bot was
855 disconnected.
856
857 INTENTIONAL is a flag set to `#t' when the bot disonnected from
858 the server as the result of a command (issued by a user from IRC,
859 SIGHUP, or from a script), or `#f' when the bot disconnected from
860 the server unintentionally..
861
862 -- Function: hooks/invite nick channel
863 This hook is called when a user invited the bot to join a channel.
864
865 NICK is the nickname of the user who sent the invite.
866
867 CHANNEL is the channel to which the bot was invited.
868
869 -- Function: hooks/join nick channel
870 This is called when a user or the bot joins a channel.
871
872 NICK is the nickname of the user who joined CHANNEL. This may be
873 the bot's nickname (the IRC server sends the JOIN command back to
874 the the bot after it joins a channel).
875
876 CHANNEL is the channel that was joined
877
878 -- Function: hooks/kick target from channel reason
879 This hook is called when a user, including the bot, is kicked out
880 of a channel.
881
882 TARGET is the nick of the user who was kicked. This may be the
883 bot's nick.
884
885 FROM is the nick of the user who issued the kick. This may also be
886 the bot's nick.
887
888 CHANNEL is the channel the kick was issued in.
889
890 REASON is the reason the user was kicked.
891
892 -- Function: hooks/part nick channel
893 This hook is called when a user parts a channel.
894
895 NICK is the user who parted the channel. This may be the bot.
896
897 CHANNEL is the channel from which the user parted.
898
899 -- Function: hooks/mode nick target modes
900 This hook is called when someone sets the modes of TARGET.
901
902 NICK is the user who set the modes. This may be the bot.
903
904 TARGET is the target of the MODE command. This may be a channel or
905 a user. If it is a user, it may be the bot.
906
907 MODES is the MODE string.
908
909 -- Function: hooks/message nick message
910 This hook is called when someone sends a private message to the
911 bot.
912
913 NICK is the nickname of the user who sent the message.
914
915 MESSAGE is the message the user sent.
916
917 -- Function: hooks/notice nick message
918 This hook is called when a user send a private notice to the bot.
919
920 NICK is the user who sent the notice.
921
922 MESSAGE is the message the user sent.
923
924 -- Function: hooks/public nick channel message
925 This hook is called when a user sends a normal message to a
926 channel.
927
928 NICK is the user who sent the message.
929
930 CHANNEL is the channel to which the message was sent.
931
932 MESSAGE is the message that was sent.
933
934 -- Function: hooks/public-notice nick channel message
935 This hook is called when a user send a notice to a channel.
936
937 NICK is the user who sent the notice.
938
939 CHANNEL is the channel to which the notice was sent.
940
941 MESSAGE is the message that was sent.
942
943 -- Function: hooks/raw raw-message
944 This hook is called every time a message is received. This matches
945 on the raw message text and passes the hook function the raw IRC
946 message.
947
948 RAW-MESSAGE is the raw IRC message.
949
950 -- Function: hooks/topic nick channel new-topic
951 This hook is called when a user changes the topic in a channel.
952
953 NICK is the user who set the topic. This may be the bot.
954
955 CHANNEL is the channel that's topic was changed.
956
957 NEW-TOPIC is the new topic.
958
959 \1f
960 File: bobot++.info, Node: Sent Message Hooks, Next: DCC CHAT Hooks, Prev: Received Message Hooks, Up: Hook Types
961
962 4.2.2.2 Sent Message Hooks
963 ..........................
964
965 These hooks are called when the bot sends a message. MYNICK is always
966 the bot's nick and will not be documented in each hook description.
967
968 -- Function: hooks/send/public mynick channel message
969 This hook is called when the bot sends a normal message to a
970 channel.
971
972 CHANNEL is the channel to which the bot sent the message.
973
974 MESSAGE is the message the bot sent.
975
976 -- Function: hooks/send/message mynick to message
977 This hook is called when the bot sends a private message to a user.
978
979 TO is the nick of the user to whom the message was sent.
980
981 MESSAGE is the message that was sent.
982
983 -- Function: hooks/send/action mynick to message
984 This hook is called when the bot sents an action to a channel or a
985 user.
986
987 TO is the channel or nick of the user to which the action was sent.
988
989 MESSAGE is the text of the action.
990
991 -- Function: hooks/send/ctcp mynick to command message
992 This hook is called when the bot sends a CTCP message _other than_
993 an ACTION to a channel or user.
994
995 TO is the channel or nick of the user to which the CTCP was sent.
996
997 COMMAND is the CTCP command that was sent.
998
999 MESSAGE is a string containing the arguments to the CTCP command.
1000
1001 -- Function: hooks/send/who who
1002 This is called when the bot sends a WHO message. The regex is
1003 matched on WHO, which is also passed as the only argument to your
1004 function.
1005
1006 WHO is the channel or nick that was WHOed.
1007
1008 -- Function: hooks/send/whois nick
1009 This is called when the bot sends a WHOIS message. The regex is
1010 matched on NICK, which is also passed as the only argument to your
1011 function.
1012
1013 NICK is the nickname of the person who was WHOISed.
1014
1015 \1f
1016 File: bobot++.info, Node: DCC CHAT Hooks, Next: Miscellaneous Hooks, Prev: Sent Message Hooks, Up: Hook Types
1017
1018 4.2.2.3 DCC CHAT Hooks
1019 ......................
1020
1021 These hooks are called when a user initializes a DCC CHAT and when the
1022 bot receives messages from the user in a DCC CHAT.
1023
1024 -- Function: hooks/dcc/chat-begin from
1025 This hook is called when a user begins a DCC CHAT with the bot.
1026 FROM is the user's address in the form `nick!user@host'.
1027
1028 -- Function: hooks/dcc/chat-end address
1029 This hook is called when a DCC CHAT is purged after being idle for
1030 a while, or when the user closes the DCC CHAT. As such, you cannot
1031 write any more data to the DCC CHAT.
1032
1033 ADDRESS is the address (nick!user@host) of the person on the other
1034 side of the DCC.
1035
1036 -- Function: hooks/dcc/chat-message from message
1037 This hook is called when a user sends a message to the bot through
1038 a DCC CHAT.
1039
1040 FROM is the user's address in the form `nick!user@host'.
1041
1042 MESSAGE is the message the user sent to the bot.
1043
1044 \1f
1045 File: bobot++.info, Node: Miscellaneous Hooks, Prev: DCC CHAT Hooks, Up: Hook Types
1046
1047 4.2.2.4 Miscellaneous Hooks
1048 ...........................
1049
1050 -- Function: hooks/flood nick
1051 This hook is called when a user is detected flooding the bot.
1052
1053 NICK is the nickname of the user flooding the bot.
1054
1055 -- Function: hooks/timer time
1056 This hook is called once a minute. The regex is *not* used.
1057
1058 TIME is the in zero-padded `hh:mm' format.
1059
1060 \1f
1061 File: bobot++.info, Node: Sending Messages, Next: Misc Scripting Stuff, Prev: Hooks, Up: Scripting
1062
1063 4.3 Sending Messages
1064 ====================
1065
1066 There are several types of messages you can send with Bobot++ from
1067 scripts. They are split into High and Low level message sending
1068 functions. Most bots will only use the high level functions, but the
1069 low level ones are provided for when a bot needs to do things like send
1070 raw IRC messages or CTCP commands.
1071
1072 * Menu:
1073
1074 * High Level Message Functions::
1075 * Low Level Message Functions::
1076
1077 \1f
1078 File: bobot++.info, Node: High Level Message Functions, Next: Low Level Message Functions, Prev: Sending Messages, Up: Sending Messages
1079
1080 4.3.1 "High Level" Message Functions
1081 ------------------------------------
1082
1083 -- Function: bot:say channel message
1084 Send a public or private MESSAGE to CHANNEL.
1085
1086 Sends a normal text message, as if a user had typed it in. The
1087 DEST can be a nickname or a channel.
1088
1089 -- Function: bot:action channel message
1090 Send an "action" type MESSAGE to CHANNEL
1091
1092 -- Function: bot:msg target message
1093 -- Function: bot:say target message
1094 Send a public or private message to TARGET.
1095
1096 TARGET may be a channel or a nickname.
1097
1098 In versions of Bobot++ prior to 2.1.8 `bot:say' could only send to
1099 channels, and `bot:msg' could only send private messages to users.
1100 They are aliases of the same command now, but it may be worth
1101 using them as they used to for clarity.
1102
1103 -- Function: bot:notice target message
1104 Sends MESSAGE as a NOTICE to TARGET. TARGET may be a user (nick)
1105 or a channel.
1106
1107 \1f
1108 File: bobot++.info, Node: Low Level Message Functions, Prev: High Level Message Functions, Up: Sending Messages
1109
1110 4.3.2 "Low Level" Message Functions
1111 -----------------------------------
1112
1113 The "Low Level" messaging functions allow you to do things like send
1114 CTCP messages. You probably want to read rfc 2812 and the CTCP spec
1115 before using these. If you have no idea what these do, read rfc 2812
1116 (IRC Client Protocol) and CTCP spec. These functions all return
1117 `*unspecified*' always, so don't use the return value for anything.
1118
1119 -- Function: bot:ctcp to command message
1120 TO is the target of your CTCP message, COMMAND is the CTCP
1121 command, and MESSAGE is the message (or arguments) of the command.
1122 Make sure to `bot:ctcp-quote' the message!
1123
1124 -- Function: bot:ctcp-reply to command message
1125 TO is the target of your CTCP reply, COMMAND is the CTCP command,
1126 and MESSAGE is the message (or arguments) of the command. Make
1127 sure to `bot:ctcp-quote' the message!
1128
1129 This is used to reply to a ctcp that the bot has received.
1130
1131 \1f
1132 File: bobot++.info, Node: Misc Scripting Stuff, Prev: Sending Messages, Up: Scripting
1133
1134 4.4 Misc. Scripting Stuff
1135 =========================
1136
1137 These are a few useful things that I thought people writing scripts
1138 might want to know.
1139
1140 If you want to execute code when the bot exits, just do `add-hook!
1141 bot:exit-hook THUNK' where THUNK is an argumentless procedure (a
1142 thunk). When the bot exits your thunk will be called.
1143
1144 [ I didn't know where to put any of these, so I just stuck them in
1145 here.
1146
1147 There probably needs to be several sections added, like dealing
1148 with users (kicking, added, etc), dealing with the bot (channels,
1149 nickname of the bot, etc), server issues (serverlist), useful
1150 tools (nslookup, whois), and do on. ]
1151
1152 -- Function: bot:adduser nick-or-mask cbannel-mask level prot auto-op
1153 Adds an user to the userlist, for a `nick!user@host' matching the
1154 one given, on a channel matching the CHANNELMASK given.
1155
1156 The LEVEL can be: The PROT can be: The AUTO-OP can be:
1157 0 - No level 0 - No protection 0 - No auto-op
1158 1 - User 1 - No ban 1 - Op on join
1159 2 - Trusted User 2 - No kick
1160 3 - Friend 3 - No deop
1161 4 - Master
1162
1163
1164 -- Function: bot:addserver hostname ip-address [portnumber]
1165 Adds the server specified by HOSTNAME or IP-ADDRESS to the server
1166 list.
1167
1168 -- Function: bot:addshit nick-or-mask channel-mask level [time reason]
1169 Adds an user to the shitlist, for a nick!user@host matching the
1170 one given, on a channel matching the CHANNELMASK given.
1171
1172 The LEVEL can be:
1173 0 - No shit
1174 1 - No op
1175 2 - Kick and Ban on join
1176 3 - Kick and Ban on join, no deban
1177
1178
1179 -- Function: bot:ban channel mask-or-nick
1180 Bans MASK or NICK from CHANNEL. You need to be a trusted user to
1181 ban with a MASK.
1182
1183 -- Function: bot:change-command-level nick-or-mask channel-mask
1184 new-level
1185 Gives NICK or MASK level NEW-LEVEL on channel(s) CHANNEL-MASK.
1186 Note that you can not change level for someone whose level is
1187 greater than yours, and that you can not give a level greater than
1188 yours.
1189
1190 -- Function: bot:cycle channel
1191 Makes the bot leave and join CHANNEL.
1192
1193 -- Function: bot:deban channel mask-or-nick
1194 Debans MASK or NICK from CHANNEL. You need to be a trusted user to
1195 deban with a MASK.
1196
1197 -- Function: bot:delserver server-number
1198 Deletes server from server list whose number in the server list is
1199 SERVER-NUMBER
1200
1201 -- Function: bot:deluser nick-or-mask channel-mask
1202 Removes NICK or MASK from the userlist.
1203
1204 -- Function: bot:delshit nick-or-mask channel-mask
1205 Removes NICK or MASK from the shitlist.
1206
1207 -- Function: bot:deop channel mask-or-nick
1208 Deops MASK or NICK on CHANNEL.
1209
1210 -- Function: bot:die reason
1211 Makes the bot stop immediately.
1212
1213 -- Function: bot:do ?
1214
1215 -- Function: bot:invite channel nick
1216 Invites NICK on CHANNEL.
1217
1218 -- Function: bot:join channel
1219 Makes the bot join CHANNEL.
1220
1221 -- Function: bot:keep channel modes
1222 Sets the MODES that the bot will keep for CHANNEL. See also STATS.
1223
1224 -- Function: bot:kick channel mask-or-nick [reason]
1225 Kicks MASK or NICK out of CHANNEL, because of REASON. You need to
1226 be a trusted user to use a MASK.
1227
1228 -- Function: bot:kickban channel mask-or-nick [reason]
1229 Bans then kicks MASK or NICK out of CHANNEL, because of REASON.
1230 You need to be a trusted user to use a MASK.
1231
1232 -- Function: bot:lock channel
1233 Locks topic on CHANNEL.
1234
1235 -- Function: bot:logport
1236 [ Probably returns the log port? ]
1237
1238 -- Function: bot:mode channel mode-string
1239 Sends MODE-STRING as mode for CHANNEL.
1240
1241 -- Function: bot:nextserver
1242 Makes the bot connect to the next server in its server list.
1243
1244 -- Function: bot:nick nick
1245 Makes the bot use nickname NICK.
1246
1247 -- Function: bot:op channel nick
1248 Ops NICK on CHANNEL.
1249
1250 -- Function: bot:part channel
1251 Makes the bot leave CHANNEL.
1252
1253 -- Function: bot:reconnect
1254 Makes the bot reconnect to its current server.
1255
1256 -- Function: bot:server server-number
1257 Select the server to connect to. SERVER-NUMBER is the number of
1258 the server in the serverlist.
1259
1260 -- Function: bot:setfloodrate ?
1261
1262 -- Function: bot:setversion ?
1263
1264 -- Function: bot:tban channel nick-or-mask time
1265 Bans NICK or MASK from CHANNEL for TIME seconds.
1266
1267 -- Function: bot:tkban channel nick-or-mask time [reason]
1268 Bans NICK or MASK from CHANNEL for TIME seconds, then kicks
1269 him/them because of REASON.
1270
1271 -- Function: bot:topic channel topic
1272 If no TOPIC is given, prints CHANNEL's topic. Otherwise, the bot
1273 will change CHANNEL's topic to TOPIC.
1274
1275 -- Function: bot:unlock channel
1276 Makes the bot unlock topic on CHANNEL.
1277
1278 -- Function: bot:who target
1279 Sends a WHO command to TARGET. TARGET may be either a channel or a
1280 user.
1281
1282 -- Function: bot:whois nick
1283 Sends a WHOIS command to NICK. NICK *must* be a nickname, you
1284 cannot send a WHOIS to a channel.
1285
1286 -- Function: bot:getnickname
1287 [ Gets the bot's nickname? ]
1288
1289 -- Function: bot:getserver
1290
1291 -- Function: bot:getserverlist
1292
1293 -- Function: bot:flush
1294 [ Flushes the socket to the server? ]
1295
1296 -- Function: bot:flushport
1297 [ Flushes the log port? ]
1298
1299 -- Function: bot:random ?
1300 [ Returns a random number? What range? Why? ]
1301
1302 -- Function: bot:delcommand
1303 [ Probably deletes a command added with `bot:addcommand' ? ]
1304
1305 -- Function: bot:addtimer ? ?
1306
1307 -- Function: bot:deltimer ?
1308
1309 -- Function: bot:dcc-chat-send ? ?
1310
1311 [ And what about the stuff defined in `bobot-utils.scm' ? I just
1312 added it here so it could be somewhere. There should also be a
1313 section dealing with modules. How to use them. What module
1314 scripts are in. What module bobot++ provided primites are in.
1315 And so on. ]
1316
1317 -- Function: bot:log . messages
1318 Write as many MESSAGES as you want to the log. If the arg is a
1319 thunk it will be executed and it's output will be written to the
1320 log.
1321
1322 -- Function: bot:load file
1323
1324 -- Function: bot:load-module module-spec
1325
1326 -- Function: bot:use-module module-spec
1327
1328 -- Function: bot:match-not-channel regex
1329 match-not-channel adds a prefix regex to your REGEX so it doesn't
1330 match the sender or channel in a PUBLIC message
1331
1332 -- Function: bot:match-to-me regex
1333 match-to-me matches text that was addressed to the bot with a ':',
1334 ',', or nothing after the bot name.
1335
1336 -- Function: bot:sent-to-me? message
1337
1338 -- Function: bot:ctcp-quote message
1339 Returns the CTCP quoted message Input _MUST NOT_ contain the
1340 trailing `\r\n' (it is added by the message sending code).
1341
1342 -- Variable: %bot:loadpath
1343
1344 -- Function: %bot:load-extensions
1345
1346 \1f
1347 File: bobot++.info, Node: Concept Index, Next: Function Index, Prev: Scripting, Up: Top
1348
1349 Concept Index
1350 *************
1351
1352