From 4efa96dbbe3f271166002720ed701767a2322f3d Mon Sep 17 00:00:00 2001 From: Pragmatic Software Date: Sun, 5 Feb 2012 18:27:04 +0000 Subject: [PATCH] docs: updated PBot.html --- PBot/VERSION.pm | 4 +- doc/PBot.html | 2595 ++++++++++++++++++++++++----------------------- 2 files changed, 1310 insertions(+), 1289 deletions(-) diff --git a/PBot/VERSION.pm b/PBot/VERSION.pm index a5198686..928c5ff2 100644 --- a/PBot/VERSION.pm +++ b/PBot/VERSION.pm @@ -13,8 +13,8 @@ use warnings; # These are set automatically by the build/commit script use constant { BUILD_NAME => "PBot", - BUILD_REVISION => 358, - BUILD_DATE => "2012-02-04", + BUILD_REVISION => 359, + BUILD_DATE => "2012-02-05", }; 1; diff --git a/doc/PBot.html b/doc/PBot.html index 0e3b7488..8f310f7c 100755 --- a/doc/PBot.html +++ b/doc/PBot.html @@ -1,1287 +1,1308 @@ - - - - - - - - - Candide - C - - - - - - - - - - - - - - - - - -
-
-
- -

Candide

-
-

From C

-
- -

Contents

- - - -
-

[edit] Candide

-

[edit] About Candide

-

Candide is an IRC bot written in Perl in _pragma's spare time. -

All of candide's commands may begin with its name or !, or be followed by its name. -

Note that commands need not be submitted to the channel; you can /msg it instead. If you /msg candide, it will respond with a private message in return. Also, you do not need to specify its name or one of the trigger symbols. -

-

[edit] Source

-

Candide's source may be found at http://code.google.com/p/pbot2-pl/. It can be browsed at http://code.google.com/p/pbot2-pl/source/browse/#svn/trunk/PBot.
-The URL for the source of any loaded modules may be found by using the 'info' command: -

-
 <pragma_> info faq
- <candide> faq: Module loaded by pragma_ on Fri Dec 31 02:34:04 2004 -> 
-           http://code.google.com/p/pbot2-pl/source/browse/trunk/modules/cfaq.pl, used 512 times (last by ecrane)
-
-

[edit] Directing output to a user

-

You may have candide send the output of a command to a specific person via a /msg (opposed to in the channel), by using the -'tell <nick> about <command>' syntax: -

-
 <pragma_> !tell prec about man fork
- <pragma_> candide, tell Major-Willard about faq fflush
-
-

You may also direct candide to prepend the nickname of a specific -person to a factoid in the channel by stating the nickname after the -factoid: -

-
 <pragma_> !help defrost
- <candide> defrost: To learn all about me, see http://www.iso-9899.info/wiki/Candide
-
-

[edit] Factoids

-

[edit] List of factoids

-

The most recent exported list of factoids can be found here: -http://blackshell.com/~msmud/candide/factoids.html. -

-

[edit] Channel namespaces

-

Factoids added in one channel may be called/triggered in another -channel, providing that the other channel doesn't already have a factoid - of the same name. -

Factoids may also be added to a special channel named .*. -Factoids that are set in this channel will be accessible to any channel, - including private messages. However, factoids that are set in a -specific channel will override factoids of the same name that are set in - the .* channel or other channels. -

For example, a factoid named 'malloc' set in ##c will be called -instead of 'malloc' set in .*, -if the factoid were triggered in ##c; otherwise, the latter 'malloc' -will be triggered if the factoid were triggered in another channel. -

Similiarily, if there were no 'malloc' factoid in the .* -namespace, but only in ##c and you attempted to use this factoid in a -channel other than ##c, that channel will invoke ##c's version of -'malloc', providing that channel doesn't have its own 'malloc' factoid. -

Likewise, if there is a 'malloc' factoid set in ##c++ and the factoid is triggered in the ##c++ channel, -then this version of 'malloc' will be called instead of the ##c or the .* factoid. -

However, if you are in a channel that doesn't have a 'malloc' -factoid and there is no 'malloc' factoid in the global .* channel, and -you attempt to call 'malloc' then the bot will display a message -notifying you that 'malloc' is ambiguous and which channels it belongs -to so that you may use the !fact command to call the correct -factoid. -

-

[edit] Adding a factoid

-

There are two ways to add a factoid. The first is: -

-
  !<factoid> is <description>
-
-

In this case, the factoid will be created as belonging to -the channel in which the command was executed. If this is done via private message, then the factoid will belong to the special .* channel. -

-

[edit] factadd

-

The second method allows you to add a factoid to any channel. This -method is suitable to add to a specific channel from a private message: -

-
  !factadd <channel> <keyword> is <description>
-
-

In this method, you may add factoids to any channel, including the special .* channel, which stands for all channels. -

Examples: -

-
  example a: !keyword is Information about factoid
-  example b: !factadd ##c c is /say C rocks!
-  example c (in channel ##c): !c is /say C rocks!
-
-

[edit] Special commands

-
[edit] /say
-

If a factoid begins with "/say " then candide will not use -the "<factoid> is <description>" format when displaying the -factoid. Also, the "$nick" special variable will expand to -the nick of the caller. -

-
 Example:
-   <pragma_> !hi is /say Well, hello there, $nick.
-   <candide> 'hi' added.
-   <prec> candide, hi
-   <candide> Well, hello there, prec.
-
-
[edit] /me
-

If a factoid begins with "/me " then candide will ACTION the factoid. -

-
 Example:
-   <pragma_> !bounce is /me bounces around.
-   <candide> 'bounce' added.
-   <pragma_> !bounce
-   *candide bounces around.
-
-
[edit] /call
-

If a factoid begins with "/call " then candide will call an existing command. -

-
 Example:
-   <pragma_> !boing is /call bounce
-   <candide> 'boing' added.
-   <pragma_> !boing
-   *candide bounces around.
-
-
[edit] /msg
-

If a factoid begins with "/msg <nick> " then candide will /MSG the factoid -text to <nick> -

-

[edit] Special variables

-

Currently there are two special variables: -

-
[edit] $nick
-
 $nick:  expands to the nick of the caller
-
-
[edit] $args
-
 $args:  expands to any text following the keyword
-
-

[edit] adlib list variables

-

You may create a list of adlib words by using the normal factoid creation method. -Also note that multiple words can be surrounded with double quotes to constitute one element. -

-
 Example:
-   <pragma_> !colors is red green blue "bright yellow" pink "dark purple" orange
-   <candide> 'colors' added
-
-

Then you can instruct candide to pick a random word from this list to use in another factoid by -inserting the list as a variable. -

-
 Example:
-   <pragma_> !sky is /say The sky is $colors.
-   <candide> 'sky' added.
-   <pragma_> !sky
-   <candide> The sky is dark purple.
-   <pragma_> !sky
-   <candide> The sky is green.
-
-

A practical example, creating the RTFM trigger: -

-
 <pragma_> !sizes is big large tiny small huge gigantic teeny
- <candide> 'sizes' added.
- <pragma_> !attacks is whaps thwacks bashes smacks punts whacks
- <candide> 'attacks' added.
- <pragma_> !rtfm is /me $attacks $args with a $sizes $colors manual.
- <candide> 'rtfm' added.
- <pragma_> !rtfm mauke
- * candide thwacks mauke with a big red manual.
-
-

[edit] Deleting a factoid

-

[edit] factrem

-

[edit] forget

-

To remove a factoid, use the factrem or forget command. The syntax is: -

-
 !factrem <channel> <keyword>
- !forget <channel> <keyword>
-
-

[edit] Viewing/triggering a factoid

-

To view or trigger a factoid, one merely issues its keyword as a command. -

-
  <pragma_> candide, c?
-  <candide> C rocks!
-
-

[edit] Viewing/triggering another channel's factoid

-

[edit] fact

-

To view or trigger a factoid belonging to a specific channel, use the fact command: -

-
 !fact <channel> <keyword> [arguments]
-
-

[edit] Aliasing a factoid

-

[edit] factalias

-

To create an factoid that acts as an alias for a command, use the -'factalias' command or '!<alias> is /call <command>'. -

-
 !<newalias> is /call <command>
-
-

The syntax for 'factalias' is: -

-
 !factalias <channel> <new keyword> <command>
-
-
 Example:
-   <pragma_> !book is /me points accusingly at $args, "Where is your book?!"
-   <candide> 'book' added.
-   <pragma_> !book newbie
-   *candide points accusingly at newbie, "Where is your book?!"
-   <pragma_> !rafb is /call book
-   <candide> 'rafb' added.
-   <pragma_> !rafb runtime
-   *candide points accusingly at runtime, "Where is your book?!"
-
-
 Another example:
-   <pragma_> !offtopic is /say In this channel, '$args' is off-topic.
-   <pragma_> !offtopic C++
-   <candide> In this channel, 'C++' is off-topic.
-   <pragma_> !factalias ##c C++ offtopic C++ (or !C++ is /call offtopic C++)
-   <pragma_> !C++
-   <candide> In this channel, 'C++' is off-topic.
-
-

[edit] Changing a factoid

-

[edit] factchange

-

To change a factoid, use the 'factchange' command: -

-
 Usage:  factchange <channel> <keyword> s/<pattern>/<change to>/
- <pragma_> !factchange ##c c s/rocks/rules/ - <candide> c changed. - <pragma_> !c - <candide> C rules! -
-

Note that the 2nd argument is a Perl-style regex. See 'man perlre'. -

-
 For instance, it is possible to append to a factoid by using:
-      'factchange channel factoid s/$/text to append/'
-
-
 Likewise, you can prepend to a factoid by using:
-      'factchange channel factoid s/^/text to prepend/'
-
-

Alternatively, you may append to a factoid by using 'is also': -

-
  <pragma_> candide, c is also See FAQ at http://www.eskimo.com/~scs/C-faq/top.html
-  <candide> Changed: c is /say C rules! ; See FAQ at http://www.eskimo.com/~scs/C-faq/top.html
-
-

[edit] factset

-

To view or set factoid meta-data, such as owner, rate-limit, etc, use the 'factset' command. -

-
 Usage:  factset <channel> <factoid> [<key> [value]]
-
-

Omit <key> and <value> to list all the keys and values -for a factoid. Specify <key>, but omit <value> to see the -value for a specific key. -

-

[edit] factunset

-

To unset factoid meta-data, use the 'factunset' command. -

-

[edit] Finding a factoid

-

[edit] factfind

-

To search the database for a factoid, you may use the 'factfind' command. You may optionally -specify whether to narrow by channel and/or include factoid owner and/or last referenced by in the search. -

If there is only one match for the query, it will display that factoid, otherwise it will list all matches. -

-
Usage: factfind [-channel channel] [-owner nick] [-by nick] [text]
-Example:
- <pragma_> candide, factfind cast
- <candide> 3 factoids match: [##c] NULL casting dontcastmalloc
-
-

[edit] Information about a factoid

-

[edit] factinfo

-

To get information about a factoid, such as who submitted it and when, use the 'factinfo' command: -

-
 !factinfo <channel> <keyword>
-
-
 <pragma_> candide, factinfo ##c NULL
- <candide> NULL: Factoid submitted by Major-Willard for all channels on Sat Jan 1 16:17:42 2005 
-           [5 years and 178 days ago], referenced 39 times (last by pragma_ on Sun Jun 27 04:40:32 2010 [5 seconds ago])
-
-

If the factoid has been submitted for the special .* channel, then it will be shown as 'submitted for all channels'. Otherwise, -it will be shown as 'submitted for #channel'. -

-

[edit] factshow

-

To see the factoid string literal, use the 'factshow' command: -

-
 !factshow <channel> <keyword>
-
-
 <pragma_> !factshow ##c hi
- <candide> hi: /say $greetings, $nick.
-
-

[edit] factset

-

To view factoid meta-data, such as owner, rate-limit, etc, use the 'factset' command. -

-
 Usage:  factset <channel> <factoid> [<key> [value]]
-
-

Omit <key> and <value> to list all the keys and values -for a factoid. Specify <key>, but omit <value> to see the -value for a specific key. -

-

[edit] count

-

To see how many factoids and what percentage of the database <nick> has submitted, use the 'count' command: -

-
 <pragma_> count prec
- <candide> prec has submitted 28 factoids out of 233 (12%)
- <pragma_> count twkm
- <candide> twkm has submitted 74 factoids out of 233 (31%)
- <pragma_> count pragma
- <candide> pragma has submitted 27 factoids out of 233 (11%)
-
-

[edit] histogram

-

To see a histogram of the top 10 factoid submitters, use the 'histogram' command: -

-
 <pragma_> !histogram
- <candide> 268 factoids, top 10 submitters: twkm: 74 (27%) Major-Willard:              
-           64 (23%) pragma_: 40 (14%) prec: 39 (14%) defrost: 14 (5%)  
-           PoppaVic: 10 (3%) infobahn: 7 (2%) orbitz: 3 (1%) mauke: 3 
-           (1%) Tom^: 2 (1%) 
-
-

[edit] top20

-

To see the top 20 most popular factoids, use the 'top10' command. -

-

[edit] Commands

-

To see all the currently available commands, use the list commands command. -

Some commands are: -

-

[edit] Quotegrabs

-

Note that quotegrabs are a new addition and are currently a -work-in-progress. Expect new features, and feel free to make -suggestions! -

-

[edit] Table of quotegrabs

-

A table of grabbed quotes can be found here: http://blackshell.com/~msmud/candide/quotegrabs.html -

-

[edit] grab

-

Grabs a message someone says, and adds it to the quotegrabs database. -

-
Usage: !grab <nick> [history] [channel] -- where [history] is an optional argument that is an integral number of recent messages;
-       e.g., to grab the 3rd most recent message for nick, use !grab nick 3.
-
-

[edit] getq

-

Retrieves and displays a specific grabbed quote from the quotegrabs database. -

-
Usage: !getq <quote-id>
-
-

[edit] rq

-

Retrieves and displays a random grabbed quote from the quotegrabs database. You may filter by nick, channel and/or quote text. -

-
Usage: !rq [nick search regex] [channel search regex] [text search regex]
-
-

[edit] delq

-

Deletes a specific grabbed quote from the quotegrabs database. (Admins only.) -

-
Usage: delq <quote-id>
-
-


-

-

[edit] Modules

-

[edit] cc

-

Code compiler (and executor). This command will compile and execute -user-provided code in a number of languages, and then display the -compiler and/or program output. -

-
[edit] Usage
-
 Usage: !cc [compiler options] [-lang=<language>] <code> [-input=<stdin input>]
-        !cc <run|undo|show|paste|replace|prepend|append|remove|s/// [and ...]>
-
-
  • The -input=<stdin input> option provides STDIN input (i.e., scanf(), getc(stdin), etc.); MUST be the last option. -
  • The run, undo, show, replace, etc commands are part of interactive-editing. See below. -
-
[edit] Supported Languages
-

The -lang option accepts the following languages: C, C99 and C++. -You may also use the -std=<c89|gnu89|c99|gnu99|etc> compiler -option to specify which standard to follow. -

Support for additional languages coming soon. -

-
[edit] Default Language
-

The default language (e.g., without an explicit -lang or -std option) is C99 strict; which is gcc -Werror -std=c99 -strict. -

-
[edit] C and C++ Functionality
-

In C and C++, you may #include <file.h> one after another on -the same line. The bot will automatically put them on separate lines. -

Likewise, you can also #define macros; however, #defines require -an explicit "\n" sequence to terminate, otherwise the remainder of the -line will be part of the macro. -

Note that common typical includes such as stdio.h, stdlib.h, and string.h are already included by default. -

-
[edit] main() Function Unnecessary
-

In C and C++, if there is no main function, then a main function will - created and wrapped around the appropriate bits of your code; anything -outside of any functions, excluding preprocessor stuff, will be put into - this new main function. Here's an example: -

-
 <pragma_> !cc int add(int a, int b) { return a + b; } printf("4 + 6 = %d -- ", add(4, 6)); int add3(int a, int b, int c) 
-           { return add(a, b) + c; } printf("7 + 8 + 9 = %d", add3(7, 8, 9));
- <candide> 4 + 6 = 10 -- 7 + 8 + 9 = 24
-
-

The previous code gets compiled as: -

-
#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
- 
-int add(int a, int b) {
-    return a + b;
-}
- 
-int add3(int a, int b, int c) {
-    return add(a, b) + c;
-}
- 
-int main(int argc, char **argv) {
-    printf("4 + 6 = %d -- ", add(4, 6));
-    printf("7 + 8 + 9 = %d", add3(7, 8, 9));
-    return 0;
-}
-
-
[edit] Debugger output
-

If a signal is detected, the bot will break into the debugger and display useful information. -

Example session: -

-
< pragma_> ,cc char *p = 0; *p = 1;
-< candide> pragma_: Program received signal 11 (SIGSEGV) at statement: *p = 1;
-
-
< pragma_> ,cc void MURDERDEATHKILL() { char *p = 0, s[] = "lol"; strcpy(p, s); }  MURDERDEATHKILL();
-< candide> pragma_: Program received signal 11 (SIGSEGV) in MURDERDEATHKILL () at statement: strcpy(p, s);
-
-
< pragma_> ,cc int a = 2 / 0;
-< candide> pragma_: [In function 'main': warning: division by zero] Program received signal 8 (SIGFPE) at statement: int a = 2 / 0;
-
-
[edit] Embedding Newlines
-

In Assembler, you may start a newline in the code via a \n sequence or a semi-colon. -

In C and C++, #defines must be terminated by a \n sequence. -

In all other languages, you may embed a newline in the code by using |n. Yes, that's the pipe character followed by 'n'. -

-
[edit] Interactive Editing
-

The !cc command supports interactive-editing. The general syntax is:  !cc [command]. -

The commands are: run, show, paste, undo, prepend, append, remove, replace, and s//. With the exception of undo, which must be the first command, the rest of the commands may be chained together by separating them with whitespace or "and". -

The commands are described in more detail below: -

-
[edit] show
-

To show the latest code in the buffer, use the show command: -

-
 <pragma_> !cc show
- <candide> pragma_: printf("Hello, world!");
-
-

This command is stand-alone and cannot be chained with other interactive-editing commands. -

-
[edit] paste
-

To paste the full source of the latest code in the buffer as the compiler sees it, use the paste command: -

-
 <pragma_> !cc paste
- <candide> pragma_: http://some.random.paste-site.com/paste/results
-
-

This command is stand-alone and cannot be chained with other interactive-editing commands. -

-
[edit] run
-

To attempt to compile and execute the latest code in the buffer, use the run command: -

-
 <pragma_> !cc run
- <candide> pragma_: Hello, world!
-
-

This command is stand-alone and cannot be chained with other interactive-editing commands. -

-
[edit] undo
-

To undo any changes, use undo. The undo command must be the first command before any subsequent commands. -

-
[edit] s//
-

To change the latest code in the buffer, use the s/regex/substitution/[gi] pattern. -

-
 <pragma_> !cc s/Hello/Good-bye/ and s/world/void/
- <candide> pragma_: Good-bye, void!
- <pragma_> !cc show
- <candide> pragma_: printf("Good-bye, void!");
-
-
[edit] replace
-

Alternatively, you may use the replace command. The usage is: -

-
 !cc replace [all, first, second, ..., tenth, last] 'from' with 'to'
-
-
[edit] append
-

Text may be appended with the append command: -

-
 !cc append 'text'
-
-
[edit] prepend
-

Text may be prepended with the prepend command: -

-
 !cc prepend 'text'
-
-
[edit] remove
-

Text may be deleted with the remove command: -

-
 !cc remove [all, first, second, ..., tenth, last] 'text'
-
-
[edit] Some Examples
-
 Examples:
-
-
   < pragma_> !cc int fib2(int n, int p0, int p1) { return n == 1 ? p1 : fib2(n  - 1, p1, p0 + p1); } 
-               int fib(int n) { return n == 0 ? 0 : fib2(n, 0, 1); } for(int i = 0; i < 21; i++) printf("%d ", fib(i));
-   < candide> pragma_: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
-
-
   < pragma_> !cc int i = 0, last = 1; while(i <= 7000) { printf("%d ", i); i += last; last = i - last; }
-    <candide> pragma_: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
-
-
   <Icewing> !cc int n=0, f[2]={0,1}; while(n<20) printf("%d ",f[++n&1]=f[0]+f[1]); // based on cehteh
-   <candide> Icewing: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
-
-
  <3monkeys> !cc @p=(0,1); until($#p>20) { print"$p[-2]\n"; push @p, $p[-2] + $p[-1] } -lang=Perl
-   <candide> 3monkeys: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
-
-
   <spiewak> !cc -lang=Ruby p,c=0,1; 20.times{p p; c=p+p=c}
-   <candide> spiewak: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
-
-
     <Jafet> !cc main = print $ take 20 $ let fibs = 0 : scanl (+) 1 fibs in fibs; -lang=Haskell
-   <candide> Jafet: [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181]
-
-

[edit] cc2

-

This command is identical to the cc command, with the following exceptions: does not accept compiler options. -

Uses http://ideone.com. -

-
[edit] Usage
-
 Usage: !cc [-nowarn] [-showurl] [-lang=<language>] <code> [-input=<stdin input>]
-        !cc <run|undo|show|replace|add|remove [and ...]>
-
-
  • The -nowarn option is specific to the C programming language; -it removes the -Werror and -strict options, and changes -std to gnu89. -
  • The -showurl option reformats the final code with includes and - indentation, and displays the Ideone pasted URL. (Useful for viewing -the complete and compilable code.) -
  • The -input=<stdin input> option provides STDIN input (i.e., scanf(), getc(stdin), etc.); MUST be the last option. -
  • The run, undo, show, replace, add, etc commands are part of interactive-editing. See below. -
-
[edit] Supported Languages
-

The -lang option accepts the following languages: -

-
     Ada                            => Ada (gnat-4.3.2),
-     asm                            => Assembler (nasm-2.07),
-     Assembler                      => Assembler (nasm-2.07),
-     Bash                           => Bash (bash 4.0.35),
-     bc                             => bc (bc-1.06.95),
-     bf                             => Brainf**k (bff-1.0.3.1),
-     Brainfuck                      => Brainf**k (bff-1.0.3.1),
-     C                              => C (gcc-4.3.4),
-     C#                             => C# (gmcs 2.0.1),
-     C++                            => C++ (gcc-4.3.4),
-     C99                            => C99 strict (gcc-4.3.4),
-     CLIPS                          => CLIPS (clips 6.24),
-     clisp                          => Common Lisp (clisp) (clisp 2.47),
-     Clojure                        => Clojure (clojure 1.1.0),
-     COBOL                          => COBOL (open-cobol-1.0),
-     COBOL85                        => COBOL 85 (tinycobol-0.65.9),
-     D                              => D (dmd) (dmd-2.042),
-     Erlang                         => Erlang (erl-5.7.3),
-     Forth                          => Forth (gforth-0.7.0),
-     Fortran                        => Fortran (gfortran-4.3.4),
-     gawk                           => AWK (gawk) (gawk-3.1.6),
-     gnu89                          => C (gcc-4.3.4),
-     Go                             => Go (gc 2010-01-13),
-     Haskell                        => Haskell (ghc-6.8.2),
-     Icon                           => Icon (iconc 9.4.3),
-     Intercal                       => Intercal (c-intercal 28.0-r1),
-     Java                           => Java (sun-jdk-1.6.0.17),
-     JavaScript                     => JavaScript (rhino) (rhino-1.6.5),
-     JavaScript-rhino               => JavaScript (rhino) (rhino-1.6.5),
-     JavaScript-spidermonkey        => JavaScript (spidermonkey) (spidermonkey-1.7),
-     JS                             => JavaScript (rhino) (rhino-1.6.5),
-     JScript                        => JavaScript (rhino) (rhino-1.6.5),
-     Lua                            => Lua (luac 5.1.4),
-     mawk                           => AWK (mawk) (mawk-1.3.3),
-     nasm                           => Assembler (nasm-2.07),
-     Nemerle                        => Nemerle (ncc 0.9.3),
-     Nice                           => Nice (nicec 0.9.6),
-     Ocaml                          => Ocaml (ocamlopt 3.10.2),
-     Pascal                         => Pascal (fpc) (fpc 2.2.0),
-     Pascal-fpc                     => Pascal (fpc) (fpc 2.2.0),
-     Pascal-gpc                     => Pascal (gpc) (gpc 20070904),
-     Perl                           => Perl (perl 5.8.8),
-     PHP                            => PHP (php 5.2.11),
-     Pike                           => Pike (pike 7.6.86),
-     Prolog                         => Prolog (gnu) (gprolog-1.3.1),
-     Prolog-gnu                     => Prolog (gnu) (gprolog-1.3.1),
-     Prolog-swi                     => Prolog (swi) (swipl 5.6.64),
-     Python                         => Python (python 2.6.4),
-     Python3                        => Python3 (python-3.1.1),
-     R                              => R (R-2.9.2),
-     Ruby                           => Ruby (ruby 1.8.7),
-     Scala                          => Scala (Scalac 2.7.7),
-     Scheme                         => Scheme (guile) (guile 1.8.5),
-     Smalltalk                      => Smalltalk (gst 3.1),
-     Tcl                            => Tcl (tclsh 8.5.7),
-     Unlambda                       => Unlambda (unlambda-2.0.0),
-     VB                             => Visual Basic .NET (mono-2.4.2.3)
-
-
[edit] Default Language
-

The default language (e.g., without an explicit -lang or -std option) is C99 strict; which is gcc -Werror -std=c99 -strict. -

-

[edit] cc3

-

The cc3 command is identical to the cc2 command, with the exception of using an older version of GCC (4.1.2) through http://codepad.org. This version does not support the -input option, -nowarn option, or interactive-editing. -

It can compile and display the output for code from the following - languages: C (GNU89), C++, D, Haskell, Lua, OCaml, PHP, Perl, Python, -Ruby, Scheme and Tcl. Defaults to C (GNU89). -

-

[edit] faq

-

Displays questions from the comp.lang.c faq. - Some queries may return more than one result; if this happens, you may - use the 'match #' optional argument to specify the match you'd like to -view. -

-
 Usage: !faq [match #] <search regex>
- Samples:
-   <pragma_> !faq cast malloc
-   <candide> 2 results, displaying #1: 7. Memory Allocation, 7.6 Why am  
-             I getting ``warning: assignment of pointer from integer 
-             lacks a cast for calls to malloc? : 
-             http://www.eskimo.com/~scs/C-faq/q7.6.html
-   <pragma_> !faq 2 cast malloc
-   <candide> 2 results, displaying #2: 7. Memory Allocation, 7.7 Why 
-             does some code carefully cast the values returned by 
-             malloc to the pointer type being allocated? :    
-             http://www.eskimo.com/~scs/C-faq/q7.7.html
-   <pragma_> !faq ^6.4
-   <candide> 6. Arrays and Pointers, 6.4 Why are array and pointer 
-             declarations interchangeable as function formal 
-             parameters? : http://www.eskimo.com/~scs/C-faq/q6.4.html
-
-

[edit] cstd

-

Searches ISO/IEC 9899:TC3 (WG14/N1256), also known as the C99 draft standard. http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf -

-
 Usage: cstd [-list] [-n#] [section] [search regex]
-          If specified, 'section' must be in the form of X.YpZ where X and Y are section/chapter and, optionally, pZ is paragraph. 
-          To display a specific section and all its paragraphs, specify just the 'section' without pZ.
-          To display just a specific paragraph, specify the full 'section' identifier (X.YpZ).
-          You may use -n # to skip to the #th match. 
-          To list only the section numbers containing 'search text', add -list.
-          If both 'section' and 'search regex' are specified, then the search space will be within the specified section identifier.
-
-
 Examples:
-
-
   < pragma_> !cstd pointer value
-   < candide> Displaying #1 of 64 matches: 5.1.2.2.1p1: [Program startup] If they are declared, the parameters to the 
-              main function shall obey the following constraints: -- The value of argc shall be nonnegative. -- argv[argc] 
-              shall be a null pointer. -- If the value of argc is greater than zero, the array members argv[0] through
-              argv[argc-1] inclusive shall contain pointers to st... truncated; see http://codepad.org/f2DULaGQ for full text.
-
-
   < pragma_> !cstd pointer value -list
-   < candide> Sections containing 'pointer value': 5.1.2.2.1p2, 5.1.2.3p9, 6.2.5p20, 6.2.5p27, 6.3.2.1p3, 6.3.2.1p4, 
-              6.3.2.3p2, 6.3.2.3p6, 6.5.2.1p3, 6.5.2.2p5, 6.5.2.2p6, 6.5.2.4p1, 6.5.2.4p2, 6.5.3.1p1, 6.5.3.2p3, 6.5.3.2p4,
-              6.5.3.3p5, 6.5.3.4p5, 6.5.6p8, 6.5.6p9, 6.5.8p5, 6.5.15p6, 6.6p7, 6.6p9, 6.7.2.2p5, 6.7.2.3p7, 6.7.2.3p3, 
-              6.7.5.1p3, 6.7.5.2p7, 7.1.1p1, 7.1.1p4, 7.1.4p1, 7... truncated; see http://codepad.org/qQlnJYJk for full text.
-
-
   < pragma_> Hmm, how about just section 6.3?
-
-
   < pragma_> !cstd pointer value 6.3
-   < candide> Displaying #1 of 4 matches: 6.3.2.1p1: [Lvalues, arrays, and function designators] Except when it is the operand
-              of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression
-              that has type ``array of type is converted to an expression with type ``pointer to type that points to the
-              initial element of the array ob... truncated; see http://codepad.org/mf1RNnr2 for full text.
-
-
   < pragma_> !cstd pointer value 6.3 -list
-   < candide> Sections containing 'pointer value': 6.3.2.1p3, 6.3.2.1p4, 6.3.2.3p2, 6.3.2.3p6
-
-
   < pragma_> !cstd pointer value 6.3 -n3
-   < candide> Displaying #3 of 4 matches: 6.3.2.3p1: [Pointers] For any qualifier q, a pointer to a non-q-qualified type may be
-              converted to a pointer to the q-qualified version of the type; the values stored in the original and converted 
-              pointers shall compare equal.
-
-

[edit] man

-

Displays manpage summaries and/or C related tidbits (headers, -prototypes, specifications), as well as a link to the FreeBSD manpage. -

-
Usage:  !man [section] query
-Samples:
- <pragma_> !man fork
- <candide> Includes: sys/types.h, unistd.h - pid_t fork(void); - SVr4,  
-           SVID, POSIX, X/OPEN, BSD - fork creates a child process that 
-           differs from the parent process only in its PID and PPID, and 
-           in the fact that resource utilizations are set to 0 - 
-           http://www.iso-9899.info/man?fork
- <pragma_> !man atexit
- <candide> Includes: stdlib.h - int atexit(void (*function)(void)); - 
-           SVID 3, BSD 4.3, ISO 9899 - atexit () function registers the 
-           given function to be called at normal program termination, 
-           whether via exit(3) or via return from the program's main - 
-           http://www.iso-9899.info/man?atexit
- <pragma_> !man getcwd
- <candide> Includes: unistd.h - char *getcwd(char *buf, size_t size); - 
-           POSIX.1 - getcwd () function copies an absolute pathname of 
-           the current working directory to the array pointed to by buf, 
-           which is of length size - http://www.iso-9899.info/man?getcwd
-
-

[edit] google

-

Displays google results for a query. -

-
Usage:  !google [number of results] query
-Samples:
-  <pragma_> !google brian kernighan
-  <candide> brian kernighan (115,000): Brian Kernighan's Home Page:                  
-            (http://www.cs.princeton.edu/~bwk/)
-  <pragma_> !google 3 brian kernighan
-  <candide> brian kernighan (115,000): Brian Kernighan's Home Page:                  
-            (http://www.cs.princeton.edu/~bwk/), An Interview with Brian      
-            Kernighan: (http://www-2.cs.cmu.edu/~mihaib/kernighan-interview/),
-            Interview with Brian Kernighan | Linux Journal: 
-            (http://www.linuxjournal.com/article.php?sid=7035), Brian W. 
-            Kernighan: (http://www.lysator.liu.se/c/bwk/) ,Brian W. 
-            Kernighan: Programming in C: A Tutorial:       
-            (http://www.lysator.liu.se/c/bwk-tutor.html)
-
-

[edit] define/dict

-

Displays dictionary defintions from http://dict.org using DICT protocol. -

Databases for the -d option are listed here: http://blackshell.com/~msmud/candide/dict_databases.txt -

-
 Usage: dict [-d database] [-n start from definition number] [-t first letter of word class type (n]oun, v]erb, etc)] 
-        [-search <regex> for definitions matching <regex>] <word>
-
-
 Examples:
-
-
   <pragma_> dict hit
-   <candide> hit: n: 1) (baseball) a successful stroke in an athletic contest (especially in baseball); 
-            "he came all the way around on Williams' hit", 2) the act of contacting one thing with another; 
-            "repeated hitting raised a large bruise"; "after three misses she finally got a hit" [syn: hitting,
-            striking], 3) a conspicuous success; "that song was his first hit and marked the beginning of his 
-            career"; "that new Broadway show is a real smasher"
-
-
   <pragma_> dict -n 4 hit
-   <candide> hit: n: 4) (physics) an brief event in which two or more bodies come together; "the collision of the 
-             particles resulted in an exchange of energy and a change of direction" [syn: collision], 5) a dose 
-             of a narcotic drug, 6) a murder carried out by an underworld syndicate; "it has all the earmarks of 
-             a Mafia hit", 7) a connection made via the internet to another website; "WordNet gets many hits from 
-             users worldwide"
-
-
   <pragma_> dict -t v hit
-   <candide> hit: v: 1) cause to move by striking; "hit a ball", 2) hit against; come into sudden contact with; 
-             "The car hit a tree"; "He struck the table with his elbow" [syn: strike, impinge on, run into, 
-             collide with] [ant: miss], 3) affect or afflict suddenly, usually adversely; "We were hit by really 
-             bad weather"; "He was stricken with cancer when he was still a teenager"; "The earthquake struck at 
-             midnight" [syn: strike], 4) deal a blow to
-
-
   <pragma_> dict -search ball hit
-   <candide> hit: n: 1) (baseball) a successful stroke in an athletic contest (especially in baseball); "he came all 
-             the way around on Williams' hit", v: 1) cause to move by striking; "hit a ball"
-
-
   <pragma_> dict -d eng-fra hit
-   <candide> hit: 1) [hit] battre, frapper, heurter frapper, heurter atteindre, frapper, parvenir, saisir
-
-

[edit] gdict

-

Displays dictionary definitions from http://google.com's define:<entry> search. -

-
Usage: !gdict query
-
-

[edit] udict

-

Displays dictionary definitions from http://urbandictionary.com. -

-
Usage: !udict query
-
-

[edit] wdict

-

Displays Wikipedia article abstracts (first paragraph). Note: case-sensitive and very picky. -

-
Usage: !wdict query
-
-

[edit] acronym

-

Displays expanded acronyms. -

-
Usage:  !acronym query
-Samples:
-  <pragma_> !acronym posix
-  <candide> posix (3 entries): Portable Operating System for   
-            Information Exchange, Portable Operating System Interface 
-            Extensions (IBM), Portable Operating System Interface for        
-            Unix
-  <pragma_> !acronym linux
-  <candide> linux (1 entries): Linux Is Not UniX
-
-

[edit] weather

-

Displays current conditions and forecasts. (Note: currently half-broken.) -

-
Usage:  !weather zipcode  or  !weather city, state, country
-Samples:
-  <pragma_> !weather chicago, il
-  <candide> United States, Illinois, Chicago (Updated 9:53 pm CST): 
-            Temp: 9F/-12C (Feels like: -2F/-18C), High: 9F/-12C, Low: 
-            9F/-12C, Sky: Mostly Cloudy, Humidity: 48%, Wind: W 8 mph, 
-            Sunrise: 7:16 am, Sunset: 4:44 pm,  Tonight: Partly cloudy 
-            skies. Cold. Low around 5F. Winds WNW at 5 to 10 mph.
-
-

[edit] map

-

Displays nearby locations to provided location (for use with .weather). -

-
Usage:  !map zipcode  or  .map city, state, country
-Samples:
-  <pragma_> !map chicago, il
-  <candide> United States, Illinois, Chicago - Nearby Locations: Fox    
-            Valley, Chicago/Meigs Field, Cicero, Chicago/Midway Arpt, 
-            Berwyn, Oak Park,
-
-

[edit] gspy

-

Displays recent search queries for a popular search engine. -

-
Usage:  !gspy
-Samples:
-  <pragma_> !gspy
-  <candide> Recent search queries: cranberry mall, westminster,      
-            architectural styles in glens falls, architectural styles                                   
-            in glens falls, cameras, dayh-f036n090a, virgin valley art 
-            association, spacemaker heat shield, calvinist, video 
-            capture software, subaru wrx performance modifications
-
-

[edit] math

-

Extremely basic calculations. -

-
Usage:  !math expression
-Samples:
-  <pragma_> !math 5 + 5
-  <candide> 5 + 5 = 10
-
-

[edit] compliment

-

Displays a random Markov-chain compliment/insult. -

-
Usage: !compliment [nick]
-
-

[edit] insult

-

Displays a random insult. -

-
Usage: !insult [nick]
-
-

[edit] excuse

-

Displays a random excuse. -

-
Usage: !excuse [nick]
-
-

[edit] horoscope

-

Displays a horoscope for a Zodiac sign (google this if you don't know your sign). -

-
Usage: !horoscope <sign>
-
-

[edit] quote

-

Displays quotes from a popular quotation database. If you -use !quote without arguments, it returns a random quote; if you use - it -with an argument, it searches for quotes containing that text; if you -add --author <name> at the end, it searches for a quote by -that author; if you specify text and --author, it searches for quotes by - that author, containing that text. -

-
Usage: !quote [search text] [--author <author name>]
-Samples:
-  <pragma_> !quote
-  <candide> "Each success only buys an admission ticket to a more difficult problem." -- Henry Kissinger (1923 -  ).  Discuss!
-  <pragma_> !quote --author lao tzu
-  <candide> 41 matching quotes found. "A journey of a thousand miles begins with a single step." -- Lao-tzu (604 BC - 531 BC).    Discuss!
-  <pragma_> !quote butterfly
-  <candide> 11 matching quotes found. "A chinese philosopher once had a dream that he was a butterfly. From that day on, he
-            was never quite certain that he was not a butterfly, dreaming that he was a man." -- Unknown.  Discuss!
-
-

[edit] Informative

-

[edit] list

-

Lists information about specified argument -

-
Usage:  .list <modules|factoids|commands|admins>
-
-

[edit] info

-

Shows detailed information about a module or a factoid -

-
 Usage:  .info <module|factoid>
-
-

[edit] version

-

Shows version information -

-

[edit] source

-

Shows candide's source information.
Source for candide: http://pragma.homeip.net/stuff/scripts/pbot2.pl. -

-

[edit] help

-

Shows link to this page. -

-

[edit] Administrative

-

[edit] login

-

You cannot use any of the admin commands unless you login first -

-
 Usage:  login <password>
-
-

Note that login requires that your nick and hostmask match candide's records. -

-

[edit] logout

-

Logs out of candide. -

-

[edit] ignore

-

Ignore a user -

-
Usage:  !ignore <hostmask> [channel] [timeout]
-
-

[edit] unignore

-

Unignores a user -

-
Usage:  !unignore <hostmask> [channel]
-
-

[edit] ban

-

Bans a user -

-
 Usage:  !ban <hostmask> [timeout seconds]
-
-

If timeout is omitted, candide will ban the user for one hour. Timeout is in seconds. -

-

[edit] unban

-

Unbans a user -

-
 Usage:
-   !unban <hostmask>
-
-

Note that <hostmask> must EXACTLY match the hostmask in the ban list for the channel. -

-

[edit] kick

-

Removes a nick from the channel -

-
 Usage:  !kick <nick> <reason>
-
-

Must be used in the channel. -

-

[edit] export

-

exports specified list to web page -

-
Usage:  !export <commands|factoids|admins|channels>
-
-

[edit] Flood control

-

Candide can monitor the channel for excessive rapid traffic -originating from an individual and automatically ban the offender for a -certain length of time. -

-

[edit] Message flood

-

If four (4) or more messages are sent within ten (10) seconds, the -flood control is triggered. The offender will be quieted for 30 seconds - for the first offense. Each additional offense will result in the -offender being quieted for much longer period. For example, the first -offense will result in 30 seconds, the 2nd offense will be 5 minutes, -the 3rd will be 1 hour, and so on. -

-

[edit] Join flood

-

If four (4) or more JOINs are observed within thirty (30) minutes without any messages in between joins, the offender will be forwarded to another channel for a limited time: 2^(number_of_offenses + 2) hours. -

In addition to private instructions from candide, this channel -will have a /topic and ChanServ on-join message with instructions -explaining to the offender how to remove the forwarding. The -instructions are to message candide with: unbanme <channel>. -

(Any messages sent to the public channel by the user at any time will reset their JOIN counter back to zero.) -

-

[edit] Notification message

-

Candide will send the following message to the offender each offense. -

-

[edit] Chat flooding

-

"You have been quieted due to flooding. Please use a web paste service such as http://codepad.org for lengthy pastes. You will be allowed to speak again in ### seconds." -

-

[edit] Join flooding

-

"You have been banned from $channel for $timeout due to join -flooding. If your connection issues have been resolved, or this was an -accident, you may request an unban at any time by responding to this -message with: unbanme $channel" -

-

[edit] Opping/Deopping

-

ChanServ will automagically op and deop Candide when necessary. -Candide will wait until about 5 minutes have elapsed before requesting a - deop from ChanServ. -

-
-

Category IRC -

- - - -
-
-
-
-
-
-
Views
- -
-
-
Personal tools
- -
- - - - - -
-
- - - - -
- \ No newline at end of file + + + + PBot + +
+
+
+ +

PBot

+
+
+ + + + +

PBot

+

About PBot

+

PBot is an IRC bot written in Perl in pragma_'s spare time. +

All of PBot's commands may begin with its name or its trigger (defaults to exclaimation mark [!]; the freenode instance uses a comma [,]), or be followed by its name. +

Note that commands need not be submitted to the channel; you can /msg it instead. If you /msg PBot, it will respond with a private message in return. In private message, you do not need to specify its name or one of the trigger symbols. +

+

Source

+

PBot's source may be found at http://code.google.com/p/pbot2-pl/. It can be browsed at http://code.google.com/p/pbot2-pl/source/browse/#svn/trunk/.
+The URL for the source of any loaded modules may be found by using the 'info' command: +

+
 <pragma_> info faq
+ <PBot> faq: Module loaded by pragma_ on Fri Dec 31 02:34:04 2004 -> 
+           http://code.google.com/p/pbot2-pl/source/browse/trunk/modules/cfaq.pl, used 512 times (last by ecrane)
+
+

Directing output to a user

+

You may have PBot send the output of a command to a specific person via a /msg (opposed to in the channel), by using the +'tell <nick> about <command>' syntax: +

+
 <pragma_> !tell prec about man fork
+ <pragma_> PBot, tell Major-Willard about faq fflush
+
+

You may also direct PBot to prepend the nickname of a specific person to a factoid in the channel by stating the nickname after the factoid: +

+
 <pragma_> !help defrost
+ <PBot> defrost: To learn all about me, see http://www.iso-9899.info/wiki/Candide
+
+

Factoids

+

List of factoids

+

The most recent exported list of factoids can be found here: +http://blackshell.com/~msmud/candide/factoids.html. +

+

Channel namespaces

+

Factoids added in one channel may be called/triggered in another channel, providing that the other channel doesn't already have a factoid of the same name. +

Factoids may also be added to a special channel named .*. Factoids that are set in this channel will be accessible to any channel, including private messages. However, factoids that are set in a specific channel will override factoids of the same name that are set in the .* channel or other channels. +

For example, a factoid named 'malloc' set in ##c will be called instead of 'malloc' set in .*, +if the factoid were triggered in ##c; otherwise, the latter 'malloc' will be triggered if the factoid were triggered in another channel. +

Similiarily, if there were no 'malloc' factoid in the .* namespace, but only in ##c and you attempted to use this factoid in a channel other than ##c, that channel will invoke ##c's version of 'malloc', providing that channel doesn't have its own 'malloc' factoid. +

Likewise, if there is a 'malloc' factoid set in ##c++ and the factoid is triggered in the ##c++ channel, +then this version of 'malloc' will be called instead of the ##c or the .* factoid. +

However, if you are in a channel that doesn't have a 'malloc' factoid and there is no 'malloc' factoid in the global .* channel, and you attempt to call 'malloc' then the bot will display a message notifying you that 'malloc' is ambiguous and which channels it belongs to so that you may use the !fact command to call the correct factoid. +

+

Adding a factoid

+

There are two ways to add a factoid. The first is: +

+
  !<factoid> is <description>
+
+

In this case, the factoid will be created as belonging to +the channel in which the command was executed. If this is done via private message, then the factoid will belong to the special .* channel. +

+

factadd

+

The second method allows you to add a factoid to any channel. This method is suitable to add to a specific channel from a private message: +

+
  !factadd <channel> <keyword> is <description>
+
+

In this method, you may add factoids to any channel, including the special .* channel, which stands for all channels. +

Examples: +

+
  example a: !keyword is Information about factoid
+  example b: !factadd ##c c is /say C rocks!
+  example c (in channel ##c): !c is /say C rocks!
+
+

Special commands

+
/say
+

If a factoid begins with "/say " then PBot will not use +the "<factoid> is <description>" format when displaying the +factoid. Also, the "$nick" special variable will expand to +the nick of the caller. +

+
 Example:
+   <pragma_> !hi is /say Well, hello there, $nick.
+   <PBot> 'hi' added.
+   <prec> PBot, hi
+   <PBot> Well, hello there, prec.
+
+
/me
+

If a factoid begins with "/me " then PBot will ACTION the factoid. +

+
 Example:
+   <pragma_> !bounce is /me bounces around.
+   <PBot> 'bounce' added.
+   <pragma_> !bounce
+   *PBot bounces around.
+
+
/call
+

If a factoid begins with "/call " then PBot will call an existing command. +

+
 Example:
+   <pragma_> !boing is /call bounce
+   <PBot> 'boing' added.
+   <pragma_> !boing
+   *PBot bounces around.
+
+
/msg
+

If a factoid begins with "/msg <nick> " then PBot will /MSG the factoid +text to <nick> +

+

Special variables

+

Currently there are two special variables: +

+
$nick
+
 $nick:  expands to the nick of the caller
+
+
$args
+
 $args:  expands to any text following the keyword
+
+

adlib list variables

+

You may create a list of adlib words by using the normal factoid creation method. +Also note that multiple words can be surrounded with double quotes to constitute one element. +

+
 Example:
+   <pragma_> !colors is red green blue "bright yellow" pink "dark purple" orange
+   <PBot> 'colors' added
+
+

Then you can instruct PBot to pick a random word from this list to use in another factoid by +inserting the list as a variable. +

+
 Example:
+   <pragma_> !sky is /say The sky is $colors.
+   <PBot> 'sky' added.
+   <pragma_> !sky
+   <PBot> The sky is dark purple.
+   <pragma_> !sky
+   <PBot> The sky is green.
+
+

A practical example, creating the RTFM trigger: +

+
 <pragma_> !sizes is big large tiny small huge gigantic teeny
+ <PBot> 'sizes' added.
+ <pragma_> !attacks is whaps thwacks bashes smacks punts whacks
+ <PBot> 'attacks' added.
+ <pragma_> !rtfm is /me $attacks $args with a $sizes $colors manual.
+ <PBot> 'rtfm' added.
+ <pragma_> !rtfm mauke
+ * PBot thwacks mauke with a big red manual.
+
+

Deleting a factoid

+

factrem

+

forget

+

To remove a factoid, use the factrem or forget command. The syntax is: +

+
 !factrem <channel> <keyword>
+ !forget <channel> <keyword>
+
+

Viewing/triggering a factoid

+

To view or trigger a factoid, one merely issues its keyword as a command. +

+
  <pragma_> PBot, c?
+  <PBot> C rocks!
+
+

Viewing/triggering another channel's factoid

+

fact

+

To view or trigger a factoid belonging to a specific channel, use the fact command: +

+
 !fact <channel> <keyword> [arguments]
+
+

Aliasing a factoid

+

factalias

+

To create an factoid that acts as an alias for a command, use the 'factalias' command or '!<alias> is /call <command>'. +

+
 !<newalias> is /call <command>
+
+

The syntax for 'factalias' is: +

+
 !factalias <channel> <new keyword> <command>
+
+
 Example:
+   <pragma_> !book is /me points accusingly at $args, "Where is your book?!"
+   <PBot> 'book' added.
+   <pragma_> !book newbie
+   *PBot points accusingly at newbie, "Where is your book?!"
+   <pragma_> !rafb is /call book
+   <PBot> 'rafb' added.
+   <pragma_> !rafb runtime
+   *PBot points accusingly at runtime, "Where is your book?!"
+
+
 Another example:
+   <pragma_> !offtopic is /say In this channel, '$args' is off-topic.
+   <pragma_> !offtopic C++
+   <PBot> In this channel, 'C++' is off-topic.
+   <pragma_> !factalias ##c C++ offtopic C++ (or !C++ is /call offtopic C++)
+   <pragma_> !C++
+   <PBot> In this channel, 'C++' is off-topic.
+
+

Changing a factoid

+

factchange

+

To change a factoid, use the 'factchange' command: +

+
 Usage:  factchange <channel> <keyword> s/<pattern>/<change to>/
+ <pragma_> !factchange ##c c s/rocks/rules/ + <PBot> c changed. + <pragma_> !c + <PBot> C rules! +
+

Note that the 2nd argument is a Perl-style regex. See 'man perlre'. +

+
 For instance, it is possible to append to a factoid by using:
+      'factchange channel factoid s/$/text to append/'
+
+
 Likewise, you can prepend to a factoid by using:
+      'factchange channel factoid s/^/text to prepend/'
+
+

Alternatively, you may append to a factoid by using 'is also': +

+
  <pragma_> PBot, c is also See FAQ at http://www.eskimo.com/~scs/C-faq/top.html
+  <PBot> Changed: c is /say C rules! ; See FAQ at http://www.eskimo.com/~scs/C-faq/top.html
+
+

factset

+

To view or set factoid meta-data, such as owner, rate-limit, etc, use the 'factset' command. +

+
 Usage:  factset <channel> <factoid> [<key> [value]]
+
+

Omit <key> and <value> to list all the keys and values for a factoid. Specify <key>, but omit <value> to see the value for a specific key. +

+

factunset

+

To unset factoid meta-data, use the 'factunset' command. +

+

Finding a factoid

+

factfind

+

To search the database for a factoid, you may use the 'factfind' command. You may optionally +specify whether to narrow by channel and/or include factoid owner and/or last referenced by in the search. +

If there is only one match for the query, it will display that factoid, otherwise it will list all matches. +

+
Usage: factfind [-channel channel] [-owner nick] [-by nick] [text]
+Example:
+ <pragma_> PBot, factfind cast
+ <PBot> 3 factoids match: [##c] NULL casting dontcastmalloc
+
+

Information about a factoid

+

factinfo

+

To get information about a factoid, such as who submitted it and when, use the 'factinfo' command: +

+
 !factinfo <channel> <keyword>
+
+
 <pragma_> PBot, factinfo ##c NULL
+ <PBot> NULL: Factoid submitted by Major-Willard for all channels on Sat Jan 1 16:17:42 2005 
+           [5 years and 178 days ago], referenced 39 times (last by pragma_ on Sun Jun 27 04:40:32 2010 [5 seconds ago])
+
+

If the factoid has been submitted for the special .* channel, then it will be shown as 'submitted for all channels'. Otherwise, +it will be shown as 'submitted for #channel'. +

+

factshow

+

To see the factoid string literal, use the 'factshow' command: +

+
 !factshow <channel> <keyword>
+
+
 <pragma_> !factshow ##c hi
+ <PBot> hi: /say $greetings, $nick.
+
+

factset

+

To view factoid meta-data, such as owner, rate-limit, etc, use the 'factset' command. +

+
 Usage:  factset <channel> <factoid> [<key> [value]]
+
+

Omit <key> and <value> to list all the keys and values for a factoid. Specify <key>, but omit <value> to see the value for a specific key. +

+

count

+

To see how many factoids and what percentage of the database <nick> has submitted, use the 'count' command: +

+
 <pragma_> count prec
+ <PBot> prec has submitted 28 factoids out of 233 (12%)
+ <pragma_> count twkm
+ <PBot> twkm has submitted 74 factoids out of 233 (31%)
+ <pragma_> count pragma
+ <PBot> pragma has submitted 27 factoids out of 233 (11%)
+
+

histogram

+

To see a histogram of the top 10 factoid submitters, use the 'histogram' command: +

+
 <pragma_> !histogram
+ <PBot> 268 factoids, top 10 submitters: twkm: 74 (27%) Major-Willard:              
+           64 (23%) pragma_: 40 (14%) prec: 39 (14%) defrost: 14 (5%)  
+           PoppaVic: 10 (3%) infobahn: 7 (2%) orbitz: 3 (1%) mauke: 3 
+           (1%) Tom^: 2 (1%) 
+
+

top20

+

To see the top 20 most popular factoids, use the 'top10' command. +

+

Commands

+

To see all the currently available commands, use the list commands command. +

Some commands are: +

+

Quotegrabs

+

Note that quotegrabs are a new addition and are currently a work-in-progress. Expect new features, and feel free to make suggestions! +

+

Table of quotegrabs

+

A table of grabbed quotes can be found here: http://blackshell.com/~msmud/candide/quotegrabs.html +

+

grab

+

Grabs a message someone says, and adds it to the quotegrabs database. +

+
Usage: !grab <nick> [history] [channel] -- where [history] is an optional argument that is an integral number of recent messages;
+       e.g., to grab the 3rd most recent message for nick, use !grab nick 3.
+
+

getq

+

Retrieves and displays a specific grabbed quote from the quotegrabs database. +

+
Usage: !getq <quote-id>
+
+

rq

+

Retrieves and displays a random grabbed quote from the quotegrabs database. You may filter by nick, channel and/or quote text. +

+
Usage: !rq [nick search regex] [channel search regex] [text search regex]
+
+

delq

+

Deletes a specific grabbed quote from the quotegrabs database. (Admins only.) +

+
Usage: delq <quote-id>
+
+


+

+

Modules

+

cc

+

Code compiler (and executor). This command will compile and execute user-provided code in a number of languages, and then display the compiler and/or program output. +

The program is executed within a gdb debugger instance, which may be interacted with via the gdb macros described below or with the gdb("command") function. +

The compiler and program are executed inside a virtual machine. After each run, the virtual machine is restored to a previous state. No system calls have been disallowed. You can write to and read from the filesystem provided you do it in the same program. The network cable has been unplugged. You are free to write and test any code you like. Have fun. +

Uses gcc 4.7-20120129 and gdb 7.4-20120124. +

+
Usage
+
 Usage: cc [compiler options] [-lang=<language>] <code> [-input=<stdin input>]
+        cc <run|undo|show|paste|replace|prepend|append|remove|s/// [and ...]>
+
+
  • The -input=<stdin input> option provides STDIN input (i.e., scanf(), getc(stdin), etc.); MUST be the last option. +
  • The run, undo, show, replace, etc commands are part of interactive-editing. See below. +
  • You can pass any gcc compiler options. By default, -Wall -Wextra -std=c11 -pedantic are passed unless an option is specified. +
+
Supported Languages
+

The -lang option accepts the following languages: C, C99 and C11. You may also use the -std=<c89|gnu89|c99|gnu99|etc> compiler option to specify which standard to follow. +

Support for additional languages coming soon. +

+
Default Language
+

The default language (e.g., without an explicit -lang or -std option) is C11 pedantic; which is gcc -Wall -Wextra -std=c11 -pedantic. +

+
C and C++ Functionality
+
Using the preprocessor
+
Default #includes
+

These are the default includes for C11. To get the most up-to-date list of #includes, use the `cc paste` command. +

+
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <math.h>
+#include <limits.h>
+#include <sys/types.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <stdnoreturn.h>
+#include <stdalign.h>
+#include <ctype.h>
+#include <inttypes.h>
+#include <float.h>
+#include <errno.h>
+#include <time.h>
+#include <assert.h> 
+
+
Using #include
+

In C and C++, you may #include <file.h> one after another on the same line. The bot will automatically put them on separate lines. If you do use #include, the files you specify will replace the default includes. +

+
<pragma_> cc #include <sys/utsname.h> struct utsname u; uname(&u);
+<PBot> pragma_:  <no output: u = {sysname = "Linux", nodename = "compiler", release = "3.2.0-8-generic", version = "#15-Ubuntu SMP Wed Jan 11 13:57:44 UTC 2012", machine = "x86_64",  __domainname = "(none)"}>
+
+
<pragma_> cc #include <stdio.h> #include <stdlib.h> void func(void) { puts("Hello, world"); } func();
+<PBot> pragma_: Hello, World
+
+

In the previous examples, only the specified includes (e.g., <sys/utsname.h> in the first example, <stdio.h> and <stdlib.h> in the second, will be included instead of the default includes. +

+
Using #define
+

You can also #define macros; however, #defines require an explicit "\n" sequence to terminate, otherwise the remainder of the line will be part of the macro. +

+
<pragma_> cc #define GREETING "Hello, World"\n puts(GREETING);
+<PBot> pragma_: Hello, World
+
+
main() Function Unnecessary
+

In C and C++, if there is no main function, then a main function will created and wrapped around the appropriate bits of your code; anything outside of any functions, excluding preprocessor stuff, will be put into this new main function. Here's an example: +

+
 <pragma_> !cc int add(int a, int b) { return a + b; } printf("4 + 6 = %d -- ", add(4, 6)); int add3(int a, int b, int c) 
+           { return add(a, b) + c; } printf("7 + 8 + 9 = %d", add3(7, 8, 9));
+ <PBot> 4 + 6 = 10 -- 7 + 8 + 9 = 24
+
+

The previous code gets compiled as: +

+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <... etc ...>
+
+int add(int a, int b) {
+    return a + b;
+}
+ 
+int add3(int a, int b, int c) {
+    return add(a, b) + c;
+}
+ 
+int main(int argc, char **argv) {
+    printf("4 + 6 = %d -- ", add(4, 6));
+    printf("7 + 8 + 9 = %d", add3(7, 8, 9));
+    return 0;
+}
+
+
Embedding Newlines
+

In Assembler, you may start a newline in the code via a \n sequence or a semi-colon. +

In C and C++, #defines must be terminated by a \n sequence. +

In all other languages, you may embed a newline in the code by using |n. Yes, that's the pipe character followed by 'n'. +

+
Printing in binary/base2
+

A freenode ##c regular, Wulf, has provided a printf format specifier 'b' which can be used to print values in base2. +

+
    <Wulf> cc printf("%b", 1234567);
+ <PBot> 000100101101011010000111
+
+
    <Wulf> cc printf("%#'b", 1234567);
+ <PBot> 0001.0010.1101.0110.1000.0111
+
+
Disallowed system calls
+

None. The network cable has been unplugged. Other than that, anything goes. Have fun. +

+
Using the GDB debugger
+

The program is executed within a gdb debugger instance, which may be interacted with via the following gdb macros. +

+
print
+

The print() macro prints the values of expressions. Useful for printing out structures and arrays. +

+
<pragma_> cc int a[] = { 1, 2, 3 }; print(a);
+<PBot> pragma_: <a = {1, 2, 3}>
+
+
<pragma_> cc #include <sys/utsname.h> struct utsname u; uname(&u); print(u);
+<PBot> pragma_: <u = {sysname = "Linux", nodename = "compiler", release = "3.2.0-8-generic", version = "#15-Ubuntu SMP Wed Jan 11 13:57:44 UTC 2012", machine = "x86_64",  __domainname = "(none)"}>
+
+
<pragma_> cc print(sizeof(int));
+<PBot> pragma_: <sizeof(int) = 4>
+
+
<pragma_> cc print(2+2);
+<PBot> pragma_: 2 + 2 = 4
+
+
ptype
+

The ptype() macro prints the types of expressions. +

+
 <pragma_> cc int *a[] = {0}; ptype(a); ptype(a[0]); ptype(*a[0]);
+ <PBot> pragma_: <a = int *[1]> <a[0] = int *> <*a[0] = int>
+
+
watch
+

The watch() macro watches a variable and displays its value when it changes. +

+
<pragma_> cc int n = 0, last = 1; watch(n); while(n <= 7000) { n += last; last = n - last; } /* fibonacci */
+<PBot> pragma_: <n = 1> <n = 2> <n = 3> <n = 5> <n = 8> <n = 13> <n = 21> <n = 34> <n = 55> <n = 89> <n = 144> <n = 233> <n = 377> <n = 610> <n = 987> <n = 1597> <n = 2584> <n = 4181> <n = 6765> <n = 10946>
+
+
trace
+

The trace() macro traces a function's calls, displaying passed and returned values. +

+
 <pragma_> ,cc trace(foo); char *foo(int n) { puts("Hello, world"); return "Good-bye, world"; } foo(42);
+ <PBot> pragma_: <entered [1] foo (n=42)> Hello, world <leaving [1] foo (n=42), returned 0x400f56 "Good-bye, world">
+
+
 <pragma_> ,cc int fib2(int n, int p0, int p1) { return n == 1 ? p1 : fib2(n  - 1, p1, p0 + p1); } int fib(int n) { return n == 0 ? 0 : fib2(n, 0, 1); } trace(fib); trace(fib2); for(int i = 0; i < 20; i++) printf("%d ", fib(i));
+ <PBot> pragma_: <entered [1] fib (n=0)>
+                    <leaving [1] fib (n=0), returned 0>
+                    1
+                    <entered [1] fib (n=2)>
+                    <entered [2]  fib2 (n=2, p0=0, p1=1)>
+                    <entered [3]   fib2 (n=1, p0=1, p1=1)>
+                    <leaving [3]   fib2 (n=1, p0=1, p1=1), returned 1>
+                    <leaving [2]  fib2 (n=2, p0=0, p1=1), returned 1>
+                    <leaving [1] fib (n=2), returned 1>
+                    1
+                    <entered [1] fib (n=3)>
+                    <entered [2]  fib2 (n=3, p0=0, p1=1)>
+                    <entered [3]   fib2 (n=2, p0=1, p1=1)>
+                    <entered [4]    fib2 (n=1, p0=1, p1=2)>
+                    <leaving [4]    fib2 (n=1, p0=1, p1=2), returned 2>
+                    <leaving [3]   fib2 (n=2, p0=1, p1=1), returned 2>
+                    <leaving [2]  fib2 (n=3, p0=0, p1=1), returned 2>
+                    <leaving [1] fib (n=3), returned 2>
+                    2
+                    <entered [1] fib (n=4)>
+                    <entered [2]  fib2 (n=4, p0=0, p1=1)>
+                    <entered [3]   fib2 (n=3, p0=1, p1=1)>
+                    <entered [4]    fib2 (n=2, p0=1, p1=2)>
+                    <entered [5]     fib2 (n=1, p0=2, p1=3)>
+                    <leaving [5]     fib2 (n=1, p0=2, p1=3), returned 3>
+                    <leaving [4]    fib2 (n=2, p0=1, p1=2), returned 3>
+                    <leaving [3]   fib2 (n=3, p0=1, p1=1), returned 3>
+                    <leaving [2]  fib2 (n=4, p0=0, p1=1), returned 3>
+                    <leaving [1] fib (n=4), returned 3>
+                    3
+                    <entered [1] fib (n=5)>
+                    <entered [2]  fib2 (n=5, p0=0, p1=1)>
+                    <entered [3]   fib2 (n=4, p0=1, p1=1)>
+                    <entered [4]    fib2 (n=3, p0=1, p1=2)>
+                    <entered [5]     fib2 (n=2, p0=2, p1=3)>
+                    <entered [6]      fib2 (n=1, p0=3, p1=5)>
+                    <leaving [6]      fib2 (n=1, p0=3, p1=5), returned 5>
+                    <leaving [5]     fib2 (n=2, p0=2, p1=3), returned 5>
+                    <leaving [4]    fib2 (n=3, p0=1, p1=2), returned 5>
+                    <leaving [3]   fib2 (n=4, p0=1, p1=1), returned 5>
+                    <leaving [2]  fib2 (n=5, p0=0, p1=1), returned 5>
+                    <leaving [1] fib (n=5), returned 5>
+                    5
+                    <entered [1] fib (n=6)>
+                    <entered [2]  fib2 (n=6, p0=0, p1=1)>
+                    <entered [3]   fib2 (n=5, p0=1, p1=1)>
+                    <entered [4]    fib2 (n=4, p0=1, p1=2)>
+                    <entered [5]     fib2 (n=3, p0=2, p1=3)>
+                    <entered [6]      fib2 (n=2, p0=3, p1=5)>
+                    <entered [7]       fib2 (n=1, p0=5, p1=8)>
+                    <leaving [7]       fib2 (n=1, p0=5, p1=8), returned 8>
+                    <leaving [6]      fib2 (n=2, p0=3, p1=5), returned 8>
+                    <leaving [5]     fib2 (n=3, p0=2, p1=3), returned 8>
+                    <leaving [4]    fib2 (n=4, p0=1, p1=2), returned 8>
+                    <leaving [3]   fib2 (n=5, p0=1, p1=1), returned 8>
+                    <leaving [2]  fib2 (n=6, p0=0, p1=1), returned 8>
+                    <leaving [1] fib (n=6), returned 8>
+                    8
+                    ... etc ...
+
+

You can trace part of a program as follows: +

+
 <pragma_> ,cc int fib2(int n, int p0, int p1) { return n == 1 ? p1 : fib2(n  - 1, p1, p0 + p1); } int fib(int n) { return n == 0 ? 0 : fib2(n, 0, 1); } for(int i = 0; i < 20; i++) { if(i == 19) trace(fib2); printf("%d ", fib(i)); }
+ <PBot> pragma_: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 
+                    <entered [2]  fib2 (n=19, p0=0, p1=1)>
+                    <entered [3]   fib2 (n=18, p0=1, p1=1)>
+                    <entered [4]    fib2 (n=17, p0=1, p1=2)>
+                    <entered [5]     fib2 (n=16, p0=2, p1=3)>
+                    <entered [6]      fib2 (n=15, p0=3, p1=5)>
+                    <entered [7]       fib2 (n=14, p0=5, p1=8)>
+                    <entered [8]        fib2 (n=13, p0=8, p1=13)>
+                    <entered [9]         fib2 (n=12, p0=13, p1=21)>
+                    <entered [10]          fib2 (n=11, p0=21, p1=34)>
+                    <entered [11]           fib2 (n=10, p0=34, p1=55)>
+                    <entered [12]            fib2 (n=9, p0=55, p1=89)>
+                    <entered [13]             fib2 (n=8, p0=89, p1=144)>
+                    <entered [14]              fib2 (n=7, p0=144, p1=233)>
+                    <entered [15]               fib2 (n=6, p0=233, p1=377)>
+                    <entered [16]                fib2 (n=5, p0=377, p1=610)>
+                    <entered [17]                 fib2 (n=4, p0=610, p1=987)>
+                    <entered [18]                  fib2 (n=3, p0=987, p1=1597)>
+                    <entered [19]                   fib2 (n=2, p0=1597, p1=2584)>
+                    <entered [20]                    fib2 (n=1, p0=2584, p1=4181)>
+                    <leaving [20]                    fib2 (n=1, p0=2584, p1=4181), returned 4181>
+                    <leaving [19]                   fib2 (n=2, p0=1597, p1=2584), returned 4181>
+                    <leaving [18]                  fib2 (n=3, p0=987, p1=1597), returned 4181>
+                    <leaving [17]                 fib2 (n=4, p0=610, p1=987), returned 4181>
+                    <leaving [16]                fib2 (n=5, p0=377, p1=610), returned 4181>
+                    <leaving [15]               fib2 (n=6, p0=233, p1=377), returned 4181>
+                    <leaving [14]              fib2 (n=7, p0=144, p1=233), returned 4181>
+                    <leaving [13]             fib2 (n=8, p0=89, p1=144), returned 4181>
+                    <leaving [12]            fib2 (n=9, p0=55, p1=89), returned 4181>
+                    <leaving [11]           fib2 (n=10, p0=34, p1=55), returned 4181>
+                    <leaving [10]          fib2 (n=11, p0=21, p1=34), returned 4181>
+                    <leaving [9]         fib2 (n=12, p0=13, p1=21), returned 4181>
+                    <leaving [8]        fib2 (n=13, p0=8, p1=13), returned 4181>
+                    <leaving [7]       fib2 (n=14, p0=5, p1=8), returned 4181>
+                    <leaving [6]      fib2 (n=15, p0=3, p1=5), returned 4181>
+                    <leaving [5]     fib2 (n=16, p0=2, p1=3), returned 4181>
+                    <leaving [4]    fib2 (n=17, p0=1, p1=2), returned 4181>
+                    <leaving [3]   fib2 (n=18, p0=1, p1=1), returned 4181>
+                    <leaving [2]  fib2 (n=19, p0=0, p1=1), returned 4181>
+                    4181
+
+
gdb
+

The gdb() function takes a string argument which it passes to the gdb debugger and then displays the output if any. +

+
 <pragma_> ,cc void foo() { gdb("info frame"); } foo();
+ <PBot> pragma_: <Stack level 1, frame at 0x7fffffffe660:> rip = 0x400e28 in foo (); saved rip 0x400e43 called by frame at 0x7fffffffe680, caller of frame at 0x7fffffffe650 source language
+                    c. Arglist at 0x7fffffffe650, args: Locals at 0x7fffffffe650, Previous frame's sp is 0x7fffffffe660 Saved registers: rbp at 0x7fffffffe650, rip at 0x7fffffffe658
+
+
Program termination with no output
+

If there is no output, information about the local variables will be displayed. +

+
 <pragma_> cc int x = 5, y = 16; x ^= y, y ^= x, x ^= y;
+ <PBot> pragma_: <no output: x = 16; y = 5>
+
+
 <pragma_> cc #include <sys/utsname.h> struct utsname u; uname(&u);
+ <PBot> pragma_:  <no output: u = {sysname = "Linux", nodename = "compiler", release = "3.2.0-8-generic", version = "#15-Ubuntu SMP Wed Jan 11 13:57:44 UTC 2012", machine = "x86_64",  __domainname = "(none)"}>
+
+
Abnormal program termination
+

If a signal is detected, the bot will display useful information. +

Example session: +

+
< pragma_> ,cc char *p = 0; *p = 1;
+< PBot> pragma_: Program received signal 11 (SIGSEGV) at statement: *p = 1; <local variables: p = 0x0>
+
+
< pragma_> ,cc void bang() { char *p = 0, s[] = "lol"; strcpy(p, s); }  bang();
+< PBot> pragma_: Program received signal 11 (SIGSEGV) in bang () at statement: strcpy(p, s); <local variables: p = 0x0, s = "lol">
+
+
< pragma_> ,cc int a = 2 / 0;
+< PBot> pragma_: [In function 'main': warning: division by zero] Program received signal 8 (SIGFPE) at statement: int a = 2 / 0;
+
+
Interactive Editing
+

The !cc command supports interactive-editing. The general syntax is:  !cc [command]. +

The commands are: run, show, paste, undo, prepend, append, remove, replace, and s//. With the exception of undo, which must be the first command, the rest of the commands may be chained together by separating them with whitespace or "and". +

The commands are described in more detail below: +

+
show
+

To show the latest code in the buffer, use the show command: +

+
 <pragma_> !cc show
+ <PBot> pragma_: printf("Hello, world!");
+
+

This command is stand-alone and cannot be chained with other interactive-editing commands. +

+
paste
+

To paste the full source of the latest code in the buffer as the compiler sees it, use the paste command: +

+
 <pragma_> !cc paste
+ <PBot> pragma_: http://some.random.paste-site.com/paste/results
+
+

This command is stand-alone and cannot be chained with other interactive-editing commands. +

+
run
+

To attempt to compile and execute the latest code in the buffer, use the run command: +

+
 <pragma_> !cc run
+ <PBot> pragma_: Hello, world!
+
+

This command is stand-alone and cannot be chained with other interactive-editing commands. +

+
undo
+

To undo any changes, use undo. The undo command must be the first command before any subsequent commands. +

+
s//
+

To change the latest code in the buffer, use the s/regex/substitution/[gi] pattern. +

+
 <pragma_> !cc s/Hello/Good-bye/ and s/world/void/
+ <PBot> pragma_: Good-bye, void!
+ <pragma_> !cc show
+ <PBot> pragma_: printf("Good-bye, void!");
+
+
replace
+

Alternatively, you may use the replace command. The usage is: +

+
 !cc replace [all, first, second, ..., tenth, last] 'from' with 'to'
+
+
append
+

Text may be appended with the append command: +

+
 !cc append 'text'
+
+
prepend
+

Text may be prepended with the prepend command: +

+
 !cc prepend 'text'
+
+
remove
+

Text may be deleted with the remove command: +

+
 !cc remove [all, first, second, ..., tenth, last] 'text'
+
+
Some Examples
+
 Examples:
+
+
   < pragma_> !cc int fib2(int n, int p0, int p1) { return n == 1 ? p1 : fib2(n  - 1, p1, p0 + p1); } 
+               int fib(int n) { return n == 0 ? 0 : fib2(n, 0, 1); } for(int i = 0; i < 21; i++) printf("%d ", fib(i));
+   < PBot> pragma_: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
+
+
   < pragma_> !cc int i = 0, last = 1; while(i <= 7000) { printf("%d ", i); i += last; last = i - last; }
+    <PBot> pragma_: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
+
+
   <Icewing> !cc int n=0, f[2]={0,1}; while(n<20) printf("%d ",f[++n&1]=f[0]+f[1]); // based on cehteh
+   <PBot> Icewing: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
+
+
  <3monkeys> !cc @p=(0,1); until($#p>20) { print"$p[-2]\n"; push @p, $p[-2] + $p[-1] } -lang=Perl
+   <PBot> 3monkeys: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
+
+
   <spiewak> !cc -lang=Ruby p,c=0,1; 20.times{p p; c=p+p=c}
+   <PBot> spiewak: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
+
+
     <Jafet> !cc main = print $ take 20 $ let fibs = 0 : scanl (+) 1 fibs in fibs; -lang=Haskell
+   <PBot> Jafet: [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181]
+
+

cc2

+

This command is identical to the cc command, with the following exceptions: does not accept compiler options and may be using an older version of "interactive-editing". +

Uses http://ideone.com. +

+
Usage
+
 Usage: !cc [-nowarn] [-showurl] [-lang=<language>] <code> [-input=<stdin input>]
+        !cc <run|undo|show|replace|add|remove [and ...]>
+
+
  • The -nowarn option is specific to the C programming language; it removes the -Werror and -strict options, and changes -std to gnu89. +
  • The -showurl option reformats the final code with includes and indentation, and displays the Ideone pasted URL. (Useful for viewing the complete and compilable code.) +
  • The -input=<stdin input> option provides STDIN input (i.e., scanf(), getc(stdin), etc.); MUST be the last option. +
  • The run, undo, show, replace, add, etc commands are part of interactive-editing. See below. +
+
Supported Languages
+

The -lang option accepts the following languages: +

+
     Ada                            => Ada (gnat-4.3.2),
+     asm                            => Assembler (nasm-2.07),
+     Assembler                      => Assembler (nasm-2.07),
+     Bash                           => Bash (bash 4.0.35),
+     bc                             => bc (bc-1.06.95),
+     bf                             => Brainf**k (bff-1.0.3.1),
+     Brainfuck                      => Brainf**k (bff-1.0.3.1),
+     C                              => C (gcc-4.3.4),
+     C#                             => C# (gmcs 2.0.1),
+     C++                            => C++ (gcc-4.3.4),
+     C99                            => C99 strict (gcc-4.3.4),
+     CLIPS                          => CLIPS (clips 6.24),
+     clisp                          => Common Lisp (clisp) (clisp 2.47),
+     Clojure                        => Clojure (clojure 1.1.0),
+     COBOL                          => COBOL (open-cobol-1.0),
+     COBOL85                        => COBOL 85 (tinycobol-0.65.9),
+     D                              => D (dmd) (dmd-2.042),
+     Erlang                         => Erlang (erl-5.7.3),
+     Forth                          => Forth (gforth-0.7.0),
+     Fortran                        => Fortran (gfortran-4.3.4),
+     gawk                           => AWK (gawk) (gawk-3.1.6),
+     gnu89                          => C (gcc-4.3.4),
+     Go                             => Go (gc 2010-01-13),
+     Haskell                        => Haskell (ghc-6.8.2),
+     Icon                           => Icon (iconc 9.4.3),
+     Intercal                       => Intercal (c-intercal 28.0-r1),
+     Java                           => Java (sun-jdk-1.6.0.17),
+     JavaScript                     => JavaScript (rhino) (rhino-1.6.5),
+     JavaScript-rhino               => JavaScript (rhino) (rhino-1.6.5),
+     JavaScript-spidermonkey        => JavaScript (spidermonkey) (spidermonkey-1.7),
+     JS                             => JavaScript (rhino) (rhino-1.6.5),
+     JScript                        => JavaScript (rhino) (rhino-1.6.5),
+     Lua                            => Lua (luac 5.1.4),
+     mawk                           => AWK (mawk) (mawk-1.3.3),
+     nasm                           => Assembler (nasm-2.07),
+     Nemerle                        => Nemerle (ncc 0.9.3),
+     Nice                           => Nice (nicec 0.9.6),
+     Ocaml                          => Ocaml (ocamlopt 3.10.2),
+     Pascal                         => Pascal (fpc) (fpc 2.2.0),
+     Pascal-fpc                     => Pascal (fpc) (fpc 2.2.0),
+     Pascal-gpc                     => Pascal (gpc) (gpc 20070904),
+     Perl                           => Perl (perl 5.8.8),
+     PHP                            => PHP (php 5.2.11),
+     Pike                           => Pike (pike 7.6.86),
+     Prolog                         => Prolog (gnu) (gprolog-1.3.1),
+     Prolog-gnu                     => Prolog (gnu) (gprolog-1.3.1),
+     Prolog-swi                     => Prolog (swi) (swipl 5.6.64),
+     Python                         => Python (python 2.6.4),
+     Python3                        => Python3 (python-3.1.1),
+     R                              => R (R-2.9.2),
+     Ruby                           => Ruby (ruby 1.8.7),
+     Scala                          => Scala (Scalac 2.7.7),
+     Scheme                         => Scheme (guile) (guile 1.8.5),
+     Smalltalk                      => Smalltalk (gst 3.1),
+     Tcl                            => Tcl (tclsh 8.5.7),
+     Unlambda                       => Unlambda (unlambda-2.0.0),
+     VB                             => Visual Basic .NET (mono-2.4.2.3)
+
+
Default Language
+

The default language (e.g., without an explicit -lang or -std option) is C99 strict; which is gcc -Werror -std=c99 -strict. +

+

cc3

+

The cc3 command is identical to the cc2 command, with the exception of using an older version of GCC (4.1.2) through http://codepad.org. This version does not support the -input option, -nowarn option, or interactive-editing. +

It can compile and display the output for code from the following languages: C (GNU89), C++, D, Haskell, Lua, OCaml, PHP, Perl, Python, Ruby, Scheme and Tcl. Defaults to C (GNU89). +

+

faq

+

Displays questions from the comp.lang.c faq. Some queries may return more than one result; if this happens, you may use the 'match #' optional argument to specify the match you'd like to view. +

+
 Usage: !faq [match #] <search regex>
+ Samples:
+   <pragma_> !faq cast malloc
+   <PBot> 2 results, displaying #1: 7. Memory Allocation, 7.6 Why am  
+             I getting ``warning: assignment of pointer from integer 
+             lacks a cast for calls to malloc? : 
+             http://www.eskimo.com/~scs/C-faq/q7.6.html
+   <pragma_> !faq 2 cast malloc
+   <PBot> 2 results, displaying #2: 7. Memory Allocation, 7.7 Why 
+             does some code carefully cast the values returned by 
+             malloc to the pointer type being allocated? :    
+             http://www.eskimo.com/~scs/C-faq/q7.7.html
+   <pragma_> !faq ^6.4
+   <PBot> 6. Arrays and Pointers, 6.4 Why are array and pointer 
+             declarations interchangeable as function formal 
+             parameters? : http://www.eskimo.com/~scs/C-faq/q6.4.html
+
+

c99std

+

Searches ISO/IEC 9899:TC3 (WG14/N1256), also known as the C99 draft standard. http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf +

+
 Usage: c99std [-list] [-n#] [section] [search regex]
+          If specified, 'section' must be in the form of X.YpZ where X and Y are section/chapter and, optionally, pZ is paragraph. 
+          To display a specific section and all its paragraphs, specify just the 'section' without pZ.
+          To display just a specific paragraph, specify the full 'section' identifier (X.YpZ).
+          You may use -n # to skip to the #th match. 
+          To list only the section numbers containing 'search text', add -list.
+          If both 'section' and 'search regex' are specified, then the search space will be within the specified section identifier.
+
+
 Examples:
+
+
   < pragma_> !c99std pointer value
+   < PBot> Displaying #1 of 64 matches: 5.1.2.2.1p1: [Program startup] If they are declared, the parameters to the 
+              main function shall obey the following constraints: -- The value of argc shall be nonnegative. -- argv[argc] 
+              shall be a null pointer. -- If the value of argc is greater than zero, the array members argv[0] through
+              argv[argc-1] inclusive shall contain pointers to st... truncated; see http://codepad.org/f2DULaGQ for full text.
+
+
   < pragma_> !c99std pointer value -list
+   < PBot> Sections containing 'pointer value': 5.1.2.2.1p2, 5.1.2.3p9, 6.2.5p20, 6.2.5p27, 6.3.2.1p3, 6.3.2.1p4, 
+              6.3.2.3p2, 6.3.2.3p6, 6.5.2.1p3, 6.5.2.2p5, 6.5.2.2p6, 6.5.2.4p1, 6.5.2.4p2, 6.5.3.1p1, 6.5.3.2p3, 6.5.3.2p4,
+              6.5.3.3p5, 6.5.3.4p5, 6.5.6p8, 6.5.6p9, 6.5.8p5, 6.5.15p6, 6.6p7, 6.6p9, 6.7.2.2p5, 6.7.2.3p7, 6.7.2.3p3, 
+              6.7.5.1p3, 6.7.5.2p7, 7.1.1p1, 7.1.1p4, 7.1.4p1, 7... truncated; see http://codepad.org/qQlnJYJk for full text.
+
+
   < pragma_> Hmm, how about just section 6.3?
+
+
  < pragma_> !cstd pointer value 6.3
+  < PBot> Displaying #1 of 4 matches: 6.3.2.1p1: [Lvalues, arrays, and function designators] Except when it is the operand
+             of the sizeof operator or the unary & operator, or is a string literal used to initialize an array, an expression
+             that has type ``array of type is converted to an expression with type ``pointer to type that points to the
+             initial element of the array ob... truncated; see http://codepad.org/mf1RNnr2 for full text.
+
+
  < pragma_> !cstd pointer value 6.3 -list
+  < PBot> Sections containing 'pointer value': 6.3.2.1p3, 6.3.2.1p4, 6.3.2.3p2, 6.3.2.3p6
+
+
  < pragma_> !cstd pointer value 6.3 -n3
+  < PBot> Displaying #3 of 4 matches: 6.3.2.3p1: [Pointers] For any qualifier q, a pointer to a non-q-qualified type may be
+             converted to a pointer to the q-qualified version of the type; the values stored in the original and converted 
+             pointers shall compare equal.
+
+

c11std

+

Searches ISO/IEC 9811:201X (WG14/N1256), also known as the C11 draft standard. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf +

Usage is identical to c99std. +

+

man

+

Displays manpage summaries and/or C related tidbits (headers, prototypes, specifications), as well as a link to the FreeBSD manpage. +

+
Usage:  !man [section] query
+Samples:
+ <pragma_> !man fork
+ <PBot> Includes: sys/types.h, unistd.h - pid_t fork(void); - SVr4,  
+           SVID, POSIX, X/OPEN, BSD - fork creates a child process that 
+           differs from the parent process only in its PID and PPID, and 
+           in the fact that resource utilizations are set to 0 - 
+           http://www.iso-9899.info/man?fork
+ <pragma_> !man atexit
+ <PBot> Includes: stdlib.h - int atexit(void (*function)(void)); - 
+           SVID 3, BSD 4.3, ISO 9899 - atexit () function registers the 
+           given function to be called at normal program termination, 
+           whether via exit(3) or via return from the program's main - 
+           http://www.iso-9899.info/man?atexit
+ <pragma_> !man getcwd
+ <PBot> Includes: unistd.h - char *getcwd(char *buf, size_t size); - 
+           POSIX.1 - getcwd () function copies an absolute pathname of 
+           the current working directory to the array pointed to by buf, 
+           which is of length size - http://www.iso-9899.info/man?getcwd
+
+

google

+

Displays google results for a query. +

+
Usage:  !google [number of results] query
+Samples:
+  <pragma_> !google brian kernighan
+  <PBot> brian kernighan (115,000): Brian Kernighan's Home Page:                  
+            (http://www.cs.princeton.edu/~bwk/)
+  <pragma_> !google 3 brian kernighan
+  <PBot> brian kernighan (115,000): Brian Kernighan's Home Page:                  
+            (http://www.cs.princeton.edu/~bwk/), An Interview with Brian      
+            Kernighan: (http://www-2.cs.cmu.edu/~mihaib/kernighan-interview/),
+            Interview with Brian Kernighan | Linux Journal: 
+            (http://www.linuxjournal.com/article.php?sid=7035), Brian W. 
+            Kernighan: (http://www.lysator.liu.se/c/bwk/) ,Brian W. 
+            Kernighan: Programming in C: A Tutorial:       
+            (http://www.lysator.liu.se/c/bwk-tutor.html)
+
+

define/dict

+

Displays dictionary defintions from http://dict.org using DICT protocol. +

Databases for the -d option are listed here: http://blackshell.com/~msmud/candide/dict_databases.txt +

+
 Usage: dict [-d database] [-n start from definition number] [-t first letter of word class type (n]oun, v]erb, etc)] 
+        [-search <regex> for definitions matching <regex>] <word>
+
+
 Examples:
+
+
   <pragma_> dict hit
+   <PBot> hit: n: 1) (baseball) a successful stroke in an athletic contest (especially in baseball); 
+            "he came all the way around on Williams' hit", 2) the act of contacting one thing with another; 
+            "repeated hitting raised a large bruise"; "after three misses she finally got a hit" [syn: hitting,
+            striking], 3) a conspicuous success; "that song was his first hit and marked the beginning of his 
+            career"; "that new Broadway show is a real smasher"
+
+
   <pragma_> dict -n 4 hit
+   <PBot> hit: n: 4) (physics) an brief event in which two or more bodies come together; "the collision of the 
+             particles resulted in an exchange of energy and a change of direction" [syn: collision], 5) a dose 
+             of a narcotic drug, 6) a murder carried out by an underworld syndicate; "it has all the earmarks of 
+             a Mafia hit", 7) a connection made via the internet to another website; "WordNet gets many hits from 
+             users worldwide"
+
+
   <pragma_> dict -t v hit
+   <PBot> hit: v: 1) cause to move by striking; "hit a ball", 2) hit against; come into sudden contact with; 
+             "The car hit a tree"; "He struck the table with his elbow" [syn: strike, impinge on, run into, 
+             collide with] [ant: miss], 3) affect or afflict suddenly, usually adversely; "We were hit by really 
+             bad weather"; "He was stricken with cancer when he was still a teenager"; "The earthquake struck at 
+             midnight" [syn: strike], 4) deal a blow to
+
+
   <pragma_> dict -search ball hit
+   <PBot> hit: n: 1) (baseball) a successful stroke in an athletic contest (especially in baseball); "he came all 
+             the way around on Williams' hit", v: 1) cause to move by striking; "hit a ball"
+
+
   <pragma_> dict -d eng-fra hit
+   <PBot> hit: 1) [hit] battre, frapper, heurter frapper, heurter atteindre, frapper, parvenir, saisir
+
+

gdict

+

Displays dictionary definitions from http://google.com's define:<entry> search. +

+
Usage: !gdict query
+
+

udict

+

Displays dictionary definitions from http://urbandictionary.com. +

+
Usage: !udict query
+
+

wdict

+

Displays Wikipedia article abstracts (first paragraph). Note: case-sensitive and very picky. +

+
Usage: !wdict query
+
+

acronym

+

Displays expanded acronyms. +

+
Usage:  !acronym query
+Samples:
+  <pragma_> !acronym posix
+  <PBot> posix (3 entries): Portable Operating System for   
+            Information Exchange, Portable Operating System Interface 
+            Extensions (IBM), Portable Operating System Interface for        
+            Unix
+  <pragma_> !acronym linux
+  <PBot> linux (1 entries): Linux Is Not UniX
+
+

weather

+

Displays current conditions and forecasts. (Note: currently half-broken.) +

+
Usage:  !weather zipcode  or  !weather city, state, country
+Samples:
+  <pragma_> !weather chicago, il
+  <PBot> United States, Illinois, Chicago (Updated 9:53 pm CST): 
+            Temp: 9F/-12C (Feels like: -2F/-18C), High: 9F/-12C, Low: 
+            9F/-12C, Sky: Mostly Cloudy, Humidity: 48%, Wind: W 8 mph, 
+            Sunrise: 7:16 am, Sunset: 4:44 pm,  Tonight: Partly cloudy 
+            skies. Cold. Low around 5F. Winds WNW at 5 to 10 mph.
+
+

map

+

Displays nearby locations to provided location (for use with .weather). +

+
Usage:  !map zipcode  or  .map city, state, country
+Samples:
+  <pragma_> !map chicago, il
+  <PBot> United States, Illinois, Chicago - Nearby Locations: Fox    
+            Valley, Chicago/Meigs Field, Cicero, Chicago/Midway Arpt, 
+            Berwyn, Oak Park,
+
+

gspy

+

Displays recent search queries for a popular search engine. +

+
Usage:  !gspy
+Samples:
+  <pragma_> !gspy
+  <PBot> Recent search queries: cranberry mall, westminster,      
+            architectural styles in glens falls, architectural styles                                   
+            in glens falls, cameras, dayh-f036n090a, virgin valley art 
+            association, spacemaker heat shield, calvinist, video 
+            capture software, subaru wrx performance modifications
+
+

math

+

Extremely basic calculations. +

+
Usage:  !math expression
+Samples:
+  <pragma_> !math 5 + 5
+  <PBot> 5 + 5 = 10
+
+

compliment

+

Displays a random Markov-chain compliment/insult. +

+
Usage: !compliment [nick]
+
+

insult

+

Displays a random insult. +

+
Usage: !insult [nick]
+
+

excuse

+

Displays a random excuse. +

+
Usage: !excuse [nick]
+
+

horoscope

+

Displays a horoscope for a Zodiac sign (google this if you don't know your sign). +

+
Usage: !horoscope <sign>
+
+

quote

+

Displays quotes from a popular quotation database. If you use !quote without arguments, it returns a random quote; if you use it +with an argument, it searches for quotes containing that text; if you add --author <name> at the end, it searches for a quote by +that author; if you specify text and --author, it searches for quotes by that author, containing that text. +

+
Usage: !quote [search text] [--author <author name>]
+Samples:
+  <pragma_> !quote
+  <PBot> "Each success only buys an admission ticket to a more difficult problem." -- Henry Kissinger (1923 -  ).  Discuss!
+  <pragma_> !quote --author lao tzu
+  <PBot> 41 matching quotes found. "A journey of a thousand miles begins with a single step." -- Lao-tzu (604 BC - 531 BC).    Discuss!
+  <pragma_> !quote butterfly
+  <PBot> 11 matching quotes found. "A chinese philosopher once had a dream that he was a butterfly. From that day on, he
+            was never quite certain that he was not a butterfly, dreaming that he was a man." -- Unknown.  Discuss!
+
+

Informative

+

list

+

Lists information about specified argument +

+
Usage:  .list <modules|factoids|commands|admins>
+
+

info

+

Shows detailed information about a module or a factoid +

+
 Usage:  .info <module|factoid>
+
+

version

+

Shows version information +

+

source

+

Shows PBot's source information. +

+

help

+

Shows link to this page. +

+

Administrative

+

login

+

You cannot use any of the admin commands unless you login first +

+
 Usage:  login <password>
+
+

Note that login requires that your nick and hostmask match PBot's records. +

+

logout

+

Logs out of PBot. +

+

ignore

+

Ignore a user +

+
Usage:  !ignore <hostmask> [channel] [timeout]
+
+

unignore

+

Unignores a user +

+
Usage:  !unignore <hostmask> [channel]
+
+

ban

+

Bans a user +

+
 Usage:  !ban <hostmask> [timeout seconds]
+
+

If timeout is omitted, PBot will ban the user for one hour. Timeout is in seconds. +

+

unban

+

Unbans a user +

+
 Usage:
+   !unban <hostmask>
+
+

Note that <hostmask> must EXACTLY match the hostmask in the ban list for the channel. +

+

kick

+

Removes a nick from the channel +

+
 Usage:  !kick <nick> <reason>
+
+

Must be used in the channel. +

+

export

+

exports specified list to web page +

+
Usage:  !export <commands|factoids|admins|channels>
+
+

Flood control

+

PBot can monitor the channel for excessive rapid traffic originating from an individual and automatically ban the offender for a certain length of time. +

+

Message flood

+

If four (4) or more messages are sent within ten (10) seconds, the flood control is triggered. The offender will be quieted for 30 seconds for the first offense. Each additional offense will result in the offender being quieted for much longer period. For example, the first offense will result in 30 seconds, the 2nd offense will be 5 minutes, the 3rd will be 1 hour, and so on. +

+

Join flood

+

If four (4) or more JOINs are observed within thirty (30) minutes without any messages in between joins, the offender will be forwarded to another channel for a limited time: 2^(number_of_offenses + 2) hours. +

In addition to private instructions from PBot, this channel will have a /topic and ChanServ on-join message with instructions explaining to the offender how to remove the forwarding. The instructions are to message PBot with: unbanme <channel>. +

(Any messages sent to the public channel by the user at any time will reset their JOIN counter back to zero.) +

+

Notification message

+

PBot will send the following message to the offender each offense. +

+

Chat flooding

+

"You have been quieted due to flooding. Please use a web paste service such as http://codepad.org for lengthy pastes. You will be allowed to speak again in ### seconds." +

+

Join flooding

+

"You have been banned from $channel for $timeout due to join flooding. If your connection issues have been resolved, or this was an accident, you may request an unban at any time by responding to this message with: unbanme $channel" +

+

Opping/Deopping

+

ChanServ will automagically op and deop PBot when necessary. PBot will wait until about 5 minutes have elapsed before requesting a deop from ChanServ. +

+
+