2020-01-12 19:23:32 +01:00
# QuickStart
2019-12-31 11:04:22 +01:00
<!-- md - toc - begin -->
2020-01-22 03:24:16 +01:00
* [Installation ](#installation )
* [Installing Perl ](#installing-perl )
* [Installing CPAN modules ](#installing-cpan-modules )
2020-08-05 06:41:36 +02:00
* [re::engine::RE2 ](#reenginere2 )
2020-01-22 03:24:16 +01:00
* [Installing PBot ](#installing-pbot )
* [git (recommended) ](#git-recommended )
* [Download zip archive ](#download-zip-archive )
2020-01-28 04:52:53 +01:00
* [Initial Setup ](#initial-setup )
2020-01-22 03:24:16 +01:00
* [Clone data-directory ](#clone-data-directory )
2020-01-28 04:52:53 +01:00
* [Configuration ](#configuration )
2020-01-22 03:24:16 +01:00
* [Recommended settings for IRC Networks ](#recommended-settings-for-irc-networks )
2021-06-12 10:50:45 +02:00
* [Libera.Chat ](#liberachat )
2020-01-22 03:24:16 +01:00
* [IRCnet ](#ircnet )
* [Other networks ](#other-networks )
* [Starting PBot ](#starting-pbot )
* [Usage ](#usage )
2020-09-22 23:05:25 +02:00
* [rlwrap ](#rlwrap )
2020-01-22 03:24:16 +01:00
* [Overriding directories ](#overriding-directories )
* [Overriding registry ](#overriding-registry )
2020-01-28 04:52:53 +01:00
* [First-time start-up ](#first-time-start-up )
2021-06-12 10:58:37 +02:00
* [Using default settings ](#using-default-settings )
2020-01-28 04:52:53 +01:00
* [Using custom settings ](#using-custom-settings )
2021-06-12 10:58:37 +02:00
* [Custom recommended settings ](#custom-recommended-settings )
2020-01-28 04:52:53 +01:00
* [Custom recommended IRCnet/other network settings ](#custom-recommended-ircnetother-network-settings )
* [Regular start-up ](#regular-start-up )
* [Additional configuration ](#additional-configuration )
2020-01-28 05:05:22 +01:00
* [Creating your bot owner admin account ](#creating-your-bot-owner-admin-account )
2020-01-28 04:52:53 +01:00
* [Adding other users and admins ](#adding-other-users-and-admins )
2020-01-28 05:18:08 +01:00
* [Adding channels ](#adding-channels )
2020-01-22 03:24:16 +01:00
* [Further Reading ](#further-reading )
* [Commands ](#commands )
* [Factoids ](#factoids )
2020-01-28 04:52:53 +01:00
* [Plugins ](#plugins )
2020-01-22 03:24:16 +01:00
* [Modules ](#modules )
2019-12-31 11:04:22 +01:00
<!-- md - toc - end -->
2020-01-12 19:23:32 +01:00
## Installation
2019-12-31 11:04:22 +01:00
2020-01-03 04:07:47 +01:00
### Installing Perl
PBot uses the [Perl programming language ](https://www.perl.org/ ). Perl is usually
part of a base Linux install. If you do not have Perl installed, please see your
system's documentation to install it.
### Installing CPAN modules
2020-01-03 06:44:34 +01:00
Some of PBot's features depend on the availability of Perl modules written by
2020-01-10 08:29:58 +01:00
third parties. To use such PBot features, the modules listed in the [`MODULES` ](../MODULES )
2020-01-03 06:44:34 +01:00
file need to be installed.
2019-12-31 11:04:22 +01:00
The modules may be installed with a simple command:
2020-01-11 01:25:15 +01:00
$ cpan -f -i $(cat MODULES)
2019-12-31 11:04:22 +01:00
Some CPAN modules may fail to pass certain tests due to outdated variables.
Despite these test failures, their core functionality should still work as
expected.
2020-08-05 06:41:36 +02:00
#### re::engine::RE2
2021-07-14 05:02:28 +02:00
PBot uses the `re::engine::RE2` module for user-submitted regular expressions.
2020-08-05 06:41:36 +02:00
If you could not install it through CPAN, you must install it manually.
* https://github.com/google/re2
* https://github.com/dgl/re-engine-RE2/
2020-01-03 04:07:47 +01:00
### Installing PBot
#### git (recommended)
2020-01-03 04:41:39 +01:00
The recommended way to install PBot is with `git` . This will allow you easily update to
2020-01-03 06:44:34 +01:00
the latest version of PBot via the git update process by issuing the `git pull` command.
Also, if you become interested in contributing improvements to PBot, you will be able to
submit them through `git` .
2020-01-03 04:07:47 +01:00
The command to install with `git` is:
$ git clone https://github.com/pragma-/pbot.git
#### Download zip archive
Alternatively, you may [download a ZIP archive ](https://github.com/pragma-/pbot/archive/master.zip ).
2020-01-28 04:52:53 +01:00
## Initial Setup
2020-01-03 04:07:47 +01:00
After git-cloning (or unpacking the ZIP archive) you should have a directory named
`pbot/` (or `pbot-master/` ). It should contain at least these directories and files:
Name | Description
--- | ---
2021-07-14 05:02:28 +02:00
[`lib/` ](https://github.com/pragma-/pbot/tree/master/lib ) | PBot source tree
[`script/` ](https://github.com/pragma-/pbot/tree/master/script ) | PBot executables
2020-02-09 05:19:59 +01:00
[`modules/` ](https://github.com/pragma-/pbot/tree/master/modules ) | External command-line executables invokable as PBot commands
2020-01-03 06:44:34 +01:00
[`data/` ](https://github.com/pragma-/pbot/tree/master/data ) | Default data-directory
[`doc/` ](https://github.com/pragma-/pbot/tree/master/doc ) | Helpful documentation
2020-01-03 04:07:47 +01:00
2019-12-31 11:04:22 +01:00
### Clone data-directory
2020-01-03 04:07:47 +01:00
PBot uses a data-directory to store all its configuration settings and data. You must
2020-01-28 04:52:53 +01:00
clone this data-directory for each instance of PBot you want to run, otherwise they
will become quite confused with each other and things will break horribly.
2019-12-31 11:04:22 +01:00
Here we clone the data-directory for two PBot instances, naming them after the
IRC network they will connect to:
2020-01-03 04:07:47 +01:00
$ cd pbot (or pbot-master)
2021-06-12 10:50:45 +02:00
$ cp -r data libera
2020-01-03 04:07:47 +01:00
$ cp -r data ircnet
2019-12-31 11:04:22 +01:00
2020-01-28 04:52:53 +01:00
Alternatively, you could name your new data directory after your bot's nickname:
2019-12-31 11:04:22 +01:00
2020-01-03 04:07:47 +01:00
$ cp -r data coolbot
2019-12-31 11:04:22 +01:00
2020-01-28 04:52:53 +01:00
### Configuration
2020-01-01 01:10:06 +01:00
PBot configuration is stored in a registry of key/value pairs grouped by sections.
2020-01-28 04:52:53 +01:00
For more information, see the [Registry documentation ](Registry.md ).
For initial first-time setup, you may configure registry settings via the PBot
command-line options. We'll show you [how to do that ](#starting-pbot ) soon! First, read on to
see what settings you should configure.
2019-12-31 11:33:42 +01:00
2020-01-28 04:52:53 +01:00
Alternatively, you can edit the `registry` file in your cloned data-directory.
2020-01-28 05:05:22 +01:00
See [editing registry file ](Registry.md#editing-registry-file ) for more
2020-01-28 04:52:53 +01:00
information.
2019-12-31 11:04:22 +01:00
2020-01-28 05:05:22 +01:00
Here is a table of basic initial settings you should configure:
2019-12-31 11:04:22 +01:00
Registry key | Description | Default value
--- | --- | ---:
2020-01-01 01:10:06 +01:00
irc.botnick | IRC nickname. This is the name people see when you talk. _Required._ | _undefined_
2019-12-31 11:04:22 +01:00
irc.username | IRC username. This is the `USER` field of your hostmask. | pbot3
2020-01-01 08:28:25 +01:00
irc.realname | IRC gecos/realname. This is the `general information` or `real-name` field, as seen in `WHOIS` . | https://github.com/pragma-/pbot
2021-06-12 10:50:45 +02:00
irc.server | IRC server address to connect. | irc.libera.chat
2021-07-10 18:44:25 +02:00
irc.port | IRC server port. | 6667 (secure port: 6697)
2021-06-12 10:50:45 +02:00
irc.identify_password | Password to authenticate with services or bots. | _undefined_
2021-07-11 07:47:33 +02:00
irc.sasl | Whether to use the IRCv3 SASL authentication mechanism. | 0 (1 to enable)
irc.tls | Whether to use TLS encryption. | 0 (1 to enable)
2020-01-01 06:55:17 +01:00
general.trigger | Bot trigger. Can be a character class containing multiple trigger characters. Can be overridden per-channel. | [!]
2020-01-01 01:10:06 +01:00
2020-01-28 04:52:53 +01:00
For a list of other available settings see [this table ](Registry.md#list-of-known-registry-items ) in the [Registry documentation ](Registry.md ).
2019-12-31 11:04:22 +01:00
#### Recommended settings for IRC Networks
2021-06-12 10:50:45 +02:00
##### Libera.Chat
2021-07-10 18:44:25 +02:00
The default settings are tailored for an insecure connection to the Libera.Chat IRC network.
2021-07-11 07:47:33 +02:00
To make the connection secure, set `irc.tls` to `1` . This will enable TLS encryption.
You may optionally set `irc.tls_ca_path` or `irc.tls_ca_file` if necessary. Be sure to
2021-07-10 18:44:25 +02:00
set `irc.port` to `6697` for the secure port.
It is strongly recommended that you register an account with NickServ and to enable SASL authentication.
Register your channels with ChanServ. You may request a host cloak from Libera staff. This will protect
your nickname, channels and IP address.
2019-12-31 11:04:22 +01:00
2021-06-12 11:13:26 +02:00
Once you register with NickServ, it is strongly recommended to enable `irc.sasl` . If you
choose not to use IRCv3 SASL authentication, then it is recommended to set these options:
2019-12-31 11:04:22 +01:00
2021-06-12 10:50:45 +02:00
< details > < summary > Click to show recommended Libera.Chat settings with SASL disabled< / summary >
2021-06-12 10:58:37 +02:00
2020-01-01 01:10:06 +01:00
Registry key | Description | Recommended value
--- | --- | ---:
irc.identify_password | Password to use to identify to NickServ | `<password>`
2020-01-01 06:55:17 +01:00
irc.randomize_nick | Randomize IRC nickname when connecting to server. PBot will change to `irc.botnick` when logged-in. This prevents users from monitoring the botnick to catch its IP address before it is identified. | 1
2020-01-01 01:10:06 +01:00
general.autojoin_wait_for_nickserv | Wait for NickServ login before auto-joining channels. This prevents PBot from joining channels before it is identified and cloaked. | 1
2020-01-01 06:55:17 +01:00
general.identify_command | Command to send to NickServ to identify. `$nick` will be replaced with `irc.botnick` ; `$password` will be replaced with `irc.identify_password` . If you wish to login to a NickServ account different than the `irc.botnick` you may replace the `$nick` text with a literal value. | `identify $nick $password`
2021-06-12 10:58:37 +02:00
2021-06-12 10:50:45 +02:00
< / details >
2019-12-31 11:04:22 +01:00
##### IRCnet
IRCnet is one of the oldest IRC networks still running. It has no Services like NickServ and ChanServ.
2020-01-01 01:10:06 +01:00
Instead, its nicknames and channels are protected by custom bots.
These settings may be useful:
2021-06-12 10:50:45 +02:00
< details > < summary > Click to show recommended IRCnet settings< / summary >
2021-06-12 10:58:37 +02:00
2020-01-01 01:10:06 +01:00
Registry key | Description | Default value| Recommended value
2020-01-01 01:12:22 +01:00
--- | --- | ---: | ---:
2020-01-01 01:10:06 +01:00
general.identify_nick | Who to /msg for login/identify/authentication. Defaults to NickServ, can be overridden to a custom bot. | NickServ | `<service botnick>`
2020-01-01 01:13:45 +01:00
general.identify_command | Command to send to `general.identify_nick` to login. | `identify $nick $password` | `<service bot command>`
2020-01-01 01:10:06 +01:00
general.op_nick | Who to /msg to request channel OP status. Defaults to ChanServ, can be overridden to a custom bot. | ChanServ | `<service botnick>`
2020-01-01 01:13:45 +01:00
general.op_command | Command to send to `general.op_nick` to request channel OP status. | `op $channel` | `<service bot command>`
2021-06-12 10:58:37 +02:00
2021-06-12 10:50:45 +02:00
< / details >
2019-12-31 11:04:22 +01:00
##### Other networks
2021-06-12 10:58:37 +02:00
Other networks are untested. They should be very similiar to either Libera.Chat or IRCnet, and so one or both of the
2020-01-03 04:07:47 +01:00
recommended settings should suffice. If you have any issues, please [report them here ](https://github.com/pragma-/pbot/issues )
2021-06-12 10:58:37 +02:00
or by sending `pragma-` a message on the Libera.Chat network.
2019-12-31 11:04:22 +01:00
2020-01-12 19:23:32 +01:00
## Starting PBot
2021-07-14 05:07:15 +02:00
The executable to start PBot is `script/pbot` . You may create a symbolic
2021-07-14 05:02:28 +02:00
link to the `script/pbot` executable in `$HOME/bin/` or in `/usr/local/bin/` .
If you choose not to install the `script/pbot` file to your PATH, remember
to use `./script/pbot` instead of `pbot` in the following examples.
2020-01-01 01:10:06 +01:00
### Usage
2020-01-28 06:32:18 +01:00
$ pbot [directory overrides...] [registry overrides...]
2020-01-01 01:10:06 +01:00
2020-09-22 23:05:25 +02:00
#### rlwrap
It is recommended to use the `rlwrap` program for command-line history if you use
the PBot STDIN interface.
$ rlwrap pbot [...]
2020-01-01 01:10:06 +01:00
#### Overriding directories
2020-01-03 04:41:39 +01:00
You may override PBot's default directory locations via the command-line.
2021-07-14 05:02:28 +02:00
$ pbot data_dir=/path/to/data modules_dir=/path/to/modules
2020-01-03 04:41:39 +01:00
2020-01-01 01:10:06 +01:00
#### Overriding registry
2020-01-03 04:41:39 +01:00
You may override any of your Registry values via the command-line. Any overrides made will be
saved to the `registry` file. You do not need to use the override every time you launch PBot.
2020-01-28 04:52:53 +01:00
$ pbot irc.botnick=coolbot irc.server=irc.example.com irc.port=6667 [...]
### First-time start-up
2021-06-12 10:58:37 +02:00
#### Using default settings
The default settings will connect to the Libera.Chat IRC network.
2020-01-28 04:52:53 +01:00
At minimum, the registry key `irc.botnick` must be set before PBot will connect to any IRC servers.
The following command will use the `coolbot` data-directory that we cloned in the [initial setup ](#initial-setup ),
2021-06-12 10:58:37 +02:00
and set the `irc.botnick` registry key to the same name. It will automatically connect to the Libera.Chat IRC network.
2020-01-28 04:52:53 +01:00
$ pbot data_dir=coolbot irc.botnick=coolbot
#### Using custom settings
To connect to a specific IRC server or to configure additional settings, you may
[override the directory paths ](#overriding-directories ) and [override the registry values ](#overriding-registry ). Read on to the next section for examples.
2021-06-12 10:58:37 +02:00
##### Custom recommended settings
2020-01-28 04:52:53 +01:00
The following command is based on the [Recommended settings for IRC Networks ](#recommended-settings-for-irc-networks ) section earlier in this document.
2021-06-12 10:58:37 +02:00
The `irc.server` and `irc.port` settings are omitted because the default values will connect to the Libera.Chat IRC network.
2020-01-28 04:52:53 +01:00
Replace the placeholders, marked `X` , with values you want to use. Note that this is just for the first-time start-up. Regular subsequent start-up needs only `data_dir` to be overridden.
2021-06-12 22:58:14 +02:00
* If you have registered your botnick with the NickServ service, update the `irc.identify_password` entry in the `registry` file in your bot's data directory and then use this command:
2020-01-28 04:52:53 +01:00
2021-06-12 11:08:19 +02:00
`pbot data_dir=X irc.botnick=X irc.sasl=1`
2020-01-28 04:52:53 +01:00
2020-01-28 05:05:22 +01:00
* Otherwise, use this one:
2020-01-28 04:52:53 +01:00
2021-06-12 11:08:19 +02:00
`pbot data_dir=X irc.botnick=X`
2020-01-28 04:52:53 +01:00
##### Custom recommended IRCnet/other network settings
The following command is based on the [Recommended settings for IRC Networks ](#recommended-settings-for-irc-networks ) section earlier in this document.
Replace the placeholders, marked `X` , with values you want to use. Note that this is just for the first-time start-up. Regular subsequent start-up needs only `data_dir` to be overridden.
2020-01-28 05:05:22 +01:00
* If you want PBot to identify with a custom bot or service on IRCnet/other networks, use this command:
2020-01-28 04:52:53 +01:00
2021-06-12 11:08:19 +02:00
`pbot data_dir=X irc.botnick=X irc.server=X irc.port=X general.identify_nick=X general.op_nick=X`
2020-01-28 04:52:53 +01:00
2020-01-28 05:05:22 +01:00
* Otherwise, use this one:
2020-01-28 04:52:53 +01:00
2021-06-12 11:08:19 +02:00
`pbot data_dir=X irc.botnick=X irc.server=X irc.port=X`
2020-01-28 04:52:53 +01:00
### Regular start-up
After your initial start-up command, you only need to use the `data_dir`
2020-01-28 05:05:22 +01:00
directory override when starting PBot. Any previously used registry overrides
2020-01-28 05:11:03 +01:00
have been saved to your data-directory's `registry` file.
2020-01-28 04:52:53 +01:00
$ pbot data_dir=X
## Additional configuration
Once you've launched PBot, you can type directly into its terminal to execute
commands as the built-in PBot console admin user account. This will allow you
to use admin commands to create new users or join channels.
2020-01-28 05:05:22 +01:00
### Creating your bot owner admin account
2020-01-28 04:52:53 +01:00
To create your own fully privileged admin user account, use the following
commands in the PBot terminal console.
Suppose your nick is `Bob` and your hostmask is `Bob!~user@some.domain.com` .
2020-04-24 01:19:36 +02:00
useradd Bob Bob!~user@*.domain.com global botowner
2020-01-28 04:52:53 +01:00
2020-02-04 11:20:14 +01:00
This will create a user account named `Bob` with the `botowner` [user-capability ](Admin.md#user-capabilities ) that can administrate
2020-01-28 05:05:22 +01:00
all channels. Note the wildcard replacing `some` in `some.domain.com` . Now as long as
your connected hostmask matches your user account hostmask, you will be recognized.
2020-01-28 04:52:53 +01:00
In your own IRC client, connected using the hostmask we just added, type the
following command:
2020-01-03 04:41:39 +01:00
2020-01-28 04:52:53 +01:00
my password
2020-01-01 01:10:06 +01:00
2020-01-28 04:52:53 +01:00
This will show you the randomly generated password that was assigned to your
user account. You can change it -- if you want to -- with:
2020-01-03 04:48:00 +01:00
2020-01-28 04:52:53 +01:00
my password < new password >
2020-01-03 04:48:00 +01:00
2020-01-28 04:52:53 +01:00
Then you can login with:
2019-12-31 11:04:22 +01:00
2020-01-28 04:52:53 +01:00
login < password >
Now you can use `/msg` in your own IRC client to administrate PBot, instead of
the terminal console.
2020-01-28 05:18:08 +01:00
### Adding other users and admins
To add users to PBot, use the [`useradd` ](Admin.md#useradd ) command.
2020-04-24 01:19:36 +02:00
useradd < username > < hostmasks > [channels [capabilities [password]]]
The `hostmasks` and `channels` arguments can be a comma-separated list of values.
2020-02-04 11:20:14 +01:00
If you omit the `capabilities` argument, the user will be a normal unprivileged user. See [user-capabilities ](Admin.md#user-capabilities )
for more information about user-capabilities.
2020-01-28 05:18:08 +01:00
If you omit the `password` argument, a random password will be generated. The user
can use the [`my` ](Commands.md#my ) command to view or change it.
Users may view and change their own metadata by using the [`my` ](Commands.md#my ) command.
2020-01-28 06:03:07 +01:00
my [key [value]]
2020-01-28 05:18:08 +01:00
For more information, see the [Admin documentation ](Admin.md ).
2020-01-28 04:52:53 +01:00
### Adding channels
2020-01-03 04:41:39 +01:00
To temporarily join channels, use the `join` command.
join < channel >
To permanently add a channel to PBot, use the `chanadd` command. PBot will
automatically join permanently added channels.
chanadd < channel >
To configure a permanent channel's settings, use the `chanset` command:
chanset < channel > [key [value]]
You can `chanset` the following keys:
Name | Description | Default value
--- | --- | ---:
2020-01-03 04:48:00 +01:00
enabled | If set to false, PBot will not autojoin or respond to this channel. | 1
chanop | If set to true, PBot will perform OP duties in this channel. | 0
permop | If set to true, PBot will not de-OP itself in this channel. | 0
2020-01-03 04:41:39 +01:00
2020-01-10 08:29:58 +01:00
For more information, see the [Channels documentation ](Admin.md#channel-management-commands ).
2020-01-03 04:41:39 +01:00
2020-01-12 19:23:32 +01:00
## Further Reading
2020-01-03 05:24:32 +01:00
That should get you started. For further information about PBot, check out these topics.
2020-01-03 05:25:57 +01:00
### Commands
2020-01-03 05:58:17 +01:00
PBot has several core built-in commands. You've seen some of them in this document,
2020-01-03 06:01:21 +01:00
for setting up channels and admins. Additional commands can be added to PBot through
2020-01-03 05:58:17 +01:00
Plugins and Factoids.
2020-01-28 04:52:53 +01:00
For more information, see the [Commands documentation ](Commands.md ).
2020-01-03 05:58:17 +01:00
2020-01-28 04:52:53 +01:00
### Factoids
2020-01-03 05:58:17 +01:00
Factoids are a very special type of command. Anybody interacting with PBot
2020-01-28 04:52:53 +01:00
can create, edit, delete and invoke factoids.
2020-01-03 05:58:17 +01:00
2020-01-28 04:52:53 +01:00
In their most basic form, a factoid merely displays the text the creator sets.
2020-01-03 05:58:17 +01:00
< pragma- > !factadd hello /say Hello, $nick!
< PBot > hello added to global channel.
2020-01-11 01:25:15 +01:00
2020-01-03 05:58:17 +01:00
< pragma- > PBot, hello
< PBot > Hello, pragma-!
2020-01-03 06:01:21 +01:00
Significantly more complex factoids can be built by using `$variables` , command-substitution,
2020-01-03 05:58:17 +01:00
command-piping, `/code` invocation, and more!
2020-01-10 08:29:58 +01:00
For more information, see the [Factoids documentation ](Factoids.md ).
2020-01-03 06:30:02 +01:00
2020-01-28 04:52:53 +01:00
### Plugins
Plugins provide optional PBot features. The default plugins loaded by PBot is set by
the [`plugin_autoload` ](../data/plugin_autoload ) file in your data-directory. To autoload additional plugins,
add their name to this file.
You may manually load plugins using the `plug` command.
plug < plugin >
You may unload plugins using the `unplug` command.
unplug < plugin >
Plugins can be quickly reloaded by using the `replug` command.
replug < plugin >
2020-01-03 05:58:17 +01:00
2020-01-28 04:52:53 +01:00
Currently loaded plugins may be listed with the `pluglist` command.
< pragma- > !pluglist
< PBot > Loaded plugins: ActionTrigger, AntiAway, AntiKickAutoRejoin, AntiNickSpam, AntiRepeat,
AntiTwitter, AutoRejoin, Counter, Date, GoogleSearch, Quotegrabs, RemindMe, UrlTitles,
Weather
For more information, see the [Plugins documentation ](Plugins.md ).
### Modules
2020-01-03 05:58:17 +01:00
Modules are external command-line executable programs and scripts that can be
2020-01-28 04:52:53 +01:00
loaded as PBot commands.
2020-01-03 05:58:17 +01:00
Suppose you have the [Qalculate! ](https://qalculate.github.io/ ) 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.
2020-01-28 04:52:53 +01:00
Then you can use the PBot [`load` ](Admin.md#load ) command to load the `modules/qalc.sh` script as the `qalc` command:
2020-01-12 04:31:22 +01:00
!load qalc qalc.sh
2020-01-28 04:52:53 +01:00
Now you have a [Qalculate! ](https://qalculate.github.io/ ) calculator in PBot!
2020-01-03 05:58:17 +01:00
< pragma- > !qalc 2 * 2
< PBot > 2 * 2 = 4
2020-01-10 08:29:58 +01:00
For more information, see the [Modules documentation ](Modules.md ).