data | ||
doc | ||
misc | ||
modules | ||
PBot | ||
Plang@98b01cb7eb | ||
Plugins | ||
updates | ||
.gitattributes | ||
.gitignore | ||
.gitmodules | ||
LICENSE | ||
MODULES | ||
pbot | ||
README.md |
PBot
PBot is a versatile IRC Bot written in Perl
- Installation / Quick Start
- Features
- Documentation
- Frequently Asked Questions
- Support
- License
Installation / Quick Start
To get up-and-running quickly, check out the Quick Start guide.
Features
Useful IRC command improvements
mode
command can take wildcards, e.g.mode +ov foo* bar*
to op nicks beginning withfoo
and voice nicks beginning withbar
unban <nick>
andunmute <nick>
will remove all bans/mutes matching their current or previously seen hostmasks or accountsban
andmute
will intelligently set banmasks; supports timeoutsban
andmute
can take a comma-separate list of nicks. Will intelligently group them into multipleMODE +bbbb
commandskick
can take a comma-separated list of nicks; also accepts wildcards- and much, much more!
For more information, see the Admin documentation.
Channel management
PBot can perform the typical channel management tasks.
- opping/deopping, etc
- channel-mode tracking
- user hostmask/alias tracking
- ban-evasion detection
- flood detection
- whitelisting, blacklisting, etc
- spam/advertisement detection
- and much, much more!
For more information, see the Channels documentation and the Anti-abuse documentation
User management
PBot has easy straightforward user management via simple built-in commands.
- user capabilities dictate what users can and cannot do
- user accounts can be global or channel-specific
- users can be recognized by hostmask or required to login with password
- users can adjust their user-metadata with the
my
command - and much, much more!
For more information, see the Admin documentation.
Easy configuration
PBot’s settings are contained in a central registry of key/value pairs grouped by sections.
These settings can easily be configured via several methods:
- PBot’s command-line arguments
- simple built-in commands
(
regset
,regunset
, etc) - editing the
$data_dir/registry
plain-text JSON file
For more information, see the Registry documentation.
Reload core modules without disconnecting
Suppose you edit some PBot source file, be it a core file such as PBot/Factoids.pm or a Plugin such as Plugins/Wttr.pm. Or suppose there’s a PBot update available. Most simple bots would require you to shut down the bot and restart it in order to see the modifications.
Not PBot! Rather than shut PBot down and restart it, you can simply
use the refresh
command
to reload all modified PBot core files and Plugins.
You can also use the reload
command to reload any
modified configuration or data files.
Powerful command interpreter
PBot has a powerful command interpreter with useful functionality, and tons of built-in commands.
For more information, see the Commands documentation.
Piping
You can pipe output from one command as input into another command, indefinitely.
<pragma-> !echo hello world | {sed s/world/everybody/} | {uc}
<PBot> HELLO EVERYBODY
Substitution
You can insert the output from another command at any point within a command. This substitutes the command with its output at the point where the command was used.
<pragma-> !echo This is &{echo a demonstration} of command substitution
<PBot> This is a demonstration of command substitution
For example, suppose you want to make a Google Image Search command. The naive way would be to simply do:
<pragma-> !factadd img /call echo https://google.com/search?tbm=isch&q=$args
Unfortuately this would not support queries containing spaces or
certain symbols. But never fear! We can use command substitution and the
uri_escape
function from the func
command.
Note that you must escape the command substitution to insert it literally into the factoid otherwise it will be expanded first.
<pragma-> !factadd img /call echo https://google.com/search?tbm=isch&q=\&{func uri_escape $args}
<pragma-> !img spaces & stuff
<PBot> https://google.com/search?tbm=isch&q=spaces%20%26%20stuff
Chaining
You can execute multiple commands sequentially as one command.
<pragma-> !echo Test! ;;; me smiles. ;;; version
<PBot> Test! * PBot smiles. PBot version 2696 2020-01-04
Variables
You can use factoids as variables and interpolate them within commands.
<pragma-> !factadd greeting "Hello, world"
<pragma-> !echo greeting is $greeting
<PBot> greeting is Hello, world
PBot variable interpolation supports expansion modifiers, which can be chained to combine their effects.
<pragma-> !echo $greeting:uc
<PBot> HELLO, WORLD
Selectors
You can select a random item from a selection list and interpolate the value within commands.
<pragma-> !echo This is a %(neat|cool|awesome) bot.
<PBot> This is a cool bot.
Inline invocation
You can invoke up to three commands inlined within a message. If the message is addressed to a nick, the output will also be addressed to them.
<pragma-> newuser13: Check the !{version} and the !{help} documentation.
<PBot> newuser13: PBot version 2696 2020-01-04
<PBot> newuser13: To learn all about me, see https://github.com/pragma-/pbot/tree/master/doc
Background processing
Any command can be flagged to be executed as a background process. For example, suppose you make a Plugin that has a command that may potentially take a long time to complete, which could cause PBot to be non-responsive…
Not a problem! You can use the cmdset
command to set the
background-process
command metadata and the
command will now run as a background process, allowing PBot to carry on
with its duties.
The familiar ps
and kill
commands can be used to
list and kill the background processes.
You can also cmdset
the process-timeout
command metadata to set
the timeout, in seconds, before the command is automatically killed.
Otherwise the processmanager.default_timeout
registry value will be used.
Scripting interface
PBot uses Plang as a scripting language. You can use the scripting language to construct advanced commands that are capable of interacting with PBot internal API functions.
Extensible
PBot is extensible in multiple ways. Additional commands and functionality can be added to PBot through Factoids, Plugins, Modules and Functions.
Factoids
Factoids are a very special type of command. Anybody interacting with PBot can create, edit, delete and invoke factoids. Factoids can be locked by the creator of the factoid to prevent them from being edited by others.
At its most simple, a factoid merely displays the text the creator sets.
<pragma-> !factadd hello /say Hello, $nick!
<PBot> hello added to global channel.
<pragma-> PBot, hello
<PBot> Hello, pragma-!
Significantly more complex factoids can be built by using
$variables
, command-substitution, command-piping,
/code
invocation, and more!
PBot factoids include these advanced features:
- undo/redo history
- changelog history
- channel namespaces
- creating and modifying contents using your
local system editor to edit the contents, optionally including
line-breaks and indentation; then pasting the contents to a Web paste
site; and finally using the
-url
option to add/edit the factiod. - advanced
$variable
interpolation ($var:lc
to lowercase contents,$var:ucfirst
to uppercase first letter, etc) - factoid-based variable
lists (e.g., add a factoid
colors
containing “red green blue” and then!echo $colors
will randomly pick one) - advanced argument processing (indexing, splicing, etc)
- metadata (e.g. owner, times used, last used date, locked, etc)
- special commands
(
/say
,/me
,/msg
,/code
, etc) - and much, much more!
For more information, see the Factoids documentation.
Code Factoids
Code Factoids are a special type of factoid that begin with the
/code
command.
/code <language> <code>
That’s right! Anybody can create a factoid that can execute arbitrary code in any language! This is one of PBot’s most powerful features.
How is this safe? Because the code is executed within a virtual machine that has been configured to fall-back to a previously saved state whenever it times out.
For example, the venerable rot13
function:
<pragma-> !factadd rot13 /code sh echo "$@" | tr a-zA-Z n-za-mN-ZA-M
<PBot> rot13 added to global channel.
<pragma-> !rot13 Pretty neat, huh?
<PBot> Cerggl arng, uhu?
You can pipe output from other commands to Code Factoids.
<pragma-> !echo test | {rot13}
<PBot> grfg
For more information, see the Code Factoid documentation.
Plugins
PBot can dynamically load and unload Perl modules to alter its behavior.
These are some of the plugins that PBot has; there are many more:
Plugin | Description |
---|---|
GoogleSearch | Performs Internet searches using the Google search engine. |
UrlTitles | When a URL is seen in a channel, intelligently display its title. It will not display titles that are textually similiar to the URL, in order to maintain the channel signal-noise ratio. |
Quotegrabs | Grabs channel messages as quotes for posterity. Can grab messages from anywhere in the channel history. Can grab multiple messages at once! |
Weather | Fetches and shows weather data for a location. |
Wttr | Advanced weather Plugin with tons of options. Uses wttr.in. |
RemindMe | Lets people set up reminders. Lots of options. |
ActionTrigger | Lets admins set regular expression triggers to execute PBot commands or factoids. |
AntiAway | Detects when a person uses annoying in-channel away messages and warns them. |
AutoRejoin | Automatically rejoin channels if kicked or removed. |
AntiNickSpam | Detects when a person is spamming an excessive number of nicks in the channel and removes them. |
AntiRepeat | Warn people about excessively repeating messages. Kicks if they fail to heed warnings. |
AntiTwitter | Warn people about addressing others with @<nick> .
Kicks if they fail to heed warnings. |
Date | Displays date and time for a timezone. |
There are even a few games!
Plugin | Description |
---|---|
Spinach | An advanced multiplayer Trivia game engine with a twist! A question is shown. Everybody privately submits a false answer. All false answers and the true answer is shown. Everybody tries to guess the true answer. Points are gained when people pick your false answer! |
Battleship | The classic Battleship board game, simplified for IRC |
Connect4 | The classic Connect-4 game. |
Modules
Modules are external command-line executable programs and scripts that can be loaded as PBot commands.
Suppose you have the Qalculate! command-line program and you want to provide a PBot command for it. You can create a very simple shell script containing:
#!/bin/sh
qalc "$*"
And let’s call it qalc.sh
and put it in PBot’s
modules/
directory.
Then you can load it with the load
command.
!load qalc qalc.sh
Now you have a Qalculate! calculator in PBot!
<pragma-> !qalc 2 * 2
<PBot> 2 * 2 = 4
These are just some of the modules PBot comes with; there are several more:
Module | Description |
---|---|
C-to-English translator | Translates C code to natural English sentences. |
C precedence analyzer | Adds parentheses to C code to demonstrate precedence. |
C Jeopardy! game | C programming trivia game based on the Jeopardy! TV game show. |
C Standard citations | Cite specified sections/paragraphs from the C standard. |
Virtual machine | Executes arbitrary code and commands within a virtual machine. |
dict.org Dictionary | Interface to dict.org for definitions, translations, acronyms, etc. |
Urban Dictionary | Search Urban Dictionary for definitions. |
Manpages | Display a concise formatting of manual pages (designed for C functions) |
For more information, see the Modules documentation.
Functions
Functions are commands that accept input, manipulate it and then output the result. They are extremely useful with piping or command substituting.
For example, the uri_escape
function demonstrated in the
Substitution section earlier makes text safe
for use in a URL.
<pragma-> uri_escape thing's & words
<PBot> thing%27s%20%26%20words
We also saw the sed
and uc
functions
demonstrated in Piping. The sed
function replaces text using a substitution regex. The uc
function uppercases the text.
<pragma-> echo Hello world! | {sed s/world/universe/} | {uc}
<PBot> HELLO UNIVERSE!
Here’s a short list of the Functions that come with PBot.
Name | Description |
---|---|
uri_escape |
Percent-encodes unsafe URI characters. |
sed |
Performs sed-like regex substitution. |
pluralize |
Intelligently makes a word or phrase plural. |
unquote |
Removes surrounding quotation marks. |
title |
Title-cases text. That is, lowercases the text then uppercases the first letter of each word. |
ucfirst |
Uppercases the first character of the text. |
uc |
Uppercases all characters. |
lc |
Lowercases all characters. |
Additional Functions can easily be added by making a very simple PBot Plugin.
For more information, see the Functions documentation.
Virtual machine
PBot can integrate with a virtual machine to safely execute arbitrary user-submitted operating system commands or code.
PBot supports several shells and languages out of the box!
<pragma-> !sh echo Remember rot13? | tr a-zA-Z n-za-mN-ZA-M
<PBot> Erzrzore ebg13?
<nil> !go package main\nimport "fmt"\nfunc main() { fmt.Print("foo" == "foo"); }
<PBot> true
<pragma-> !python print('Hello there!')
<PBot> Hello there!
PBot has extensive support for the C programming language. For instance, the C programming language plugin is integrated with the GNU Debugger. It will print useful debugging information.
<pragma-> !cc char *p = 0; *p = 1;
<PBot> runtime error: store to null pointer of type 'char'
Program received signal SIGSEGV, Segmentation fault at
statement: *p = 1; <local variables: p = 0x0>
It can display the value of the most recent statement if there is no program output.
<pragma-> !cc sizeof (int)
<PBot> no output: sizeof(int) = 4
For more information about the C programming language plugin, see the cc
command in the Modules
documentation.
For more information about the virtual machine, see the Virtual Machine documentation.
Documentation
See the PBot documentation for more information.
Frequently Asked Questions
If you have a question, try the PBot FAQ!
Support
For additional questions and support, feel free to join the
#pbot2
channel on the Freenode IRC network (Web Chat).
License
PBot is licensed under the Mozilla Public License, version 2.