[project @ 2005-06-28 09:54:46 by unknown_lamer]
[clinton/bobotpp.git] / bobot++.texinfo
... / ...
CommitLineData
1\input texinfo @c -*- texinfo -*-
2@c %**start of header
3@setfilename bobot++.info
4@settitle Bobot++: A Schemeable IRC Bot
5@setchapternewpage on
6@c %**end of header
7
8@ifinfo
9This file documents Bobot++ by Clinton Ebadi and Etienne Bernard
10(original author, no longer works on program).
11
12Copyright 2002,2004,2005 Clinton Ebadi
13
14Permission is granted to copy, distribute and/or modify this document
15under the terms of the GNU Free Documentation License, Version 1.1 or
16any later version published by the Free Software Foundation; with no
17Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
18Texts.
19
20@end ifinfo
21
22@titlepage
23@title Bobot++: A Schemeable IRC Bot
24@author Clinton Ebadi
25
26@page
27@vskip Opt plus 1filll
28Copyright @copyright{} 2002,2004,2005 Clinton Ebadi
29
30Permission is granted to copy, distribute and/or modify this document
31under the terms of the GNU Free Documentation License, Version 1.1 or
32any later version published by the Free Software Foundation; with no
33Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
34Texts.
35
36@end titlepage
37
38@node Top, Introduction, (dir), (dir)
39@comment node-name, next, previous, up
40
41@ifinfo
42This document describes Bobot++ by Clinton Ebadi and Etienne Bernard
43(original author, no longer works on program).
44
45This document applies to version 2.1.5 of the program named
46Bobot++
47
48Copyright 2002,2004 Clinton Ebadi
49
50Permission is granted to copy, distribute and/or modify this document
51under the terms of the GNU Free Documentation License, Version 1.1 or
52any later version published by the Free Software Foundation; with no
53Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
54Texts.
55@end ifinfo
56
57@menu
58* Introduction::
59* Configuration::
60* Using the Bot::
61* Scripting::
62* Concept Index::
63* Function Index::
64* Variable Index::
65
66@detailmenu
67 --- The Detailed Node Listing ---
68
69Configuration
70
71* Configuration Files::
72* Configuration File Placement::
73
74Configuration Files
75
76* bot.conf::
77* bot.users::
78
79bot.conf
80
81* server syntax::
82* channel syntax::
83
84Using Bobot++
85
86* Starting the Bot::
87* User Levels::
88* Protection::
89* Automatic Op::
90* Built-In Commands::
91
92Scripting
93
94* Adding New Commands::
95* Hooks::
96* Scheme User Levels::
97* Sending Messages::
98* Misc Scripting Stuff::
99
100Hooks
101
102* Creating a Hook::
103* Hook Types::
104
105Sending Messages
106
107* High Level Message Functions::
108* Low Level Message Functions::
109
110@end detailmenu
111@end menu
112
113@node Introduction, Configuration, Top, Top
114@chapter Introduction
115
116This manual feels abused and neglected because it has almost no
117content.
118
119@node Configuration, Using the Bot, Introduction, Top
120@chapter Configuration
121
122Bobot++ is easy to configure. See the @file{examples} directory for an
123example configuration.
124
125@menu
126* Configuration Files::
127* Configuration File Placement::
128@end menu
129
130@node Configuration Files, Configuration File Placement, Configuration, Configuration
131@section Configuration Files
132
133@menu
134* bot.conf::
135* bot.users::
136@end menu
137
138@node bot.conf, bot.users, Configuration Files, Configuration Files
139@subsection bot.conf
140
141@menu
142* server syntax::
143* channel syntax::
144@end menu
145
146@file{bot.conf} contains key value pairs separated by @code{=}.
147
148@code{<key> = <value>}
149
150Comments are started with a @code{#} and cause the entire line to be
151ignored. @emph{Note that this only works when the @code{#} is the first
152character of the line}.
153
154bot.conf is the main configuration file for a Bobot++. The available
155configuration variables are listed below in the format ``@var{variable}
156<default-value>: description''
157
158@itemize @bullet
159
160@item @var{nickname} <Bobot>: The nickname of the bot (@var{nick} is an
161alias for @var{nickname})
162@item @var{username} <bobot>: The IRC username of the bot
163@item @var{cmdchar} <!>: The character that prefixes commands given to
164the bot (@var{command} is an alias for @var{cmdchar})
165@item @var{ircname} <I'm a bobot++!>: The IRC name (or 'real name') of
166the bot (@var{realname} is an alias for @var{ircname})
167@item @var{userlist} <bot.users>: Name of the file where the userlist is
168stored
169@item @var{shitlist} <bot.shit>: Name of the file where the shitlist is
170stored
171@item @var{logfile} <$LOGDIR/bot.log>: Location of the bot logfile
172(set this to @file{/dev/null} to disable logging).
173@item @var{server} <None>: This specifies the server to connect
174to. Note that this has a special syntax.
175@item @var{channel} <None>: This specifies a channel the bot will join
176when it starts up. This also has a special syntax.
177
178@end itemize
179
180@node server syntax, channel syntax, bot.conf, bot.conf
181@subsubsection server syntax
182
183@var{server} = @var{server_name} [@var{port} [@var{password}]]
184
185This will make Bobot++ attempt to connect to @var{server_name} on port
186@var{port} with the password @var{password}. @var{server_name} should
187be the address of the server. @var{port} and @var{password} are
188optional. You may use more than one server line; Bobot++ will attempt
189to connect to the first one and, if it fails, will connect to the next
190one in the list. There is also a command to cause the bot to cycle
191servers. At the present time Bobot++ cannot connect to more than one
192server at a time. This is a planned feature of 3.0 (which is a very
193long way away; the current structure of the program would make it very
194difficult to add support for connecting to multiple servers at a time
195in a usable manner).
196
197@node channel syntax, , server syntax, bot.conf
198@subsubsection channel syntax
199
200@var{channel} =
201@var{name}:@var{initial_modes}:@var{modes_to_keep}:@var{channel_key}
202
203You may have any number of channel lines. When Bobot++ starts it will
204attempt to join and gain ops in every channel listed. It will join
205@var{name} and set the channel modes to @var{initial_modes}
206(e.g. ``nt'') if it is able to gain operator status. It will then
207maintain @var{modes_to_keep}. If the channel requires a key to enter
208simply set @var{channel_key}. Every argument except for @var{name} is
209optional.
210
211A few example lines:
212
213@code{@var{channel} = #foo:nt:nt:bar}
214
215The bot will join @code{#foo} with the channel key @code{bar} and will
216then maintain the modes @code{nt}.
217
218@code{@var{channel} = #bar:::}
219
220The bot will join @code{#bar} and will not set any modes nor will it
221attempt to maintain any modes.
222
223@node bot.users, , bot.conf, Configuration Files
224@subsection bot.users
225
226@file{bot.users} is the default file name of the userlist. It may be
227changed in @file{bot.conf}. The file contains lines with the format:
228
229@samp{@var{mask}:@var{channel}:@var{level}:@var{protection}:@var{auto-op}}
230
231@itemize
232
233@item @var{mask} is the host mask
234(e.g. @samp{*!*username@*.domain.com}) of the user
235
236@item @var{channel} is a channel mask of the channels that the user
237has priviliges to use the bot in (e.g. @samp{*} for all channels,
238@samp{#*} for all non-local channel, @samp{#foo*} for all channels
239starting with ``foo,'' @samp{#bar} for channel ``#bar'' only, etc.)
240
241@item @var{level} is the user level of the user (@ref{User Levels}).
242
243@item @var{protection} is the protection level of the user
244(@ref{Protection}).
245
246@item @var{auto-op} is set to control whether a user is automatically
247given operator priviliges on channel entry (@ref{Automatic Op}).
248
249@end itemize
250
251@node Configuration File Placement, , Configuration Files, Configuration
252@section Configuration File Placement
253
254@quotation
255[ I kinda think this should go before the detailed description of the
256config file. I was didn't see it at first and was very frustrated
257trying to find out @emph{where} to edit all this wonderful stuff. ]
258@end quotation
259
260Bobot++ will look in @file{/etc/bobotpp/default/} for its default
261config if none is specified on the command line. Put the configuration
262files you want to be loaded by default in this directory. If you are
263not root or you want to have your own personal configuration, put it
264in @file{~/.bobotpp/config/default/}.
265
266@node Using the Bot, Scripting, Configuration, Top
267@chapter Using Bobot++
268
269FIXME: stuff here...
270
271@menu
272* Starting the Bot::
273* User Levels::
274* Protection::
275* Automatic Op::
276* Built-In Commands::
277@end menu
278
279@node Starting the Bot, User Levels, Using the Bot, Using the Bot
280@section Starting the Bot
281
282The bot is usually installed with the binary name @file{bobotpp}. It
283accepts the following command line arguments:
284
285@itemize
286@item @code{[--help][-h]} - Shows detailed help and exits
287@item @code{[--version][-v]} - Shows version information and exits
288@item @code{[--no-background][-b]} - Run bobot++ in the foreground
289@item @code{[--config-file file][-f]} - Use file instead of @file{bot.conf}
290@item @code{[--config-dir dir][-d]} - Use dir as dir to load config file from
291@item @code{[--config dir][-c]} - Search your config path (defaults to
292@file{@var{$HOME}/.bobotpp/config/} and then @file{/etc/bobotpp/}) for
293dir and then loads your config data using dir
294@item @code{[--sys-config dir][-s]} - Looks for config in
295@file{/etc/bobotpp/dir}. Note that the user dir is still searched
296first
297@item @code{[--user-config dir][-u]} - Looks for config in
298@file{@var{$HOME}/.bobotpp/config/dir/}. Note that the system dir is
299still searched after this if dir is not found.
300@item @code{[--debug][-D]} Makes Bobot++ print debugging info and run
301in the foreground
302@end itemize
303
304The default configuration is read from
305@file{@var{$HOME}/.bobotpp/config/default/} and then
306@file{/etc/bobotpp/default/} if the user config is not found.
307
308The bot defaults to running in the background as a daemon.
309
310@node User Levels, Protection, Starting the Bot, Using the Bot
311@section User Levels
312
313There are several user levels available in Bobot++ to provide gradated
314access to commands. @command{!adduser} and @file{bot.users} use the
315numeric code; Scheme uses the textual name for the level. By default
316(if no catch-all setting is found in @xref{bot.users}.) a user is not
317even a @code{bot:user-none} and cannot execute @strong{any} commands,
318even commands available to @code{bot:user-none}.
319
320@enumerate 0
321
322@item @code{bot:user-none} - No @strong{built-in} commands may be
323executed @emph{by default} (commands may be added from Scheme that can
324be executed by users of level none and the level required to execute a
325command may be changed from Scheme).
326
327@item @code{bot:user-user} - Will be able to execute most commands but
328not all and cannot use masks on kicks and bans.
329
330@item @code{bot:user-trusted} - For built-ins with a default
331configuration this user has access to the same set of commands as an
332@code{user} but may use masks on kicks and bans. Scheme commands may
333be added which require a user to be of this level.
334
335@item @code{bot:user-friend} - In the default configuration a user who
336is a friend will be able to do everything short of stopping the
337bot. Again, there may be user added commands that require a higher
338user level.
339
340@item @code{bot:user-master} - This is the highest user level and has
341access to every feature of the bot.
342
343@end enumerate
344
345@node Protection, Automatic Op, User Levels, Using the Bot
346@section Protection
347
348A user added via Scheme, the @file{bot.users} file, or
349@command{!adduser} may be protected from being deoped, kicked, or
350banned. There are currently no symbolic levels in Scheme; just use the
351numeric code.
352
353@enumerate 0
354@item No protection
355@item No ban. If a user is banned the bot will unban him..
356@item No kick. The user may still be kicked but the bot will kickban
357the user who kicked the protected user.
358@item No deop. The bot will ensure that the user always maintains
359operator status.
360@end enumerate
361
362@node Automatic Op, Built-In Commands, Protection, Using the Bot
363@section Automatic Op
364
365A user may be automatically given operator status upon entering a
366channel. Set the @var{aop} field to ``0'' to disable auto-op or ``1''
367to enable auto-op.
368
369@node Built-In Commands, , Automatic Op, Using the Bot
370@section Built-In Commands
371
372Bobot++ has many built-in commands that make it useful without
373scripting support. The reference leaves off the command char; remember
374to use whatever you defined the command char to be in
375@file{bot.conf}. If a command needs the channel name then you must
376specify the channel as the first argument to the command when private
377messaging the bot a command.
378
379@multitable @columnfractions 0.20 0.15 0.15 0.50
380@item @sc{command} @tab @sc{Needs Channel} @tab @sc{Min Level to Use} @tab @sc{Description}
381
382@item @command{action} @option{do} @tab Yes @tab @var{USER} @tab
383Causes the bot to perform the action @option{do} in the current
384channel.
385
386@item @command{adduser} @tab @tab @tab
387
388@item @command{addserver} @tab @tab @tab Adds the server specified by
389@var{host name} or @var{ip address} to the server list.
390
391@item @command{addshit} @tab @tab @tab
392
393@item @command{alias} @tab @tab @tab Makes an alias, and adds the
394function @var{new name}, that will do exactly the same command as
395@var{old name}.
396
397@item @command{ban} @tab @tab @tab Bans @var{mask} or @var{nick} from
398@var{channel}. You need to be a trusted user to ban with a
399@var{mask}.
400
401@item @command{banlist} @tab @tab @tab
402
403@item @command{channels} @tab @tab @tab Prints the channel(s) where
404the bot is currently.
405
406@item @command{cycle} @tab Yes @tab @tab Makes the bot leave and join
407@var{channel}.
408
409@item @command{dcclist} @tab @tab @tab Gives the list of all DCC Chat
410connections.
411
412@item @command{deban} @tab Yes @tab @tab Debans @var{mask} or
413@var{nick} from @var{channel}. You need to be a trusted user to deban
414with a @var{mask}.
415
416@item @command{delserver} @tab @tab @tab Deletes server from server
417list whose number in the server list is @var{server number}.
418
419@item @command{deluser} @tab @tab @tab Removes @var{nick} or
420@var{mask} from the userlist.
421
422@item @command{delshit} @tab @tab @tab Removes @var{nick} or
423@var{mask} from the shitlist.
424
425@item @command{deop} @tab Yes @tab @tab Deops @var{mask} or @var{nick}
426on @var{channel}.
427
428@item @command{die} @tab @tab @tab Makes the bot stop immediately.
429
430@item @command{do} @tab @tab @tab
431
432@item @command{execute} @tab @tab @tab @strong{Only available if
433scripting support is enabled}
434
435@item @command{help} @tab @tab @tab
436
437@item @command{ident} @tab @tab @tab Identifies you on the bot. Note
438that you should not use this command in public @dots{}
439
440@item @command{invite} @tab Yes @tab @tab Invites @var{nick} on
441@var{channel}.
442
443@item @command{join} @tab @tab @tab Makes the bot join @var{channel}.
444
445@item @command{keep} @tab Yes @tab @tab Sets the @var{modes} that the
446bot will keep for @var{channel}.
447
448@item @command{kick} @tab Yes @tab @tab Kicks @var{mask} or @var{nick}
449out of @var{channel}, because of @var{reason}. You need to be a
450trusted user to use a @var{mask}.
451
452@item @command{kickban} @tab Yes @tab @tab Bans then kicks @var{mask}
453or @var{nick} out of @var{channel}, because of @var{reason}. You need
454to be a trusted user to use a @var{mask}.
455
456@item @command{load} @tab @tab @tab Reloads the userlist from disk.
457
458@item @command{loadscript} @tab @tab @tab @strong{Only available if
459scripting support is enabled}
460
461@item @command{lock} @tab @tab @tab Locks topic on @var{channel}.
462
463@item @command{mode} @tab Yes @tab @tab Sends @var{mode string} as
464mode for @var{channel}.
465
466@item @command{msg} @tab @tab @tab
467
468@item @command{names} @tab Yes @tab @tab Shows the nicknames and
469status of users on @var{channel}.
470
471@item @command{nextserver} @tab @tab @tab Makes the bot connect to the
472next server in its server list.
473
474@item @command{nick} @tab @tab @tab Makes the bot use nickname @var{nick}.
475
476@item @command{nslookup} @tab @tab @tab Does a nameserver query about
477@var{nick} host, @var{host} or @var{ip address}.
478
479@item @command{op} @tab Yes @tab @tab Ops @var{nick} on @var{channel}.
480
481@item @command{part} @tab Yes @tab @tab Makes the bot leave @var{channel}.
482
483@item @command{password} @tab @tab @tab Changes your password on the
484bot. Use @code{NONE} as password if you want to clear it. Do not use this
485command in public!
486
487@item @command{reconnect} @tab @tab @tab Makes the bot reconnect to
488its current server.
489
490@item @command{rspymessage} @tab @tab @tab Removes you from the spy
491list.
492
493@item @command{save} @tab @tab @tab Saves the userlist.
494
495@item @command{say} @tab Yes @tab @tab Makes the bot say @var{message}
496on @var{channel}.
497
498@item @command{server} @tab @tab @tab Select the server to connect
499to. @var{server number} is the number of the server in the serverlist.
500
501@item @command{serverlist} @tab @tab @tab Shows the bot's serverlist.
502
503@item @command{setfloodrate} @tab @tab @tab
504
505@item @command{setversion} @tab @tab @tab
506
507@item @command{shitlist} @tab @tab @tab Shows the bot's shitlist.
508
509@item @command{spylist} @tab @tab @tab Shows the bot's spylist.
510
511@item @command{spymessage} @tab @tab @tab Adds you to the spylist
512
513@item @command{stats} @tab Yes @tab @tab Gives @var{channel}'s statistics.
514
515@item @command{tban} @tab Yes @tab @tab Bans @var{nick} or @var{mask}
516from @var{channel} for @var{time} seconds.
517
518@item @command{tkban} @tab Yes @tab @tab Bans @var{nick} or @var{mask}
519from @var{channel} for @var{time} seconds, then kicks him/them because
520of @var{reason}.
521
522@item @command{topic} @tab Yes @tab @tab If no @var{topic}is given,
523prints @var{channel}'s topic. Otherwise, the bot will change
524@var{channel}'s topic to @var{topic}.
525
526@item @command{unlock} @tab Yes @tab @tab Makes the bot unlock topic
527on @var{channel}
528
529@item @command{userlist} @tab @tab @tab Shows the bot's userlist
530
531@item @command{who} @tab Yes @tab @tab Show your level on @var{channel}
532
533@item @command{whois} @tab Yes @tab @tab Shows information about
534@var{nick} on @var{channel}
535
536@end multitable
537
538@node Scripting, Concept Index, Using the Bot, Top
539@chapter Scripting
540
541Bobot++'s most powerful feature is its scripting system. You write
542scripts using Guile Scheme. This manual does not cover how to use
543Guile or how to learn Scheme. @xref{Top, , Guile Reference Manual,
544guile, The Guile Reference Manual}, for the Guile reference manual and
545@url{http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html} for
546a good tutorial on Scheme.
547
548Note that in previous versions the scripting commands where in the
549form @code{bot-@var{function}}. They are now in the form
550@code{bot:@var{function}}. The old names are still available, but are
551deprecated and will be removed in Bobot++ 3.0. New commands are only
552available with the @code{bot:} prefix. The command @command{perl -pi
553-e ``s/bot-/bot:/g'' @var{your-files}} should be enough to convert
554your code to use the new functions.
555
556@menu
557* Adding New Commands::
558* Hooks::
559* Scheme User Levels::
560* Sending Messages::
561* Misc Scripting Stuff::
562@end menu
563
564@node Adding New Commands, Hooks, Scripting, Scripting
565@section Adding New Commands
566
567Adding a new command is simple. To register a new command use
568@code{bot:addcommand}.
569
570@defun bot:addcommand name func needs-channel? num-of-args min-level
571
572The @var{name} is a string representing the name of the command being
573added. @var{func} is a function accepting @var{num-of-args}
574arguments. @var{needs-channel?} is a bool that is true if the function
575needs the channel name as its first arg, and false otherwise.
576@var{num-of-args} is the number of args @var{func} will take and must
577be within zero (0) and twenty (20). @var{min-level} is one of the
578@ref{Scheme User Levels}. A user must be at least a @code{min-level}
579user to use the new command. None of the arguments are guaranteed to
580be passed; if they aren't they are set to the empty string @code{""}.
581An example of a new command would be:
582
583@example
584(define (hello channel name)
585 (if (string=? name "")
586 (bot:say channel "Hello world!")
587 (bot:say channel (string-append "Hello " name "!")))
588
589(bot:addcommand "hello" hello #t 2 0)
590@end example
591
592This will display ``Hello World!'' if called as @kbd{!hello} and
593``Hello World @code{USER}'' if called as @kbd{!hello @var{USER}}.
594@end defun
595
596@node Hooks, Scheme User Levels, Adding New Commands, Scripting
597@section Hooks
598
599@cindex Background on Hooks
600Hooks are a powerful feature of Bobot++. Hooks are a hybrid of ircII
601and tiny fugue (a MUD bot) hooks with a little bit of extra stuff
602added in. A hook is called when a regular expression is matched
603against a message sent to or by the bot.
604
605Bobot++ uses different hook types for each IRC message type, and also
606includes a hook for accessing raw irc messages. Hooks are tagged with
607a priority and a flag that specifies whether to call the next hook
608that matches after calling the current one or to stop
609processing.
610
611Hooks are processed from the highest to lowest priority, with
612fallthrough hooks of equal priority to non-fallthrough hooks being
613executed first.
614
615@menu
616* Creating a Hook::
617* Hook Types::
618@end menu
619
620@node Creating a Hook, Hook Types, Hooks, Hooks
621@subsection Creating a Hook
622
623To add a new hook you use the function @code{bot:addhook}.
624
625@defun bot:addhook type regex function [pri fall name]
626@var{type} specifies the type of hook (the types of hooks are listed
627in @ref{Hook Types}). @var{regex} is a standard regular expression. If
628@var{regex} is matched, @var{function} will be called. @var{function}
629will take a different number of args depending on the hook
630type. @var{pri} specifies the priority of the hook---higher priority
631hooks are executed first. This argument is optional and defaults to
632@code{0}. @var{fall} is @code{#t} if the hook is a fallthrough hook
633and @code{#f} is the hook is not a fallthrough hook. This arg is also
634optional and default to @code{#t}. @var{name} is the optional name of
635the hook that defaults to ``DEFAULT''. If you set the name then you
636can have more than one hook that matches the same regexp, as long as
637they have the same name. E.g. in a log script you could have the
638regexps for the log function all be @code{".*"} and set their names to
639@code{"log"} to avoid a conflict with other hooks.
640@end defun
641
642@node Hook Types, , Creating a Hook, Hooks
643@subsection Hook Types
644
645Here is a list of the various hooks funtions and notes on each
646one. The general format of each hook description is as if it was was
647function to be defined, but these describe the function to be passwd
648to @code{bot:add-hook}. Do @emph{not} name your functions these
649names.
650
651@quotation
652[ Boy, that's clumsy. I want to say that the hook/xx functions that
653are documented below are not funtions that you call. They are the
654functions that needs to be passed to bot:addhook for that kind of
655hook.
656
657Still clumsy. Oh well. ]
658@end quotation
659
660
661That said, here is the list of available hooks functions.
662FIXME: write docs
663
664@defun hooks/action from to action
665This hook is triggered when someone performs an action. @var{from} is
666the address of the person that performed the action in the form
667@samp{@var{nick} ! @var{user} @@ @var{host}} (without the spaces).
668@var{to} is the target of the action, which is either a channel or the
669Bot's nick. @var{action} is the text of the action. E.g. if someone
670did @samp{* foobar does baz}, then @var{action} would be the string
671@code{"does baz"}.
672@end defun
673
674
675@defun hooks/nickname old-nick new-nick
676This hook gets called when someone changes thir nickname from
677@var{old-nick} to @var{new-nick}.
678@end defun
679
680@defun hooks/signoff nick rest
681@end defun
682
683@defun hooks/ctcp nick to command rest
684@end defun
685
686@defun hooks/ctcp-reply nick command rest
687@end defun
688
689@defun hooks/disconnect server
690This is called when the bot is disconnected from a server
691unintentionally. @code{hooks/signoff} is called when the bot purposefully
692disconnected. The hook function is passed the hostname of the
693server it was disconnected from.
694@end defun
695
696@defun hooks/flood nick
697@end defun
698
699@defun hooks/invite nick channel
700@end defun
701
702@defun hooks/join nick channel
703@end defun
704
705@defun hooks/kick target from channel reason
706@end defun
707
708@defun hooks/leave nick channel
709@defunx hooks/part nick channel
710@end defun
711
712@defun hooks/mode nick channel modes
713@end defun
714
715@defun hooks/message from message
716@end defun
717
718@defun hooks/notice nick message
719@end defun
720
721@defun hooks/public from to message
722@end defun
723
724@defun hooks/public-notice nick to message
725@end defun
726
727@defun hooks/raw raw-message
728@end defun
729
730@defun hooks/timer time
731This hook seems to be called once a minute. @var{time} is in
732@code{hh:mm} format.
733@end defun
734
735@defun hooks/topic nick channel new-topic
736@end defun
737
738@defun hooks/send/public mynick dest message
739@end defun
740
741@defun hooks/send/message botnick message
742@end defun
743
744@defun hooks/send/action mynick to message
745@end defun
746
747@defun hooks/send/ctcp mynick to command message
748@end defun
749
750@defun hooks/dcc/chat-begin from
751This hook is triggered when a user begins a DCC CHAT with the bot.
752@var{from} is the user's address in the form @samp{nick!user@@host}.
753@end defun
754
755@defun hooks/dcc/chat-message from message
756This hook is triggered when a user sends a message to the bot through
757a DCC CHAT @var{from} is the user's address in the form
758@samp{nick!user@@host}. @var{message} is the message the user sent to
759the bot.
760@end defun
761
762@node Scheme User Levels, Sending Messages, Hooks, Scripting
763@section Scheme User Levels
764
765@vindex user-none
766@vindex user-user
767@vindex user-trusted
768@vindex user-friend
769@vindex user-master
770There are five levels that a user may be when interfacing with a bot:
771@var{none}, @var{user}, @var{trusted_user}, @var{friend},
772@var{master}. The Scheme variables for the user levels are
773@code{bot:user-none}, @code{bot:user-user}, @code{bot:user-trusted},
774@code{bot:user-friend}, and @code{bot:user-master}. See @ref{User
775Levels} for more information on User Levels.
776
777When adding a new command, think about who should be able to use
778it. Is your command a general purpose command that helps the channel
779(e.g. @code{!seen}) that everyone should be able to use? Or is it
780something that should be restricted? See @ref{User Levels} for
781information on what level users can do what with the built in bot
782commands and think about what level a user your command is targetted
783towards. You must be @emph{very} careful when giving new commands to
784lower level users because you can do basically everything the bot can
785do with a script. As the scripting interface becomes more powerful,
786you must think more about what users can use new commands you add.
787
788@node Sending Messages, Misc Scripting Stuff, Scheme User Levels, Scripting
789@section Sending Messages
790
791There are several types of messages you can send with Bobot++ from
792scripts. There is the simple, but rather limited, @code{bot:say},
793@code{bot:action} and @code{bot:msg}, and the more powerful, but lower
794level, @code{bot:send-MESSAGE} functions. Most bots will probably only
795need the higher level functions, but for the sake of why-not Bobot++
796lets you use the lower level functions (in progress).
797
798@menu
799* High Level Message Functions::
800* Low Level Message Functions::
801@end menu
802
803@node High Level Message Functions, Low Level Message Functions, Sending Messages, Sending Messages
804@subsection ``High Level'' Message Functions
805
806@defun bot:say channel message
807Send a public or private @var{message} to @var{channel}.
808
809Sends a normal text message, as if a user had typed it in. The
810@var{dest} can be a nickname or a channel.
811@end defun
812
813@defun bot:action channel message
814Send an ``action'' type @var{message} to @var{channel}
815@end defun
816
817@defun bot:msg nick message
818The same as if a user typed @code{/msg nick message} to their IRC client.
819@end defun
820
821@defun bot:notice target message
822Sends @var{message} as a NOTICE to @var{target}. @var{target} may be a
823user (nick) or a channel. This returns 0 on success.
824@end defun
825
826@node Low Level Message Functions, , High Level Message Functions, Sending Messages
827@subsection ``Low Level'' Message Functions
828
829@c Add a url for rfc2812
830The ``Low Level'' messaging functions allow you to do things like send
831CTCP messages. You probably want to read rfc 2812 and the CTCP spec
832before using these. If you have no idea what these do, read rfc 2812
833(IRC Client Protocol) and CTCP spec. These functions all return
834@code{*unspecified*} always, so don't use the return value for
835anything.
836
837@defun bot:send-ctcp to command message
838@code{to} is the target of your CTCP message, @code{command} is the
839CTCP command, and @code{message} is the message (or arguments) of the
840command. Make sure to @code{bot:ctcp-quote} the message!
841@end defun
842
843@defun bot:send-ctcp-reply to command message
844@code{to} is the target of your CTCP reply, @code{command} is the
845CTCP command, and @code{message} is the message (or arguments) of the
846command. Make sure to @code{bot:ctcp-quote} the message!
847
848This is used to reply to a ctcp that the bot has received.
849@end defun
850
851@node Misc Scripting Stuff, , Sending Messages, Scripting
852@section Misc. Scripting Stuff
853
854These are a few useful things that I thought people writing scripts
855might want to know.
856
857@vindex exit-hook
858If you want to execute code when the bot exits, just do
859@code{add-hook! bot:exit-hook @var{thunk}} where @var{thunk} is an
860argumentless procedure (a thunk). When the bot exits your thunk will
861be called.
862
863@quotation
864[ I didn't know where to put any of these, so I jsut stuck them in
865here.
866
867There probably needs to be several sections added, like dealing with
868users (kicking, added, etc), dealing with the bot (channels, nickname
869of the bot, etc), server issues (serverlist), useful tools (nslookup,
870whois), and do on. ]
871@end quotation
872
873
874@defun bot:adduser nick-or-mask cbannel-mask level prot auto-op
875Adds an user to the userlist, for a @code{nick!user@@host} matching the
876one given, on a channel matching the @var{channelMask} given.
877
878@multitable @columnfractions 0.33 0.33 0.33
879@item The @var{level} can be: @tab The @var{prot} can be: @tab The @var{auto-op} can be:
880@item 0 - No level @tab 0 - No protection @tab 0 - No auto-op
881@item 1 - User @tab 1 - No ban @tab 1 - Op on join
882@item 2 - Trusted User @tab 2 - No kick @tab
883@item 3 - Friend @tab 3 - No deop @tab
884@item 4 - Master @tab @tab
885@end multitable
886
887@end defun
888
889@c (3, 4, 0)
890@defun bot:addserver hostname ip-address [portnumber]
891Adds the server specified by @var{hostname} or @var{ip-address} to
892the server list.
893@end defun
894
895@c (3, 2, 0)
896@defun bot:addshit nick-or-mask channel-mask level [time reason]
897Adds an user to the shitlist, for a nick!user@@host matching the
898one given, on a channel matching the @var{channelMask} given.
899
900@display
901The @var{level} can be:
902 0 - No shit
903 1 - No op
904 2 - Kick and Ban on join
905 3 - Kick and Ban on join, no deban
906@end display
907
908@end defun
909
910@c (2, 0, 0)
911@defun bot:ban channel mask-or-nick
912Bans @var{mask} or @var{nick} from @var{channel}. You need to be a trusted
913user to ban with a @var{mask}.
914@end defun
915
916@c (2, 0, 0)
917@defun bot:change-command-level nick-or-mask channel-mask new-level
918Gives @var{nick} or @var{mask} level @var{new-level} on channel(s)
919@var{channel-mask}. Note that you can not change level for someone
920whose level is greater than yours, and that you can not give a
921level greater than yours.
922@end defun
923
924@c (1, 0, 0)
925@defun bot:cycle channel
926Makes the bot leave and join @var{channel}.
927@end defun
928
929@c (2, 0, 0)
930@defun bot:deban channel mask-or-nick
931Debans @var{mask} or @var{nick} from @var{channel}. You need to be a trusted
932user to deban with a @var{mask}.
933@end defun
934
935@c (1, 0, 0)
936@defun bot:delserver server-number
937Deletes server from server list whose number in the server list
938is @var{server-number}
939@end defun
940
941@c (2, 0, 0)
942@defun bot:deluser nick-or-mask channel-mask
943Removes @var{nick} or @var{mask} from the userlist.
944@end defun
945
946@c (2, 0, 0)
947@defun bot:delshit nick-or-mask channel-mask
948Removes @var{nick} or @var{mask} from the shitlist.
949@end defun
950
951@c (2, 0, 0)
952@defun bot:deop channel mask-or-nick
953Deops @var{mask} or @var{nick} on @var{channel}.
954@end defun
955
956@c (1, 0, 0)
957@defun bot:die reason
958Makes the bot stop immediately.
959@end defun
960
961@c (1, 0, 0)
962@defun bot:do ?
963@end defun
964
965@c (2, 0, 0)
966@defun bot:invite channel nick
967Invites @var{nick} on @var{channel}.
968@end defun
969
970@c (1, 1, 0)
971@defun bot:join channel
972Makes the bot join @var{channel}.
973@end defun
974
975@c (2, 0, 0)
976@defun bot:keep channel modes
977Sets the @var{modes} that the bot will keep for @var{channel}.
978See also STATS.
979@end defun
980
981@c (2, 1, 0)
982@defun bot:kick channel mask-or-nick [reason]
983Kicks @var{mask} or @var{nick} out of @var{channel}, because of @var{reason}.
984You need to be a trusted user to use a @var{mask}.
985@end defun
986
987@c (2, 1, 0)
988@defun bot:kickban channel mask-or-nick [reason]
989Bans then kicks @var{mask} or @var{nick} out of @var{channel},
990because of @var{reason}.
991You need to be a trusted user to use a @var{mask}.
992@end defun
993
994@c (1, 0, 0)
995@defun bot:lock channel
996Locks topic on @var{channel}.
997@end defun
998
999@c (0, 0, 0)
1000@defun bot:logport
1001[ Probably returns the log port? ]
1002@end defun
1003
1004@c (2, 0, 0)
1005@defun bot:mode channel mode-string
1006Sends @var{mode-string} as mode for @var{channel}.
1007@end defun
1008
1009@c (0, 0, 0)
1010@defun bot:nextserver
1011Makes the bot connect to the next server in its server list.
1012@end defun
1013
1014@c (1, 0, 0)
1015@defun bot:nick nick
1016Makes the bot use nickname @var{nick}.
1017@end defun
1018
1019@c (2, 0, 0)
1020@defun bot:op channel nick
1021Ops @var{nick} on @var{channel}.
1022@end defun
1023
1024@c (1, 0, 0)
1025@defun bot:part channel
1026Makes the bot leave @var{channel}.
1027@end defun
1028
1029@c (0, 0, 0)
1030@defun bot:reconnect
1031Makes the bot reconnect to its current server.
1032@end defun
1033
1034@c (1, 0, 0)
1035@defun bot:server server-number
1036Select the server to connect to. @var{server-number} is the number of
1037the server in the serverlist.
1038@end defun
1039
1040@c (1, 0, 0)
1041@defun bot:setfloodrate ?
1042@end defun
1043
1044@c (1, 0, 0)
1045@defun bot:setversion ?
1046@end defun
1047
1048@c (3, 0, 0)
1049@defun bot:tban channel nick-or-mask time
1050Bans @var{nick} or @var{mask} from @var{channel} for @var{time} seconds.
1051@end defun
1052
1053@c (3, 1, 0)
1054@defun bot:tkban channel nick-or-mask time [reason]
1055Bans @var{nick} or @var{mask} from @var{channel} for @var{time} seconds,
1056then kicks him/them because of @var{reason}.
1057@end defun
1058
1059@c (2, 0, 0)
1060@defun bot:topic channel topic
1061If no @var{topic} is given, prints @var{channel}'s topic. Otherwise,
1062the bot will change @var{channel}'s topic to @var{topic}.
1063@end defun
1064
1065@defun bot:unlock channel
1066Makes the bot unlock topic on @var{channel}.
1067@end defun
1068
1069@c (0, 0, 0)
1070@defun bot:getnickname
1071[ Gets the bot's nickname? ]
1072@end defun
1073
1074@c (0, 0, 0)
1075@defun bot:getserver
1076@end defun
1077
1078@c (0, 0, 0)
1079@defun bot:getserverlist
1080@end defun
1081
1082@c (0, 0, 0)
1083@defun bot:flush
1084[ Flushes the socket to the server? ]
1085@end defun
1086
1087@c (0, 0, 0)
1088@defun bot:flushport
1089[ Flushes the log port? ]
1090@end defun
1091
1092@c (1, 0, 0)
1093@defun bot:random ?
1094[ Returns a random number? What range? Why? ]
1095@end defun
1096
1097@c (1, 0, 0)
1098@defun bot:delcommand
1099[ Probably deletes a command added with @code{bot:addcommand} ? ]
1100@end defun
1101
1102@c (2, 0, 0)
1103@defun bot:addtimer ? ?
1104@end defun
1105
1106@c (1, 0, 0)
1107@defun bot:deltimer ?
1108@end defun
1109
1110@c (2, 0, 0)
1111@defun bot:dcc-chat-send ? ?
1112@end defun
1113
1114@quotation
1115[ And what about the stuff defined in @file{bobot-utils.scm} ? I just
1116added it here so it could be somewhere. There should also be a
1117section dealing with modules. How to use them. What module scripts
1118are in. What module bobot++ provided primites are in. And so on. ]
1119@end quotation
1120
1121@defun bot:log . messages
1122Write as many @var{messages} as you want to the log. If the arg is a
1123thunk it will be executed and it's output will be written to the log.
1124@end defun
1125
1126@defun bot:load file
1127@end defun
1128
1129@defun bot:load-module module-spec
1130@end defun
1131
1132@defun bot:use-module module-spec
1133@end defun
1134
1135@defun bot:match-not-channel regex
1136match-not-channel adds a prefix regex to your @var{regex} so it
1137doesn't match the sender or channel in a PUBLIC message
1138@end defun
1139
1140@defun bot:match-to-me regex
1141match-to-me matches text that was addressed to the bot with a
1142':', ',', or nothing after the bot name.
1143@end defun
1144
1145@defun bot:sent-to-me? message
1146@end defun
1147
1148@defun bot:ctcp-quote message
1149Returns the CTCP quoted message
1150Input @emph{MUST NOT} contain the trailing @code{\r\n}
1151(it is added by the message sending code).
1152@end defun
1153
1154
1155@defvar %bot:loadpath
1156@end defvar
1157
1158@defun %bot:load-extensions
1159@end defun
1160
1161
1162
1163@node Concept Index, Function Index, Scripting, Top
1164@unnumbered Concept Index
1165@printindex cp
1166
1167@node Function Index, Variable Index, Concept Index, Top
1168@unnumbered Function Index
1169@printindex fn
1170
1171@node Variable Index, , Function Index, Top
1172@unnumbered Variable Index
1173@printindex vr
1174
1175@bye