pbot/doc/PBot.html

1504 lines
95 KiB
HTML
Executable File

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="keywords" content="PBot,Category IRC" />
<title>PBot</title>
<!--[if lt IE 5.5000]><style type="text/css">@import "/wiki/skins/monobook/IE50Fixes.css?97";</style><![endif]-->
<!--[if IE 5.5000]><style type="text/css">@import "/wiki/skins/monobook/IE55Fixes.css?97";</style><![endif]-->
<!--[if IE 6]><style type="text/css">@import "/wiki/skins/monobook/IE60Fixes.css?97";</style><![endif]-->
<!--[if IE 7]><style type="text/css">@import "/wiki/skins/monobook/IE70Fixes.css?97";</style><![endif]-->
<!--[if lt IE 7]><script type="text/javascript" src="/wiki/skins/common/IEFixes.js?97"></script>
<meta http-equiv="imagetoolbar" content="no" /><![endif]-->
<script type= "text/javascript">/*<![CDATA[*/
var skin = "monobook";
var stylepath = "/wiki/skins";
var wgArticlePath = "/wiki/$1";
var wgScriptPath = "/wiki";
var wgScript = "/wiki";
var wgServer = "http://www.iso-9899.info";
var wgCanonicalNamespace = "";
var wgCanonicalSpecialPageName = false;
var wgNamespaceNumber = 0;
var wgPageName = "PBot";
var wgTitle = "PBot";
var wgAction = "view";
var wgRestrictionEdit = ["sysop"];
var wgRestrictionMove = ["sysop"];
var wgArticleId = "935";
var wgIsArticle = true;
var wgUserName = null;
var wgUserGroups = null;
var wgUserLanguage = "en";
var wgContentLanguage = "en";
var wgBreakFrames = false;
var wgCurRevisionId = "9009";
/*]]>*/</script>
</head>
<body class="mediawiki ns-0 ltr page-PBot">
<div id="globalWrapper">
<div id="column-content">
<div id="content">
<a name="top" id="top"></a>
<h1 class="firstHeading">PBot</h1>
<div id="bodyContent">
<div id="contentSub"></div>
<table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1"><a href="#PBot"><span class="tocnumber">1</span> <span class="toctext">PBot</span></a>
<ul>
<li class="toclevel-2"><a href="#About_PBot"><span class="tocnumber">1.1</span> <span class="toctext">About PBot</span></a></li>
<li class="toclevel-2"><a href="#Trigger"><span class="tocnumber">1.2</span> <span class="toctext">Trigger</span></a></li>
<li class="toclevel-2"><a href="#Source"><span class="tocnumber">1.3</span> <span class="toctext">Source</span></a></li>
<li class="toclevel-2"><a href="#Bot_Channel"><span class="tocnumber">1.4</span> <span class="toctext">Bot Channel</span></a></li>
<li class="toclevel-2"><a href="#Directing_output_to_a_user"><span class="tocnumber">1.5</span> <span class="toctext">Directing output to a user</span></a>
<ul>
<li class="toclevel-3"><a href="#tell"><span class="tocnumber">1.5.1</span> <span class="toctext">tell</span></a></li>
</ul>
</li>
</ul>
</li>
<li class="toclevel-1"><a href="#Factoids"><span class="tocnumber">2</span> <span class="toctext">Factoids</span></a>
<ul>
<li class="toclevel-2"><a href="#List_of_factoids"><span class="tocnumber">2.1</span> <span class="toctext">List of factoids</span></a>
<ul>
<li class="toclevel-3"><a href="#Channel_namespaces"><span class="tocnumber">2.1.1</span> <span class="toctext">Channel namespaces</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="#Adding_a_factoid"><span class="tocnumber">2.2</span> <span class="toctext">Adding a factoid</span></a>
<ul>
<li class="toclevel-3"><a href="#factadd"><span class="tocnumber">2.2.1</span> <span class="toctext">factadd</span></a></li>
<li class="toclevel-3"><a href="#Special_commands"><span class="tocnumber">2.2.2</span> <span class="toctext">Special commands</span></a>
<ul>
<li class="toclevel-4"><a href="#.2Fsay"><span class="tocnumber">2.2.2.1</span> <span class="toctext">/say</span></a></li>
<li class="toclevel-4"><a href="#.2Fme"><span class="tocnumber">2.2.2.2</span> <span class="toctext">/me</span></a></li>
<li class="toclevel-4"><a href="#.2Fcall"><span class="tocnumber">2.2.2.3</span> <span class="toctext">/call</span></a></li>
<li class="toclevel-4"><a href="#.2Fmsg"><span class="tocnumber">2.2.2.4</span> <span class="toctext">/msg</span></a></li>
</ul>
</li>
<li class="toclevel-3"><a href="#Special_variables"><span class="tocnumber">2.2.3</span> <span class="toctext">Special variables</span></a>
<ul>
<li class="toclevel-4"><a href="#.24nick"><span class="tocnumber">2.2.3.1</span> <span class="toctext">$nick</span></a></li>
<li class="toclevel-4"><a href="#.24args"><span class="tocnumber">2.2.3.2</span> <span class="toctext">$args</span></a></li>
<li class="toclevel-4"><a href="#.24channel"><span class="tocnumber">2.2.3.3</span> <span class="toctext">$channel</span></a></li>
</ul>
</li>
<li class="toclevel-3"><a href="#adlib_list_variables"><span class="tocnumber">2.2.4</span> <span class="toctext">adlib list variables</span></a></li>
<li class="toclevel-3"><a href="#action_with_args"><span class="tocnumber">2.2.5</span> <span class="toctext">action_with_args</span></a></li>
<li class="toclevel-3"><a href="#add_nick"><span class="tocnumber">2.2.6</span> <span class="toctext">add_nick</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="#Deleting_a_factoid"><span class="tocnumber">2.3</span> <span class="toctext">Deleting a factoid</span></a>
<ul>
<li class="toclevel-3"><a href="#factrem"><span class="tocnumber">2.3.1</span> <span class="toctext">factrem</span></a></li>
<li class="toclevel-3"><a href="#forget"><span class="tocnumber">2.3.2</span> <span class="toctext">forget</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="#Viewing.2Ftriggering_a_factoid"><span class="tocnumber">2.4</span> <span class="toctext">Viewing/triggering a factoid</span></a></li>
<li class="toclevel-2"><a href="#Viewing.2Ftriggering_another_channel.27s_factoid"><span class="tocnumber">2.5</span> <span class="toctext">Viewing/triggering another channel's factoid</span></a>
<ul>
<li class="toclevel-3"><a href="#fact"><span class="tocnumber">2.5.1</span> <span class="toctext">fact</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="#Aliasing_a_factoid"><span class="tocnumber">2.6</span> <span class="toctext">Aliasing a factoid</span></a>
<ul>
<li class="toclevel-3"><a href="#factalias"><span class="tocnumber">2.6.1</span> <span class="toctext">factalias</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="#Moving.2Frenaming_a_factoid"><span class="tocnumber">2.7</span> <span class="toctext">Moving/renaming a factoid</span></a>
<ul>
<li class="toclevel-3"><a href="#factmove"><span class="tocnumber">2.7.1</span> <span class="toctext">factmove</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="#Changing_a_factoid"><span class="tocnumber">2.8</span> <span class="toctext">Changing a factoid</span></a>
<ul>
<li class="toclevel-3"><a href="#factchange"><span class="tocnumber">2.8.1</span> <span class="toctext">factchange</span></a></li>
<li class="toclevel-3"><a href="#factset"><span class="tocnumber">2.8.2</span> <span class="toctext">factset</span></a></li>
<li class="toclevel-3"><a href="#factunset"><span class="tocnumber">2.8.3</span> <span class="toctext">factunset</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="#Finding_a_factoid"><span class="tocnumber">2.9</span> <span class="toctext">Finding a factoid</span></a>
<ul>
<li class="toclevel-3"><a href="#factfind"><span class="tocnumber">2.9.1</span> <span class="toctext">factfind</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="#Information_about_a_factoid"><span class="tocnumber">2.10</span> <span class="toctext">Information about a factoid</span></a>
<ul>
<li class="toclevel-3"><a href="#factinfo"><span class="tocnumber">2.10.1</span> <span class="toctext">factinfo</span></a></li>
<li class="toclevel-3"><a href="#factshow"><span class="tocnumber">2.10.2</span> <span class="toctext">factshow</span></a></li>
<li class="toclevel-3"><a href="#factset_2"><span class="tocnumber">2.10.3</span> <span class="toctext">factset</span></a></li>
<li class="toclevel-3"><a href="#count"><span class="tocnumber">2.10.4</span> <span class="toctext">count</span></a></li>
<li class="toclevel-3"><a href="#histogram"><span class="tocnumber">2.10.5</span> <span class="toctext">histogram</span></a></li>
<li class="toclevel-3"><a href="#top20"><span class="tocnumber">2.10.6</span> <span class="toctext">top20</span></a></li>
</ul>
</li>
</ul>
</li>
<li class="toclevel-1"><a href="#Commands"><span class="tocnumber">3</span> <span class="toctext">Commands</span></a>
<ul>
<li class="toclevel-2"><a href="#Quotegrabs"><span class="tocnumber">3.1</span> <span class="toctext">Quotegrabs</span></a>
<ul>
<li class="toclevel-3"><a href="#Table_of_quotegrabs"><span class="tocnumber">3.1.1</span> <span class="toctext">Table of quotegrabs</span></a></li>
<li class="toclevel-3"><a href="#grab"><span class="tocnumber">3.1.2</span> <span class="toctext">grab</span></a></li>
<li class="toclevel-3"><a href="#recall"><span class="tocnumber">3.1.3</span> <span class="toctext">recall</span></a></li>
<li class="toclevel-3"><a href="#getq"><span class="tocnumber">3.1.4</span> <span class="toctext">getq</span></a></li>
<li class="toclevel-3"><a href="#rq"><span class="tocnumber">3.1.5</span> <span class="toctext">rq</span></a></li>
<li class="toclevel-3"><a href="#delq"><span class="tocnumber">3.1.6</span> <span class="toctext">delq</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="#Modules"><span class="tocnumber">3.2</span> <span class="toctext">Modules</span></a>
<ul>
<li class="toclevel-3"><a href="#.7B.7D"><span class="tocnumber">3.2.1</span> <span class="toctext">{}</span></a></li>
<li class="toclevel-3"><a href="#cc"><span class="tocnumber">3.2.2</span> <span class="toctext">cc</span></a>
<ul>
<li class="toclevel-4"><a href="#Usage"><span class="tocnumber">3.2.2.1</span> <span class="toctext">Usage</span></a></li>
<li class="toclevel-4"><a href="#Supported_Languages"><span class="tocnumber">3.2.2.2</span> <span class="toctext">Supported Languages</span></a></li>
<li class="toclevel-4"><a href="#Default_Language"><span class="tocnumber">3.2.2.3</span> <span class="toctext">Default Language</span></a></li>
<li class="toclevel-4"><a href="#Disallowed_system_calls"><span class="tocnumber">3.2.2.4</span> <span class="toctext">Disallowed system calls</span></a></li>
<li class="toclevel-4"><a href="#Program_termination_with_no_output"><span class="tocnumber">3.2.2.5</span> <span class="toctext">Program termination with no output</span></a></li>
<li class="toclevel-4"><a href="#Abnormal_program_termination"><span class="tocnumber">3.2.2.6</span> <span class="toctext">Abnormal program termination</span></a></li>
<li class="toclevel-4"><a href="#C_and_C.2B.2B_Functionality"><span class="tocnumber">3.2.2.7</span> <span class="toctext">C and C++ Functionality</span></a></li>
<li class="toclevel-4"><a href="#Using_the_preprocessor"><span class="tocnumber">3.2.2.8</span> <span class="toctext">Using the preprocessor</span></a>
<ul>
<li class="toclevel-5"><a href="#Default_.23includes"><span class="tocnumber">3.2.2.8.1</span> <span class="toctext">Default #includes</span></a></li>
<li class="toclevel-5"><a href="#Using_.23include"><span class="tocnumber">3.2.2.8.2</span> <span class="toctext">Using #include</span></a></li>
<li class="toclevel-5"><a href="#Using_.23define"><span class="tocnumber">3.2.2.8.3</span> <span class="toctext">Using #define</span></a></li>
</ul>
</li>
<li class="toclevel-4"><a href="#main.28.29_Function_Unnecessary"><span class="tocnumber">3.2.2.9</span> <span class="toctext">main() Function Unnecessary</span></a></li>
<li class="toclevel-4"><a href="#Embedding_Newlines"><span class="tocnumber">3.2.2.10</span> <span class="toctext">Embedding Newlines</span></a></li>
<li class="toclevel-4"><a href="#Printing_in_binary.2Fbase2"><span class="tocnumber">3.2.2.11</span> <span class="toctext">Printing in binary/base2</span></a></li>
<li class="toclevel-4"><a href="#Using_the_GDB_debugger"><span class="tocnumber">3.2.2.12</span> <span class="toctext">Using the GDB debugger</span></a>
<ul>
<li class="toclevel-5"><a href="#print"><span class="tocnumber">3.2.2.12.1</span> <span class="toctext">print</span></a></li>
<li class="toclevel-5"><a href="#ptype"><span class="tocnumber">3.2.2.12.2</span> <span class="toctext">ptype</span></a></li>
<li class="toclevel-5"><a href="#watch"><span class="tocnumber">3.2.2.12.3</span> <span class="toctext">watch</span></a></li>
<li class="toclevel-5"><a href="#trace"><span class="tocnumber">3.2.2.12.4</span> <span class="toctext">trace</span></a></li>
<li class="toclevel-5"><a href="#gdb"><span class="tocnumber">3.2.2.12.5</span> <span class="toctext">gdb</span></a></li>
</ul>
</li>
<li class="toclevel-4"><a href="#Interactive_Editing"><span class="tocnumber">3.2.2.13</span> <span class="toctext">Interactive Editing</span></a>
<ul>
<li class="toclevel-5"><a href="#copy"><span class="tocnumber">3.2.2.13.1</span> <span class="toctext">copy</span></a></li>
<li class="toclevel-5"><a href="#show"><span class="tocnumber">3.2.2.13.2</span> <span class="toctext">show</span></a></li>
<li class="toclevel-5"><a href="#diff"><span class="tocnumber">3.2.2.13.3</span> <span class="toctext">diff</span></a></li>
<li class="toclevel-5"><a href="#paste"><span class="tocnumber">3.2.2.13.4</span> <span class="toctext">paste</span></a></li>
<li class="toclevel-5"><a href="#run"><span class="tocnumber">3.2.2.13.5</span> <span class="toctext">run</span></a></li>
<li class="toclevel-5"><a href="#undo"><span class="tocnumber">3.2.2.13.6</span> <span class="toctext">undo</span></a></li>
<li class="toclevel-5"><a href="#s.2F.2F"><span class="tocnumber">3.2.2.13.7</span> <span class="toctext">s//</span></a></li>
<li class="toclevel-5"><a href="#replace"><span class="tocnumber">3.2.2.13.8</span> <span class="toctext">replace</span></a></li>
<li class="toclevel-5"><a href="#prepend"><span class="tocnumber">3.2.2.13.9</span> <span class="toctext">prepend</span></a></li>
<li class="toclevel-5"><a href="#append"><span class="tocnumber">3.2.2.13.10</span> <span class="toctext">append</span></a></li>
<li class="toclevel-5"><a href="#remove"><span class="tocnumber">3.2.2.13.11</span> <span class="toctext">remove</span></a></li>
</ul>
</li>
<li class="toclevel-4"><a href="#Some_Examples"><span class="tocnumber">3.2.2.14</span> <span class="toctext">Some Examples</span></a></li>
</ul>
</li>
<li class="toclevel-3"><a href="#english"><span class="tocnumber">3.2.3</span> <span class="toctext">english</span></a></li>
<li class="toclevel-3"><a href="#expand"><span class="tocnumber">3.2.4</span> <span class="toctext">expand</span></a></li>
<li class="toclevel-3"><a href="#prec"><span class="tocnumber">3.2.5</span> <span class="toctext">prec</span></a></li>
<li class="toclevel-3"><a href="#paren"><span class="tocnumber">3.2.6</span> <span class="toctext">paren</span></a></li>
<li class="toclevel-3"><a href="#faq"><span class="tocnumber">3.2.7</span> <span class="toctext">faq</span></a></li>
<li class="toclevel-3"><a href="#cfact"><span class="tocnumber">3.2.8</span> <span class="toctext">cfact</span></a></li>
<li class="toclevel-3"><a href="#cjeopardy"><span class="tocnumber">3.2.9</span> <span class="toctext">cjeopardy</span></a>
<ul>
<li class="toclevel-4"><a href="#hint"><span class="tocnumber">3.2.9.1</span> <span class="toctext">hint</span></a></li>
</ul>
</li>
<li class="toclevel-3"><a href="#c99std"><span class="tocnumber">3.2.10</span> <span class="toctext">c99std</span></a></li>
<li class="toclevel-3"><a href="#c11std"><span class="tocnumber">3.2.11</span> <span class="toctext">c11std</span></a></li>
<li class="toclevel-3"><a href="#man"><span class="tocnumber">3.2.12</span> <span class="toctext">man</span></a></li>
<li class="toclevel-3"><a href="#google"><span class="tocnumber">3.2.13</span> <span class="toctext">google</span></a></li>
<li class="toclevel-3"><a href="#define"><span class="tocnumber">3.2.14</span> <span class="toctext">define</span></a></li>
<li class="toclevel-3"><a href="#dict"><span class="tocnumber">3.2.15</span> <span class="toctext">dict</span></a></li>
<li class="toclevel-3"><a href="#foldoc"><span class="tocnumber">3.2.16</span> <span class="toctext">foldoc</span></a></li>
<li class="toclevel-3"><a href="#vera"><span class="tocnumber">3.2.17</span> <span class="toctext">vera</span></a></li>
<li class="toclevel-3"><a href="#udict"><span class="tocnumber">3.2.18</span> <span class="toctext">udict</span></a></li>
<li class="toclevel-3"><a href="#wdict"><span class="tocnumber">3.2.19</span> <span class="toctext">wdict</span></a></li>
<li class="toclevel-3"><a href="#acronym"><span class="tocnumber">3.2.20</span> <span class="toctext">acronym</span></a></li>
<li class="toclevel-3"><a href="#math"><span class="tocnumber">3.2.21</span> <span class="toctext">math</span></a></li>
<li class="toclevel-3"><a href="#compliment"><span class="tocnumber">3.2.22</span> <span class="toctext">compliment</span></a></li>
<li class="toclevel-3"><a href="#insult"><span class="tocnumber">3.2.23</span> <span class="toctext">insult</span></a></li>
<li class="toclevel-3"><a href="#excuse"><span class="tocnumber">3.2.24</span> <span class="toctext">excuse</span></a></li>
<li class="toclevel-3"><a href="#horoscope"><span class="tocnumber">3.2.25</span> <span class="toctext">horoscope</span></a></li>
<li class="toclevel-3"><a href="#horrorscope"><span class="tocnumber">3.2.26</span> <span class="toctext">horrorscope</span></a></li>
<li class="toclevel-3"><a href="#quote"><span class="tocnumber">3.2.27</span> <span class="toctext">quote</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="#Informative"><span class="tocnumber">3.3</span> <span class="toctext">Informative</span></a>
<ul>
<li class="toclevel-3"><a href="#list"><span class="tocnumber">3.3.1</span> <span class="toctext">list</span></a></li>
<li class="toclevel-3"><a href="#info"><span class="tocnumber">3.3.2</span> <span class="toctext">info</span></a></li>
<li class="toclevel-3"><a href="#version"><span class="tocnumber">3.3.3</span> <span class="toctext">version</span></a></li>
<li class="toclevel-3"><a href="#source"><span class="tocnumber">3.3.4</span> <span class="toctext">source</span></a></li>
<li class="toclevel-3"><a href="#help"><span class="tocnumber">3.3.5</span> <span class="toctext">help</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="#Administrative"><span class="tocnumber">3.4</span> <span class="toctext">Administrative</span></a>
<ul>
<li class="toclevel-3"><a href="#login"><span class="tocnumber">3.4.1</span> <span class="toctext">login</span></a></li>
<li class="toclevel-3"><a href="#logout"><span class="tocnumber">3.4.2</span> <span class="toctext">logout</span></a></li>
<li class="toclevel-3"><a href="#ignore"><span class="tocnumber">3.4.3</span> <span class="toctext">ignore</span></a></li>
<li class="toclevel-3"><a href="#unignore"><span class="tocnumber">3.4.4</span> <span class="toctext">unignore</span></a></li>
<li class="toclevel-3"><a href="#ban"><span class="tocnumber">3.4.5</span> <span class="toctext">ban</span></a></li>
<li class="toclevel-3"><a href="#unban"><span class="tocnumber">3.4.6</span> <span class="toctext">unban</span></a></li>
<li class="toclevel-3"><a href="#kick"><span class="tocnumber">3.4.7</span> <span class="toctext">kick</span></a></li>
<li class="toclevel-3"><a href="#export"><span class="tocnumber">3.4.8</span> <span class="toctext">export</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="#.23.23c"><span class="tocnumber">3.5</span> <span class="toctext">##c</span></a>
<ul>
<li class="toclevel-3"><a href="#C-Aphorisms"><span class="tocnumber">3.5.1</span> <span class="toctext">C-Aphorisms</span></a></li>
</ul>
</li>
</ul>
</li>
<li class="toclevel-1"><a href="#Flood_control"><span class="tocnumber">4</span> <span class="toctext">Flood control</span></a>
<ul>
<li class="toclevel-2"><a href="#Message_flood"><span class="tocnumber">4.1</span> <span class="toctext">Message flood</span></a></li>
<li class="toclevel-2"><a href="#Join_flood"><span class="tocnumber">4.2</span> <span class="toctext">Join flood</span></a></li>
<li class="toclevel-2"><a href="#Enter_key_abuse"><span class="tocnumber">4.3</span> <span class="toctext">Enter key abuse</span></a></li>
<li class="toclevel-2"><a href="#Notification_message"><span class="tocnumber">4.4</span> <span class="toctext">Notification message</span></a>
<ul>
<li class="toclevel-3"><a href="#Message_flooding"><span class="tocnumber">4.4.1</span> <span class="toctext">Message flooding</span></a></li>
<li class="toclevel-3"><a href="#Join_flooding"><span class="tocnumber">4.4.2</span> <span class="toctext">Join flooding</span></a></li>
<li class="toclevel-3"><a href="#Enter_key_abuse_2"><span class="tocnumber">4.4.3</span> <span class="toctext">Enter key abuse</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="#Opping.2FDeopping"><span class="tocnumber">4.5</span> <span class="toctext">Opping/Deopping</span></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</td></tr></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
<a name="PBot"></a><h2> <span class="mw-headline">PBot</span></h2>
<a name="About_PBot"></a><h3> <span class="mw-headline">About PBot</span></h3>
<p>PBot is an IRC bot written in Perl in pragma_'s spare time.
</p>
<a name="Trigger"></a><h3> <span class="mw-headline">Trigger</span></h3>
<p>All of <b>PBot'</b>s commands may begin with its name or its trigger, or be followed by its name.
</p><p>The trigger character defaults to exclaimation mark [!].
</p><p>Note that commands need not be submitted to the channel; you can /msg it instead. If you /msg <b>PBot</b>, 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.
</p>
<pre>Examples:
&lt;pragma_&gt;&nbsp;!hi
&lt;pragma_&gt; hi, PBot
&lt;pragma_&gt; PBot: hi
</pre>
<a name="Source"></a><h3> <span class="mw-headline">Source</span></h3>
<p>PBot's source may be found at these repositories:
</p>
<pre>* <a href="https://github.com/pragma-/pbot" class="external free" title="https://github.com/pragma-/pbot" rel="nofollow">https://github.com/pragma-/pbot</a>
* <a href="https://code.google.com/p/pbot2-pl/source/browse/" class="external free" title="https://code.google.com/p/pbot2-pl/source/browse/" rel="nofollow">https://code.google.com/p/pbot2-pl/source/browse/</a>
* <a href="https://bitbucket.org/pragmasoft/pbot/src" class="external free" title="https://bitbucket.org/pragmasoft/pbot/src" rel="nofollow">https://bitbucket.org/pragmasoft/pbot/src</a>
* <a href="https://gitorious.org/pbot/pbot/" class="external free" title="https://gitorious.org/pbot/pbot/" rel="nofollow">https://gitorious.org/pbot/pbot/</a>
</pre>
<p>The URL for the source of any loaded modules may be found by using the <a href="#factinfo" title="">factinfo</a> command:
</p>
<pre> &lt;pragma_&gt; factinfo ##c faq
&lt;PBot&gt; faq: Module loaded by pragma_ on Fri Dec 31 02:34:04 2004 -&gt;
<a href="https://github.com/pragma-/pbot/blob/master/modules/cfaq.pl" class="external free" title="https://github.com/pragma-/pbot/blob/master/modules/cfaq.pl" rel="nofollow">https://github.com/pragma-/pbot/blob/master/modules/cfaq.pl</a>, used 512 times (last by ecrane)
</pre>
<a name="Bot_Channel"></a><h3> <span class="mw-headline">Bot Channel</span></h3>
<p>You may test/play with the bot in the #pbot2 channel on irc.freenode.net.
</p>
<a name="Directing_output_to_a_user"></a><h3> <span class="mw-headline">Directing output to a user</span></h3>
<p>You may direct PBot to prepend the nickname of a specific person to a factoid in the channel by stating the nickname after the factoid (if the factoid doesn't take arguments):
</p>
<pre> &lt;pragma_&gt; PBot: version defrost
&lt;PBot&gt; defrost: PBot revision 387 2012-10-07
</pre>
<a name="tell"></a><h5> <span class="mw-headline">tell</span></h5>
<p>You may also use the `tell &lt;nick&gt; about &lt;command&gt;` syntax (which is necessary if the factoid does take arguments):
</p>
<pre> &lt;pragma_&gt; PBot: tell defrost about help cc
&lt;PBot&gt; defrost: To learn all about cc, see <a href="http://www.iso-9899.info/wiki/PBot#cc" class="external free" title="http://www.iso-9899.info/wiki/PBot#cc" rel="nofollow">http://www.iso-9899.info/wiki/PBot#cc</a>
</pre>
<a name="Factoids"></a><h2> <span class="mw-headline">Factoids</span></h2>
<a name="List_of_factoids"></a><h3> <span class="mw-headline">List of factoids</span></h3>
<p>The most recent exported list of factoids can be found here:
<a href="http://www.iso-9899.info/PBot/factoids.html" class="external free" title="http://www.iso-9899.info/PBot/factoids.html" rel="nofollow">http://www.iso-9899.info/PBot/factoids.html</a>.
</p>
<a name="Channel_namespaces"></a><h4> <span class="mw-headline">Channel namespaces</span></h4>
<p>Factoids added in one channel may be called/triggered in another channel or in private message, providing that the other channel doesn't already have a factoid of the same name.
</p><p>Factoids may also be added to a special channel named global. 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 global channel or other channels.
</p><p>For example, a factoid named 'malloc' set in ##c will be called instead of 'malloc' set in global,
if the factoid were triggered in ##c; otherwise, the latter 'malloc' will be triggered if the factoid were triggered in another channel.
</p><p>Similiarily, if there were no 'malloc' factoid in the global 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.
</p><p>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 global factoid.
</p><p>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 <a href="#fact" title="">fact</a> command to call the correct factoid.
</p>
<a name="Adding_a_factoid"></a><h3> <span class="mw-headline">Adding a factoid</span></h3>
<a name="factadd"></a><h4> <span class="mw-headline">factadd</span></h4>
<pre> Usage:
factadd &lt;channel&gt; &lt;keyword&gt; is &lt;description&gt;
</pre>
<p>To add a factoid to the global channel, use global as the channel.
</p>
<pre> Example:
&lt;pragma_&gt; factadd ##c c is /say C rocks!
</pre>
<a name="Special_commands"></a><h4> <span class="mw-headline">Special commands</span></h4>
<a name=".2Fsay"></a><h5> <span class="mw-headline">/say</span></h5>
<p>If a factoid begins with "/say " then PBot will not use
the "&lt;factoid&gt; is &lt;description&gt;" format when displaying the
factoid.
</p>
<pre> Example:
&lt;pragma_&gt; factadd global hi is /say Well, hello there, $nick.
&lt;PBot&gt; 'hi' added to the global channel
&lt;prec&gt; PBot, hi
&lt;PBot&gt; Well, hello there, prec.
</pre>
<a name=".2Fme"></a><h5> <span class="mw-headline">/me</span></h5>
<p>If a factoid begins with "/me " then PBot will ACTION the factoid.
</p>
<pre> Example:
&lt;pragma_&gt; factadd global bounce is /me bounces around.
&lt;PBot&gt; 'bounce' added to the global channel
&lt;pragma_&gt; bounce
*PBot bounces around.
</pre>
<a name=".2Fcall"></a><h5> <span class="mw-headline">/call</span></h5>
<p>If a factoid begins with "/call " then PBot will call an existing command.
</p>
<pre> Example:
&lt;pragma_&gt; factadd global boing is /call bounce
&lt;PBot&gt; 'boing' added to the global channel
&lt;pragma_&gt; boing
*PBot bounces around.
</pre>
<a name=".2Fmsg"></a><h5> <span class="mw-headline">/msg</span></h5>
<p>If a factoid begins with "/msg &lt;nick&gt; " then PBot will /MSG the factoid
text to &lt;nick&gt;
</p>
<a name="Special_variables"></a><h4> <span class="mw-headline">Special variables</span></h4>
<p>Currently there are three special variables:
</p>
<a name=".24nick"></a><h5> <span class="mw-headline">$nick</span></h5>
<pre> $nick: expands to the nick of the caller
</pre>
<a name=".24args"></a><h5> <span class="mw-headline">$args</span></h5>
<pre> $args: expands to any text following the keyword
</pre>
<a name=".24channel"></a><h5> <span class="mw-headline">$channel</span></h5>
<pre> $channel: expands to the name of the channel in which the command is used
</pre>
<a name="adlib_list_variables"></a><h4> <span class="mw-headline">adlib list variables</span></h4>
<p>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.
</p>
<pre> Example:
&lt;pragma_&gt; factadd global colors is red green blue "bright yellow" pink "dark purple" orange
&lt;PBot&gt; 'colors' added to the global channel
</pre>
<p>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.
</p>
<pre> Example:
&lt;pragma_&gt; factadd global sky is /say The sky is $colors.
&lt;PBot&gt; 'sky' added to the global channel
&lt;pragma_&gt; sky
&lt;PBot&gt; The sky is dark purple.
&lt;pragma_&gt; sky
&lt;PBot&gt; The sky is green.
</pre>
<p>A practical example, creating the RTFM trigger:
</p>
<pre> &lt;pragma_&gt; factadd global sizes is big large tiny small huge gigantic teeny
&lt;PBot&gt; 'sizes' added to the global channel
&lt;pragma_&gt; factadd global attacks is whaps thwacks bashes smacks punts whacks
&lt;PBot&gt; 'attacks' added to the global channel
&lt;pragma_&gt; factadd global rtfm is /me $attacks $args with a $sizes $colors manual.
&lt;PBot&gt; 'rtfm' added to the global channel
&lt;pragma_&gt; rtfm mauke
* PBot thwacks mauke with a big red manual.
</pre>
<a name="action_with_args"></a><h4> <span class="mw-headline">action_with_args</span></h4>
<p>You can use the <a href="#factset" title="">factset</a> command to set a special factoid meta-data key named "action_with_args" to trigger an alternate message if an argument has been supplied.
</p>
<pre> Example:
&lt;pragma_&gt; factadd global snack is /me eats a cookie.
&lt;PBot&gt; 'snack' added to the global channel
&lt;pragma_&gt; factset global snack action_with_args /me gives $args a cookie.
&lt;PBot&gt; [Factoids] (global) snack: 'action_with_args' set to '/me gives $args a cookie.'
&lt;pragma_&gt; snack
* PBot eats a cookie.
&lt;pragma_&gt; snack orbitz
* PBot gives orbitz a cookie.
</pre>
<a name="add_nick"></a><h4> <span class="mw-headline">add_nick</span></h4>
<p>You can use the <a href="#factset" title="">factset</a> command to set a special factoid meta-data key named "add_nick" to prepend the nick of the caller to the output. This is mostly useful for modules.
</p>
<a name="Deleting_a_factoid"></a><h3> <span class="mw-headline">Deleting a factoid</span></h3>
<a name="factrem"></a><h4> <span class="mw-headline">factrem</span></h4>
<a name="forget"></a><h4> <span class="mw-headline">forget</span></h4>
<p>To remove a factoid, use the factrem or forget command. The syntax is:
</p>
<pre> factrem &lt;channel&gt; &lt;keyword&gt;
forget &lt;channel&gt; &lt;keyword&gt;
</pre>
<a name="Viewing.2Ftriggering_a_factoid"></a><h3> <span class="mw-headline">Viewing/triggering a factoid</span></h3>
<p>To view or trigger a factoid, one merely issues its keyword as a command.
</p>
<pre> &lt;pragma_&gt; PBot, c?
&lt;PBot&gt; C rocks!
</pre>
<a name="Viewing.2Ftriggering_another_channel.27s_factoid"></a><h3> <span class="mw-headline">Viewing/triggering another channel's factoid</span></h3>
<a name="fact"></a><h4> <span class="mw-headline">fact</span></h4>
<p>To view or trigger a factoid belonging to a specific channel, use the fact command:
</p>
<pre> fact &lt;channel&gt; &lt;keyword&gt; [arguments]
</pre>
<a name="Aliasing_a_factoid"></a><h3> <span class="mw-headline">Aliasing a factoid</span></h3>
<a name="factalias"></a><h4> <span class="mw-headline">factalias</span></h4>
<p>To create an factoid that acts as an alias for a command, use the 'factalias' command or '&lt;alias&gt; is /call &lt;command&gt;'.
</p>
<pre> &lt;newalias&gt; is /call &lt;command&gt;
</pre>
<p>The syntax for 'factalias' is:
</p>
<pre> factalias &lt;channel&gt; &lt;new keyword&gt; &lt;command&gt;
</pre>
<pre> Example:
&lt;pragma_&gt; factadd ##c book is /me points accusingly at $args, "Where is your book?!"
&lt;PBot&gt; 'book' added to ##c
&lt;pragma_&gt; book newbie
*PBot points accusingly at newbie, "Where is your book?!"
&lt;pragma_&gt; factadd ##c rafb is /call book
&lt;PBot&gt; 'rafb' added to ##c
&lt;pragma_&gt; rafb runtime
*PBot points accusingly at runtime, "Where is your book?!"
</pre>
<pre> Another example:
&lt;pragma_&gt; factadd ##c offtopic is /say In this channel, '$args' is off-topic.
&lt;pragma_&gt; offtopic C++
&lt;PBot&gt; In this channel, 'C++' is off-topic.
&lt;pragma_&gt; factalias ##c C++ offtopic C++ <i>(alternatively: factadd ##c C++ is /call offtopic C++)</i>
&lt;pragma_&gt; C++
&lt;PBot&gt; In this channel, 'C++' is off-topic.
</pre>
<a name="Moving.2Frenaming_a_factoid"></a><h3> <span class="mw-headline">Moving/renaming a factoid</span></h3>
<a name="factmove"></a><h4> <span class="mw-headline">factmove</span></h4>
<p>To rename a factoid or move a factoid to a different channel, use the 'factmove' command:
</p>
<pre> Usage: factmove &lt;source channel&gt; &lt;source factoid&gt; &lt;target channel/factoid&gt; [target factoid]
</pre>
<p>If three arguments are given, the factoid is renamed in the source channel. If four arguments are given, the factoid is moved to the target channel with the target name.
</p>
<a name="Changing_a_factoid"></a><h3> <span class="mw-headline">Changing a factoid</span></h3>
<a name="factchange"></a><h4> <span class="mw-headline">factchange</span></h4>
<p>To change a factoid, use the 'factchange' command:
</p>
<pre> Usage: factchange &lt;channel&gt; &lt;keyword&gt; s/&lt;pattern&gt;/&lt;change to&gt;/<br />
&lt;pragma_&gt; c
&lt;PBot&gt; C rocks!
&lt;pragma_&gt; factchange ##c c s/rocks/rules/
&lt;PBot&gt; c changed.
&lt;pragma_&gt; c
&lt;PBot&gt; C rules!
</pre>
<p>Note that the final argument is a Perl-style substitution regex. See 'man perlre'.
</p>
<pre> For instance, it is possible to append to a factoid by using:
'factchange channel factoid s/$/text to append/'
</pre>
<pre> Likewise, you can prepend to a factoid by using:
'factchange channel factoid s/^/text to prepend/'
</pre>
<p>Alternatively, you may append to a factoid by using 'is also':
</p>
<pre> &lt;pragma_&gt; PBot, c is also See FAQ at <a href="http://www.eskimo.com/~scs/C-faq/top.html" class="external free" title="http://www.eskimo.com/~scs/C-faq/top.html" rel="nofollow">http://www.eskimo.com/~scs/C-faq/top.html</a>
&lt;PBot&gt; Changed: c is /say C rules!&nbsp;; See FAQ at <a href="http://www.eskimo.com/~scs/C-faq/top.html" class="external free" title="http://www.eskimo.com/~scs/C-faq/top.html" rel="nofollow">http://www.eskimo.com/~scs/C-faq/top.html</a>
</pre>
<a name="factset"></a><h4> <span class="mw-headline">factset</span></h4>
<p>To view or set factoid meta-data, such as owner, rate-limit, etc, use the 'factset' command.
</p>
<pre> Usage: factset &lt;channel&gt; &lt;factoid&gt; [&lt;key&gt; [value]]
</pre>
<p>Omit &lt;key&gt; and &lt;value&gt; to list all the keys and values for a factoid. Specify &lt;key&gt;, but omit &lt;value&gt; to see the value for a specific key.
</p>
<a name="factunset"></a><h4> <span class="mw-headline">factunset</span></h4>
<p>To unset factoid meta-data, use the 'factunset' command.
</p>
<pre> Usage: factunset &lt;channel&gt; &lt;factoid&gt; &lt;key&gt;
</pre>
<a name="Finding_a_factoid"></a><h3> <span class="mw-headline">Finding a factoid</span></h3>
<a name="factfind"></a><h4> <span class="mw-headline">factfind</span></h4>
<p>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.
</p><p>If there is only one match for the query, it will display that factoid, otherwise it will list all matches.
</p>
<pre>Usage: factfind [-channel channel] [-owner nick] [-by nick] [text]
Example:
&lt;pragma_&gt; PBot, factfind cast
&lt;PBot&gt; 3 factoids match: [##c] NULL casting dontcastmalloc
</pre>
<a name="Information_about_a_factoid"></a><h3> <span class="mw-headline">Information about a factoid</span></h3>
<a name="factinfo"></a><h4> <span class="mw-headline">factinfo</span></h4>
<p>To get information about a factoid, such as who submitted it and when, use the 'factinfo' command:
</p>
<pre> factinfo &lt;channel&gt; &lt;keyword&gt;
</pre>
<pre> &lt;pragma_&gt; PBot, factinfo ##c NULL
&lt;PBot&gt; 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])
</pre>
<p>If the factoid has been submitted for the special global channel, then it will be shown as 'submitted for all channels'. Otherwise,
it will be shown as 'submitted for #channel'.
</p>
<a name="factshow"></a><h4> <span class="mw-headline">factshow</span></h4>
<p>To see the factoid string literal, use the 'factshow' command:
</p>
<pre> factshow &lt;channel&gt; &lt;keyword&gt;
</pre>
<pre> &lt;pragma_&gt; factshow ##c hi
&lt;PBot&gt; hi: /say $greetings, $nick.
</pre>
<a name="factset_2"></a><h4> <span class="mw-headline">factset</span></h4>
<p>To view factoid meta-data, such as owner, rate-limit, etc, use the 'factset' command.
</p>
<pre> Usage: factset &lt;channel&gt; &lt;factoid&gt; [&lt;key&gt; [value]]
</pre>
<p>Omit &lt;key&gt; and &lt;value&gt; to list all the keys and values for a factoid. Specify &lt;key&gt;, but omit &lt;value&gt; to see the value for a specific key.
</p>
<a name="count"></a><h4> <span class="mw-headline">count</span></h4>
<p>To see how many factoids and what percentage of the database &lt;nick&gt; has submitted, use the 'count' command:
</p>
<pre> &lt;pragma_&gt; count prec
&lt;PBot&gt; prec has submitted 28 factoids out of 233 (12%)
&lt;pragma_&gt; count twkm
&lt;PBot&gt; twkm has submitted 74 factoids out of 233 (31%)
&lt;pragma_&gt; count pragma
&lt;PBot&gt; pragma has submitted 27 factoids out of 233 (11%)
</pre>
<a name="histogram"></a><h4> <span class="mw-headline">histogram</span></h4>
<p>To see a histogram of the top 10 factoid submitters, use the 'histogram' command:
</p>
<pre> &lt;pragma_&gt; histogram
&lt;PBot&gt; 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%)
</pre>
<a name="top20"></a><h4> <span class="mw-headline">top20</span></h4>
<p>To see the top 20 most popular factoids, use the 'top20' command.
</p>
<a name="Commands"></a><h2> <span class="mw-headline">Commands</span></h2>
<p>To see all the currently available commands, use the <b>list commands</b> command.
</p><p>Some commands are:
</p>
<a name="Quotegrabs"></a><h3> <span class="mw-headline">Quotegrabs</span></h3>
<a name="Table_of_quotegrabs"></a><h4> <span class="mw-headline">Table of quotegrabs</span></h4>
<p>A table of grabbed quotes can be found here: <a href="http://www.iso-9899.info/PBot/quotegrabs.html" class="external free" title="http://www.iso-9899.info/PBot/quotegrabs.html" rel="nofollow">http://www.iso-9899.info/PBot/quotegrabs.html</a>
</p>
<a name="grab"></a><h4> <span class="mw-headline">grab</span></h4>
<p>Grabs a message someone says, and adds it to the quotegrabs database. You may grab multiple nicks/messages in one quotegrab by separating the arguments with a plus sign (the nicks need not be different -- you can grab multiple messages by the same nick by specifying a different history for each grab).
</p><p>You can use the <a href="#recall" title="">recall</a> command to test the arguments before grabbing (please use a private message).
</p>
<pre>Usage: grab &lt;nick&gt; [history [channel]] [+ ...]
where [history] is an optional argument regular expression used to search message contents;
e.g., to grab a message containing the text "pizza", use: grab nick pizza
</pre>
<pre>Examples:
</pre>
<pre> &lt;bob&gt; Clowns are scary.
&lt;pragma-&gt; grab bob clowns
&lt;PBot&gt; Quote grabbed: 1: &lt;bob&gt; Clowns are scary.
</pre>
<pre> &lt;alice&gt; Please put that in the right place.
&lt;bob&gt; That's what she said!
&lt;pragma-&gt; grab alice place + bob said
&lt;PBot&gt; Quote grabbed 2: &lt;alice&gt; Please put that in the right place. &lt;bob&gt; That's what she said!
</pre>
<pre> &lt;charlie&gt; I know a funny programming knock-knock joke.
&lt;charlie&gt; Knock knock!
&lt;charlie&gt; Race condition.
&lt;charlie&gt; Who's there?
&lt;pragma-&gt; grab charlie knock + charlie race + charlie there
&lt;PBot&gt; Quote grabbed 3: &lt;charlie&gt; Knock knock! &lt;charlie&gt; Race condition. &lt;charlie&gt; Who's there?
</pre>
<a name="recall"></a><h4> <span class="mw-headline">recall</span></h4>
<p>Recalls messages from the chat history and displays them with a relative time-stamp.
</p><p>Usage: recall &lt;[nick [history [channel]]] [-c,channel &lt;channel&gt;] [-t,text,h,history &lt;history&gt;] [+ ...]&gt;
</p>
<pre> &lt;pragma-&gt; recall alice + bob
&lt;PBot&gt; [20 seconds ago] &lt;alice&gt; Please put that in the right place. [8 seconds ago] &lt;bob&gt; That's what she said!
</pre>
<a name="getq"></a><h4> <span class="mw-headline">getq</span></h4>
<p>Retrieves and displays a specific grabbed quote from the quotegrabs database.
</p>
<pre>Usage: getq &lt;quote-id&gt;
</pre>
<a name="rq"></a><h4> <span class="mw-headline">rq</span></h4>
<p>Retrieves and displays a random grabbed quote from the quotegrabs database. You may filter by nick, channel and/or quote text.
</p>
<pre>Usage: rq [nick [channel [text]]] [-c,--channel &lt;channel&gt;] [-t,--text &lt;text&gt;]
</pre>
<a name="delq"></a><h4> <span class="mw-headline">delq</span></h4>
<p>Deletes a specific grabbed quote from the quotegrabs database. You can only delete quotes you have grabbed unless you are logged in as an admin.
</p>
<pre>Usage: delq &lt;quote-id&gt;
</pre>
<a name="Modules"></a><h3> <span class="mw-headline">Modules</span></h3>
<a name=".7B.7D"></a><h4> <span class="mw-headline">{}</span></h4>
<p>This is just an alias for the <a href="#cc" title="">cc</a> command. Can take an optional nick argument in front in order to address the output to said nick.
</p>
<pre> Example:
&lt;pragma_&gt; { puts("hello"); }
&lt;PBot&gt; hello
&lt;pragma_&gt; somebody: { puts("hi"); }
&lt;PBot&gt; somebody: hi
</pre>
<a name="cc"></a><h4> <span class="mw-headline">cc</span></h4>
<p>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.
</p><p>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.
</p><p>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.
</p><p>Uses gcc 4.9.0 and gdb 7.7.
</p>
<a name="Usage"></a><h5> <span class="mw-headline">Usage</span></h5>
<pre> Usage: cc [compiler options] [-paste] [-nomain] [-lang=&lt;language&gt;] &lt;code&gt; [-input=&lt;stdin input&gt;]
cc &lt;run|undo|show|paste|copy|replace|prepend|append|remove|s/// [and ...]&gt;
cc &lt;diff&gt;
[nick] { &lt;same as above without the cc in front&gt; }
</pre>
<ul><li> You can pass any gcc compiler options. By default, -Wall -Wextra -std=c11 -pedantic are passed unless an option is specified.
</li><li> The -paste option will pretty-format and paste the code/output to a paste site and display the URL (useful to preserve newlines in output, and to refer to line-numbers).
</li><li> The -nomain flag will prevent the code from being wrapped with a main() function.
</li><li> The -input=&lt;stdin input&gt; option provides STDIN input (i.e., scanf(), getc(stdin), etc.); MUST be the last option after any code (otherwise the code will be considered to be input).
</li><li> The run, undo, show, replace, etc commands are part of interactive-editing. See below.
</li><li> The diff command can be used to display the differences between the two most recent snippets.
</li><li> You can use { } instead of cc; the options/flags/comments must be inside the braces. Can take an optional nick argument in front in order to address the output to said nick.
</li></ul>
<a name="Supported_Languages"></a><h5> <span class="mw-headline">Supported Languages</span></h5>
<p>The -lang option accepts the following languages: C, C99 and C11. Alternatively, you may use the -std=&lt;c89|gnu89|c99|gnu99|etc&gt; compiler option to specify which standard to follow.
</p><p>Support for additional languages coming soon.
</p>
<a name="Default_Language"></a><h5> <span class="mw-headline">Default Language</span></h5>
<p>The default language (e.g., without an explicit -lang or -std option) is C11 pedantic; which is gcc -Wall -Wextra -std=c11 -pedantic.
</p>
<a name="Disallowed_system_calls"></a><h5> <span class="mw-headline">Disallowed system calls</span></h5>
<p>None. The network cable has been unplugged. Other than that, anything goes. Have fun.
</p>
<a name="Program_termination_with_no_output"></a><h5> <span class="mw-headline">Program termination with no output</span></h5>
<p>If there is no output, information about the local variables will be displayed.
</p>
<pre> &lt;pragma_&gt; cc int x = 5, y = 16; x ^= y, y ^= x, x ^= y;
&lt;PBot&gt; pragma_: &lt;no output: x = 16; y = 5&gt;
</pre>
<pre> &lt;pragma_&gt; cc #include &lt;sys/utsname.h&gt; struct utsname u; uname(&amp;u);
&lt;PBot&gt; pragma_: &lt;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)"}&gt;
</pre>
<a name="Abnormal_program_termination"></a><h5> <span class="mw-headline">Abnormal program termination</span></h5>
<p>If a signal is detected, the bot will display useful information.
</p><p>Example session:
</p>
<pre>&lt; pragma_&gt; ,cc char *p = 0; *p = 1;
&lt; PBot&gt; pragma_: Program received signal 11 (SIGSEGV) at statement: *p = 1; &lt;local variables: p = 0x0&gt;
</pre>
<pre>&lt; pragma_&gt; ,cc void bang() { char *p = 0, s[] = "lol"; strcpy(p, s); } bang();
&lt; PBot&gt; pragma_: Program received signal 11 (SIGSEGV) in bang () at statement: strcpy(p, s); &lt;local variables: p = 0x0, s = "lol"&gt;
</pre>
<pre>&lt; pragma_&gt; ,cc int a = 2 / 0;
&lt; PBot&gt; pragma_: [In function 'main': warning: division by zero] Program received signal 8 (SIGFPE) at statement: int a = 2 / 0;
</pre>
<a name="C_and_C.2B.2B_Functionality"></a><h5> <span class="mw-headline">C and C++ Functionality</span></h5>
<a name="Using_the_preprocessor"></a><h5> <span class="mw-headline">Using the preprocessor</span></h5>
<a name="Default_.23includes"></a><h6> <span class="mw-headline">Default #includes</span></h6>
<p>These are the default includes for C11. To get the most up-to-date list of #includes, use the `cc paste` command.
</p>
<pre>
#define _XOPEN_SOURCE 9001
#define __USE_XOPEN
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;unistd.h&gt;
#include &lt;math.h&gt;
#include &lt;limits.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;stdint.h&gt;
#include &lt;stdbool.h&gt;
#include &lt;stddef.h&gt;
#include &lt;stdarg.h&gt;
#include &lt;stdnoreturn.h&gt;
#include &lt;stdalign.h&gt;
#include &lt;ctype.h&gt;
#include &lt;inttypes.h&gt;
#include &lt;float.h&gt;
#include &lt;errno.h&gt;
#include &lt;time.h&gt;
#include &lt;assert.h&gt;
#include &lt;complex.h&gt;
</pre>
<a name="Using_.23include"></a><h6> <span class="mw-headline">Using #include</span></h6>
<p>In C and C++, you may #include &lt;file.h&gt; 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. You do not need to append a \n after the #include.
</p>
<pre>&lt;pragma_&gt; cc #include &lt;sys/utsname.h&gt; struct utsname u; uname(&amp;u);
&lt;PBot&gt; pragma_: &lt;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)"}&gt;
</pre>
<pre>&lt;pragma_&gt; cc #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; void func(void) { puts("Hello, world"); } func();
&lt;PBot&gt; pragma_: Hello, World
</pre>
<p>In the previous examples, only the specified includes (e.g., &lt;sys/utsname.h&gt; in the first example, &lt;stdio.h&gt; and &lt;stdlib.h&gt; in the second, will be included instead of the default includes.
</p>
<a name="Using_.23define"></a><h6> <span class="mw-headline">Using #define</span></h6>
<p>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.
</p>
<pre>&lt;pragma_&gt; cc #define GREETING "Hello, World"\n puts(GREETING);
&lt;PBot&gt; pragma_: Hello, World
</pre>
<a name="main.28.29_Function_Unnecessary"></a><h5> <span class="mw-headline">main() Function Unnecessary</span></h5>
<p>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 (unless the -nomain flag was specified); anything outside of any functions, excluding preprocessor stuff, will be put into this new main function. Here's an example:
</p>
<pre> &lt;pragma_&gt; cc -paste int add(int a, int b) { return a + b; } printf("4 + 6 =&nbsp;%d -- ", add(4, 6)); int add3(int a, int b, int c)
{ return add(a, b) + c; } printf("7 + 8 + 9 =&nbsp;%d", add3(7, 8, 9));
&lt;PBot&gt; <a href="http://sprunge.us/ehRA?c" class="external free" title="http://sprunge.us/ehRA?c" rel="nofollow">http://sprunge.us/ehRA?c</a>
</pre>
<p>The -paste flag causes the code to be pretty-formatted and pasted with output in comments to a paste site, which displays the following:
</p>
<pre>
#define _XOPEN_SOURCE 9001
#define __USE_XOPEN
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;unistd.h&gt;
#include &lt;math.h&gt;
#include &lt;limits.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;stdint.h&gt;
#include &lt;stdbool.h&gt;
#include &lt;stddef.h&gt;
#include &lt;stdarg.h&gt;
#include &lt;stdnoreturn.h&gt;
#include &lt;stdalign.h&gt;
#include &lt;ctype.h&gt;
#include &lt;inttypes.h&gt;
#include &lt;float.h&gt;
#include &lt;errno.h&gt;
#include &lt;time.h&gt;
#include &lt;assert.h&gt;
#include &lt;complex.h&gt;
#include &lt;prelude.h&gt;
int add(int a, int b) {
return a + b;
}
int add3(int a, int b, int c) {
return add(a, b) + c;
}
int main(void) {
printf(&quot;4 + 6 =&nbsp;%d -- &quot;, add(4, 6));
printf(&quot;7 + 8 + 9 =&nbsp;%d&quot;, add3(7, 8, 9));
return 0;
}
/************* OUTPUT *************
4 + 6 = 10 -- 7 + 8 + 9 = 24
************** OUTPUT *************/
</pre>
<a name="Embedding_Newlines"></a><h5> <span class="mw-headline">Embedding Newlines</span></h5>
<p>In Assembler, you may start a newline in the code via a \n sequence or a semi-colon.
</p><p>In C and C++, #defines must be terminated by a \n sequence.
</p><p>In all other languages, you may embed a newline in the code by using |n. Yes, that's the pipe character followed by 'n'.
</p>
<a name="Printing_in_binary.2Fbase2"></a><h5> <span class="mw-headline">Printing in binary/base2</span></h5>
<p>A freenode ##c regular, Wulf, has provided a printf format specifier 'b' which can be used to print values in base2.
</p>
<pre> &lt;Wulf&gt; cc printf("%b", 1234567);
&lt;PBot&gt; 000100101101011010000111
</pre>
<pre> &lt;Wulf&gt; cc printf("%#'b", 1234567);
&lt;PBot&gt; 0001.0010.1101.0110.1000.0111
</pre>
<a name="Using_the_GDB_debugger"></a><h5> <span class="mw-headline">Using the GDB debugger</span></h5>
<p>The program is executed within a gdb debugger instance, which may be interacted with via the following gdb macros.
</p>
<a name="print"></a><h6> <span class="mw-headline">print</span></h6>
<p>The print() macro prints the values of expressions. Useful for printing out structures and arrays.
</p>
<pre>&lt;pragma_&gt; cc int a[] = { 1, 2, 3 }; print(a);
&lt;PBot&gt; pragma_: &lt;a = {1, 2, 3}&gt;
</pre>
<pre>&lt;pragma_&gt; cc #include &lt;sys/utsname.h&gt; struct utsname u; uname(&amp;u); print(u);
&lt;PBot&gt; pragma_: &lt;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)"}&gt;
</pre>
<pre>&lt;pragma_&gt; cc print(sizeof(int));
&lt;PBot&gt; pragma_: &lt;sizeof(int) = 4&gt;
</pre>
<pre>&lt;pragma_&gt; cc print(2+2);
&lt;PBot&gt; pragma_: &lt;2 + 2 = 4&gt;
</pre>
<a name="ptype"></a><h6> <span class="mw-headline">ptype</span></h6>
<p>The ptype() macro prints the types of expressions.
</p>
<pre> &lt;pragma_&gt; cc int *a[] = {0}; ptype(a); ptype(a[0]); ptype(*a[0]);
&lt;PBot&gt; pragma_: &lt;a = int *[1]&gt; &lt;a[0] = int *&gt; &lt;*a[0] = int&gt;
</pre>
<a name="watch"></a><h6> <span class="mw-headline">watch</span></h6>
<p>The watch() macro watches a variable and displays its value when it changes.
</p>
<pre>&lt;pragma_&gt; cc int n = 0, last = 1; watch(n); while(n &lt;= 7000) { n += last; last = n - last; } /* fibonacci */
&lt;PBot&gt; pragma_: &lt;n = 1&gt; &lt;n = 2&gt; &lt;n = 3&gt; &lt;n = 5&gt; &lt;n = 8&gt; &lt;n = 13&gt; &lt;n = 21&gt; &lt;n = 34&gt; &lt;n = 55&gt; &lt;n = 89&gt; &lt;n = 144&gt; &lt;n = 233&gt; &lt;n = 377&gt; &lt;n = 610&gt; &lt;n = 987&gt; &lt;n = 1597&gt; &lt;n = 2584&gt; &lt;n = 4181&gt; &lt;n = 6765&gt; &lt;n = 10946&gt;
</pre>
<a name="trace"></a><h6> <span class="mw-headline">trace</span></h6>
<p>The trace() macro traces a function's calls, displaying passed and returned values.
</p>
<pre> &lt;pragma_&gt; ,cc trace(foo); char *foo(int n) { puts("Hello, world"); return "Good-bye, world"; } foo(42);
&lt;PBot&gt; pragma_: &lt;entered [1] foo (n=42)&gt;
Hello, world
&lt;leaving [1] foo (n=42), returned 0x401006 "Good-bye, world"&gt;
</pre>
<pre> &lt;pragma_&gt; ,cc int fib2(int n, int p0, int p1) { return n == 1&nbsp;? p1&nbsp;: fib2(n - 1, p1, p0 + p1); }
int fib(int n) { return n == 0&nbsp;? 0&nbsp;: fib2(n, 0, 1); }
trace(fib); trace(fib2); for(int i = 0; i &lt; 20; i++) printf("%d ", fib(i));
&lt;PBot&gt; pragma_: &lt;entered [1] fib (n=0)&gt;
&lt;leaving [1] fib (n=0), returned 0&gt;
1
&lt;entered [1] fib (n=2)&gt;
&lt;entered [2] fib2 (n=2, p0=0, p1=1)&gt;
&lt;entered [3] fib2 (n=1, p0=1, p1=1)&gt;
&lt;leaving [3] fib2 (n=1, p0=1, p1=1), returned 1&gt;
&lt;leaving [2] fib2 (n=2, p0=0, p1=1), returned 1&gt;
&lt;leaving [1] fib (n=2), returned 1&gt;
1
&lt;entered [1] fib (n=3)&gt;
&lt;entered [2] fib2 (n=3, p0=0, p1=1)&gt;
&lt;entered [3] fib2 (n=2, p0=1, p1=1)&gt;
&lt;entered [4] fib2 (n=1, p0=1, p1=2)&gt;
&lt;leaving [4] fib2 (n=1, p0=1, p1=2), returned 2&gt;
&lt;leaving [3] fib2 (n=2, p0=1, p1=1), returned 2&gt;
&lt;leaving [2] fib2 (n=3, p0=0, p1=1), returned 2&gt;
&lt;leaving [1] fib (n=3), returned 2&gt;
2
&lt;entered [1] fib (n=4)&gt;
&lt;entered [2] fib2 (n=4, p0=0, p1=1)&gt;
&lt;entered [3] fib2 (n=3, p0=1, p1=1)&gt;
&lt;entered [4] fib2 (n=2, p0=1, p1=2)&gt;
&lt;entered [5] fib2 (n=1, p0=2, p1=3)&gt;
&lt;leaving [5] fib2 (n=1, p0=2, p1=3), returned 3&gt;
&lt;leaving [4] fib2 (n=2, p0=1, p1=2), returned 3&gt;
&lt;leaving [3] fib2 (n=3, p0=1, p1=1), returned 3&gt;
&lt;leaving [2] fib2 (n=4, p0=0, p1=1), returned 3&gt;
&lt;leaving [1] fib (n=4), returned 3&gt;
3
&lt;entered [1] fib (n=5)&gt;
&lt;entered [2] fib2 (n=5, p0=0, p1=1)&gt;
&lt;entered [3] fib2 (n=4, p0=1, p1=1)&gt;
&lt;entered [4] fib2 (n=3, p0=1, p1=2)&gt;
&lt;entered [5] fib2 (n=2, p0=2, p1=3)&gt;
&lt;entered [6] fib2 (n=1, p0=3, p1=5)&gt;
&lt;leaving [6] fib2 (n=1, p0=3, p1=5), returned 5&gt;
&lt;leaving [5] fib2 (n=2, p0=2, p1=3), returned 5&gt;
&lt;leaving [4] fib2 (n=3, p0=1, p1=2), returned 5&gt;
&lt;leaving [3] fib2 (n=4, p0=1, p1=1), returned 5&gt;
&lt;leaving [2] fib2 (n=5, p0=0, p1=1), returned 5&gt;
&lt;leaving [1] fib (n=5), returned 5&gt;
5
&lt;entered [1] fib (n=6)&gt;
&lt;entered [2] fib2 (n=6, p0=0, p1=1)&gt;
&lt;entered [3] fib2 (n=5, p0=1, p1=1)&gt;
&lt;entered [4] fib2 (n=4, p0=1, p1=2)&gt;
&lt;entered [5] fib2 (n=3, p0=2, p1=3)&gt;
&lt;entered [6] fib2 (n=2, p0=3, p1=5)&gt;
&lt;entered [7] fib2 (n=1, p0=5, p1=8)&gt;
&lt;leaving [7] fib2 (n=1, p0=5, p1=8), returned 8&gt;
&lt;leaving [6] fib2 (n=2, p0=3, p1=5), returned 8&gt;
&lt;leaving [5] fib2 (n=3, p0=2, p1=3), returned 8&gt;
&lt;leaving [4] fib2 (n=4, p0=1, p1=2), returned 8&gt;
&lt;leaving [3] fib2 (n=5, p0=1, p1=1), returned 8&gt;
&lt;leaving [2] fib2 (n=6, p0=0, p1=1), returned 8&gt;
&lt;leaving [1] fib (n=6), returned 8&gt;
8
... etc ...
</pre>
<a name="gdb"></a><h6> <span class="mw-headline">gdb</span></h6>
<p>The gdb() function takes a string argument which it passes to the gdb debugger and then displays the output if any.
</p>
<pre> &lt;pragma_&gt; ,cc gdb("info macro NULL");
&lt;PBot&gt; pragma_: &lt;Defined at /usr/lib/gcc/x86_64-linux-gnu/4.7/include/stddef.h:402&gt; &lt;#define NULL ((void *)0)&gt;
</pre>
<pre> &lt;pragma_&gt; ,cc void foo() { gdb("info frame"); } foo();
&lt;PBot&gt; pragma_: &lt;Stack level 1, frame at 0x7fffffffe660:&gt; 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
</pre>
<a name="Interactive_Editing"></a><h5> <span class="mw-headline">Interactive Editing</span></h5>
<p>The <a href="#cc" title="">cc</a> command supports interactive-editing. The general syntax is: cc [command].
</p><p>Each cc snippet is saved in a buffer which is named after the channel or nick it was used in. You can use <a href="#show" title="">show</a> or <a href="#diff" title="">diff</a> with a buffer argument to view that buffer; otherwise you can use the <a href="#copy" title="">copy</a> command to copy the most recent snippet of another buffer into the current buffer and optionally chain it with another command -- for example, to copy the ##c buffer and paste it: <i>cc copy ##c and paste</i>.
</p><p>The commands are: <a href="#copy" title="">copy</a>, <a href="#show" title="">show</a>, <a href="#diff" title="">diff</a>, <a href="#paste" title="">paste</a>, <a href="#run" title="">run</a>, <a href="#undo" title="">undo</a>, <a href="#s.2F.2F" title="">s//</a>, <a href="#replace" title="">replace</a>, <a href="#prepend" title="">prepend</a>, <a href="#append" title="">append</a>, and <a href="#remove" title="">remove</a>. Most of the commands may be chained together by separating them with whitespace or "and".
</p><p>The commands are described in more detail below:
</p>
<a name="copy"></a><h6> <span class="mw-headline">copy</span></h6>
<p>To copy a snippet from another buffer, use the <b>copy</b> command. Other commands can optionally be chained after this command.
</p>
<pre> Usage: cc copy &lt;buffer&gt; [and ...]
</pre>
<a name="show"></a><h6> <span class="mw-headline">show</span></h6>
<p>To show the latest code in the buffer, use the <b>show</b> command. This command can take an optional buffer argument.
</p>
<pre> &lt;pragma_&gt; cc show
&lt;PBot&gt; pragma_: printf("Hello, world!");
</pre>
<p>This command is stand-alone and cannot be chained with other interactive-editing commands.
</p>
<a name="diff"></a><h6> <span class="mw-headline">diff</span></h6>
<p>To see the differences between the two most recent snippets, use the <b>diff</b> command. This command can take an optional buffer argument.
</p>
<pre> &lt;pragma_&gt; cc diff
&lt;PBot&gt; pragma: printf("&lt;replaced `Hello` with `Good-bye`&gt;, &lt;replaced `world` with `void`&gt;");
</pre>
<p>This command is stand-alone and cannot be chained with other interactive-editing commands.
</p>
<a name="paste"></a><h6> <span class="mw-headline">paste</span></h6>
<p>To paste the full source of the latest code in the buffer as the compiler sees it, use the <b>paste</b> command:
</p>
<pre> &lt;pragma_&gt; cc paste
&lt;PBot&gt; pragma_: <a href="http://some.random.paste-site.com/paste/results" class="external free" title="http://some.random.paste-site.com/paste/results" rel="nofollow">http://some.random.paste-site.com/paste/results</a>
</pre>
<p>This command is stand-alone and cannot be chained with other interactive-editing commands.
</p>
<a name="run"></a><h6> <span class="mw-headline">run</span></h6>
<p>To attempt to compile and execute the latest code in the buffer, use the <b>run</b> command:
</p>
<pre> &lt;pragma_&gt; cc run
&lt;PBot&gt; pragma_: Hello, world!
</pre>
<p>This command is stand-alone and cannot be chained with other interactive-editing commands.
</p>
<a name="undo"></a><h6> <span class="mw-headline">undo</span></h6>
<p>To undo any changes, use <b>undo</b>. The <b>undo</b> command must be the first command before any subsequent commands.
</p>
<a name="s.2F.2F"></a><h6> <span class="mw-headline">s//</span></h6>
<p>To change the latest code in the buffer, use the <b>s/regex/substitution/[gi]</b> pattern.
</p>
<pre> &lt;pragma_&gt; cc s/Hello/Good-bye/ and s/world/void/
&lt;PBot&gt; pragma_: Good-bye, void!
&lt;pragma_&gt; cc show
&lt;PBot&gt; pragma_: printf("Good-bye, void!");
</pre>
<a name="replace"></a><h6> <span class="mw-headline">replace</span></h6>
<p>Alternatively, you may use the <b>replace</b> command. The usage is (note the required single-quotes):
</p>
<pre> cc replace [all, first, second, ..., tenth, last] 'from' with 'to'
</pre>
<a name="prepend"></a><h6> <span class="mw-headline">prepend</span></h6>
<p>Text may be prepended with the <b>prepend</b> command:
</p>
<pre> cc prepend 'text'
</pre>
<a name="append"></a><h6> <span class="mw-headline">append</span></h6>
<p>Text may be appended with the <b>append</b> command:
</p>
<pre> cc append 'text'
</pre>
<a name="remove"></a><h6> <span class="mw-headline">remove</span></h6>
<p>Text may be deleted with the <b>remove</b> command:
</p>
<pre> cc remove [all, first, second, ..., tenth, last] 'text'
</pre>
<a name="Some_Examples"></a><h5> <span class="mw-headline">Some Examples</span></h5>
<pre> Examples:
</pre>
<pre> &lt; pragma_&gt; cc int fib2(int n, int p0, int p1) { return n == 1&nbsp;? p1&nbsp;: fib2(n - 1, p1, p0 + p1); }
int fib(int n) { return n == 0&nbsp;? 0&nbsp;: fib2(n, 0, 1); } for(int i = 0; i &lt; 21; i++) printf("%d ", fib(i));
&lt; PBot&gt; pragma_: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
</pre>
<pre> &lt; pragma_&gt; cc int i = 0, last = 1; while(i &lt;= 7000) { printf("%d ", i); i += last; last = i - last; }
&lt;PBot&gt; pragma_: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
</pre>
<pre> &lt;Icewing&gt; cc int n=0, f[2]={0,1}; while(n&lt;20) printf("%d ",f[++n&amp;1]=f[0]+f[1]); // based on cehteh
&lt;PBot&gt; Icewing: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
</pre>
<pre> &lt;3monkeys&gt; cc @p=(0,1); until($#p&gt;20) { print"$p[-2]\n"; push @p, $p[-2] + $p[-1] } -lang=Perl
&lt;PBot&gt; 3monkeys: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
</pre>
<pre> &lt;spiewak&gt; cc -lang=Ruby p,c=0,1; 20.times{p p; c=p+p=c}
&lt;PBot&gt; spiewak: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
</pre>
<pre> &lt;Jafet&gt; cc main = print $ take 20 $ let fibs = 0&nbsp;: scanl (+) 1 fibs in fibs; -lang=Haskell
&lt;PBot&gt; Jafet: [0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181]
</pre>
<a name="english"></a><h4> <span class="mw-headline">english</span></h4>
<p>Converts C code into English sentences. Understands only C89 code.
</p>
<pre> Usage: english &lt;C snippet&gt;
</pre>
<pre> Examples:
&lt;pragma_&gt; english char (*a)[10]; char *b[10];
&lt;PBot&gt; Let a be a pointer to an array of length 10 of type char. Let b be an array of length 10 of type pointer to char.
&lt;pragma_&gt; english for(;;);
&lt;PBot&gt; Repeatedly compute nothing.
&lt;pragma_&gt; english typedef char Batman; char Bruce_Wayne; char superhero = (Batman) Bruce_Wayne;
&lt;PBot&gt; Let Batman be another name for a character. Let Bruce_Wayne be a character. Let superhero be a character, with value being Bruce_Wayne cast to a Batman.
</pre>
<a name="expand"></a><h4> <span class="mw-headline">expand</span></h4>
<p>Expands macros in C code and displays the resulting code. Macros must be terminated by a \n sequence. You may #include headers to expand macros defined within.
</p>
<pre> Usage: expand &lt;C snippet&gt;
</pre>
<pre> Example:
&lt;pragma_&gt; expand #define WHILE while ( \n #define DO ) { \n #define WEND } \n int i = 5; WHILE --i DO puts("hi"); WEND
&lt;PBot&gt; pragma_: int i = 5; while ( --i ) { puts("hi"); }
&lt;pragma_&gt; expand #include &lt;stdlib.h&gt; NULL
&lt;PBot&gt; pragma_: ((void *)0)
</pre>
<a name="prec"></a><h4> <span class="mw-headline">prec</span></h4>
<a name="paren"></a><h4> <span class="mw-headline">paren</span></h4>
<p>Shows operator precedence in C99 expressions by adding parentheses.
</p>
<pre> Usage: prec &lt;expression&gt;
paren &lt;expression&gt;
</pre>
<pre> Examples:
&lt;pragma_&gt; prec *a++
&lt;PBot&gt; pragma_: *(a++)
&lt;pragma_&gt; prec a = b &amp; c
&lt;PBot&gt; pragma_: a = (b &amp; c)
&lt;pragma_&gt; prec token = strtok(s, d)&nbsp;!= NULL
&lt;PBot&gt; pragma_: token = (strtok(s, d)&nbsp;!= NULL)
</pre>
<a name="faq"></a><h4> <span class="mw-headline">faq</span></h4>
<p>Displays questions from the <a href="http://http://www.eskimo.com/~scs/C-faq/top.html" class="external text" title="http://http://www.eskimo.com/~scs/C-faq/top.html" rel="nofollow">comp.lang.c faq</a>. 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.
</p>
<pre> Usage: faq [match #] &lt;search regex&gt;
Examples:
&lt;pragma_&gt; faq cast malloc
&lt;PBot&gt; 2 results, displaying #1: 7. Memory Allocation, 7.6 Why am
I getting ``warning: assignment of pointer from integer
lacks a cast<i> for calls to malloc?&nbsp;: </i>
<a href="http://www.eskimo.com/~scs/C-faq/q7.6.html" class="external free" title="http://www.eskimo.com/~scs/C-faq/q7.6.html" rel="nofollow">http://www.eskimo.com/~scs/C-faq/q7.6.html</a>
&lt;pragma_&gt; faq 2 cast malloc
&lt;PBot&gt; 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?&nbsp;:
<a href="http://www.eskimo.com/~scs/C-faq/q7.7.html" class="external free" title="http://www.eskimo.com/~scs/C-faq/q7.7.html" rel="nofollow">http://www.eskimo.com/~scs/C-faq/q7.7.html</a>
&lt;pragma_&gt; faq ^6.4
&lt;PBot&gt; 6. Arrays and Pointers, 6.4 Why are array and pointer
declarations interchangeable as function formal
parameters?&nbsp;: <a href="http://www.eskimo.com/~scs/C-faq/q6.4.html" class="external free" title="http://www.eskimo.com/~scs/C-faq/q6.4.html" rel="nofollow">http://www.eskimo.com/~scs/C-faq/q6.4.html</a>
</pre>
<a name="cfact"></a><h4> <span class="mw-headline">cfact</span></h4>
<p>Displays a random C fact. You can specify a search text to limit the random set to those containing that text.
</p>
<pre> Usage: cfact [search text]
</pre>
<a name="cjeopardy"></a><h4> <span class="mw-headline">cjeopardy</span></h4>
<p>Displays a random C Jeopardy question. You can specify a search text to limit the random set to those containing that text. Answer the questions with `what is ...?`
</p>
<pre> Usage: cjeopardy [search text]
</pre>
<a name="hint"></a><h5> <span class="mw-headline">hint</span></h5>
<p>Displays a hint for the current C Jeopardy question. Each subsequent hint request reveals more of the answer.
</p>
<a name="c99std"></a><h4> <span class="mw-headline">c99std</span></h4>
<p>Searches ISO/IEC 9899:TC3 (WG14/N1256), also known as the C99 draft standard. <a href="http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf" class="external free" title="http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf" rel="nofollow">http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf</a>
</p>
<pre> 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.
</pre>
<pre> Examples:
</pre>
<pre> &lt; pragma_&gt; c99std pointer value
&lt; PBot&gt; 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 <a href="http://codepad.org/f2DULaGQ" class="external free" title="http://codepad.org/f2DULaGQ" rel="nofollow">http://codepad.org/f2DULaGQ</a> for full text.
</pre>
<pre> &lt; pragma_&gt; c99std pointer value -list
&lt; PBot&gt; 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 <a href="http://codepad.org/qQlnJYJk" class="external free" title="http://codepad.org/qQlnJYJk" rel="nofollow">http://codepad.org/qQlnJYJk</a> for full text.
</pre>
<pre> &lt; pragma_&gt; Hmm, how about just section 6.3?
</pre>
<pre> &lt; pragma_&gt; c99std pointer value 6.3
&lt; PBot&gt; 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 &amp; 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 <a href="http://codepad.org/mf1RNnr2" class="external free" title="http://codepad.org/mf1RNnr2" rel="nofollow">http://codepad.org/mf1RNnr2</a> for full text.
</pre>
<pre> &lt; pragma_&gt; c99std pointer value 6.3 -list
&lt; PBot&gt; Sections containing 'pointer value': 6.3.2.1p3, 6.3.2.1p4, 6.3.2.3p2, 6.3.2.3p6
</pre>
<pre> &lt; pragma_&gt; c99std pointer value 6.3 -n3
&lt; PBot&gt; 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.
</pre>
<a name="c11std"></a><h4> <span class="mw-headline">c11std</span></h4>
<p>Searches ISO/IEC 9811:201X (WG14/N1256), also known as the C11 draft standard. <a href="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf" class="external free" title="http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf</a>
</p><p>Usage is identical to c99std.
</p>
<a name="man"></a><h4> <span class="mw-headline">man</span></h4>
<p>Displays manpage summaries and/or C related tidbits (headers, prototypes, specifications), as well as a link to the FreeBSD manpage.
</p>
<pre>Usage: man [section] query
Samples:
&lt;pragma_&gt; man fork
&lt;PBot&gt; 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 -
<a href="http://www.iso-9899.info/man?fork" class="external free" title="http://www.iso-9899.info/man?fork" rel="nofollow">http://www.iso-9899.info/man?fork</a>
&lt;pragma_&gt; man atexit
&lt;PBot&gt; 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 -
<a href="http://www.iso-9899.info/man?atexit" class="external free" title="http://www.iso-9899.info/man?atexit" rel="nofollow">http://www.iso-9899.info/man?atexit</a>
&lt;pragma_&gt; man getcwd
&lt;PBot&gt; 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 - <a href="http://www.iso-9899.info/man?getcwd" class="external free" title="http://www.iso-9899.info/man?getcwd" rel="nofollow">http://www.iso-9899.info/man?getcwd</a>
</pre>
<a name="google"></a><h4> <span class="mw-headline">google</span></h4>
<p>Displays google results for a query.
</p>
<pre>Usage: google [number of results] query
Samples:
&lt;pragma_&gt; google brian kernighan
&lt;PBot&gt; brian kernighan (115,000): Brian Kernighan's Home Page:
(<a href="http://www.cs.princeton.edu/~bwk/" class="external free" title="http://www.cs.princeton.edu/~bwk/" rel="nofollow">http://www.cs.princeton.edu/~bwk/</a>)
&lt;pragma_&gt; google 3 brian kernighan
&lt;PBot&gt; brian kernighan (115,000): Brian Kernighan's Home Page:
(<a href="http://www.cs.princeton.edu/~bwk/" class="external free" title="http://www.cs.princeton.edu/~bwk/" rel="nofollow">http://www.cs.princeton.edu/~bwk/</a>), An Interview with Brian
Kernighan: (<a href="http://www-2.cs.cmu.edu/~mihaib/kernighan-interview/" class="external free" title="http://www-2.cs.cmu.edu/~mihaib/kernighan-interview/" rel="nofollow">http://www-2.cs.cmu.edu/~mihaib/kernighan-interview/</a>),
Interview with Brian Kernighan | Linux Journal:
(<a href="http://www.linuxjournal.com/article.php?sid=7035" class="external free" title="http://www.linuxjournal.com/article.php?sid=7035" rel="nofollow">http://www.linuxjournal.com/article.php?sid=7035</a>), Brian W.
Kernighan: (<a href="http://www.lysator.liu.se/c/bwk/" class="external free" title="http://www.lysator.liu.se/c/bwk/" rel="nofollow">http://www.lysator.liu.se/c/bwk/</a>) ,Brian W.
Kernighan: Programming in C: A Tutorial:
(<a href="http://www.lysator.liu.se/c/bwk-tutor.html" class="external free" title="http://www.lysator.liu.se/c/bwk-tutor.html" rel="nofollow">http://www.lysator.liu.se/c/bwk-tutor.html</a>)
</pre>
<a name="define"></a><h4> <span class="mw-headline">define</span></h4>
<a name="dict"></a><h4> <span class="mw-headline">dict</span></h4>
<p>Displays dictionary defintions from <a href="http://dict.org" class="external free" title="http://dict.org" rel="nofollow">http://dict.org</a> using DICT protocol.
</p><p>Databases for the -d option are listed here: <a href="http://www.iso-9899.info/PBot/dict_databases.txt" class="external free" title="http://www.iso-9899.info/PBot/dict_databases.txt" rel="nofollow">http://www.iso-9899.info/PBot/dict_databases.txt</a> -- Note that there may be several commands aliased to one of these databases; for example, the `foldoc` command is an alias to `dict -d foldoc`.
</p>
<pre> Usage: dict [-d database] [-n start from definition number] [-t first letter of word class type (n]oun, v]erb, etc)]
[-search &lt;regex&gt; for definitions matching &lt;regex&gt;] &lt;word&gt;
</pre>
<pre> Examples:
</pre>
<pre> &lt;pragma_&gt; dict hit
&lt;PBot&gt; 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"
</pre>
<pre> &lt;pragma_&gt; dict -n 4 hit
&lt;PBot&gt; 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"
</pre>
<pre> &lt;pragma_&gt; dict -t v hit
&lt;PBot&gt; 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
</pre>
<pre> &lt;pragma_&gt; dict -search ball hit
&lt;PBot&gt; 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"
</pre>
<pre> &lt;pragma_&gt; dict -d eng-fra hit
&lt;PBot&gt; hit: 1) [hit] battre, frapper, heurter frapper, heurter atteindre, frapper, parvenir, saisir
</pre>
<a name="foldoc"></a><h4> <span class="mw-headline">foldoc</span></h4>
<p>This is just an alias for `dict -d foldoc`.
</p>
<a name="vera"></a><h4> <span class="mw-headline">vera</span></h4>
<p>This is just an alias for `dict -d vera`.
</p><p><br />
</p>
<a name="udict"></a><h4> <span class="mw-headline">udict</span></h4>
<p>Displays dictionary definitions from <a href="http://urbandictionary.com" class="external free" title="http://urbandictionary.com" rel="nofollow">http://urbandictionary.com</a>.
</p>
<pre>Usage: udict query
</pre>
<a name="wdict"></a><h4> <span class="mw-headline">wdict</span></h4>
<p>Displays Wikipedia article abstracts (first paragraph). Note: case-sensitive and very picky.
</p>
<pre>Usage: wdict query
</pre>
<a name="acronym"></a><h4> <span class="mw-headline">acronym</span></h4>
<p>Displays expanded acronyms.
</p>
<pre>Usage: acronym query
Samples:
&lt;pragma_&gt; acronym posix
&lt;PBot&gt; posix (3 entries): Portable Operating System for
Information Exchange, Portable Operating System Interface
Extensions (IBM), Portable Operating System Interface for
Unix
&lt;pragma_&gt; acronym linux
&lt;PBot&gt; linux (1 entries): Linux Is Not UniX
</pre>
<a name="math"></a><h4> <span class="mw-headline">math</span></h4>
<p>Evaluate calculations.
</p>
<pre>Usage: math &lt;expression&gt;
Example:
&lt;pragma_&gt; math 5 + 5
&lt;PBot&gt; 5 + 5 = 10
</pre>
<a name="compliment"></a><h4> <span class="mw-headline">compliment</span></h4>
<p>Displays a random Markov-chain compliment/insult.
</p>
<pre>Usage: compliment [nick]
</pre>
<a name="insult"></a><h4> <span class="mw-headline">insult</span></h4>
<p>Displays a random insult.
</p>
<pre>Usage: insult [nick]
</pre>
<a name="excuse"></a><h4> <span class="mw-headline">excuse</span></h4>
<p>Displays a random excuse.
</p>
<pre>Usage: excuse [nick]
</pre>
<a name="horoscope"></a><h4> <span class="mw-headline">horoscope</span></h4>
<p>Displays a horoscope for a Zodiac sign (google this if you don't know your sign).
</p>
<pre>Usage: horoscope &lt;sign&gt;
</pre>
<a name="horrorscope"></a><h4> <span class="mw-headline">horrorscope</span></h4>
<p>Displays a horrorscope for a Zodiac sign.
</p>
<pre>Usage: horrorscope &lt;sign&gt;
</pre>
<a name="quote"></a><h4> <span class="mw-headline">quote</span></h4>
<p>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 &lt;name&gt; 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.
</p>
<pre>Usage: quote [search text] [--author &lt;author name&gt;]
Samples:
&lt;pragma_&gt; quote
&lt;PBot&gt; "Each success only buys an admission ticket to a more difficult problem." -- Henry Kissinger (1923 - ).
&lt;pragma_&gt; quote --author lao tzu
&lt;PBot&gt; 41 matching quotes found. "A journey of a thousand miles begins with a single step." -- Lao-tzu (604 BC - 531 BC).
&lt;pragma_&gt; quote butterfly
&lt;PBot&gt; 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.
</pre>
<a name="Informative"></a><h3> <span class="mw-headline">Informative</span></h3>
<a name="list"></a><h4> <span class="mw-headline">list</span></h4>
<p>Lists information about specified argument
</p>
<pre>Usage: .list &lt;modules|factoids|commands|admins&gt;
</pre>
<a name="info"></a><h4> <span class="mw-headline">info</span></h4>
<p>Shows detailed information about a module or a factoid
</p>
<pre> Usage: .info &lt;module|factoid&gt;
</pre>
<a name="version"></a><h4> <span class="mw-headline">version</span></h4>
<p>Shows version information
</p>
<a name="source"></a><h4> <span class="mw-headline">source</span></h4>
<p>Shows PBot's source information.
</p>
<a name="help"></a><h4> <span class="mw-headline">help</span></h4>
<p>Shows link to this page.
</p>
<a name="Administrative"></a><h3> <span class="mw-headline">Administrative</span></h3>
<a name="login"></a><h4> <span class="mw-headline">login</span></h4>
<p>You cannot use any of the admin commands unless you login first
</p>
<pre> Usage: login &lt;password&gt;
</pre>
<p>Note that login requires that your nick and hostmask match PBot's records.
</p>
<a name="logout"></a><h4> <span class="mw-headline">logout</span></h4>
<p>Logs out of PBot.
</p>
<a name="ignore"></a><h4> <span class="mw-headline">ignore</span></h4>
<p>Ignore a user
</p>
<pre>Usage: ignore &lt;hostmask&gt; [channel] [timeout]
</pre>
<a name="unignore"></a><h4> <span class="mw-headline">unignore</span></h4>
<p>Unignores a user
</p>
<pre>Usage: unignore &lt;hostmask&gt; [channel]
</pre>
<a name="ban"></a><h4> <span class="mw-headline">ban</span></h4>
<p>Bans a user
</p>
<pre> Usage: ban &lt;hostmask&gt; [timeout seconds]
</pre>
<p>If timeout is omitted, PBot will ban the user for one hour. Timeout is in seconds.
</p>
<a name="unban"></a><h4> <span class="mw-headline">unban</span></h4>
<p>Unbans a user
</p>
<pre> Usage:
unban &lt;hostmask&gt;
</pre>
<p>Note that &lt;hostmask&gt; must EXACTLY match the hostmask in the ban list for the channel.
</p>
<a name="kick"></a><h4> <span class="mw-headline">kick</span></h4>
<p>Removes a nick from the channel.
</p>
<pre> Usage from channel: kick &lt;nick&gt; &lt;reason&gt;
From private message: kick &lt;channel&gt; &lt;nick&gt; &lt;reason&gt;
</pre>
<a name="export"></a><h4> <span class="mw-headline">export</span></h4>
<p>exports specified list to web page
</p>
<pre>Usage: export &lt;commands|factoids|admins|channels&gt;
</pre>
<a name=".23.23c"></a><h3> <span class="mw-headline">##c</span></h3>
<a name="C-Aphorisms"></a><h4> <span class="mw-headline">C-Aphorisms</span></h4>
<p>The C Aphorisms can be triggered with c&lt;n&gt; where &lt;n&gt; is an integer representing one of the aphorisms. For example, to quote C Aphorism 1, use `c1`.
</p>
<ol><li> The questioner's first description of the problem/question will be misleading.
</li><li> All examples given by the questioner will be incomplete, misleading, broken, wrong, and/or not representative of the actual question.
</li><li> The questioner will not read and apply the answers they are given but will instead continue to practice c1 and c2.
</li><li> The ignorant will continually mis-educate the questioner.
</li><li> When given a choice of solutions, the questioner will always choose the wrong one.
</li><li> The questioner will always find a reason to say, "It doesn't work."
</li><li> The questioner will paste code and say "I have a problem" or "It doesn't work" without any further information or description of the problem.
</li><li> The more beginner they are, the more likely they are to be overcomplicating it.
</li><li> The questioner will always have some excuse for doing it wrong.
</li><li> The newbie will not accept the answer you give, no matter how right it is.
</li><li> &lt;skipped due to existing c11 factoid&gt;
</li><li> The newbie will think they are smarter than they really are.
</li><li> The newbie will fail to recognize undefined behavior, and will wrongly think that their program is correct because it appears to work.
</li><li> The more the questioner attempts to describe their problem, the less coherent their description becomes.
</li></ol>
<a name="Flood_control"></a><h2> <span class="mw-headline">Flood control</span></h2>
<p>PBot can monitor the channel for excessive rapid traffic originating from an individual and automatically ban the offender for a certain length of time.
</p>
<a name="Message_flood"></a><h3> <span class="mw-headline">Message flood</span></h3>
<p>If four (4) or more messages are sent within ten (10) seconds, the flood control is triggered. The offender will be muted for 30 seconds for the first offense. Each additional offense will result in the offender being muted for a 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.
</p>
<a name="Join_flood"></a><h3> <span class="mw-headline">Join flood</span></h3>
<p>If four (4) or more JOINs are observed within thirty (30) minutes <b>without any messages in between joins</b>, the offender will be forwarded to another channel for a limited time: 2^(number_of_offenses + 2) hours.
</p><p>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 &lt;channel&gt;.
</p><p>(Any messages sent to the public channel by the user at any time will reset their JOIN counter back to zero. The unbanme command can only be used for the first two offenses -- the offense counter is decremented once every 24 hours.)
</p>
<a name="Enter_key_abuse"></a><h3> <span class="mw-headline">Enter key abuse</span></h3>
<p>If four (4) consecutive messages are sent with ten (10) seconds or less between individual messages and without another person speaking, an enter-key-abuse counter is incremented. This counter will then continue to be incremented every two (2) consecutive messages with ten (10) seconds or less in between until another person speaks or more than ten (10) seconds have elapsed, whereupon it returns to requiring four (4) consecutive messages. When this counter reaches three (3) or greater, the offender will be muted using the same timeout rules as message flooding. This counter is automatically decremented once per hour.
</p>
<a name="Notification_message"></a><h3> <span class="mw-headline">Notification message</span></h3>
<p>PBot will send the following message to the offender each offense.
</p>
<a name="Message_flooding"></a><h4> <span class="mw-headline">Message flooding</span></h4>
<p>"You have been muted due to flooding. Please use a web paste service such as <a href="http://codepad.org" class="external free" title="http://codepad.org" rel="nofollow">http://codepad.org</a> for lengthy pastes. You will be allowed to speak again in $timeout."
</p>
<a name="Join_flooding"></a><h4> <span class="mw-headline">Join flooding</span></h4>
<p>"You have been banned from $channel 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, otherwise you will be automatically unbanned in $timeout."
</p>
<a name="Enter_key_abuse_2"></a><h4> <span class="mw-headline">Enter key abuse</span></h4>
<p>"You have been muted due to abusing the enter key. Please do not split your sentences over multiple messages. You will be allowed to speak again in $timeout."
</p>
<a name="Opping.2FDeopping"></a><h3> <span class="mw-headline">Opping/Deopping</span></h3>
<p>ChanServ will automagically op and deop PBot when necessary. PBot will wait until about 5 minutes have elapsed before requesting a deop from ChanServ.
</p>
<hr />
<p><a href="/wiki/Category_IRC" title="Category IRC">Category IRC</a>
</p>
<!-- Saved in parser cache with key wikidb:pcache:idhash:935-0!1!0!!en!2!edit=0 and timestamp 20141231003534 -->
<div class="printfooter">
Retrieved from "<a href="http://www.iso-9899.info/wiki/PBot">http://www.iso-9899.info/wiki/PBot</a>"</div>
<!-- end content -->
<div class="visualClear"></div>
</div>
</div>
</div>
<div id="column-one">
<div id="p-cactions" class="portlet">
<h5>Views</h5>
<div class="pBody">
<ul>
<li id="ca-nstab-main" class="selected"><a href="/wiki/PBot" title="View the content page [c]" accesskey="c">Article</a></li>
<li id="ca-talk"><a href="/wiki/Talk:PBot" title="Discussion about the content page [t]" accesskey="t">Discussion</a></li>
<li id="ca-viewsource"><a href="/wiki?title=PBot&amp;action=edit" title="This page is protected. You can view its source. [e]" accesskey="e">View source</a></li>
<li id="ca-history"><a href="/wiki?title=PBot&amp;action=history" title="Past versions of this page. [h]" accesskey="h">History</a></li>
</ul>
</div>
</div>
<div class="portlet" id="p-personal">
<h5>Personal tools</h5>
<div class="pBody">
<ul>
<li id="pt-login"><a href="/wiki?title=Special:Userlogin&amp;returnto=PBot" title="You are encouraged to log in, it is not mandatory however. [o]" accesskey="o">Log in</a></li>
</ul>
</div>
</div>
<div class="portlet" id="p-logo">
<a style="background-image: url(/wiki.png);" href="/wiki/Main_Page" title="Visit the Main Page [z]" accesskey="z"></a>
</div>
<script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
<div class='portlet' id='p-navigation'>
<h5>Navigation</h5>
<div class='pBody'>
<ul>
<li id="n-mainpage"><a href="/wiki/Main_Page" title="Visit the Main Page [z]" accesskey="z">Main Page</a></li>
<li id="n-portal"><a href="/wiki/C:Community_Portal" title="About the project, what you can do, where to find things">Community portal</a></li>
<li id="n-currentevents"><a href="/wiki/Current_events" title="Find background information on current events">Current events</a></li>
<li id="n-recentchanges"><a href="/wiki/Special:Recentchanges" title="The list of recent changes in the wiki. [r]" accesskey="r">Recent changes</a></li>
<li id="n-randompage"><a href="/wiki/Special:Random" title="Load a random page [x]" accesskey="x">Random page</a></li>
<li id="n-help"><a href="/wiki/Help:Contents" title="The place to find out.">Help</a></li>
</ul>
</div>
</div>
<div id="p-search" class="portlet">
<h5><label for="searchInput">Search</label></h5>
<div id="searchBody" class="pBody">
<form action="/wiki/Special:Search" id="searchform"><div>
<input id="searchInput" name="search" type="text" title="Search C [f]" accesskey="f" value="" />
<input type='submit' name="go" class="searchButton" id="searchGoButton" value="Go" />&nbsp;
<input type='submit' name="fulltext" class="searchButton" id="mw-searchButton" value="Search" />
</div></form>
</div>
</div>
<div class="portlet" id="p-tb">
<h5>Toolbox</h5>
<div class="pBody">
<ul>
<li id="t-whatlinkshere"><a href="/wiki/Special:Whatlinkshere/PBot" title="List of all wiki pages that link here [j]" accesskey="j">What links here</a></li>
<li id="t-recentchangeslinked"><a href="/wiki/Special:Recentchangeslinked/PBot" title="Recent changes in pages linked from this page [k]" accesskey="k">Related changes</a></li>
<li id="t-specialpages"><a href="/wiki/Special:Specialpages" title="List of all special pages [q]" accesskey="q">Special pages</a></li>
<li id="t-print"><a href="/wiki?title=PBot&amp;printable=yes" title="Printable version of this page [p]" accesskey="p">Printable version</a></li> <li id="t-permalink"><a href="/wiki?title=PBot&amp;oldid=9009" title="Permanent link to this version of the page">Permanent link</a></li> </ul>
</div>
</div>
</div><!-- end of the left (by default at least) column -->
<div class="visualClear"></div>
<div id="footer">
<div id="f-poweredbyico"><a href="http://www.mediawiki.org/"><img src="/wiki/skins/common/images/poweredby_mediawiki_88x31.png" alt="Powered by MediaWiki" /></a></div>
<ul id="f-list">
<li id="lastmod"> This page was last modified 00:34, 31 December 2014.</li>
<li id="viewcount">This page has been accessed 34,578 times.</li>
<li id="privacy"><a href="/wiki/C:Privacy_policy" title="C:Privacy policy">Privacy policy</a></li>
<li id="about"><a href="/wiki/C:About" title="C:About">About C</a></li>
<li id="disclaimer"><a href="/wiki/C:General_disclaimer" title="C:General disclaimer">Disclaimers</a></li>
</ul>
</div>
</div>
<!-- Served in 0.364 secs. --></body></html>